@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.
Files changed (347) hide show
  1. package/CHANGELOG.md +325 -344
  2. package/DOCS.md +12 -2
  3. package/FULL.md +3 -2
  4. package/HOOKS.md +95 -8
  5. package/QUICK.md +1 -1
  6. package/README.md +78 -110
  7. package/RUNTIME.md +1 -1
  8. package/UPDATE.md +4 -3
  9. package/WORKFLOW.md +22 -1
  10. package/package.json +5 -2
  11. package/platforms/shared-agents/dispatch.md +13 -0
  12. package/scripts/_common.py +149 -1
  13. package/scripts/archive_milestone.py +14 -13
  14. package/scripts/build_recovery.py +96 -31
  15. package/scripts/build_state.py +79 -3
  16. package/scripts/check_docs_audit.py +77 -4
  17. package/scripts/check_handoffs.py +546 -30
  18. package/scripts/check_task_briefs.py +279 -23
  19. package/scripts/detect_project.py +243 -18
  20. package/scripts/discussion_validate.py +86 -29
  21. package/scripts/dispatch_driver.py +392 -22
  22. package/scripts/git_guard.py +3 -3
  23. package/scripts/guard_hook.py +1416 -165
  24. package/scripts/install.mjs +23 -8
  25. package/scripts/install.py +49 -9
  26. package/scripts/integration.py +146 -1
  27. package/scripts/isolation.py +392 -60
  28. package/scripts/loop_run.py +16 -4
  29. package/scripts/members.py +11 -9
  30. package/scripts/path_config.py +3 -3
  31. package/scripts/pipeline_git.py +63 -12
  32. package/scripts/pipeline_state.py +111 -33
  33. package/scripts/pipeline_undo.py +101 -8
  34. package/scripts/runtime_store.py +20 -2
  35. package/scripts/skill-resources.json +9 -2
  36. package/scripts/state_checkpoint.py +9 -27
  37. package/scripts/status_runtime.py +22 -4
  38. package/scripts/task_context.py +12 -3
  39. package/scripts/wizard.mjs +1 -0
  40. package/scripts/workflow_run.py +5 -2
  41. package/scripts/worktree_paths.py +54 -2
  42. package/skills/gsd-path/DEFINE.md +28 -3
  43. package/skills/gsd-path/PLAN.md +11 -3
  44. package/skills/gsd-path/RESEARCH.md +11 -0
  45. package/skills/gsd-path/SHIP.md +6 -1
  46. package/skills/gsd-path/references/build-native.md +16 -1
  47. package/skills/gsd-path/references/dispatch.md +13 -0
  48. package/skills/gsd-path/references/docs-auditor.md +5 -0
  49. package/skills/gsd-path/references/planner.md +14 -4
  50. package/skills/gsd-path/references/reviewer-final.md +20 -2
  51. package/skills/gsd-path/references/reviewer-wave.md +15 -4
  52. package/skills/gsd-path/references/reviewer.md +3 -1
  53. package/skills/gsd-path/references/spec-probes.md +150 -0
  54. package/skills/gsd-path/scripts/_common.py +149 -1
  55. package/skills/gsd-path/scripts/archive_milestone.py +14 -13
  56. package/skills/gsd-path/scripts/build_recovery.py +96 -31
  57. package/skills/gsd-path/scripts/build_state.py +79 -3
  58. package/skills/gsd-path/scripts/check_docs_audit.py +77 -4
  59. package/skills/gsd-path/scripts/check_handoffs.py +546 -30
  60. package/skills/gsd-path/scripts/check_task_briefs.py +279 -23
  61. package/skills/gsd-path/scripts/detect_project.py +243 -18
  62. package/skills/gsd-path/scripts/discussion_validate.py +86 -29
  63. package/skills/gsd-path/scripts/dispatch_driver.py +392 -22
  64. package/skills/gsd-path/scripts/git_guard.py +3 -3
  65. package/skills/gsd-path/scripts/integration.py +146 -1
  66. package/skills/gsd-path/scripts/isolation.py +392 -60
  67. package/skills/gsd-path/scripts/loop_run.py +16 -4
  68. package/skills/gsd-path/scripts/members.py +11 -9
  69. package/skills/gsd-path/scripts/path_config.py +3 -3
  70. package/skills/gsd-path/scripts/pipeline_git.py +63 -12
  71. package/skills/gsd-path/scripts/pipeline_state.py +111 -33
  72. package/skills/gsd-path/scripts/state_checkpoint.py +9 -27
  73. package/skills/gsd-path/scripts/status_runtime.py +22 -4
  74. package/skills/gsd-path/scripts/task_context.py +12 -3
  75. package/skills/gsd-path/scripts/workflow_run.py +5 -2
  76. package/skills/gsd-path/scripts/worktree_paths.py +54 -2
  77. package/skills/gsd-path/templates/docs-audit.md +5 -1
  78. package/skills/gsd-path/templates/final-review.md +11 -2
  79. package/skills/gsd-path/templates/intent.md +30 -0
  80. package/skills/gsd-path/templates/patch-findings.md +3 -3
  81. package/skills/gsd-path/templates/plan.md +17 -2
  82. package/skills/gsd-path/templates/research-handoff.md +14 -3
  83. package/skills/gsd-path/templates/state.md +1 -1
  84. package/skills/gsd-path/templates/wave-review.md +16 -6
  85. package/skills/gsd-path-build/references/build-native.md +16 -1
  86. package/skills/gsd-path-build/references/dispatch.md +13 -0
  87. package/skills/gsd-path-build/references/reviewer-final.md +20 -2
  88. package/skills/gsd-path-build/references/reviewer-wave.md +15 -4
  89. package/skills/gsd-path-build/references/reviewer.md +3 -1
  90. package/skills/gsd-path-build/references/spec-probes.md +150 -0
  91. package/skills/gsd-path-build/scripts/_common.py +149 -1
  92. package/skills/gsd-path-build/scripts/archive_milestone.py +14 -13
  93. package/skills/gsd-path-build/scripts/build_recovery.py +96 -31
  94. package/skills/gsd-path-build/scripts/build_state.py +79 -3
  95. package/skills/gsd-path-build/scripts/check_handoffs.py +546 -30
  96. package/skills/gsd-path-build/scripts/check_task_briefs.py +279 -23
  97. package/skills/gsd-path-build/scripts/detect_project.py +243 -18
  98. package/skills/gsd-path-build/scripts/discussion_validate.py +86 -29
  99. package/skills/gsd-path-build/scripts/dispatch_driver.py +392 -22
  100. package/skills/gsd-path-build/scripts/integration.py +146 -1
  101. package/skills/gsd-path-build/scripts/isolation.py +392 -60
  102. package/skills/gsd-path-build/scripts/loop_run.py +16 -4
  103. package/skills/gsd-path-build/scripts/members.py +11 -9
  104. package/skills/gsd-path-build/scripts/path_config.py +3 -3
  105. package/skills/gsd-path-build/scripts/pipeline_git.py +63 -12
  106. package/skills/gsd-path-build/scripts/pipeline_state.py +111 -33
  107. package/skills/gsd-path-build/scripts/state_checkpoint.py +9 -27
  108. package/skills/gsd-path-build/scripts/task_context.py +12 -3
  109. package/skills/gsd-path-build/scripts/workflow_run.py +5 -2
  110. package/skills/gsd-path-build/scripts/worktree_paths.py +54 -2
  111. package/skills/gsd-path-build/templates/wave-review.md +16 -6
  112. package/skills/gsd-path-decide/references/dispatch.md +13 -0
  113. package/skills/gsd-path-decide/scripts/_common.py +149 -1
  114. package/skills/gsd-path-decide/scripts/archive_milestone.py +14 -13
  115. package/skills/gsd-path-decide/scripts/build_recovery.py +96 -31
  116. package/skills/gsd-path-decide/scripts/check_handoffs.py +546 -30
  117. package/skills/gsd-path-decide/scripts/check_task_briefs.py +279 -23
  118. package/skills/gsd-path-decide/scripts/detect_project.py +243 -18
  119. package/skills/gsd-path-decide/scripts/discussion_validate.py +86 -29
  120. package/skills/gsd-path-decide/scripts/integration.py +146 -1
  121. package/skills/gsd-path-decide/scripts/isolation.py +392 -60
  122. package/skills/gsd-path-decide/scripts/loop_run.py +16 -4
  123. package/skills/gsd-path-decide/scripts/members.py +11 -9
  124. package/skills/gsd-path-decide/scripts/path_config.py +3 -3
  125. package/skills/gsd-path-decide/scripts/pipeline_git.py +63 -12
  126. package/skills/gsd-path-decide/scripts/pipeline_state.py +111 -33
  127. package/skills/gsd-path-decide/scripts/state_checkpoint.py +9 -27
  128. package/skills/gsd-path-decide/scripts/worktree_paths.py +54 -2
  129. package/skills/gsd-path-define/SKILL.md +28 -3
  130. package/skills/gsd-path-define/references/spec-probes.md +150 -0
  131. package/skills/gsd-path-define/scripts/_common.py +149 -1
  132. package/skills/gsd-path-define/scripts/archive_milestone.py +14 -13
  133. package/skills/gsd-path-define/scripts/build_recovery.py +96 -31
  134. package/skills/gsd-path-define/scripts/check_handoffs.py +546 -30
  135. package/skills/gsd-path-define/scripts/check_task_briefs.py +279 -23
  136. package/skills/gsd-path-define/scripts/detect_project.py +243 -18
  137. package/skills/gsd-path-define/scripts/discussion_validate.py +86 -29
  138. package/skills/gsd-path-define/scripts/integration.py +146 -1
  139. package/skills/gsd-path-define/scripts/isolation.py +392 -60
  140. package/skills/gsd-path-define/scripts/loop_run.py +16 -4
  141. package/skills/gsd-path-define/scripts/members.py +11 -9
  142. package/skills/gsd-path-define/scripts/path_config.py +3 -3
  143. package/skills/gsd-path-define/scripts/pipeline_git.py +63 -12
  144. package/skills/gsd-path-define/scripts/pipeline_state.py +111 -33
  145. package/skills/gsd-path-define/scripts/state_checkpoint.py +9 -27
  146. package/skills/gsd-path-define/scripts/worktree_paths.py +54 -2
  147. package/skills/gsd-path-define/templates/intent.md +30 -0
  148. package/skills/gsd-path-define/templates/state.md +1 -1
  149. package/skills/gsd-path-discuss/scripts/_common.py +149 -1
  150. package/skills/gsd-path-discuss/scripts/loop_run.py +16 -4
  151. package/skills/gsd-path-discuss/scripts/path_config.py +3 -3
  152. package/skills/gsd-path-discuss/scripts/worktree_paths.py +54 -2
  153. package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
  154. package/skills/gsd-path-docs-audit/references/docs-auditor.md +5 -0
  155. package/skills/gsd-path-docs-audit/scripts/_common.py +149 -1
  156. package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +14 -13
  157. package/skills/gsd-path-docs-audit/scripts/build_recovery.py +96 -31
  158. package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +77 -4
  159. package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +546 -30
  160. package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +279 -23
  161. package/skills/gsd-path-docs-audit/scripts/detect_project.py +243 -18
  162. package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +86 -29
  163. package/skills/gsd-path-docs-audit/scripts/integration.py +146 -1
  164. package/skills/gsd-path-docs-audit/scripts/isolation.py +392 -60
  165. package/skills/gsd-path-docs-audit/scripts/loop_run.py +16 -4
  166. package/skills/gsd-path-docs-audit/scripts/members.py +11 -9
  167. package/skills/gsd-path-docs-audit/scripts/path_config.py +3 -3
  168. package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +63 -12
  169. package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +111 -33
  170. package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +9 -27
  171. package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +54 -2
  172. package/skills/gsd-path-docs-audit/templates/docs-audit.md +5 -1
  173. package/skills/gsd-path-forensics/scripts/_common.py +149 -1
  174. package/skills/gsd-path-forensics/scripts/loop_run.py +16 -4
  175. package/skills/gsd-path-forensics/scripts/path_config.py +3 -3
  176. package/skills/gsd-path-forensics/scripts/pipeline_undo.py +101 -8
  177. package/skills/gsd-path-forensics/scripts/worktree_paths.py +54 -2
  178. package/skills/gsd-path-inspect/references/dispatch.md +13 -0
  179. package/skills/gsd-path-inspect/references/docs-auditor.md +5 -0
  180. package/skills/gsd-path-inspect/scripts/_common.py +149 -1
  181. package/skills/gsd-path-inspect/scripts/archive_milestone.py +14 -13
  182. package/skills/gsd-path-inspect/scripts/build_recovery.py +96 -31
  183. package/skills/gsd-path-inspect/scripts/check_docs_audit.py +77 -4
  184. package/skills/gsd-path-inspect/scripts/check_handoffs.py +546 -30
  185. package/skills/gsd-path-inspect/scripts/check_task_briefs.py +279 -23
  186. package/skills/gsd-path-inspect/scripts/detect_project.py +243 -18
  187. package/skills/gsd-path-inspect/scripts/discussion_validate.py +86 -29
  188. package/skills/gsd-path-inspect/scripts/integration.py +146 -1
  189. package/skills/gsd-path-inspect/scripts/isolation.py +392 -60
  190. package/skills/gsd-path-inspect/scripts/loop_run.py +16 -4
  191. package/skills/gsd-path-inspect/scripts/members.py +11 -9
  192. package/skills/gsd-path-inspect/scripts/path_config.py +3 -3
  193. package/skills/gsd-path-inspect/scripts/pipeline_git.py +63 -12
  194. package/skills/gsd-path-inspect/scripts/pipeline_state.py +111 -33
  195. package/skills/gsd-path-inspect/scripts/state_checkpoint.py +9 -27
  196. package/skills/gsd-path-inspect/scripts/workflow_run.py +5 -2
  197. package/skills/gsd-path-inspect/scripts/worktree_paths.py +54 -2
  198. package/skills/gsd-path-inspect/templates/docs-audit.md +5 -1
  199. package/skills/gsd-path-inspect/templates/state.md +1 -1
  200. package/skills/gsd-path-loop/scripts/_common.py +149 -1
  201. package/skills/gsd-path-loop/scripts/loop_run.py +16 -4
  202. package/skills/gsd-path-loop/scripts/path_config.py +3 -3
  203. package/skills/gsd-path-loop/scripts/worktree_paths.py +54 -2
  204. package/skills/gsd-path-migrate/scripts/_common.py +149 -1
  205. package/skills/gsd-path-migrate/scripts/loop_run.py +16 -4
  206. package/skills/gsd-path-migrate/scripts/path_config.py +3 -3
  207. package/skills/gsd-path-plan/SKILL.md +11 -3
  208. package/skills/gsd-path-plan/references/dispatch.md +13 -0
  209. package/skills/gsd-path-plan/references/planner.md +14 -4
  210. package/skills/gsd-path-plan/references/spec-probes.md +150 -0
  211. package/skills/gsd-path-plan/scripts/_common.py +149 -1
  212. package/skills/gsd-path-plan/scripts/archive_milestone.py +14 -13
  213. package/skills/gsd-path-plan/scripts/build_recovery.py +96 -31
  214. package/skills/gsd-path-plan/scripts/check_handoffs.py +546 -30
  215. package/skills/gsd-path-plan/scripts/check_task_briefs.py +279 -23
  216. package/skills/gsd-path-plan/scripts/detect_project.py +243 -18
  217. package/skills/gsd-path-plan/scripts/discussion_validate.py +86 -29
  218. package/skills/gsd-path-plan/scripts/integration.py +146 -1
  219. package/skills/gsd-path-plan/scripts/isolation.py +392 -60
  220. package/skills/gsd-path-plan/scripts/loop_run.py +16 -4
  221. package/skills/gsd-path-plan/scripts/members.py +11 -9
  222. package/skills/gsd-path-plan/scripts/path_config.py +3 -3
  223. package/skills/gsd-path-plan/scripts/pipeline_git.py +63 -12
  224. package/skills/gsd-path-plan/scripts/pipeline_state.py +111 -33
  225. package/skills/gsd-path-plan/scripts/state_checkpoint.py +9 -27
  226. package/skills/gsd-path-plan/scripts/workflow_run.py +5 -2
  227. package/skills/gsd-path-plan/scripts/worktree_paths.py +54 -2
  228. package/skills/gsd-path-plan/templates/patch-findings.md +3 -3
  229. package/skills/gsd-path-plan/templates/plan.md +17 -2
  230. package/skills/gsd-path-research/SKILL.md +11 -0
  231. package/skills/gsd-path-research/references/dispatch.md +13 -0
  232. package/skills/gsd-path-research/scripts/_common.py +149 -1
  233. package/skills/gsd-path-research/scripts/archive_milestone.py +14 -13
  234. package/skills/gsd-path-research/scripts/build_recovery.py +96 -31
  235. package/skills/gsd-path-research/scripts/check_handoffs.py +546 -30
  236. package/skills/gsd-path-research/scripts/check_task_briefs.py +279 -23
  237. package/skills/gsd-path-research/scripts/detect_project.py +243 -18
  238. package/skills/gsd-path-research/scripts/discussion_validate.py +86 -29
  239. package/skills/gsd-path-research/scripts/integration.py +146 -1
  240. package/skills/gsd-path-research/scripts/isolation.py +392 -60
  241. package/skills/gsd-path-research/scripts/loop_run.py +16 -4
  242. package/skills/gsd-path-research/scripts/members.py +11 -9
  243. package/skills/gsd-path-research/scripts/path_config.py +3 -3
  244. package/skills/gsd-path-research/scripts/pipeline_git.py +63 -12
  245. package/skills/gsd-path-research/scripts/pipeline_state.py +111 -33
  246. package/skills/gsd-path-research/scripts/state_checkpoint.py +9 -27
  247. package/skills/gsd-path-research/scripts/worktree_paths.py +54 -2
  248. package/skills/gsd-path-research/templates/research-handoff.md +14 -3
  249. package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
  250. package/skills/gsd-path-roadmap/scripts/_common.py +149 -1
  251. package/skills/gsd-path-roadmap/scripts/archive_milestone.py +14 -13
  252. package/skills/gsd-path-roadmap/scripts/build_recovery.py +96 -31
  253. package/skills/gsd-path-roadmap/scripts/check_handoffs.py +546 -30
  254. package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +279 -23
  255. package/skills/gsd-path-roadmap/scripts/detect_project.py +243 -18
  256. package/skills/gsd-path-roadmap/scripts/discussion_validate.py +86 -29
  257. package/skills/gsd-path-roadmap/scripts/integration.py +146 -1
  258. package/skills/gsd-path-roadmap/scripts/isolation.py +392 -60
  259. package/skills/gsd-path-roadmap/scripts/loop_run.py +16 -4
  260. package/skills/gsd-path-roadmap/scripts/members.py +11 -9
  261. package/skills/gsd-path-roadmap/scripts/path_config.py +3 -3
  262. package/skills/gsd-path-roadmap/scripts/pipeline_git.py +63 -12
  263. package/skills/gsd-path-roadmap/scripts/pipeline_state.py +111 -33
  264. package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +9 -27
  265. package/skills/gsd-path-roadmap/scripts/worktree_paths.py +54 -2
  266. package/skills/gsd-path-ship/SKILL.md +6 -1
  267. package/skills/gsd-path-ship/references/dispatch.md +13 -0
  268. package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
  269. package/skills/gsd-path-ship/references/reviewer-wave.md +15 -4
  270. package/skills/gsd-path-ship/references/reviewer.md +3 -1
  271. package/skills/gsd-path-ship/references/spec-probes.md +150 -0
  272. package/skills/gsd-path-ship/scripts/_common.py +149 -1
  273. package/skills/gsd-path-ship/scripts/archive_milestone.py +14 -13
  274. package/skills/gsd-path-ship/scripts/build_recovery.py +96 -31
  275. package/skills/gsd-path-ship/scripts/build_state.py +79 -3
  276. package/skills/gsd-path-ship/scripts/check_handoffs.py +546 -30
  277. package/skills/gsd-path-ship/scripts/check_task_briefs.py +279 -23
  278. package/skills/gsd-path-ship/scripts/detect_project.py +243 -18
  279. package/skills/gsd-path-ship/scripts/discussion_validate.py +86 -29
  280. package/skills/gsd-path-ship/scripts/integration.py +146 -1
  281. package/skills/gsd-path-ship/scripts/isolation.py +392 -60
  282. package/skills/gsd-path-ship/scripts/loop_run.py +16 -4
  283. package/skills/gsd-path-ship/scripts/members.py +11 -9
  284. package/skills/gsd-path-ship/scripts/path_config.py +3 -3
  285. package/skills/gsd-path-ship/scripts/pipeline_git.py +63 -12
  286. package/skills/gsd-path-ship/scripts/pipeline_state.py +111 -33
  287. package/skills/gsd-path-ship/scripts/state_checkpoint.py +9 -27
  288. package/skills/gsd-path-ship/scripts/workflow_run.py +5 -2
  289. package/skills/gsd-path-ship/scripts/worktree_paths.py +54 -2
  290. package/skills/gsd-path-ship/templates/final-review.md +11 -2
  291. package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
  292. package/skills/gsd-path-ship/templates/wave-review.md +16 -6
  293. package/skills/gsd-path-undo/scripts/_common.py +149 -1
  294. package/skills/gsd-path-undo/scripts/loop_run.py +16 -4
  295. package/skills/gsd-path-undo/scripts/path_config.py +3 -3
  296. package/skills/gsd-path-undo/scripts/pipeline_undo.py +101 -8
  297. package/skills/gsd-path-undo/scripts/worktree_paths.py +54 -2
  298. package/skills/path/DEFINE.md +28 -3
  299. package/skills/path/PLAN.md +11 -3
  300. package/skills/path/RESEARCH.md +11 -0
  301. package/skills/path/SHIP.md +6 -1
  302. package/skills/path/references/build-native.md +16 -1
  303. package/skills/path/references/dispatch.md +13 -0
  304. package/skills/path/references/docs-auditor.md +5 -0
  305. package/skills/path/references/planner.md +14 -4
  306. package/skills/path/references/reviewer-final.md +20 -2
  307. package/skills/path/references/reviewer-wave.md +15 -4
  308. package/skills/path/references/reviewer.md +3 -1
  309. package/skills/path/references/spec-probes.md +150 -0
  310. package/skills/path/scripts/_common.py +149 -1
  311. package/skills/path/scripts/archive_milestone.py +14 -13
  312. package/skills/path/scripts/build_recovery.py +96 -31
  313. package/skills/path/scripts/build_state.py +79 -3
  314. package/skills/path/scripts/check_docs_audit.py +77 -4
  315. package/skills/path/scripts/check_handoffs.py +546 -30
  316. package/skills/path/scripts/check_task_briefs.py +279 -23
  317. package/skills/path/scripts/detect_project.py +243 -18
  318. package/skills/path/scripts/discussion_validate.py +86 -29
  319. package/skills/path/scripts/dispatch_driver.py +392 -22
  320. package/skills/path/scripts/git_guard.py +3 -3
  321. package/skills/path/scripts/integration.py +146 -1
  322. package/skills/path/scripts/isolation.py +392 -60
  323. package/skills/path/scripts/loop_run.py +16 -4
  324. package/skills/path/scripts/members.py +11 -9
  325. package/skills/path/scripts/path_config.py +3 -3
  326. package/skills/path/scripts/pipeline_git.py +63 -12
  327. package/skills/path/scripts/pipeline_state.py +111 -33
  328. package/skills/path/scripts/state_checkpoint.py +9 -27
  329. package/skills/path/scripts/status_runtime.py +22 -4
  330. package/skills/path/scripts/task_context.py +12 -3
  331. package/skills/path/scripts/workflow_run.py +5 -2
  332. package/skills/path/scripts/worktree_paths.py +54 -2
  333. package/skills/path/templates/docs-audit.md +5 -1
  334. package/skills/path/templates/final-review.md +11 -2
  335. package/skills/path/templates/intent.md +30 -0
  336. package/skills/path/templates/patch-findings.md +3 -3
  337. package/skills/path/templates/plan.md +17 -2
  338. package/skills/path/templates/research-handoff.md +14 -3
  339. package/skills/path/templates/state.md +1 -1
  340. package/skills/path/templates/wave-review.md +16 -6
  341. package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  342. package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  343. package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  344. package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
  345. package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  346. package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
  347. package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
@@ -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]+)+$/.test(fs.readFileSync(versionFile, "utf8").trim());
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
- fs.cpSync(path.join(stagedRoot, name), destination, { recursive: true, errorOnExist: true, force: false });
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 Zed may share a skills root: ${targets.join(", ")}`
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];
@@ -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 == "zed":
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 re.fullmatch(r"[0-9]+(?:\.[0-9]+)+", version) is not None
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 Zed may share a skills root: "
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, dry_run=arguments.dry_run)
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']})"
@@ -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 == "pull-request" or (historical and has_origin),
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