@opengsd/gsd-path 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -13
- package/CHANGELOG.md +68 -0
- package/DOCS.md +75 -6
- package/FULL.md +12 -15
- package/HOOKS.md +18 -9
- package/QUICK.md +8 -6
- package/README.md +218 -14
- package/RUNTIME.md +16 -5
- package/UPDATE.md +30 -11
- package/WORKFLOW.md +35 -16
- package/package.json +23 -1
- package/platforms/claude/dispatch.md +4 -4
- package/platforms/copilot/dispatch.md +4 -4
- package/platforms/cursor/dispatch.md +5 -10
- package/platforms/grok/dispatch.md +4 -6
- package/platforms/kimi/dispatch.md +4 -4
- package/platforms/kiro/dispatch.md +4 -6
- package/platforms/opencode/dispatch.md +4 -4
- package/platforms/qwen/dispatch.md +4 -4
- package/platforms/shared-agents/dispatch.md +12 -19
- package/scripts/_common.py +5 -0
- package/scripts/archive_milestone.py +30 -124
- package/scripts/bootstrap_repository.py +33 -4
- package/scripts/build_recovery.py +292 -0
- package/scripts/build_state.py +2 -0
- package/scripts/check_docs_audit.py +7 -3
- package/scripts/check_handoffs.py +7 -1
- package/scripts/check_task_briefs.py +3 -0
- package/scripts/detect_project.py +22 -3
- package/scripts/discussion_records.py +3 -0
- package/scripts/discussion_validate.py +8 -3
- package/scripts/dispatch_driver.py +233 -22
- package/scripts/git_guard.py +14 -5
- package/scripts/guard_hook.py +11 -1
- package/scripts/install.mjs +54 -1448
- package/scripts/install.py +155 -188
- package/scripts/integration.py +54 -28
- package/scripts/isolation.py +24 -6
- package/scripts/jev_review.py +138 -0
- package/scripts/lean_verification.py +3 -1
- package/scripts/loop_run.py +2 -0
- package/scripts/model_policy.py +279 -0
- package/scripts/path_config.py +248 -0
- package/scripts/pipeline_diagnose.py +15 -3
- package/scripts/pipeline_git.py +3 -0
- package/scripts/pipeline_state.py +117 -186
- package/scripts/pipeline_undo.py +14 -7
- package/scripts/promote_lookahead.py +33 -162
- package/scripts/review_panel.py +11 -0
- package/scripts/roadmap.py +326 -0
- package/scripts/runtime_store.py +278 -0
- package/scripts/skill-resources.json +182 -4
- package/scripts/state_checkpoint.py +114 -72
- package/scripts/state_promote.py +47 -44
- package/scripts/status_runtime.py +92 -6
- package/scripts/task_context.py +73 -0
- package/scripts/token_budget.py +40 -1
- package/scripts/workflow_run.py +128 -8
- package/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path/BUILD.md +54 -575
- package/skills/gsd-path/DECIDE.md +4 -6
- package/skills/gsd-path/DEFINE.md +23 -21
- package/skills/gsd-path/DOCS-AUDIT.md +2 -0
- package/skills/gsd-path/INSPECT.md +32 -8
- package/skills/gsd-path/PLAN.md +29 -19
- package/skills/gsd-path/RESEARCH.md +5 -6
- package/skills/gsd-path/ROADMAP.md +24 -58
- package/skills/gsd-path/SHIP.md +29 -17
- package/skills/gsd-path/SKILL.md +46 -22
- package/skills/gsd-path/references/build-abandon.md +33 -0
- package/skills/gsd-path/references/build-native.md +502 -0
- package/skills/gsd-path/references/build-recovery.md +78 -0
- package/skills/gsd-path/references/coder.md +8 -3
- package/skills/gsd-path/references/config.md +57 -0
- package/skills/gsd-path/references/dispatch.md +12 -19
- package/skills/gsd-path/references/docs-auditor.md +14 -0
- package/skills/gsd-path/references/jev-review.md +82 -0
- package/skills/gsd-path/references/model-policy.md +139 -0
- package/skills/gsd-path/references/reviewer-final.md +21 -0
- package/skills/gsd-path/references/reviewer-panel.md +17 -0
- package/skills/gsd-path/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path/references/reviewer-wave.md +89 -0
- package/skills/gsd-path/references/reviewer.md +12 -148
- package/skills/gsd-path/references/runtime-selection.md +25 -0
- package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/_common.py +5 -0
- package/skills/gsd-path/scripts/archive_milestone.py +30 -124
- package/skills/gsd-path/scripts/bootstrap_repository.py +33 -4
- package/skills/gsd-path/scripts/build_recovery.py +292 -0
- package/skills/gsd-path/scripts/build_state.py +2 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +7 -3
- package/skills/gsd-path/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path/scripts/detect_project.py +22 -3
- package/skills/gsd-path/scripts/discussion_records.py +3 -0
- package/skills/gsd-path/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path/scripts/dispatch_driver.py +233 -22
- package/skills/gsd-path/scripts/git_guard.py +768 -0
- package/skills/gsd-path/scripts/integration.py +54 -28
- package/skills/gsd-path/scripts/isolation.py +24 -6
- package/skills/gsd-path/scripts/jev_review.py +138 -0
- package/skills/gsd-path/scripts/lean_verification.py +3 -1
- package/skills/gsd-path/scripts/loop_run.py +2 -0
- package/skills/gsd-path/scripts/model_policy.py +279 -0
- package/skills/gsd-path/scripts/path_config.py +248 -0
- package/skills/gsd-path/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path/scripts/promote_lookahead.py +33 -162
- package/skills/gsd-path/scripts/review_panel.py +11 -0
- package/skills/gsd-path/scripts/roadmap.py +326 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path/scripts/state_promote.py +47 -44
- package/skills/gsd-path/scripts/status_runtime.py +208 -0
- package/skills/gsd-path/scripts/task_context.py +73 -0
- package/skills/gsd-path/scripts/token_budget.py +40 -1
- package/skills/gsd-path/scripts/workflow_run.py +128 -8
- package/skills/gsd-path/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path/templates/skeptic.md +1 -1
- package/skills/gsd-path/templates/task.md +2 -0
- package/skills/gsd-path/templates/wave-panel.md +1 -1
- package/skills/gsd-path/templates/wave-review.md +1 -1
- package/skills/gsd-path-build/SKILL.md +54 -575
- package/skills/gsd-path-build/references/build-abandon.md +33 -0
- package/skills/gsd-path-build/references/build-native.md +502 -0
- package/skills/gsd-path-build/references/build-recovery.md +78 -0
- package/skills/gsd-path-build/references/coder.md +8 -3
- package/skills/gsd-path-build/references/dispatch.md +12 -19
- package/skills/gsd-path-build/references/jev-review.md +82 -0
- package/skills/gsd-path-build/references/model-policy.md +139 -0
- package/skills/gsd-path-build/references/reviewer-final.md +21 -0
- package/skills/gsd-path-build/references/reviewer-panel.md +17 -0
- package/skills/gsd-path-build/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path-build/references/reviewer-wave.md +89 -0
- package/skills/gsd-path-build/references/reviewer.md +12 -148
- package/skills/gsd-path-build/references/runtime-selection.md +25 -0
- package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/_common.py +5 -0
- package/skills/gsd-path-build/scripts/archive_milestone.py +30 -124
- package/skills/gsd-path-build/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-build/scripts/build_state.py +2 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-build/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-build/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-build/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-build/scripts/dispatch_driver.py +233 -22
- package/skills/gsd-path-build/scripts/integration.py +54 -28
- package/skills/gsd-path-build/scripts/isolation.py +24 -6
- package/skills/gsd-path-build/scripts/jev_review.py +138 -0
- package/skills/gsd-path-build/scripts/loop_run.py +2 -0
- package/skills/gsd-path-build/scripts/model_policy.py +279 -0
- package/skills/gsd-path-build/scripts/path_config.py +248 -0
- package/skills/gsd-path-build/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-build/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-build/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-build/scripts/review_panel.py +11 -0
- package/skills/gsd-path-build/scripts/roadmap.py +326 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-build/scripts/state_promote.py +47 -44
- package/skills/gsd-path-build/scripts/task_context.py +73 -0
- package/skills/gsd-path-build/scripts/token_budget.py +40 -1
- package/skills/gsd-path-build/scripts/workflow_run.py +128 -8
- package/skills/gsd-path-build/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-build/templates/skeptic.md +1 -1
- package/skills/gsd-path-build/templates/task.md +2 -0
- package/skills/gsd-path-build/templates/wave-panel.md +1 -1
- package/skills/gsd-path-build/templates/wave-review.md +1 -1
- package/skills/gsd-path-decide/SKILL.md +4 -6
- package/skills/gsd-path-decide/references/dispatch.md +12 -19
- package/skills/gsd-path-decide/references/model-policy.md +139 -0
- package/skills/gsd-path-decide/references/runtime-selection.md +25 -0
- package/skills/gsd-path-decide/scripts/_common.py +5 -0
- package/skills/gsd-path-decide/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-decide/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-decide/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-decide/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-decide/scripts/integration.py +1459 -0
- package/skills/gsd-path-decide/scripts/isolation.py +24 -6
- package/skills/gsd-path-decide/scripts/loop_run.py +839 -0
- package/skills/gsd-path-decide/scripts/model_policy.py +279 -0
- package/skills/gsd-path-decide/scripts/path_config.py +248 -0
- package/skills/gsd-path-decide/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-decide/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-decide/scripts/review_panel.py +564 -0
- package/skills/gsd-path-decide/scripts/roadmap.py +326 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-decide/scripts/state_promote.py +47 -44
- package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-define/SKILL.md +23 -21
- package/skills/gsd-path-define/references/build-recovery.md +78 -0
- package/skills/gsd-path-define/references/runtime-selection.md +25 -0
- package/skills/gsd-path-define/scripts/_common.py +5 -0
- package/skills/gsd-path-define/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-define/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-define/scripts/detect_project.py +22 -3
- package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-define/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-define/scripts/integration.py +1459 -0
- package/skills/gsd-path-define/scripts/isolation.py +24 -6
- package/skills/gsd-path-define/scripts/loop_run.py +839 -0
- package/skills/gsd-path-define/scripts/model_policy.py +279 -0
- package/skills/gsd-path-define/scripts/path_config.py +248 -0
- package/skills/gsd-path-define/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-define/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-define/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-define/scripts/review_panel.py +564 -0
- package/skills/gsd-path-define/scripts/roadmap.py +326 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-define/scripts/state_promote.py +47 -44
- package/skills/gsd-path-define/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-discuss/SKILL.md +2 -0
- package/skills/gsd-path-discuss/references/runtime-selection.md +25 -0
- package/skills/gsd-path-discuss/scripts/_common.py +5 -0
- package/skills/gsd-path-discuss/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-discuss/scripts/loop_run.py +839 -0
- package/skills/gsd-path-discuss/scripts/model_policy.py +279 -0
- package/skills/gsd-path-discuss/scripts/path_config.py +248 -0
- package/skills/gsd-path-discuss/scripts/review_panel.py +564 -0
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-docs-audit/SKILL.md +2 -0
- package/skills/gsd-path-docs-audit/references/dispatch.md +12 -19
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +14 -0
- package/skills/gsd-path-docs-audit/references/model-policy.md +139 -0
- package/skills/gsd-path-docs-audit/references/runtime-selection.md +25 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +7 -3
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-docs-audit/scripts/integration.py +1459 -0
- package/skills/gsd-path-docs-audit/scripts/isolation.py +24 -6
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +839 -0
- package/skills/gsd-path-docs-audit/scripts/model_policy.py +279 -0
- package/skills/gsd-path-docs-audit/scripts/path_config.py +248 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +564 -0
- package/skills/gsd-path-docs-audit/scripts/roadmap.py +326 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +47 -44
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-forensics/SKILL.md +9 -5
- package/skills/gsd-path-forensics/references/runtime-selection.md +25 -0
- package/skills/gsd-path-forensics/scripts/_common.py +5 -0
- package/skills/gsd-path-forensics/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-forensics/scripts/loop_run.py +839 -0
- package/skills/gsd-path-forensics/scripts/model_policy.py +279 -0
- package/skills/gsd-path-forensics/scripts/path_config.py +248 -0
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +15 -3
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +14 -7
- package/skills/gsd-path-forensics/scripts/review_panel.py +564 -0
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-inspect/SKILL.md +32 -8
- package/skills/gsd-path-inspect/references/dispatch.md +12 -19
- package/skills/gsd-path-inspect/references/docs-auditor.md +14 -0
- package/skills/gsd-path-inspect/references/model-policy.md +139 -0
- package/skills/gsd-path-inspect/references/runtime-selection.md +25 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/_common.py +5 -0
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-inspect/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +7 -3
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-inspect/scripts/detect_project.py +22 -3
- package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-inspect/scripts/integration.py +1459 -0
- package/skills/gsd-path-inspect/scripts/isolation.py +24 -6
- package/skills/gsd-path-inspect/scripts/loop_run.py +839 -0
- package/skills/gsd-path-inspect/scripts/model_policy.py +279 -0
- package/skills/gsd-path-inspect/scripts/path_config.py +248 -0
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-inspect/scripts/review_panel.py +564 -0
- package/skills/gsd-path-inspect/scripts/roadmap.py +326 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-inspect/scripts/state_promote.py +47 -44
- package/skills/gsd-path-inspect/scripts/workflow_run.py +237 -0
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-loop/SKILL.md +2 -0
- package/skills/gsd-path-loop/references/runtime-selection.md +25 -0
- package/skills/gsd-path-loop/scripts/_common.py +5 -0
- package/skills/gsd-path-loop/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-loop/scripts/loop_run.py +2 -0
- package/skills/gsd-path-loop/scripts/model_policy.py +279 -0
- package/skills/gsd-path-loop/scripts/path_config.py +248 -0
- package/skills/gsd-path-loop/scripts/review_panel.py +564 -0
- package/skills/gsd-path-loop/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-migrate/SKILL.md +2 -0
- package/skills/gsd-path-migrate/references/runtime-selection.md +25 -0
- package/skills/gsd-path-migrate/scripts/_common.py +185 -0
- package/skills/gsd-path-migrate/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-migrate/scripts/loop_run.py +839 -0
- package/skills/gsd-path-migrate/scripts/model_policy.py +279 -0
- package/skills/gsd-path-migrate/scripts/path_config.py +248 -0
- package/skills/gsd-path-migrate/scripts/review_panel.py +564 -0
- package/skills/gsd-path-plan/SKILL.md +29 -19
- package/skills/gsd-path-plan/references/build-recovery.md +78 -0
- package/skills/gsd-path-plan/references/dispatch.md +12 -19
- package/skills/gsd-path-plan/references/model-policy.md +139 -0
- package/skills/gsd-path-plan/references/runtime-selection.md +25 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/_common.py +5 -0
- package/skills/gsd-path-plan/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-plan/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-plan/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-plan/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-plan/scripts/integration.py +1459 -0
- package/skills/gsd-path-plan/scripts/isolation.py +24 -6
- package/skills/gsd-path-plan/scripts/loop_run.py +839 -0
- package/skills/gsd-path-plan/scripts/model_policy.py +279 -0
- package/skills/gsd-path-plan/scripts/path_config.py +248 -0
- package/skills/gsd-path-plan/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-plan/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
- package/skills/gsd-path-plan/scripts/roadmap.py +326 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-plan/scripts/state_promote.py +47 -44
- package/skills/gsd-path-plan/scripts/workflow_run.py +128 -8
- package/skills/gsd-path-plan/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-plan/templates/task.md +2 -0
- package/skills/gsd-path-research/SKILL.md +5 -6
- package/skills/gsd-path-research/references/dispatch.md +12 -19
- package/skills/gsd-path-research/references/model-policy.md +139 -0
- package/skills/gsd-path-research/references/runtime-selection.md +25 -0
- package/skills/gsd-path-research/scripts/_common.py +5 -0
- package/skills/gsd-path-research/scripts/archive_milestone.py +2171 -0
- package/skills/gsd-path-research/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-research/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-research/scripts/discussion_validate.py +1326 -0
- package/skills/gsd-path-research/scripts/integration.py +1459 -0
- package/skills/gsd-path-research/scripts/isolation.py +24 -6
- package/skills/gsd-path-research/scripts/loop_run.py +839 -0
- package/skills/gsd-path-research/scripts/model_policy.py +279 -0
- package/skills/gsd-path-research/scripts/path_config.py +248 -0
- package/skills/gsd-path-research/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-research/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-research/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-research/scripts/review_panel.py +564 -0
- package/skills/gsd-path-research/scripts/roadmap.py +326 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-research/scripts/state_promote.py +47 -44
- package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-roadmap/SKILL.md +24 -58
- package/skills/gsd-path-roadmap/references/dispatch.md +12 -19
- package/skills/gsd-path-roadmap/references/model-policy.md +139 -0
- package/skills/gsd-path-roadmap/references/runtime-selection.md +25 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +5 -0
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +30 -124
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-roadmap/scripts/detect_project.py +22 -3
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-roadmap/scripts/integration.py +54 -28
- package/skills/gsd-path-roadmap/scripts/isolation.py +24 -6
- package/skills/gsd-path-roadmap/scripts/loop_run.py +839 -0
- package/skills/gsd-path-roadmap/scripts/model_policy.py +279 -0
- package/skills/gsd-path-roadmap/scripts/path_config.py +248 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +33 -162
- package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
- package/skills/gsd-path-roadmap/scripts/roadmap.py +326 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-roadmap/scripts/state_promote.py +47 -44
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-ship/SKILL.md +29 -17
- package/skills/gsd-path-ship/references/dispatch.md +12 -19
- package/skills/gsd-path-ship/references/jev-review.md +82 -0
- package/skills/gsd-path-ship/references/model-policy.md +139 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +21 -0
- package/skills/gsd-path-ship/references/reviewer-panel.md +17 -0
- package/skills/gsd-path-ship/references/reviewer-skeptic.md +20 -0
- package/skills/gsd-path-ship/references/reviewer-wave.md +89 -0
- package/skills/gsd-path-ship/references/reviewer.md +12 -148
- package/skills/gsd-path-ship/references/runtime-selection.md +25 -0
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/_common.py +5 -0
- package/skills/gsd-path-ship/scripts/archive_milestone.py +30 -124
- package/skills/gsd-path-ship/scripts/build_recovery.py +292 -0
- package/skills/gsd-path-ship/scripts/build_state.py +2 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +7 -1
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-ship/scripts/detect_project.py +1536 -0
- package/skills/gsd-path-ship/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-ship/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-ship/scripts/integration.py +54 -28
- package/skills/gsd-path-ship/scripts/isolation.py +24 -6
- package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
- package/skills/gsd-path-ship/scripts/lean_verification.py +3 -1
- package/skills/gsd-path-ship/scripts/loop_run.py +839 -0
- package/skills/gsd-path-ship/scripts/model_policy.py +279 -0
- package/skills/gsd-path-ship/scripts/path_config.py +248 -0
- package/skills/gsd-path-ship/scripts/pipeline_git.py +3 -0
- package/skills/gsd-path-ship/scripts/pipeline_state.py +117 -186
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +286 -0
- package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
- package/skills/gsd-path-ship/scripts/roadmap.py +326 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +114 -72
- package/skills/gsd-path-ship/scripts/state_promote.py +47 -44
- package/skills/gsd-path-ship/scripts/workflow_run.py +128 -8
- package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-ship/templates/wave-review.md +1 -1
- package/skills/gsd-path-undo/SKILL.md +2 -0
- package/skills/gsd-path-undo/references/runtime-selection.md +25 -0
- package/skills/gsd-path-undo/scripts/_common.py +5 -0
- package/skills/gsd-path-undo/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-undo/scripts/loop_run.py +839 -0
- package/skills/gsd-path-undo/scripts/model_policy.py +279 -0
- package/skills/gsd-path-undo/scripts/path_config.py +248 -0
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +14 -7
- package/skills/gsd-path-undo/scripts/review_panel.py +564 -0
- package/skills/gsd-path-undo/scripts/worktree_paths.py +94 -0
- package/skills/path/BUILD.md +54 -575
- package/skills/path/DECIDE.md +4 -6
- package/skills/path/DEFINE.md +23 -21
- package/skills/path/DOCS-AUDIT.md +2 -0
- package/skills/path/INSPECT.md +32 -8
- package/skills/path/PLAN.md +29 -19
- package/skills/path/RESEARCH.md +5 -6
- package/skills/path/ROADMAP.md +24 -58
- package/skills/path/SHIP.md +29 -17
- package/skills/path/SKILL.md +46 -22
- package/skills/path/references/build-abandon.md +33 -0
- package/skills/path/references/build-native.md +502 -0
- package/skills/path/references/build-recovery.md +78 -0
- package/skills/path/references/coder.md +8 -3
- package/skills/path/references/config.md +57 -0
- package/skills/path/references/dispatch.md +12 -19
- package/skills/path/references/docs-auditor.md +14 -0
- package/skills/path/references/jev-review.md +82 -0
- package/skills/path/references/model-policy.md +139 -0
- package/skills/path/references/reviewer-final.md +21 -0
- package/skills/path/references/reviewer-panel.md +17 -0
- package/skills/path/references/reviewer-skeptic.md +20 -0
- package/skills/path/references/reviewer-wave.md +89 -0
- package/skills/path/references/reviewer.md +12 -148
- package/skills/path/references/runtime-selection.md +25 -0
- package/skills/path/scripts/_common.py +5 -0
- package/skills/path/scripts/archive_milestone.py +30 -124
- package/skills/path/scripts/bootstrap_repository.py +33 -4
- package/skills/path/scripts/build_recovery.py +292 -0
- package/skills/path/scripts/build_state.py +2 -0
- package/skills/path/scripts/check_docs_audit.py +7 -3
- package/skills/path/scripts/check_handoffs.py +7 -1
- package/skills/path/scripts/check_task_briefs.py +3 -0
- package/skills/path/scripts/detect_project.py +22 -3
- package/skills/path/scripts/discussion_records.py +3 -0
- package/skills/path/scripts/discussion_validate.py +8 -3
- package/skills/path/scripts/dispatch_driver.py +233 -22
- package/skills/path/scripts/git_guard.py +768 -0
- package/skills/path/scripts/integration.py +54 -28
- package/skills/path/scripts/isolation.py +24 -6
- package/skills/path/scripts/jev_review.py +138 -0
- package/skills/path/scripts/lean_verification.py +3 -1
- package/skills/path/scripts/loop_run.py +2 -0
- package/skills/path/scripts/model_policy.py +279 -0
- package/skills/path/scripts/path_config.py +248 -0
- package/skills/path/scripts/pipeline_git.py +3 -0
- package/skills/path/scripts/pipeline_state.py +117 -186
- package/skills/path/scripts/promote_lookahead.py +33 -162
- package/skills/path/scripts/review_panel.py +11 -0
- package/skills/path/scripts/roadmap.py +326 -0
- package/skills/path/scripts/state_checkpoint.py +114 -72
- package/skills/path/scripts/state_promote.py +47 -44
- package/skills/path/scripts/status_runtime.py +208 -0
- package/skills/path/scripts/task_context.py +73 -0
- package/skills/path/scripts/token_budget.py +40 -1
- package/skills/path/scripts/workflow_run.py +128 -8
- package/skills/path/scripts/worktree_paths.py +94 -0
- package/skills/path/templates/skeptic.md +1 -1
- package/skills/path/templates/task.md +2 -0
- package/skills/path/templates/wave-panel.md +1 -1
- package/skills/path/templates/wave-review.md +1 -1
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
+
import sys
|
|
8
|
+
|
|
9
|
+
# Runtime helpers must not modify their immutable installation.
|
|
10
|
+
sys.dont_write_bytecode = True
|
|
11
|
+
|
|
7
12
|
import json
|
|
8
13
|
import re
|
|
9
14
|
import shutil
|
|
@@ -11,6 +16,31 @@ from pathlib import Path, PurePosixPath
|
|
|
11
16
|
from typing import Mapping, Optional
|
|
12
17
|
|
|
13
18
|
|
|
19
|
+
if __package__: # imported as scripts.state_promote
|
|
20
|
+
from . import pipeline_state, state_checkpoint
|
|
21
|
+
from .pipeline_state import (
|
|
22
|
+
NULL,
|
|
23
|
+
PROMOTION_RESIDUAL,
|
|
24
|
+
PROMOTION_SCHEMA,
|
|
25
|
+
PROMOTION_TRACKS,
|
|
26
|
+
SLUG_RE,
|
|
27
|
+
PipelineState,
|
|
28
|
+
PipelineStateError,
|
|
29
|
+
)
|
|
30
|
+
else: # standalone script or sibling import
|
|
31
|
+
import pipeline_state
|
|
32
|
+
import state_checkpoint
|
|
33
|
+
from pipeline_state import (
|
|
34
|
+
NULL,
|
|
35
|
+
PROMOTION_RESIDUAL,
|
|
36
|
+
PROMOTION_SCHEMA,
|
|
37
|
+
PROMOTION_TRACKS,
|
|
38
|
+
SLUG_RE,
|
|
39
|
+
PipelineState,
|
|
40
|
+
PipelineStateError,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
14
44
|
def _render_roadmap(
|
|
15
45
|
text: str,
|
|
16
46
|
previous_milestone: str,
|
|
@@ -243,9 +273,9 @@ def _completed_promotion(
|
|
|
243
273
|
if _head_with_exact_message(repo, subject, fields) != head:
|
|
244
274
|
raise PipelineStateError("completed promotion has the wrong commit message")
|
|
245
275
|
|
|
246
|
-
active_text =
|
|
247
|
-
next_text =
|
|
248
|
-
roadmap_text =
|
|
276
|
+
active_text = state_checkpoint._git_text_at(repo, base, ".project/STATE.md")
|
|
277
|
+
next_text = state_checkpoint._git_text_at(repo, base, ".project/next/STATE.md")
|
|
278
|
+
roadmap_text = state_checkpoint._git_text_at(repo, base, ".project/ROADMAP.md")
|
|
249
279
|
if active_text is None or next_text is None or roadmap_text is None:
|
|
250
280
|
raise PipelineStateError("promotion parent is missing required metadata")
|
|
251
281
|
active_state = pipeline_state._state_from_text(active_text, "promotion parent STATE.md")
|
|
@@ -265,7 +295,7 @@ def _completed_promotion(
|
|
|
265
295
|
)
|
|
266
296
|
|
|
267
297
|
_promotion_tree_mapping(repo, base, head)
|
|
268
|
-
drift =
|
|
298
|
+
drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
|
|
269
299
|
expected_roadmap = _render_roadmap(
|
|
270
300
|
roadmap_text,
|
|
271
301
|
active_state.milestone,
|
|
@@ -273,11 +303,11 @@ def _completed_promotion(
|
|
|
273
303
|
branch,
|
|
274
304
|
landing,
|
|
275
305
|
)
|
|
276
|
-
current_roadmap =
|
|
306
|
+
current_roadmap = state_checkpoint._git_text_at(repo, head, ".project/ROADMAP.md")
|
|
277
307
|
if current_roadmap != expected_roadmap:
|
|
278
308
|
raise PipelineStateError("completed promotion has invalid ROADMAP.md")
|
|
279
309
|
|
|
280
|
-
current_state =
|
|
310
|
+
current_state = state_checkpoint._git_text_at(repo, head, ".project/STATE.md")
|
|
281
311
|
if current_state is None:
|
|
282
312
|
raise PipelineStateError("completed promotion has no STATE.md")
|
|
283
313
|
event = re.escape(_promotion_event(drift, branch, landing, base))
|
|
@@ -438,10 +468,10 @@ def _prepare_promotion(
|
|
|
438
468
|
if source.exists() or source.is_symlink():
|
|
439
469
|
if destination.exists() or destination.is_symlink():
|
|
440
470
|
raise PipelineStateError(f"promotion destination already exists: {destination}")
|
|
441
|
-
tracks[name] =
|
|
471
|
+
tracks[name] = state_checkpoint._tree_digest(source)
|
|
442
472
|
if not tracks:
|
|
443
473
|
raise PipelineStateError("lookahead track has no promotable artifacts")
|
|
444
|
-
drift =
|
|
474
|
+
drift = state_checkpoint._classify_plan_drift(repo, next_state, base, landing)
|
|
445
475
|
roadmap_path = project / "ROADMAP.md"
|
|
446
476
|
roadmap_text = pipeline_state._read_real_file(roadmap_path, "ROADMAP.md")
|
|
447
477
|
target_state = _promotion_state(
|
|
@@ -464,10 +494,10 @@ def _prepare_promotion(
|
|
|
464
494
|
"landing": landing,
|
|
465
495
|
"base": base,
|
|
466
496
|
"tracks": tracks,
|
|
467
|
-
"residual_sha256":
|
|
468
|
-
"next_state_sha256":
|
|
469
|
-
"active_state_sha256":
|
|
470
|
-
"roadmap_sha256":
|
|
497
|
+
"residual_sha256": state_checkpoint._tree_digest(next_root, tuple(tracks)),
|
|
498
|
+
"next_state_sha256": state_checkpoint._sha256(next_text),
|
|
499
|
+
"active_state_sha256": state_checkpoint._sha256(active_text),
|
|
500
|
+
"roadmap_sha256": state_checkpoint._sha256(roadmap_text),
|
|
471
501
|
"target_state": target_state,
|
|
472
502
|
"target_roadmap": target_roadmap,
|
|
473
503
|
"drift": drift,
|
|
@@ -521,7 +551,7 @@ def _resume_track_moves(project: Path, journal: dict[str, object], path: Path) -
|
|
|
521
551
|
if not source_exists and not destination_exists:
|
|
522
552
|
raise PipelineStateError(f"promotion lost both source and destination: {name}")
|
|
523
553
|
candidate = source if source_exists else destination
|
|
524
|
-
if
|
|
554
|
+
if state_checkpoint._tree_digest(candidate) != expected_digest:
|
|
525
555
|
raise PipelineStateError(f"promotion track drifted: {name}")
|
|
526
556
|
if source_exists:
|
|
527
557
|
source.rename(destination)
|
|
@@ -542,7 +572,7 @@ def _resume_metadata(project: Path, journal: dict[str, object], path: Path) -> N
|
|
|
542
572
|
raise PipelineStateError("promotion journal has invalid metadata")
|
|
543
573
|
if current == desired:
|
|
544
574
|
continue
|
|
545
|
-
if
|
|
575
|
+
if state_checkpoint._sha256(current) != expected_original:
|
|
546
576
|
raise PipelineStateError(f"promotion metadata drifted: {target}")
|
|
547
577
|
pipeline_state._atomic_write(target, desired)
|
|
548
578
|
journal["stage"] = f"updated:{target.name}"
|
|
@@ -560,9 +590,9 @@ def _resume_next_removal(
|
|
|
560
590
|
if residual.exists() or residual.is_symlink():
|
|
561
591
|
raise PipelineStateError("promotion has both next track and residual staging")
|
|
562
592
|
next_text = pipeline_state._read_real_file(next_root / "STATE.md", "next/STATE.md")
|
|
563
|
-
if
|
|
593
|
+
if state_checkpoint._sha256(next_text) != journal.get("next_state_sha256"):
|
|
564
594
|
raise PipelineStateError("lookahead STATE drifted during promotion")
|
|
565
|
-
if
|
|
595
|
+
if state_checkpoint._tree_digest(next_root) != journal.get("residual_sha256"):
|
|
566
596
|
raise PipelineStateError("lookahead residual drifted during promotion")
|
|
567
597
|
next_root.rename(residual)
|
|
568
598
|
journal["stage"] = "next-staged"
|
|
@@ -574,7 +604,7 @@ def _resume_next_removal(
|
|
|
574
604
|
raise PipelineStateError("promotion lost next track and residual staging")
|
|
575
605
|
if residual.is_symlink() or not residual.is_dir():
|
|
576
606
|
raise PipelineStateError(f"promotion residual must be a real directory: {residual}")
|
|
577
|
-
if
|
|
607
|
+
if state_checkpoint._tree_digest(residual) != journal.get("residual_sha256"):
|
|
578
608
|
raise PipelineStateError("staged lookahead residual drifted during promotion")
|
|
579
609
|
|
|
580
610
|
|
|
@@ -714,30 +744,3 @@ def promote_next(
|
|
|
714
744
|
"commit": commit,
|
|
715
745
|
"drift": journal["drift"],
|
|
716
746
|
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
# pipeline_state imports this module, so the parent is resolved after the
|
|
720
|
-
# definitions above. Parent functions are looked up on the module at call time
|
|
721
|
-
# so patches applied to pipeline_state stay visible here.
|
|
722
|
-
if __package__: # imported as scripts.state_promote
|
|
723
|
-
from . import pipeline_state
|
|
724
|
-
from .pipeline_state import (
|
|
725
|
-
NULL,
|
|
726
|
-
PROMOTION_RESIDUAL,
|
|
727
|
-
PROMOTION_SCHEMA,
|
|
728
|
-
PROMOTION_TRACKS,
|
|
729
|
-
SLUG_RE,
|
|
730
|
-
PipelineState,
|
|
731
|
-
PipelineStateError,
|
|
732
|
-
)
|
|
733
|
-
else: # standalone script or sibling import
|
|
734
|
-
import pipeline_state
|
|
735
|
-
from pipeline_state import (
|
|
736
|
-
NULL,
|
|
737
|
-
PROMOTION_RESIDUAL,
|
|
738
|
-
PROMOTION_SCHEMA,
|
|
739
|
-
PROMOTION_TRACKS,
|
|
740
|
-
SLUG_RE,
|
|
741
|
-
PipelineState,
|
|
742
|
-
PipelineStateError,
|
|
743
|
-
)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# gsd-path project runtime
|
|
3
|
+
"""Placement shared by task isolation, verification, and integration."""
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
# Runtime helpers must not modify their immutable installation.
|
|
8
|
+
sys.dont_write_bytecode = True
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import tempfile
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
import _common
|
|
18
|
+
except ImportError:
|
|
19
|
+
from scripts import _common
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _git(primary: Path, *args: str) -> str:
|
|
23
|
+
result = _common.run_git(primary, *args)
|
|
24
|
+
if result.returncode:
|
|
25
|
+
raise ValueError(result.stderr.strip() or "cannot inspect worktree placement")
|
|
26
|
+
return result.stdout.rstrip("\n")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _identity(path: Path) -> str:
|
|
30
|
+
return hashlib.sha256(os.fsencode(path)).hexdigest()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _workspace(primary: Path, pin: bool) -> Path:
|
|
34
|
+
common = Path(_git(primary, "rev-parse", "--git-common-dir"))
|
|
35
|
+
common = (primary / common).resolve()
|
|
36
|
+
identity = _identity(primary)
|
|
37
|
+
receipt = common / "gsd-path" / "workspaces" / f"{identity}.json"
|
|
38
|
+
try:
|
|
39
|
+
data = json.loads(receipt.read_text(encoding="utf-8"))
|
|
40
|
+
except FileNotFoundError:
|
|
41
|
+
pass
|
|
42
|
+
else:
|
|
43
|
+
if (not isinstance(data, dict) or data.get("primary") != str(primary)
|
|
44
|
+
or not isinstance(data.get("root"), str)
|
|
45
|
+
or not Path(data["root"]).is_absolute()):
|
|
46
|
+
raise ValueError(f"invalid worktree placement receipt: {receipt}")
|
|
47
|
+
return Path(data["root"])
|
|
48
|
+
|
|
49
|
+
root = Path(os.environ.get("GSD_PATH_WORKTREE_ROOT") or Path.home() / ".gsd-path" / "projects").expanduser()
|
|
50
|
+
if not root.is_absolute():
|
|
51
|
+
raise ValueError("GSD_PATH_WORKTREE_ROOT must be absolute")
|
|
52
|
+
root = root.resolve()
|
|
53
|
+
parent = root
|
|
54
|
+
while not parent.exists():
|
|
55
|
+
parent = parent.parent
|
|
56
|
+
ancestor = _common.run_git(parent, "rev-parse", "--git-common-dir")
|
|
57
|
+
same_repository = (
|
|
58
|
+
ancestor.returncode == 0
|
|
59
|
+
and (parent / ancestor.stdout.strip()).resolve() == common
|
|
60
|
+
)
|
|
61
|
+
if root.is_relative_to(primary) or same_repository:
|
|
62
|
+
raise ValueError(f"managed worktree root must be outside this repository's worktrees: {root}")
|
|
63
|
+
workspace = root / _identity(common) / identity
|
|
64
|
+
if pin:
|
|
65
|
+
receipt.parent.mkdir(parents=True, exist_ok=True)
|
|
66
|
+
fd, temporary = tempfile.mkstemp(dir=receipt.parent)
|
|
67
|
+
try:
|
|
68
|
+
with os.fdopen(fd, "w", encoding="utf-8") as handle:
|
|
69
|
+
json.dump({"primary": str(primary), "root": str(workspace)}, handle)
|
|
70
|
+
try:
|
|
71
|
+
os.link(temporary, receipt)
|
|
72
|
+
except FileExistsError:
|
|
73
|
+
return _workspace(primary, False)
|
|
74
|
+
finally:
|
|
75
|
+
os.unlink(temporary)
|
|
76
|
+
return workspace
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
|
|
80
|
+
primary = primary.resolve()
|
|
81
|
+
if kind not in {"task", "verify", "integrate"} or not name or Path(name).name != name or name in {".", ".."}:
|
|
82
|
+
raise ValueError("invalid managed worktree kind or name")
|
|
83
|
+
legacy = (primary.parent / f".{primary.name}-gsd-path-integrate-{name}"
|
|
84
|
+
if kind == "integrate" else primary.parent / f"{primary.name}.gsd-path" / kind / name)
|
|
85
|
+
branch = f"refs/heads/gsd-path-{kind}/{name}"
|
|
86
|
+
records = _git(primary, "worktree", "list", "--porcelain", "-z").split("\0\0")
|
|
87
|
+
for record in records:
|
|
88
|
+
fields = record.split("\0")
|
|
89
|
+
if f"worktree {legacy}" in fields and f"branch {branch}" in fields:
|
|
90
|
+
return legacy
|
|
91
|
+
# Keep collision checks and missing-directory recovery at the old location.
|
|
92
|
+
if os.path.lexists(legacy):
|
|
93
|
+
return legacy
|
|
94
|
+
return _workspace(primary, pin) / kind / name
|
|
@@ -3,6 +3,8 @@ name: gsd-path-define
|
|
|
3
3
|
description: Define and approve project or milestone intent through an interview or milestone confirmation, writing .project/CHARTER.md or .project/intent/INTENT.md. Use only when the user explicitly invokes $gsd-path-define or an active $gsd-path router explicitly routes to this phase.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
Before executing project helpers, read [runtime selection](references/runtime-selection.md).
|
|
7
|
+
|
|
6
8
|
# GSD Path Define Phase
|
|
7
9
|
|
|
8
10
|
Turn a project idea or approved roadmap entry into an approved intent artifact.
|
|
@@ -36,16 +38,22 @@ ROADMAP.md exists), `roadmap/done`
|
|
|
36
38
|
lookahead track at `define/active|blocked` also requires both current-track
|
|
37
39
|
inspection artifacts and a Log entry proving `inspect/done` for the same
|
|
38
40
|
milestone after its latest activation; otherwise route to inspect.
|
|
41
|
+
The sole later-phase exception is a blocked build entered through the
|
|
42
|
+
[build recovery contract](references/build-recovery.md). Follow its preparation
|
|
43
|
+
and corrections procedure when the runtime returns mode `corrections`; keep
|
|
44
|
+
the existing milestone identity and approval gate. Otherwise
|
|
39
45
|
`define/done` or any later phase blocks rather than overwriting approved
|
|
40
46
|
intent and leaving downstream artifacts stale. When an active router supplies
|
|
41
47
|
the lookahead track root `.project/next/`, require its STATE.md to be a regular
|
|
42
48
|
non-symlink file and evaluate this section against that track's state and
|
|
43
49
|
paths; see Lookahead mode. If STATE.md is missing, run the bundled
|
|
44
50
|
`python3 <absolute-bundled-script> initialize --repo <absolute-root>
|
|
45
|
-
--template <absolute-state-template
|
|
51
|
+
--template <absolute-state-template> --require-git` helper (`scripts/detect_project.py`) and
|
|
46
52
|
follow its returned JSON `verdict` / `route`. This is the only no-state
|
|
47
53
|
boundary; do not run `classify` first or classify from a directory listing or
|
|
48
|
-
conversation.
|
|
54
|
+
conversation. Handle `route: setup-repository` before the write gate: preserve
|
|
55
|
+
the folder unchanged and return to `$gsd-path` for repository setup; no state
|
|
56
|
+
was written. If the command exits nonzero, returns `error`, or returns
|
|
49
57
|
`wrote_state: false`, report the error and block without routing or claiming
|
|
50
58
|
STATE.md was written.
|
|
51
59
|
- `owned` — continue under the existing-state rules above.
|
|
@@ -104,12 +112,13 @@ the charter instead of the single-milestone checklist:
|
|
|
104
112
|
4. **Constraints** — program-level stack, budget, deadline, integrations.
|
|
105
113
|
5. **Program success criteria** — observable when the last milestone ships.
|
|
106
114
|
6. **Review panel** — optional durable default (`off` | `detected` | named
|
|
107
|
-
families).
|
|
115
|
+
families). Use the configured future preference unless the user chooses
|
|
116
|
+
otherwise (see Output contract). This value persists on CHARTER.md; later
|
|
108
117
|
milestone INTENT files copy it and may override.
|
|
109
118
|
|
|
110
119
|
Read the local [charter template](templates/charter.md), write the approval
|
|
111
|
-
draft to `.project/CHARTER.md` including
|
|
112
|
-
|
|
120
|
+
draft to `.project/CHARTER.md` including the configured or explicitly chosen
|
|
121
|
+
`Review panel:` value, and run the same playback-approval
|
|
113
122
|
loop as the standard Process. On approval, retain the reviewed
|
|
114
123
|
`Review panel:` value on CHARTER.md, run `pipeline_state.py transition` with
|
|
115
124
|
expected `define/active`, milestone/branch/archive all at their exact current
|
|
@@ -138,7 +147,7 @@ State ownership. There is no re-interview of charter or roadmap scope:
|
|
|
138
147
|
Risks and Open questions from the entry (tagged `RESEARCH`/`NEEDS-USER`),
|
|
139
148
|
`Lane: milestone`, `Surfaces:` copied verbatim from the entry, and
|
|
140
149
|
`Review panel:` copied from CHARTER.md (default
|
|
141
|
-
|
|
150
|
+
the configured preference when CHARTER omits it). The confirmation may override the copied
|
|
142
151
|
panel value; do not invent `detected` or a named list. When brownfield,
|
|
143
152
|
fill `## Current state` from the map, record doc-vs-code rulings as in
|
|
144
153
|
Brownfield mode, and add protected existing behavior under Scope out.
|
|
@@ -265,27 +274,20 @@ question. The rules change for every primary mode:
|
|
|
265
274
|
## Output contract
|
|
266
275
|
|
|
267
276
|
At approval, retain the already reviewed `Lane:` value and its one-line reason.
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
277
|
+
Before presenting an approval draft without a CHARTER or explicit panel choice,
|
|
278
|
+
read `settings.review_panel.value` from the selected runtime's `path_config.py
|
|
279
|
+
show --repo <absolute-root>` (bundle for legacy projects; off for older selected
|
|
280
|
+
runtimes without config support). Include that preference in the draft.
|
|
281
|
+
Retain `Review panel:` as reviewed: the CHARTER copy, the explicit user choice,
|
|
282
|
+
or the configured future preference. Quick lane keeps the panel off.
|
|
271
283
|
|
|
272
284
|
After approval, finalize `.project/intent/INTENT.md` and run
|
|
273
285
|
`pipeline_state.py transition` with expected `define/active`, the exact
|
|
274
286
|
current milestone/branch/archive values, event `milestone intent approved`,
|
|
275
287
|
`--set-phase define --set-status done --set-milestone <milestone slug>`, and
|
|
276
288
|
`--project-dir .project/next` in lookahead. Require returned `define/done` and
|
|
277
|
-
the exact milestone.
|
|
278
|
-
|
|
279
|
-
`Lane: quick`, planning is next and research and decide are skipped. For
|
|
280
|
-
`Lane: milestone`, use the resolved roadmap entry matching the track STATE's
|
|
281
|
-
`milestone`: milestone-scoped research is next when that entry lists open
|
|
282
|
-
questions; otherwise planning is next and research and decide are skipped.
|
|
283
|
-
Confirm the approved outcome, link the final INTENT.md again, and name that
|
|
284
|
-
next phase before routing. When routed by an active `$gsd-path`, return control
|
|
285
|
-
to that router so its bundled next contract can auto-advance to the named
|
|
286
|
-
phase. When invoked directly, stop and tell the user to explicitly invoke
|
|
287
|
-
`$gsd-path`, which selects that next phase; do not invoke an explicit-only
|
|
288
|
-
sibling skill yourself.
|
|
289
|
+
the exact milestone. Confirm the approved outcome and link INTENT.md again.
|
|
290
|
+
Use the executable phase handoff in AGENTS.md for the next action.
|
|
289
291
|
|
|
290
292
|
## Rules
|
|
291
293
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Return a blocked build to its contract owner
|
|
2
|
+
|
|
3
|
+
Use this contract only for an active milestone at `build/blocked`: a documented
|
|
4
|
+
structural plan defect, or an explicit user ruling that changes approved intent.
|
|
5
|
+
It does not reopen ship, archived milestones, or lookahead. Build owns entry;
|
|
6
|
+
Define owns intent corrections; Plan owns the replacement task inventory and
|
|
7
|
+
approval. Routing remains a caller handoff under AGENTS.md.
|
|
8
|
+
|
|
9
|
+
## Build: checkpoint and enter
|
|
10
|
+
|
|
11
|
+
1. Record the finding or verbatim user ruling in STATE through its helper.
|
|
12
|
+
Stop dispatch. Use the normal recovery and retirement procedures until
|
|
13
|
+
every task is either unstarted `pending` with null dispatch metadata or
|
|
14
|
+
proven `done`. Preserve owned uncommitted work before any retirement.
|
|
15
|
+
Settle reviewers and their sidecars too. Dispatch records must have no pending
|
|
16
|
+
cleanup; records with reviewer `worktree` and `branch` ownership must also
|
|
17
|
+
record `cleanup_complete`. A `blocked` or `collected` outcome alone does not
|
|
18
|
+
prove retirement. Records that never owned a reviewer sidecar do not require
|
|
19
|
+
that retirement receipt. Use the existing dispatch retirement procedures;
|
|
20
|
+
recovery does not retire sidecars itself. Never infer that a timed-out child
|
|
21
|
+
stopped. Checkpoint the blocked state and artifacts using the Build
|
|
22
|
+
bookkeeping contract; the primary must be clean.
|
|
23
|
+
2. Run `pipeline_state.py transition` with the complete current state expected,
|
|
24
|
+
`--set-status active`, and the matching target and event:
|
|
25
|
+
|
|
26
|
+
| Cause | Target | Exact event |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| User changes a criterion, constraint, or veto | `--set-phase define` | `build intent corrections requested` |
|
|
29
|
+
| Task inventory, dependency, or wave repair | `--set-phase plan` | `build plan repair requested` |
|
|
30
|
+
|
|
31
|
+
The helper records the committed recovery base in STATE atomically. Do not
|
|
32
|
+
author or edit that record. Milestone, branch, integration settings, and
|
|
33
|
+
landed task contracts remain fixed throughout recovery.
|
|
34
|
+
3. Return to the router or name the selected explicit skill. The route names
|
|
35
|
+
`corrections` for Define and `build-repair` for Plan. Other blocked-build
|
|
36
|
+
failures continue through ordinary Build recovery.
|
|
37
|
+
|
|
38
|
+
## Define and Plan: prepare before editing
|
|
39
|
+
|
|
40
|
+
Run the bundled `pipeline_state.py prepare-build-recovery --repo <absolute-root>`
|
|
41
|
+
before changing any recovery artifact. This repeatable operation preserves the
|
|
42
|
+
old review directory under `plan/build-recovery-<base>/review` and starts a fresh
|
|
43
|
+
active review directory. STATE's recorded base owns an interrupted move; rerun
|
|
44
|
+
this command to finish it. The helper validates the preserved bytes against Git.
|
|
45
|
+
Do not remove, rewrite, or use the preserved reviews as current approval.
|
|
46
|
+
|
|
47
|
+
**Define corrections.** Read the existing intent and governing program artifacts.
|
|
48
|
+
Interview only the requested change; append the user's words under
|
|
49
|
+
`## Corrections`, revise the affected intent, and present the delta for approval.
|
|
50
|
+
Keep the milestone identity. Reclassify the lane using the normal lane rules.
|
|
51
|
+
After approval, use the normal `define/active → define/done` transition and route
|
|
52
|
+
from the approved lane. Standard intent goes through Research and Decide again;
|
|
53
|
+
quick and milestone intent use their existing evidence gates. A program charter
|
|
54
|
+
or roadmap conflict still requires its legal owner gate; this path cannot waive it.
|
|
55
|
+
|
|
56
|
+
**Plan build-repair.** Read the corrected intent, current synthesis, existing plan,
|
|
57
|
+
task files, and recovery base. Use the normal planner, lint, panel, and approval
|
|
58
|
+
gates. Repair the remaining task inventory as needed, including split, rename,
|
|
59
|
+
dependency, or wave changes. Keep IDs ordered and contiguous. Preserve every
|
|
60
|
+
landed task file byte-for-byte, including its recorded base and proof. Any new
|
|
61
|
+
work to satisfy a corrected criterion belongs in new pending tasks, not rewritten
|
|
62
|
+
landed contracts. A plan-only recovery must not change approved intent.
|
|
63
|
+
|
|
64
|
+
## Approve and return to Build
|
|
65
|
+
|
|
66
|
+
Use normal `pipeline_state.py approve --kind plan --expected-head <HEAD>`.
|
|
67
|
+
Neither `--patch` nor `--defer-checkpoint` is legal for recovery. The helper
|
|
68
|
+
checks landed-task preservation and restored intent ownership, restores review
|
|
69
|
+
evidence only for unchanged contracts, and creates the normal journaled plan
|
|
70
|
+
checkpoint. A failed approval leaves recovery open.
|
|
71
|
+
|
|
72
|
+
Return through `plan/done → build/active` with event `build started`. The dispatch
|
|
73
|
+
driver uses a separate record directory for this recovery base, while retaining
|
|
74
|
+
the milestone budget ledger. Resume only from the new approved task inventory.
|
|
75
|
+
Unchanged wave evidence remains usable; changed waves need review in the new
|
|
76
|
+
record directory. Retained task Verify receipts remain historical evidence for
|
|
77
|
+
their original task and base, never proof for a changed task. Final review still
|
|
78
|
+
requires current-HEAD evidence before shipment.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Project runtime selection
|
|
2
|
+
|
|
3
|
+
Before running a project runtime helper, check for
|
|
4
|
+
`<absolute-project>/.gsd-path/runtime.json`. When present, run the stable launcher:
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
python3 -B <absolute-project>/.gsd-path/status_runtime.py --repo <absolute-project> --runtime-path
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Use `python` only when it is the compatible Python 3.9+ interpreter. A failure
|
|
11
|
+
stops helper execution: follow the exact-version restore action in the error.
|
|
12
|
+
Do not install, upgrade, or fall back to the current plugin's runtime implicitly.
|
|
13
|
+
|
|
14
|
+
The returned directory is the verified Project runtime. Resolve helper names
|
|
15
|
+
present in its `manifest.json` from that directory, including status, state,
|
|
16
|
+
isolation, integration, archive, recovery, build-state, final-verification, and guard helpers.
|
|
17
|
+
The workflow runner resolves its subprocess helpers from this same directory;
|
|
18
|
+
helper imports stay within the selected runtime. This rule overrides
|
|
19
|
+
references to bundled copies of those helpers. Other skill helpers, templates,
|
|
20
|
+
and role briefs remain in the installed skill bundle. Pass `-B` to Python helper
|
|
21
|
+
invocations so execution does not create bytecode in the runtime store.
|
|
22
|
+
|
|
23
|
+
With no declaration, retain the legacy helper lookup. An existing
|
|
24
|
+
`.gsd-path/runtime/` requires the explicit `--runtime-migrate --project PATH`
|
|
25
|
+
operation before adopting external storage; review the resulting Git diff.
|