@opengsd/gsd-path 1.0.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 +397 -0
- package/DOCS.md +341 -0
- package/FULL.md +475 -0
- package/GUIDE.md +23 -0
- package/HOOKS.md +273 -0
- package/LICENSE +21 -0
- package/MIGRATE.md +100 -0
- package/QUICK.md +146 -0
- package/README.md +280 -0
- package/RUNTIME.md +229 -0
- package/UPDATE.md +196 -0
- package/WORKFLOW.md +683 -0
- package/package.json +80 -0
- package/platforms/claude/dispatch.md +63 -0
- package/platforms/copilot/dispatch.md +61 -0
- package/platforms/cursor/agent.md +17 -0
- package/platforms/cursor/dispatch.md +63 -0
- package/platforms/grok/dispatch.md +61 -0
- package/platforms/kimi/dispatch.md +64 -0
- package/platforms/kiro/dispatch.md +58 -0
- package/platforms/opencode/dispatch.md +62 -0
- package/platforms/qwen/dispatch.md +60 -0
- package/platforms/shared-agents/dispatch.md +131 -0
- package/plugin.json +14 -0
- package/scripts/_common.py +180 -0
- package/scripts/archive_milestone.py +2265 -0
- package/scripts/bootstrap_repository.py +710 -0
- package/scripts/build_state.py +854 -0
- package/scripts/check_docs_audit.py +463 -0
- package/scripts/check_handoffs.py +1855 -0
- package/scripts/check_task_briefs.py +376 -0
- package/scripts/check_update.py +93 -0
- package/scripts/core_hook_gate.py +34 -0
- package/scripts/core_hook_settings.py +119 -0
- package/scripts/detect_project.py +1517 -0
- package/scripts/discussion_records.py +619 -0
- package/scripts/discussion_validate.py +1321 -0
- package/scripts/dispatch_driver.py +1812 -0
- package/scripts/git_guard.py +759 -0
- package/scripts/guard_hook.py +2124 -0
- package/scripts/install.mjs +3239 -0
- package/scripts/install.py +3008 -0
- package/scripts/integration.py +1433 -0
- package/scripts/isolation.py +3538 -0
- package/scripts/lean_verification.py +256 -0
- package/scripts/loop_run.py +837 -0
- package/scripts/migrate_core.py +169 -0
- package/scripts/pipeline_diagnose.py +715 -0
- package/scripts/pipeline_git.py +940 -0
- package/scripts/pipeline_state.py +2291 -0
- package/scripts/pipeline_undo.py +1039 -0
- package/scripts/promote_lookahead.py +415 -0
- package/scripts/review_findings.py +714 -0
- package/scripts/review_panel.py +553 -0
- package/scripts/skill-resources.json +340 -0
- package/scripts/state_checkpoint.py +1039 -0
- package/scripts/state_promote.py +743 -0
- package/scripts/status_runtime.py +122 -0
- package/scripts/sync_skill_resources.py +259 -0
- package/scripts/token_budget.py +146 -0
- package/scripts/wizard.mjs +179 -0
- package/scripts/workflow_run.py +117 -0
- package/skills/gsd-path/BUILD.md +700 -0
- package/skills/gsd-path/DECIDE.md +115 -0
- package/skills/gsd-path/DEFINE.md +297 -0
- package/skills/gsd-path/DOCS-AUDIT.md +190 -0
- package/skills/gsd-path/INSPECT.md +167 -0
- package/skills/gsd-path/PLAN.md +411 -0
- package/skills/gsd-path/RESEARCH.md +159 -0
- package/skills/gsd-path/ROADMAP.md +215 -0
- package/skills/gsd-path/SHIP.md +412 -0
- package/skills/gsd-path/SKILL.md +471 -0
- package/skills/gsd-path/agents/openai.yaml +6 -0
- package/skills/gsd-path/references/codebase-mapper.md +52 -0
- package/skills/gsd-path/references/coder.md +90 -0
- package/skills/gsd-path/references/decider.md +36 -0
- package/skills/gsd-path/references/dispatch.md +131 -0
- package/skills/gsd-path/references/docs-auditor.md +60 -0
- package/skills/gsd-path/references/planner.md +104 -0
- package/skills/gsd-path/references/researcher.md +42 -0
- package/skills/gsd-path/references/reviewer.md +188 -0
- package/skills/gsd-path/references/roadmapper.md +48 -0
- package/skills/gsd-path/scripts/_common.py +180 -0
- package/skills/gsd-path/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path/scripts/bootstrap_repository.py +710 -0
- package/skills/gsd-path/scripts/build_state.py +854 -0
- package/skills/gsd-path/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path/scripts/check_update.py +93 -0
- package/skills/gsd-path/scripts/detect_project.py +1517 -0
- package/skills/gsd-path/scripts/discussion_records.py +619 -0
- package/skills/gsd-path/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path/scripts/dispatch_driver.py +1812 -0
- package/skills/gsd-path/scripts/integration.py +1433 -0
- package/skills/gsd-path/scripts/isolation.py +3538 -0
- package/skills/gsd-path/scripts/lean_verification.py +256 -0
- package/skills/gsd-path/scripts/loop_run.py +837 -0
- package/skills/gsd-path/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path/scripts/promote_lookahead.py +415 -0
- package/skills/gsd-path/scripts/review_findings.py +714 -0
- package/skills/gsd-path/scripts/review_panel.py +553 -0
- package/skills/gsd-path/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path/scripts/state_promote.py +743 -0
- package/skills/gsd-path/scripts/token_budget.py +146 -0
- package/skills/gsd-path/scripts/workflow_run.py +117 -0
- package/skills/gsd-path/templates/answers.md +29 -0
- package/skills/gsd-path/templates/archive-manifest.md +37 -0
- package/skills/gsd-path/templates/charter.md +50 -0
- package/skills/gsd-path/templates/codebase.md +46 -0
- package/skills/gsd-path/templates/dialogue.md +21 -0
- package/skills/gsd-path/templates/docs-audit.md +69 -0
- package/skills/gsd-path/templates/evidence.md +24 -0
- package/skills/gsd-path/templates/final-review.md +27 -0
- package/skills/gsd-path/templates/gap-review.md +20 -0
- package/skills/gsd-path/templates/intent.md +98 -0
- package/skills/gsd-path/templates/loop.md +59 -0
- package/skills/gsd-path/templates/patch-findings.md +16 -0
- package/skills/gsd-path/templates/plan-panel.md +25 -0
- package/skills/gsd-path/templates/plan.md +89 -0
- package/skills/gsd-path/templates/repository.md +16 -0
- package/skills/gsd-path/templates/research-handoff.md +25 -0
- package/skills/gsd-path/templates/roadmap.md +38 -0
- package/skills/gsd-path/templates/skeptic.md +36 -0
- package/skills/gsd-path/templates/state.md +27 -0
- package/skills/gsd-path/templates/synthesis.md +36 -0
- package/skills/gsd-path/templates/task.md +74 -0
- package/skills/gsd-path/templates/wave-panel.md +25 -0
- package/skills/gsd-path/templates/wave-review.md +64 -0
- package/skills/gsd-path-build/SKILL.md +700 -0
- package/skills/gsd-path-build/agents/openai.yaml +6 -0
- package/skills/gsd-path-build/references/coder.md +90 -0
- package/skills/gsd-path-build/references/dispatch.md +131 -0
- package/skills/gsd-path-build/references/reviewer.md +188 -0
- package/skills/gsd-path-build/scripts/_common.py +180 -0
- package/skills/gsd-path-build/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-build/scripts/build_state.py +854 -0
- package/skills/gsd-path-build/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-build/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-build/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-build/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-build/scripts/dispatch_driver.py +1812 -0
- package/skills/gsd-path-build/scripts/integration.py +1433 -0
- package/skills/gsd-path-build/scripts/isolation.py +3538 -0
- package/skills/gsd-path-build/scripts/loop_run.py +837 -0
- package/skills/gsd-path-build/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-build/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-build/scripts/review_findings.py +714 -0
- package/skills/gsd-path-build/scripts/review_panel.py +553 -0
- package/skills/gsd-path-build/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-build/scripts/state_promote.py +743 -0
- package/skills/gsd-path-build/scripts/token_budget.py +146 -0
- package/skills/gsd-path-build/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-build/templates/skeptic.md +36 -0
- package/skills/gsd-path-build/templates/task.md +74 -0
- package/skills/gsd-path-build/templates/wave-panel.md +25 -0
- package/skills/gsd-path-build/templates/wave-review.md +64 -0
- package/skills/gsd-path-decide/SKILL.md +115 -0
- package/skills/gsd-path-decide/agents/openai.yaml +6 -0
- package/skills/gsd-path-decide/references/decider.md +36 -0
- package/skills/gsd-path-decide/references/dispatch.md +131 -0
- package/skills/gsd-path-decide/scripts/_common.py +180 -0
- package/skills/gsd-path-decide/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-decide/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-decide/scripts/isolation.py +3538 -0
- package/skills/gsd-path-decide/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-decide/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-decide/scripts/state_promote.py +743 -0
- package/skills/gsd-path-decide/templates/synthesis.md +36 -0
- package/skills/gsd-path-define/SKILL.md +297 -0
- package/skills/gsd-path-define/agents/openai.yaml +6 -0
- package/skills/gsd-path-define/scripts/_common.py +180 -0
- package/skills/gsd-path-define/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-define/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-define/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-define/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-define/scripts/isolation.py +3538 -0
- package/skills/gsd-path-define/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-define/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-define/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-define/scripts/state_promote.py +743 -0
- package/skills/gsd-path-define/templates/charter.md +50 -0
- package/skills/gsd-path-define/templates/intent.md +98 -0
- package/skills/gsd-path-define/templates/state.md +27 -0
- package/skills/gsd-path-discuss/SKILL.md +162 -0
- package/skills/gsd-path-discuss/agents/openai.yaml +6 -0
- package/skills/gsd-path-discuss/scripts/_common.py +180 -0
- package/skills/gsd-path-discuss/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-discuss/templates/answers.md +29 -0
- package/skills/gsd-path-discuss/templates/dialogue.md +21 -0
- package/skills/gsd-path-docs-audit/SKILL.md +190 -0
- package/skills/gsd-path-docs-audit/agents/openai.yaml +6 -0
- package/skills/gsd-path-docs-audit/references/dispatch.md +131 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +60 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +180 -0
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-docs-audit/scripts/isolation.py +3538 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +743 -0
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +69 -0
- package/skills/gsd-path-forensics/SKILL.md +39 -0
- package/skills/gsd-path-forensics/agents/openai.yaml +6 -0
- package/skills/gsd-path-forensics/scripts/_common.py +180 -0
- package/skills/gsd-path-forensics/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +715 -0
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +1039 -0
- package/skills/gsd-path-inspect/SKILL.md +167 -0
- package/skills/gsd-path-inspect/agents/openai.yaml +6 -0
- package/skills/gsd-path-inspect/references/codebase-mapper.md +52 -0
- package/skills/gsd-path-inspect/references/dispatch.md +131 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +60 -0
- package/skills/gsd-path-inspect/scripts/_common.py +180 -0
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +463 -0
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-inspect/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-inspect/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-inspect/scripts/isolation.py +3538 -0
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-inspect/scripts/state_promote.py +743 -0
- package/skills/gsd-path-inspect/templates/codebase.md +46 -0
- package/skills/gsd-path-inspect/templates/docs-audit.md +69 -0
- package/skills/gsd-path-inspect/templates/state.md +27 -0
- package/skills/gsd-path-loop/SKILL.md +98 -0
- package/skills/gsd-path-loop/agents/openai.yaml +6 -0
- package/skills/gsd-path-loop/examples/ci-repair.LOOP.md +61 -0
- package/skills/gsd-path-loop/scripts/_common.py +180 -0
- package/skills/gsd-path-loop/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-loop/scripts/loop_run.py +837 -0
- package/skills/gsd-path-loop/templates/loop.md +59 -0
- package/skills/gsd-path-migrate/SKILL.md +134 -0
- package/skills/gsd-path-migrate/agents/openai.yaml +6 -0
- package/skills/gsd-path-migrate/scripts/core_hook_gate.py +34 -0
- package/skills/gsd-path-migrate/scripts/core_hook_settings.py +119 -0
- package/skills/gsd-path-migrate/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-migrate/scripts/migrate_core.py +169 -0
- package/skills/gsd-path-plan/SKILL.md +411 -0
- package/skills/gsd-path-plan/agents/openai.yaml +6 -0
- package/skills/gsd-path-plan/references/dispatch.md +131 -0
- package/skills/gsd-path-plan/references/planner.md +104 -0
- package/skills/gsd-path-plan/scripts/_common.py +180 -0
- package/skills/gsd-path-plan/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-plan/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-plan/scripts/isolation.py +3538 -0
- package/skills/gsd-path-plan/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-plan/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-plan/scripts/review_panel.py +553 -0
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-plan/scripts/state_promote.py +743 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-plan/templates/patch-findings.md +16 -0
- package/skills/gsd-path-plan/templates/plan-panel.md +25 -0
- package/skills/gsd-path-plan/templates/plan.md +89 -0
- package/skills/gsd-path-plan/templates/task.md +74 -0
- package/skills/gsd-path-research/SKILL.md +159 -0
- package/skills/gsd-path-research/agents/openai.yaml +6 -0
- package/skills/gsd-path-research/references/dispatch.md +131 -0
- package/skills/gsd-path-research/references/researcher.md +42 -0
- package/skills/gsd-path-research/scripts/_common.py +180 -0
- package/skills/gsd-path-research/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-research/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-research/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-research/scripts/isolation.py +3538 -0
- package/skills/gsd-path-research/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-research/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-research/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-research/scripts/state_promote.py +743 -0
- package/skills/gsd-path-research/templates/evidence.md +24 -0
- package/skills/gsd-path-research/templates/research-handoff.md +25 -0
- package/skills/gsd-path-roadmap/SKILL.md +215 -0
- package/skills/gsd-path-roadmap/agents/openai.yaml +6 -0
- package/skills/gsd-path-roadmap/references/dispatch.md +131 -0
- package/skills/gsd-path-roadmap/references/roadmapper.md +48 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +180 -0
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-roadmap/scripts/detect_project.py +1517 -0
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-roadmap/scripts/integration.py +1433 -0
- package/skills/gsd-path-roadmap/scripts/isolation.py +3538 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +415 -0
- package/skills/gsd-path-roadmap/scripts/review_panel.py +553 -0
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-roadmap/scripts/state_promote.py +743 -0
- package/skills/gsd-path-roadmap/templates/roadmap.md +38 -0
- package/skills/gsd-path-ship/SKILL.md +412 -0
- package/skills/gsd-path-ship/agents/openai.yaml +6 -0
- package/skills/gsd-path-ship/references/dispatch.md +131 -0
- package/skills/gsd-path-ship/references/reviewer.md +188 -0
- package/skills/gsd-path-ship/scripts/_common.py +180 -0
- package/skills/gsd-path-ship/scripts/archive_milestone.py +2265 -0
- package/skills/gsd-path-ship/scripts/build_state.py +854 -0
- package/skills/gsd-path-ship/scripts/check_handoffs.py +1855 -0
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +376 -0
- package/skills/gsd-path-ship/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-ship/scripts/discussion_validate.py +1321 -0
- package/skills/gsd-path-ship/scripts/integration.py +1433 -0
- package/skills/gsd-path-ship/scripts/isolation.py +3538 -0
- package/skills/gsd-path-ship/scripts/lean_verification.py +256 -0
- package/skills/gsd-path-ship/scripts/pipeline_git.py +940 -0
- package/skills/gsd-path-ship/scripts/pipeline_state.py +2291 -0
- package/skills/gsd-path-ship/scripts/review_panel.py +553 -0
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +1039 -0
- package/skills/gsd-path-ship/scripts/state_promote.py +743 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +117 -0
- package/skills/gsd-path-ship/templates/archive-manifest.md +37 -0
- package/skills/gsd-path-ship/templates/final-review.md +27 -0
- package/skills/gsd-path-ship/templates/gap-review.md +20 -0
- package/skills/gsd-path-ship/templates/patch-findings.md +16 -0
- package/skills/gsd-path-ship/templates/wave-review.md +64 -0
- package/skills/gsd-path-undo/SKILL.md +45 -0
- package/skills/gsd-path-undo/agents/openai.yaml +6 -0
- package/skills/gsd-path-undo/scripts/_common.py +180 -0
- package/skills/gsd-path-undo/scripts/discussion_records.py +619 -0
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +1039 -0
- package/skills/path/BUILD.md +700 -0
- package/skills/path/DECIDE.md +115 -0
- package/skills/path/DEFINE.md +297 -0
- package/skills/path/DOCS-AUDIT.md +190 -0
- package/skills/path/INSPECT.md +167 -0
- package/skills/path/PLAN.md +411 -0
- package/skills/path/RESEARCH.md +159 -0
- package/skills/path/ROADMAP.md +215 -0
- package/skills/path/SHIP.md +412 -0
- package/skills/path/SKILL.md +471 -0
- package/skills/path/agents/openai.yaml +6 -0
- package/skills/path/references/codebase-mapper.md +52 -0
- package/skills/path/references/coder.md +90 -0
- package/skills/path/references/decider.md +36 -0
- package/skills/path/references/dispatch.md +131 -0
- package/skills/path/references/docs-auditor.md +60 -0
- package/skills/path/references/planner.md +104 -0
- package/skills/path/references/researcher.md +42 -0
- package/skills/path/references/reviewer.md +188 -0
- package/skills/path/references/roadmapper.md +48 -0
- package/skills/path/scripts/_common.py +180 -0
- package/skills/path/scripts/archive_milestone.py +2265 -0
- package/skills/path/scripts/bootstrap_repository.py +710 -0
- package/skills/path/scripts/build_state.py +854 -0
- package/skills/path/scripts/check_docs_audit.py +463 -0
- package/skills/path/scripts/check_handoffs.py +1855 -0
- package/skills/path/scripts/check_task_briefs.py +376 -0
- package/skills/path/scripts/check_update.py +93 -0
- package/skills/path/scripts/detect_project.py +1517 -0
- package/skills/path/scripts/discussion_records.py +619 -0
- package/skills/path/scripts/discussion_validate.py +1321 -0
- package/skills/path/scripts/dispatch_driver.py +1812 -0
- package/skills/path/scripts/integration.py +1433 -0
- package/skills/path/scripts/isolation.py +3538 -0
- package/skills/path/scripts/lean_verification.py +256 -0
- package/skills/path/scripts/loop_run.py +837 -0
- package/skills/path/scripts/pipeline_git.py +940 -0
- package/skills/path/scripts/pipeline_state.py +2291 -0
- package/skills/path/scripts/promote_lookahead.py +415 -0
- package/skills/path/scripts/review_findings.py +714 -0
- package/skills/path/scripts/review_panel.py +553 -0
- package/skills/path/scripts/state_checkpoint.py +1039 -0
- package/skills/path/scripts/state_promote.py +743 -0
- package/skills/path/scripts/token_budget.py +146 -0
- package/skills/path/scripts/workflow_run.py +117 -0
- package/skills/path/templates/answers.md +29 -0
- package/skills/path/templates/archive-manifest.md +37 -0
- package/skills/path/templates/charter.md +50 -0
- package/skills/path/templates/codebase.md +46 -0
- package/skills/path/templates/dialogue.md +21 -0
- package/skills/path/templates/docs-audit.md +69 -0
- package/skills/path/templates/evidence.md +24 -0
- package/skills/path/templates/final-review.md +27 -0
- package/skills/path/templates/gap-review.md +20 -0
- package/skills/path/templates/intent.md +98 -0
- package/skills/path/templates/loop.md +59 -0
- package/skills/path/templates/patch-findings.md +16 -0
- package/skills/path/templates/plan-panel.md +25 -0
- package/skills/path/templates/plan.md +89 -0
- package/skills/path/templates/repository.md +16 -0
- package/skills/path/templates/research-handoff.md +25 -0
- package/skills/path/templates/roadmap.md +38 -0
- package/skills/path/templates/skeptic.md +36 -0
- package/skills/path/templates/state.md +27 -0
- package/skills/path/templates/synthesis.md +36 -0
- package/skills/path/templates/task.md +74 -0
- package/skills/path/templates/wave-panel.md +25 -0
- package/skills/path/templates/wave-review.md +64 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// Interactive OpenGSD installer wizard. Dependency-free (node:readline raw mode).
|
|
2
|
+
// Produces an argv for install.mjs main(); it never writes files itself.
|
|
3
|
+
|
|
4
|
+
import { emitKeypressEvents } from "node:readline";
|
|
5
|
+
|
|
6
|
+
export const HOST_LABELS = {
|
|
7
|
+
codex: "Codex",
|
|
8
|
+
claude: "Claude Code",
|
|
9
|
+
grok: "Grok",
|
|
10
|
+
opencode: "OpenCode",
|
|
11
|
+
copilot: "GitHub Copilot CLI",
|
|
12
|
+
qwen: "Qwen Code",
|
|
13
|
+
antigravity: "Antigravity",
|
|
14
|
+
cursor: "Cursor",
|
|
15
|
+
zed: "Zed",
|
|
16
|
+
kiro: "Kiro",
|
|
17
|
+
kimi: "Kimi Code",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// ponytail: hand-drawn block letters; no figlet dependency.
|
|
21
|
+
const WORDMARK = [
|
|
22
|
+
" ██████╗ ██████╗ ███████╗███╗ ██╗ ██████╗ ███████╗██████╗ ",
|
|
23
|
+
"██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ██╔════╝ ██╔════╝██╔══██╗",
|
|
24
|
+
"██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ███╗███████╗██║ ██║",
|
|
25
|
+
"██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║╚════██║██║ ██║",
|
|
26
|
+
"╚██████╔╝██║ ███████╗██║ ╚████║ ╚██████╔╝███████║██████╔╝",
|
|
27
|
+
" ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚═════╝ ",
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export function makeTheme(colored) {
|
|
31
|
+
const esc = (code) => (text) => (colored ? `\u001b[${code}m${text}\u001b[0m` : text);
|
|
32
|
+
const gradient = [51, 45, 39, 215, 209, 202]; // opengsd.net brand: cyan #00e5ff → orange #ff4500
|
|
33
|
+
return {
|
|
34
|
+
dim: esc("2"),
|
|
35
|
+
bold: esc("1"),
|
|
36
|
+
accent: esc("38;5;45"), // brand cyan #00c4ff
|
|
37
|
+
flame: esc("38;5;202"), // brand orange #ff5b37
|
|
38
|
+
ok: esc("38;5;84"),
|
|
39
|
+
warn: esc("38;5;214"),
|
|
40
|
+
err: esc("38;5;203"),
|
|
41
|
+
inverse: esc("7"),
|
|
42
|
+
gradientLine: (line, index) => (colored ? `\u001b[38;5;${gradient[index % gradient.length]}m${line}\u001b[0m` : line),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function banner(theme, version) {
|
|
47
|
+
const lines = WORDMARK.map((line, index) => " " + theme.gradientLine(line, index));
|
|
48
|
+
lines.push("");
|
|
49
|
+
lines.push(
|
|
50
|
+
` ${theme.bold("GSD Path")} ${theme.dim(`installer${version ? ` v${version}` : ""}`)} ${theme.dim("·")} ${theme.dim("a disk-backed pipeline for AI coding agents")}`
|
|
51
|
+
);
|
|
52
|
+
lines.push(` ${theme.dim("↑/↓ move · space toggle · a all · enter confirm · q quit")}`);
|
|
53
|
+
return lines.join("\n") + "\n";
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Reads single keypresses from `input`; resolves with {name, ctrl}.
|
|
57
|
+
function keyReader(input) {
|
|
58
|
+
emitKeypressEvents(input);
|
|
59
|
+
if (input.isTTY) input.setRawMode(true);
|
|
60
|
+
input.resume();
|
|
61
|
+
const queue = [];
|
|
62
|
+
const waiters = [];
|
|
63
|
+
const onKey = (_, key) => {
|
|
64
|
+
if (waiters.length) waiters.shift()(key);
|
|
65
|
+
else queue.push(key);
|
|
66
|
+
};
|
|
67
|
+
input.on("keypress", onKey);
|
|
68
|
+
return {
|
|
69
|
+
next: () => (queue.length ? Promise.resolve(queue.shift()) : new Promise((resolve) => waiters.push(resolve))),
|
|
70
|
+
close() {
|
|
71
|
+
input.off("keypress", onKey);
|
|
72
|
+
if (input.isTTY) input.setRawMode(false);
|
|
73
|
+
input.pause();
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
class Cancelled extends Error {}
|
|
79
|
+
|
|
80
|
+
function render(output, frame, previousLines) {
|
|
81
|
+
if (previousLines) output.write(`\u001b[${previousLines}A\u001b[0J`);
|
|
82
|
+
output.write(frame);
|
|
83
|
+
return frame.split("\n").length - 1;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function select(io, theme, title, items, { multi = false } = {}) {
|
|
87
|
+
const { keys, output } = io;
|
|
88
|
+
let cursor = 0;
|
|
89
|
+
const chosen = new Set(items.filter((item) => item.checked).map((item) => item.value));
|
|
90
|
+
let drawn = 0;
|
|
91
|
+
const draw = () => {
|
|
92
|
+
const rows = items.map((item, index) => {
|
|
93
|
+
const active = index === cursor;
|
|
94
|
+
const mark = multi ? (chosen.has(item.value) ? theme.accent("◉") : theme.dim("○")) : active ? theme.flame("›") : " ";
|
|
95
|
+
const label = active ? theme.bold(item.label) : item.label;
|
|
96
|
+
const note = item.note ? ` ${theme.dim(item.note)}` : "";
|
|
97
|
+
return ` ${mark} ${label}${note}`;
|
|
98
|
+
});
|
|
99
|
+
drawn = render(output, `\n ${theme.accent("?")} ${theme.bold(title)}\n${rows.join("\n")}\n`, drawn);
|
|
100
|
+
};
|
|
101
|
+
for (;;) {
|
|
102
|
+
draw();
|
|
103
|
+
const key = await keys.next();
|
|
104
|
+
if (!key) continue;
|
|
105
|
+
const current = items[cursor].value;
|
|
106
|
+
if (key.name === "q" || key.name === "escape" || (key.ctrl && key.name === "c")) throw new Cancelled();
|
|
107
|
+
if (key.name === "up" || key.name === "k") cursor = (cursor - 1 + items.length) % items.length;
|
|
108
|
+
else if (key.name === "down" || key.name === "j" || key.name === "tab") cursor = (cursor + 1) % items.length;
|
|
109
|
+
else if (multi && key.name === "space") chosen.has(current) ? chosen.delete(current) : chosen.add(current);
|
|
110
|
+
else if (multi && key.name === "a") {
|
|
111
|
+
if (chosen.size === items.length) chosen.clear();
|
|
112
|
+
else items.forEach((item) => chosen.add(item.value));
|
|
113
|
+
} else if (key.name === "return") {
|
|
114
|
+
if (!multi) return current;
|
|
115
|
+
if (chosen.size) return items.filter((item) => chosen.has(item.value)).map((item) => item.value);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const confirm = (io, theme, title, yes = "Yes", no = "No") =>
|
|
121
|
+
select(io, theme, title, [
|
|
122
|
+
{ label: yes, value: true },
|
|
123
|
+
{ label: no, value: false },
|
|
124
|
+
]);
|
|
125
|
+
|
|
126
|
+
// Pure: runs the question flow and returns install.mjs argv (or null if cancelled).
|
|
127
|
+
// `installed(target, local)` reports whether a managed install already exists for that host in that scope.
|
|
128
|
+
export async function wizard({ input, output, colored = true, version = "", cwd = process.cwd(), installed = () => false, targets }) {
|
|
129
|
+
const theme = makeTheme(colored);
|
|
130
|
+
const keys = keyReader(input);
|
|
131
|
+
const io = { keys, output };
|
|
132
|
+
output.write(banner(theme, version));
|
|
133
|
+
try {
|
|
134
|
+
const scope = await select(io, theme, "Where should skills live?", [
|
|
135
|
+
{ label: "Global", value: "global", note: "per-host home directories" },
|
|
136
|
+
{ label: "This project", value: "local", note: cwd },
|
|
137
|
+
]);
|
|
138
|
+
const local = scope === "local";
|
|
139
|
+
|
|
140
|
+
const hostItems = targets.map((target) => {
|
|
141
|
+
const checked = installed(target, local);
|
|
142
|
+
return { label: HOST_LABELS[target] || target, value: target, checked, note: checked ? "installed" : "" };
|
|
143
|
+
});
|
|
144
|
+
const hosts = await select(io, theme, "Which agents should get GSD Path?", hostItems, { multi: true });
|
|
145
|
+
|
|
146
|
+
const update =
|
|
147
|
+
hostItems.some((item) => item.checked && hosts.includes(item.value)) &&
|
|
148
|
+
(await confirm(io, theme, "Existing installs found. What do you want to do?", "Update in place", "Fresh install"));
|
|
149
|
+
|
|
150
|
+
const project = await confirm(io, theme, "Write AGENTS.md + WORKFLOW.md contracts into this repo?", `Yes — ${cwd}`, "Not now");
|
|
151
|
+
const hooks = project && (await confirm(io, theme, "Install guard hooks (archive immutability, ship-commit purity)?"));
|
|
152
|
+
|
|
153
|
+
const argv = [];
|
|
154
|
+
if (hosts.length === targets.length) argv.push("--all");
|
|
155
|
+
else for (const host of hosts) argv.push(`--${host}`);
|
|
156
|
+
if (update) argv.push("--update");
|
|
157
|
+
if (local) argv.push("--local");
|
|
158
|
+
if (project) argv.push("--project", cwd);
|
|
159
|
+
if (hooks) argv.push("--hooks");
|
|
160
|
+
|
|
161
|
+
output.write(`\n ${theme.dim("Equivalent command:")}\n ${theme.accent("$")} gsd-path ${argv.join(" ")}\n`);
|
|
162
|
+
const go = await select(io, theme, "Ready?", [
|
|
163
|
+
{ label: "Install", value: "install" },
|
|
164
|
+
{ label: "Dry run first", value: "dry", note: "preview, write nothing" },
|
|
165
|
+
{ label: "Quit", value: "quit" },
|
|
166
|
+
]);
|
|
167
|
+
if (go === "quit") return null;
|
|
168
|
+
if (go === "dry") argv.push("--dry-run");
|
|
169
|
+
return argv;
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (error instanceof Cancelled) {
|
|
172
|
+
output.write(`\n ${theme.dim("Cancelled.")}\n`);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
} finally {
|
|
177
|
+
keys.close();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Run canonical workflow helpers with fixed arguments and fail-stop receipts."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import json
|
|
6
|
+
import subprocess
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
from scripts import _common
|
|
12
|
+
except ImportError: # bundled copy inside a skill's scripts directory
|
|
13
|
+
import _common
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class StepFailed(RuntimeError):
|
|
17
|
+
pass
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str = None,
|
|
21
|
+
task_id: str = None, round_size: int = None) -> dict:
|
|
22
|
+
steps = []
|
|
23
|
+
scripts = Path(__file__).resolve().parent
|
|
24
|
+
|
|
25
|
+
def step(script, *arguments):
|
|
26
|
+
command = [sys.executable, "-B", str(scripts / script), *arguments]
|
|
27
|
+
completed = subprocess.run(command, cwd=repo, capture_output=True, text=True)
|
|
28
|
+
receipt = {"script": script, "command": command, "exit_code": completed.returncode,
|
|
29
|
+
"stdout": completed.stdout, "stderr": completed.stderr}
|
|
30
|
+
steps.append(receipt)
|
|
31
|
+
if completed.stderr:
|
|
32
|
+
sys.stderr.write(completed.stderr)
|
|
33
|
+
if completed.returncode:
|
|
34
|
+
raise StepFailed(script)
|
|
35
|
+
try:
|
|
36
|
+
receipt["result"] = json.loads(completed.stdout)
|
|
37
|
+
except json.JSONDecodeError as error:
|
|
38
|
+
raise StepFailed(f"{script} did not return JSON") from error
|
|
39
|
+
return receipt["result"]
|
|
40
|
+
|
|
41
|
+
common = ["--repo", str(repo), "--project-dir", project_dir]
|
|
42
|
+
try:
|
|
43
|
+
if action == "route":
|
|
44
|
+
step("pipeline_state.py", "route", *common)
|
|
45
|
+
elif action == "lint-round":
|
|
46
|
+
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
47
|
+
cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
|
|
48
|
+
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
49
|
+
"--tasks-dir", f"{project_dir}/tasks")
|
|
50
|
+
step("check_handoffs.py", "plan", *common)
|
|
51
|
+
elif action == "prepare-task":
|
|
52
|
+
task = step("isolation.py", "isolate-task", "--repo", str(repo),
|
|
53
|
+
"--base", expected_head, "--task-id", task_id,
|
|
54
|
+
"--round-size", str(round_size))
|
|
55
|
+
if task["mode"] == "serial":
|
|
56
|
+
step("isolation.py", "isolate-verify", "--repo", str(repo),
|
|
57
|
+
"--base", expected_head, "--name", f"task-{task_id.lower()}-verify")
|
|
58
|
+
elif action == "build-evidence":
|
|
59
|
+
proof = step("build_state.py", "verify-landed", *common, "--head", expected_head)
|
|
60
|
+
# The landing proof has one canonical home; lean final-review reuse allows only this path.
|
|
61
|
+
evidence = repo / project_dir / "build" / "evidence.json"
|
|
62
|
+
_common.atomic_write(evidence, json.dumps(proof, indent=2, sort_keys=True) + "\n")
|
|
63
|
+
steps.append({"script": "workflow_run.py", "evidence": str(evidence)})
|
|
64
|
+
elif action == "prepare-final":
|
|
65
|
+
if project_dir != ".project":
|
|
66
|
+
raise StepFailed("final review requires the active milestone")
|
|
67
|
+
pending = step("discussion_records.py", "pending", "--repo", str(repo))
|
|
68
|
+
if pending["pending"]:
|
|
69
|
+
raise StepFailed("pending discussion requires its owner disposition")
|
|
70
|
+
step("build_state.py", "verify-landed", *common, "--head", expected_head)
|
|
71
|
+
step("lean_verification.py", "--repo", str(repo), "--expected-head", expected_head)
|
|
72
|
+
else:
|
|
73
|
+
pending = step("discussion_records.py", "pending", "--repo", str(repo))
|
|
74
|
+
if pending["pending"]:
|
|
75
|
+
raise StepFailed("pending discussion requires its owner disposition")
|
|
76
|
+
step("check_handoffs.py", "plan", *common)
|
|
77
|
+
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
78
|
+
cwd=repo, capture_output=True, text=True, check=True).stdout.strip()
|
|
79
|
+
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
80
|
+
"--tasks-dir", f"{project_dir}/tasks")
|
|
81
|
+
panel = ["validate-plan", "--plan", str(repo / project_dir / "plan/PLAN.md"),
|
|
82
|
+
"--intent", str(repo / project_dir / "intent/INTENT.md")]
|
|
83
|
+
charter = repo / ".project/CHARTER.md"
|
|
84
|
+
if charter.exists():
|
|
85
|
+
panel += ["--charter", str(charter)]
|
|
86
|
+
step("review_panel.py", *panel)
|
|
87
|
+
if action == "approve-plan":
|
|
88
|
+
step("pipeline_state.py", "approve", *common, "--kind", "plan",
|
|
89
|
+
"--expected-head", expected_head)
|
|
90
|
+
except (StepFailed, OSError, subprocess.CalledProcessError) as error:
|
|
91
|
+
return {"status": "blocked", "reason": str(error), "steps": steps,
|
|
92
|
+
"next": "$gsd-path-forensics"}
|
|
93
|
+
return {"status": "complete", "steps": steps}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def main(argv=None):
|
|
97
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
98
|
+
parser.add_argument("action", choices=("route", "gate-plan", "approve-plan", "build-evidence", "lint-round", "prepare-task", "prepare-final"))
|
|
99
|
+
parser.add_argument("--repo", type=Path, required=True)
|
|
100
|
+
parser.add_argument("--project-dir", choices=(".project", ".project/next"), default=".project")
|
|
101
|
+
parser.add_argument("--expected-head")
|
|
102
|
+
parser.add_argument("--task-id")
|
|
103
|
+
parser.add_argument("--round-size", type=int)
|
|
104
|
+
arguments = parser.parse_args(argv)
|
|
105
|
+
if arguments.action in {"approve-plan", "build-evidence", "prepare-task", "prepare-final"} and not arguments.expected_head:
|
|
106
|
+
parser.error(f"{arguments.action} requires --expected-head")
|
|
107
|
+
if arguments.action == "prepare-task" and (not arguments.task_id or arguments.round_size is None):
|
|
108
|
+
parser.error("prepare-task requires --task-id and --round-size")
|
|
109
|
+
result = run_workflow(arguments.repo.resolve(), arguments.action,
|
|
110
|
+
arguments.project_dir, arguments.expected_head,
|
|
111
|
+
arguments.task_id, arguments.round_size)
|
|
112
|
+
print(json.dumps(result, sort_keys=True))
|
|
113
|
+
return 0 if result["status"] == "complete" else 1
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
if __name__ == "__main__":
|
|
117
|
+
raise SystemExit(main())
|