@opengsd/gsd-path 1.1.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 +5 -2
- package/CHANGELOG.md +68 -0
- package/DOCS.md +69 -1
- package/FULL.md +3 -2
- package/HOOKS.md +18 -9
- package/QUICK.md +5 -3
- package/README.md +72 -5
- package/RUNTIME.md +9 -4
- package/UPDATE.md +30 -11
- package/WORKFLOW.md +5 -2
- package/package.json +9 -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 +6 -19
- package/scripts/_common.py +5 -0
- package/scripts/archive_milestone.py +20 -6
- package/scripts/bootstrap_repository.py +8 -1
- package/scripts/build_recovery.py +5 -0
- package/scripts/build_state.py +2 -0
- package/scripts/check_docs_audit.py +2 -0
- package/scripts/check_handoffs.py +6 -0
- package/scripts/check_task_briefs.py +3 -0
- package/scripts/detect_project.py +11 -1
- package/scripts/discussion_records.py +3 -0
- package/scripts/discussion_validate.py +8 -3
- package/scripts/dispatch_driver.py +230 -21
- package/scripts/git_guard.py +12 -4
- package/scripts/guard_hook.py +11 -1
- package/scripts/install.mjs +52 -1448
- package/scripts/install.py +155 -190
- package/scripts/integration.py +28 -8
- package/scripts/isolation.py +15 -5
- package/scripts/jev_review.py +138 -0
- package/scripts/lean_verification.py +2 -0
- 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 +3 -0
- package/scripts/pipeline_git.py +3 -0
- package/scripts/pipeline_state.py +4 -1
- package/scripts/pipeline_undo.py +3 -0
- package/scripts/promote_lookahead.py +3 -0
- package/scripts/review_panel.py +11 -0
- package/scripts/roadmap.py +5 -0
- package/scripts/runtime_store.py +278 -0
- package/scripts/skill-resources.json +104 -4
- package/scripts/state_checkpoint.py +5 -0
- package/scripts/state_promote.py +5 -0
- package/scripts/status_runtime.py +92 -6
- package/scripts/workflow_run.py +12 -1
- package/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path/BUILD.md +7 -0
- package/skills/gsd-path/DECIDE.md +2 -0
- package/skills/gsd-path/DEFINE.md +13 -7
- package/skills/gsd-path/DOCS-AUDIT.md +2 -0
- package/skills/gsd-path/INSPECT.md +2 -0
- package/skills/gsd-path/PLAN.md +4 -2
- package/skills/gsd-path/RESEARCH.md +2 -0
- package/skills/gsd-path/ROADMAP.md +2 -0
- package/skills/gsd-path/SHIP.md +24 -13
- package/skills/gsd-path/SKILL.md +23 -9
- package/skills/gsd-path/references/build-native.md +15 -7
- package/skills/gsd-path/references/config.md +57 -0
- package/skills/gsd-path/references/dispatch.md +6 -19
- 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-panel.md +1 -1
- package/skills/gsd-path/references/reviewer.md +2 -0
- 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 +20 -6
- package/skills/gsd-path/scripts/bootstrap_repository.py +8 -1
- package/skills/gsd-path/scripts/build_recovery.py +5 -0
- package/skills/gsd-path/scripts/build_state.py +2 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path/scripts/detect_project.py +11 -1
- 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 +230 -21
- package/skills/gsd-path/scripts/git_guard.py +768 -0
- package/skills/gsd-path/scripts/integration.py +28 -8
- package/skills/gsd-path/scripts/isolation.py +15 -5
- package/skills/gsd-path/scripts/jev_review.py +138 -0
- package/skills/gsd-path/scripts/lean_verification.py +2 -0
- 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 +4 -1
- package/skills/gsd-path/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path/scripts/review_panel.py +11 -0
- package/skills/gsd-path/scripts/roadmap.py +5 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path/scripts/state_promote.py +5 -0
- package/skills/gsd-path/scripts/status_runtime.py +208 -0
- package/skills/gsd-path/scripts/workflow_run.py +12 -1
- 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-build/SKILL.md +7 -0
- package/skills/gsd-path-build/references/build-native.md +15 -7
- package/skills/gsd-path-build/references/dispatch.md +6 -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-panel.md +1 -1
- package/skills/gsd-path-build/references/reviewer.md +2 -0
- 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 +20 -6
- package/skills/gsd-path-build/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-build/scripts/build_state.py +2 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-build/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-build/scripts/detect_project.py +11 -1
- 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 +230 -21
- package/skills/gsd-path-build/scripts/integration.py +28 -8
- package/skills/gsd-path-build/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-build/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-build/scripts/review_panel.py +11 -0
- package/skills/gsd-path-build/scripts/roadmap.py +5 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-build/scripts/state_promote.py +5 -0
- package/skills/gsd-path-build/scripts/workflow_run.py +12 -1
- 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-decide/SKILL.md +2 -0
- package/skills/gsd-path-decide/references/dispatch.md +6 -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 +20 -6
- package/skills/gsd-path-decide/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-decide/scripts/detect_project.py +11 -1
- package/skills/gsd-path-decide/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-decide/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-decide/scripts/integration.py +28 -8
- package/skills/gsd-path-decide/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-decide/scripts/review_panel.py +11 -0
- package/skills/gsd-path-decide/scripts/roadmap.py +5 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-decide/scripts/state_promote.py +5 -0
- package/skills/gsd-path-decide/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-define/SKILL.md +13 -7
- 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 +20 -6
- package/skills/gsd-path-define/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-define/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-define/scripts/detect_project.py +11 -1
- package/skills/gsd-path-define/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-define/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-define/scripts/integration.py +28 -8
- package/skills/gsd-path-define/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-define/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-define/scripts/review_panel.py +11 -0
- package/skills/gsd-path-define/scripts/roadmap.py +5 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-define/scripts/state_promote.py +5 -0
- 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 +6 -19
- 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 +20 -6
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +11 -1
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-docs-audit/scripts/integration.py +28 -8
- package/skills/gsd-path-docs-audit/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +11 -0
- package/skills/gsd-path-docs-audit/scripts/roadmap.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +5 -0
- 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 +3 -0
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +3 -0
- 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 +2 -0
- package/skills/gsd-path-inspect/references/dispatch.md +6 -19
- 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 +20 -6
- package/skills/gsd-path-inspect/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +2 -0
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-inspect/scripts/detect_project.py +11 -1
- package/skills/gsd-path-inspect/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-inspect/scripts/integration.py +28 -8
- package/skills/gsd-path-inspect/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-inspect/scripts/review_panel.py +11 -0
- package/skills/gsd-path-inspect/scripts/roadmap.py +5 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-inspect/scripts/state_promote.py +5 -0
- package/skills/gsd-path-inspect/scripts/workflow_run.py +12 -1
- 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 +4 -2
- package/skills/gsd-path-plan/references/dispatch.md +6 -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 +20 -6
- package/skills/gsd-path-plan/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-plan/scripts/detect_project.py +11 -1
- package/skills/gsd-path-plan/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-plan/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-plan/scripts/integration.py +28 -8
- package/skills/gsd-path-plan/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-plan/scripts/review_panel.py +11 -0
- package/skills/gsd-path-plan/scripts/roadmap.py +5 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-plan/scripts/state_promote.py +5 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +12 -1
- 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 +2 -0
- package/skills/gsd-path-research/references/dispatch.md +6 -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 +20 -6
- package/skills/gsd-path-research/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-research/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-research/scripts/detect_project.py +11 -1
- package/skills/gsd-path-research/scripts/discussion_records.py +3 -0
- package/skills/gsd-path-research/scripts/discussion_validate.py +8 -3
- package/skills/gsd-path-research/scripts/integration.py +28 -8
- package/skills/gsd-path-research/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-research/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-research/scripts/review_panel.py +11 -0
- package/skills/gsd-path-research/scripts/roadmap.py +5 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-research/scripts/state_promote.py +5 -0
- package/skills/gsd-path-research/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-roadmap/SKILL.md +2 -0
- package/skills/gsd-path-roadmap/references/dispatch.md +6 -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 +20 -6
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-roadmap/scripts/detect_project.py +11 -1
- 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 +28 -8
- package/skills/gsd-path-roadmap/scripts/isolation.py +15 -5
- 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 +4 -1
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-roadmap/scripts/review_panel.py +11 -0
- package/skills/gsd-path-roadmap/scripts/roadmap.py +5 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-roadmap/scripts/state_promote.py +5 -0
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +94 -0
- package/skills/gsd-path-ship/SKILL.md +24 -13
- package/skills/gsd-path-ship/references/dispatch.md +6 -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-panel.md +1 -1
- package/skills/gsd-path-ship/references/reviewer.md +2 -0
- 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 +20 -6
- package/skills/gsd-path-ship/scripts/build_recovery.py +5 -0
- package/skills/gsd-path-ship/scripts/build_state.py +2 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +6 -0
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +3 -0
- package/skills/gsd-path-ship/scripts/detect_project.py +11 -1
- 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 +28 -8
- package/skills/gsd-path-ship/scripts/isolation.py +15 -5
- package/skills/gsd-path-ship/scripts/jev_review.py +138 -0
- package/skills/gsd-path-ship/scripts/lean_verification.py +2 -0
- 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 +4 -1
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +3 -0
- package/skills/gsd-path-ship/scripts/review_panel.py +11 -0
- package/skills/gsd-path-ship/scripts/roadmap.py +5 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +5 -0
- package/skills/gsd-path-ship/scripts/state_promote.py +5 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +12 -1
- package/skills/gsd-path-ship/scripts/worktree_paths.py +94 -0
- 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 +3 -0
- 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 +7 -0
- package/skills/path/DECIDE.md +2 -0
- package/skills/path/DEFINE.md +13 -7
- package/skills/path/DOCS-AUDIT.md +2 -0
- package/skills/path/INSPECT.md +2 -0
- package/skills/path/PLAN.md +4 -2
- package/skills/path/RESEARCH.md +2 -0
- package/skills/path/ROADMAP.md +2 -0
- package/skills/path/SHIP.md +24 -13
- package/skills/path/SKILL.md +23 -9
- package/skills/path/references/build-native.md +15 -7
- package/skills/path/references/config.md +57 -0
- package/skills/path/references/dispatch.md +6 -19
- package/skills/path/references/jev-review.md +82 -0
- package/skills/path/references/model-policy.md +139 -0
- package/skills/path/references/reviewer-panel.md +1 -1
- package/skills/path/references/reviewer.md +2 -0
- package/skills/path/references/runtime-selection.md +25 -0
- package/skills/path/scripts/_common.py +5 -0
- package/skills/path/scripts/archive_milestone.py +20 -6
- package/skills/path/scripts/bootstrap_repository.py +8 -1
- package/skills/path/scripts/build_recovery.py +5 -0
- package/skills/path/scripts/build_state.py +2 -0
- package/skills/path/scripts/check_docs_audit.py +2 -0
- package/skills/path/scripts/check_handoffs.py +6 -0
- package/skills/path/scripts/check_task_briefs.py +3 -0
- package/skills/path/scripts/detect_project.py +11 -1
- 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 +230 -21
- package/skills/path/scripts/git_guard.py +768 -0
- package/skills/path/scripts/integration.py +28 -8
- package/skills/path/scripts/isolation.py +15 -5
- package/skills/path/scripts/jev_review.py +138 -0
- package/skills/path/scripts/lean_verification.py +2 -0
- 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 +4 -1
- package/skills/path/scripts/promote_lookahead.py +3 -0
- package/skills/path/scripts/review_panel.py +11 -0
- package/skills/path/scripts/roadmap.py +5 -0
- package/skills/path/scripts/state_checkpoint.py +5 -0
- package/skills/path/scripts/state_promote.py +5 -0
- package/skills/path/scripts/status_runtime.py +208 -0
- package/skills/path/scripts/workflow_run.py +12 -1
- 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/gsd-path/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/discussion_records.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/integration.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/loop_run.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/review_findings.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/task_context.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/workflow_run.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-decide/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-define/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-docs-audit/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-forensics/scripts/__pycache__/pipeline_undo.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-research/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-roadmap/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/archive_milestone.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/build_recovery.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/build_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/check_task_briefs.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/detect_project.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/discussion_validate.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/isolation.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/pipeline_git.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/pipeline_state.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/review_panel.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/roadmap.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/state_checkpoint.cpython-312.pyc +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# gsd-path project runtime
|
|
3
|
+
"""Show and edit Path preferences without advancing a pipeline phase."""
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import re
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
sys.dont_write_bytecode = True
|
|
12
|
+
|
|
13
|
+
ROLES = ('coder', 'reviewer', 'review_panel', 'skeptic', 'inspect_codebase',
|
|
14
|
+
'inspect_docs', 'docs_audit', 'research', 'decide', 'roadmap', 'plan', 'plan_patch')
|
|
15
|
+
HOSTS = ('codex', 'claude', 'grok', 'opencode', 'copilot', 'qwen', 'antigravity',
|
|
16
|
+
'cursor', 'zed', 'kiro', 'kimi')
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def sibling(name):
|
|
20
|
+
import importlib
|
|
21
|
+
return importlib.import_module(f'{__package__}.{name}' if __package__ else name)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def safe_path(path):
|
|
25
|
+
# Resolve host aliases (macOS /var) at the repo/home boundary, not here.
|
|
26
|
+
for item in (path, path.parent):
|
|
27
|
+
if item.is_symlink():
|
|
28
|
+
raise ValueError(f'unsafe symlink: {item}')
|
|
29
|
+
if path.exists() and (not path.is_file() or path.stat().st_nlink != 1):
|
|
30
|
+
raise ValueError(f'expected a regular unlinked file: {path}')
|
|
31
|
+
return path
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def read_object(path):
|
|
35
|
+
safe_path(path)
|
|
36
|
+
if not path.exists():
|
|
37
|
+
return {}
|
|
38
|
+
value = json.loads(path.read_text(encoding='utf-8'))
|
|
39
|
+
if not isinstance(value, dict):
|
|
40
|
+
raise ValueError(f'{path} must contain an object')
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def user_path():
|
|
45
|
+
return Path.home().resolve() / '.gsd-path/config.json'
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def model_key(key):
|
|
49
|
+
bits = key.split('.')
|
|
50
|
+
if len(bits) == 4 and bits[:2] == ['models', 'roles']:
|
|
51
|
+
role, field = bits[2:]
|
|
52
|
+
elif len(bits) == 5 and bits[:2] == ['models', 'hosts'] and bits[2] in HOSTS:
|
|
53
|
+
role, field = bits[3:]
|
|
54
|
+
else:
|
|
55
|
+
raise ValueError(f'unknown setting: {key}')
|
|
56
|
+
if role not in ROLES or field not in ('model', 'effort'):
|
|
57
|
+
raise ValueError(f'unknown setting: {key}')
|
|
58
|
+
return bits
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def flatten(data, prefix=''):
|
|
62
|
+
result = {}
|
|
63
|
+
for key, value in data.items():
|
|
64
|
+
name = f'{prefix}.{key}' if prefix else key
|
|
65
|
+
if isinstance(value, dict):
|
|
66
|
+
result.update(flatten(value, name))
|
|
67
|
+
else:
|
|
68
|
+
result[name] = value
|
|
69
|
+
return result
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def validate_value(key, value):
|
|
73
|
+
if not isinstance(value, str) or not value or value != value.strip():
|
|
74
|
+
raise ValueError(f'{key} requires a nonempty string')
|
|
75
|
+
if key == 'integration':
|
|
76
|
+
if value not in ('direct', 'pull-request'):
|
|
77
|
+
raise ValueError('integration must be direct or pull-request')
|
|
78
|
+
elif key == 'review_panel':
|
|
79
|
+
if any(char.isspace() for char in value):
|
|
80
|
+
raise ValueError('use off, detected, or comma-separated families without spaces')
|
|
81
|
+
sibling('review_panel').parse_review_panel_value(value)
|
|
82
|
+
else:
|
|
83
|
+
model_key(key)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def validate_models(data):
|
|
87
|
+
if not isinstance(data, dict) or set(data) - {'roles', 'hosts'}:
|
|
88
|
+
raise ValueError('models must contain roles and/or hosts')
|
|
89
|
+
for group, entries in data.items():
|
|
90
|
+
if not isinstance(entries, dict):
|
|
91
|
+
raise ValueError(f'models.{group} must be an object')
|
|
92
|
+
groups = [('roles', entries)] if group == 'roles' else [(f'hosts.{host}', roles) for host, roles in entries.items()]
|
|
93
|
+
for prefix, roles in groups:
|
|
94
|
+
if not isinstance(roles, dict) or (prefix.startswith('hosts.') and prefix[6:] not in HOSTS):
|
|
95
|
+
raise ValueError(f'unknown or malformed model group: {prefix}')
|
|
96
|
+
for role, fields in roles.items():
|
|
97
|
+
if role not in ROLES or not isinstance(fields, dict):
|
|
98
|
+
raise ValueError(f'unknown or malformed role: {role}')
|
|
99
|
+
for field, value in fields.items():
|
|
100
|
+
validate_value(f'models.{prefix}.{role}.{field}', value)
|
|
101
|
+
return data
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def preferences(path, user=False):
|
|
105
|
+
data = read_object(path)
|
|
106
|
+
allowed = {'integration', 'review_panel', 'models'} if user else {'review_panel'}
|
|
107
|
+
if set(data) - allowed:
|
|
108
|
+
raise ValueError(f'{path}: unknown setting')
|
|
109
|
+
for key, value in data.items():
|
|
110
|
+
if key == 'models':
|
|
111
|
+
validate_models(value)
|
|
112
|
+
else:
|
|
113
|
+
validate_value(key, value)
|
|
114
|
+
return data
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def user_defaults():
|
|
118
|
+
return preferences(user_path(), user=True)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def initial_state(text):
|
|
122
|
+
mode = user_defaults().get('integration', 'direct')
|
|
123
|
+
for key in ('integration_default', 'integration'):
|
|
124
|
+
text = re.sub(rf'(?m)^{key}: direct\b', f'{key}: {mode}', text)
|
|
125
|
+
return text
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def show(repo, scope='project'):
|
|
129
|
+
defaults = user_defaults()
|
|
130
|
+
values = {'integration': {'value': defaults.get('integration', 'direct'),
|
|
131
|
+
'source': str(user_path()) if 'integration' in defaults else 'built-in'},
|
|
132
|
+
'review_panel': {'value': defaults.get('review_panel', 'off'),
|
|
133
|
+
'source': str(user_path()) if 'review_panel' in defaults else 'built-in'}}
|
|
134
|
+
models = {key: {'value': value, 'source': str(user_path())}
|
|
135
|
+
for key, value in flatten(defaults.get('models', {}), 'models').items()}
|
|
136
|
+
result = {'scope': scope, 'settings': values, 'models': models, 'roles': ROLES,
|
|
137
|
+
'hosts': HOSTS, 'locked': None, 'approved_review_panel': None}
|
|
138
|
+
if scope == 'project':
|
|
139
|
+
state_api = sibling('pipeline_state')
|
|
140
|
+
repo = state_api._repo_root(repo)
|
|
141
|
+
state, text, path = state_api.load_state(repo)
|
|
142
|
+
config = repo / '.project/config.json'
|
|
143
|
+
local = preferences(config)
|
|
144
|
+
if 'review_panel' in local:
|
|
145
|
+
values['review_panel'] = {'value': local['review_panel'], 'source': str(config)}
|
|
146
|
+
policy_path = repo / '.project/model-policy.json'
|
|
147
|
+
policy = validate_models(read_object(policy_path))
|
|
148
|
+
models.update({key: {'value': value, 'source': str(policy_path)}
|
|
149
|
+
for key, value in flatten(policy, 'models').items()})
|
|
150
|
+
values['integration'] = {'value': state.integration_default, 'source': str(path),
|
|
151
|
+
'current': state.integration, 'current_source': state.integration_source}
|
|
152
|
+
locked = state.phase in ('build', 'ship', 'shipped') or sibling('build_recovery').context(repo, text)
|
|
153
|
+
values['integration']['locked'] = 'Shipping mode is locked when build starts.' if locked else None
|
|
154
|
+
if state.phase in ('ship', 'shipped') or state.archive:
|
|
155
|
+
result['locked'] = 'Project settings are locked during ship and after shipment.'
|
|
156
|
+
panel = sibling('review_panel')
|
|
157
|
+
paths = [repo / '.project/plan/PLAN.md', repo / '.project/intent/INTENT.md', repo / '.project/CHARTER.md']
|
|
158
|
+
texts = [p.read_text(encoding='utf-8') if safe_path(p).exists() else None for p in paths]
|
|
159
|
+
approved = panel.parse_sources(*texts)
|
|
160
|
+
result['approved_review_panel'] = {'value': ','.join(approved['families']) if approved['mode'] == 'named' else approved['mode'],
|
|
161
|
+
'source': approved['source']}
|
|
162
|
+
return result
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def set_value(repo, scope, key, value, reset=False):
|
|
166
|
+
repo = repo.resolve()
|
|
167
|
+
if not reset:
|
|
168
|
+
validate_value(key, value)
|
|
169
|
+
elif key not in ('integration', 'review_panel'):
|
|
170
|
+
model_key(key)
|
|
171
|
+
current = show(repo, scope)
|
|
172
|
+
if current['locked']:
|
|
173
|
+
raise ValueError(current['locked'])
|
|
174
|
+
if scope == 'project':
|
|
175
|
+
state, _, _ = sibling('pipeline_state').load_state(repo)
|
|
176
|
+
branch = subprocess.run(['git', '-C', str(repo), 'branch', '--show-current'],
|
|
177
|
+
capture_output=True, text=True)
|
|
178
|
+
if branch.returncode or not state.branch or branch.stdout.strip() != state.branch:
|
|
179
|
+
raise ValueError('Run the router to bind the project branch before editing settings.')
|
|
180
|
+
head = subprocess.run(['git', '-C', str(repo), 'rev-parse', '--verify', 'HEAD'], capture_output=True)
|
|
181
|
+
if head.returncode == 0:
|
|
182
|
+
closed = subprocess.run([sys.executable, '-B', str(Path(__file__).with_name('git_guard.py')),
|
|
183
|
+
'closed-milestone'], cwd=repo, capture_output=True, text=True)
|
|
184
|
+
if closed.returncode:
|
|
185
|
+
raise ValueError(closed.stderr.strip() or 'Cannot verify the milestone branch is open.')
|
|
186
|
+
if scope == 'project' and key == 'integration':
|
|
187
|
+
if reset:
|
|
188
|
+
raise ValueError('choose an explicit project shipping mode')
|
|
189
|
+
sibling('pipeline_state').configure_integration(repo, 'default', value)
|
|
190
|
+
return show(repo, scope)
|
|
191
|
+
path = user_path() if scope == 'user' else repo / '.project' / ('model-policy.json' if key.startswith('models.') else 'config.json')
|
|
192
|
+
safe_path(path)
|
|
193
|
+
safe_path(path.with_name(f'.{path.name}.lock'))
|
|
194
|
+
lock = (sibling('pipeline_state')._state_lock(repo / '.project') if scope == 'project'
|
|
195
|
+
else sibling('loop_run').log_lock({'log': str(path)}))
|
|
196
|
+
with lock:
|
|
197
|
+
current = show(repo, scope)
|
|
198
|
+
if current['locked']:
|
|
199
|
+
raise ValueError(current['locked'])
|
|
200
|
+
data = read_object(path)
|
|
201
|
+
bits = key.split('.')
|
|
202
|
+
if scope == 'project' and bits[0] == 'models':
|
|
203
|
+
bits = bits[1:]
|
|
204
|
+
node = data
|
|
205
|
+
for bit in bits[:-1]:
|
|
206
|
+
node = node.setdefault(bit, {})
|
|
207
|
+
if reset:
|
|
208
|
+
node.pop(bits[-1], None)
|
|
209
|
+
else:
|
|
210
|
+
node[bits[-1]] = value
|
|
211
|
+
safe_path(path)
|
|
212
|
+
safe_path(path.with_name(f'.{path.name}.gsd-path-tmp'))
|
|
213
|
+
sibling('_common').atomic_write(path, json.dumps(data, indent=2, sort_keys=True) + '\n')
|
|
214
|
+
return show(repo, scope)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def main():
|
|
218
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
219
|
+
parser.add_argument('action', choices=('show', 'validate', 'set', 'reset'))
|
|
220
|
+
parser.add_argument('key', nargs='?')
|
|
221
|
+
parser.add_argument('value', nargs='?')
|
|
222
|
+
parser.add_argument('--scope', choices=('user', 'project'), default='project')
|
|
223
|
+
parser.add_argument('--repo', type=Path, default=Path.cwd())
|
|
224
|
+
args = parser.parse_args()
|
|
225
|
+
try:
|
|
226
|
+
declaration = args.repo / '.gsd-path/runtime.json'
|
|
227
|
+
if args.scope == 'project' and (declaration.exists() or declaration.is_symlink()):
|
|
228
|
+
runtime = sibling('status_runtime').resolve_runtime(args.repo.resolve())
|
|
229
|
+
helper = runtime / 'path_config.py'
|
|
230
|
+
if not helper.is_file():
|
|
231
|
+
raise ValueError('Update the selected project runtime to use Path settings.')
|
|
232
|
+
if helper.resolve() != Path(__file__).resolve():
|
|
233
|
+
return subprocess.call([sys.executable, '-B', str(helper), *sys.argv[1:]])
|
|
234
|
+
if args.action in ('set', 'reset'):
|
|
235
|
+
if not args.key or (args.action == 'set' and args.value is None):
|
|
236
|
+
raise ValueError('set requires KEY VALUE; reset requires KEY')
|
|
237
|
+
result = set_value(args.repo, args.scope, args.key, args.value, args.action == 'reset')
|
|
238
|
+
else:
|
|
239
|
+
result = show(args.repo, args.scope)
|
|
240
|
+
print(json.dumps(result))
|
|
241
|
+
return 0
|
|
242
|
+
except (OSError, ValueError, RuntimeError) as error:
|
|
243
|
+
print(json.dumps({'error': str(error)}))
|
|
244
|
+
return 2
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
if __name__ == '__main__':
|
|
248
|
+
raise SystemExit(main())
|
|
@@ -19,6 +19,9 @@ import shutil
|
|
|
19
19
|
import stat
|
|
20
20
|
import subprocess
|
|
21
21
|
import sys
|
|
22
|
+
|
|
23
|
+
# Runtime helpers must not modify their immutable installation.
|
|
24
|
+
sys.dont_write_bytecode = True
|
|
22
25
|
from dataclasses import asdict, dataclass
|
|
23
26
|
from datetime import date
|
|
24
27
|
from pathlib import Path, PurePosixPath
|
|
@@ -615,7 +618,7 @@ def _completion_status(repo: Path, state: Mapping[str, object], project_dir: str
|
|
|
615
618
|
import integration
|
|
616
619
|
try:
|
|
617
620
|
proof = integration.validate_integrated(
|
|
618
|
-
repo, str(state.get("milestone") or ""), refresh=False)
|
|
621
|
+
repo, str(state.get("milestone") or ""), refresh=False, historical=True)
|
|
619
622
|
except (integration.ArchiveError, OSError) as error:
|
|
620
623
|
return {"status": "unverified", "reason": str(error)}
|
|
621
624
|
return {"status": "verified", "proof": proof}
|
|
@@ -15,6 +15,9 @@ import argparse
|
|
|
15
15
|
import json
|
|
16
16
|
import re
|
|
17
17
|
import sys
|
|
18
|
+
|
|
19
|
+
# Runtime helpers must not modify their immutable installation.
|
|
20
|
+
sys.dont_write_bytecode = True
|
|
18
21
|
from pathlib import Path
|
|
19
22
|
from typing import Iterable, Optional, Sequence
|
|
20
23
|
|
|
@@ -214,6 +217,7 @@ def resolve_panel(
|
|
|
214
217
|
advertised: Sequence[str],
|
|
215
218
|
parent_family: Optional[str] = None,
|
|
216
219
|
parent_slug: Optional[str] = None,
|
|
220
|
+
excluded_families: Sequence[str] = (),
|
|
217
221
|
) -> dict:
|
|
218
222
|
inferred_parent = parent_family or (
|
|
219
223
|
family_of_slug(parent_slug) if parent_slug else None
|
|
@@ -244,7 +248,12 @@ def resolve_panel(
|
|
|
244
248
|
"named review_panel families are not advertised: " + ", ".join(missing)
|
|
245
249
|
)
|
|
246
250
|
|
|
251
|
+
if config["mode"] == "named" and set(wanted) & set(excluded_families):
|
|
252
|
+
raise ReviewPanelError("named review_panel must use an independent family")
|
|
247
253
|
for family in wanted:
|
|
254
|
+
if family in excluded_families:
|
|
255
|
+
skipped.append({"family": family, "reason": "excluded reviewer family"})
|
|
256
|
+
continue
|
|
248
257
|
if family == inferred_parent:
|
|
249
258
|
skipped.append({"family": family, "reason": "parent family"})
|
|
250
259
|
continue
|
|
@@ -488,6 +497,7 @@ def parser() -> argparse.ArgumentParser:
|
|
|
488
497
|
result.add_argument("--advertised", default="")
|
|
489
498
|
result.add_argument("--parent-family")
|
|
490
499
|
result.add_argument("--parent-slug")
|
|
500
|
+
result.add_argument("--exclude-family", action="append", choices=KNOWN_FAMILIES, default=[])
|
|
491
501
|
result.add_argument("--kind", choices=("plan", "wave"))
|
|
492
502
|
result.add_argument("--inputs", default="")
|
|
493
503
|
result.add_argument("--output", type=Path)
|
|
@@ -541,6 +551,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
|
541
551
|
split_csv(arguments.advertised),
|
|
542
552
|
arguments.parent_family,
|
|
543
553
|
arguments.parent_slug,
|
|
554
|
+
arguments.exclude_family,
|
|
544
555
|
)
|
|
545
556
|
return emit(resolved)
|
|
546
557
|
except ReviewPanelError as error:
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
"""Interpret Roadmap text for selection, approval, promotion and milestone close."""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
# Runtime helpers must not modify their immutable installation.
|
|
9
|
+
sys.dont_write_bytecode = True
|
|
10
|
+
|
|
6
11
|
import re
|
|
7
12
|
from typing import Optional
|
|
8
13
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import argparse
|
|
5
5
|
import hashlib
|
|
6
6
|
import json
|
|
7
|
+
import os
|
|
7
8
|
import subprocess
|
|
8
9
|
import sys
|
|
9
10
|
import tempfile
|
|
@@ -28,9 +29,10 @@ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str =
|
|
|
28
29
|
steps = []
|
|
29
30
|
outputs = {}
|
|
30
31
|
scripts = Path(__file__).resolve().parent
|
|
32
|
+
helpers = scripts
|
|
31
33
|
|
|
32
34
|
def step(script, *arguments, raw=False):
|
|
33
|
-
command = [sys.executable, "-B", str(
|
|
35
|
+
command = [sys.executable, "-B", str(helpers / script), *arguments]
|
|
34
36
|
completed = subprocess.run(command, cwd=repo, capture_output=True, text=True)
|
|
35
37
|
receipt = {"script": script, "command": command, "exit_code": completed.returncode,
|
|
36
38
|
"stdout": completed.stdout, "stderr": completed.stderr}
|
|
@@ -49,6 +51,15 @@ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str =
|
|
|
49
51
|
|
|
50
52
|
common = ["--repo", str(repo), "--project-dir", project_dir]
|
|
51
53
|
try:
|
|
54
|
+
if os.path.lexists(repo / ".gsd-path/runtime.json"):
|
|
55
|
+
resolved = subprocess.run(
|
|
56
|
+
[sys.executable, "-B", str(repo / ".gsd-path/status_runtime.py"),
|
|
57
|
+
"--repo", str(repo), "--runtime-path"],
|
|
58
|
+
cwd=repo, capture_output=True, text=True)
|
|
59
|
+
if resolved.returncode:
|
|
60
|
+
sys.stderr.write(resolved.stderr)
|
|
61
|
+
raise StepFailed(resolved.stderr.strip())
|
|
62
|
+
helpers = Path(resolved.stdout.strip())
|
|
52
63
|
if action == "route":
|
|
53
64
|
step("pipeline_state.py", "route", *common)
|
|
54
65
|
elif action == "prepare-inspect":
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# gsd-path project runtime
|
|
3
|
+
"""Placement shared by task isolation, verification, and integration."""
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
# Runtime helpers must not modify their immutable installation.
|
|
8
|
+
sys.dont_write_bytecode = True
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import os
|
|
13
|
+
import tempfile
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
import _common
|
|
18
|
+
except ImportError:
|
|
19
|
+
from scripts import _common
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _git(primary: Path, *args: str) -> str:
|
|
23
|
+
result = _common.run_git(primary, *args)
|
|
24
|
+
if result.returncode:
|
|
25
|
+
raise ValueError(result.stderr.strip() or "cannot inspect worktree placement")
|
|
26
|
+
return result.stdout.rstrip("\n")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _identity(path: Path) -> str:
|
|
30
|
+
return hashlib.sha256(os.fsencode(path)).hexdigest()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _workspace(primary: Path, pin: bool) -> Path:
|
|
34
|
+
common = Path(_git(primary, "rev-parse", "--git-common-dir"))
|
|
35
|
+
common = (primary / common).resolve()
|
|
36
|
+
identity = _identity(primary)
|
|
37
|
+
receipt = common / "gsd-path" / "workspaces" / f"{identity}.json"
|
|
38
|
+
try:
|
|
39
|
+
data = json.loads(receipt.read_text(encoding="utf-8"))
|
|
40
|
+
except FileNotFoundError:
|
|
41
|
+
pass
|
|
42
|
+
else:
|
|
43
|
+
if (not isinstance(data, dict) or data.get("primary") != str(primary)
|
|
44
|
+
or not isinstance(data.get("root"), str)
|
|
45
|
+
or not Path(data["root"]).is_absolute()):
|
|
46
|
+
raise ValueError(f"invalid worktree placement receipt: {receipt}")
|
|
47
|
+
return Path(data["root"])
|
|
48
|
+
|
|
49
|
+
root = Path(os.environ.get("GSD_PATH_WORKTREE_ROOT") or Path.home() / ".gsd-path" / "projects").expanduser()
|
|
50
|
+
if not root.is_absolute():
|
|
51
|
+
raise ValueError("GSD_PATH_WORKTREE_ROOT must be absolute")
|
|
52
|
+
root = root.resolve()
|
|
53
|
+
parent = root
|
|
54
|
+
while not parent.exists():
|
|
55
|
+
parent = parent.parent
|
|
56
|
+
ancestor = _common.run_git(parent, "rev-parse", "--git-common-dir")
|
|
57
|
+
same_repository = (
|
|
58
|
+
ancestor.returncode == 0
|
|
59
|
+
and (parent / ancestor.stdout.strip()).resolve() == common
|
|
60
|
+
)
|
|
61
|
+
if root.is_relative_to(primary) or same_repository:
|
|
62
|
+
raise ValueError(f"managed worktree root must be outside this repository's worktrees: {root}")
|
|
63
|
+
workspace = root / _identity(common) / identity
|
|
64
|
+
if pin:
|
|
65
|
+
receipt.parent.mkdir(parents=True, exist_ok=True)
|
|
66
|
+
fd, temporary = tempfile.mkstemp(dir=receipt.parent)
|
|
67
|
+
try:
|
|
68
|
+
with os.fdopen(fd, "w", encoding="utf-8") as handle:
|
|
69
|
+
json.dump({"primary": str(primary), "root": str(workspace)}, handle)
|
|
70
|
+
try:
|
|
71
|
+
os.link(temporary, receipt)
|
|
72
|
+
except FileExistsError:
|
|
73
|
+
return _workspace(primary, False)
|
|
74
|
+
finally:
|
|
75
|
+
os.unlink(temporary)
|
|
76
|
+
return workspace
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
|
|
80
|
+
primary = primary.resolve()
|
|
81
|
+
if kind not in {"task", "verify", "integrate"} or not name or Path(name).name != name or name in {".", ".."}:
|
|
82
|
+
raise ValueError("invalid managed worktree kind or name")
|
|
83
|
+
legacy = (primary.parent / f".{primary.name}-gsd-path-integrate-{name}"
|
|
84
|
+
if kind == "integrate" else primary.parent / f"{primary.name}.gsd-path" / kind / name)
|
|
85
|
+
branch = f"refs/heads/gsd-path-{kind}/{name}"
|
|
86
|
+
records = _git(primary, "worktree", "list", "--porcelain", "-z").split("\0\0")
|
|
87
|
+
for record in records:
|
|
88
|
+
fields = record.split("\0")
|
|
89
|
+
if f"worktree {legacy}" in fields and f"branch {branch}" in fields:
|
|
90
|
+
return legacy
|
|
91
|
+
# Keep collision checks and missing-directory recovery at the old location.
|
|
92
|
+
if os.path.lexists(legacy):
|
|
93
|
+
return legacy
|
|
94
|
+
return _workspace(primary, pin) / kind / name
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Skeptic — wave <N>, cycle <C>
|
|
2
2
|
|
|
3
3
|
<!-- Written by one finding-skeptic child. Advisory to fix-task batching
|
|
4
|
-
only: the
|
|
4
|
+
only: the canonical reviewer owns Wave verdict. -->
|
|
5
5
|
|
|
6
6
|
- Criterion: <the failed criterion, verbatim from the lens file>
|
|
7
7
|
- Criterion locator: <t001_ac2 | t001_files | sc3>
|
|
@@ -8,6 +8,8 @@ agent: null # orchestrator-owned: set at dispatch
|
|
|
8
8
|
base: null # orchestrator-owned: clean layer SHA for isolated Verify
|
|
9
9
|
worktree: null # orchestrator-owned: isolated task worktree while active
|
|
10
10
|
task_branch: null # orchestrator-owned: gsd-path-task/<id> while parallel; null when serial
|
|
11
|
+
# Optional explicit dispatch overrides: model: <advertised slug|inherit>
|
|
12
|
+
# effort: <advertised effort|inherit>
|
|
11
13
|
files: # every file this task may touch — dispatch checks overlap
|
|
12
14
|
- <path>
|
|
13
15
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Panel — wave <N>, cycle <C>
|
|
2
2
|
|
|
3
|
-
<!-- Written by one review-panel child. Advisory only: the
|
|
3
|
+
<!-- Written by one review-panel child. Advisory only: the canonical reviewer
|
|
4
4
|
owns Wave verdict. Kind criterion may be presented to the user when
|
|
5
5
|
Severity is high; preference stays a warning. -->
|
|
6
6
|
|
|
@@ -3,6 +3,8 @@ name: gsd-path-decide
|
|
|
3
3
|
description: Decide implementation direction from approved intent and complete research evidence, recording settled choices in SYNTHESIS.md. Use only when the user explicitly invokes $gsd-path-decide or an active $gsd-path router explicitly routes to this phase.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
Before executing project helpers, read [runtime selection](references/runtime-selection.md).
|
|
7
|
+
|
|
6
8
|
# GSD Path Decide Phase
|
|
7
9
|
|
|
8
10
|
Dispatch one reasoning-intensive decider and validate its decision artifact.
|
|
@@ -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
|