@opengsd/gsd-path 1.4.0 → 1.5.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/CHANGELOG.md +325 -344
- package/DOCS.md +12 -2
- package/FULL.md +3 -2
- package/HOOKS.md +95 -8
- package/QUICK.md +1 -1
- package/README.md +78 -110
- package/RUNTIME.md +1 -1
- package/UPDATE.md +4 -3
- package/WORKFLOW.md +22 -1
- package/package.json +5 -2
- package/platforms/shared-agents/dispatch.md +13 -0
- package/scripts/_common.py +149 -1
- package/scripts/archive_milestone.py +14 -13
- package/scripts/build_recovery.py +96 -31
- package/scripts/build_state.py +79 -3
- package/scripts/check_docs_audit.py +77 -4
- package/scripts/check_handoffs.py +546 -30
- package/scripts/check_task_briefs.py +279 -23
- package/scripts/detect_project.py +243 -18
- package/scripts/discussion_validate.py +86 -29
- package/scripts/dispatch_driver.py +392 -22
- package/scripts/git_guard.py +3 -3
- package/scripts/guard_hook.py +1416 -165
- package/scripts/install.mjs +23 -8
- package/scripts/install.py +49 -9
- package/scripts/integration.py +146 -1
- package/scripts/isolation.py +392 -60
- package/scripts/loop_run.py +16 -4
- package/scripts/members.py +11 -9
- package/scripts/path_config.py +3 -3
- package/scripts/pipeline_git.py +63 -12
- package/scripts/pipeline_state.py +111 -33
- package/scripts/pipeline_undo.py +101 -8
- package/scripts/runtime_store.py +20 -2
- package/scripts/skill-resources.json +9 -2
- package/scripts/state_checkpoint.py +9 -27
- package/scripts/status_runtime.py +22 -4
- package/scripts/task_context.py +12 -3
- package/scripts/wizard.mjs +1 -0
- package/scripts/workflow_run.py +5 -2
- package/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path/DEFINE.md +28 -3
- package/skills/gsd-path/PLAN.md +11 -3
- package/skills/gsd-path/RESEARCH.md +11 -0
- package/skills/gsd-path/SHIP.md +6 -1
- package/skills/gsd-path/references/build-native.md +16 -1
- package/skills/gsd-path/references/dispatch.md +13 -0
- package/skills/gsd-path/references/docs-auditor.md +5 -0
- package/skills/gsd-path/references/planner.md +14 -4
- package/skills/gsd-path/references/reviewer-final.md +20 -2
- package/skills/gsd-path/references/reviewer-wave.md +15 -4
- package/skills/gsd-path/references/reviewer.md +3 -1
- package/skills/gsd-path/references/spec-probes.md +150 -0
- package/skills/gsd-path/scripts/_common.py +149 -1
- package/skills/gsd-path/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path/scripts/build_recovery.py +96 -31
- package/skills/gsd-path/scripts/build_state.py +79 -3
- package/skills/gsd-path/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path/scripts/detect_project.py +243 -18
- package/skills/gsd-path/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path/scripts/dispatch_driver.py +392 -22
- package/skills/gsd-path/scripts/git_guard.py +3 -3
- package/skills/gsd-path/scripts/integration.py +146 -1
- package/skills/gsd-path/scripts/isolation.py +392 -60
- package/skills/gsd-path/scripts/loop_run.py +16 -4
- package/skills/gsd-path/scripts/members.py +11 -9
- package/skills/gsd-path/scripts/path_config.py +3 -3
- package/skills/gsd-path/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path/scripts/status_runtime.py +22 -4
- package/skills/gsd-path/scripts/task_context.py +12 -3
- package/skills/gsd-path/scripts/workflow_run.py +5 -2
- package/skills/gsd-path/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path/templates/docs-audit.md +5 -1
- package/skills/gsd-path/templates/final-review.md +11 -2
- package/skills/gsd-path/templates/intent.md +30 -0
- package/skills/gsd-path/templates/patch-findings.md +3 -3
- package/skills/gsd-path/templates/plan.md +17 -2
- package/skills/gsd-path/templates/research-handoff.md +14 -3
- package/skills/gsd-path/templates/state.md +1 -1
- package/skills/gsd-path/templates/wave-review.md +16 -6
- package/skills/gsd-path-build/references/build-native.md +16 -1
- package/skills/gsd-path-build/references/dispatch.md +13 -0
- package/skills/gsd-path-build/references/reviewer-final.md +20 -2
- package/skills/gsd-path-build/references/reviewer-wave.md +15 -4
- package/skills/gsd-path-build/references/reviewer.md +3 -1
- package/skills/gsd-path-build/references/spec-probes.md +150 -0
- package/skills/gsd-path-build/scripts/_common.py +149 -1
- package/skills/gsd-path-build/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-build/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-build/scripts/build_state.py +79 -3
- package/skills/gsd-path-build/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-build/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-build/scripts/detect_project.py +243 -18
- package/skills/gsd-path-build/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-build/scripts/dispatch_driver.py +392 -22
- package/skills/gsd-path-build/scripts/integration.py +146 -1
- package/skills/gsd-path-build/scripts/isolation.py +392 -60
- package/skills/gsd-path-build/scripts/loop_run.py +16 -4
- package/skills/gsd-path-build/scripts/members.py +11 -9
- package/skills/gsd-path-build/scripts/path_config.py +3 -3
- package/skills/gsd-path-build/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-build/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-build/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-build/scripts/task_context.py +12 -3
- package/skills/gsd-path-build/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-build/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-build/templates/wave-review.md +16 -6
- package/skills/gsd-path-decide/references/dispatch.md +13 -0
- package/skills/gsd-path-decide/scripts/_common.py +149 -1
- package/skills/gsd-path-decide/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-decide/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-decide/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-decide/scripts/detect_project.py +243 -18
- package/skills/gsd-path-decide/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-decide/scripts/integration.py +146 -1
- package/skills/gsd-path-decide/scripts/isolation.py +392 -60
- package/skills/gsd-path-decide/scripts/loop_run.py +16 -4
- package/skills/gsd-path-decide/scripts/members.py +11 -9
- package/skills/gsd-path-decide/scripts/path_config.py +3 -3
- package/skills/gsd-path-decide/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-decide/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-decide/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-define/SKILL.md +28 -3
- package/skills/gsd-path-define/references/spec-probes.md +150 -0
- package/skills/gsd-path-define/scripts/_common.py +149 -1
- package/skills/gsd-path-define/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-define/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-define/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-define/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-define/scripts/detect_project.py +243 -18
- package/skills/gsd-path-define/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-define/scripts/integration.py +146 -1
- package/skills/gsd-path-define/scripts/isolation.py +392 -60
- package/skills/gsd-path-define/scripts/loop_run.py +16 -4
- package/skills/gsd-path-define/scripts/members.py +11 -9
- package/skills/gsd-path-define/scripts/path_config.py +3 -3
- package/skills/gsd-path-define/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-define/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-define/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-define/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-define/templates/intent.md +30 -0
- package/skills/gsd-path-define/templates/state.md +1 -1
- package/skills/gsd-path-discuss/scripts/_common.py +149 -1
- package/skills/gsd-path-discuss/scripts/loop_run.py +16 -4
- package/skills/gsd-path-discuss/scripts/path_config.py +3 -3
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +5 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +149 -1
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +243 -18
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-docs-audit/scripts/integration.py +146 -1
- package/skills/gsd-path-docs-audit/scripts/isolation.py +392 -60
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +16 -4
- package/skills/gsd-path-docs-audit/scripts/members.py +11 -9
- package/skills/gsd-path-docs-audit/scripts/path_config.py +3 -3
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +5 -1
- package/skills/gsd-path-forensics/scripts/_common.py +149 -1
- package/skills/gsd-path-forensics/scripts/loop_run.py +16 -4
- package/skills/gsd-path-forensics/scripts/path_config.py +3 -3
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +101 -8
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-inspect/references/dispatch.md +13 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +5 -0
- package/skills/gsd-path-inspect/scripts/_common.py +149 -1
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-inspect/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-inspect/scripts/detect_project.py +243 -18
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-inspect/scripts/integration.py +146 -1
- package/skills/gsd-path-inspect/scripts/isolation.py +392 -60
- package/skills/gsd-path-inspect/scripts/loop_run.py +16 -4
- package/skills/gsd-path-inspect/scripts/members.py +11 -9
- package/skills/gsd-path-inspect/scripts/path_config.py +3 -3
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-inspect/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-inspect/templates/docs-audit.md +5 -1
- package/skills/gsd-path-inspect/templates/state.md +1 -1
- package/skills/gsd-path-loop/scripts/_common.py +149 -1
- package/skills/gsd-path-loop/scripts/loop_run.py +16 -4
- package/skills/gsd-path-loop/scripts/path_config.py +3 -3
- package/skills/gsd-path-loop/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-migrate/scripts/_common.py +149 -1
- package/skills/gsd-path-migrate/scripts/loop_run.py +16 -4
- package/skills/gsd-path-migrate/scripts/path_config.py +3 -3
- package/skills/gsd-path-plan/SKILL.md +11 -3
- package/skills/gsd-path-plan/references/dispatch.md +13 -0
- package/skills/gsd-path-plan/references/planner.md +14 -4
- package/skills/gsd-path-plan/references/spec-probes.md +150 -0
- package/skills/gsd-path-plan/scripts/_common.py +149 -1
- package/skills/gsd-path-plan/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-plan/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-plan/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-plan/scripts/detect_project.py +243 -18
- package/skills/gsd-path-plan/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-plan/scripts/integration.py +146 -1
- package/skills/gsd-path-plan/scripts/isolation.py +392 -60
- package/skills/gsd-path-plan/scripts/loop_run.py +16 -4
- package/skills/gsd-path-plan/scripts/members.py +11 -9
- package/skills/gsd-path-plan/scripts/path_config.py +3 -3
- package/skills/gsd-path-plan/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-plan/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-plan/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-plan/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-plan/templates/patch-findings.md +3 -3
- package/skills/gsd-path-plan/templates/plan.md +17 -2
- package/skills/gsd-path-research/SKILL.md +11 -0
- package/skills/gsd-path-research/references/dispatch.md +13 -0
- package/skills/gsd-path-research/scripts/_common.py +149 -1
- package/skills/gsd-path-research/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-research/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-research/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-research/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-research/scripts/detect_project.py +243 -18
- package/skills/gsd-path-research/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-research/scripts/integration.py +146 -1
- package/skills/gsd-path-research/scripts/isolation.py +392 -60
- package/skills/gsd-path-research/scripts/loop_run.py +16 -4
- package/skills/gsd-path-research/scripts/members.py +11 -9
- package/skills/gsd-path-research/scripts/path_config.py +3 -3
- package/skills/gsd-path-research/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-research/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-research/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-research/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-research/templates/research-handoff.md +14 -3
- package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +149 -1
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-roadmap/scripts/detect_project.py +243 -18
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-roadmap/scripts/integration.py +146 -1
- package/skills/gsd-path-roadmap/scripts/isolation.py +392 -60
- package/skills/gsd-path-roadmap/scripts/loop_run.py +16 -4
- package/skills/gsd-path-roadmap/scripts/members.py +11 -9
- package/skills/gsd-path-roadmap/scripts/path_config.py +3 -3
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-ship/SKILL.md +6 -1
- package/skills/gsd-path-ship/references/dispatch.md +13 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
- package/skills/gsd-path-ship/references/reviewer-wave.md +15 -4
- package/skills/gsd-path-ship/references/reviewer.md +3 -1
- package/skills/gsd-path-ship/references/spec-probes.md +150 -0
- package/skills/gsd-path-ship/scripts/_common.py +149 -1
- package/skills/gsd-path-ship/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-ship/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-ship/scripts/build_state.py +79 -3
- package/skills/gsd-path-ship/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-ship/scripts/detect_project.py +243 -18
- package/skills/gsd-path-ship/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-ship/scripts/integration.py +146 -1
- package/skills/gsd-path-ship/scripts/isolation.py +392 -60
- package/skills/gsd-path-ship/scripts/loop_run.py +16 -4
- package/skills/gsd-path-ship/scripts/members.py +11 -9
- package/skills/gsd-path-ship/scripts/path_config.py +3 -3
- package/skills/gsd-path-ship/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-ship/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-ship/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-ship/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-ship/templates/final-review.md +11 -2
- package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
- package/skills/gsd-path-ship/templates/wave-review.md +16 -6
- package/skills/gsd-path-undo/scripts/_common.py +149 -1
- package/skills/gsd-path-undo/scripts/loop_run.py +16 -4
- package/skills/gsd-path-undo/scripts/path_config.py +3 -3
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +101 -8
- package/skills/gsd-path-undo/scripts/worktree_paths.py +54 -2
- package/skills/path/DEFINE.md +28 -3
- package/skills/path/PLAN.md +11 -3
- package/skills/path/RESEARCH.md +11 -0
- package/skills/path/SHIP.md +6 -1
- package/skills/path/references/build-native.md +16 -1
- package/skills/path/references/dispatch.md +13 -0
- package/skills/path/references/docs-auditor.md +5 -0
- package/skills/path/references/planner.md +14 -4
- package/skills/path/references/reviewer-final.md +20 -2
- package/skills/path/references/reviewer-wave.md +15 -4
- package/skills/path/references/reviewer.md +3 -1
- package/skills/path/references/spec-probes.md +150 -0
- package/skills/path/scripts/_common.py +149 -1
- package/skills/path/scripts/archive_milestone.py +14 -13
- package/skills/path/scripts/build_recovery.py +96 -31
- package/skills/path/scripts/build_state.py +79 -3
- package/skills/path/scripts/check_docs_audit.py +77 -4
- package/skills/path/scripts/check_handoffs.py +546 -30
- package/skills/path/scripts/check_task_briefs.py +279 -23
- package/skills/path/scripts/detect_project.py +243 -18
- package/skills/path/scripts/discussion_validate.py +86 -29
- package/skills/path/scripts/dispatch_driver.py +392 -22
- package/skills/path/scripts/git_guard.py +3 -3
- package/skills/path/scripts/integration.py +146 -1
- package/skills/path/scripts/isolation.py +392 -60
- package/skills/path/scripts/loop_run.py +16 -4
- package/skills/path/scripts/members.py +11 -9
- package/skills/path/scripts/path_config.py +3 -3
- package/skills/path/scripts/pipeline_git.py +63 -12
- package/skills/path/scripts/pipeline_state.py +111 -33
- package/skills/path/scripts/state_checkpoint.py +9 -27
- package/skills/path/scripts/status_runtime.py +22 -4
- package/skills/path/scripts/task_context.py +12 -3
- package/skills/path/scripts/workflow_run.py +5 -2
- package/skills/path/scripts/worktree_paths.py +54 -2
- package/skills/path/templates/docs-audit.md +5 -1
- package/skills/path/templates/final-review.md +11 -2
- package/skills/path/templates/intent.md +30 -0
- package/skills/path/templates/patch-findings.md +3 -3
- package/skills/path/templates/plan.md +17 -2
- package/skills/path/templates/research-handoff.md +14 -3
- package/skills/path/templates/state.md +1 -1
- package/skills/path/templates/wave-review.md +16 -6
- 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-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-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
package/scripts/install.mjs
CHANGED
|
@@ -212,9 +212,10 @@ export const EXPLICIT_ONLY_TARGETS = new Set([
|
|
|
212
212
|
"cursor",
|
|
213
213
|
"zed",
|
|
214
214
|
"kimi",
|
|
215
|
+
"muse",
|
|
215
216
|
"shared-agents",
|
|
216
217
|
]);
|
|
217
|
-
const SHARED_AGENT_TARGETS = new Set(["codex", "antigravity", "zed"]);
|
|
218
|
+
const SHARED_AGENT_TARGETS = new Set(["codex", "antigravity", "zed", "muse"]);
|
|
218
219
|
export const SHARED_AGENT_PROFILE = "shared-agents";
|
|
219
220
|
export const CURSOR_AGENT_FILENAME = "gsd-path.md";
|
|
220
221
|
export const CURSOR_AGENT_BACKUP_NAME = "cursor-agent-gsd-path.md";
|
|
@@ -228,7 +229,7 @@ const MANIFEST = JSON.parse(
|
|
|
228
229
|
);
|
|
229
230
|
|
|
230
231
|
function sharedInvocations(text) {
|
|
231
|
-
const pattern = /(`?)(\$gsd-path(?:-[a-z0-9]+)*|\$path)( status)?\1(?: \(Codex\) (?:and|or) (`?)\/(gsd-path(?:-[a-z0-9]+)*|path)( status)?\4 \((?:other hosts|Antigravity\/Zed)\))?/g;
|
|
232
|
+
const pattern = /(`?)(\$gsd-path(?:-[a-z0-9]+)*|\$path)( status)?\1(?: \(Codex\) (?:and|or) (`?)\/(gsd-path(?:-[a-z0-9]+)*|path)( status)?\4 \((?:other hosts|Antigravity\/Zed\/Muse)\))?/g;
|
|
232
233
|
return text.replace(pattern, (_match, quote, token, arguments_, pairedQuote, pairedSkill, pairedArguments) => {
|
|
233
234
|
const skill = token.slice(1);
|
|
234
235
|
const argumentsText = arguments_ || "";
|
|
@@ -237,7 +238,7 @@ function sharedInvocations(text) {
|
|
|
237
238
|
}
|
|
238
239
|
const codex = `${MANIFEST.hosts.codex.invocation_prefix}${skill}`;
|
|
239
240
|
const others = `${MANIFEST.hosts.antigravity.invocation_prefix}${skill}`;
|
|
240
|
-
return `${quote}${codex}${argumentsText}${quote} (Codex) or ${quote}${others}${argumentsText}${quote} (Antigravity/Zed)`;
|
|
241
|
+
return `${quote}${codex}${argumentsText}${quote} (Codex) or ${quote}${others}${argumentsText}${quote} (Antigravity/Zed/Muse)`;
|
|
241
242
|
});
|
|
242
243
|
}
|
|
243
244
|
export function skillNamesForManifest(manifest) {
|
|
@@ -355,7 +356,7 @@ export function defaultRoot(target, env = process.env) {
|
|
|
355
356
|
}
|
|
356
357
|
if (target === "antigravity") return absolutePath("~/.gemini/antigravity-cli/skills");
|
|
357
358
|
if (target === "cursor") return absolutePath("~/.cursor/skills");
|
|
358
|
-
if (target === "zed") return absolutePath("~/.agents/skills");
|
|
359
|
+
if (target === "zed" || target === "muse") return absolutePath("~/.agents/skills");
|
|
359
360
|
if (target === "kiro") {
|
|
360
361
|
return absolutePath(path.join(env.KIRO_HOME || expandUser("~/.kiro"), "skills"));
|
|
361
362
|
}
|
|
@@ -386,7 +387,9 @@ function isOwnedRouterAlias(skillDir) {
|
|
|
386
387
|
const versionFile = path.join(skillDir, "VERSION");
|
|
387
388
|
if (!isFile(versionFile)) return isManagedProjectRuntime(runtime); // installs before alias version stamping
|
|
388
389
|
try {
|
|
389
|
-
return /^[0-9]+(?:\.[0-9]+)
|
|
390
|
+
return /^[0-9]+(?:\.[0-9]+)+(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.test(
|
|
391
|
+
fs.readFileSync(versionFile, "utf8").trim()
|
|
392
|
+
);
|
|
390
393
|
} catch {
|
|
391
394
|
return false;
|
|
392
395
|
}
|
|
@@ -1037,7 +1040,7 @@ async function applyTarget(plan, stagedRoot, transaction) {
|
|
|
1037
1040
|
const destination = path.join(plan.root, name);
|
|
1038
1041
|
hooks.reserveDirectory(destination);
|
|
1039
1042
|
transaction.installed.push(destination);
|
|
1040
|
-
|
|
1043
|
+
copyIntoReservedDirectory(path.join(stagedRoot, name), destination);
|
|
1041
1044
|
await tick();
|
|
1042
1045
|
}
|
|
1043
1046
|
if (cursorAgent !== null) {
|
|
@@ -1051,6 +1054,18 @@ function reserveDirectory(destination) {
|
|
|
1051
1054
|
fs.mkdirSync(destination);
|
|
1052
1055
|
}
|
|
1053
1056
|
|
|
1057
|
+
// Node 26 rejects recursive cpSync when the destination directory already exists
|
|
1058
|
+
// and errorOnExist is set. Reserve the skill directory, then copy each staged entry.
|
|
1059
|
+
export function copyIntoReservedDirectory(source, destination) {
|
|
1060
|
+
for (const entry of fs.readdirSync(source, { withFileTypes: true })) {
|
|
1061
|
+
fs.cpSync(path.join(source, entry.name), path.join(destination, entry.name), {
|
|
1062
|
+
recursive: true,
|
|
1063
|
+
errorOnExist: true,
|
|
1064
|
+
force: false,
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1054
1069
|
function reserveFile(destination) {
|
|
1055
1070
|
const descriptor = fs.openSync(destination, "wx", 0o644);
|
|
1056
1071
|
try {
|
|
@@ -1192,7 +1207,7 @@ export function deploymentPlans(plans) {
|
|
|
1192
1207
|
if (group.length > 1) {
|
|
1193
1208
|
if (!targets.every((name) => SHARED_AGENT_TARGETS.has(name))) {
|
|
1194
1209
|
throw new InstallerError(
|
|
1195
|
-
`only Codex, Antigravity, and
|
|
1210
|
+
`only Codex, Antigravity, Zed, and Muse may share a skills root: ${targets.join(", ")}`
|
|
1196
1211
|
);
|
|
1197
1212
|
}
|
|
1198
1213
|
profile = SHARED_AGENT_PROFILE;
|
|
@@ -1546,7 +1561,7 @@ export async function install(sourceRoot, plans, options = {}) {
|
|
|
1546
1561
|
}
|
|
1547
1562
|
|
|
1548
1563
|
// Documented project-relative skill roots (verified against each host's
|
|
1549
|
-
// official skills docs). Codex, Zed, and Antigravity all discover the
|
|
1564
|
+
// official skills docs). Codex, Zed, Muse, and Antigravity all discover the
|
|
1550
1565
|
// project-level .agents/skills standard directory.
|
|
1551
1566
|
export function localRoot(target, projectDir) {
|
|
1552
1567
|
const relative = LOCAL_ROOTS[target];
|
package/scripts/install.py
CHANGED
|
@@ -124,7 +124,7 @@ STATUS_STATE_FIELDS = frozenset(
|
|
|
124
124
|
"integration_source",
|
|
125
125
|
}
|
|
126
126
|
)
|
|
127
|
-
STATUS_INTEGRATION_MODES = frozenset({"direct", "pull-request"})
|
|
127
|
+
STATUS_INTEGRATION_MODES = frozenset({"direct", "pull-request", "external-landing"})
|
|
128
128
|
STATUS_INTEGRATION_SOURCES = frozenset({"default", "milestone"})
|
|
129
129
|
STATUS_SLUG = re.compile(r"^[a-z0-9][a-z0-9-]*$")
|
|
130
130
|
STATUS_BRANCH = re.compile(r"^gsd-path/M(\d{3,})$")
|
|
@@ -505,9 +505,9 @@ HOST_NOTES = {
|
|
|
505
505
|
"kiro": KIRO_NOTE,
|
|
506
506
|
}
|
|
507
507
|
EXPLICIT_ONLY_TARGETS = frozenset(
|
|
508
|
-
{"claude", "grok", "copilot", "qwen", "cursor", "zed", "kimi", "shared-agents"}
|
|
508
|
+
{"claude", "grok", "copilot", "qwen", "cursor", "zed", "kimi", "muse", "shared-agents"}
|
|
509
509
|
)
|
|
510
|
-
SHARED_AGENT_TARGETS = frozenset({"codex", "antigravity", "zed"})
|
|
510
|
+
SHARED_AGENT_TARGETS = frozenset({"codex", "antigravity", "zed", "muse"})
|
|
511
511
|
SHARED_AGENT_PROFILE = "shared-agents"
|
|
512
512
|
CURSOR_AGENT_FILENAME = "gsd-path.md"
|
|
513
513
|
CURSOR_AGENT_BACKUP_NAME = "cursor-agent-gsd-path.md"
|
|
@@ -533,7 +533,7 @@ def _shared_invocations(text: str) -> str:
|
|
|
533
533
|
others = f"{hosts['antigravity']['invocation_prefix']}{skill}"
|
|
534
534
|
return (
|
|
535
535
|
f"{quote}{codex}{arguments}{quote} (Codex) or "
|
|
536
|
-
f"{quote}{others}{arguments}{quote} (Antigravity/Zed)"
|
|
536
|
+
f"{quote}{others}{arguments}{quote} (Antigravity/Zed/Muse)"
|
|
537
537
|
)
|
|
538
538
|
|
|
539
539
|
return re.sub(
|
|
@@ -542,7 +542,7 @@ def _shared_invocations(text: str) -> str:
|
|
|
542
542
|
r"(?: \(Codex\) (?:and|or) (?P<paired_quote>`?)/"
|
|
543
543
|
r"(?P<paired_skill>gsd-path(?:-[a-z0-9]+)*|path)"
|
|
544
544
|
r"(?P<paired_arguments> status)?(?P=paired_quote)"
|
|
545
|
-
r" \((?:other hosts|Antigravity/Zed)\))?",
|
|
545
|
+
r" \((?:other hosts|Antigravity/Zed/Muse)\))?",
|
|
546
546
|
replace,
|
|
547
547
|
text,
|
|
548
548
|
)
|
|
@@ -620,7 +620,7 @@ def default_root(target: str, environ: Optional[Mapping[str, str]] = None) -> Pa
|
|
|
620
620
|
return absolute_path(Path("~/.gemini/antigravity-cli/skills"))
|
|
621
621
|
if target == "cursor":
|
|
622
622
|
return absolute_path(Path("~/.cursor/skills"))
|
|
623
|
-
if target
|
|
623
|
+
if target in ("zed", "muse"):
|
|
624
624
|
return absolute_path(Path("~/.agents/skills"))
|
|
625
625
|
if target == "kiro":
|
|
626
626
|
return absolute_path(Path(env.get("KIRO_HOME") or "~/.kiro") / "skills")
|
|
@@ -656,7 +656,15 @@ def _is_owned_router_alias(skill_dir: Path) -> bool:
|
|
|
656
656
|
version = version_file.read_text(encoding="utf-8").strip()
|
|
657
657
|
except (OSError, UnicodeError):
|
|
658
658
|
return False
|
|
659
|
-
return
|
|
659
|
+
return (
|
|
660
|
+
re.fullmatch(
|
|
661
|
+
r"[0-9]+(?:\.[0-9]+)+"
|
|
662
|
+
r"(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?"
|
|
663
|
+
r"(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?",
|
|
664
|
+
version,
|
|
665
|
+
)
|
|
666
|
+
is not None
|
|
667
|
+
)
|
|
660
668
|
|
|
661
669
|
|
|
662
670
|
def _is_managed_install_entry(root: Path, name: str) -> bool:
|
|
@@ -2259,7 +2267,7 @@ def _deployment_plans(plans: Sequence[TargetPlan]) -> List[DeploymentPlan]:
|
|
|
2259
2267
|
if not target_set <= SHARED_AGENT_TARGETS:
|
|
2260
2268
|
labels = ", ".join(targets)
|
|
2261
2269
|
raise InstallerError(
|
|
2262
|
-
"only Codex, Antigravity, and
|
|
2270
|
+
"only Codex, Antigravity, Zed, and Muse may share a skills root: "
|
|
2263
2271
|
f"{labels}"
|
|
2264
2272
|
)
|
|
2265
2273
|
profile = SHARED_AGENT_PROFILE
|
|
@@ -3275,6 +3283,31 @@ def install(
|
|
|
3275
3283
|
return results
|
|
3276
3284
|
|
|
3277
3285
|
|
|
3286
|
+
def _runtime_provenance(arguments, source_root: Path):
|
|
3287
|
+
"""Owner-recorded provenance from --runtime-provenance-* upgrade flags.
|
|
3288
|
+
|
|
3289
|
+
When the supplied source root is a git checkout and no patch reference
|
|
3290
|
+
was given, its HEAD sha is recorded with one best-effort rev-parse.
|
|
3291
|
+
Provenance is display/audit metadata on the runtime declaration only; it
|
|
3292
|
+
never joins the pinned digest or runtime validation.
|
|
3293
|
+
"""
|
|
3294
|
+
supplied = (arguments.runtime_provenance_source, arguments.runtime_provenance_patch,
|
|
3295
|
+
arguments.runtime_provenance_note)
|
|
3296
|
+
recorded = {key: value for key, value in zip(runtime_store.PROVENANCE_KEYS, supplied) if value}
|
|
3297
|
+
if not recorded:
|
|
3298
|
+
return None
|
|
3299
|
+
if "patch_ref" not in recorded:
|
|
3300
|
+
try:
|
|
3301
|
+
head = subprocess.run(["git", "rev-parse", "--show-toplevel", "HEAD"], cwd=source_root,
|
|
3302
|
+
capture_output=True, encoding="utf-8", check=True)
|
|
3303
|
+
toplevel, _, sha = head.stdout.strip().partition("\n")
|
|
3304
|
+
if sha and Path(toplevel).resolve() == Path(source_root).resolve():
|
|
3305
|
+
recorded["patch_ref"] = sha
|
|
3306
|
+
except (OSError, subprocess.CalledProcessError):
|
|
3307
|
+
pass
|
|
3308
|
+
return recorded
|
|
3309
|
+
|
|
3310
|
+
|
|
3278
3311
|
def parser() -> argparse.ArgumentParser:
|
|
3279
3312
|
argument_parser = argparse.ArgumentParser(description=__doc__)
|
|
3280
3313
|
for target in TARGETS:
|
|
@@ -3291,6 +3324,9 @@ def parser() -> argparse.ArgumentParser:
|
|
|
3291
3324
|
runtime_actions = argument_parser.add_mutually_exclusive_group()
|
|
3292
3325
|
for action in ("restore", "upgrade", "migrate"):
|
|
3293
3326
|
runtime_actions.add_argument(f"--runtime-{action}", action="store_true")
|
|
3327
|
+
argument_parser.add_argument("--runtime-provenance-source")
|
|
3328
|
+
argument_parser.add_argument("--runtime-provenance-patch")
|
|
3329
|
+
argument_parser.add_argument("--runtime-provenance-note")
|
|
3294
3330
|
argument_parser.add_argument("--hooks", action="store_true")
|
|
3295
3331
|
argument_parser.add_argument("--hooks-init", action="store_true")
|
|
3296
3332
|
argument_parser.add_argument("--hooks-refresh", action="store_true")
|
|
@@ -3336,6 +3372,9 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
|
3336
3372
|
)
|
|
3337
3373
|
runtime_action = next((action for action in ("restore", "upgrade", "migrate")
|
|
3338
3374
|
if getattr(arguments, "runtime_" + action)), None)
|
|
3375
|
+
provenance = _runtime_provenance(arguments, source_root)
|
|
3376
|
+
if provenance is not None and runtime_action != "upgrade":
|
|
3377
|
+
argument_parser.error("--runtime-provenance-* requires --runtime-upgrade")
|
|
3339
3378
|
if runtime_action:
|
|
3340
3379
|
if project is None:
|
|
3341
3380
|
argument_parser.error(f"--runtime-{runtime_action} requires --project")
|
|
@@ -3343,7 +3382,8 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
|
3343
3382
|
_validate_project_git_root(project)
|
|
3344
3383
|
locks, created = ([], []) if arguments.dry_run else _acquire_install_locks([project / HOOKS_DIRECTORY])
|
|
3345
3384
|
try:
|
|
3346
|
-
pin = runtime_store.operate(source_root, project, runtime_action,
|
|
3385
|
+
pin = runtime_store.operate(source_root, project, runtime_action,
|
|
3386
|
+
dry_run=arguments.dry_run, provenance=provenance)
|
|
3347
3387
|
finally:
|
|
3348
3388
|
_release_install_locks(locks, created)
|
|
3349
3389
|
print(f"runtime: {runtime_action} {pin['version']} ({pin['digest']})"
|
package/scripts/integration.py
CHANGED
|
@@ -9,6 +9,7 @@ sys.dont_write_bytecode = True
|
|
|
9
9
|
|
|
10
10
|
import json
|
|
11
11
|
import re
|
|
12
|
+
import contextlib
|
|
12
13
|
from pathlib import Path, PurePosixPath
|
|
13
14
|
from typing import Optional
|
|
14
15
|
|
|
@@ -797,6 +798,36 @@ def pull_request_tag_metadata(project: Path, tag_ref: str) -> dict[str, str]:
|
|
|
797
798
|
return fields
|
|
798
799
|
|
|
799
800
|
|
|
801
|
+
def external_landing_tag_message(
|
|
802
|
+
archive_name: str, ship_commit: str, landing: str
|
|
803
|
+
) -> str:
|
|
804
|
+
return (
|
|
805
|
+
f"milestone {archive_name}\n\n"
|
|
806
|
+
"Mode: external-landing\n"
|
|
807
|
+
f"Ship: {ship_commit}\n"
|
|
808
|
+
f"Landing: {landing}"
|
|
809
|
+
)
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
def external_landing_tag_metadata(project: Path, tag_ref: str) -> dict[str, str]:
|
|
813
|
+
message = archive_milestone.require_git_success(
|
|
814
|
+
run_git(project, "for-each-ref", "--format=%(contents)", tag_ref),
|
|
815
|
+
"inspect external-landing milestone tag",
|
|
816
|
+
)
|
|
817
|
+
fields: dict[str, str] = {}
|
|
818
|
+
for line in message.splitlines():
|
|
819
|
+
match = re.fullmatch(r"(Mode|Ship|Landing): (.+)", line)
|
|
820
|
+
if match:
|
|
821
|
+
if match.group(1) in fields:
|
|
822
|
+
raise ArchiveError("external-landing milestone tag repeats metadata")
|
|
823
|
+
fields[match.group(1)] = match.group(2)
|
|
824
|
+
if set(fields) != {"Mode", "Ship", "Landing"}:
|
|
825
|
+
raise ArchiveError("external-landing milestone tag is missing metadata")
|
|
826
|
+
if fields["Mode"] != "external-landing":
|
|
827
|
+
raise ArchiveError("external-landing milestone tag has the wrong mode")
|
|
828
|
+
return fields
|
|
829
|
+
|
|
830
|
+
|
|
800
831
|
def require_pull_request_merge(
|
|
801
832
|
project: Path,
|
|
802
833
|
merge_commit: str,
|
|
@@ -1021,6 +1052,78 @@ def integrate_pull_request(
|
|
|
1021
1052
|
return validate_integrated(project, archive_milestone.milestone_slug(state))
|
|
1022
1053
|
|
|
1023
1054
|
|
|
1055
|
+
def integrate_external_landing(
|
|
1056
|
+
project: Path,
|
|
1057
|
+
state: PipelineState,
|
|
1058
|
+
archive_path: str,
|
|
1059
|
+
archive_name: str,
|
|
1060
|
+
ship_commit: str,
|
|
1061
|
+
remote_default: str,
|
|
1062
|
+
default_name: str,
|
|
1063
|
+
bound_branch: str,
|
|
1064
|
+
) -> dict:
|
|
1065
|
+
if state.branch is None:
|
|
1066
|
+
raise ArchiveError("external-landing integration requires a bound branch")
|
|
1067
|
+
publishable_bound_branch(project, bound_branch, ship_commit)
|
|
1068
|
+
contains_ship = run_git(
|
|
1069
|
+
project, "merge-base", "--is-ancestor", ship_commit, remote_default
|
|
1070
|
+
)
|
|
1071
|
+
if contains_ship.returncode == 1:
|
|
1072
|
+
publish_bound_branch(project, bound_branch, ship_commit)
|
|
1073
|
+
return {
|
|
1074
|
+
"status": "awaiting-merge",
|
|
1075
|
+
"mode": "external-landing",
|
|
1076
|
+
"archive": archive_path,
|
|
1077
|
+
"commit": ship_commit,
|
|
1078
|
+
}
|
|
1079
|
+
if contains_ship.returncode != 0:
|
|
1080
|
+
archive_milestone.require_git_success(
|
|
1081
|
+
contains_ship, "inspect ship ancestry on the remote default"
|
|
1082
|
+
)
|
|
1083
|
+
raise AssertionError("unreachable")
|
|
1084
|
+
|
|
1085
|
+
merge_commit = find_integrate_commit(
|
|
1086
|
+
project, remote_default, archive_name, ship_commit
|
|
1087
|
+
)
|
|
1088
|
+
require_generated_integration_commit(
|
|
1089
|
+
project,
|
|
1090
|
+
merge_commit,
|
|
1091
|
+
archive_path,
|
|
1092
|
+
archive_name,
|
|
1093
|
+
ship_commit,
|
|
1094
|
+
default_name,
|
|
1095
|
+
bound_branch,
|
|
1096
|
+
)
|
|
1097
|
+
tag_name = f"milestone/{archive_name}"
|
|
1098
|
+
message = external_landing_tag_message(archive_name, ship_commit, merge_commit)
|
|
1099
|
+
tag_object, tag_published = ensure_integration_tag(
|
|
1100
|
+
project,
|
|
1101
|
+
tag_name,
|
|
1102
|
+
merge_commit,
|
|
1103
|
+
message,
|
|
1104
|
+
)
|
|
1105
|
+
if not tag_published:
|
|
1106
|
+
archive_milestone.require_git_success(
|
|
1107
|
+
run_git(
|
|
1108
|
+
project,
|
|
1109
|
+
"push",
|
|
1110
|
+
"origin",
|
|
1111
|
+
f"refs/tags/{tag_name}:refs/tags/{tag_name}",
|
|
1112
|
+
),
|
|
1113
|
+
"push milestone tag",
|
|
1114
|
+
)
|
|
1115
|
+
archive_milestone.require_git_success(
|
|
1116
|
+
run_git(
|
|
1117
|
+
project,
|
|
1118
|
+
"update-ref",
|
|
1119
|
+
f"refs/remotes/origin/tags/{tag_name}",
|
|
1120
|
+
tag_object,
|
|
1121
|
+
),
|
|
1122
|
+
"refresh local milestone-tag ref",
|
|
1123
|
+
)
|
|
1124
|
+
return validate_integrated(project, archive_milestone.milestone_slug(state))
|
|
1125
|
+
|
|
1126
|
+
|
|
1024
1127
|
def integrate(repo: Path, slug: str) -> dict:
|
|
1025
1128
|
project = repo.resolve()
|
|
1026
1129
|
active_root = archive_milestone.require_project_layout(project)
|
|
@@ -1070,6 +1173,17 @@ def integrate(repo: Path, slug: str) -> dict:
|
|
|
1070
1173
|
archive_name,
|
|
1071
1174
|
ship_commit,
|
|
1072
1175
|
)
|
|
1176
|
+
if state.integration == "external-landing":
|
|
1177
|
+
return integrate_external_landing(
|
|
1178
|
+
project,
|
|
1179
|
+
state,
|
|
1180
|
+
archive_path,
|
|
1181
|
+
archive_name,
|
|
1182
|
+
ship_commit,
|
|
1183
|
+
remote_default,
|
|
1184
|
+
default_name,
|
|
1185
|
+
bound_branch,
|
|
1186
|
+
)
|
|
1073
1187
|
publishable_bound_branch(project, bound_branch, ship_commit)
|
|
1074
1188
|
integration_branch, worktree = integration_names(project, archive_name, pin=True)
|
|
1075
1189
|
interrupted_worktree = registered_worktree(project, integration_branch)
|
|
@@ -1345,6 +1459,32 @@ def validate_integrated(
|
|
|
1345
1459
|
merge_commit,
|
|
1346
1460
|
),
|
|
1347
1461
|
)
|
|
1462
|
+
elif state.integration == "external-landing":
|
|
1463
|
+
merge_commit = find_integrate_commit(
|
|
1464
|
+
project, remote_default, archive_name, ship_commit
|
|
1465
|
+
)
|
|
1466
|
+
archive_milestone.require_canonical_commit_body(
|
|
1467
|
+
project,
|
|
1468
|
+
merge_commit,
|
|
1469
|
+
integrate_subject(archive_name, default_name),
|
|
1470
|
+
integrate_commit_body(configured, ship_commit, default_name, bound_branch),
|
|
1471
|
+
"integration",
|
|
1472
|
+
)
|
|
1473
|
+
require_pull_request_merge(project, merge_commit, ship_commit, remote_default)
|
|
1474
|
+
if run_git(project, "rev-parse", "--verify", "--quiet", tag_ref).returncode != 0:
|
|
1475
|
+
raise ArchiveError(f"missing milestone tag: {tag_name}")
|
|
1476
|
+
metadata = external_landing_tag_metadata(project, tag_ref)
|
|
1477
|
+
if metadata["Ship"] != ship_commit:
|
|
1478
|
+
raise ArchiveError("external-landing milestone tag names the wrong ship commit")
|
|
1479
|
+
if metadata["Landing"] != merge_commit:
|
|
1480
|
+
raise ArchiveError("external-landing milestone tag names the wrong landing")
|
|
1481
|
+
require_annotated_tag(
|
|
1482
|
+
project,
|
|
1483
|
+
tag_ref,
|
|
1484
|
+
merge_commit,
|
|
1485
|
+
f"milestone tag {tag_name}",
|
|
1486
|
+
external_landing_tag_message(archive_name, ship_commit, merge_commit),
|
|
1487
|
+
)
|
|
1348
1488
|
else:
|
|
1349
1489
|
merge_commit = find_integrate_commit(
|
|
1350
1490
|
project, remote_default, archive_name, ship_commit
|
|
@@ -1381,7 +1521,8 @@ def validate_integrated(
|
|
|
1381
1521
|
ship_commit,
|
|
1382
1522
|
tag_name,
|
|
1383
1523
|
merge_commit,
|
|
1384
|
-
allow_missing_bound=state.integration
|
|
1524
|
+
allow_missing_bound=state.integration in ("pull-request", "external-landing")
|
|
1525
|
+
or (historical and has_origin),
|
|
1385
1526
|
retired=historical,
|
|
1386
1527
|
)
|
|
1387
1528
|
|
|
@@ -1799,6 +1940,10 @@ def retire_member(coordinator: Path, member: str, archive_path: str, reviewed_he
|
|
|
1799
1940
|
for kind, ref in (("push", bound_ref), ("push", "refs/heads/main"), ("push", f"refs/tags/{tag_name}"),
|
|
1800
1941
|
("delete", bound_ref)):
|
|
1801
1942
|
members.clear_authorization(checkout, project, kind, ref)
|
|
1943
|
+
# The last sidecar retires here at milestone end; isolation's retires also
|
|
1944
|
+
# release the pin whenever the workspace is idle, so a new root can apply.
|
|
1945
|
+
with contextlib.suppress(ValueError, OSError):
|
|
1946
|
+
worktree_paths.release_workspace(checkout)
|
|
1802
1947
|
return {"member": member, "retired": bound}
|
|
1803
1948
|
|
|
1804
1949
|
|