@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
|
@@ -26,10 +26,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
26
26
|
never create a colliding logical target.
|
|
27
27
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
28
28
|
in the prompt and require the child to read it before acting.
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
- Model selection: before every child launch or continuation, follow
|
|
30
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
31
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
32
|
+
capability failures, and reassignment. Do not ask Copilot to create another
|
|
33
33
|
worktree: GSD Path supplies the exact repository or linked-worktree root,
|
|
34
34
|
and the child must work only there. Host isolation: none.
|
|
35
35
|
- Give every child a self-contained prompt with absolute input, template, and
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Apply this contract whenever a GSD Path skill delegates work:
|
|
4
4
|
|
|
5
5
|
- Use Cursor's `Task` tool with the installed custom `gsd-path` subagent. Its
|
|
6
|
-
model
|
|
6
|
+
model inherits unless the model-policy helper selects an override; it has full tool access; the linked role brief supplies
|
|
7
7
|
the read-only boundary for auditors and reviewers.
|
|
8
8
|
- Supply the deterministic logical task name as the task description:
|
|
9
9
|
`inspect_codebase`, `inspect_docs`, `docs_audit`,
|
|
@@ -25,15 +25,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
25
25
|
brief. If the prior child is still running, wait; never collide targets.
|
|
26
26
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
27
27
|
in the prompt and require the child to read it before acting.
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
child: pass the exact slug returned by `scripts/review_panel.py resolve`
|
|
33
|
-
for that family. Never override the model on the canonical reviewer,
|
|
34
|
-
planner, or coder. Set the task working directory to the
|
|
35
|
-
exact repository or linked-worktree root supplied by GSD Path; do not ask
|
|
36
|
-
Cursor or the child to create another worktree. Host isolation: none.
|
|
28
|
+
- Model selection: before every child launch or continuation, follow
|
|
29
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
30
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
31
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
37
32
|
- Give every child a self-contained prompt with absolute input, template, and
|
|
38
33
|
output paths plus its bounded responsibility. A coder prompt also names its
|
|
39
34
|
isolated linked-worktree root; no child may infer the primary worktree.
|
|
@@ -26,12 +26,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
26
26
|
it; never create a colliding logical target.
|
|
27
27
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
28
28
|
in the prompt and require the subagent to read it before acting.
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
by GSD Path and use `isolation: none`; the pipeline already owns any
|
|
34
|
-
required linked worktree. Host isolation: none.
|
|
29
|
+
- Model selection: before every child launch or continuation, follow
|
|
30
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
31
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
32
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
35
33
|
- Give every subagent a self-contained prompt with absolute input, template,
|
|
36
34
|
and output paths plus its bounded responsibility. A coder prompt also names
|
|
37
35
|
its isolated linked-worktree root; no child may infer the primary worktree.
|
|
@@ -27,10 +27,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
27
27
|
brief, wait for it; never create a colliding logical target.
|
|
28
28
|
- Resolve the phase's linked role brief to an absolute path. Include that
|
|
29
29
|
path in the prompt and require the child to read it before acting.
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
- Model selection: before every child launch or continuation, follow
|
|
31
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
32
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
33
|
+
capability failures, and reassignment. Do not ask Kimi to create a worktree:
|
|
34
34
|
GSD Path supplies the exact repository or linked-worktree root in the
|
|
35
35
|
brief, and the child must work only there. Host isolation: none.
|
|
36
36
|
- Give every child a self-contained prompt with absolute input, template,
|
|
@@ -23,12 +23,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
23
23
|
self-contained brief. Disk artifacts remain the source of truth.
|
|
24
24
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
25
25
|
in the prompt and require the subagent to read it before acting.
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
exact repository or linked-worktree root supplied by GSD Path; do not ask
|
|
31
|
-
Kiro or the child to create another worktree. Host isolation: none.
|
|
26
|
+
- Model selection: before every child launch or continuation, follow
|
|
27
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
28
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
29
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
32
30
|
- Give every child a self-contained prompt with absolute input, template, and
|
|
33
31
|
output paths plus its bounded responsibility. A coder prompt also names its
|
|
34
32
|
isolated linked-worktree root; no child may infer the primary worktree.
|
|
@@ -28,10 +28,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
28
28
|
source of truth.
|
|
29
29
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
30
30
|
in the prompt and require the child to read it before acting.
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
- Model selection: before every child launch or continuation, follow
|
|
32
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
33
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
34
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
35
35
|
- Give every child a self-contained prompt with
|
|
36
36
|
absolute repository, input, template, and output paths plus its bounded
|
|
37
37
|
responsibility. A coder prompt also names its isolated linked-worktree root;
|
|
@@ -25,10 +25,10 @@ Apply this contract whenever a GSD Path skill delegates work:
|
|
|
25
25
|
Disk artifacts, not child chat history, remain the source of truth.
|
|
26
26
|
- Resolve the phase's linked role brief to an absolute path. Include that path
|
|
27
27
|
in the prompt and require the child to read it before acting.
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
- Model selection: before every child launch or continuation, follow
|
|
29
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
30
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
31
|
+
capability failures, and reassignment. Do not ask Qwen Code to create another
|
|
32
32
|
worktree: GSD Path supplies the exact repository or linked-worktree root,
|
|
33
33
|
and the child must work only there. Host isolation: none.
|
|
34
34
|
- Give every child a self-contained prompt with absolute input, template, and
|
|
@@ -7,10 +7,7 @@ use exactly one matching branch:
|
|
|
7
7
|
- A `spawn_agent` tool exposing `task_name`, `agent_type`, and `fork_turns` is
|
|
8
8
|
Codex. Use `fork_turns: "none"`; coders use the built-in `worker` type and
|
|
9
9
|
every other role uses `default`. Reuse a completed logical target with
|
|
10
|
-
`followup_task`.
|
|
11
|
-
`heavy` tier and `low` for the portable `light` tier; leave reasoning effort
|
|
12
|
-
unset for the session-default tier, and never pass `heavy` or `light` as a
|
|
13
|
-
literal Codex value.
|
|
10
|
+
`followup_task`.
|
|
14
11
|
- A `spawn_agent` tool without those Codex fields is Zed. Spawn one isolated,
|
|
15
12
|
full-capability child per brief. Zed children are not resumable, so retries
|
|
16
13
|
use a fresh child and a complete prompt.
|
|
@@ -26,7 +23,7 @@ use exactly one matching branch:
|
|
|
26
23
|
the complete new prompt for later work. Wait for a colliding active child and
|
|
27
24
|
collect results with `wait_commands_or_subagents`.
|
|
28
25
|
- A `Task` tool advertising the custom `gsd-path` subagent is Cursor. Use that
|
|
29
|
-
|
|
26
|
+
full-capability child. Resume it by returned agent ID when
|
|
30
27
|
available; otherwise retry with a fresh child and a complete prompt.
|
|
31
28
|
- A `Task` tool advertising the built-in `general` subagent is OpenCode. Use
|
|
32
29
|
that child; if an installed OpenCode v2 host exposes the renamed `subagent`
|
|
@@ -65,20 +62,10 @@ For every branch:
|
|
|
65
62
|
- Resolve the phase's linked role brief to an absolute path, include it in the
|
|
66
63
|
prompt, and require the child to read it before acting. The role brief
|
|
67
64
|
supplies the read-only boundary for auditors and reviewers.
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
host, use only an exact native equivalent advertised by that host; otherwise
|
|
73
|
-
do not override the model or reasoning effort. The only exception is a
|
|
74
|
-
review-panel child: when the host advertises model selection, pass the exact
|
|
75
|
-
slug returned by `scripts/review_panel.py resolve` for that family. Never
|
|
76
|
-
override the model on the canonical reviewer, planner, coder, or any other
|
|
77
|
-
role.
|
|
78
|
-
Host isolation: none. The child's working directory is the exact absolute
|
|
79
|
-
root GSD Path supplied; a host SHA checkout or extra worktree is a contract
|
|
80
|
-
failure. Never ask the host to create a worktree. Give the child the exact
|
|
81
|
-
repository or linked-worktree root supplied by GSD Path.
|
|
65
|
+
- Model selection: before every child launch or continuation, follow
|
|
66
|
+
[the model-policy contract](model-policy.md) and apply its recorded
|
|
67
|
+
native arguments. It owns defaults, project settings, task overrides,
|
|
68
|
+
capability failures, and reassignment. Host isolation: none. Use the exact GSD Path supplied root; create no extra checkout.
|
|
82
69
|
- Send a self-contained prompt with absolute input, template, and output paths
|
|
83
70
|
plus the child's bounded responsibility. Every brief also names the absolute
|
|
84
71
|
`AGENTS.md` and `WORKFLOW.md` paths (or explicitly says they are absent), the
|
|
@@ -122,6 +109,12 @@ directory for the full logical session; resumptions reuse it. Record completed
|
|
|
122
109
|
parent CLI run events and each native child's session events with stable logical
|
|
123
110
|
task names before the next dispatch. The helper reads host counters and refuses
|
|
124
111
|
incomplete or ambiguous usage; never estimate tokens or reset the ledger.
|
|
112
|
+
When the verified CLI adapter reports cumulative counters across `resume`, record
|
|
113
|
+
each later invocation with `--previous-events <previous recorded CLI events>`.
|
|
114
|
+
The helper checks thread identity and records only the new output, preserving the
|
|
115
|
+
raw total and predecessor. Keep that chain in order; never sum cumulative totals.
|
|
116
|
+
Use ordinary `record` for per-invocation counters. An unknown counter convention
|
|
117
|
+
is unproven usage, not permission to guess.
|
|
125
118
|
Run `admit` for the next task and stop dispatch on a blocked result. Preserve
|
|
126
119
|
its output in the dispatch evidence. This gates observed usage only: concurrent
|
|
127
120
|
or in-flight work can overrun before the host reports usage. Codex CLI has no
|
package/scripts/_common.py
CHANGED
|
@@ -16,6 +16,9 @@ import re
|
|
|
16
16
|
import shutil
|
|
17
17
|
import subprocess
|
|
18
18
|
import sys
|
|
19
|
+
|
|
20
|
+
# Runtime helpers must not modify their immutable installation.
|
|
21
|
+
sys.dont_write_bytecode = True
|
|
19
22
|
from contextlib import contextmanager
|
|
20
23
|
from datetime import date
|
|
21
24
|
from pathlib import Path, PurePosixPath
|
|
@@ -239,15 +242,10 @@ class ArchiveError(RuntimeError):
|
|
|
239
242
|
|
|
240
243
|
|
|
241
244
|
PIPELINE_MARKER = _common.PIPELINE_MARKER
|
|
242
|
-
PR_CREDIT_LINE = (
|
|
243
|
-
"PR prepared with [GSD Path](https://github.com/open-gsd/gsd-path)."
|
|
244
|
-
)
|
|
245
|
-
GITHUB_HOST = "github.com"
|
|
246
245
|
|
|
247
246
|
|
|
248
|
-
# discussion_validate
|
|
249
|
-
#
|
|
250
|
-
# import must stay below those definitions.
|
|
247
|
+
# discussion_validate calls back into this module and imports its constants
|
|
248
|
+
# and ArchiveError, so this import must stay below those definitions.
|
|
251
249
|
if __package__: # imported as scripts.archive_milestone
|
|
252
250
|
from .discussion_validate import (
|
|
253
251
|
record_sections,
|
|
@@ -280,42 +278,6 @@ if __package__: # imported as scripts.archive_milestone
|
|
|
280
278
|
render_manifest,
|
|
281
279
|
validate_manifest,
|
|
282
280
|
)
|
|
283
|
-
from .integration import (
|
|
284
|
-
resolve_remote_default,
|
|
285
|
-
live_remote_ref,
|
|
286
|
-
publish_bound_branch,
|
|
287
|
-
refresh_origin,
|
|
288
|
-
optional_ref,
|
|
289
|
-
integration_names,
|
|
290
|
-
registered_worktree,
|
|
291
|
-
remove_registered_worktree,
|
|
292
|
-
delete_integration_branch,
|
|
293
|
-
require_generated_integration_commit,
|
|
294
|
-
discard_unpublished_stale_integration,
|
|
295
|
-
create_integration_merge,
|
|
296
|
-
require_annotated_tag,
|
|
297
|
-
ensure_integration_tag,
|
|
298
|
-
github_repository,
|
|
299
|
-
require_github_authentication,
|
|
300
|
-
github_api_json,
|
|
301
|
-
require_pull_request_shape,
|
|
302
|
-
require_pull_request_pages,
|
|
303
|
-
pull_request_head_matches_repository,
|
|
304
|
-
require_pull_request_identity,
|
|
305
|
-
find_pull_request,
|
|
306
|
-
pull_request_body,
|
|
307
|
-
update_pull_request_body,
|
|
308
|
-
create_pull_request,
|
|
309
|
-
pull_request_tag_message,
|
|
310
|
-
pull_request_tag_metadata,
|
|
311
|
-
require_pull_request_merge,
|
|
312
|
-
require_pull_request_merge_provenance,
|
|
313
|
-
integrate_pull_request,
|
|
314
|
-
integrate,
|
|
315
|
-
find_integrate_commit,
|
|
316
|
-
validate_integrated,
|
|
317
|
-
require_published_integration,
|
|
318
|
-
)
|
|
319
281
|
else: # standalone script or sibling import
|
|
320
282
|
if __name__ == "__main__":
|
|
321
283
|
sys.modules.setdefault("archive_milestone", sys.modules[__name__])
|
|
@@ -351,42 +313,6 @@ else: # standalone script or sibling import
|
|
|
351
313
|
render_manifest,
|
|
352
314
|
validate_manifest,
|
|
353
315
|
)
|
|
354
|
-
from integration import (
|
|
355
|
-
resolve_remote_default,
|
|
356
|
-
live_remote_ref,
|
|
357
|
-
publish_bound_branch,
|
|
358
|
-
refresh_origin,
|
|
359
|
-
optional_ref,
|
|
360
|
-
integration_names,
|
|
361
|
-
registered_worktree,
|
|
362
|
-
remove_registered_worktree,
|
|
363
|
-
delete_integration_branch,
|
|
364
|
-
require_generated_integration_commit,
|
|
365
|
-
discard_unpublished_stale_integration,
|
|
366
|
-
create_integration_merge,
|
|
367
|
-
require_annotated_tag,
|
|
368
|
-
ensure_integration_tag,
|
|
369
|
-
github_repository,
|
|
370
|
-
require_github_authentication,
|
|
371
|
-
github_api_json,
|
|
372
|
-
require_pull_request_shape,
|
|
373
|
-
require_pull_request_pages,
|
|
374
|
-
pull_request_head_matches_repository,
|
|
375
|
-
require_pull_request_identity,
|
|
376
|
-
find_pull_request,
|
|
377
|
-
pull_request_body,
|
|
378
|
-
update_pull_request_body,
|
|
379
|
-
create_pull_request,
|
|
380
|
-
pull_request_tag_message,
|
|
381
|
-
pull_request_tag_metadata,
|
|
382
|
-
require_pull_request_merge,
|
|
383
|
-
require_pull_request_merge_provenance,
|
|
384
|
-
integrate_pull_request,
|
|
385
|
-
integrate,
|
|
386
|
-
find_integrate_commit,
|
|
387
|
-
validate_integrated,
|
|
388
|
-
require_published_integration,
|
|
389
|
-
)
|
|
390
316
|
except ImportError: # pragma: no cover - package import used by tests
|
|
391
317
|
from scripts.discussion_validate import (
|
|
392
318
|
record_sections,
|
|
@@ -419,42 +345,6 @@ else: # standalone script or sibling import
|
|
|
419
345
|
render_manifest,
|
|
420
346
|
validate_manifest,
|
|
421
347
|
)
|
|
422
|
-
from scripts.integration import (
|
|
423
|
-
resolve_remote_default,
|
|
424
|
-
live_remote_ref,
|
|
425
|
-
publish_bound_branch,
|
|
426
|
-
refresh_origin,
|
|
427
|
-
optional_ref,
|
|
428
|
-
integration_names,
|
|
429
|
-
registered_worktree,
|
|
430
|
-
remove_registered_worktree,
|
|
431
|
-
delete_integration_branch,
|
|
432
|
-
require_generated_integration_commit,
|
|
433
|
-
discard_unpublished_stale_integration,
|
|
434
|
-
create_integration_merge,
|
|
435
|
-
require_annotated_tag,
|
|
436
|
-
ensure_integration_tag,
|
|
437
|
-
github_repository,
|
|
438
|
-
require_github_authentication,
|
|
439
|
-
github_api_json,
|
|
440
|
-
require_pull_request_shape,
|
|
441
|
-
require_pull_request_pages,
|
|
442
|
-
pull_request_head_matches_repository,
|
|
443
|
-
require_pull_request_identity,
|
|
444
|
-
find_pull_request,
|
|
445
|
-
pull_request_body,
|
|
446
|
-
update_pull_request_body,
|
|
447
|
-
create_pull_request,
|
|
448
|
-
pull_request_tag_message,
|
|
449
|
-
pull_request_tag_metadata,
|
|
450
|
-
require_pull_request_merge,
|
|
451
|
-
require_pull_request_merge_provenance,
|
|
452
|
-
integrate_pull_request,
|
|
453
|
-
integrate,
|
|
454
|
-
find_integrate_commit,
|
|
455
|
-
validate_integrated,
|
|
456
|
-
require_published_integration,
|
|
457
|
-
)
|
|
458
348
|
|
|
459
349
|
|
|
460
350
|
@contextmanager
|
|
@@ -1856,6 +1746,12 @@ def require_clean_active_root(active_root: Path, archive: Path) -> None:
|
|
|
1856
1746
|
carried_forward = pending_ruling_count(archived_audit)
|
|
1857
1747
|
# Persistent project metadata ships but never archives with a milestone.
|
|
1858
1748
|
allowed = {"STATE.md", "REPOSITORY.md", "archive", "LESSONS.md", "next"}
|
|
1749
|
+
for name in ("config.json", "model-policy.json"):
|
|
1750
|
+
path = active_root / name
|
|
1751
|
+
if path.exists() or path.is_symlink():
|
|
1752
|
+
if path.is_symlink() or not path.is_file() or path.stat().st_nlink != 1:
|
|
1753
|
+
raise ArchiveError(f"project settings must be a regular unlinked file: {path}")
|
|
1754
|
+
allowed.add(name)
|
|
1859
1755
|
if (active_root / "CHARTER.md").is_file():
|
|
1860
1756
|
# Program flow: these persist at the .project/ top level.
|
|
1861
1757
|
allowed |= {"CHARTER.md", "ROADMAP.md", "SYNTHESIS.md"}
|
|
@@ -1921,6 +1817,7 @@ def prepared_transaction(
|
|
|
1921
1817
|
repo: Path,
|
|
1922
1818
|
phases: Sequence[str],
|
|
1923
1819
|
must_be_uncommitted: bool = False,
|
|
1820
|
+
*, historical: bool = False,
|
|
1924
1821
|
) -> tuple:
|
|
1925
1822
|
project = repo.resolve()
|
|
1926
1823
|
active_root = require_project_layout(project)
|
|
@@ -1929,7 +1826,7 @@ def prepared_transaction(
|
|
|
1929
1826
|
state, _, loaded_state_path = strict_state(project)
|
|
1930
1827
|
if loaded_state_path.resolve() != state_path.resolve():
|
|
1931
1828
|
raise ArchiveError("strict STATE.md loader returned an unexpected path")
|
|
1932
|
-
require_transaction_context(project, state, phases)
|
|
1829
|
+
require_transaction_context(project, state, phases, historical=historical)
|
|
1933
1830
|
|
|
1934
1831
|
configured = state.archive
|
|
1935
1832
|
if configured is None:
|
|
@@ -1993,10 +1890,11 @@ def require_canonical_commit_body(
|
|
|
1993
1890
|
raise ArchiveError(f"{label} commit body does not match required fields")
|
|
1994
1891
|
|
|
1995
1892
|
|
|
1996
|
-
def find_ship_commit(project: Path, archive_name: str) -> str:
|
|
1893
|
+
def find_ship_commit(project: Path, archive_name: str, *, historical: bool = False) -> str:
|
|
1997
1894
|
expected_subject = ship_subject(archive_name)
|
|
1998
1895
|
log = require_git_success(
|
|
1999
|
-
run_git(project, "log", "--first-parent"
|
|
1896
|
+
run_git(project, "log", *([] if historical else ["--first-parent"]),
|
|
1897
|
+
"--format=%H%x00%s", "HEAD"),
|
|
2000
1898
|
"inspect HEAD history for the ship commit",
|
|
2001
1899
|
)
|
|
2002
1900
|
matches = []
|
|
@@ -2039,19 +1937,22 @@ def validate_shipped_roadmap(text: str, state: PipelineState, archive: str) -> N
|
|
|
2039
1937
|
raise ArchiveError("ROADMAP.md must record Status: shipped and the exact Archive")
|
|
2040
1938
|
|
|
2041
1939
|
|
|
2042
|
-
def validate(repo: Path) -> dict:
|
|
1940
|
+
def validate(repo: Path, *, historical: bool = False) -> dict:
|
|
2043
1941
|
project, _, state, configured, archive, archived_files, reviewed_head = prepared_transaction(
|
|
2044
1942
|
repo,
|
|
2045
1943
|
("shipped",),
|
|
1944
|
+
historical=historical,
|
|
2046
1945
|
)
|
|
2047
1946
|
if state.status != "done":
|
|
2048
1947
|
raise ArchiveError("STATE.md is not shipped/done")
|
|
2049
1948
|
|
|
2050
|
-
project_status = require_git_success(
|
|
1949
|
+
project_status = require_git_success(
|
|
1950
|
+
run_git(project, "status", "--porcelain", *(["--", ".project"] if historical else [])),
|
|
1951
|
+
"inspect worktree status")
|
|
2051
1952
|
if project_status:
|
|
2052
1953
|
raise ArchiveError("ship transaction worktree is not clean")
|
|
2053
1954
|
|
|
2054
|
-
ship_commit = find_ship_commit(project, archive.name)
|
|
1955
|
+
ship_commit = find_ship_commit(project, archive.name, historical=historical)
|
|
2055
1956
|
|
|
2056
1957
|
parents = require_git_success(
|
|
2057
1958
|
run_git(project, "rev-list", "--parents", "-n", "1", ship_commit),
|
|
@@ -2238,6 +2139,11 @@ def parser() -> argparse.ArgumentParser:
|
|
|
2238
2139
|
def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
2239
2140
|
arguments = parser().parse_args(argv)
|
|
2240
2141
|
try:
|
|
2142
|
+
if arguments.command in {"validate-integrated", "refresh-origin", "integrate"}:
|
|
2143
|
+
if __package__:
|
|
2144
|
+
from . import integration
|
|
2145
|
+
else:
|
|
2146
|
+
import integration
|
|
2241
2147
|
if arguments.command == "prepare":
|
|
2242
2148
|
result = prepare(arguments.repo, arguments.slug)
|
|
2243
2149
|
elif arguments.command == "render-manifest":
|
|
@@ -2247,11 +2153,11 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
|
2247
2153
|
elif arguments.command == "abandon":
|
|
2248
2154
|
result = abandon(arguments.repo, arguments.slug, arguments.reason)
|
|
2249
2155
|
elif arguments.command == "validate-integrated":
|
|
2250
|
-
result = validate_integrated(arguments.repo, arguments.slug)
|
|
2156
|
+
result = integration.validate_integrated(arguments.repo, arguments.slug)
|
|
2251
2157
|
elif arguments.command == "refresh-origin":
|
|
2252
|
-
result = refresh_origin(arguments.repo)
|
|
2158
|
+
result = integration.refresh_origin(arguments.repo)
|
|
2253
2159
|
elif arguments.command == "integrate":
|
|
2254
|
-
result = integrate(arguments.repo, arguments.slug)
|
|
2160
|
+
result = integration.integrate(arguments.repo, arguments.slug)
|
|
2255
2161
|
else:
|
|
2256
2162
|
result = validate(arguments.repo)
|
|
2257
2163
|
except (ArchiveError, OSError) as error:
|
|
@@ -32,6 +32,7 @@ class BootstrapRequest:
|
|
|
32
32
|
worktree: str
|
|
33
33
|
branch: str
|
|
34
34
|
description: Optional[str]
|
|
35
|
+
reuse_empty_worktree: bool = False
|
|
35
36
|
|
|
36
37
|
@property
|
|
37
38
|
def repository(self) -> str:
|
|
@@ -95,6 +96,8 @@ def request_from_arguments(arguments: argparse.Namespace) -> BootstrapRequest:
|
|
|
95
96
|
if arguments.visibility not in {"public", "private", "internal"}:
|
|
96
97
|
raise BootstrapError("visibility must be public, private, or internal")
|
|
97
98
|
|
|
99
|
+
if arguments.reuse_empty_worktree and arguments.worktree.is_symlink():
|
|
100
|
+
raise BootstrapError("linked worktree must not be a symlink")
|
|
98
101
|
workspace = arguments.workspace.resolve()
|
|
99
102
|
checkout = arguments.default_checkout.resolve()
|
|
100
103
|
worktree = arguments.worktree.resolve()
|
|
@@ -116,6 +119,7 @@ def request_from_arguments(arguments: argparse.Namespace) -> BootstrapRequest:
|
|
|
116
119
|
worktree=str(worktree),
|
|
117
120
|
branch="gsd-path/M001",
|
|
118
121
|
description=arguments.description,
|
|
122
|
+
reuse_empty_worktree=arguments.reuse_empty_worktree,
|
|
119
123
|
)
|
|
120
124
|
|
|
121
125
|
|
|
@@ -148,7 +152,10 @@ def transaction_directory(request: BootstrapRequest, create: bool = False) -> Pa
|
|
|
148
152
|
|
|
149
153
|
|
|
150
154
|
def request_payload(request: BootstrapRequest) -> dict:
|
|
151
|
-
|
|
155
|
+
payload = {"schema": "gsd-path/new-github/v1", **asdict(request)}
|
|
156
|
+
if not request.reuse_empty_worktree:
|
|
157
|
+
del payload["reuse_empty_worktree"]
|
|
158
|
+
return payload
|
|
152
159
|
|
|
153
160
|
|
|
154
161
|
def read_journal(request: BootstrapRequest) -> Optional[dict]:
|
|
@@ -272,6 +279,16 @@ def transaction_stages(request: BootstrapRequest) -> dict:
|
|
|
272
279
|
}
|
|
273
280
|
|
|
274
281
|
|
|
282
|
+
def reusable_empty_worktree(request: BootstrapRequest) -> bool:
|
|
283
|
+
path = request.worktree_path
|
|
284
|
+
return (
|
|
285
|
+
request.reuse_empty_worktree
|
|
286
|
+
and not path.is_symlink()
|
|
287
|
+
and path.is_dir()
|
|
288
|
+
and not any(path.iterdir())
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
275
292
|
def preview(request: BootstrapRequest) -> dict:
|
|
276
293
|
gh_authentication()
|
|
277
294
|
stages = transaction_stages(request)
|
|
@@ -288,8 +305,12 @@ def preview(request: BootstrapRequest) -> dict:
|
|
|
288
305
|
("default checkout", request.checkout_path),
|
|
289
306
|
("linked worktree", request.worktree_path),
|
|
290
307
|
):
|
|
308
|
+
if path == request.worktree_path and reusable_empty_worktree(request):
|
|
309
|
+
continue
|
|
291
310
|
if path.exists() or path.is_symlink():
|
|
292
|
-
raise BootstrapError(
|
|
311
|
+
raise BootstrapError(
|
|
312
|
+
f"{label} path already exists: {path}; preserve it and choose another path"
|
|
313
|
+
)
|
|
293
314
|
return {**request_payload(request), "mode": "create", "stages": stages}
|
|
294
315
|
|
|
295
316
|
|
|
@@ -448,7 +469,7 @@ def allowed_partial_project_status(worktree: Path) -> bool:
|
|
|
448
469
|
def create_or_verify_worktree(request: BootstrapRequest, base: str) -> None:
|
|
449
470
|
checkout = request.checkout_path
|
|
450
471
|
worktree = request.worktree_path
|
|
451
|
-
if not worktree.exists():
|
|
472
|
+
if not worktree.exists() or reusable_empty_worktree(request):
|
|
452
473
|
branch_ref = f"refs/heads/{request.branch}"
|
|
453
474
|
branch = run("git", "-C", str(checkout), "rev-parse", "--verify", branch_ref)
|
|
454
475
|
if branch.returncode == 0:
|
|
@@ -540,7 +561,14 @@ def render_state(template: Path, request: BootstrapRequest) -> str:
|
|
|
540
561
|
)
|
|
541
562
|
if "<slug>" in content or "branch: null" in content:
|
|
542
563
|
raise BootstrapError("state template placeholders were not fully replaced")
|
|
543
|
-
|
|
564
|
+
try:
|
|
565
|
+
from .path_config import initial_state
|
|
566
|
+
except ImportError:
|
|
567
|
+
from path_config import initial_state
|
|
568
|
+
try:
|
|
569
|
+
return initial_state(content)
|
|
570
|
+
except (OSError, ValueError, RuntimeError) as error:
|
|
571
|
+
raise BootstrapError(str(error)) from error
|
|
544
572
|
|
|
545
573
|
|
|
546
574
|
def render_binding(
|
|
@@ -680,6 +708,7 @@ def parser() -> argparse.ArgumentParser:
|
|
|
680
708
|
argument_parser.add_argument("--default-checkout", type=Path, required=True)
|
|
681
709
|
argument_parser.add_argument("--worktree", type=Path, required=True)
|
|
682
710
|
argument_parser.add_argument("--description")
|
|
711
|
+
argument_parser.add_argument("--reuse-empty-worktree", action="store_true")
|
|
683
712
|
argument_parser.add_argument("--state-template", type=Path)
|
|
684
713
|
argument_parser.add_argument("--repository-template", type=Path)
|
|
685
714
|
return argument_parser
|