@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
|
@@ -17,159 +17,23 @@ Verify written GSD Path expectations and block failures. Never fix code.
|
|
|
17
17
|
inside supplied sidecars. Never edit a product path or any other
|
|
18
18
|
primary-worktree path. Stop on a missing input or template.
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Load the assigned mode
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
Read only the row matching the brief. Common rules below apply to every mode.
|
|
23
|
+
Resolve sibling links against this role file's directory.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
and inspect the diff. Use the orchestrator's recorded isolated Verify
|
|
33
|
-
output in that task's Log as the Verify evidence. Do not re-run the
|
|
34
|
-
task Verify command or PLAN.md's project Verify. Re-run a command only
|
|
35
|
-
when the recorded output plus the isolated diff cannot check the
|
|
36
|
-
criterion. Never use the primary worktree or branch tip as task
|
|
37
|
-
evidence. Do not create or remove Git worktrees yourself.
|
|
38
|
-
4. Mark `pass` or `fail`. Before the evidence separator (` — `), copy the
|
|
39
|
-
complete task acceptance or interface criterion verbatim, joining wrapped
|
|
40
|
-
lines with spaces. Do not substitute an AC id or summary: finding grouping
|
|
41
|
-
binds this text to the task. Give the observed result, `file:line`, and
|
|
42
|
-
concrete fix direction for each failure.
|
|
43
|
-
|
|
44
|
-
Then check each INTENT.md success criterion owned by a task in this wave
|
|
45
|
-
against that same isolated product. Copy the criterion verbatim from
|
|
46
|
-
INTENT.md. Mark `pass` or `fail` with evidence; a failed owned SC blocks
|
|
47
|
-
the wave. Omit the Intent coverage section when no task in the wave owns
|
|
48
|
-
an SC.
|
|
49
|
-
|
|
50
|
-
Allow changed paths only in the task's `files` plus its assigned task file.
|
|
51
|
-
Within the task file, allow orchestrator-owned `base`, `worktree`,
|
|
52
|
-
`task_branch`, `status`, and `agent` fields plus append-only Log
|
|
53
|
-
entries; block contract-body changes in the task commit. Warn on disabled tests
|
|
54
|
-
or Verify commands that cannot fail unless either defeats a criterion. Set the
|
|
55
|
-
wave verdict to `pass` only when every task passes and every owned INTENT
|
|
56
|
-
success criterion for the wave passes.
|
|
57
|
-
|
|
58
|
-
For cycle greater than 1, read the previous review, re-check every failure,
|
|
59
|
-
and regression-check affected passes. State when the same criterion fails for
|
|
60
|
-
a different reason. Use only the wave-review template.
|
|
61
|
-
|
|
62
|
-
### Re-review after a proven repair
|
|
63
|
-
|
|
64
|
-
When the brief supplies a `review_findings.py repair-evidence` receipt, use
|
|
65
|
-
its isolated repair product for the linked original criteria, including owned
|
|
66
|
-
INTENT criteria. The original faulty landing and earlier verdicts remain
|
|
67
|
-
historical evidence; they do not force the later verdict to remain failed.
|
|
68
|
-
Reconstruct the receipt's repair `base` plus only its `commit^..commit` patch
|
|
69
|
-
for `files` inside the supplied sidecar. Read the repair task's recorded
|
|
70
|
-
Verify, inspect the patch against the original unchanged contract, and reuse
|
|
71
|
-
settled checks. Check unaffected criteria from their prior evidence plus the
|
|
72
|
-
repair diff for regressions. Cite the receipt, repair landing and task Log in
|
|
73
|
-
the new review. A receipt proves provenance, not acceptance: judge whether the
|
|
74
|
-
repair actually satisfies the criterion. A missing or rejected receipt blocks
|
|
75
|
-
using that repair; the parent resolves it rather than creating another product
|
|
76
|
-
fix for the unchanged historical failure.
|
|
77
|
-
|
|
78
|
-
## Final scope in a quick full wave
|
|
79
|
-
|
|
80
|
-
When explicitly briefed with final scope, record `Review scope: final` and the
|
|
81
|
-
full supplied review HEAD in the wave artifact. Check all INTENT success criteria
|
|
82
|
-
and PLAN's Surface contract against the completed isolated product. Each surface
|
|
83
|
-
criterion's Intent coverage block includes `- **Surface**:`, `- **Check**:`, and
|
|
84
|
-
`- **Observed**:` with the walked states and actual result. Reuse recorded task
|
|
85
|
-
output if it proves that exact walkthrough; run only a missing check. Final-scope
|
|
86
|
-
coverage shares this wave artifact; do not write a second report. Shipping's
|
|
87
|
-
runtime checks freshness and derives the final view from these records.
|
|
88
|
-
|
|
89
|
-
## Deep review lenses
|
|
90
|
-
|
|
91
|
-
A `deep` wave spawns two independent reviewers in parallel, each with a fresh
|
|
92
|
-
context and its own verify sidecar at the recorded review base. Every
|
|
93
|
-
Wave mode rule above applies to both lenses.
|
|
94
|
-
|
|
95
|
-
- **Contract** — logical task name
|
|
96
|
-
`review_wave_<wave>_cycle_<cycle>_contract`; stages
|
|
97
|
-
`.project/review/wave-N.cycleC.contract.md`. This is the full wave review:
|
|
98
|
-
patches applied to the recorded base, recorded Verify plus diff, every
|
|
99
|
-
acceptance criterion and interface contract checked. Record `Lens:
|
|
100
|
-
contract`.
|
|
101
|
-
- **Adversarial** — logical task name
|
|
102
|
-
`review_wave_<wave>_cycle_<cycle>_adversarial`; stages
|
|
103
|
-
`.project/review/wave-N.cycleC.adversarial.md`. Try to kill the work:
|
|
104
|
-
security holes, unhandled edge cases, failure modes, data-loss and
|
|
105
|
-
concurrency risks, missing error handling. Record `Lens: adversarial`.
|
|
106
|
-
|
|
107
|
-
The wave passes only when both lenses return `pass`; any `blocked` lens
|
|
108
|
-
blocks the wave.
|
|
109
|
-
|
|
110
|
-
## Skeptic mode
|
|
111
|
-
|
|
112
|
-
Use only skeptic.md. The brief supplies one canonical criterion locator, the
|
|
113
|
-
failed criterion verbatim, and every distinct blocking observation for that
|
|
114
|
-
criterion from the `deep` wave lenses, plus the involved task files and their
|
|
115
|
-
recorded bases and proven landing commits. The only job is to refute all of
|
|
116
|
-
those observations.
|
|
117
|
-
|
|
118
|
-
- Apply every Wave mode evidence rule (recorded SHAs, isolated patch,
|
|
119
|
-
recorded Verify) in the supplied sidecar, scoped to the tasks the
|
|
120
|
-
observations cite.
|
|
121
|
-
- Address every distinct observation separately. Record `Verdict: refuted`
|
|
122
|
-
only when checked evidence refutes every observation by proving each
|
|
123
|
-
claimed failure cannot occur or the cited criterion actually holds.
|
|
124
|
-
Anything short of that is `Verdict: stands`.
|
|
125
|
-
- Stage
|
|
126
|
-
`.project/review/wave-N.cycleC.skeptic-<criterion_locator>.md` under the
|
|
127
|
-
supplied sidecar.
|
|
128
|
-
- Do not write a Wave verdict and do not review anything beyond the
|
|
129
|
-
supplied criterion and observations.
|
|
130
|
-
|
|
131
|
-
## Final integration mode
|
|
132
|
-
|
|
133
|
-
Use only final-review.md. Treat INTENT.md success criteria as the rubric.
|
|
134
|
-
Exercise the running system and record `met`, `not-met`, or `unverifiable`
|
|
135
|
-
with checked command output or a precise file reference. When PLAN.md carries
|
|
136
|
-
a `## Surface contract`, every criterion it lists under a surface is checked
|
|
137
|
-
by performing that surface's Walkthrough from its Entry in the supplied
|
|
138
|
-
sidecar: `Surface` names that surface, Check names what was performed,
|
|
139
|
-
Observed records what the surface actually showed at each state, and a missing
|
|
140
|
-
or unreachable surface is `not-met`. A surface criterion is never `met` on
|
|
141
|
-
internal test output alone. Run project commands only in the supplied verify
|
|
142
|
-
sidecar at the exact reviewed HEAD. Do not
|
|
143
|
-
re-run PLAN.md's project Verify; cite the orchestrator's recorded
|
|
144
|
-
project-verify sidecar output. `pass`
|
|
145
|
-
requires every criterion to be `met`.
|
|
146
|
-
|
|
147
|
-
## Final gap mode
|
|
148
|
-
|
|
149
|
-
Use only gap-review.md. Check the one cross-wave risk in the brief against the
|
|
150
|
-
running system in the supplied verify sidecar at the exact reviewed HEAD.
|
|
151
|
-
Record evidence and `pass` or `blocked`; an unverified risk is blocked.
|
|
152
|
-
|
|
153
|
-
## Plan panel mode
|
|
154
|
-
|
|
155
|
-
Use only plan-panel.md. Review `.project/plan/PLAN.md` and every task file
|
|
156
|
-
against INTENT.md and SYNTHESIS.md. Do not edit those files. Write one
|
|
157
|
-
finding block per issue, or `- none`. Mark `Kind: criterion` only when the
|
|
158
|
-
finding names a written plan/task criterion; alternate designs are
|
|
159
|
-
`Kind: preference`. This output is advisory. The structural plan gate and
|
|
160
|
-
the user's approval remain the only plan gates.
|
|
161
|
-
|
|
162
|
-
## Wave panel mode
|
|
163
|
-
|
|
164
|
-
Use only wave-panel.md. Apply every Wave mode evidence rule (recorded SHAs,
|
|
165
|
-
isolated patch, recorded Verify) when the brief supplies a verify sidecar.
|
|
166
|
-
On a `deep` wave the brief is the adversarial lens only. Record findings
|
|
167
|
-
the same way as plan panel mode. Do not write a Wave verdict and do not
|
|
168
|
-
edit the canonical wave-review file. The inherit reviewer remains the only
|
|
169
|
-
pass/fail.
|
|
25
|
+
| Mode | Required procedure |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Wave, full or deep; quick final scope | [Wave review](reviewer-wave.md) |
|
|
28
|
+
| Skeptic | [Wave evidence rules](reviewer-wave.md) and [skeptic](reviewer-skeptic.md) |
|
|
29
|
+
| Final integration or final gap | [Final review](reviewer-final.md) |
|
|
30
|
+
| Plan panel | [Panel review](reviewer-panel.md) |
|
|
31
|
+
| Wave panel | [Wave evidence rules](reviewer-wave.md) and [panel review](reviewer-panel.md) |
|
|
170
32
|
|
|
171
33
|
## Rules
|
|
172
34
|
|
|
35
|
+
- When `GSD_PATH_JEV=1`, wave and final reviewers follow the optional
|
|
36
|
+
[Jev evidence screening procedure](jev-review.md) for uncovered criteria.
|
|
173
37
|
- Review written expectations, not preferences or alternate designs.
|
|
174
38
|
- Treat an Interface contract violation as a failed criterion, citing the
|
|
175
39
|
contract line and the offending diff hunk.
|
|
@@ -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.
|
|
Binary file
|
|
@@ -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
|