@opengsd/gsd-path 1.3.1 → 1.4.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 +2 -207
- package/CHANGELOG.md +281 -0
- package/DOCS.md +13 -7
- package/FULL.md +9 -3
- package/GUIDE.md +1 -1
- package/HOOKS.md +9 -6
- package/QUICK.md +4 -1
- package/README.md +63 -11
- package/RUNTIME.md +1 -1
- package/UPDATE.md +57 -8
- package/WORKFLOW.md +22 -6
- package/package.json +9 -8
- package/scripts/_common.py +472 -19
- package/scripts/archive_milestone.py +146 -73
- package/scripts/bootstrap_repository.py +8 -5
- package/scripts/build_recovery.py +4 -1
- package/scripts/build_state.py +66 -23
- package/scripts/check_docs_audit.py +14 -3
- package/scripts/check_handoffs.py +116 -20
- package/scripts/check_task_briefs.py +60 -8
- package/scripts/check_update.py +2 -2
- package/scripts/core_hook_gate.py +10 -1
- package/scripts/core_hook_settings.py +11 -4
- package/scripts/detect_project.py +345 -15
- package/scripts/discussion_records.py +19 -13
- package/scripts/discussion_validate.py +66 -21
- package/scripts/dispatch_driver.py +111 -26
- package/scripts/git_guard.py +116 -29
- package/scripts/guard_hook.py +151 -29
- package/scripts/install.mjs +54 -38
- package/scripts/install.py +562 -41
- package/scripts/integration.py +434 -24
- package/scripts/isolation.py +1077 -28
- package/scripts/lean_verification.py +99 -19
- package/scripts/loop_run.py +20 -30
- package/scripts/members.py +704 -0
- package/scripts/migrate_core.py +2 -2
- package/scripts/path_config.py +2 -2
- package/scripts/pipeline_diagnose.py +82 -31
- package/scripts/pipeline_git.py +61 -22
- package/scripts/pipeline_state.py +176 -54
- package/scripts/pipeline_undo.py +117 -22
- package/scripts/promote_lookahead.py +1 -1
- package/scripts/review_panel.py +1 -1
- package/scripts/runtime_store.py +35 -9
- package/scripts/skill-resources.json +28 -3
- package/scripts/state_checkpoint.py +140 -31
- package/scripts/state_promote.py +2 -0
- package/scripts/status_runtime.py +36 -6
- package/scripts/sync_skill_resources.py +8 -7
- package/scripts/token_budget.py +12 -8
- package/scripts/workflow_run.py +103 -29
- package/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path/BUILD.md +7 -1
- package/skills/gsd-path/DECIDE.md +11 -4
- package/skills/gsd-path/DEFINE.md +8 -1
- package/skills/gsd-path/DOCS-AUDIT.md +6 -4
- package/skills/gsd-path/INSPECT.md +5 -4
- package/skills/gsd-path/PLAN.md +7 -1
- package/skills/gsd-path/RESEARCH.md +2 -1
- package/skills/gsd-path/ROADMAP.md +2 -1
- package/skills/gsd-path/SHIP.md +27 -10
- package/skills/gsd-path/SKILL.md +45 -1
- package/skills/gsd-path/references/build-native.md +47 -14
- package/skills/gsd-path/references/codebase-mapper.md +2 -1
- package/skills/gsd-path/references/docs-auditor.md +2 -1
- package/skills/gsd-path/references/operating-rules.md +214 -0
- package/skills/gsd-path/references/planner.md +8 -0
- package/skills/gsd-path/references/reviewer-wave.md +3 -1
- 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 +472 -19
- package/skills/gsd-path/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path/scripts/bootstrap_repository.py +8 -5
- package/skills/gsd-path/scripts/build_recovery.py +4 -1
- package/skills/gsd-path/scripts/build_state.py +66 -23
- package/skills/gsd-path/scripts/check_docs_audit.py +14 -3
- package/skills/gsd-path/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path/scripts/check_update.py +2 -2
- package/skills/gsd-path/scripts/detect_project.py +345 -15
- package/skills/gsd-path/scripts/discussion_records.py +19 -13
- package/skills/gsd-path/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path/scripts/dispatch_driver.py +111 -26
- package/skills/gsd-path/scripts/git_guard.py +116 -29
- package/skills/gsd-path/scripts/integration.py +434 -24
- package/skills/gsd-path/scripts/isolation.py +1077 -28
- package/skills/gsd-path/scripts/lean_verification.py +99 -19
- package/skills/gsd-path/scripts/loop_run.py +20 -30
- package/skills/gsd-path/scripts/members.py +704 -0
- package/skills/gsd-path/scripts/path_config.py +2 -2
- package/skills/gsd-path/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path/scripts/review_panel.py +1 -1
- package/skills/gsd-path/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path/scripts/state_promote.py +2 -0
- package/skills/gsd-path/scripts/status_runtime.py +36 -6
- package/skills/gsd-path/scripts/token_budget.py +12 -8
- package/skills/gsd-path/scripts/workflow_run.py +103 -29
- package/skills/gsd-path/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path/templates/codebase.md +1 -1
- package/skills/gsd-path/templates/docs-audit.md +1 -1
- package/skills/gsd-path/templates/final-review.md +5 -2
- package/skills/gsd-path/templates/gap-review.md +2 -1
- package/skills/gsd-path/templates/task.md +1 -0
- package/skills/gsd-path/templates/wave-review.md +3 -1
- package/skills/gsd-path-build/SKILL.md +7 -1
- package/skills/gsd-path-build/references/build-native.md +47 -14
- package/skills/gsd-path-build/references/operating-rules.md +214 -0
- package/skills/gsd-path-build/references/reviewer-wave.md +3 -1
- 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 +472 -19
- package/skills/gsd-path-build/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-build/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-build/scripts/build_state.py +66 -23
- package/skills/gsd-path-build/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-build/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-build/scripts/detect_project.py +345 -15
- package/skills/gsd-path-build/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-build/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-build/scripts/dispatch_driver.py +111 -26
- package/skills/gsd-path-build/scripts/integration.py +434 -24
- package/skills/gsd-path-build/scripts/isolation.py +1077 -28
- package/skills/gsd-path-build/scripts/loop_run.py +20 -30
- package/skills/gsd-path-build/scripts/members.py +704 -0
- package/skills/gsd-path-build/scripts/path_config.py +2 -2
- package/skills/gsd-path-build/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-build/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-build/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-build/scripts/review_panel.py +1 -1
- package/skills/gsd-path-build/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-build/scripts/state_promote.py +2 -0
- package/skills/gsd-path-build/scripts/token_budget.py +12 -8
- package/skills/gsd-path-build/scripts/workflow_run.py +103 -29
- package/skills/gsd-path-build/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-build/templates/task.md +1 -0
- package/skills/gsd-path-build/templates/wave-review.md +3 -1
- package/skills/gsd-path-decide/SKILL.md +11 -4
- package/skills/gsd-path-decide/references/operating-rules.md +214 -0
- package/skills/gsd-path-decide/scripts/_common.py +472 -19
- package/skills/gsd-path-decide/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-decide/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-decide/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-decide/scripts/detect_project.py +345 -15
- package/skills/gsd-path-decide/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-decide/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-decide/scripts/integration.py +434 -24
- package/skills/gsd-path-decide/scripts/isolation.py +1077 -28
- package/skills/gsd-path-decide/scripts/loop_run.py +20 -30
- package/skills/gsd-path-decide/scripts/members.py +704 -0
- package/skills/gsd-path-decide/scripts/path_config.py +2 -2
- package/skills/gsd-path-decide/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-decide/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-decide/scripts/review_panel.py +1 -1
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-decide/scripts/state_promote.py +2 -0
- package/skills/gsd-path-decide/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-define/SKILL.md +8 -1
- package/skills/gsd-path-define/references/operating-rules.md +214 -0
- package/skills/gsd-path-define/scripts/_common.py +472 -19
- package/skills/gsd-path-define/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-define/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-define/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-define/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-define/scripts/detect_project.py +345 -15
- package/skills/gsd-path-define/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-define/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-define/scripts/integration.py +434 -24
- package/skills/gsd-path-define/scripts/isolation.py +1077 -28
- package/skills/gsd-path-define/scripts/loop_run.py +20 -30
- package/skills/gsd-path-define/scripts/members.py +704 -0
- package/skills/gsd-path-define/scripts/path_config.py +2 -2
- package/skills/gsd-path-define/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-define/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-define/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-define/scripts/review_panel.py +1 -1
- package/skills/gsd-path-define/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-define/scripts/state_promote.py +2 -0
- package/skills/gsd-path-define/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-discuss/SKILL.md +2 -1
- package/skills/gsd-path-discuss/references/operating-rules.md +214 -0
- package/skills/gsd-path-discuss/scripts/_common.py +472 -19
- package/skills/gsd-path-discuss/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-discuss/scripts/loop_run.py +20 -30
- package/skills/gsd-path-discuss/scripts/path_config.py +2 -2
- package/skills/gsd-path-discuss/scripts/review_panel.py +1 -1
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-docs-audit/SKILL.md +6 -4
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +2 -1
- package/skills/gsd-path-docs-audit/references/operating-rules.md +214 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +472 -19
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +14 -3
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +345 -15
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-docs-audit/scripts/integration.py +434 -24
- package/skills/gsd-path-docs-audit/scripts/isolation.py +1077 -28
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +20 -30
- package/skills/gsd-path-docs-audit/scripts/members.py +704 -0
- package/skills/gsd-path-docs-audit/scripts/path_config.py +2 -2
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +2 -0
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +1 -1
- package/skills/gsd-path-forensics/SKILL.md +2 -1
- package/skills/gsd-path-forensics/references/operating-rules.md +214 -0
- package/skills/gsd-path-forensics/scripts/_common.py +472 -19
- package/skills/gsd-path-forensics/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-forensics/scripts/loop_run.py +20 -30
- package/skills/gsd-path-forensics/scripts/path_config.py +2 -2
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +82 -31
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +117 -22
- package/skills/gsd-path-forensics/scripts/review_panel.py +1 -1
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-inspect/SKILL.md +5 -4
- package/skills/gsd-path-inspect/references/codebase-mapper.md +2 -1
- package/skills/gsd-path-inspect/references/docs-auditor.md +2 -1
- package/skills/gsd-path-inspect/references/operating-rules.md +214 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/_common.py +472 -19
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-inspect/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +14 -3
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-inspect/scripts/detect_project.py +345 -15
- package/skills/gsd-path-inspect/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-inspect/scripts/integration.py +434 -24
- package/skills/gsd-path-inspect/scripts/isolation.py +1077 -28
- package/skills/gsd-path-inspect/scripts/loop_run.py +20 -30
- package/skills/gsd-path-inspect/scripts/members.py +704 -0
- package/skills/gsd-path-inspect/scripts/path_config.py +2 -2
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-inspect/scripts/review_panel.py +1 -1
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-inspect/scripts/state_promote.py +2 -0
- package/skills/gsd-path-inspect/scripts/workflow_run.py +103 -29
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-inspect/templates/codebase.md +1 -1
- package/skills/gsd-path-inspect/templates/docs-audit.md +1 -1
- package/skills/gsd-path-loop/SKILL.md +2 -1
- package/skills/gsd-path-loop/references/operating-rules.md +214 -0
- package/skills/gsd-path-loop/scripts/_common.py +472 -19
- package/skills/gsd-path-loop/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-loop/scripts/loop_run.py +20 -30
- package/skills/gsd-path-loop/scripts/path_config.py +2 -2
- package/skills/gsd-path-loop/scripts/review_panel.py +1 -1
- package/skills/gsd-path-loop/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-migrate/SKILL.md +2 -1
- package/skills/gsd-path-migrate/references/operating-rules.md +214 -0
- package/skills/gsd-path-migrate/scripts/_common.py +472 -19
- package/skills/gsd-path-migrate/scripts/core_hook_gate.py +10 -1
- package/skills/gsd-path-migrate/scripts/core_hook_settings.py +11 -4
- package/skills/gsd-path-migrate/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-migrate/scripts/loop_run.py +20 -30
- package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -2
- package/skills/gsd-path-migrate/scripts/path_config.py +2 -2
- package/skills/gsd-path-migrate/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/SKILL.md +7 -1
- package/skills/gsd-path-plan/references/operating-rules.md +214 -0
- package/skills/gsd-path-plan/references/planner.md +8 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/_common.py +472 -19
- package/skills/gsd-path-plan/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-plan/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-plan/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-plan/scripts/detect_project.py +345 -15
- package/skills/gsd-path-plan/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-plan/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-plan/scripts/integration.py +434 -24
- package/skills/gsd-path-plan/scripts/isolation.py +1077 -28
- package/skills/gsd-path-plan/scripts/loop_run.py +20 -30
- package/skills/gsd-path-plan/scripts/members.py +704 -0
- package/skills/gsd-path-plan/scripts/path_config.py +2 -2
- package/skills/gsd-path-plan/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-plan/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-plan/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-plan/scripts/state_promote.py +2 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +103 -29
- package/skills/gsd-path-plan/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-plan/templates/task.md +1 -0
- package/skills/gsd-path-research/SKILL.md +2 -1
- package/skills/gsd-path-research/references/operating-rules.md +214 -0
- package/skills/gsd-path-research/scripts/_common.py +472 -19
- package/skills/gsd-path-research/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-research/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-research/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-research/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-research/scripts/detect_project.py +345 -15
- package/skills/gsd-path-research/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-research/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-research/scripts/integration.py +434 -24
- package/skills/gsd-path-research/scripts/isolation.py +1077 -28
- package/skills/gsd-path-research/scripts/loop_run.py +20 -30
- package/skills/gsd-path-research/scripts/members.py +704 -0
- package/skills/gsd-path-research/scripts/path_config.py +2 -2
- package/skills/gsd-path-research/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-research/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-research/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-research/scripts/review_panel.py +1 -1
- package/skills/gsd-path-research/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-research/scripts/state_promote.py +2 -0
- package/skills/gsd-path-research/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-roadmap/SKILL.md +2 -1
- package/skills/gsd-path-roadmap/references/operating-rules.md +214 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +472 -19
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-roadmap/scripts/detect_project.py +345 -15
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-roadmap/scripts/integration.py +434 -24
- package/skills/gsd-path-roadmap/scripts/isolation.py +1077 -28
- package/skills/gsd-path-roadmap/scripts/loop_run.py +20 -30
- package/skills/gsd-path-roadmap/scripts/members.py +704 -0
- package/skills/gsd-path-roadmap/scripts/path_config.py +2 -2
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-roadmap/scripts/review_panel.py +1 -1
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-roadmap/scripts/state_promote.py +2 -0
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-ship/SKILL.md +27 -10
- package/skills/gsd-path-ship/references/operating-rules.md +214 -0
- package/skills/gsd-path-ship/references/reviewer-wave.md +3 -1
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/_common.py +472 -19
- package/skills/gsd-path-ship/scripts/archive_milestone.py +146 -73
- package/skills/gsd-path-ship/scripts/build_recovery.py +4 -1
- package/skills/gsd-path-ship/scripts/build_state.py +66 -23
- package/skills/gsd-path-ship/scripts/check_handoffs.py +116 -20
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +60 -8
- package/skills/gsd-path-ship/scripts/detect_project.py +345 -15
- package/skills/gsd-path-ship/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-ship/scripts/discussion_validate.py +66 -21
- package/skills/gsd-path-ship/scripts/integration.py +434 -24
- package/skills/gsd-path-ship/scripts/isolation.py +1077 -28
- package/skills/gsd-path-ship/scripts/lean_verification.py +99 -19
- package/skills/gsd-path-ship/scripts/loop_run.py +20 -30
- package/skills/gsd-path-ship/scripts/members.py +704 -0
- package/skills/gsd-path-ship/scripts/path_config.py +2 -2
- package/skills/gsd-path-ship/scripts/pipeline_git.py +61 -22
- package/skills/gsd-path-ship/scripts/pipeline_state.py +176 -54
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-ship/scripts/review_panel.py +1 -1
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +140 -31
- package/skills/gsd-path-ship/scripts/state_promote.py +2 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +103 -29
- package/skills/gsd-path-ship/scripts/worktree_paths.py +18 -8
- package/skills/gsd-path-ship/templates/final-review.md +5 -2
- package/skills/gsd-path-ship/templates/gap-review.md +2 -1
- package/skills/gsd-path-ship/templates/wave-review.md +3 -1
- package/skills/gsd-path-undo/SKILL.md +2 -1
- package/skills/gsd-path-undo/references/operating-rules.md +214 -0
- package/skills/gsd-path-undo/scripts/_common.py +472 -19
- package/skills/gsd-path-undo/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-undo/scripts/loop_run.py +20 -30
- package/skills/gsd-path-undo/scripts/path_config.py +2 -2
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +117 -22
- package/skills/gsd-path-undo/scripts/review_panel.py +1 -1
- package/skills/gsd-path-undo/scripts/worktree_paths.py +18 -8
- package/skills/path/BUILD.md +7 -1
- package/skills/path/DECIDE.md +11 -4
- package/skills/path/DEFINE.md +8 -1
- package/skills/path/DOCS-AUDIT.md +6 -4
- package/skills/path/INSPECT.md +5 -4
- package/skills/path/PLAN.md +7 -1
- package/skills/path/RESEARCH.md +2 -1
- package/skills/path/ROADMAP.md +2 -1
- package/skills/path/SHIP.md +27 -10
- package/skills/path/SKILL.md +45 -1
- package/skills/path/references/build-native.md +47 -14
- package/skills/path/references/codebase-mapper.md +2 -1
- package/skills/path/references/docs-auditor.md +2 -1
- package/skills/path/references/operating-rules.md +214 -0
- package/skills/path/references/planner.md +8 -0
- package/skills/path/references/reviewer-wave.md +3 -1
- package/skills/path/scripts/_common.py +472 -19
- package/skills/path/scripts/archive_milestone.py +146 -73
- package/skills/path/scripts/bootstrap_repository.py +8 -5
- package/skills/path/scripts/build_recovery.py +4 -1
- package/skills/path/scripts/build_state.py +66 -23
- package/skills/path/scripts/check_docs_audit.py +14 -3
- package/skills/path/scripts/check_handoffs.py +116 -20
- package/skills/path/scripts/check_task_briefs.py +60 -8
- package/skills/path/scripts/check_update.py +2 -2
- package/skills/path/scripts/detect_project.py +345 -15
- package/skills/path/scripts/discussion_records.py +19 -13
- package/skills/path/scripts/discussion_validate.py +66 -21
- package/skills/path/scripts/dispatch_driver.py +111 -26
- package/skills/path/scripts/git_guard.py +116 -29
- package/skills/path/scripts/integration.py +434 -24
- package/skills/path/scripts/isolation.py +1077 -28
- package/skills/path/scripts/lean_verification.py +99 -19
- package/skills/path/scripts/loop_run.py +20 -30
- package/skills/path/scripts/members.py +704 -0
- package/skills/path/scripts/path_config.py +2 -2
- package/skills/path/scripts/pipeline_git.py +61 -22
- package/skills/path/scripts/pipeline_state.py +176 -54
- package/skills/path/scripts/promote_lookahead.py +1 -1
- package/skills/path/scripts/review_panel.py +1 -1
- package/skills/path/scripts/state_checkpoint.py +140 -31
- package/skills/path/scripts/state_promote.py +2 -0
- package/skills/path/scripts/status_runtime.py +36 -6
- package/skills/path/scripts/token_budget.py +12 -8
- package/skills/path/scripts/workflow_run.py +103 -29
- package/skills/path/scripts/worktree_paths.py +18 -8
- package/skills/path/templates/codebase.md +1 -1
- package/skills/path/templates/docs-audit.md +1 -1
- package/skills/path/templates/final-review.md +5 -2
- package/skills/path/templates/gap-review.md +2 -1
- package/skills/path/templates/task.md +1 -0
- package/skills/path/templates/wave-review.md +3 -1
|
@@ -22,8 +22,8 @@ else:
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def _git(repo, *arguments):
|
|
25
|
-
return subprocess.run(["git", "-C", str(repo), *arguments],
|
|
26
|
-
|
|
25
|
+
return subprocess.run(["git", "-C", str(repo), *arguments], capture_output=True,
|
|
26
|
+
encoding="utf-8", errors="surrogateescape", check=True).stdout.strip()
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def _reusable_wave(repo, expected_head):
|
|
@@ -71,7 +71,25 @@ def _reusable_wave(repo, expected_head):
|
|
|
71
71
|
return relative, text, criteria, reviewed
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
def
|
|
74
|
+
def _surface_name(value, expected):
|
|
75
|
+
"""The surface a wave review's Surface field names, without the reviewer's detail.
|
|
76
|
+
|
|
77
|
+
Reviewers write the PLAN surface name and often a note after it
|
|
78
|
+
("count.py CLI — entry `python count.py`, run from the root"). Keep exactly
|
|
79
|
+
the expected name when the field starts with it and the detail is set off by
|
|
80
|
+
a comma, dash, colon, semicolon, or parenthesis; otherwise keep the text before
|
|
81
|
+
the first comma, which FINAL.md validation then compares with the plan.
|
|
82
|
+
"""
|
|
83
|
+
named = " ".join(contracts._unquoted(value).split())
|
|
84
|
+
if expected:
|
|
85
|
+
name = " ".join(expected.split())
|
|
86
|
+
rest = named[len(name):] if named.casefold().startswith(name.casefold()) else None
|
|
87
|
+
if rest is not None and (not rest or re.match(r"\s*[,;:(]|\s+[—–-]\s", rest)):
|
|
88
|
+
return expected
|
|
89
|
+
return named.partition(",")[0]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _final_view(relative, text, criteria, reviewed, head, surfaces=None):
|
|
75
93
|
coverage = contracts._section(text, "Intent coverage")
|
|
76
94
|
headings = list(re.finditer(r"(?m)^### (SC[1-9]\d*) — (.+): pass\s*$", coverage))
|
|
77
95
|
blocks = {}
|
|
@@ -96,22 +114,32 @@ def _final_view(relative, text, criteria, reviewed, head):
|
|
|
96
114
|
f"- **Reference**: {relative} — {criterion}",
|
|
97
115
|
"- **Finding**: none", "- **Fix direction**: none"]
|
|
98
116
|
if "Surface" in fields:
|
|
99
|
-
|
|
117
|
+
expected = (surfaces or {}).get(criterion)
|
|
118
|
+
lines.append(f"- **Surface**: {_surface_name(fields['Surface'], expected)}")
|
|
100
119
|
lines.append("")
|
|
101
120
|
return "\n".join(lines)
|
|
102
121
|
|
|
103
122
|
|
|
123
|
+
def _locked_members(repo):
|
|
124
|
+
lock = repo / ".project/build/members.json"
|
|
125
|
+
return json.loads(lock.read_text(encoding="utf-8"))["members"] if lock.is_file() else []
|
|
126
|
+
|
|
127
|
+
|
|
104
128
|
def reuse_final(repo, expected_head):
|
|
105
129
|
"""Materialize a final view only when the existing proof still covers it."""
|
|
106
130
|
repo = Path(repo).resolve()
|
|
107
131
|
try:
|
|
132
|
+
# Wave reviews name only the coordinator head, so a member milestone needs its own final review.
|
|
133
|
+
if _locked_members(repo):
|
|
134
|
+
raise contracts.HandoffError("member milestone needs a final review of the member heads")
|
|
108
135
|
relative, text, criteria, reviewed = _reusable_wave(repo, expected_head)
|
|
109
|
-
final = _final_view(relative, text, criteria, reviewed, expected_head
|
|
136
|
+
final = _final_view(relative, text, criteria, reviewed, expected_head,
|
|
137
|
+
contracts.criterion_surfaces(repo))
|
|
110
138
|
contracts.validate_final(repo, final_text=final)
|
|
111
139
|
destination = repo / ".project/review/FINAL.md"
|
|
112
140
|
if destination.is_symlink():
|
|
113
141
|
raise contracts.HandoffError("FINAL.md must be a real file")
|
|
114
|
-
if destination.exists() and destination.read_text() != final:
|
|
142
|
+
if destination.exists() and destination.read_text(encoding="utf-8") != final:
|
|
115
143
|
raise contracts.HandoffError("existing final evidence needs explicit reconciliation")
|
|
116
144
|
if not destination.exists():
|
|
117
145
|
_common.atomic_write(destination, final)
|
|
@@ -123,9 +151,36 @@ def reuse_final(repo, expected_head):
|
|
|
123
151
|
|
|
124
152
|
def _gap_view(command, head, execution, waves):
|
|
125
153
|
passed = execution["exit_code"] == 0
|
|
154
|
+
members = execution.get("members")
|
|
155
|
+
output = ""
|
|
156
|
+
if members:
|
|
157
|
+
observed = "exact stdout and stderr are in the Output section; member heads are not in the ledger key"
|
|
158
|
+
reference = "project Verify at " + head + " with members " + ", ".join(
|
|
159
|
+
f"{name} {tip}" for name, tip in members.items())
|
|
160
|
+
stdout, stderr = execution["stdout"], execution["stderr"]
|
|
161
|
+
fence = "`" * max([3] + [len(run) + 1 for run in re.findall(r"`+", stdout + "\n" + stderr)])
|
|
162
|
+
stdout_end = "" if not stdout or stdout.endswith("\n") else "\n"
|
|
163
|
+
stderr_end = "" if not stderr or stderr.endswith("\n") else "\n"
|
|
164
|
+
output = f"""
|
|
165
|
+
|
|
166
|
+
## Output
|
|
167
|
+
|
|
168
|
+
### stdout
|
|
169
|
+
|
|
170
|
+
{fence}
|
|
171
|
+
{stdout}{stdout_end}{fence}
|
|
172
|
+
|
|
173
|
+
### stderr
|
|
174
|
+
|
|
175
|
+
{fence}
|
|
176
|
+
{stderr}{stderr_end}{fence}"""
|
|
177
|
+
else:
|
|
178
|
+
members = {}
|
|
179
|
+
observed = "exact stdout and stderr are in the command/commit ledger entry"
|
|
180
|
+
reference = f".project/build/verify-ledger.jsonl — {head}, command above"
|
|
126
181
|
return f"""# Gap Review — 1: project Verify
|
|
127
182
|
|
|
128
|
-
Reviewed HEAD: {head}
|
|
183
|
+
Reviewed HEAD: {head}{"".join(f"{chr(10)}Member reviewed HEAD: {name} {tip}" for name, tip in members.items())}
|
|
129
184
|
Gap verdict: {'pass' if passed else 'blocked'}
|
|
130
185
|
Risk: project Verify
|
|
131
186
|
Waves checked: {', '.join(str(wave) for wave in waves)}
|
|
@@ -133,13 +188,13 @@ Waves checked: {', '.join(str(wave) for wave in waves)}
|
|
|
133
188
|
## Checked evidence
|
|
134
189
|
|
|
135
190
|
- **Check**: `{command}`
|
|
136
|
-
- **Observed**: Exit {execution['exit_code']};
|
|
137
|
-
- **Reference**:
|
|
191
|
+
- **Observed**: Exit {execution['exit_code']}; {observed}.
|
|
192
|
+
- **Reference**: {reference}
|
|
138
193
|
|
|
139
194
|
## Finding
|
|
140
195
|
|
|
141
196
|
- **Found**: Project Verify {'passed' if passed else 'failed'} at the reviewed commit.
|
|
142
|
-
- **Fix direction**: {'none' if passed else 'Resolve the recorded command failure before shipping.'}
|
|
197
|
+
- **Fix direction**: {'none' if passed else 'Resolve the recorded command failure before shipping.'}{output}
|
|
143
198
|
"""
|
|
144
199
|
|
|
145
200
|
|
|
@@ -147,8 +202,11 @@ def _require_ship_inputs(repo, expected_head):
|
|
|
147
202
|
contracts._require_state(repo, "ship", "active", ".project")
|
|
148
203
|
if _git(repo, "rev-parse", "HEAD") != expected_head:
|
|
149
204
|
raise contracts.HandoffError("primary HEAD changed")
|
|
205
|
+
isolation.prune_host_scratch(repo / ".project")
|
|
206
|
+
# Ignored, untracked entries (.DS_Store) never ship, so they are not artifacts.
|
|
207
|
+
visible = _common.git_visible_entries(repo / ".project")
|
|
150
208
|
unexpected = sorted(path.name for path in (repo / ".project").iterdir()
|
|
151
|
-
if path.name not in isolation.PROJECT_ENTRIES)
|
|
209
|
+
if path.name not in isolation.PROJECT_ENTRIES and path.name in visible)
|
|
152
210
|
if unexpected:
|
|
153
211
|
raise contracts.HandoffError("unsupported .project artifacts: " + ", ".join(unexpected))
|
|
154
212
|
dirty = isolation.uncommitted_paths(repo)
|
|
@@ -176,8 +234,11 @@ def verify_project(repo, expected_head):
|
|
|
176
234
|
plan = contracts._read(repo, ".project/plan/PLAN.md")
|
|
177
235
|
command = contracts._line_value(plan, "Project verify:")
|
|
178
236
|
_, waves = contracts._plan_waves(plan)
|
|
179
|
-
|
|
180
|
-
|
|
237
|
+
# Member heads are not in the ledger key, so a member milestone always runs again.
|
|
238
|
+
members = _locked_members(repo)
|
|
239
|
+
if members:
|
|
240
|
+
isolation.check_member_verify_collision(members, "project-verify")
|
|
241
|
+
entry = None if members else build_state.verify_lookup(str(repo), command, expected_head)["entry"]
|
|
181
242
|
relative = ".project/review/final-gap-1.md"
|
|
182
243
|
destination = repo / relative
|
|
183
244
|
if destination.is_symlink():
|
|
@@ -199,19 +260,38 @@ def verify_project(repo, expected_head):
|
|
|
199
260
|
)
|
|
200
261
|
_retire_execution(repo, expected_head, execution)
|
|
201
262
|
view = _gap_view(command, expected_head, execution, waves)
|
|
202
|
-
if not destination.exists() or destination.read_text() != view:
|
|
263
|
+
if not destination.exists() or destination.read_text(encoding="utf-8") != view:
|
|
203
264
|
_common.atomic_write(destination, view)
|
|
204
265
|
return {"passed": entry["result"] == "pass", "reused": True,
|
|
205
266
|
"path": str(destination), "execution": execution}
|
|
206
267
|
sidecar = isolation.isolate_verify(repo, expected_head, "project-verify")
|
|
207
268
|
worktree = Path(sidecar["worktree"])
|
|
208
|
-
|
|
209
|
-
|
|
269
|
+
try:
|
|
270
|
+
sidecars = isolation.isolate_member_verify(repo, worktree) if members else None
|
|
271
|
+
except BaseException:
|
|
272
|
+
isolation.retire(repo, worktree, sidecar["branch"], force=False)
|
|
273
|
+
raise
|
|
274
|
+
try:
|
|
275
|
+
try:
|
|
276
|
+
completed = subprocess.run(_common.bash_argv(command), cwd=worktree,
|
|
277
|
+
encoding="utf-8", errors="replace", capture_output=True)
|
|
278
|
+
if sidecars:
|
|
279
|
+
isolation.check_member_verify(sidecars)
|
|
280
|
+
finally:
|
|
281
|
+
if sidecars:
|
|
282
|
+
isolation.retire_member_verify(sidecars)
|
|
283
|
+
except BaseException:
|
|
284
|
+
isolation.clean_verify(repo, worktree, expected_head, sidecar["branch"])
|
|
285
|
+
isolation.retire(repo, worktree, sidecar["branch"], force=False)
|
|
286
|
+
raise
|
|
210
287
|
execution = {"exit_code": completed.returncode, "stdout": completed.stdout,
|
|
211
288
|
"stderr": completed.stderr, "worktree": str(worktree), "branch": sidecar["branch"]}
|
|
212
289
|
passed = completed.returncode == 0
|
|
213
|
-
|
|
214
|
-
|
|
290
|
+
if members:
|
|
291
|
+
execution["members"] = {name: record["tip"] for name, record in sidecars.items()}
|
|
292
|
+
else:
|
|
293
|
+
build_state.verify_record(str(repo), command, expected_head,
|
|
294
|
+
"pass" if passed else "fail", execution=execution)
|
|
215
295
|
isolation.clean_verify(repo, worktree, expected_head, sidecar["branch"])
|
|
216
296
|
_common.atomic_write(worktree / relative, _gap_view(command, expected_head, execution, waves))
|
|
217
297
|
collection = isolation.collect_artifact(repo, worktree, expected_head, sidecar["branch"],
|
|
@@ -227,7 +307,7 @@ def prepare_final(repo, expected_head):
|
|
|
227
307
|
return {"status": "blocked", "verification": verification,
|
|
228
308
|
"reason": "project Verify failed; use its recorded output"}
|
|
229
309
|
final = reuse_final(repo, expected_head)
|
|
230
|
-
if not final["reused"] and (Path(repo) / ".project/review/FINAL.md").exists():
|
|
310
|
+
if not _locked_members(Path(repo)) and not final["reused"] and (Path(repo) / ".project/review/FINAL.md").exists():
|
|
231
311
|
try:
|
|
232
312
|
valid = contracts.validate_final(Path(repo))
|
|
233
313
|
if valid["verdict"] == "pass":
|
package/scripts/loop_run.py
CHANGED
|
@@ -32,10 +32,10 @@ from datetime import datetime, timedelta, timezone
|
|
|
32
32
|
from pathlib import Path
|
|
33
33
|
from typing import Iterator, Optional, Sequence
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
import
|
|
37
|
-
|
|
38
|
-
import
|
|
35
|
+
try:
|
|
36
|
+
from . import _common
|
|
37
|
+
except ImportError:
|
|
38
|
+
import _common
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class LoopError(RuntimeError):
|
|
@@ -119,25 +119,8 @@ def log_path(fields: dict) -> Path:
|
|
|
119
119
|
def log_lock(fields: dict) -> Iterator[None]:
|
|
120
120
|
path = log_path(fields)
|
|
121
121
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if sys.platform == "win32":
|
|
125
|
-
handle.seek(0, os.SEEK_END)
|
|
126
|
-
if handle.tell() == 0:
|
|
127
|
-
handle.write(b"\0")
|
|
128
|
-
handle.flush()
|
|
129
|
-
handle.seek(0)
|
|
130
|
-
msvcrt.locking(handle.fileno(), msvcrt.LK_LOCK, 1)
|
|
131
|
-
else:
|
|
132
|
-
fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
|
|
133
|
-
try:
|
|
134
|
-
yield
|
|
135
|
-
finally:
|
|
136
|
-
if sys.platform == "win32":
|
|
137
|
-
handle.seek(0)
|
|
138
|
-
msvcrt.locking(handle.fileno(), msvcrt.LK_UNLCK, 1)
|
|
139
|
-
else:
|
|
140
|
-
fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
|
|
122
|
+
with _common.exclusive_lock(path.with_name(f".{path.name}.lock")):
|
|
123
|
+
yield
|
|
141
124
|
|
|
142
125
|
|
|
143
126
|
def load_log(fields: dict) -> list[dict]:
|
|
@@ -528,15 +511,22 @@ def command_claim(fields: dict) -> dict:
|
|
|
528
511
|
|
|
529
512
|
|
|
530
513
|
def run_shell(command: str, timeout: float) -> tuple[Optional[int], str]:
|
|
531
|
-
"""Run one spec command; a hung command counts as failed (exit None).
|
|
514
|
+
"""Run one spec command; a hung command counts as failed (exit None).
|
|
515
|
+
|
|
516
|
+
POSIX runs /bin/sh as shell=True did; Windows runs Git for Windows bash, not
|
|
517
|
+
cmd.exe. A timeout kills the whole process group, so a grandchild cannot
|
|
518
|
+
keep the output pipes open.
|
|
519
|
+
"""
|
|
520
|
+
argv = _common.bash_argv(command) if os.name == "nt" else ["/bin/sh", "-c", command]
|
|
521
|
+
process = _common.popen_group(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
532
522
|
try:
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
)
|
|
536
|
-
|
|
537
|
-
output =
|
|
523
|
+
stdout, stderr = process.communicate(timeout=timeout)
|
|
524
|
+
except subprocess.TimeoutExpired:
|
|
525
|
+
_common.kill_tree(process)
|
|
526
|
+
stdout, stderr = process.communicate()
|
|
527
|
+
output = stdout.decode("utf-8", errors="replace") + stderr.decode("utf-8", errors="replace")
|
|
538
528
|
return None, f"{output}\ntimed out at the admitted wall-clock deadline"
|
|
539
|
-
return
|
|
529
|
+
return process.returncode, (stdout + stderr).decode("utf-8", errors="replace")
|
|
540
530
|
|
|
541
531
|
|
|
542
532
|
def command_verify(fields: dict, claim_identifier: Optional[str]) -> dict:
|