@garygentry/feature-forge 0.3.5 → 0.3.7
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 +1 -1
- package/adapters/GENERATION-REPORT.md +20 -0
- package/adapters/claude/.claude-plugin/plugin.json +16 -0
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/agents/forge-verifier.md +16 -5
- package/adapters/claude/references/forge-config-schema.json +5 -5
- package/adapters/claude/references/portable-root.md +20 -16
- package/adapters/claude/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/references/process-overview.md +1 -1
- package/adapters/claude/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/references/select-outcome.md +138 -0
- package/adapters/claude/references/shared-conventions.md +176 -23
- package/adapters/claude/references/skill-frontmatter.schema.json +3 -1
- package/adapters/claude/references/stack-resolution.md +1 -1
- package/adapters/claude/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/claude/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/claude/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/claude/references/verify-state.md +98 -0
- package/adapters/claude/scripts/forge-bootstrap.py +23 -2
- package/adapters/claude/scripts/forge-root.sh +104 -21
- package/adapters/claude/scripts/forge-session.py +620 -6969
- package/adapters/claude/scripts/forge_session/__init__.py +11 -0
- package/adapters/claude/scripts/forge_session/_common.py +1566 -0
- package/adapters/claude/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/claude/scripts/forge_session/cli.py +1067 -0
- package/adapters/claude/scripts/forge_session/decisions.py +355 -0
- package/adapters/claude/scripts/forge_session/discover.py +472 -0
- package/adapters/claude/scripts/forge_session/doctor.py +2144 -0
- package/adapters/claude/scripts/forge_session/exit.py +1081 -0
- package/adapters/claude/scripts/forge_session/outcomes.py +574 -0
- package/adapters/claude/scripts/forge_session/routes.py +1162 -0
- package/adapters/claude/scripts/forge_session/state.py +1479 -0
- package/adapters/claude/scripts/forge_session/topology.py +443 -0
- package/adapters/claude/skills/forge/SKILL.md +7 -7
- package/adapters/claude/skills/forge/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -7
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/claude/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-1-prd/SKILL.md +7 -7
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-2-tech/SKILL.md +7 -7
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -5
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -8
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -41
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/claude/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +17 -7
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +21 -14
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-bootstrap/SKILL.md +19 -10
- package/adapters/claude/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +15 -18
- package/adapters/claude/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-guide/SKILL.md +87 -1
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/claude/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-guide/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-init/SKILL.md +58 -7
- package/adapters/claude/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +25 -26
- package/adapters/claude/skills/forge-verify/references/findings-template.md +8 -8
- package/adapters/claude/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +176 -23
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-researcher.toml +1 -1
- package/adapters/codex/agents/forge-verifier.toml +17 -6
- package/adapters/codex/references/forge-config-schema.json +7 -7
- package/adapters/codex/references/portable-root.md +20 -16
- package/adapters/codex/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/references/process-overview.md +10 -10
- package/adapters/codex/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/references/select-outcome.md +138 -0
- package/adapters/codex/references/shared-conventions.md +189 -36
- package/adapters/codex/references/skill-frontmatter.schema.json +3 -1
- package/adapters/codex/references/stack-resolution.md +1 -1
- package/adapters/codex/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/codex/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/codex/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/references/verify-state.md +98 -0
- package/adapters/codex/scripts/forge-bootstrap.py +23 -2
- package/adapters/codex/scripts/forge-root.sh +104 -21
- package/adapters/codex/scripts/forge-session.py +620 -6969
- package/adapters/codex/scripts/forge_session/__init__.py +11 -0
- package/adapters/codex/scripts/forge_session/_common.py +1566 -0
- package/adapters/codex/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/codex/scripts/forge_session/cli.py +1067 -0
- package/adapters/codex/scripts/forge_session/decisions.py +355 -0
- package/adapters/codex/scripts/forge_session/discover.py +472 -0
- package/adapters/codex/scripts/forge_session/doctor.py +2144 -0
- package/adapters/codex/scripts/forge_session/exit.py +1081 -0
- package/adapters/codex/scripts/forge_session/outcomes.py +574 -0
- package/adapters/codex/scripts/forge_session/routes.py +1162 -0
- package/adapters/codex/scripts/forge_session/state.py +1479 -0
- package/adapters/codex/scripts/forge_session/topology.py +443 -0
- package/adapters/codex/skills/forge/SKILL.md +40 -40
- package/adapters/codex/skills/forge/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-0-epic/SKILL.md +15 -15
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-1-prd/SKILL.md +15 -15
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-2-tech/SKILL.md +15 -15
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-3-specs/SKILL.md +10 -10
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +19 -11
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-5-loop/SKILL.md +48 -53
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/codex/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +20 -10
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-6-docs/SKILL.md +27 -20
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-bootstrap/SKILL.md +23 -15
- package/adapters/codex/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/codex/skills/forge-fix/SKILL.md +27 -30
- package/adapters/codex/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-guide/SKILL.md +84 -7
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +7 -7
- package/adapters/codex/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-init/SKILL.md +62 -12
- package/adapters/codex/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +32 -33
- package/adapters/codex/skills/forge-verify/references/findings-template.md +8 -8
- package/adapters/codex/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +189 -36
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-researcher.md +1 -1
- package/adapters/copilot/agents/forge-verifier.md +17 -6
- package/adapters/copilot/references/forge-config-schema.json +7 -7
- package/adapters/copilot/references/portable-root.md +20 -16
- package/adapters/copilot/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/references/process-overview.md +10 -10
- package/adapters/copilot/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/references/select-outcome.md +138 -0
- package/adapters/copilot/references/shared-conventions.md +189 -36
- package/adapters/copilot/references/skill-frontmatter.schema.json +3 -1
- package/adapters/copilot/references/stack-resolution.md +1 -1
- package/adapters/copilot/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/copilot/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/copilot/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/references/verify-state.md +98 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +23 -2
- package/adapters/copilot/scripts/forge-root.sh +104 -21
- package/adapters/copilot/scripts/forge-session.py +620 -6969
- package/adapters/copilot/scripts/forge_session/__init__.py +11 -0
- package/adapters/copilot/scripts/forge_session/_common.py +1566 -0
- package/adapters/copilot/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/copilot/scripts/forge_session/cli.py +1067 -0
- package/adapters/copilot/scripts/forge_session/decisions.py +355 -0
- package/adapters/copilot/scripts/forge_session/discover.py +472 -0
- package/adapters/copilot/scripts/forge_session/doctor.py +2144 -0
- package/adapters/copilot/scripts/forge_session/exit.py +1081 -0
- package/adapters/copilot/scripts/forge_session/outcomes.py +574 -0
- package/adapters/copilot/scripts/forge_session/routes.py +1162 -0
- package/adapters/copilot/scripts/forge_session/state.py +1479 -0
- package/adapters/copilot/scripts/forge_session/topology.py +443 -0
- package/adapters/copilot/skills/forge/forge.md +40 -40
- package/adapters/copilot/skills/forge/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/copilot/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +20 -10
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/copilot/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/copilot/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/copilot/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +7 -7
- package/adapters/copilot/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-init/forge-init.md +62 -12
- package/adapters/copilot/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +32 -33
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +8 -8
- package/adapters/copilot/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +189 -36
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-researcher.mdc +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +17 -6
- package/adapters/cursor/references/forge-config-schema.json +7 -7
- package/adapters/cursor/references/portable-root.md +20 -16
- package/adapters/cursor/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/references/process-overview.md +10 -10
- package/adapters/cursor/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/references/select-outcome.md +138 -0
- package/adapters/cursor/references/shared-conventions.md +189 -36
- package/adapters/cursor/references/skill-frontmatter.schema.json +3 -1
- package/adapters/cursor/references/stack-resolution.md +1 -1
- package/adapters/cursor/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/cursor/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/cursor/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/references/verify-state.md +98 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +23 -2
- package/adapters/cursor/scripts/forge-root.sh +104 -21
- package/adapters/cursor/scripts/forge-session.py +620 -6969
- package/adapters/cursor/scripts/forge_session/__init__.py +11 -0
- package/adapters/cursor/scripts/forge_session/_common.py +1566 -0
- package/adapters/cursor/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/cursor/scripts/forge_session/cli.py +1067 -0
- package/adapters/cursor/scripts/forge_session/decisions.py +355 -0
- package/adapters/cursor/scripts/forge_session/discover.py +472 -0
- package/adapters/cursor/scripts/forge_session/doctor.py +2144 -0
- package/adapters/cursor/scripts/forge_session/exit.py +1081 -0
- package/adapters/cursor/scripts/forge_session/outcomes.py +574 -0
- package/adapters/cursor/scripts/forge_session/routes.py +1162 -0
- package/adapters/cursor/scripts/forge_session/state.py +1479 -0
- package/adapters/cursor/scripts/forge_session/topology.py +443 -0
- package/adapters/cursor/skills/forge/forge.mdc +40 -40
- package/adapters/cursor/skills/forge/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +15 -15
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +15 -15
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +15 -15
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +10 -10
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +19 -11
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +48 -53
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/cursor/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +20 -10
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +27 -20
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +23 -15
- package/adapters/cursor/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +27 -30
- package/adapters/cursor/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +84 -7
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +7 -7
- package/adapters/cursor/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-init/forge-init.mdc +62 -12
- package/adapters/cursor/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +32 -33
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +8 -8
- package/adapters/cursor/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +189 -36
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-researcher.md +1 -1
- package/adapters/gemini/agents/forge-verifier.md +17 -6
- package/adapters/gemini/gemini-extension.json +13 -13
- package/adapters/gemini/references/forge-config-schema.json +7 -7
- package/adapters/gemini/references/portable-root.md +20 -16
- package/adapters/gemini/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/references/process-overview.md +10 -10
- package/adapters/gemini/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/references/select-outcome.md +138 -0
- package/adapters/gemini/references/shared-conventions.md +189 -36
- package/adapters/gemini/references/skill-frontmatter.schema.json +3 -1
- package/adapters/gemini/references/stack-resolution.md +1 -1
- package/adapters/gemini/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/gemini/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/gemini/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/references/verify-state.md +98 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +23 -2
- package/adapters/gemini/scripts/forge-root.sh +104 -21
- package/adapters/gemini/scripts/forge-session.py +620 -6969
- package/adapters/gemini/scripts/forge_session/__init__.py +11 -0
- package/adapters/gemini/scripts/forge_session/_common.py +1566 -0
- package/adapters/gemini/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/gemini/scripts/forge_session/cli.py +1067 -0
- package/adapters/gemini/scripts/forge_session/decisions.py +355 -0
- package/adapters/gemini/scripts/forge_session/discover.py +472 -0
- package/adapters/gemini/scripts/forge_session/doctor.py +2144 -0
- package/adapters/gemini/scripts/forge_session/exit.py +1081 -0
- package/adapters/gemini/scripts/forge_session/outcomes.py +574 -0
- package/adapters/gemini/scripts/forge_session/routes.py +1162 -0
- package/adapters/gemini/scripts/forge_session/state.py +1479 -0
- package/adapters/gemini/scripts/forge_session/topology.py +443 -0
- package/adapters/gemini/skills/forge/forge.md +40 -40
- package/adapters/gemini/skills/forge/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/gemini/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +20 -10
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/gemini/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/gemini/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/gemini/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +7 -7
- package/adapters/gemini/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-init/forge-init.md +62 -12
- package/adapters/gemini/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +32 -33
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +8 -8
- package/adapters/gemini/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +189 -36
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +16 -5
- package/adapters/pi/extensions/forge-invocation-args/README.md +106 -0
- package/adapters/pi/extensions/forge-invocation-args/index.ts +31 -0
- package/adapters/pi/extensions/forge-invocation-args/wiring.ts +172 -0
- package/adapters/pi/extensions/forge-loop-supervisor/events.ts +90 -0
- package/adapters/pi/extensions/forge-loop-supervisor/index.ts +114 -0
- package/adapters/pi/extensions/forge-loop-supervisor/registry.ts +137 -0
- package/adapters/pi/extensions/forge-loop-supervisor/supervisor.ts +185 -0
- package/adapters/pi/extensions/forge-loop-supervisor/tailer.ts +137 -0
- package/adapters/pi/extensions/forge-loop-supervisor/types.ts +87 -0
- package/adapters/pi/extensions/forge-loop-supervisor/wiring.ts +423 -0
- package/adapters/pi/package.json +3 -1
- package/adapters/pi/references/forge-config-schema.json +5 -5
- package/adapters/pi/references/portable-root.md +20 -16
- package/adapters/pi/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/references/select-outcome.md +138 -0
- package/adapters/pi/references/shared-conventions.md +176 -23
- package/adapters/pi/references/skill-frontmatter.schema.json +3 -1
- package/adapters/pi/references/stack-resolution.md +1 -1
- package/adapters/pi/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/pi/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/pi/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/references/verify-state.md +98 -0
- package/adapters/pi/scripts/forge-bootstrap.py +23 -2
- package/adapters/pi/scripts/forge-root.sh +104 -21
- package/adapters/pi/scripts/forge-session.py +620 -6969
- package/adapters/pi/scripts/forge_session/__init__.py +11 -0
- package/adapters/pi/scripts/forge_session/_common.py +1566 -0
- package/adapters/pi/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/pi/scripts/forge_session/cli.py +1067 -0
- package/adapters/pi/scripts/forge_session/decisions.py +355 -0
- package/adapters/pi/scripts/forge_session/discover.py +472 -0
- package/adapters/pi/scripts/forge_session/doctor.py +2144 -0
- package/adapters/pi/scripts/forge_session/exit.py +1081 -0
- package/adapters/pi/scripts/forge_session/outcomes.py +574 -0
- package/adapters/pi/scripts/forge_session/routes.py +1162 -0
- package/adapters/pi/scripts/forge_session/state.py +1479 -0
- package/adapters/pi/scripts/forge_session/topology.py +443 -0
- package/adapters/pi/skills/forge/SKILL.md +13 -9
- package/adapters/pi/skills/forge/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-0-epic/SKILL.md +13 -9
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-1-prd/SKILL.md +13 -9
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-2-tech/SKILL.md +12 -8
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-3-specs/SKILL.md +11 -7
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +22 -10
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-5-loop/SKILL.md +47 -45
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/pi/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +22 -9
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-6-docs/SKILL.md +27 -16
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-bootstrap/SKILL.md +24 -12
- package/adapters/pi/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +21 -20
- package/adapters/pi/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-guide/SKILL.md +83 -2
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/pi/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-init/SKILL.md +63 -9
- package/adapters/pi/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-verify/SKILL.md +26 -23
- package/adapters/pi/skills/forge-verify/references/findings-template.md +7 -7
- package/adapters/pi/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +176 -23
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/dist/manifest.d.ts +1 -1
- package/dist/rauf.d.ts +3 -3
- package/dist/rauf.js +2 -2
- package/dist/source.d.ts +5 -2
- package/dist/source.js +5 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-vacuous-self-reading-tests
|
|
3
|
+
description: Tests that read their own source file are near-always vacuous unless they assert absence or scope the read; verify by a PROPERTY-PRESERVING mutation and check WHICH line goes red
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A drift-guard test that does `source = read(Path(__file__).resolve())` and then asserts a
|
|
9
|
+
**positive** substring is almost always vacuous: the searched literal sits on the assert
|
|
10
|
+
line itself, so the whole-file read satisfies it unconditionally.
|
|
11
|
+
|
|
12
|
+
**Why:** the trap catches even the *fix* for a prior vacuity finding, which often
|
|
13
|
+
reproduces the identical defect while its own inline comment claims "this reads for a
|
|
14
|
+
DIFFERENT string than the one it writes". The fix pass validates it with a mutation that
|
|
15
|
+
changes a second property at the same time — replacing a derived roster with a *shrunken*
|
|
16
|
+
hardcoded list goes red, but at a pre-existing floor assertion (`len(...) >= MIN`), not at
|
|
17
|
+
the assertion under test. Seeing "red" is taken as proof; a roster-**preserving** hardcode
|
|
18
|
+
leaves the test fully green.
|
|
19
|
+
|
|
20
|
+
**How to apply:**
|
|
21
|
+
|
|
22
|
+
- Grep every changed test for `read(Path(__file__)` / `inspect.getsource`. For each,
|
|
23
|
+
locate the searched literal's occurrences in the file. Two occurrences (guarded site +
|
|
24
|
+
assert line) = vacuous.
|
|
25
|
+
- Never accept "the mutation went red". Demand the **line number** of the failing
|
|
26
|
+
assertion, and design the mutation to change exactly one property.
|
|
27
|
+
- Acceptable forms: assert **absence** (write the banned tokens without the syntax that
|
|
28
|
+
makes them live), or scope the read away from the guarding test's own body
|
|
29
|
+
(`inspect.getsource(<the guarded function>)`). The best form for "this expression is
|
|
30
|
+
still derived" is an `ast` parse, which the assertion's own text cannot satisfy.
|
|
31
|
+
|
|
32
|
+
See [[pattern-postfix-reverify]] and [[pattern-mechanical-rewrite-damage]].
|
|
@@ -28,10 +28,11 @@ You have READ-ONLY access. You cannot and should not modify any files. Your outp
|
|
|
28
28
|
## How You Work
|
|
29
29
|
|
|
30
30
|
1. Read the pipeline state file to understand what stage the feature is at
|
|
31
|
-
2.
|
|
32
|
-
3.
|
|
33
|
-
4.
|
|
34
|
-
5.
|
|
31
|
+
2. Read the shipped verifier-patterns index — `references/verifier-patterns/MEMORY.md` — and open the patterns your dispatched mode makes relevant. These are the versioned, reviewed heuristics that ship with the pipeline (see "Using Your Memory" for how they relate to your per-project memory).
|
|
32
|
+
3. Load all relevant artifacts for the current verification mode
|
|
33
|
+
4. Read **only your dispatched mode's checklist** — `references/verification-checklists/{mode}.md` (the parent's dispatch prompt names your `{mode}`) — and execute every check in it. Do **not** read the other five mode files or `references/findings-template.md`; those are for other modes and for the parent orchestrator respectively.
|
|
34
|
+
5. Return structured findings as your response in the Output Format specified below
|
|
35
|
+
6. Generate a fix plan suitable for a fresh agent to execute
|
|
35
36
|
|
|
36
37
|
## Scoped / Parallel Operation
|
|
37
38
|
|
|
@@ -47,7 +48,17 @@ For large spec suites (>8 documents), process verification in phases: load share
|
|
|
47
48
|
|
|
48
49
|
## Using Your Memory
|
|
49
50
|
|
|
50
|
-
You
|
|
51
|
+
You draw on two distinct layers, and they must not be confused:
|
|
52
|
+
|
|
53
|
+
- **Shipped verifier patterns** (`references/verifier-patterns/`) — versioned, reviewed
|
|
54
|
+
heuristics that ship with the pipeline to every project. Read the index
|
|
55
|
+
(`references/verifier-patterns/MEMORY.md`) on start. **Treat these as read-only** — they
|
|
56
|
+
are canon, not your scratch memory; a genuinely new, general heuristic worth shipping is
|
|
57
|
+
a change proposed in review, not something you write here at run time.
|
|
58
|
+
- **Per-project memory** (`memory: project`, below) — your own accumulating notes about
|
|
59
|
+
*this* project's specific blind spots, conventions, and confirmed false positives.
|
|
60
|
+
|
|
61
|
+
You have persistent per-project memory in your `MEMORY.md` file. Use it to track:
|
|
51
62
|
|
|
52
63
|
- **Recurring patterns**: If you keep finding the same type of gap across features, note it. Over time you'll learn this project's blind spots.
|
|
53
64
|
- **Project conventions**: As you review more specs, capture conventions that should be consistent (naming patterns, error handling approaches, test strategies).
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# forge-invocation-args (Pi compatibility extension)
|
|
2
|
+
|
|
3
|
+
First-party feature-forge extension that deterministically preserves the arguments
|
|
4
|
+
supplied to `/skill:forge-*` commands on the Pi host. Fixes
|
|
5
|
+
[issue #303](https://github.com/garygentry/feature-forge/issues/303).
|
|
6
|
+
|
|
7
|
+
## The problem it works around
|
|
8
|
+
|
|
9
|
+
Pi expands `/skill:<name> <args>` by appending the raw argument string after the
|
|
10
|
+
skill body. Pi's documentation says arguments arrive as `User: <args>`, but the
|
|
11
|
+
implementation appends them with only a bare `\n\n` separator and **no semantic
|
|
12
|
+
boundary**:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
</skill>
|
|
16
|
+
|
|
17
|
+
rendered-model-v2
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
So `/skill:forge-1-prd rendered-model-v2` reaches the model with the feature name
|
|
21
|
+
as unlabeled trailing text. A model can read it as metadata or unrelated prose and
|
|
22
|
+
wrongly trigger feature-forge's canonical "no feature name → STOP and ask" rule
|
|
23
|
+
(`references/shared-conventions.md` § Feature Name Requirement). Because the feature
|
|
24
|
+
name keys **directory resolution**, **branch naming**, and every
|
|
25
|
+
**`.pipeline-state.json`** write, losing it silently is high-impact — not cosmetic.
|
|
26
|
+
|
|
27
|
+
This is an upstream Pi implementation/documentation mismatch:
|
|
28
|
+
|
|
29
|
+
- Prior to Pi commit `7868b25a2` (*"make skill invocation messages collapsible"*),
|
|
30
|
+
expansion used `` `${skillMessage}\n\n---\n\nUser: ${args}` ``.
|
|
31
|
+
- That commit changed it to `` `${skillBlock}\n\n${args}` `` — dropping the `User:`
|
|
32
|
+
boundary.
|
|
33
|
+
- The behavior began in Pi **v0.50.0** and is still present in
|
|
34
|
+
`@earendil-works/pi-coding-agent` **0.84.4** (the version this adapter builds
|
|
35
|
+
against) and **0.85.1** (latest tested).
|
|
36
|
+
|
|
37
|
+
Restoring `User:` upstream would fix today's formatting, but feature-forge should
|
|
38
|
+
not depend on model inference of an undocumented prompt layout. This extension is
|
|
39
|
+
host-compatibility hardening that remains useful even after an upstream fix.
|
|
40
|
+
|
|
41
|
+
## How it works
|
|
42
|
+
|
|
43
|
+
Pi's `input` event fires **before** skill/template expansion (and after
|
|
44
|
+
extension-command dispatch; `/skill:` is not an extension command, so it reaches
|
|
45
|
+
us). The extension registers one `input` handler that, for a `/skill:forge*`
|
|
46
|
+
invocation, rewrites the input to inject a versioned envelope, then lets Pi's
|
|
47
|
+
built-in expansion append it as the skill's arguments:
|
|
48
|
+
|
|
49
|
+
```xml
|
|
50
|
+
<feature-forge-invocation version="1">
|
|
51
|
+
<skill>forge-1-prd</skill>
|
|
52
|
+
<arguments>rendered-model-v2</arguments>
|
|
53
|
+
</feature-forge-invocation>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The forge skill bodies read the feature name from `<arguments>`. An empty element
|
|
57
|
+
means no argument was supplied — for a skill that requires a feature name that means
|
|
58
|
+
STOP and ask; the `forge` navigator (optional argument) proceeds as usual. That
|
|
59
|
+
companion rule lives host-neutrally in `references/shared-conventions.md`.
|
|
60
|
+
|
|
61
|
+
### Design decisions
|
|
62
|
+
|
|
63
|
+
- **Inject-into-args, not own-expansion.** The handler returns
|
|
64
|
+
`{ action: "transform", text: "/skill:<name> <envelope>" }` and lets Pi expand
|
|
65
|
+
the skill. Verified against Pi's `_expandSkillCommand`
|
|
66
|
+
(`dist/core/agent-session.js`): the skill name is the text up to the first space,
|
|
67
|
+
and args are the **entire remainder** (newlines preserved), end-trimmed — so a
|
|
68
|
+
multiline envelope survives re-parse. This avoids replicating Pi's private
|
|
69
|
+
skill-block wrapper string, which can drift across versions.
|
|
70
|
+
- **XML entity-escaping** of `&`, `<`, `>` in `<arguments>`. Total, lossless, and
|
|
71
|
+
collision-proof: a literal `</arguments>` in the raw args becomes
|
|
72
|
+
`</arguments>` and cannot close the element. Flags, quotes, and multiline
|
|
73
|
+
text pass through unchanged.
|
|
74
|
+
- **Always emit the envelope** for a matched command (empty `<arguments>` for zero
|
|
75
|
+
args) so the contract is uniform and deterministic.
|
|
76
|
+
- **Skip `source: "extension"`.** Messages injected via `sendUserMessage` are
|
|
77
|
+
dispatched with `expandPromptTemplates: false` and never expand — there is no
|
|
78
|
+
boundary bug to fix, and rewriting them could corrupt a programmatic message.
|
|
79
|
+
`"interactive"` and `"rpc"` (including `-p` / `--mode json`) do expand and are
|
|
80
|
+
normalized.
|
|
81
|
+
- **Fail loudly, never silently.** A thrown input handler makes the Pi runner fall
|
|
82
|
+
back to the *original untransformed* text — silently reintroducing the bug. On any
|
|
83
|
+
internal error the handler emits `ctx.ui.notify(..., "error")` and passes the
|
|
84
|
+
input through unchanged instead of throwing.
|
|
85
|
+
- **Idempotent.** Input handlers chain; an already-enveloped invocation is left
|
|
86
|
+
untouched (never double-wrapped).
|
|
87
|
+
|
|
88
|
+
## Supported Pi API / version assumptions
|
|
89
|
+
|
|
90
|
+
- Requires the documented `input` event with `{ action: "transform" }`
|
|
91
|
+
(`pi.on("input", …)`), present in the pinned `@earendil-works/pi-coding-agent`
|
|
92
|
+
`^0.81.1` and confirmed through 0.85.1.
|
|
93
|
+
- Depends only on Pi's **documented** contract that a skill command's arguments are
|
|
94
|
+
the remainder of the input after the command name — not on the specific
|
|
95
|
+
(buggy/unstable) way Pi separates them from the skill body. If a future Pi stops
|
|
96
|
+
treating the remainder as args, switch to owning expansion (replicating the
|
|
97
|
+
skill-block wrapper); until then, inject-into-args is the smaller-surface choice.
|
|
98
|
+
|
|
99
|
+
## Tests
|
|
100
|
+
|
|
101
|
+
`../../test/forge-invocation-args.test.mjs` (run by `npm run verify` in
|
|
102
|
+
`adapter-src/pi`) loads the extension through jiti — the same loader Pi uses —
|
|
103
|
+
asserts it registers exactly one `input` handler, and drives that handler across
|
|
104
|
+
the documented input-before-skill-expansion lifecycle (zero/one/multiple args,
|
|
105
|
+
flags, multiline, XML-special characters, non-forge passthrough, `source`
|
|
106
|
+
routing, and idempotency).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-invocation-args/index.ts
|
|
2
|
+
// Regenerate with: python3 scripts/build-adapters.py
|
|
3
|
+
/**
|
|
4
|
+
* forge-invocation-args — a first-party Pi compatibility extension that gives
|
|
5
|
+
* `/skill:forge-*` invocation arguments an explicit, versioned semantic boundary
|
|
6
|
+
* before Pi's skill expansion drops it (issue #303). See wiring.ts for the full
|
|
7
|
+
* rationale and mechanics.
|
|
8
|
+
*
|
|
9
|
+
* The pi-facing glue is thin: all logic lives in the injectable {@link
|
|
10
|
+
* createExtension} factory (wiring.ts), unit-tested with a fake pi. This file
|
|
11
|
+
* adapts the real ExtensionAPI to the structural PiLike the wiring consumes — each
|
|
12
|
+
* member is accessed by name off the concrete `pi`, so a method renamed or removed
|
|
13
|
+
* in a future pi is a COMPILE error here rather than a silent runtime failure.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
17
|
+
|
|
18
|
+
import { createExtension, type InputResult, type PiLike } from "./wiring.js";
|
|
19
|
+
|
|
20
|
+
export default function (pi: ExtensionAPI) {
|
|
21
|
+
const piLike: PiLike = {
|
|
22
|
+
on: (event, handler) =>
|
|
23
|
+
(
|
|
24
|
+
pi.on as unknown as (
|
|
25
|
+
e: string,
|
|
26
|
+
h: (ev: unknown, ctx: unknown) => InputResult | Promise<InputResult>,
|
|
27
|
+
) => void
|
|
28
|
+
)(event, handler as (ev: unknown, ctx: unknown) => InputResult | Promise<InputResult>),
|
|
29
|
+
};
|
|
30
|
+
createExtension(piLike);
|
|
31
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-invocation-args/wiring.ts
|
|
2
|
+
// Regenerate with: python3 scripts/build-adapters.py
|
|
3
|
+
/**
|
|
4
|
+
* Pi wiring for forge-invocation-args — the injectable, unit-testable core of the
|
|
5
|
+
* extension. All logic lives here behind a structural {@link PiLike} so the whole
|
|
6
|
+
* thing is driven by a fake pi in test (mirroring how forge-loop-supervisor is
|
|
7
|
+
* tested headlessly). index.ts supplies the real ExtensionAPI.
|
|
8
|
+
*
|
|
9
|
+
* WHY THIS EXISTS (issue #303): Pi expands `/skill:<name> <args>` by appending the
|
|
10
|
+
* raw args after the `</skill>` block with only a bare `\n\n` separator — no
|
|
11
|
+
* semantic boundary. Pi's docs say args arrive as `User: <args>`, but the
|
|
12
|
+
* implementation has bare-appended since Pi v0.50.0 (commit 7868b25a2), true
|
|
13
|
+
* through the installed 0.84.4 and tested 0.85.1. With no boundary, a model can
|
|
14
|
+
* read a forge feature-name argument as trailing prose and wrongly trip
|
|
15
|
+
* feature-forge's "no feature name → STOP and ask" rule. The feature name keys
|
|
16
|
+
* directory resolution, branch naming, and every pipeline-state write, so losing
|
|
17
|
+
* it silently is high-impact.
|
|
18
|
+
*
|
|
19
|
+
* THE FIX: hook Pi's `input` event, which fires BEFORE skill/template expansion
|
|
20
|
+
* (and after extension-command dispatch — `/skill:` is not an extension command,
|
|
21
|
+
* so it reaches us). For a `/skill:forge*` invocation we rewrite the input to
|
|
22
|
+
* `/skill:<name> <envelope>`, wrapping the raw argument string in an explicit,
|
|
23
|
+
* versioned envelope. Pi then expands the skill and appends the envelope as args
|
|
24
|
+
* — verified against Pi's `_expandSkillCommand`: skill name is the text up to the
|
|
25
|
+
* first space, args are the ENTIRE remainder (newlines preserved) end-trimmed, so
|
|
26
|
+
* a multiline entity-escaped envelope survives re-parse. We keep Pi's built-in
|
|
27
|
+
* expansion rather than replicating its private skill-block wrapper (which would
|
|
28
|
+
* drift across versions).
|
|
29
|
+
*
|
|
30
|
+
* pi surface used: `pi.on("input", handler)` returning an `InputEventResult`
|
|
31
|
+
* (`continue` | `transform`), and `ctx.ui.notify` for the fail-loud path.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/** The envelope element name and its schema version. Consumers (the forge skill
|
|
35
|
+
* bodies, via references/shared-conventions.md) read the feature name from
|
|
36
|
+
* <arguments> and treat an empty element as "no feature name supplied". */
|
|
37
|
+
export const ENVELOPE_TAG = "feature-forge-invocation";
|
|
38
|
+
export const ENVELOPE_VERSION = "1";
|
|
39
|
+
|
|
40
|
+
/** Pi's skill-command prefix. Pi expands `/skill:<name> <args>` only when the
|
|
41
|
+
* text starts with this literal at index 0 (verified in agent-session.js
|
|
42
|
+
* `_expandSkillCommand`), and package skills register un-namespaced — the
|
|
43
|
+
* command is `/skill:forge-1-prd`, never `/skill:<pkg>:forge-1-prd`. */
|
|
44
|
+
const SKILL_PREFIX = "/skill:";
|
|
45
|
+
|
|
46
|
+
/** A feature-forge skill NAME (not the whole command): `forge` or `forge-<...>`.
|
|
47
|
+
* Applied to the name Pi itself would parse out (text up to the first space), so
|
|
48
|
+
* our match set is exactly Pi's expansion set — no more, no less. Anchored end
|
|
49
|
+
* (`$`) so `forgery` is not matched. */
|
|
50
|
+
const FORGE_NAME_RE = /^forge(?:-[a-z0-9-]+)?$/;
|
|
51
|
+
|
|
52
|
+
/** Result subset this extension ever returns (a strict subset of Pi's
|
|
53
|
+
* InputEventResult — we never return `handled`, which would skip the agent). */
|
|
54
|
+
export type InputResult = { action: "continue" } | { action: "transform"; text: string };
|
|
55
|
+
|
|
56
|
+
interface InputEventLike {
|
|
57
|
+
text: string;
|
|
58
|
+
source?: string;
|
|
59
|
+
streamingBehavior?: string;
|
|
60
|
+
}
|
|
61
|
+
interface UiLike {
|
|
62
|
+
notify?(message: string, level?: "info" | "warning" | "error"): void;
|
|
63
|
+
}
|
|
64
|
+
interface CtxLike {
|
|
65
|
+
ui?: UiLike;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Minimal structural shape of the pi API this wiring needs. Kept loose so the
|
|
69
|
+
* fake pi in tests satisfies it without importing pi; index.ts adapts the real
|
|
70
|
+
* ExtensionAPI to it (a renamed/removed `on` becomes a compile error there). */
|
|
71
|
+
export interface PiLike {
|
|
72
|
+
on(
|
|
73
|
+
event: string,
|
|
74
|
+
handler: (event: InputEventLike, ctx: CtxLike) => InputResult | Promise<InputResult>,
|
|
75
|
+
): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Entity-escape the three XML metacharacters. Total and lossless: every input is
|
|
79
|
+
* representable, and a literal `</arguments>` in the raw args becomes
|
|
80
|
+
* `</arguments>`, which cannot close the real element (no injection). `&`
|
|
81
|
+
* must be replaced first so already-escaped output is not double-escaped. Flags,
|
|
82
|
+
* quotes, and newlines pass through untouched. */
|
|
83
|
+
export function escapeXml(value: string): string {
|
|
84
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Build the versioned invocation envelope for a matched forge skill. `skillName`
|
|
88
|
+
* is a kebab token (no escaping needed); `rawArgs` is entity-escaped. Zero args
|
|
89
|
+
* yields an empty <arguments> element — the deterministic "no feature name"
|
|
90
|
+
* signal. */
|
|
91
|
+
export function buildEnvelope(skillName: string, rawArgs: string): string {
|
|
92
|
+
return (
|
|
93
|
+
`<${ENVELOPE_TAG} version="${ENVELOPE_VERSION}">\n` +
|
|
94
|
+
` <skill>${skillName}</skill>\n` +
|
|
95
|
+
` <arguments>${escapeXml(rawArgs)}</arguments>\n` +
|
|
96
|
+
`</${ENVELOPE_TAG}>`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** True only for a complete envelope this extension emits (open tag WITH the
|
|
101
|
+
* version attribute AND the matching close tag) — not merely any argument that
|
|
102
|
+
* happens to begin with the tag name. Keeps the idempotency guard from dropping
|
|
103
|
+
* the boundary on a legitimate arg like `<feature-forge-invocation> is a tag`. */
|
|
104
|
+
function isAlreadyEnveloped(rawArgs: string): boolean {
|
|
105
|
+
return (
|
|
106
|
+
rawArgs.startsWith(`<${ENVELOPE_TAG} version="`) && rawArgs.trimEnd().endsWith(`</${ENVELOPE_TAG}>`)
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Pure normalization: given raw input text, return the transform (for a
|
|
112
|
+
* feature-forge skill command) or `continue` (for everything else). Exported for
|
|
113
|
+
* direct unit testing. The command is parsed EXACTLY as Pi's `_expandSkillCommand`
|
|
114
|
+
* does — the text must start with `/skill:` at index 0, the name is the text up to
|
|
115
|
+
* the first space (or the whole remainder if none), and args are the rest, trimmed
|
|
116
|
+
* — so our match set equals Pi's expansion set and the rewritten text re-expands
|
|
117
|
+
* identically. A name that is not a forge skill (or a `/skill:`-less prompt) is
|
|
118
|
+
* left untouched.
|
|
119
|
+
*/
|
|
120
|
+
export function normalizeInput(text: string): InputResult {
|
|
121
|
+
if (!text.startsWith(SKILL_PREFIX)) return { action: "continue" };
|
|
122
|
+
|
|
123
|
+
const spaceIndex = text.indexOf(" ");
|
|
124
|
+
const skillName =
|
|
125
|
+
spaceIndex === -1 ? text.slice(SKILL_PREFIX.length) : text.slice(SKILL_PREFIX.length, spaceIndex);
|
|
126
|
+
if (!FORGE_NAME_RE.test(skillName)) return { action: "continue" };
|
|
127
|
+
|
|
128
|
+
const rawArgs = spaceIndex === -1 ? "" : text.slice(spaceIndex + 1).trim();
|
|
129
|
+
|
|
130
|
+
// Idempotency: input handlers chain (each sees the prior's output), and a
|
|
131
|
+
// resend could re-enter here. Never re-wrap an invocation we already enveloped.
|
|
132
|
+
if (isAlreadyEnveloped(rawArgs)) return { action: "continue" };
|
|
133
|
+
|
|
134
|
+
const envelope = buildEnvelope(skillName, rawArgs);
|
|
135
|
+
return { action: "transform", text: `/skill:${skillName} ${envelope}` };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Register the single `input` handler on `pi`. Returns nothing; all behavior is
|
|
140
|
+
* in the handler and the pure helpers above.
|
|
141
|
+
*/
|
|
142
|
+
export function createExtension(pi: PiLike): void {
|
|
143
|
+
pi.on("input", (event, ctx) => {
|
|
144
|
+
// Only normalize user-typed ("interactive") and API ("rpc") input.
|
|
145
|
+
// Extension-injected messages ("extension", via sendUserMessage) are
|
|
146
|
+
// dispatched with expandPromptTemplates:false and never expand, so there is
|
|
147
|
+
// no boundary bug to fix — and rewriting a programmatic message could corrupt
|
|
148
|
+
// it. This mirrors Pi's own input-transform example.
|
|
149
|
+
if (event?.source === "extension") return { action: "continue" };
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
return normalizeInput(event.text);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
// Fail LOUDLY, never silently. A thrown input handler makes the Pi runner
|
|
155
|
+
// log the error and continue with the ORIGINAL untransformed text — which
|
|
156
|
+
// would silently reintroduce the dropped-argument bug this extension exists
|
|
157
|
+
// to prevent. So we surface it via notify and pass the input through
|
|
158
|
+
// unchanged rather than throwing. (Entity-escaping makes this path
|
|
159
|
+
// effectively unreachable; it is defense in depth.)
|
|
160
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
161
|
+
try {
|
|
162
|
+
ctx?.ui?.notify?.(
|
|
163
|
+
`forge-invocation-args: could not normalize a /skill:forge invocation (${message}); passing it through unchanged.`,
|
|
164
|
+
"error",
|
|
165
|
+
);
|
|
166
|
+
} catch {
|
|
167
|
+
/* headless / no notify surface */
|
|
168
|
+
}
|
|
169
|
+
return { action: "continue" };
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-loop-supervisor/events.ts
|
|
2
|
+
// Regenerate with: python3 scripts/build-adapters.py
|
|
3
|
+
/**
|
|
4
|
+
* Event classification + display formatting — pure functions over one rauf event.
|
|
5
|
+
*
|
|
6
|
+
* The classification mirrors the coverage-complete filter the generic
|
|
7
|
+
* forge-5-loop contract arms on Claude (`Monitor` on events.ndjson): every
|
|
8
|
+
* terminal and exception state is surfaced (silence is never success), while
|
|
9
|
+
* routine milestones stay quiet. See rauf's event union in
|
|
10
|
+
* `packages/core/src/schemas.ts` for the authoritative field list.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { EventClass, RaufEvent } from "./types.js";
|
|
14
|
+
|
|
15
|
+
/** Events that mean "the run is over" — the supervisor wakes the session so the
|
|
16
|
+
* loop stage runs its post-run close-out (Steps 4–7), then stops watching. */
|
|
17
|
+
const TERMINAL = new Set(["loop_completed", "loop_error", "loop_cancelled"]);
|
|
18
|
+
|
|
19
|
+
/** Events a human must see immediately. `loop_paused` carries `reason` and only
|
|
20
|
+
* the needs-human pause is surfaced here (the runner sets the item aside and
|
|
21
|
+
* keeps going — it is not a full stop). Everything else in this set is an
|
|
22
|
+
* unconditional exception. */
|
|
23
|
+
const EXCEPTION = new Set([
|
|
24
|
+
"needs_human",
|
|
25
|
+
"item_blocked",
|
|
26
|
+
"llm_stuck_warning",
|
|
27
|
+
"review_failed",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
/** The single routine milestone that earns a quiet progress line. */
|
|
31
|
+
const PROGRESS = new Set(["item_completed"]);
|
|
32
|
+
|
|
33
|
+
/** Classify one event. Unknown/interior/firehose types (token updates, tool
|
|
34
|
+
* activity, iteration boundaries, review start, usage-limit chatter, …) are
|
|
35
|
+
* `ignore` — the supervisor never surfaces them. */
|
|
36
|
+
export function classifyEvent(evt: RaufEvent): EventClass {
|
|
37
|
+
const type = evt?.type;
|
|
38
|
+
if (typeof type !== "string") return "ignore";
|
|
39
|
+
if (TERMINAL.has(type)) return "terminal";
|
|
40
|
+
if (EXCEPTION.has(type)) return "exception";
|
|
41
|
+
// `loop_paused` is an exception ONLY when it is the needs-human pause.
|
|
42
|
+
if (type === "loop_paused" && evt.reason === "needs_human") return "exception";
|
|
43
|
+
if (PROGRESS.has(type)) return "progress";
|
|
44
|
+
return "ignore";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** A concise, deterministic one-line report for a routine `item_completed`.
|
|
48
|
+
* `done`/`total` are threaded in when known so the line reads `[3/10] …`. */
|
|
49
|
+
export function formatProgress(
|
|
50
|
+
evt: RaufEvent,
|
|
51
|
+
done?: number,
|
|
52
|
+
total?: number,
|
|
53
|
+
): string {
|
|
54
|
+
const count =
|
|
55
|
+
typeof done === "number" && typeof total === "number" ? `[${done}/${total}] ` : "";
|
|
56
|
+
const title = typeof evt.title === "string" && evt.title ? evt.title : evt.itemId ?? "item";
|
|
57
|
+
return `${count}forge loop: completed ${title}`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** A human-facing line for an exception or terminal event, used both for the
|
|
61
|
+
* toast and for the wake message that triggers the session's next turn. */
|
|
62
|
+
export function formatSignal(evt: RaufEvent): string {
|
|
63
|
+
switch (evt.type) {
|
|
64
|
+
case "needs_human":
|
|
65
|
+
return `forge loop: item ${evt.itemId ?? "?"} needs a human — ${evt.reason ?? "no reason given"}`;
|
|
66
|
+
case "loop_paused":
|
|
67
|
+
return `forge loop: paused for human input on ${evt.itemId ?? "an item"}`;
|
|
68
|
+
case "item_blocked":
|
|
69
|
+
return `forge loop: item ${evt.itemId ?? "?"} blocked — ${evt.reason ?? "no reason given"}`;
|
|
70
|
+
case "llm_stuck_warning":
|
|
71
|
+
return `forge loop: item ${evt.itemId ?? "?"} looks stuck (no output for ${Math.round((evt.silentMs ?? 0) / 1000)}s)`;
|
|
72
|
+
case "review_failed":
|
|
73
|
+
return `forge loop: review failed — ${evt.reason ?? "no reason given"}`;
|
|
74
|
+
case "loop_error":
|
|
75
|
+
return `forge loop: the run errored — ${evt.reason ?? "see the runner log"}`;
|
|
76
|
+
case "loop_cancelled":
|
|
77
|
+
return "forge loop: the run was cancelled";
|
|
78
|
+
case "loop_completed": {
|
|
79
|
+
const done = evt.completedCount ?? 0;
|
|
80
|
+
const blocked = evt.blockedCount ?? 0;
|
|
81
|
+
const needsHuman = evt.needsHumanCount ?? 0;
|
|
82
|
+
const parts = [`${done} done`];
|
|
83
|
+
if (blocked) parts.push(`${blocked} blocked`);
|
|
84
|
+
if (needsHuman) parts.push(`${needsHuman} need a human`);
|
|
85
|
+
return `forge loop: run complete — ${parts.join(", ")}. Read the authoritative counts (status --json) and run the post-run close-out.`;
|
|
86
|
+
}
|
|
87
|
+
default:
|
|
88
|
+
return `forge loop: ${evt.type}`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-loop-supervisor/index.ts
|
|
2
|
+
// Regenerate with: python3 scripts/build-adapters.py
|
|
3
|
+
/**
|
|
4
|
+
* forge-loop-supervisor — a first-party Pi extension that lets forge-5-loop run
|
|
5
|
+
* the rauf autonomous coding loop WITHOUT blocking the Pi session, and supervises
|
|
6
|
+
* its native event stream.
|
|
7
|
+
*
|
|
8
|
+
* Pi has no built-in background bash, persistent monitor, or push-notification
|
|
9
|
+
* surface, so the generic Claude-first forge-5-loop contract (background the
|
|
10
|
+
* process, arm a `Monitor` on events.ndjson, `PushNotification` on exceptions)
|
|
11
|
+
* cannot be followed literally on Pi. This extension provides the real mechanism:
|
|
12
|
+
* `forge_loop_launch` starts the runner detached (it runs in rauf's server and
|
|
13
|
+
* outlives the session), then a rotation-aware NDJSON watcher turns each
|
|
14
|
+
* `item_completed` into a quiet progress line and wakes the session — via
|
|
15
|
+
* `pi.sendMessage(..., { triggerTurn: true })` — only on needs-human / blocked /
|
|
16
|
+
* stuck / review-failed / error / completion. `forge_loop_status` and
|
|
17
|
+
* `forge_loop_stop` round out the launch/attach/status/stop surface. Task
|
|
18
|
+
* identity is persisted (session entry + a file mirror beside the runner state)
|
|
19
|
+
* so a restarted session reattaches without duplicate reporting, and shutdown
|
|
20
|
+
* tears down watchers only — never the runner.
|
|
21
|
+
*
|
|
22
|
+
* The pi-facing glue is thin: all logic lives in the injectable {@link
|
|
23
|
+
* createExtension} factory (see wiring.ts), so the extension is unit-tested with
|
|
24
|
+
* a fake pi and fake deps. This file supplies the production dependencies.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
28
|
+
import { spawn } from "node:child_process";
|
|
29
|
+
import { watch as fsWatch } from "node:fs";
|
|
30
|
+
import { basename, dirname } from "node:path";
|
|
31
|
+
|
|
32
|
+
import { createExtension, type Deps, type PiLike, type WatchHandle } from "./wiring.js";
|
|
33
|
+
|
|
34
|
+
/** How often the backstop poll fires (ms). fs.watch can miss events or drop on
|
|
35
|
+
* some platforms; a low-frequency interval guarantees the tail keeps up without
|
|
36
|
+
* busy-waiting. */
|
|
37
|
+
const BACKSTOP_MS = 2000;
|
|
38
|
+
/** Debounce window (ms) coalescing a burst of fs.watch events into one poll. */
|
|
39
|
+
const DEBOUNCE_MS = 120;
|
|
40
|
+
|
|
41
|
+
const productionDeps: Deps = {
|
|
42
|
+
spawnDetached(bin, args, cwd, onError) {
|
|
43
|
+
// detached + unref + ignored stdio: the child is fully decoupled from the
|
|
44
|
+
// Pi process and survives session shutdown. rauf hands the loop to its
|
|
45
|
+
// server and this launcher exits quickly; a non-self-detaching runner still
|
|
46
|
+
// stays off the session.
|
|
47
|
+
const child = spawn(bin, args, { cwd, detached: true, stdio: "ignore" });
|
|
48
|
+
// ENOENT (bad bin) and other spawn failures arrive here asynchronously —
|
|
49
|
+
// report them so a launch that never happened does not look successful.
|
|
50
|
+
child.on("error", (err) => onError?.(err instanceof Error ? err.message : String(err)));
|
|
51
|
+
child.unref();
|
|
52
|
+
},
|
|
53
|
+
watch(filePath, onChange): WatchHandle {
|
|
54
|
+
const dir = dirname(filePath);
|
|
55
|
+
const base = basename(filePath);
|
|
56
|
+
let debounce: NodeJS.Timeout | null = null;
|
|
57
|
+
const fire = () => {
|
|
58
|
+
if (debounce) return;
|
|
59
|
+
debounce = setTimeout(() => {
|
|
60
|
+
debounce = null;
|
|
61
|
+
onChange();
|
|
62
|
+
}, DEBOUNCE_MS);
|
|
63
|
+
};
|
|
64
|
+
let fsw: ReturnType<typeof fsWatch> | null = null;
|
|
65
|
+
try {
|
|
66
|
+
// Watch the DIRECTORY (not the file) so rotation-by-rename — rauf moves
|
|
67
|
+
// events.ndjson into archive/ and recreates it each run — keeps firing.
|
|
68
|
+
fsw = fsWatch(dir, (_evt, name) => {
|
|
69
|
+
if (!name || name === base) fire();
|
|
70
|
+
});
|
|
71
|
+
fsw.on?.("error", () => {
|
|
72
|
+
/* directory vanished; the backstop interval keeps polling */
|
|
73
|
+
});
|
|
74
|
+
} catch {
|
|
75
|
+
fsw = null;
|
|
76
|
+
}
|
|
77
|
+
const interval = setInterval(onChange, BACKSTOP_MS);
|
|
78
|
+
return {
|
|
79
|
+
close() {
|
|
80
|
+
try {
|
|
81
|
+
fsw?.close();
|
|
82
|
+
} catch {
|
|
83
|
+
/* ignore */
|
|
84
|
+
}
|
|
85
|
+
if (debounce) clearTimeout(debounce);
|
|
86
|
+
clearInterval(interval);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
},
|
|
90
|
+
now: () => new Date().toISOString(),
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export default function (pi: ExtensionAPI) {
|
|
94
|
+
// Adapt the real ExtensionAPI to the structural PiLike the wiring consumes.
|
|
95
|
+
// Each member is accessed by name off the concrete `pi`, so a method renamed
|
|
96
|
+
// or removed in a future pi is a COMPILE error here (not a silent runtime
|
|
97
|
+
// failure hidden behind a blanket cast) — while PiLike stays loose enough for
|
|
98
|
+
// the fake pi in tests. Argument casts bridge PiLike's minimal shapes to pi's
|
|
99
|
+
// stricter generic signatures; the pi-API contract this was built against
|
|
100
|
+
// pins the exact shapes.
|
|
101
|
+
const piLike: PiLike = {
|
|
102
|
+
registerTool: (def) => (pi.registerTool as (d: unknown) => void)(def),
|
|
103
|
+
on: (event, handler) =>
|
|
104
|
+
(pi.on as unknown as (e: string, h: (ev: unknown, ctx: unknown) => void | Promise<void>) => void)(event, handler),
|
|
105
|
+
sendMessage: (message, options) =>
|
|
106
|
+
pi.sendMessage(message as Parameters<typeof pi.sendMessage>[0], options),
|
|
107
|
+
appendEntry: (customType, data) => pi.appendEntry(customType, data),
|
|
108
|
+
exec:
|
|
109
|
+
typeof pi.exec === "function"
|
|
110
|
+
? (command, args, opts) => pi.exec(command, args, opts)
|
|
111
|
+
: undefined,
|
|
112
|
+
};
|
|
113
|
+
createExtension(piLike, productionDeps);
|
|
114
|
+
}
|