diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..99ab654 --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,17 @@ +#!/bin/bash +# .githooks/pre-push +# Prevents direct git push to protected branches (develop, master) + +protected_branches="^(develop|master)$" + +while read local_ref local_oid remote_ref remote_oid; do + target_branch="${remote_ref#refs/heads/}" + + if [[ "$target_branch" =~ $protected_branches ]]; then + echo "❌ [Direct Push Blocked] '$target_branch' 브랜치로 직접 push하는 것은 금지되어 있습니다." + echo " 반드시 feature/* 또는 fix/* 브랜치에서 PR(Pull Request)을 올려 병합하세요!" + exit 1 + fi +done + +exit 0 diff --git a/changelog.md b/changelog.md index b8cf6ae..385292f 100644 --- a/changelog.md +++ b/changelog.md @@ -4,131 +4,32 @@ Lightweight human-readable summary of meaningful repository changes. ## Unreleased -- Fixed Windows CP1252 console encoding failure (`UnicodeEncodeError: 'charmap' codec can't encode character '\u2713'`) in `scripts/verify_examples.py` and `tests/integration/test_examples.py` by replacing non-ASCII symbols with ASCII tags (`[ok]`, `[error]`), reconfiguring stdout/stderr UTF-8 streams, and setting `PYTHONIOENCODING=utf-8` in subprocess calls. -- Added untracked manifest discovery (`discover_untracked_manifests`) in `scripts/sync_version.py` to automatically prevent untracked plugin/extension manifests from being added in PRs without version/description tracking. -- Added `.pre-commit-config.yaml` for local contributor pre-commit checks and updated `CONTRIBUTING.md` with manifest governance guidelines. -- Enhanced Antigravity CLI (`agy`) plugin manifest (`adapters/antigravity/plugin.json`) with `version` tracking integrated into `scripts/sync_version.py`, expanded unit test assertions in `test_antigravity_adapter.py` (including symlink layout simulation) and `test_readme.py`, and updated `README.md` documentation. +- Added `.githooks/pre-push` script to block direct local `git push` to protected branches (`develop`, `master`) + and direct contributors to use Pull Requests (`feature/*` / `fix/*`). - Added Conventional Commits PR title validation job (`pr-title-check`) to GitHub Actions workflow (`.github/workflows/test.yml`) to enforce standard title format (`feat:`, `fix:`, `docs:`, etc.) for pull requests. - Updated `.github/PULL_REQUEST_TEMPLATE.md` with Conventional Commits title format guide and an explicit Examples Impact checklist requiring example updates for `feat:` and `fix:` changes while skipping non-feature PRs. +- Fixed Windows CP1252 console encoding failure (`UnicodeEncodeError: 'charmap' codec can't encode character '\u2713'`) in `scripts/verify_examples.py` and `tests/integration/test_examples.py` by replacing non-ASCII symbols with ASCII tags (`[ok]`, `[error]`), reconfiguring stdout/stderr UTF-8 streams, and setting `PYTHONIOENCODING=utf-8` in subprocess calls. +- Added untracked manifest discovery (`discover_untracked_manifests`) in `scripts/sync_version.py` to automatically prevent untracked plugin/extension manifests from being added in PRs without version/description tracking. +- Added `.pre-commit-config.yaml` for local contributor pre-commit checks and updated `CONTRIBUTING.md` with manifest governance guidelines. +- Enhanced Antigravity CLI (`agy`) plugin manifest (`adapters/antigravity/plugin.json`) with `version` tracking integrated into `scripts/sync_version.py`, expanded unit test assertions in `test_antigravity_adapter.py` (including symlink layout simulation) and `test_readme.py`, and updated `README.md` documentation. + +## v0.2.1 (2026-08-31) + +- Redesigned and expanded `examples/` into representative, structured usage guides + (`basic-usage.md`, `check-constraints.md`, `graph-visualization.md`, and + `multilingual-adr.md`) with standardized Scenario, Input, What Happens, and Output sections. +- Added a full Korean documentation suite under [`examples/ko/`](examples/ko/README.md) + (including `basic-usage.md`, `check-constraints.md`, `graph-visualization.md`, and `multilingual-adr.md`). +- Created `scripts/verify_examples.py` and `tests/integration/test_examples.py` to + automatically verify that all documented example commands execute cleanly and to auto-update + example output snippets when core `adr.py` logic or schemas change. - Added a `harness-parity` CI job that installs the real Codex CLI and Gemini CLI and drives their own plugin/extension commands (marketplace add, install, list) against this repo, then runs `preflight`/`init`/ `validate` from the installed snapshot on every push and pull request — catching a broken adapter before a user hits it, not after. -- Verified the Antigravity CLI adapter end to end against the `agy` CLI - (validate/install/list plus the script layer); `adapters/antigravity/README.md` - corrected from "unverified" to a recorded transcript, matching the - Codex/Gemini adapters' documented depth. -- Added `CODE_OF_CONDUCT.md` and GitHub issue templates (bug report, - feature request) as public-repository readiness ahead of the eventual - switch to public. -- Recorded ADR-0011 for the relationship graph and public-readiness - decisions. -- Added ADR relationship graph navigation: `adr.py index` now embeds a Mermaid - graph in the generated decision log when relationships exist, and - `adr.py graph` exports standalone `relationships.mmd` plus a crisp SVG - navigation artifact without requiring Node, Mermaid CLI, or browser - rendering. - Added public repository readiness docs: `CONTRIBUTING.md`, `SECURITY.md`, and a pull request template covering ADR impact and local verification. -- Added `adr.py search`: finds an existing ADR by keyword (title **and** - body — `related`'s keyword match was title-only before), tags, status, - `--id`, or the real file path it governs, with deterministic best-match - ordering and `--limit`/`total`/`truncated` for bounding results. Added a - Relationships section (supersession chains + related lists, titles - alongside IDs) to the generated `docs/decisions/README.md`, localized - across all 8 catalogs, and `validate` checks for broken supersession - links, one-sided supersession edits, and supersession cycles. -- Added CHECK policy exceptions: `adr.py exception` validates and records a - schema-checked, owned, scoped, time-boxed exception; CHECK annotates a - matching finding with it but never suppresses or downgrades the finding — - an exception is visible evidence, not a silent pass. -- Promoted CHECK's violation classification to a stable `confidence` field - (`VERIFIED`/`VIOLATED`/`UNVERIFIABLE`) on every finding, instead of an - agent re-deriving it from documentation each run. -- Fixed a Windows-only bug where CHECK's git evidence gathering - (`diff.py`/`git_paths.py`) decoded subprocess output using the platform's - default locale encoding instead of UTF-8, garbling Unicode paths/content - on Windows CI while working correctly on macOS/Linux. -- Hardened `scripts/sync_version.py` against three silent-drift bugs - (a tracked manifest losing its version key, a manifest path outside the - repo root crashing instead of failing cleanly, non-ASCII manifest content - being escaped on write) and extended it to keep manifest `description` - fields in sync with `SKILL.md`'s frontmatter, the same way `version` - already was. -- Formalized `--json` as a documented no-op: every command has always - printed JSON regardless of the flag; `--help` now says so explicitly - instead of implying a choice that doesn't exist. -- Corrected repository ADR provenance and lifecycle: existing ADRs now name - an approved decision maker and locale, and ADR-0006 (repository-default - locale generation) supersedes ADR-0003 (index-only localization) - bidirectionally. This session's own design decisions were recorded as - ADR-0007..0010 (CHECK confidence field, exception mechanism, `--json` - contract, and a closed-as-not-applicable Codex tooling question). -- Bumped to v0.2.0. -- Added repository-configured deterministic ADR localization for eight locales - (`en`, `ko`, `ja`, `zh`, `fr`, `es`, `de`, `pt-BR`) across INIT, CREATE, - templates, prompts, and INDEX, with strict config/schema validation and - explicit override precedence. -- Added portable multilingual ADR creation: Unicode titles and bodies are - preserved, an approved semantic ASCII slug can be supplied, and non-ASCII - titles safely fall back to an ID-qualified `decision` filename. -- Hardened CHECK against false-clean results by failing closed on incomplete git - evidence, retaining both sides of renames and Unicode paths, detecting - working-tree deletions, exposing invalid ADRs, following Git ignore/path - semantics, and rejecting conflicting diff modes. -- Made relative ADR directories resolve consistently from `--root` for every - repository-scoped generation and validation command. -- Improved the repository's own ADR evidence and lifecycle history, including - the accepted ADR-0006 decision that supersedes the MVP index-only - localization decision ADR-0003. -- Expanded README, quickstart, and skill guidance with real multilingual - workflows and CHECK confidence boundaries, and added separate Korean v0.2.0 - readiness and enterprise-adoption reports. -- Added the self-contained `skills/adr-toolkit/` package: deterministic - scaffolding/discovery commands (`init`, `discover`, `preflight`, - `validate`, `index`), ADR frontmatter/ID/lifecycle core logic, MADR - templates, and a no-agent `create --interactive` terminal wizard. Usable - three ways: Claude Code (deep integration), a generic manifest-free - fallback for any other harness, or standalone from the terminal. CI - (matrix-tested pytest) built in from the first commit. -- Added the RECORD workflow: deterministic significance scoring, related-ADR - search, evidence-first interviewing guidance, MADR drafting rules, and an - end-to-end RECORD fixture. -- Added validated ADR lifecycle commands for status changes, deprecation, - and bidirectional supersession, including dry-run and partial-write - safeguards. -- Added optional relationship fields to runtime and JSON Schema validation, - with parity coverage to prevent schema drift. -- Closed out Plan 2 with a final whole-branch review: hardened `related`, - `significance`, `status`, and `supersede` against malformed input - (bad frontmatter, non-list fields, missing IDs, bad JSON) and added a - supersede invariant requiring the superseding ADR to already be - `accepted`. -- Added the CHECK workflow: `diff`/`check` CLI commands, a `**`-aware glob - matcher, a `constraints:` block parser, and a 4-way finding - classification (Related/Review required/Verified violation/No applicable - constraint) matching a git diff against Accepted ADRs' structural - constraint rules and Superseded ADRs' affected paths. Closed out with a - final whole-branch review that fixed a git argument-injection - vulnerability and several "silently reports clean" gaps. -- Added five-language i18n for `index`'s generated `README.md` - (`--locale en|fr|ja|ko|zh`), light adapters for Codex CLI, Gemini CLI, - and Antigravity CLI (manifest formats verified against real - documentation, not guessed), a repo-root version-sync script, and a - tag-triggered release workflow. This closes out Plan 4 of 4 — the full - ADR Toolkit MVP is now complete on this branch. -- Released v0.1.0 and adopted a Git Flow branch policy - (`develop`/`master`/`feature`/`release`/`hotfix`, direct-tag release - automation), recorded in `AGENTS.md`. -- Dogfooded the toolkit on its own repo: initialized `docs/decisions/` - and recorded the four most significant architectural decisions made - while building it (CHECK's structural-only scope, i18n's index-only - scope, adapter packaging policy, the Git Flow adoption itself). -- Wrote the root `README.md` (previously a one-line stub) and - `examples/quickstart.md`, a full INIT → RECORD → CHECK walkthrough with - real command output, including CHECK catching a live rule violation and - clearing it after a fix. diff --git a/handoff.md b/handoff.md index af70349..e35cf3f 100644 --- a/handoff.md +++ b/handoff.md @@ -2,36 +2,21 @@ ## Current task (2026-09-01) -**AGY (`agy`) Plugin Integration & Adapter Enhancements.** -Working on branch `feature/agy-plugin-implements-2`: - -- Enhanced Antigravity CLI (`agy`) plugin manifest (`adapters/antigravity/plugin.json`) with `version` field. -- Registered `adapters/antigravity/plugin.json` version tracking in `scripts/sync_version.py` (`MANIFEST_SPECS`). -- Added `discover_untracked_manifests()` in `scripts/sync_version.py` to automatically catch and block any untracked plugin/extension manifest added in PRs. -- Created `.pre-commit-config.yaml` for pre-commit verification and updated `CONTRIBUTING.md` with manifest governance rules. -- Updated unit test assertions in `tests/unit/test_antigravity_adapter.py` (including symlink layout simulation), `tests/unit/test_sync_version.py`, and `tests/unit/test_readme.py`. -- Updated `adapters/antigravity/README.md` and `README.md` documentation. +All session tasks (examples redesign, Korean docs, automated verification pipeline, `v0.2.1` release, AGY plugin enhancements, and `.githooks/pre-push` PR #7) are completed and merged/PR'd. ## Touched files +- `.githooks/pre-push` - `.github/PULL_REQUEST_TEMPLATE.md` - `.github/workflows/test.yml` -- `examples/` (`README.md`, `basic-usage.md`, `check-constraints.md`, `graph-visualization.md`, `multilingual-adr.md`) -- `examples/ko/` (`README.md`, `basic-usage.md`, `check-constraints.md`, `graph-visualization.md`, `multilingual-adr.md`) -- `scripts/verify_examples.py` -- `tests/integration/test_examples.py` -- `skills/adr-toolkit/VERSION` -- `skills/adr-toolkit/SKILL.md` -- `.claude-plugin/plugin.json` -- `adapters/gemini-cli/gemini-extension.json` - `changelog.md` - `handoff.md` ## Next step -1. Monitor CI run for `pr-title-check` and `examples-drift` on upcoming PRs into `develop`. -2. When new features (`feat:`) or bug fixes (`fix:`) are added in future PRs, run `python3 scripts/verify_examples.py --check` and `--update` to keep examples automatically in sync. +1. Merge PR #7 into `develop` once CI checks pass. +2. Resume next scheduled roadmap item or user feature request in a clean working state. ## Open risk -- None. All 396 tests, version drift checks, and example verification checks pass cleanly across Python 3.9 & 3.12. +- None. All unit and integration test suites pass across environments.