@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
|
@@ -52,7 +52,7 @@ Read `{resolvedFeatureDir}/.pipeline-state.json`. If not in force mode, `stages.
|
|
|
52
52
|
|
|
53
53
|
Check if `stages.forge-verify-backlog` exists and has status `passed` or `findings-applied`. If not, use `AskUserQuestion` to warn:
|
|
54
54
|
|
|
55
|
-
"Backlog hasn't been verified yet.
|
|
55
|
+
"Backlog hasn't been verified yet. Recommended: run `/feature-forge:forge-verify {feature}` first — the loop implements items autonomously and commits as it goes, so a bad item (wrong scope, missing dependency, untestable acceptance criteria) is far cheaper to catch now than after several commits build on it. Continue anyway?" Offer **Verify first (recommended)** · **Continue without verifying**.
|
|
56
56
|
|
|
57
57
|
### 1b-epic. Epic Dependency Gate
|
|
58
58
|
|
|
@@ -61,7 +61,7 @@ Read the resolved feature's `.pipeline-state.json`. **If it has no `epic` key, s
|
|
|
61
61
|
1. Run `render-status "{epic}" --specs-dir "{specsDir}" --json` via the helper:
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
|
-
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)"
|
|
64
|
+
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)"
|
|
65
65
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
66
66
|
python3 "$R/scripts/epic-manifest.py" \
|
|
67
67
|
render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
@@ -101,13 +101,8 @@ For the version-too-old case, phrase it concretely, e.g.: "Your rauf is {reporte
|
|
|
101
101
|
|
|
102
102
|
Check that `loopRunner.preconditionFile` (default `.rauf.json`) exists in the project root. If not:
|
|
103
103
|
|
|
104
|
-
- **If `loopRunner.name == "rauf"` and a legacy `.ralph.json` (or `.ralph/` directory) exists**, this is an un-migrated Ralph project. STOP
|
|
105
|
-
|
|
106
|
-
"This project is still on the legacy **Ralph** layout. Run `rauf migrate .` first (the loop runner only understands `.rauf/` and `RAUF_*` signals), then re-run `/feature-forge:forge-5-loop {feature}`."
|
|
107
|
-
|
|
108
|
-
- **Otherwise**, STOP and show `loopRunner.setupHint` (default: "Run `rauf install .` …"), e.g.:
|
|
109
|
-
|
|
110
|
-
"The loop runner isn't set up in this project ({preconditionFile} is missing). {setupHint}"
|
|
104
|
+
- **If `loopRunner.name == "rauf"` and a legacy `.ralph.json` (or `.ralph/` directory) exists**, this is an un-migrated Ralph project. STOP: "This project is still on the legacy **Ralph** layout. Run `rauf migrate .` first (the loop runner only understands `.rauf/` and `RAUF_*` signals), then re-run `/feature-forge:forge-5-loop {feature}`."
|
|
105
|
+
- **Otherwise**, STOP and show `loopRunner.setupHint` (default: "Run `rauf install .` …"), e.g. "The loop runner isn't set up in this project ({preconditionFile} is missing). {setupHint}"
|
|
111
106
|
|
|
112
107
|
### 1e. Backlog File Check
|
|
113
108
|
|
|
@@ -117,6 +112,10 @@ Resolve the backlog file path (matching forge-4-backlog's composition rule, item
|
|
|
117
112
|
|
|
118
113
|
Verify the file exists on disk. If not, STOP and tell the user: "No backlog.json found at {path}. Run `/feature-forge:forge-4-backlog {feature}` to generate it."
|
|
119
114
|
|
|
115
|
+
### 1f. Branch Pre-flight (if using git)
|
|
116
|
+
|
|
117
|
+
The runner commits each completed item straight onto the current branch, so guard against committing onto the default branch. Skip if not a git repo or `branchPerFeature` is false. Read the current branch (`git rev-parse --abbrev-ref HEAD`) and default branch (`git symbolic-ref --quiet refs/remotes/origin/HEAD`, else `main`/`master`). If `.pipeline-state.json` records a `branch` that differs from the current one, warn via `AskUserQuestion` (offer **switch back** or **proceed here**). Otherwise, if the current branch **is** the default, strongly recommend via `AskUserQuestion` creating/switching to `{branchPrefix}{feature}` (`git switch -c`, then record it to the state `branch` field) before the loop commits — still allowing **proceed on `{defaultBranch}`**. Never hard-stop.
|
|
118
|
+
|
|
120
119
|
## Step 2: Construct the Loop Command
|
|
121
120
|
|
|
122
121
|
### 2a. Analyze Backlog
|
|
@@ -180,6 +179,7 @@ For the full loop-runner contract — event-stream vs. log-fallback launch, the
|
|
|
180
179
|
- **(b) Agent question.** Add an **"agent"** question to the same `AskUserQuestion` surface: **one option per advertised row** labelled `"{displayName} ({id}) — available/not found"`, **plus an explicit `"default (claude-cli)"` choice mapping to `run_selection = None`**. Resolve the pick (run > project, empty/whitespace unset, an explicit runner-default pick collapses to the default path) into `{resolved.agent, resolved.source}`. Precedence: `item.provider > --agent > project defaultAgent > runner default` (forge never reads a backlog item's provider).
|
|
181
180
|
- **(c) Availability listing.** From the **same** parsed `agents[]` (no second probe), list `id` / `displayName` / available (`yes`/`no`, `detail` on unavailable rows).
|
|
182
181
|
- **(d) Verdict** — only for a **non-default** resolved agent (default path `None`/`claude-cli` → no probe, byte-identical to today). Classify by **membership** then `available` (never by exit code): **UNKNOWN** (`∉` set) → **hard-reject BEFORE any loop side-effect**, error lists the **sorted** valid ids, **NO proceed-anyway**; **UNAVAILABLE** (member, `available False`) → warn with `detail`, `AskUserQuestion` offering **proceed-anyway OR choose-another** (re-presents the same `agents[]`), never silent; **AVAILABLE** → proceed, the validated id fills `{agent}`; **probe failure** (non-zero exit / unparseable / missing or empty `agents[]` / row lacking `id`) → surface it, offer **choose-another OR abort**, **never launch the non-default agent unvalidated** and never silently fall back to the default.
|
|
182
|
+
- **(d-model) Claude-only model-alias guard.** Runs **only** when the resolved agent is **non-default** (not the default / `claude-cli` path). Read the backlog.json (Step 1e path); collect items whose `model` is a **Claude-specific alias** (tier `opus`/`sonnet`/`haiku` or a `claude-*` id). **If none, skip silently.** Otherwise warn before launch via `AskUserQuestion` (NOT prose): `item.model` outranks `--agent`, so the alias is forwarded verbatim to `{agent}`, which will likely reject it (e.g. codex 400 *"The 'sonnet' model is not supported…"*) — every spawn exits 1 and rauf circuit-breaks (*"3 consecutive infra failures — halting"*) with no hint of the cause. Offer: **(1) Strip `model` for this run (recommended)** — rewrite backlog.json removing the `model` key from each affected item (persistent edit; re-run forge-4-backlog to restore), then proceed; **(2) Proceed as-is** — only safe if `{agent}` understands the pinned ids. forge touches only `model`, never `provider`. Full rationale: `references/runner-contract.md`.
|
|
183
183
|
- **(e) Optional-flags line.** Replace the confirmation's optional-flags line with one that lists `--agent <id>` first plus the agent precedence pointer (`item.provider > --agent > project defaultAgent > runner default`) alongside the model precedence.
|
|
184
184
|
- **(f) Resolved-agent line.** Add to the confirmation block: `Agent: {resolved.agent or claude-cli} (source: {sourceLabel})` — `sourceLabel`: `RUN` → `"per-run selection"`, `PROJECT` → `"project default (loopRunner.defaultAgent)"`, `DEFAULT` → `"runner default — claude-cli"`.
|
|
185
185
|
|
|
@@ -193,11 +193,11 @@ Before launching, update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
|
193
193
|
- Set `currentStage` to `forge-5-loop`
|
|
194
194
|
- Update `updatedAt`
|
|
195
195
|
|
|
196
|
-
|
|
196
|
+
Then commit this state write before launching (mandatory). The runner refuses to run with uncommitted changes (*"…pass --force"*), and this marker is itself one — so an otherwise-clean repo fails its first launch unless committed. Commit it via the shared-conventions **Git Commit Protocol** (epic members: stage `{specsDir}/{epic}/`): `{commitPrefix}({feature}): forge-5-loop in-progress` — a launch precondition, required regardless of `gitCommitAfterStage`. Unrelated leftover changes still trip the refusal; surface it, never auto-pass `--force`. See `references/runner-contract.md`.
|
|
197
197
|
|
|
198
|
-
|
|
198
|
+
### 3b. Launch Background Process
|
|
199
199
|
|
|
200
|
-
Loop runs can take significant time (minutes to hours depending on backlog size).
|
|
200
|
+
Launch the loop **backgrounded** (`run_in_background: true`) so it survives session end and does not block the session, and prefer the machine-readable event stream (`loopRunner.eventStreamCommand`, default for rauf) redirected to a stable `events.ndjson` so the session can supervise it live; fall back to the plain `runCommand` (tailing the human log) when no `eventStreamCommand` is configured. The background task's exit notification is the single authoritative terminal signal (Step 4). Loop runs can take significant time (minutes to hours depending on backlog size). For the exact launch commands (incl. the `mkdir -p` state-dir guard) and the event-stream vs. log-fallback detail, read `references/runner-contract.md`.
|
|
201
201
|
|
|
202
202
|
### 3c. Inform User
|
|
203
203
|
|
|
@@ -246,7 +246,7 @@ Run the **status-json command** (`loopRunner.statusJsonCommand`) and read
|
|
|
246
246
|
`backlogSummary` for the authoritative counts — it separates the three non-done
|
|
247
247
|
outcomes: genuine `blocked`, `needsHuman`, and runner-`deferred` ("false blocks").
|
|
248
248
|
Fall back to the **list command** (`loopRunner.listCommand`) if `statusJsonCommand`
|
|
249
|
-
is not configured. You will already have most of this from the live tally in 3e.
|
|
249
|
+
is not configured. You will already have most of this from the live tally in 3e. If the run used a review flag (e.g. rauf's `--review`), also read any `review_completed` event (event stream, or `{loopRunner.stateDir}/events.ndjson`) for its `itemsCreated`/`summary` to surface in 4b — see `references/result-reporting.md`.
|
|
250
250
|
|
|
251
251
|
### 4b. Report Results
|
|
252
252
|
|
|
@@ -267,13 +267,15 @@ Update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
|
267
267
|
2. If all items complete: set `currentStage` to `"forge-6-docs"`
|
|
268
268
|
3. Update `updatedAt`
|
|
269
269
|
|
|
270
|
-
**No git commit is needed** — the loop runner commits atomically per completed item during the run.
|
|
270
|
+
**No git commit is needed** — the loop runner commits implementation code atomically per completed item during the run. (Step 6's commit, epic members only, is of pipeline state / manifest — a distinct artifact.)
|
|
271
|
+
|
|
272
|
+
## Step 5b: Offer Impl-Verify (standalone path)
|
|
271
273
|
|
|
272
|
-
|
|
274
|
+
**Gate:** run only if (a) the feature's `.pipeline-state.json` has **no** `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete`. Otherwise **skip** — partial runs end as today, and epic members get the equivalent offer in Step 6.1 (do **not** prompt twice). This standalone counterpart to Step 6.1 nudges verification interactively rather than via the easily-missed "Next steps" text. Use `AskUserQuestion` (NOT inline prose) to offer: *"{feature}'s loop is complete. Recommended: run `/feature-forge:forge-verify {feature} impl` to audit the implementation before generating docs. Run it now, or skip to forge-6-docs?"* On **run**, hand off to `/feature-forge:forge-verify {feature} impl`. On **skip**, record `stages.forge-verify-impl.status` as `"skipped"` (mirrors `forge-4-backlog`'s skip handling) and point the user at `/feature-forge:forge-6-docs {feature}` — the forge-6-docs backstop re-surfaces the skip.
|
|
273
275
|
|
|
274
276
|
## Step 6: Epic Handoff
|
|
275
277
|
|
|
276
|
-
**Gate:** only run this step if (a) the resolved feature's `.pipeline-state.json` has an `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete` (all backlog items done). If either is false, **skip** — standalone features and partial runs end
|
|
278
|
+
**Gate:** only run this step if (a) the resolved feature's `.pipeline-state.json` has an `epic` key **and** (b) Step 5 set `stages.forge-5-loop.status` to `complete` (all backlog items done). If either is false, **skip** — standalone completed features are handled by Step 5b, and partial runs end as today (REQ-COMPAT-01).
|
|
277
279
|
|
|
278
280
|
1. **Offer impl-verify first (recommended, skippable).** Per the completion rule (`00-core-definitions.md §7`), a feature whose `forge-verify-impl.status == findings-reported` does **not** unblock dependents. Use `AskUserQuestion` (NOT inline prose) to offer:
|
|
279
281
|
|
|
@@ -297,7 +299,7 @@ Update `{resolvedFeatureDir}/.pipeline-state.json`:
|
|
|
297
299
|
- rauf resolves `RAUF.md` with fallback: checks `{backlogDir}/.rauf/RAUF.md` first, then the project's `.rauf/RAUF.md`. As long as the runner is installed in the project, the prompt template will be found.
|
|
298
300
|
- State files (state.json, {loopRunner.logFile}, etc.) are created at `{backlogDir}/{loopRunner.stateDir}/` — this is within the feature's spec directory and is expected. State is isolated per backlog dir, so concurrent features don't collide.
|
|
299
301
|
- If the session disconnects during a long-running loop, the runner process continues independently. The user can check results later with the status / list commands.
|
|
300
|
-
- Never run the run command in the foreground (without `run_in_background`) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the `Monitor` tool (3d),
|
|
301
|
-
- The `Monitor` must use `persistent: true` (not a bounded `timeout_ms`), watch the **structured** surface (`events.ndjson`), and never filter on raw `RAUF_*` tokens — they appear in agent prose and false-match. A `needs_human`/`blocked`/`review` signal does **not** pause the loop — the runner sets the item aside and keeps going; surface it live but don't tell the user the loop is waiting. See `references/runner-contract.md` for the full monitoring rules.
|
|
302
|
+
- Never run the run command in the foreground (without `run_in_background`) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the `Monitor` tool (3d), never `sleep`/poll in the foreground. The `Monitor` must use `persistent: true` (not a bounded `timeout_ms`), watch the **structured** surface (`events.ndjson`), and never filter on raw `RAUF_*` tokens — they appear in agent prose and false-match. A `needs_human`/`blocked`/`review` signal does **not** pause the loop — the runner sets the item aside and keeps going; surface it live but don't tell the user the loop is waiting. See `references/runner-contract.md` for the full monitoring rules.
|
|
302
303
|
- If a previous loop run left a stale lock, the user may need to pass `--force` to clear it. rauf will report this error clearly.
|
|
303
304
|
- The version gate (1c) uses the `--json` form on purpose; never parse `rauf version`'s human output.
|
|
305
|
+
- **Implementation artifacts must not cite specs.** The loop should **read** the specs and `backlog.json` freely — they are the source of truth for what to build, and the backlog rightly references specs for provenance. But the artifacts the loop **writes into the target repo** (source code, generated `SKILL.md`/agent files, configs, code comments) must be **self-contained**: they must NOT reference feature-forge spec files (no `See specs/{feature}/NN-*.md`, no "source spec" provenance notes in shipped output). Specs are pre-implementation inputs that may be archived or deleted once the feature ships; the implementation must stand on its own. This applies only to shipped implementation output — never to the backlog or spec documents, which should keep citing specs.
|
|
@@ -13,6 +13,19 @@ Next steps:
|
|
|
13
13
|
- /feature-forge:forge-6-docs {feature} Generate architecture docs
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
**Runner review pass.** A review flag (e.g. rauf's `--review`) makes the runner run
|
|
17
|
+
a post-loop review that **auto-creates and implements fix items** rather than handing
|
|
18
|
+
findings to the user — distinct from `forge-verify impl` (a clean-context audit that
|
|
19
|
+
writes a findings doc). When Step 4a captured a `review_completed` event, add a line
|
|
20
|
+
**above** "Next steps" so the pass's effect is visible and not mistaken for "nothing
|
|
21
|
+
happened":
|
|
22
|
+
```
|
|
23
|
+
Runner review pass: {itemsCreated} fix item(s) created and implemented.
|
|
24
|
+
{summary}
|
|
25
|
+
```
|
|
26
|
+
Omit this line when no `review_completed` event was emitted (no review flag passed).
|
|
27
|
+
The created items are already counted in the totals above.
|
|
28
|
+
|
|
16
29
|
**Some items need a human:**
|
|
17
30
|
```
|
|
18
31
|
Loop completed for {feature}.
|
|
@@ -70,6 +70,38 @@ The default / `claude-cli` path runs **no** probe (zero extra cost). See
|
|
|
70
70
|
`04-availability-precheck.md` for the full pre-check, classification, and allow-list,
|
|
71
71
|
and `02-config-schema-and-gating.md` for the capability gate.
|
|
72
72
|
|
|
73
|
+
> **Probe false-negative for Claude Code installs (advisory).** `rauf agents` may
|
|
74
|
+
> report `claude-cli` **unavailable** (e.g. *"credentials file not found:
|
|
75
|
+
> ~/.config/claude-code/credentials.json"*) even when a working `claude` CLI
|
|
76
|
+
> authenticates elsewhere — the probe's credential heuristic doesn't cover every
|
|
77
|
+
> install. This is a rauf probe concern, not something forge-5-loop fixes. The
|
|
78
|
+
> **default-agent path skips the probe entirely**, so an ordinary default run is
|
|
79
|
+
> unaffected; only an **explicit** `--agent claude-cli` would be flagged UNAVAILABLE,
|
|
80
|
+
> and the existing **proceed-anyway** path (above) covers it. Do not attempt to
|
|
81
|
+
> patch rauf's probe from here.
|
|
82
|
+
|
|
83
|
+
### Claude-only model-alias guard (Step 2d, sub-step d-model)
|
|
84
|
+
|
|
85
|
+
When the resolved agent is **non-default** (not the default / `claude-cli` path),
|
|
86
|
+
forge must guard against a backlog whose items pin **Claude-specific** model aliases.
|
|
87
|
+
forge-4-backlog (via the rauf author-backlog skill) writes Claude tier aliases
|
|
88
|
+
(`opus` / `sonnet`) into each item's `model`. Because rauf's precedence puts
|
|
89
|
+
`item.model` **above** `--agent`, the alias is forwarded verbatim to the selected
|
|
90
|
+
agent; a non-Claude agent (e.g. codex) then 400s — *"The 'sonnet' model is not
|
|
91
|
+
supported when using Codex with a ChatGPT account."* — so **every** spawn exits 1 and
|
|
92
|
+
rauf reports *"Circuit breaker: 3 consecutive infra failures — halting"* with no hint
|
|
93
|
+
of the real cause. forge-5-loop therefore detects Claude-specific `model` aliases in
|
|
94
|
+
the backlog (tier aliases `opus`/`sonnet`/`haiku` or `claude-*` ids) and, before
|
|
95
|
+
launch, **warns** and offers (via `AskUserQuestion`) to **strip `model` for this run**
|
|
96
|
+
(remove the key from each affected item so each spawn uses the agent's own default) or
|
|
97
|
+
**proceed as-is**. forge only ever touches the `model` field — never `provider`. The
|
|
98
|
+
default / `claude-cli` path skips this guard (the aliases are valid there).
|
|
99
|
+
|
|
100
|
+
> **Follow-up (out of scope here — rauf repo).** The durable fix would be for the
|
|
101
|
+
> rauf `author-backlog` skill to keep `model` **provider-neutral** by default (or to
|
|
102
|
+
> document that writing a tier alias binds the backlog to Claude agents). That lives
|
|
103
|
+
> in the separate rauf plugin/repo, not feature-forge; tracked as a follow-up.
|
|
104
|
+
|
|
73
105
|
## Optional flags catalog (Step 2d, rauf)
|
|
74
106
|
|
|
75
107
|
These are the optional flags the user may add to the rendered run command. If the
|
|
@@ -92,6 +124,14 @@ Launch the loop **backgrounded** so it survives session end and does not block t
|
|
|
92
124
|
session, and prefer the machine-readable event stream so the session can supervise
|
|
93
125
|
it live.
|
|
94
126
|
|
|
127
|
+
> **Clean-tree precondition.** rauf refuses to run with uncommitted changes
|
|
128
|
+
> (*"Refusing to run the loop with uncommitted changes… pass --force"*). Step 3a's
|
|
129
|
+
> in-progress `.pipeline-state.json` write is itself an uncommitted change, so it
|
|
130
|
+
> **must be committed before launch** (Step 3a) — otherwise the first launch on an
|
|
131
|
+
> otherwise-clean repo always fails. If the tree still has unrelated uncommitted
|
|
132
|
+
> changes after that commit, surface it and let the user commit/stash or pass
|
|
133
|
+
> `--force`; never auto-pass `--force`.
|
|
134
|
+
|
|
95
135
|
- **If `loopRunner.eventStreamCommand` is configured (default for rauf):** render it
|
|
96
136
|
(it appends `--ndjson` to the run) and launch via the Bash tool with
|
|
97
137
|
`run_in_background: true`, redirecting stdout to a stable events file:
|
|
@@ -35,12 +35,16 @@ Check `{resolvedFeatureDir}/backlog.json` (or `{backlogDir}/{feature}/backlog.js
|
|
|
35
35
|
|
|
36
36
|
Also check `.pipeline-state.json` for `stages.forge-5-loop`. If it exists and has status `in-progress` (some items incomplete), include this in the warning: "The rauf loop has not fully completed — {done}/{total} items done. Documentation may need updates after remaining items are implemented."
|
|
37
37
|
|
|
38
|
+
### Impl-Verify Backstop
|
|
39
|
+
|
|
40
|
+
Check `.pipeline-state.json` for `stages.forge-verify-impl`. If it is **absent** or has status `"skipped"`, use `AskUserQuestion` to warn with the cost of skipping: "Implementation hasn't been verified yet. Recommended: run `/feature-forge:forge-verify {feature} impl` first to audit the loop's output — docs generated over unverified code can document bugs or gaps as if they were intended behavior, and readers will trust them. Generate docs anyway?" Offer **Verify first (recommended)** · **Generate docs anyway**. This mirrors `forge-4-backlog`'s pre-stage verification check and backstops a skipped impl-verify regardless of how the loop ended. If `stages.forge-verify-impl` shows it already ran (`findings-applied`, `findings-reported`, or `passed`), proceed with no warning.
|
|
41
|
+
|
|
38
42
|
### Epic-Level Documentation (epic members only)
|
|
39
43
|
|
|
40
44
|
If the resolved feature has an `epic` back-pointer in its `.pipeline-state.json`, run:
|
|
41
45
|
|
|
42
46
|
```bash
|
|
43
|
-
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)"
|
|
47
|
+
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)"
|
|
44
48
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
45
49
|
python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
|
|
46
50
|
```
|
|
@@ -110,6 +114,11 @@ Present the plan and use `AskUserQuestion` to get the user's confirmation.
|
|
|
110
114
|
- Specs are the source of truth for design intent; code is the source of truth for behavior
|
|
111
115
|
- Read the actual source code to verify your documentation is correct
|
|
112
116
|
|
|
117
|
+
**Don't cite or link spec files in the generated docs.**
|
|
118
|
+
- Read the specs freely for context, but the docs you write are shipped implementation artifacts — they must be self-contained
|
|
119
|
+
- Never link or reference `PRD.md`, `tech-spec.md`, or the numbered implementation specs (`specs/{feature}/NN-*.md`); these are pre-implementation artifacts that may be archived or deleted
|
|
120
|
+
- Reference only the code, runtime contracts/configuration, and other generated docs. If you need to convey design intent, write it directly into the doc rather than pointing at a spec
|
|
121
|
+
|
|
113
122
|
**Match existing conventions.**
|
|
114
123
|
- If other features' docs use a specific heading structure, follow it
|
|
115
124
|
- If they include diagrams, include diagrams
|
|
@@ -173,6 +182,7 @@ Write pipeline state conforming to `references/pipeline-state-schema.json`.
|
|
|
173
182
|
## Gotchas
|
|
174
183
|
|
|
175
184
|
- Don't just rephrase the specs. Documentation should explain the implemented system, not the planned system. Read the actual code.
|
|
185
|
+
- Don't cite spec files (PRD.md, tech-spec.md, numbered specs) as sources or "further reading" in the generated docs — specs are pre-implementation artifacts that may not survive. Keep the docs self-contained; link only to code, configuration, and other docs.
|
|
176
186
|
- If the implementation doesn't exist yet (backlog hasn't been run), document based on specs but note prominently that docs are pre-implementation and may need updating.
|
|
177
187
|
- API reference should include actual function signatures from the code, not from the spec (they may differ).
|
|
178
188
|
- Don't generate docs that will immediately be stale. Focus on concepts, architecture, and patterns rather than line-by-line code walkthroughs.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
# GENERATED — DO NOT EDIT. Source: skills/forge-bootstrap/SKILL.md. Regenerate: python3 scripts/build-adapters.py
|
|
3
|
+
name: forge-bootstrap
|
|
4
|
+
description: Scaffold a brand-new empty repository to a pipeline-ready, green baseline (structure, toolchain, passing lint+test, forge.config.json), then optionally chain into the pipeline. Use when the user runs /feature-forge:forge-bootstrap or asks to bootstrap/scaffold a new empty project for forge. Do NOT trigger on a non-empty repo (that is forge-init), or for general project setup outside the forge pipeline.
|
|
5
|
+
argument-hint: '[--mode-b] [--here|<target-dir>]'
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Bootstrap a Greenfield Repo
|
|
9
|
+
|
|
10
|
+
Take a **brand-new, empty** repository to a pipeline-ready, **green** baseline — a
|
|
11
|
+
scaffolded stack, a valid `forge.config.json`, and a passing lint+test — then optionally
|
|
12
|
+
chain into the pipeline (Mode B). You own the **conversation and decisions only**; every
|
|
13
|
+
mechanic (the greenfield gate, `git init`, scaffolding, the config write, the toolchain
|
|
14
|
+
probe, the commit) is delegated to the helper `scripts/forge-bootstrap.py`. Never inline
|
|
15
|
+
file generation, template contents, the config field list, or the greenfield allow-list —
|
|
16
|
+
they live in the helper and templates, referenced here, never duplicated.
|
|
17
|
+
|
|
18
|
+
`<target-dir>` below is the project being bootstrapped (default `.`, or the argument) — it is
|
|
19
|
+
**distinct from `$R`**, the plugin root. Drive control flow off the helper's exit codes and
|
|
20
|
+
JSON: **0** = ok, **1** = actionable findings, **2** = usage/IO **or** verify
|
|
21
|
+
toolchain-missing.
|
|
22
|
+
|
|
23
|
+
## Host adaptation (conversational fallback)
|
|
24
|
+
|
|
25
|
+
If the `AskUserQuestion` tool is available, ask the interview questions through it. If it is
|
|
26
|
+
**not** available (a non-Claude host such as Codex), emit the same questions as a single
|
|
27
|
+
**numbered text list** — each line one question with its options in brackets and the default
|
|
28
|
+
marked — then **stop and wait for a single text reply**. Parse the reply positionally
|
|
29
|
+
(answer N → question N); re-prompt only the unparseable items. The question content (text,
|
|
30
|
+
options, defaults) and the conditional gating (Q4 skipped for go/rust/generic; Q6a only for
|
|
31
|
+
monorepo; Q8 only after a verified-green baseline) are **identical** across both paths — only
|
|
32
|
+
the rendering changes. Never assume answers; always wait for the reply.
|
|
33
|
+
|
|
34
|
+
Emit any context as plain text, then route **all** questions through `AskUserQuestion` (or the
|
|
35
|
+
fallback) — never as inline prose questions, which stall the session.
|
|
36
|
+
|
|
37
|
+
## Flow (Mode A — default)
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
1. Portable-root prelude → locate $R
|
|
41
|
+
2. check → gate + recovery detection
|
|
42
|
+
├─ eligible:false (exit 1) → Greenfield refusal — STOP
|
|
43
|
+
└─ resumeMarker != null → Resume / restart / cancel
|
|
44
|
+
3. Interview → assemble the Answers payload
|
|
45
|
+
4. scaffold --answers <json> → git init if absent; compose templates; write config;
|
|
46
|
+
track artifacts into the sentinel
|
|
47
|
+
5. verify → toolchain probe + lint/test per member
|
|
48
|
+
├─ toolchainPresent:false (2) → Missing toolchain: scaffold-anyway-unverified vs abort
|
|
49
|
+
├─ green:false (exit 1) → Not-green: surface failures, offer fix/abort
|
|
50
|
+
└─ green:true (exit 0) → proceed
|
|
51
|
+
6. commit [--stage-only per Q9] → stage exact tracked list; single baseline commit;
|
|
52
|
+
remove the sentinel before staging
|
|
53
|
+
7. Completion summary / Mode B hand-off
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Step 1 — locate the helper
|
|
57
|
+
|
|
58
|
+
Every bash invocation begins with the byte-identical portable-root prelude, then calls the
|
|
59
|
+
helper. Pass `--specs-dir ./specs` (the default) so the gate allow-lists the specs directory.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
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)"
|
|
63
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
64
|
+
python3 "$R/scripts/forge-bootstrap.py" check "<target-dir>" --json --specs-dir ./specs
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Never hardcode a plugin path or a `~/.claude/...` path — always go through `$R`.
|
|
68
|
+
|
|
69
|
+
### Step 2 — gate (`check`)
|
|
70
|
+
|
|
71
|
+
Read `CheckResult{eligible, disqualifying[], resumeMarker}`.
|
|
72
|
+
|
|
73
|
+
- **`eligible:false` (exit 1) → Greenfield refusal.** Name **every** path in `disqualifying[]`
|
|
74
|
+
verbatim, then direct the user to the right tool — run `forge-init`, then `forge-1-prd`.
|
|
75
|
+
**Touch no files** and STOP (the gate is read-only).
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
This repo is not empty — forge-bootstrap only scaffolds a brand-new project.
|
|
79
|
+
Disqualifying files found:
|
|
80
|
+
- package.json
|
|
81
|
+
- src/index.ts
|
|
82
|
+
To set forge up on an existing project, run: /feature-forge:forge-init
|
|
83
|
+
Then start the pipeline with: /feature-forge:forge-1-prd <feature>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- **`resumeMarker != null` → Partial-state detected.** A `.forge-bootstrap.json` sentinel
|
|
87
|
+
from this tool's own prior run exists — do **not** treat it as a refusal. Surface the prior
|
|
88
|
+
run's `startedAt` and `artifactsWritten[]`, then ask **resume / restart / cancel**:
|
|
89
|
+
- **Resume** — reuse the sentinel's mirrored `answers` (no re-interview), re-run `scaffold`
|
|
90
|
+
(idempotent — the helper skips already-recorded files), continue from step 5.
|
|
91
|
+
- **Restart** — discard the partial: delete the recorded `artifactsWritten[]` tree + the `.forge-bootstrap.json` sentinel (a skill-orchestration step — the helper has no clean subcommand), then run the interview and `scaffold` fresh.
|
|
92
|
+
- **Cancel** — stop without changes.
|
|
93
|
+
|
|
94
|
+
You perform no cleanup yourself; you only render the choice and dispatch the subcommand.
|
|
95
|
+
|
|
96
|
+
### Step 3 — interview
|
|
97
|
+
|
|
98
|
+
Ask exactly these, in order. Resolved answers become the `Answers` payload handed to
|
|
99
|
+
`scaffold --answers`.
|
|
100
|
+
|
|
101
|
+
| # | Question | Default / seed rule | Options |
|
|
102
|
+
|---|----------|---------------------|---------|
|
|
103
|
+
| Q1 | Project name? | default = target directory basename (confirm) | free-text, pre-filled |
|
|
104
|
+
| Q2 | One-line purpose? | no default; seeds README + config | free-text |
|
|
105
|
+
| Q3 | Language / stack? | required | `typescript` / `python` / `go` / `rust` / `generic` |
|
|
106
|
+
| Q4 | Package manager? | **only when the stack has a choice** — TS: `npm`/`pnpm`/`yarn`, Python: `uv`/`poetry`/`pip`; **skipped** for go/rust/generic | the stack's options |
|
|
107
|
+
| Q5 | License? | **detect & pre-select** from a pre-existing `LICENSE` (see gating); else default `MIT`. The helper keeps an existing `LICENSE` (REQ-SCAF-09) | `MIT` / `Apache-2.0` / `none` |
|
|
108
|
+
| Q6 | Single package or monorepo? | default `single` | `single` / `monorepo` |
|
|
109
|
+
| Q6a | (monorepo only) member count, then per-member name + stack | no default; one member each (mixed-language allowed) | loop |
|
|
110
|
+
| Q7 | Chain into the pipeline now (Mode B)? | default `no` | `no, scaffold only` / `yes, chain in` |
|
|
111
|
+
| Q8 | (Mode B only) First build: feature or epic? | asked **only after a verified-green baseline** | `feature` / `epic` |
|
|
112
|
+
| Q9 | Commit the baseline, or leave it staged? | default `commit` | `commit` / `stage only` |
|
|
113
|
+
|
|
114
|
+
Gating: Q4 is asked only when the chosen stack has a package-manager choice; Q6a only when
|
|
115
|
+
Q6 = `monorepo` (each member gets a `path` like `packages/<name>`; a single package is one
|
|
116
|
+
member with `path = "."`); Q7 may be asked up-front, but Q8 / Mode B launch are gated on a
|
|
117
|
+
verified-green, committed baseline (see below). You may also offer an optional
|
|
118
|
+
"generate a CI workflow (lint+test)?" question, setting `Answers.ci`.
|
|
119
|
+
|
|
120
|
+
License detect-and-seed (Q5, REQ-SCAF-09): when a `LICENSE` already exists in the target
|
|
121
|
+
(an allowed-meta file the gate let through), **read its first lines** and pre-select the
|
|
122
|
+
matching Q5 default — "MIT License" → `MIT`, "Apache License" → `Apache-2.0`, otherwise
|
|
123
|
+
keep the default and note the unrecognized license. The helper never overwrites the existing
|
|
124
|
+
`LICENSE`; this only seeds the interview default. Also set `Answers.author` from
|
|
125
|
+
`git config user.name` (fallback: the project name) and `Answers.host` to `claude` when
|
|
126
|
+
running on a Claude host (so the helper emits `CLAUDE.md` alongside `AGENTS.md`), else leave
|
|
127
|
+
it null.
|
|
128
|
+
|
|
129
|
+
**Assemble the payload.** Build one `Answers` JSON object — `projectName`, `purpose`,
|
|
130
|
+
`layout`, `license`, `members[]`, `modeB`, `modeBTarget`, `ci`, `commitStyle`, `author`,
|
|
131
|
+
`host` — and pass it verbatim to `scaffold --answers '<json>'`. Invent no fields beyond that
|
|
132
|
+
schema. Two fields come from your runtime, not the interview: `author` from `git config
|
|
133
|
+
user.name` (else the project name; it is the LICENSE copyright holder), and `host` — `"claude"`
|
|
134
|
+
when running under a Claude host (e.g. `AskUserQuestion` is available), else `"codex"`/`"other"`.
|
|
135
|
+
`host` drives the host-conditional agent file: the helper always emits `AGENTS.md` and adds
|
|
136
|
+
`CLAUDE.md` only when `host == "claude"`.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
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)"
|
|
140
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
141
|
+
python3 "$R/scripts/forge-bootstrap.py" scaffold "<target-dir>" --json --answers '<Answers JSON>'
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Step 5 — verify
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
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)"
|
|
148
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
149
|
+
python3 "$R/scripts/forge-bootstrap.py" verify "<target-dir>" --json --answers '<Answers JSON>'
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Read `VerifyResult{green, toolchainPresent, lint[], test[]}`.
|
|
153
|
+
|
|
154
|
+
- **`toolchainPresent:false` (exit 2) → Missing toolchain.** Warn, naming which stack's
|
|
155
|
+
toolchain is missing. Ask **scaffold-anyway (unverified) vs abort**. If scaffold-anyway,
|
|
156
|
+
proceed to commit and mark the baseline **unverified** in the summary — never claim green
|
|
157
|
+
you could not verify. If abort, stop; the sentinel stays in-progress for a later resume. An
|
|
158
|
+
unverified baseline **disqualifies Mode B** (no override).
|
|
159
|
+
- **`green:false` with `toolchainPresent:true` (exit 1) → Not-green.** Surface the failing
|
|
160
|
+
`CommandOutcome` entries (command + member) verbatim; offer abort or retry-after-investigation.
|
|
161
|
+
Do not silently proceed to a "green" summary.
|
|
162
|
+
- **`green:true` (exit 0)** → proceed to commit.
|
|
163
|
+
|
|
164
|
+
### Step 6 — commit
|
|
165
|
+
|
|
166
|
+
Invoke `commit` (or `commit --stage-only`, per Q9). Helper-owned: it stages the **exact
|
|
167
|
+
tracked list** (never `git add -A`/`--force`/`--no-verify`), makes a single baseline commit,
|
|
168
|
+
and removes the sentinel before staging so it never enters history. Read
|
|
169
|
+
`CommitResult{committed, commitHash, staged[]}`. On commit failure, surface the error and
|
|
170
|
+
leave the sentinel in-progress (resumable) — do **not** declare success.
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
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)"
|
|
174
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
175
|
+
python3 "$R/scripts/forge-bootstrap.py" commit "<target-dir>" --json --answers '<Answers JSON>' [--stage-only]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Completion summary
|
|
179
|
+
|
|
180
|
+
Render the human-facing summary from the helper's JSON (`VerifyResult` + `CommitResult`). State:
|
|
181
|
+
created artifacts (from `CommitResult.staged[]`, including any kept pre-existing meta file);
|
|
182
|
+
resolved stack(s) (single, or each monorepo member's name + stack); the **verification
|
|
183
|
+
verdict** — `green` or `unverified` (never "green" for an unverified baseline); the commit
|
|
184
|
+
state (with `commitHash`, or staged-only); and the exact next command. In Mode B, **launch**
|
|
185
|
+
the next stage instead of printing the command.
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
Bootstrap complete — pipeline-ready baseline.
|
|
189
|
+
Stack: python (uv)
|
|
190
|
+
Created: pyproject.toml, src/acme_svc/..., tests/test_smoke.py, .gitignore,
|
|
191
|
+
README.md, LICENSE, AGENTS.md, CLAUDE.md, forge.config.json
|
|
192
|
+
Kept: (none — README/LICENSE generated fresh)
|
|
193
|
+
Verification: green (mypy ✓ pytest ✓)
|
|
194
|
+
Commit: baseline committed (a1b2c3d)
|
|
195
|
+
Next step: /feature-forge:forge-1-prd <feature>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Unverified variant:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
Verification: UNVERIFIED — toolchain not found on this machine; lint+test were not run.
|
|
202
|
+
Install the toolchain and re-run verify before relying on the baseline.
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Mode B hand-off (opt-in)
|
|
206
|
+
|
|
207
|
+
Mode B is **opt-in** (Q7; default Mode A) and **agent-driven** — it hands skill-to-skill to
|
|
208
|
+
the next pipeline stage, not through the helper.
|
|
209
|
+
|
|
210
|
+
**Gate:** launch the next stage **only after both** a verified-green baseline
|
|
211
|
+
(`VerifyResult.green == true`) **and** a successful commit (`CommitResult.committed == true`).
|
|
212
|
+
If the baseline is unverified or not-green, you MUST NOT launch the next stage and MUST NOT
|
|
213
|
+
even ask Q8 — fall back to the Mode A summary with the next command printed. There is no
|
|
214
|
+
"launch anyway on red" path.
|
|
215
|
+
|
|
216
|
+
When the gate passes:
|
|
217
|
+
|
|
218
|
+
1. Ask Q8 — feature vs epic — if not already resolved.
|
|
219
|
+
2. **Feature:** invoke `forge-1-prd <feature>` skill-to-skill, seeding `<feature>` from a
|
|
220
|
+
confirmed, kebab-cased name.
|
|
221
|
+
3. **Epic:** invoke `forge-0-epic <epic>` skill-to-skill. Seed the epic name and initial
|
|
222
|
+
decomposition from the project name + purpose (Q1/Q2), **propose it, let the user
|
|
223
|
+
edit/approve**, then launch.
|
|
224
|
+
4. **Launch** that stage instead of printing its command.
|
|
225
|
+
|
|
226
|
+
Mode B auto-launches **only the immediate next stage**; every subsequent pipeline stage stays
|
|
227
|
+
a normal, user-driven step. The hand-off is always skill-to-skill, never via the helper.
|
|
228
|
+
|
|
229
|
+
## The four terminal outcomes
|
|
230
|
+
|
|
231
|
+
Every run ends in exactly one explicit, actionable outcome — make it explicit in your output;
|
|
232
|
+
no run ends silently:
|
|
233
|
+
|
|
234
|
+
- **Success** — `commit` exit 0 + green (or unverified-but-proceeded) → completion summary, or
|
|
235
|
+
Mode B launch.
|
|
236
|
+
- **Greenfield refusal** — `check` `eligible:false` → name `disqualifying[]`, point to
|
|
237
|
+
`forge-init` + `forge-1-prd`, touch nothing.
|
|
238
|
+
- **Missing toolchain** — `verify` `toolchainPresent:false` (exit 2) → scaffold-anyway-unverified
|
|
239
|
+
vs abort; mark **unverified**.
|
|
240
|
+
- **Partial-state detected** — `check` `resumeMarker != null` → resume / restart / cancel.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Behavioral test: run the entrypoint and assert its output.
|
|
3
|
+
set -eu
|
|
4
|
+
|
|
5
|
+
actual="$(./run.sh)"
|
|
6
|
+
expected="Hello from {{PROJECT_NAME}}"
|
|
7
|
+
|
|
8
|
+
if [ "$actual" != "$expected" ]; then
|
|
9
|
+
printf 'FAIL: expected %s but got %s\n' "$expected" "$actual" >&2
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
printf 'PASS: run.sh produced the expected greeting\n'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Agent Instructions — {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
## Project Purpose
|
|
4
|
+
|
|
5
|
+
{{PURPOSE}}
|
|
6
|
+
|
|
7
|
+
## Getting Started
|
|
8
|
+
|
|
9
|
+
This project was scaffolded by forge-bootstrap. To continue development:
|
|
10
|
+
|
|
11
|
+
1. Review `forge.config.json` for the project configuration.
|
|
12
|
+
2. Run the forge pipeline (forge-1-prd → forge-0-epic → forge-3-specs → forge-4-backlog) to plan and implement features.
|
|
13
|
+
3. Use `forge-5-loop` to drive autonomous implementation.
|
|
14
|
+
|
|
15
|
+
## Conventions
|
|
16
|
+
|
|
17
|
+
- Follow the patterns established in the existing codebase.
|
|
18
|
+
- Keep `forge.config.json` up to date with any changes to stack or commands.
|
|
19
|
+
|
|
20
|
+
## Specs are pre-implementation
|
|
21
|
+
|
|
22
|
+
- Documents under `specs/` (PRDs, tech specs, numbered implementation specs) establish the backlog. They are **not** kept in sync with the code as it evolves.
|
|
23
|
+
- Do not flag or "fix" divergence between a finalized spec and the implementation — code is the source of truth for behavior.
|
|
24
|
+
- It's fine for `specs/` artifacts and `backlog.json` to reference specs for provenance, but implementation artifacts (source code, generated skills/agents, configs, docs) must not reference spec files, which may be archived or deleted after a feature ships.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Claude Instructions — {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
## Project Purpose
|
|
4
|
+
|
|
5
|
+
{{PURPOSE}}
|
|
6
|
+
|
|
7
|
+
## Getting Started
|
|
8
|
+
|
|
9
|
+
This project was scaffolded by forge-bootstrap. To continue development:
|
|
10
|
+
|
|
11
|
+
1. Review `forge.config.json` for the project configuration.
|
|
12
|
+
2. Run the forge pipeline (forge-1-prd → forge-0-epic → forge-3-specs → forge-4-backlog) to plan and implement features.
|
|
13
|
+
3. Use `forge-5-loop` to drive autonomous implementation.
|
|
14
|
+
|
|
15
|
+
## Working with Claude
|
|
16
|
+
|
|
17
|
+
- Use `/feature-forge:forge` to enter the forge pipeline for new features.
|
|
18
|
+
- The `forge.config.json` at the project root defines the stack, commands, and pipeline settings.
|
|
19
|
+
- Follow the patterns established in the existing codebase.
|
|
20
|
+
|
|
21
|
+
## Specs are pre-implementation
|
|
22
|
+
|
|
23
|
+
- Documents under `specs/` (PRDs, tech specs, numbered implementation specs) establish the backlog. They are **not** kept in sync with the code as it evolves.
|
|
24
|
+
- Don't flag or "fix" divergence between a finalized spec and the implementation — code is the source of truth for behavior.
|
|
25
|
+
- It's fine for `specs/` artifacts and `backlog.json` to reference specs for provenance, but implementation artifacts (source code, generated skills/agents, configs, docs) must not reference spec files, which may be archived or deleted after a feature ships.
|