@garygentry/feature-forge 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/adapters/GENERATION-REPORT.md +17 -13
- package/adapters/claude/.feature-forge-bundle.json +6 -0
- package/adapters/claude/references/forge-config-schema.json +36 -10
- package/adapters/claude/references/pipeline-state-schema.json +4 -0
- package/adapters/claude/references/portable-root.md +8 -5
- package/adapters/claude/references/process-overview.md +15 -5
- package/adapters/claude/references/shared-conventions.md +69 -4
- package/adapters/claude/references/stack-resolution.md +4 -1
- package/adapters/claude/references/stacks/go.md +1 -1
- package/adapters/claude/references/stacks/python.md +1 -1
- package/adapters/claude/references/stacks/rust.md +1 -1
- package/adapters/claude/references/stacks/typescript.md +1 -1
- package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +23 -0
- package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +22 -0
- package/adapters/claude/scripts/epic-manifest.py +1379 -0
- package/adapters/claude/scripts/forge-bootstrap.py +991 -0
- package/adapters/claude/scripts/forge-init.sh +44 -0
- package/adapters/claude/scripts/forge-root.sh +30 -8
- package/adapters/claude/scripts/validate-traceability.py +150 -0
- package/adapters/claude/skills/forge/SKILL.md +5 -5
- package/adapters/claude/skills/forge-0-epic/SKILL.md +13 -15
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +2 -2
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/claude/skills/forge-1-prd/SKILL.md +6 -4
- package/adapters/claude/skills/forge-2-tech/SKILL.md +8 -7
- package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
- package/adapters/claude/skills/forge-3-specs/SKILL.md +1 -1
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +2 -2
- package/adapters/claude/skills/forge-5-loop/SKILL.md +20 -18
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +13 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +40 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +11 -1
- package/adapters/claude/skills/forge-bootstrap/SKILL.md +240 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/claude/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +1 -1
- package/adapters/claude/skills/forge-init/SKILL.md +1 -1
- package/adapters/claude/skills/forge-verify/SKILL.md +7 -2
- package/adapters/claude/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/codex/.feature-forge-bundle.json +6 -0
- package/adapters/codex/agents/{forge-researcher.md → forge-researcher.toml} +4 -4
- package/adapters/codex/agents/{forge-spec-writer.md → forge-spec-writer.toml} +4 -4
- package/adapters/codex/agents/{forge-verifier.md → forge-verifier.toml} +4 -4
- package/adapters/codex/references/forge-config-schema.json +36 -10
- package/adapters/codex/references/pipeline-state-schema.json +4 -0
- package/adapters/codex/references/portable-root.md +8 -5
- package/adapters/codex/references/process-overview.md +15 -5
- package/adapters/codex/references/shared-conventions.md +69 -4
- package/adapters/codex/references/stack-resolution.md +4 -1
- package/adapters/codex/references/stacks/go.md +1 -1
- package/adapters/codex/references/stacks/python.md +1 -1
- package/adapters/codex/references/stacks/rust.md +1 -1
- package/adapters/codex/references/stacks/typescript.md +1 -1
- package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +23 -0
- package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +22 -0
- package/adapters/codex/scripts/epic-manifest.py +1379 -0
- package/adapters/codex/scripts/forge-bootstrap.py +991 -0
- package/adapters/codex/scripts/forge-init.sh +44 -0
- package/adapters/codex/scripts/forge-root.sh +30 -8
- package/adapters/codex/scripts/validate-traceability.py +150 -0
- package/adapters/codex/skills/forge/{forge.md → SKILL.md} +16 -6
- package/adapters/codex/skills/forge-0-epic/{forge-0-epic.md → SKILL.md} +33 -25
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +2 -2
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/codex/skills/forge-1-prd/{forge-1-prd.md → SKILL.md} +22 -10
- package/adapters/codex/skills/forge-2-tech/{forge-2-tech.md → SKILL.md} +26 -15
- package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
- package/adapters/codex/skills/forge-3-specs/{forge-3-specs.md → SKILL.md} +16 -6
- package/adapters/codex/skills/forge-4-backlog/{forge-4-backlog.md → SKILL.md} +15 -5
- package/adapters/codex/skills/forge-5-loop/{forge-5-loop.md → SKILL.md} +40 -28
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +13 -0
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +40 -0
- package/adapters/codex/skills/forge-6-docs/{forge-6-docs.md → SKILL.md} +26 -6
- package/adapters/codex/skills/forge-bootstrap/SKILL.md +249 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/codex/skills/forge-fix/{forge-fix.md → SKILL.md} +12 -2
- package/adapters/codex/skills/forge-init/{forge-init.md → SKILL.md} +11 -1
- package/adapters/codex/skills/forge-verify/{forge-verify.md → SKILL.md} +24 -9
- package/adapters/codex/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/copilot/.feature-forge-bundle.json +6 -0
- package/adapters/copilot/references/forge-config-schema.json +36 -10
- package/adapters/copilot/references/pipeline-state-schema.json +4 -0
- package/adapters/copilot/references/portable-root.md +8 -5
- package/adapters/copilot/references/process-overview.md +15 -5
- package/adapters/copilot/references/shared-conventions.md +69 -4
- package/adapters/copilot/references/stack-resolution.md +4 -1
- package/adapters/copilot/references/stacks/go.md +1 -1
- package/adapters/copilot/references/stacks/python.md +1 -1
- package/adapters/copilot/references/stacks/rust.md +1 -1
- package/adapters/copilot/references/stacks/typescript.md +1 -1
- package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +23 -0
- package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +22 -0
- package/adapters/copilot/scripts/epic-manifest.py +1379 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +991 -0
- package/adapters/copilot/scripts/forge-init.sh +44 -0
- package/adapters/copilot/scripts/forge-root.sh +30 -8
- package/adapters/copilot/scripts/validate-traceability.py +150 -0
- package/adapters/copilot/skills/forge/forge.md +16 -6
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +33 -25
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +2 -2
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +22 -10
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +26 -15
- package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +16 -6
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +15 -5
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +40 -28
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +13 -0
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +40 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +26 -6
- package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +249 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +12 -2
- package/adapters/copilot/skills/forge-init/forge-init.md +11 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +24 -9
- package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/cursor/.feature-forge-bundle.json +6 -0
- package/adapters/cursor/references/forge-config-schema.json +36 -10
- package/adapters/cursor/references/pipeline-state-schema.json +4 -0
- package/adapters/cursor/references/portable-root.md +8 -5
- package/adapters/cursor/references/process-overview.md +15 -5
- package/adapters/cursor/references/shared-conventions.md +69 -4
- package/adapters/cursor/references/stack-resolution.md +4 -1
- package/adapters/cursor/references/stacks/go.md +1 -1
- package/adapters/cursor/references/stacks/python.md +1 -1
- package/adapters/cursor/references/stacks/rust.md +1 -1
- package/adapters/cursor/references/stacks/typescript.md +1 -1
- package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +23 -0
- package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +22 -0
- package/adapters/cursor/scripts/epic-manifest.py +1379 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +991 -0
- package/adapters/cursor/scripts/forge-init.sh +44 -0
- package/adapters/cursor/scripts/forge-root.sh +30 -8
- package/adapters/cursor/scripts/validate-traceability.py +150 -0
- package/adapters/cursor/skills/forge/forge.mdc +16 -6
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +33 -25
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +2 -2
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +22 -10
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +26 -15
- package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +16 -6
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +15 -5
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +40 -28
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +13 -0
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +40 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +26 -6
- package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +250 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +12 -2
- package/adapters/cursor/skills/forge-init/forge-init.mdc +11 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +24 -9
- package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +1 -1
- package/adapters/gemini/.feature-forge-bundle.json +6 -0
- package/adapters/gemini/gemini-extension.json +5 -1
- package/adapters/gemini/references/forge-config-schema.json +36 -10
- package/adapters/gemini/references/pipeline-state-schema.json +4 -0
- package/adapters/gemini/references/portable-root.md +8 -5
- package/adapters/gemini/references/process-overview.md +15 -5
- package/adapters/gemini/references/shared-conventions.md +69 -4
- package/adapters/gemini/references/stack-resolution.md +4 -1
- package/adapters/gemini/references/stacks/go.md +1 -1
- package/adapters/gemini/references/stacks/python.md +1 -1
- package/adapters/gemini/references/stacks/rust.md +1 -1
- package/adapters/gemini/references/stacks/typescript.md +1 -1
- package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +23 -0
- package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +22 -0
- package/adapters/gemini/scripts/epic-manifest.py +1379 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +991 -0
- package/adapters/gemini/scripts/forge-init.sh +44 -0
- package/adapters/gemini/scripts/forge-root.sh +30 -8
- package/adapters/gemini/scripts/validate-traceability.py +150 -0
- package/adapters/gemini/skills/forge/forge.md +16 -6
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +33 -25
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +2 -2
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +1 -1
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +22 -10
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +26 -15
- package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +4 -4
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +16 -6
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +15 -5
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +40 -28
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +13 -0
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +40 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +26 -6
- package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +249 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/go/main.go +12 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +24 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +25 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +12 -2
- package/adapters/gemini/skills/forge-init/forge-init.md +11 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +24 -9
- package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +1 -1
- package/dist/agent-targets.d.ts +20 -4
- package/dist/agent-targets.js +29 -4
- package/dist/apply.js +245 -18
- package/dist/cli.js +12 -6
- package/dist/hash.d.ts +5 -0
- package/dist/hash.js +7 -0
- package/dist/manifest.d.ts +4 -2
- package/dist/manifest.js +58 -2
- package/dist/placements.d.ts +69 -0
- package/dist/placements.js +116 -0
- package/dist/plan.d.ts +7 -0
- package/dist/plan.js +87 -1
- package/dist/rauf.d.ts +4 -4
- package/dist/rauf.js +3 -3
- package/dist/report.js +21 -0
- package/dist/source.d.ts +4 -3
- package/dist/source.js +4 -3
- package/dist/types.d.ts +163 -19
- package/dist/types.js +42 -11
- package/package.json +1 -1
- package/adapters/codex/agents/openai.yaml +0 -10
package/README.md
CHANGED
|
@@ -40,6 +40,24 @@ npx @garygentry/feature-forge install --dry-run --json
|
|
|
40
40
|
| `--json` | Emit the run report as JSON. |
|
|
41
41
|
| `--skip-rauf` | Skip the rauf resolvability preflight (records `raufPin: null`). |
|
|
42
42
|
|
|
43
|
+
## Per-agent install layout
|
|
44
|
+
|
|
45
|
+
Each agent's bundle is installed where that agent actually loads it (project scope shown;
|
|
46
|
+
`--global` resolves the same paths under `~`):
|
|
47
|
+
|
|
48
|
+
| Agent | Primary bundle | Second-root placement |
|
|
49
|
+
| ------- | ------------------------------------ | ------------------------------------------------------- |
|
|
50
|
+
| claude | `.claude/skills/feature-forge/` | — |
|
|
51
|
+
| codex | `.agents/skills/feature-forge/` | `.codex/agents/*.toml` (custom agents, mirrored flat) |
|
|
52
|
+
| copilot | `.github/feature-forge/` | managed block in `.github/copilot-instructions.md` |
|
|
53
|
+
| cursor | `.cursor/rules/feature-forge/` | — |
|
|
54
|
+
| gemini | `.gemini/extensions/feature-forge/` | — |
|
|
55
|
+
|
|
56
|
+
The Copilot block is delimited by `<!-- feature-forge:managed:start -->` /
|
|
57
|
+
`<!-- feature-forge:managed:end -->` sentinels and merged without disturbing the rest of the
|
|
58
|
+
file. `update` refreshes it (a hand-edited block is left alone unless `--force`); `uninstall`
|
|
59
|
+
strips only the block, deleting the file only if nothing else remains.
|
|
60
|
+
|
|
43
61
|
## Claude
|
|
44
62
|
|
|
45
63
|
Claude Code users can alternatively install via the plugin marketplace:
|
|
@@ -53,7 +71,7 @@ Claude Code users can alternatively install via the plugin marketplace:
|
|
|
53
71
|
|
|
54
72
|
The default loop runner is [**rauf**](https://github.com/garygentry/rauf), published as
|
|
55
73
|
[`@garygentry/rauf`](https://www.npmjs.com/package/@garygentry/rauf). The installer runs a
|
|
56
|
-
read-only resolvability preflight on the pin (`@garygentry/rauf@0.
|
|
74
|
+
read-only resolvability preflight on the pin (`@garygentry/rauf@0.8.0`) and records it; pass
|
|
57
75
|
`--skip-rauf` to defer the check (e.g. offline installs). Install the rauf CLI itself with
|
|
58
76
|
`npx @garygentry/rauf` or its
|
|
59
77
|
[binary script](https://github.com/garygentry/rauf#install). See the
|
|
@@ -12,18 +12,18 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
12
12
|
|
|
13
13
|
| Source | Construct | Reason |
|
|
14
14
|
|--------|-----------|--------|
|
|
15
|
-
| `agents/forge-researcher.md` | `sub-agent key 'effort'` |
|
|
16
|
-
| `agents/forge-researcher.md` | `sub-agent key 'maxTurns'` |
|
|
17
|
-
| `agents/forge-researcher.md` | `sub-agent key 'model'` |
|
|
18
|
-
| `agents/forge-researcher.md` | `sub-agent key 'tools'` |
|
|
19
|
-
| `agents/forge-spec-writer.md` | `sub-agent key 'maxTurns'` |
|
|
20
|
-
| `agents/forge-spec-writer.md` | `sub-agent key 'model'` |
|
|
21
|
-
| `agents/forge-spec-writer.md` | `sub-agent key 'tools'` |
|
|
22
|
-
| `agents/forge-verifier.md` | `sub-agent key 'maxTurns'` |
|
|
23
|
-
| `agents/forge-verifier.md` | `sub-agent key 'memory'` |
|
|
24
|
-
| `agents/forge-verifier.md` | `sub-agent key 'model'` |
|
|
25
|
-
| `agents/forge-verifier.md` | `sub-agent key 'skills'` |
|
|
26
|
-
| `agents/forge-verifier.md` | `sub-agent key 'tools'` |
|
|
15
|
+
| `agents/forge-researcher.md` | `sub-agent key 'effort'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
16
|
+
| `agents/forge-researcher.md` | `sub-agent key 'maxTurns'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
17
|
+
| `agents/forge-researcher.md` | `sub-agent key 'model'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
18
|
+
| `agents/forge-researcher.md` | `sub-agent key 'tools'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
19
|
+
| `agents/forge-spec-writer.md` | `sub-agent key 'maxTurns'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
20
|
+
| `agents/forge-spec-writer.md` | `sub-agent key 'model'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
21
|
+
| `agents/forge-spec-writer.md` | `sub-agent key 'tools'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
22
|
+
| `agents/forge-verifier.md` | `sub-agent key 'maxTurns'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
23
|
+
| `agents/forge-verifier.md` | `sub-agent key 'memory'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
24
|
+
| `agents/forge-verifier.md` | `sub-agent key 'model'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
25
|
+
| `agents/forge-verifier.md` | `sub-agent key 'skills'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
26
|
+
| `agents/forge-verifier.md` | `sub-agent key 'tools'` | no Codex custom-agent equivalent in safe mapping (TQ-1) |
|
|
27
27
|
| `skills/forge-0-epic/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
28
28
|
| `skills/forge-1-prd/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
29
29
|
| `skills/forge-2-tech/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
@@ -31,6 +31,7 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
31
31
|
| `skills/forge-4-backlog/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
32
32
|
| `skills/forge-5-loop/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
33
33
|
| `skills/forge-6-docs/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
34
|
+
| `skills/forge-bootstrap/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
34
35
|
| `skills/forge-fix/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
35
36
|
| `skills/forge-verify/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
36
37
|
| `skills/forge/SKILL.md` | `argument-hint` | no confirmed Codex invocation-hint field (TQ-1) |
|
|
@@ -58,6 +59,7 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
58
59
|
| `skills/forge-4-backlog/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
59
60
|
| `skills/forge-5-loop/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
60
61
|
| `skills/forge-6-docs/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
62
|
+
| `skills/forge-bootstrap/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
61
63
|
| `skills/forge-fix/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
62
64
|
| `skills/forge-verify/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
63
65
|
| `skills/forge/SKILL.md` | `argument-hint` | no known Copilot invocation-hint field (TQ-1) |
|
|
@@ -85,6 +87,7 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
85
87
|
| `skills/forge-4-backlog/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
86
88
|
| `skills/forge-5-loop/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
87
89
|
| `skills/forge-6-docs/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
90
|
+
| `skills/forge-bootstrap/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
88
91
|
| `skills/forge-fix/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
89
92
|
| `skills/forge-verify/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
90
93
|
| `skills/forge/SKILL.md` | `argument-hint` | no Cursor .mdc invocation-hint field |
|
|
@@ -112,6 +115,7 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
112
115
|
| `skills/forge-4-backlog/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
113
116
|
| `skills/forge-5-loop/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
114
117
|
| `skills/forge-6-docs/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
118
|
+
| `skills/forge-bootstrap/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
115
119
|
| `skills/forge-fix/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
116
120
|
| `skills/forge-verify/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
117
121
|
| `skills/forge/SKILL.md` | `argument-hint` | Gemini manifest hint field unconfirmed (TQ-1) |
|
|
@@ -121,7 +125,7 @@ _No dropped constructs — every canonical construct is representable in this ag
|
|
|
121
125
|
These files are transported byte-for-byte from canon into every `adapters/<agent>/` bundle and intentionally carry **no** provenance header (a header would break byte-identity / corrupt parsed files):
|
|
122
126
|
|
|
123
127
|
- `scripts/forge-root.sh` → `adapters/<agent>/scripts/forge-root.sh` (mode 0755, byte-identical — REQ-GEN-05).
|
|
124
|
-
- the whole repo-root `references/` tree (
|
|
128
|
+
- the whole repo-root `references/` tree (16 files: 9 root + `stacks/`×5 + `templates/specs-hygiene/`×2) → `adapters/<agent>/references/` (verbatim — REQ-GEN-04 / D5).
|
|
125
129
|
- each skill's own `references/` subdir → `adapters/<agent>/skills/<name>/references/` (verbatim, where present).
|
|
126
130
|
|
|
127
131
|
Regenerate all adapter output with `python3 scripts/build-adapters.py`.
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"description": "Root directory for generated architecture documentation."
|
|
16
16
|
},
|
|
17
17
|
"backlogDir": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"description": "Optional override for backlog location. If set, backlog.json is written here instead of with the feature specs. Default behavior: backlog.json is written to {specsDir}/{feature}/backlog.json."
|
|
18
|
+
"type": ["string", "null"],
|
|
19
|
+
"description": "Optional override for backlog location. If set, backlog.json is written here instead of with the feature specs. Default behavior (null): backlog.json is written to {specsDir}/{feature}/backlog.json."
|
|
20
20
|
},
|
|
21
21
|
"gitCommitAfterStage": {
|
|
22
22
|
"type": "boolean",
|
|
@@ -28,17 +28,27 @@
|
|
|
28
28
|
"default": "forge",
|
|
29
29
|
"description": "Prefix for conventional commit messages, e.g., forge(auth): complete PRD"
|
|
30
30
|
},
|
|
31
|
-
"
|
|
31
|
+
"branchPerFeature": {
|
|
32
|
+
"type": "boolean",
|
|
33
|
+
"default": true,
|
|
34
|
+
"description": "Offer to create an isolated git branch when a feature/epic starts on the default branch (main/master). Gated only on the project using git — independent of gitCommitAfterStage. When false, forge never prompts for a branch and works on whatever branch is checked out. See the Branch Setup block in references/shared-conventions.md."
|
|
35
|
+
},
|
|
36
|
+
"branchPrefix": {
|
|
32
37
|
"type": "string",
|
|
33
|
-
"
|
|
38
|
+
"default": "forge/",
|
|
39
|
+
"description": "Prefix for the branch name suggested by Branch Setup, e.g. 'forge/' yields 'forge/{feature}' or 'forge/{epic}'. Ignored when branchPerFeature is false."
|
|
40
|
+
},
|
|
41
|
+
"stack": {
|
|
42
|
+
"type": ["string", "null"],
|
|
43
|
+
"description": "Detected or configured project stack identifier. Selects guidance from references/stacks/{stack}.md. Set during forge-2-tech or manually (null until then). Examples: 'typescript', 'python', 'go', 'rust'."
|
|
34
44
|
},
|
|
35
45
|
"typeCheckCommand": {
|
|
36
|
-
"type": "string",
|
|
37
|
-
"description": "Command to verify type correctness or lint. Examples: 'bun run typecheck', 'mypy .', 'go vet ./...'. Used in acceptance criteria and verification."
|
|
46
|
+
"type": ["string", "null"],
|
|
47
|
+
"description": "Command to verify type correctness or lint. Null until set. Examples: 'bun run typecheck', 'mypy .', 'go vet ./...'. Used in acceptance criteria and verification."
|
|
38
48
|
},
|
|
39
49
|
"testCommand": {
|
|
40
|
-
"type": "string",
|
|
41
|
-
"description": "Command to run tests. Examples: 'bun test', 'pytest', 'go test ./...'. Used in acceptance criteria and verification."
|
|
50
|
+
"type": ["string", "null"],
|
|
51
|
+
"description": "Command to run tests. Null until set. Examples: 'bun test', 'pytest', 'go test ./...'. Used in acceptance criteria and verification."
|
|
42
52
|
},
|
|
43
53
|
"loopIterationMultiplier": {
|
|
44
54
|
"type": "number",
|
|
@@ -46,6 +56,22 @@
|
|
|
46
56
|
"minimum": 1,
|
|
47
57
|
"description": "Multiplier applied to pending backlog item count to calculate loop iterations. Higher values allow more retries. Default: 1.5 (e.g., 10 items = 15 iterations)."
|
|
48
58
|
},
|
|
59
|
+
"workspaces": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"description": "Monorepo members. Absent for single-package projects.",
|
|
62
|
+
"items": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"required": ["name", "path", "stack"],
|
|
65
|
+
"additionalProperties": false,
|
|
66
|
+
"properties": {
|
|
67
|
+
"name": {"type": "string"},
|
|
68
|
+
"path": {"type": "string", "description": "Repo-relative member dir"},
|
|
69
|
+
"stack": {"type": "string"},
|
|
70
|
+
"typeCheckCommand": {"type": ["string", "null"]},
|
|
71
|
+
"testCommand": {"type": ["string", "null"]}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
49
75
|
"loopRunner": {
|
|
50
76
|
"type": "object",
|
|
51
77
|
"description": "The autonomous loop runner feature-forge drives. Defaults to rauf when absent (forge-5 states 'defaulting to rauf loop runner'). Every command is a template — {bin}, {backlogDir}, {specsDir}, {iterations} are substituted at call time — so an alternative ralph-style runner conforming to rauf's SPEC-BACKLOG-TOOL-CONTRACT.md can be swapped in without editing any skill. See references/ralph-loop-contract.md.",
|
|
@@ -147,8 +173,8 @@
|
|
|
147
173
|
},
|
|
148
174
|
"installHint": {
|
|
149
175
|
"type": "string",
|
|
150
|
-
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.
|
|
151
|
-
"description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.
|
|
176
|
+
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.8.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.8.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
|
|
177
|
+
"description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.8.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
|
|
152
178
|
},
|
|
153
179
|
"schemaVersion": {
|
|
154
180
|
"type": "string",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"type": "string",
|
|
19
19
|
"description": "Back-pointer to the owning epic's name. Absent for standalone features. The epic-manifest.json is canonical on conflict (REQ-STATE-01)."
|
|
20
20
|
},
|
|
21
|
+
"branch": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Git branch this feature's pipeline work is intended to land on, recorded by the Branch Setup block (shared-conventions.md) at the entry stage. Absent when the project isn't a git repo or branchPerFeature is false. Downstream stages and forge-5-loop compare the current branch against this to detect drift back onto the default branch before committing."
|
|
24
|
+
},
|
|
21
25
|
"createdAt": {
|
|
22
26
|
"type": "string",
|
|
23
27
|
"format": "date-time"
|
|
@@ -12,7 +12,7 @@ against the fenced block here, byte-for-byte.
|
|
|
12
12
|
## Canonical bootstrap prelude
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
15
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
16
16
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
17
17
|
```
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ makes several calls, add the prelude once and reuse `$R` for each. A fresh block
|
|
|
24
24
|
prelude (per-block re-resolution). Worked example:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
27
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
28
28
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
29
29
|
python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
30
30
|
```
|
|
@@ -40,10 +40,13 @@ python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specs
|
|
|
40
40
|
final root resolution to that script. The `for` list is a discovery order for `forge-root.sh`
|
|
41
41
|
itself, not a fallback chain for the plugin root. Removing the `exec` to "keep looping" is a
|
|
42
42
|
regression — once `exec`'d, the loop is replaced by the resolver process and never advances.
|
|
43
|
-
3. **Prelude candidate set is
|
|
43
|
+
3. **Prelude candidate set is an agent-neutral bootstrap subset.** The prelude's `for d` list
|
|
44
44
|
exists only to bootstrap-discover `forge-root.sh`; the authoritative multi-root probe lives in
|
|
45
|
-
`forge-root.sh` step 2.
|
|
46
|
-
|
|
45
|
+
`forge-root.sh` step 2. The list enumerates install roots across agents — the Claude
|
|
46
|
+
skill/plugin dirs **and** the agent-neutral `.agents/skills/feature-forge` dirs (`$HOME` and the
|
|
47
|
+
project-relative `./.agents/...`) — so a non-Claude install (e.g. Codex under `.agents/skills`)
|
|
48
|
+
can still discover the resolver. When adding an install root, update `forge-root.sh` first;
|
|
49
|
+
extend the prelude only if the new root is needed to bootstrap-discover `forge-root.sh` itself.
|
|
47
50
|
|
|
48
51
|
## The resolver
|
|
49
52
|
|
|
@@ -2,12 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
This document describes the end-to-end feature development pipeline managed by the feature-forge plugin. All forge skills reference this document to understand the overall flow and their position within it.
|
|
4
4
|
|
|
5
|
+
The pipeline compiles a fuzzy feature idea into a machine-executable `backlog.json`. Each stage narrows the idea down and adds structure, verification gates catch gaps before they reach later stages, and a swappable autonomous loop runner (rauf by default) implements the backlog in fresh per-item sessions.
|
|
6
|
+
|
|
5
7
|
## Pipeline Stages
|
|
6
8
|
|
|
7
9
|
```
|
|
8
|
-
forge-1-prd → forge-2-tech → forge-3-specs → forge-verify → forge-4-backlog → forge-verify → forge-5-loop → forge-verify → forge-6-docs
|
|
10
|
+
[forge-0-epic] → forge-1-prd → forge-2-tech → forge-3-specs → forge-verify → forge-4-backlog → forge-verify → forge-5-loop → forge-verify → forge-6-docs
|
|
11
|
+
(optional)
|
|
9
12
|
```
|
|
10
13
|
|
|
14
|
+
### Stage 0: Epic (`/feature-forge:forge-0-epic <epic>`), optional
|
|
15
|
+
**Input:** A change too large for one feature
|
|
16
|
+
**Output:** `{specsDir}/{epic}/epic-manifest.json` + `EPIC.md` + one member-feature dir per feature
|
|
17
|
+
**Method:** Decomposition interview splitting the change into member features with declared dependencies and `exposes`/`consumes` contracts. Purely additive: single-feature flows are unchanged. See [docs/architecture/epic-orchestration/README.md](../docs/architecture/epic-orchestration/README.md).
|
|
18
|
+
|
|
11
19
|
### Stage 1: PRD (`/feature-forge:forge-1-prd <feature>`)
|
|
12
20
|
**Input:** User's feature idea and domain knowledge
|
|
13
21
|
**Output:** `{specsDir}/{feature}/PRD.md`
|
|
@@ -35,13 +43,13 @@ After verification, fixes can be applied via:
|
|
|
35
43
|
|
|
36
44
|
### Stage 4: Backlog (`/feature-forge:forge-4-backlog <feature>`)
|
|
37
45
|
**Input:** Full spec suite
|
|
38
|
-
**Output:** `{specsDir}/{feature}/backlog.json` (or `{backlogDir}/backlog.json` if backlogDir is configured)
|
|
46
|
+
**Output:** `{specsDir}/{feature}/backlog.json` (or `{backlogDir}/{feature}/backlog.json` if backlogDir is configured)
|
|
39
47
|
**Method:** Generate structured backlog items with spec references, acceptance criteria, and dependencies. Backlog is collocated with feature specs by default.
|
|
40
48
|
|
|
41
49
|
### Stage 5: Rauf Loop (`/feature-forge:forge-5-loop <feature>`)
|
|
42
50
|
**Input:** `backlog.json` from Stage 4
|
|
43
51
|
**Output:** Implemented source code (committed per-item by rauf)
|
|
44
|
-
**Method:** Execute the
|
|
52
|
+
**Method:** Execute the autonomous coding loop against the feature's backlog. Spawns a fresh session per backlog item with full spec context. rauf is the default runner but is swappable via the `loopRunner` block in `forge.config.json`; see [`references/ralph-loop-contract.md`](./ralph-loop-contract.md).
|
|
45
53
|
|
|
46
54
|
### Stage 6: Documentation (`/feature-forge:forge-6-docs <feature>`)
|
|
47
55
|
**Input:** Specs + implementation
|
|
@@ -71,7 +79,9 @@ Read `forge.config.json` from project root for path overrides. See `references/f
|
|
|
71
79
|
|
|
72
80
|
## Git Workflow
|
|
73
81
|
|
|
74
|
-
Recommended:
|
|
82
|
+
Recommended: forge work lives on an isolated `forge/{feature}` (or `forge/{epic}`) branch so all commits land together and review as one branch. The entry stages (`forge-1-prd`, `forge-0-epic`) detect whether you're on the default branch (main/master) and **strongly recommend** creating that branch when you are — still letting you decline and stay. The chosen branch is recorded in `.pipeline-state.json`, and `forge-5-loop` re-checks it before the autonomous loop starts committing per item. After implementation, merge to your development branch.
|
|
83
|
+
|
|
84
|
+
To customize: `branchPrefix` (default `forge/`) sets the branch name, and `branchPerFeature: false` disables the prompt entirely (forge then works on whatever branch is checked out). Branch Setup is gated only on the project using git — independent of `gitCommitAfterStage`.
|
|
75
85
|
|
|
76
86
|
If you prefer manual commit control, set `gitCommitAfterStage: false` in `forge.config.json`.
|
|
77
87
|
|
|
@@ -88,7 +98,7 @@ When creating specs, always examine the existing codebase for patterns, conventi
|
|
|
88
98
|
- Shared types, utilities, and conventions
|
|
89
99
|
|
|
90
100
|
### Stack Context
|
|
91
|
-
The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md`
|
|
101
|
+
The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md` (preferred at `.feature-forge/`; legacy `.claude/references/`) with established technology decisions — if present, it takes highest precedence.
|
|
92
102
|
|
|
93
103
|
## Subagents
|
|
94
104
|
|
|
@@ -34,7 +34,24 @@ I found that the codebase uses React and TanStack Router.
|
|
|
34
34
|
[then call AskUserQuestion with: "1. Where should this component live? 2. Should we use server-side rendering?"]
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
### Decision Support: Help the User Choose
|
|
38
|
+
|
|
39
|
+
When an `AskUserQuestion` carries substantive options (a real choice — not a trivial yes/no confirmation), do not just list them. The interview stages have already done codebase research and integration analysis; surfacing that synthesis at the decision moment is the whole point. For every such question:
|
|
40
|
+
|
|
41
|
+
- **Lead with a recommended option.** Place it first and label it `(recommended)` (matching the `AskUserQuestion` "(Recommended)" convention).
|
|
42
|
+
- **Put the trade-off in each option's `description`.** Say why you'd pick it and what you give up versus the alternatives — the cost, not just the benefit.
|
|
43
|
+
- **State a one-line rationale** in the text before the question for *why* the recommendation wins.
|
|
44
|
+
|
|
45
|
+
Two modes, and make clear which one you're in:
|
|
46
|
+
|
|
47
|
+
- **Evidence-backed** — codebase evidence, an established convention, or a clear technical rationale favors one option. Recommend it with confidence and cite the evidence ("the codebase already uses X, so…").
|
|
48
|
+
- **Preference** — no option clearly wins (taste, team workflow, risk appetite). Still offer a sensible **default** and the trade-offs, but say plainly this is a judgment call / the user's preference, so you don't manufacture false confidence.
|
|
49
|
+
|
|
50
|
+
**The only thing to avoid is false confidence** — recommending as if evidence-backed when it's really preference. Never respond to the absence of a clear winner by going silent: a defaulted recommendation with honest trade-offs always beats a neutral option dump.
|
|
51
|
+
|
|
52
|
+
For genuinely comparable artifacts (competing module structures, two code snippets, layout variants), use the `AskUserQuestion` `preview` field to show them side-by-side.
|
|
53
|
+
|
|
54
|
+
The **Branch Setup** block below is the reference pattern: a strong recommendation as the first option, rationale inline, the alternative still available, never a hard-stop.
|
|
38
55
|
|
|
39
56
|
## Configuration Reading
|
|
40
57
|
|
|
@@ -48,6 +65,8 @@ Extract these config values (use defaults if not present):
|
|
|
48
65
|
- `backlogDir` (default: null — backlog lives at `{specsDir}/{feature}/backlog.json`; when `backlogDir` is configured, forge-4 composes `{backlogDir}/{feature}/`)
|
|
49
66
|
- `gitCommitAfterStage` (default: true)
|
|
50
67
|
- `commitPrefix` (default: `forge`)
|
|
68
|
+
- `branchPerFeature` (default: true)
|
|
69
|
+
- `branchPrefix` (default: `forge/`)
|
|
51
70
|
- `loopIterationMultiplier` (default: `1.5`)
|
|
52
71
|
- `loopRunner` (optional object — the loop runner to drive; **defaults to rauf** when absent, with every command templated. See `references/forge-config-schema.json` and `references/ralph-loop-contract.md`.)
|
|
53
72
|
|
|
@@ -56,7 +75,7 @@ Extract these config values (use defaults if not present):
|
|
|
56
75
|
Before any file I/O against a feature's artifacts, resolve its directory through the deterministic helper rather than hardcoding `{specsDir}/{feature}/`. This makes flat (`{specsDir}/{feature}/`) and nested (`{specsDir}/{epic}/{feature}/`) layouts both resolve from a bare feature name (REQ-DIR-03), with standalone features behaving exactly as today.
|
|
57
76
|
|
|
58
77
|
```bash
|
|
59
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
78
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
60
79
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
61
80
|
resolvedFeatureDir=$(python3 "$R/scripts/epic-manifest.py" \
|
|
62
81
|
resolve "<feature>" --specs-dir "<specsDir>")
|
|
@@ -79,6 +98,27 @@ A directory counts as a **feature** only if it directly contains a `.pipeline-st
|
|
|
79
98
|
|
|
80
99
|
**Compatibility:** for a standalone feature the resolver returns its flat path with no epic logic engaged (REQ-COMPAT-01/02) — standalone-feature behavior is unchanged. A pre-existing latent name collision is reported for manual cleanup by the navigator / forge-verify epic mode (CHECK-E08), not by aborting an unrelated command whose name resolves to exactly one dir (tech-spec §3.4).
|
|
81
100
|
|
|
101
|
+
## Specs Directory Hygiene
|
|
102
|
+
|
|
103
|
+
Whenever a stage creates the specs tree for the first time (the first PRD or epic written under `{specsDir}/`), ensure a spec-directory agent-instruction file exists at the **specsDir root**. This tells coding agents in the project that the specs here are pre-implementation artifacts — not live contracts to enforce against the code. It is **idempotent: never overwrite an existing file** (the project may have edited it).
|
|
104
|
+
|
|
105
|
+
Run this after creating the feature/epic directory, before the stage's git commit:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
109
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
110
|
+
mkdir -p "<specsDir>"
|
|
111
|
+
[ -f "<specsDir>/AGENTS.md" ] || cp "$R/references/templates/specs-hygiene/AGENTS.md" "<specsDir>/AGENTS.md"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
If the host is Claude (the `AskUserQuestion` tool is available), also ensure the Claude-framed variant:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
[ -f "<specsDir>/CLAUDE.md" ] || cp "$R/references/templates/specs-hygiene/CLAUDE.md" "<specsDir>/CLAUDE.md"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Stage any file this writes (`{specsDir}/AGENTS.md`, and `{specsDir}/CLAUDE.md` when written) as part of the stage's existing git commit.
|
|
121
|
+
|
|
82
122
|
## Epic Context Injection
|
|
83
123
|
|
|
84
124
|
After resolving the feature directory, check the feature's `.pipeline-state.json` for an `epic` back-pointer. **If absent, skip this block entirely** (standalone feature — REQ-COMPAT-01; standalone-feature behavior is unchanged). **If present**, load exactly the following context, and nothing transitive (REQ-CTX-01):
|
|
@@ -92,7 +132,7 @@ After resolving the feature directory, check the feature's `.pipeline-state.json
|
|
|
92
132
|
To obtain the manifest contracts and the live completion status of each dependency in one deterministic call, run `render-status` and read the per-feature `status` and the `consumes`/`exposes` arrays rather than re-deriving them:
|
|
93
133
|
|
|
94
134
|
```bash
|
|
95
|
-
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
135
|
+
R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
|
|
96
136
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
97
137
|
python3 "$R/scripts/epic-manifest.py" \
|
|
98
138
|
render-status "<epic>" --specs-dir "<specsDir>" --json
|
|
@@ -110,6 +150,31 @@ When loading upstream artifacts as prerequisites, check `basedOnVersions` in the
|
|
|
110
150
|
|
|
111
151
|
> "This stage was built against {upstream} v{old}, but {upstream} is now at v{new}. The current artifacts may be outdated. Consider re-running this stage, or use --force to proceed with potentially stale inputs."
|
|
112
152
|
|
|
153
|
+
Frame the choice with its cost: re-running re-derives this stage from the current upstream (safest, but discards any hand-edits to this stage's artifacts); proceeding stale is faster but risks baking outdated assumptions into everything downstream. Recommend re-running unless the user knows the upstream change doesn't affect this stage.
|
|
154
|
+
|
|
155
|
+
## Branch Setup
|
|
156
|
+
|
|
157
|
+
Invoke this block at the **very start** of a pipeline entry point — `forge-1-prd` (standalone feature) and `forge-0-epic` (epic) — **before** any directory resolution or interview, so the rest of the run lands on the intended branch. `{label}` is the feature name (forge-1-prd) or epic name (forge-0-epic); `{scope}` is `feature` or `epic` correspondingly.
|
|
158
|
+
|
|
159
|
+
**Gate.** Run this block only when the project uses git (a `.git` directory resolves) **and** `branchPerFeature` is true. It is **independent of `gitCommitAfterStage`** — branch isolation matters whether or not forge auto-commits. If `branchPerFeature` is false, skip silently.
|
|
160
|
+
|
|
161
|
+
**Epic-member inheritance.** In `forge-1-prd`, if the feature has an `epic` back-pointer (an `epic` field resolves via Epic Context Injection, or the directory is nested under an epic), the epic already established the branch in `forge-0-epic`. Skip the prompt — inherit the current branch.
|
|
162
|
+
|
|
163
|
+
**Detection, then a branch-aware prompt:**
|
|
164
|
+
|
|
165
|
+
1. Read the current branch: `git rev-parse --abbrev-ref HEAD`.
|
|
166
|
+
2. Determine the default branch: `git symbolic-ref --quiet refs/remotes/origin/HEAD` (strip to the last path segment); if that fails, fall back to `main`, else `master` — whichever the repo has.
|
|
167
|
+
3. **If the current branch is NOT the default branch** (the user is already on a topic/`{branchPrefix}*` branch) → record it (see below) and proceed silently. Do not prompt.
|
|
168
|
+
4. **If the current branch IS the default branch** → use `AskUserQuestion` with a **strong recommendation** (still optional):
|
|
169
|
+
|
|
170
|
+
> "You're on `{defaultBranch}`. Strongly recommended: create `{branchPrefix}{label}` so this {scope}'s work stays isolated and reviewable as one branch. Create it?"
|
|
171
|
+
> Options: **Create `{branchPrefix}{label}` (recommended)** · **Stay on `{defaultBranch}`**
|
|
172
|
+
|
|
173
|
+
- **Create** → `git switch -c {branchPrefix}{label}` (or `git checkout -b` if `switch` is unavailable). If the branch already exists, `git switch {branchPrefix}{label}`.
|
|
174
|
+
- **Stay** → proceed on the default branch; note that subsequent commits (and any `forge-5-loop` run) will land directly on `{defaultBranch}`.
|
|
175
|
+
|
|
176
|
+
**Record the branch.** After this block resolves, write the resulting branch name to the feature's `.pipeline-state.json` top-level `branch` field (create/update it when the state file is first written for this stage). Downstream stages and `forge-5-loop` read it to detect drift back onto the default branch.
|
|
177
|
+
|
|
113
178
|
## Git Commit Protocol
|
|
114
179
|
|
|
115
180
|
When `gitCommitAfterStage` is true, follow this exact order to avoid state inconsistency:
|
|
@@ -139,6 +204,6 @@ When a skill detects that `currentStage` matches itself and the stage status is
|
|
|
139
204
|
|
|
140
205
|
If the user passes `--force` as an argument, skip prerequisite validation with a warning:
|
|
141
206
|
|
|
142
|
-
> Force mode: skipping prerequisite checks. Pipeline state tracking may be incomplete. Recommend running `/feature-forge:forge {feature}` after to verify status.
|
|
207
|
+
> Force mode: skipping prerequisite checks. Pipeline state tracking may be incomplete — this stage may build on prior stages that were never completed or verified, so its output can be silently wrong. Recommend running `/feature-forge:forge {feature}` after to verify status.
|
|
143
208
|
|
|
144
209
|
Continue with the stage even if prior stages are not marked complete. Still read any existing artifacts (PRD.md, tech-spec.md, etc.) if they exist on disk — force mode skips the pipeline state check, not the artifact loading.
|
|
@@ -4,7 +4,10 @@ How feature-forge resolves stack-specific guidance for a project.
|
|
|
4
4
|
|
|
5
5
|
## Resolution Order (highest priority first)
|
|
6
6
|
|
|
7
|
-
1. **Project-level override
|
|
7
|
+
1. **Project-level override** (first existing path wins). These hold the team's explicit technology decisions and take absolute precedence:
|
|
8
|
+
1. `.feature-forge/stack-decisions.md` — the preferred, host-neutral location (it belongs to this tool, not to any one agent).
|
|
9
|
+
2. `.agents/references/stack-decisions.md` — for projects that centralize cross-agent config under `.agents/`.
|
|
10
|
+
3. `.claude/references/stack-decisions.md` — **legacy alias**, still honored for backward compatibility. If only this file exists, use it and suggest copying it to `.feature-forge/stack-decisions.md`.
|
|
8
11
|
|
|
9
12
|
2. **Detected stack profile**: `references/stacks/{stack}.md` in this plugin, where `{stack}` matches the `stack` field in `forge.config.json`. Provides language-specific conventions for spec writing, verification, and examples.
|
|
10
13
|
|
|
@@ -111,7 +111,7 @@ When examining a Go project, check for:
|
|
|
111
111
|
|
|
112
112
|
## Example: Project-Level Override
|
|
113
113
|
|
|
114
|
-
Create `.claude/references/stack-decisions.md` in your project root:
|
|
114
|
+
Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
|
|
115
115
|
|
|
116
116
|
```markdown
|
|
117
117
|
# Stack Decisions
|
|
@@ -136,7 +136,7 @@ async def refresh_session_token(
|
|
|
136
136
|
|
|
137
137
|
## Example: Project-Level Override
|
|
138
138
|
|
|
139
|
-
Create `.claude/references/stack-decisions.md` in your project root:
|
|
139
|
+
Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
|
|
140
140
|
|
|
141
141
|
```markdown
|
|
142
142
|
# Stack Decisions
|
|
@@ -120,7 +120,7 @@ When examining a Rust project, check for:
|
|
|
120
120
|
|
|
121
121
|
## Example: Project-Level Override
|
|
122
122
|
|
|
123
|
-
Create `.claude/references/stack-decisions.md` in your project root:
|
|
123
|
+
Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
|
|
124
124
|
|
|
125
125
|
```markdown
|
|
126
126
|
# Stack Decisions
|
|
@@ -85,7 +85,7 @@ When examining a TypeScript project, check for:
|
|
|
85
85
|
|
|
86
86
|
## Example: Project-Level Override
|
|
87
87
|
|
|
88
|
-
Create `.claude/references/stack-decisions.md` in your project root:
|
|
88
|
+
Create `.feature-forge/stack-decisions.md` (legacy alias: `.claude/references/stack-decisions.md`) in your project root:
|
|
89
89
|
|
|
90
90
|
```markdown
|
|
91
91
|
# Stack Decisions
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Agent Instructions — `specs/` (feature-forge)
|
|
2
|
+
|
|
3
|
+
This directory holds **pre-implementation design artifacts** produced by the
|
|
4
|
+
feature-forge pipeline (PRDs, technical specs, numbered implementation specs,
|
|
5
|
+
traceability matrices, and per-feature `backlog.json` files).
|
|
6
|
+
|
|
7
|
+
## How to treat these specs
|
|
8
|
+
|
|
9
|
+
- **Specs are not live contracts.** They exist to plan the work and establish the
|
|
10
|
+
backlog. They are intentionally **not kept in sync** with the implementation as
|
|
11
|
+
the code evolves.
|
|
12
|
+
- **Do not flag spec↔code divergence.** Once a spec is finalized and its backlog has
|
|
13
|
+
been implemented, the code is the source of truth for behavior. Do not "fix" the
|
|
14
|
+
implementation to match a spec, or the spec to match the code, unless a human
|
|
15
|
+
explicitly asks for it.
|
|
16
|
+
- **Read freely; reference deliberately.** It is fine — encouraged, even — for
|
|
17
|
+
pipeline artifacts here (specs, `backlog.json`) to cite each other for provenance
|
|
18
|
+
and context. But implementation artifacts shipped into the project (source code,
|
|
19
|
+
generated skills/agents, configs, docs) should be self-contained and should **not**
|
|
20
|
+
reference files under `specs/`, which may be archived or deleted after a feature
|
|
21
|
+
ships.
|
|
22
|
+
|
|
23
|
+
This file was generated by feature-forge. Edit or remove it to suit your project.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Claude Instructions — `specs/` (feature-forge)
|
|
2
|
+
|
|
3
|
+
This directory holds **pre-implementation design artifacts** produced by the
|
|
4
|
+
feature-forge pipeline (PRDs, technical specs, numbered implementation specs,
|
|
5
|
+
traceability matrices, and per-feature `backlog.json` files).
|
|
6
|
+
|
|
7
|
+
## How to treat these specs
|
|
8
|
+
|
|
9
|
+
- **Specs are not live contracts.** They exist to plan the work and establish the
|
|
10
|
+
backlog. They are intentionally **not kept in sync** with the implementation as
|
|
11
|
+
the code evolves.
|
|
12
|
+
- **Do not flag spec↔code divergence.** Once a spec is finalized and its backlog has
|
|
13
|
+
been implemented, the code is the source of truth for behavior. Don't "fix" the
|
|
14
|
+
implementation to match a spec, or the spec to match the code, unless I explicitly
|
|
15
|
+
ask you to.
|
|
16
|
+
- **Read freely; reference deliberately.** It's fine — encouraged, even — for pipeline
|
|
17
|
+
artifacts here (specs, `backlog.json`) to cite each other for provenance and context.
|
|
18
|
+
But implementation artifacts shipped into the project (source code, generated
|
|
19
|
+
skills/agents, configs, docs) should be self-contained and should **not** reference
|
|
20
|
+
files under `specs/`, which may be archived or deleted after a feature ships.
|
|
21
|
+
|
|
22
|
+
This file was generated by feature-forge. Edit or remove it to suit your project.
|