@rpamis/comet 0.3.8 → 0.4.0-beta.1

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 (627) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +381 -234
  3. package/assets/manifest.json +33 -12
  4. package/assets/skills/comet/SKILL.md +87 -102
  5. package/assets/skills/comet/reference/auto-transition.md +1 -1
  6. package/assets/skills/comet/reference/comet-yaml-fields.md +11 -4
  7. package/assets/skills/comet/reference/context-recovery.md +12 -2
  8. package/assets/skills/comet/reference/debug-gate.md +17 -1
  9. package/assets/skills/comet/reference/decision-point.md +13 -2
  10. package/assets/skills/comet/reference/dirty-worktree.md +59 -59
  11. package/assets/skills/comet/reference/intent-frame.md +74 -0
  12. package/assets/skills/comet/reference/scripts.md +69 -0
  13. package/assets/skills/comet/reference/subagent-dispatch.md +79 -23
  14. package/assets/skills/comet/rules/comet-phase-guard.en.md +43 -11
  15. package/assets/skills/comet/rules/comet-phase-guard.md +44 -11
  16. package/assets/skills/comet/runtime/classic/checks.yaml +6 -0
  17. package/assets/skills/comet/runtime/classic/guardrails.yaml +13 -0
  18. package/assets/skills/comet/runtime/classic/skill.yaml +122 -0
  19. package/assets/skills/comet/scripts/comet-archive.mjs +3 -0
  20. package/assets/skills/comet/scripts/comet-env.mjs +15 -0
  21. package/assets/skills/comet/scripts/comet-guard.mjs +3 -0
  22. package/assets/skills/comet/scripts/comet-handoff.mjs +3 -0
  23. package/assets/skills/comet/scripts/comet-hook-guard.mjs +3 -0
  24. package/assets/skills/comet/scripts/comet-intent.mjs +3 -0
  25. package/assets/skills/comet/scripts/comet-runtime.mjs +12857 -0
  26. package/assets/skills/comet/scripts/comet-state.mjs +3 -0
  27. package/assets/skills/comet/scripts/comet-yaml-validate.mjs +3 -0
  28. package/assets/skills/comet-any/SKILL.md +118 -0
  29. package/assets/skills/comet-any/reference/authored-zone-example.md +100 -0
  30. package/assets/skills/comet-any/reference/authoring-protocol.json +91 -0
  31. package/assets/skills/comet-any/reference/authoring-subagents.md +102 -0
  32. package/assets/skills/comet-any/reference/bundle-authoring.md +166 -0
  33. package/assets/skills/comet-any/reference/eval-provider.md +83 -0
  34. package/assets/skills/comet-any/reference/subagents/pause-points-author.md +75 -0
  35. package/assets/skills/comet-any/reference/subagents/reference-author.md +77 -0
  36. package/assets/skills/comet-any/reference/subagents/script-author.md +81 -0
  37. package/assets/skills/comet-any/reference/subagents/skill-core-author.md +129 -0
  38. package/assets/skills/comet-any/reference/subagents/skill-reviewer.md +124 -0
  39. package/assets/skills/comet-any/reference/subagents/workflow-entry-author.md +100 -0
  40. package/assets/skills/comet-archive/SKILL.md +25 -15
  41. package/assets/skills/comet-build/SKILL.md +51 -40
  42. package/assets/skills/comet-design/SKILL.md +14 -18
  43. package/assets/skills/comet-hotfix/SKILL.md +33 -43
  44. package/assets/skills/comet-open/SKILL.md +28 -21
  45. package/assets/skills/comet-tweak/SKILL.md +71 -65
  46. package/assets/skills/comet-verify/SKILL.md +31 -35
  47. package/assets/skills-zh/comet/SKILL.md +88 -102
  48. package/assets/skills-zh/comet/reference/auto-transition.md +3 -3
  49. package/assets/skills-zh/comet/reference/comet-yaml-fields.md +11 -4
  50. package/assets/skills-zh/comet/reference/context-recovery.md +12 -2
  51. package/assets/skills-zh/comet/reference/debug-gate.md +19 -3
  52. package/assets/skills-zh/comet/reference/decision-point.md +13 -2
  53. package/assets/skills-zh/comet/reference/dirty-worktree.md +59 -59
  54. package/assets/skills-zh/comet/reference/intent-frame.md +74 -0
  55. package/assets/skills-zh/comet/reference/scripts.md +69 -0
  56. package/assets/skills-zh/comet/reference/subagent-dispatch.md +79 -23
  57. package/assets/skills-zh/comet/runtime/classic/checks.yaml +6 -0
  58. package/assets/skills-zh/comet/runtime/classic/guardrails.yaml +13 -0
  59. package/assets/skills-zh/comet/runtime/classic/skill.yaml +122 -0
  60. package/assets/skills-zh/comet-any/SKILL.md +118 -0
  61. package/assets/skills-zh/comet-any/reference/authored-zone-example.md +100 -0
  62. package/assets/skills-zh/comet-any/reference/authoring-protocol.json +91 -0
  63. package/assets/skills-zh/comet-any/reference/authoring-subagents.md +107 -0
  64. package/assets/skills-zh/comet-any/reference/bundle-authoring.md +166 -0
  65. package/assets/skills-zh/comet-any/reference/eval-provider.md +66 -0
  66. package/assets/skills-zh/comet-any/reference/subagents/pause-points-author.md +79 -0
  67. package/assets/skills-zh/comet-any/reference/subagents/reference-author.md +81 -0
  68. package/assets/skills-zh/comet-any/reference/subagents/script-author.md +84 -0
  69. package/assets/skills-zh/comet-any/reference/subagents/skill-core-author.md +129 -0
  70. package/assets/skills-zh/comet-any/reference/subagents/skill-reviewer.md +124 -0
  71. package/assets/skills-zh/comet-any/reference/subagents/workflow-entry-author.md +98 -0
  72. package/assets/skills-zh/comet-archive/SKILL.md +25 -15
  73. package/assets/skills-zh/comet-build/SKILL.md +54 -43
  74. package/assets/skills-zh/comet-design/SKILL.md +16 -20
  75. package/assets/skills-zh/comet-hotfix/SKILL.md +37 -47
  76. package/assets/skills-zh/comet-open/SKILL.md +30 -23
  77. package/assets/skills-zh/comet-tweak/SKILL.md +70 -63
  78. package/assets/skills-zh/comet-verify/SKILL.md +30 -32
  79. package/bin/comet.js +1 -1
  80. package/dist/{cli → app/cli}/index.d.ts.map +1 -1
  81. package/dist/app/cli/index.js +430 -0
  82. package/dist/app/cli/index.js.map +1 -0
  83. package/dist/app/commands/bundle.d.ts +51 -0
  84. package/dist/app/commands/bundle.d.ts.map +1 -0
  85. package/dist/app/commands/bundle.js +387 -0
  86. package/dist/app/commands/bundle.js.map +1 -0
  87. package/dist/app/commands/creator.d.ts +14 -0
  88. package/dist/app/commands/creator.d.ts.map +1 -0
  89. package/dist/app/commands/creator.js +82 -0
  90. package/dist/app/commands/creator.js.map +1 -0
  91. package/dist/app/commands/dashboard.d.ts +16 -0
  92. package/dist/app/commands/dashboard.d.ts.map +1 -0
  93. package/dist/app/commands/dashboard.js +53 -0
  94. package/dist/app/commands/dashboard.js.map +1 -0
  95. package/dist/{commands → app/commands}/doctor.d.ts +1 -1
  96. package/dist/app/commands/doctor.d.ts.map +1 -0
  97. package/dist/{commands → app/commands}/doctor.js +114 -60
  98. package/dist/app/commands/doctor.js.map +1 -0
  99. package/dist/app/commands/eval.d.ts +17 -0
  100. package/dist/app/commands/eval.d.ts.map +1 -0
  101. package/dist/app/commands/eval.js +169 -0
  102. package/dist/app/commands/eval.js.map +1 -0
  103. package/dist/app/commands/i18n.d.ts +4 -0
  104. package/dist/app/commands/i18n.d.ts.map +1 -0
  105. package/dist/app/commands/i18n.js +174 -0
  106. package/dist/app/commands/i18n.js.map +1 -0
  107. package/dist/{commands → app/commands}/init.d.ts +6 -1
  108. package/dist/app/commands/init.d.ts.map +1 -0
  109. package/dist/app/commands/init.js +402 -0
  110. package/dist/app/commands/init.js.map +1 -0
  111. package/dist/app/commands/platform-select-prompt.d.ts +38 -0
  112. package/dist/app/commands/platform-select-prompt.d.ts.map +1 -0
  113. package/dist/app/commands/platform-select-prompt.js +141 -0
  114. package/dist/app/commands/platform-select-prompt.js.map +1 -0
  115. package/dist/app/commands/publish.d.ts +7 -0
  116. package/dist/app/commands/publish.d.ts.map +1 -0
  117. package/dist/app/commands/publish.js +14 -0
  118. package/dist/app/commands/publish.js.map +1 -0
  119. package/dist/app/commands/skill.d.ts +23 -0
  120. package/dist/app/commands/skill.d.ts.map +1 -0
  121. package/dist/app/commands/skill.js +208 -0
  122. package/dist/app/commands/skill.js.map +1 -0
  123. package/dist/app/commands/status.d.ts.map +1 -0
  124. package/dist/app/commands/status.js +159 -0
  125. package/dist/app/commands/status.js.map +1 -0
  126. package/dist/{commands → app/commands}/uninstall.d.ts +1 -1
  127. package/dist/app/commands/uninstall.d.ts.map +1 -0
  128. package/dist/{commands → app/commands}/uninstall.js +37 -18
  129. package/dist/app/commands/uninstall.js.map +1 -0
  130. package/dist/{commands → app/commands}/update.d.ts +6 -4
  131. package/dist/app/commands/update.d.ts.map +1 -0
  132. package/dist/{commands → app/commands}/update.js +77 -46
  133. package/dist/app/commands/update.js.map +1 -0
  134. package/dist/config/repository-layout.json +98 -0
  135. package/dist/domains/bundle/authoring.d.ts +82 -0
  136. package/dist/domains/bundle/authoring.d.ts.map +1 -0
  137. package/dist/domains/bundle/authoring.js +185 -0
  138. package/dist/domains/bundle/authoring.js.map +1 -0
  139. package/dist/domains/bundle/bundle-platform.d.ts +39 -0
  140. package/dist/domains/bundle/bundle-platform.d.ts.map +1 -0
  141. package/dist/domains/bundle/bundle-platform.js +287 -0
  142. package/dist/domains/bundle/bundle-platform.js.map +1 -0
  143. package/dist/domains/bundle/candidates.d.ts +29 -0
  144. package/dist/domains/bundle/candidates.d.ts.map +1 -0
  145. package/dist/domains/bundle/candidates.js +37 -0
  146. package/dist/domains/bundle/candidates.js.map +1 -0
  147. package/dist/domains/bundle/compatibility-benchmark.d.ts +12 -0
  148. package/dist/domains/bundle/compatibility-benchmark.d.ts.map +1 -0
  149. package/dist/domains/bundle/compatibility-benchmark.js +224 -0
  150. package/dist/domains/bundle/compatibility-benchmark.js.map +1 -0
  151. package/dist/domains/bundle/compiler.d.ts +5 -0
  152. package/dist/domains/bundle/compiler.d.ts.map +1 -0
  153. package/dist/domains/bundle/compiler.js +106 -0
  154. package/dist/domains/bundle/compiler.js.map +1 -0
  155. package/dist/domains/bundle/distribute.d.ts +33 -0
  156. package/dist/domains/bundle/distribute.d.ts.map +1 -0
  157. package/dist/domains/bundle/distribute.js +166 -0
  158. package/dist/domains/bundle/distribute.js.map +1 -0
  159. package/dist/domains/bundle/draft.d.ts +19 -0
  160. package/dist/domains/bundle/draft.d.ts.map +1 -0
  161. package/dist/domains/bundle/draft.js +82 -0
  162. package/dist/domains/bundle/draft.js.map +1 -0
  163. package/dist/domains/bundle/eval.d.ts +36 -0
  164. package/dist/domains/bundle/eval.d.ts.map +1 -0
  165. package/dist/domains/bundle/eval.js +501 -0
  166. package/dist/domains/bundle/eval.js.map +1 -0
  167. package/dist/domains/bundle/factory-compose.d.ts +12 -0
  168. package/dist/domains/bundle/factory-compose.d.ts.map +1 -0
  169. package/dist/domains/bundle/factory-compose.js +309 -0
  170. package/dist/domains/bundle/factory-compose.js.map +1 -0
  171. package/dist/domains/bundle/factory-guide.d.ts +37 -0
  172. package/dist/domains/bundle/factory-guide.d.ts.map +1 -0
  173. package/dist/domains/bundle/factory-guide.js +96 -0
  174. package/dist/domains/bundle/factory-guide.js.map +1 -0
  175. package/dist/domains/bundle/factory-plan.d.ts +48 -0
  176. package/dist/domains/bundle/factory-plan.d.ts.map +1 -0
  177. package/dist/domains/bundle/factory-plan.js +172 -0
  178. package/dist/domains/bundle/factory-plan.js.map +1 -0
  179. package/dist/domains/bundle/factory-proposal.d.ts +31 -0
  180. package/dist/domains/bundle/factory-proposal.d.ts.map +1 -0
  181. package/dist/domains/bundle/factory-proposal.js +225 -0
  182. package/dist/domains/bundle/factory-proposal.js.map +1 -0
  183. package/dist/domains/bundle/factory-resolve.d.ts +11 -0
  184. package/dist/domains/bundle/factory-resolve.d.ts.map +1 -0
  185. package/dist/domains/bundle/factory-resolve.js +121 -0
  186. package/dist/domains/bundle/factory-resolve.js.map +1 -0
  187. package/dist/domains/bundle/factory.d.ts +17 -0
  188. package/dist/domains/bundle/factory.d.ts.map +1 -0
  189. package/dist/domains/bundle/factory.js +511 -0
  190. package/dist/domains/bundle/factory.js.map +1 -0
  191. package/dist/domains/bundle/hash.d.ts +3 -0
  192. package/dist/domains/bundle/hash.d.ts.map +1 -0
  193. package/dist/domains/bundle/hash.js +72 -0
  194. package/dist/domains/bundle/hash.js.map +1 -0
  195. package/dist/domains/bundle/load.d.ts +4 -0
  196. package/dist/domains/bundle/load.d.ts.map +1 -0
  197. package/dist/domains/bundle/load.js +355 -0
  198. package/dist/domains/bundle/load.js.map +1 -0
  199. package/dist/domains/bundle/next-action.d.ts +37 -0
  200. package/dist/domains/bundle/next-action.d.ts.map +1 -0
  201. package/dist/domains/bundle/next-action.js +185 -0
  202. package/dist/domains/bundle/next-action.js.map +1 -0
  203. package/dist/domains/bundle/platform.d.ts +21 -0
  204. package/dist/domains/bundle/platform.d.ts.map +1 -0
  205. package/dist/domains/bundle/platform.js +170 -0
  206. package/dist/domains/bundle/platform.js.map +1 -0
  207. package/dist/domains/bundle/preferences.d.ts +11 -0
  208. package/dist/domains/bundle/preferences.d.ts.map +1 -0
  209. package/dist/domains/bundle/preferences.js +17 -0
  210. package/dist/domains/bundle/preferences.js.map +1 -0
  211. package/dist/domains/bundle/publish.d.ts +14 -0
  212. package/dist/domains/bundle/publish.d.ts.map +1 -0
  213. package/dist/domains/bundle/publish.js +159 -0
  214. package/dist/domains/bundle/publish.js.map +1 -0
  215. package/dist/domains/bundle/readiness-user-summary.d.ts +25 -0
  216. package/dist/domains/bundle/readiness-user-summary.d.ts.map +1 -0
  217. package/dist/domains/bundle/readiness-user-summary.js +186 -0
  218. package/dist/domains/bundle/readiness-user-summary.js.map +1 -0
  219. package/dist/domains/bundle/review-summary.d.ts +36 -0
  220. package/dist/domains/bundle/review-summary.d.ts.map +1 -0
  221. package/dist/domains/bundle/review-summary.js +348 -0
  222. package/dist/domains/bundle/review-summary.js.map +1 -0
  223. package/dist/domains/bundle/state.d.ts +7 -0
  224. package/dist/domains/bundle/state.d.ts.map +1 -0
  225. package/dist/domains/bundle/state.js +132 -0
  226. package/dist/domains/bundle/state.js.map +1 -0
  227. package/dist/domains/bundle/types.d.ts +347 -0
  228. package/dist/domains/bundle/types.d.ts.map +1 -0
  229. package/dist/domains/bundle/types.js.map +1 -0
  230. package/dist/domains/bundle/user-facing.d.ts +48 -0
  231. package/dist/domains/bundle/user-facing.d.ts.map +1 -0
  232. package/dist/domains/bundle/user-facing.js +73 -0
  233. package/dist/domains/bundle/user-facing.js.map +1 -0
  234. package/dist/domains/bundle/validate.d.ts +5 -0
  235. package/dist/domains/bundle/validate.d.ts.map +1 -0
  236. package/dist/domains/bundle/validate.js +292 -0
  237. package/dist/domains/bundle/validate.js.map +1 -0
  238. package/dist/domains/comet-classic/classic-archive-entry.d.ts +2 -0
  239. package/dist/domains/comet-classic/classic-archive-entry.d.ts.map +1 -0
  240. package/dist/domains/comet-classic/classic-archive-entry.js +4 -0
  241. package/dist/domains/comet-classic/classic-archive-entry.js.map +1 -0
  242. package/dist/domains/comet-classic/classic-archive.d.ts +3 -0
  243. package/dist/domains/comet-classic/classic-archive.d.ts.map +1 -0
  244. package/dist/domains/comet-classic/classic-archive.js +392 -0
  245. package/dist/domains/comet-classic/classic-archive.js.map +1 -0
  246. package/dist/domains/comet-classic/classic-cli.d.ts +15 -0
  247. package/dist/domains/comet-classic/classic-cli.d.ts.map +1 -0
  248. package/dist/domains/comet-classic/classic-cli.js +94 -0
  249. package/dist/domains/comet-classic/classic-cli.js.map +1 -0
  250. package/dist/domains/comet-classic/classic-diagnostics.d.ts +16 -0
  251. package/dist/domains/comet-classic/classic-diagnostics.d.ts.map +1 -0
  252. package/dist/domains/comet-classic/classic-diagnostics.js +57 -0
  253. package/dist/domains/comet-classic/classic-diagnostics.js.map +1 -0
  254. package/dist/domains/comet-classic/classic-evidence.d.ts +10 -0
  255. package/dist/domains/comet-classic/classic-evidence.d.ts.map +1 -0
  256. package/dist/domains/comet-classic/classic-evidence.js +114 -0
  257. package/dist/domains/comet-classic/classic-evidence.js.map +1 -0
  258. package/dist/domains/comet-classic/classic-guard-entry.d.ts +2 -0
  259. package/dist/domains/comet-classic/classic-guard-entry.d.ts.map +1 -0
  260. package/dist/domains/comet-classic/classic-guard-entry.js +4 -0
  261. package/dist/domains/comet-classic/classic-guard-entry.js.map +1 -0
  262. package/dist/domains/comet-classic/classic-guard.d.ts +3 -0
  263. package/dist/domains/comet-classic/classic-guard.d.ts.map +1 -0
  264. package/dist/domains/comet-classic/classic-guard.js +833 -0
  265. package/dist/domains/comet-classic/classic-guard.js.map +1 -0
  266. package/dist/domains/comet-classic/classic-handoff-entry.d.ts +2 -0
  267. package/dist/domains/comet-classic/classic-handoff-entry.d.ts.map +1 -0
  268. package/dist/domains/comet-classic/classic-handoff-entry.js +4 -0
  269. package/dist/domains/comet-classic/classic-handoff-entry.js.map +1 -0
  270. package/dist/domains/comet-classic/classic-handoff.d.ts +3 -0
  271. package/dist/domains/comet-classic/classic-handoff.d.ts.map +1 -0
  272. package/dist/domains/comet-classic/classic-handoff.js +478 -0
  273. package/dist/domains/comet-classic/classic-handoff.js.map +1 -0
  274. package/dist/domains/comet-classic/classic-hook-guard-entry.d.ts +2 -0
  275. package/dist/domains/comet-classic/classic-hook-guard-entry.d.ts.map +1 -0
  276. package/dist/domains/comet-classic/classic-hook-guard-entry.js +4 -0
  277. package/dist/domains/comet-classic/classic-hook-guard-entry.js.map +1 -0
  278. package/dist/domains/comet-classic/classic-hook-guard.d.ts +3 -0
  279. package/dist/domains/comet-classic/classic-hook-guard.d.ts.map +1 -0
  280. package/dist/domains/comet-classic/classic-hook-guard.js +302 -0
  281. package/dist/domains/comet-classic/classic-hook-guard.js.map +1 -0
  282. package/dist/domains/comet-classic/classic-intent-command.d.ts +3 -0
  283. package/dist/domains/comet-classic/classic-intent-command.d.ts.map +1 -0
  284. package/dist/domains/comet-classic/classic-intent-command.js +40 -0
  285. package/dist/domains/comet-classic/classic-intent-command.js.map +1 -0
  286. package/dist/domains/comet-classic/classic-intent-entry.d.ts +2 -0
  287. package/dist/domains/comet-classic/classic-intent-entry.d.ts.map +1 -0
  288. package/dist/domains/comet-classic/classic-intent-entry.js +4 -0
  289. package/dist/domains/comet-classic/classic-intent-entry.js.map +1 -0
  290. package/dist/domains/comet-classic/classic-intent.d.ts +79 -0
  291. package/dist/domains/comet-classic/classic-intent.d.ts.map +1 -0
  292. package/dist/domains/comet-classic/classic-intent.js +307 -0
  293. package/dist/domains/comet-classic/classic-intent.js.map +1 -0
  294. package/dist/domains/comet-classic/classic-migrate.d.ts +18 -0
  295. package/dist/domains/comet-classic/classic-migrate.d.ts.map +1 -0
  296. package/dist/domains/comet-classic/classic-migrate.js +184 -0
  297. package/dist/domains/comet-classic/classic-migrate.js.map +1 -0
  298. package/dist/domains/comet-classic/classic-paths.d.ts +8 -0
  299. package/dist/domains/comet-classic/classic-paths.d.ts.map +1 -0
  300. package/dist/domains/comet-classic/classic-paths.js +61 -0
  301. package/dist/domains/comet-classic/classic-paths.js.map +1 -0
  302. package/dist/domains/comet-classic/classic-resolver.d.ts +10 -0
  303. package/dist/domains/comet-classic/classic-resolver.d.ts.map +1 -0
  304. package/dist/domains/comet-classic/classic-resolver.js +89 -0
  305. package/dist/domains/comet-classic/classic-resolver.js.map +1 -0
  306. package/dist/domains/comet-classic/classic-runtime-evals.d.ts +9 -0
  307. package/dist/domains/comet-classic/classic-runtime-evals.d.ts.map +1 -0
  308. package/dist/domains/comet-classic/classic-runtime-evals.js +45 -0
  309. package/dist/domains/comet-classic/classic-runtime-evals.js.map +1 -0
  310. package/dist/domains/comet-classic/classic-runtime-run.d.ts +7 -0
  311. package/dist/domains/comet-classic/classic-runtime-run.d.ts.map +1 -0
  312. package/dist/domains/comet-classic/classic-runtime-run.js +105 -0
  313. package/dist/domains/comet-classic/classic-runtime-run.js.map +1 -0
  314. package/dist/domains/comet-classic/classic-script-entry.d.ts +3 -0
  315. package/dist/domains/comet-classic/classic-script-entry.d.ts.map +1 -0
  316. package/dist/domains/comet-classic/classic-script-entry.js +31 -0
  317. package/dist/domains/comet-classic/classic-script-entry.js.map +1 -0
  318. package/dist/domains/comet-classic/classic-state-command.d.ts +3 -0
  319. package/dist/domains/comet-classic/classic-state-command.d.ts.map +1 -0
  320. package/dist/domains/comet-classic/classic-state-command.js +984 -0
  321. package/dist/domains/comet-classic/classic-state-command.js.map +1 -0
  322. package/dist/domains/comet-classic/classic-state-entry.d.ts +2 -0
  323. package/dist/domains/comet-classic/classic-state-entry.d.ts.map +1 -0
  324. package/dist/domains/comet-classic/classic-state-entry.js +4 -0
  325. package/dist/domains/comet-classic/classic-state-entry.js.map +1 -0
  326. package/dist/domains/comet-classic/classic-state-events.d.ts +18 -0
  327. package/dist/domains/comet-classic/classic-state-events.d.ts.map +1 -0
  328. package/dist/domains/comet-classic/classic-state-events.js +15 -0
  329. package/dist/domains/comet-classic/classic-state-events.js.map +1 -0
  330. package/dist/domains/comet-classic/classic-state.d.ts +69 -0
  331. package/dist/domains/comet-classic/classic-state.d.ts.map +1 -0
  332. package/dist/domains/comet-classic/classic-state.js +238 -0
  333. package/dist/domains/comet-classic/classic-state.js.map +1 -0
  334. package/dist/domains/comet-classic/classic-store.d.ts +7 -0
  335. package/dist/domains/comet-classic/classic-store.d.ts.map +1 -0
  336. package/dist/domains/comet-classic/classic-store.js +127 -0
  337. package/dist/domains/comet-classic/classic-store.js.map +1 -0
  338. package/dist/domains/comet-classic/classic-transitions.d.ts +24 -0
  339. package/dist/domains/comet-classic/classic-transitions.d.ts.map +1 -0
  340. package/dist/domains/comet-classic/classic-transitions.js +124 -0
  341. package/dist/domains/comet-classic/classic-transitions.js.map +1 -0
  342. package/dist/domains/comet-classic/classic-validate-command.d.ts +3 -0
  343. package/dist/domains/comet-classic/classic-validate-command.d.ts.map +1 -0
  344. package/dist/domains/comet-classic/classic-validate-command.js +154 -0
  345. package/dist/domains/comet-classic/classic-validate-command.js.map +1 -0
  346. package/dist/domains/comet-classic/classic-validate-entry.d.ts +2 -0
  347. package/dist/domains/comet-classic/classic-validate-entry.d.ts.map +1 -0
  348. package/dist/domains/comet-classic/classic-validate-entry.js +4 -0
  349. package/dist/domains/comet-classic/classic-validate-entry.js.map +1 -0
  350. package/dist/domains/comet-classic/index.d.ts +20 -0
  351. package/dist/domains/comet-classic/index.d.ts.map +1 -0
  352. package/dist/domains/comet-classic/index.js +20 -0
  353. package/dist/domains/comet-classic/index.js.map +1 -0
  354. package/dist/domains/dashboard/collector.d.ts +12 -0
  355. package/dist/domains/dashboard/collector.d.ts.map +1 -0
  356. package/dist/domains/dashboard/collector.js +475 -0
  357. package/dist/domains/dashboard/collector.js.map +1 -0
  358. package/dist/domains/dashboard/git.d.ts +8 -0
  359. package/dist/domains/dashboard/git.d.ts.map +1 -0
  360. package/dist/domains/dashboard/git.js +69 -0
  361. package/dist/domains/dashboard/git.js.map +1 -0
  362. package/dist/domains/dashboard/next-action.d.ts +17 -0
  363. package/dist/domains/dashboard/next-action.d.ts.map +1 -0
  364. package/dist/domains/dashboard/next-action.js +83 -0
  365. package/dist/domains/dashboard/next-action.js.map +1 -0
  366. package/dist/domains/dashboard/open-browser.d.ts +9 -0
  367. package/dist/domains/dashboard/open-browser.d.ts.map +1 -0
  368. package/dist/domains/dashboard/open-browser.js +40 -0
  369. package/dist/domains/dashboard/open-browser.js.map +1 -0
  370. package/dist/domains/dashboard/risk.d.ts +24 -0
  371. package/dist/domains/dashboard/risk.d.ts.map +1 -0
  372. package/dist/domains/dashboard/risk.js +97 -0
  373. package/dist/domains/dashboard/risk.js.map +1 -0
  374. package/dist/domains/dashboard/server.d.ts +21 -0
  375. package/dist/domains/dashboard/server.d.ts.map +1 -0
  376. package/dist/domains/dashboard/server.js +149 -0
  377. package/dist/domains/dashboard/server.js.map +1 -0
  378. package/dist/domains/dashboard/task-parser.d.ts +13 -0
  379. package/dist/domains/dashboard/task-parser.d.ts.map +1 -0
  380. package/dist/domains/dashboard/task-parser.js +82 -0
  381. package/dist/domains/dashboard/task-parser.js.map +1 -0
  382. package/dist/domains/dashboard/types.d.ts +122 -0
  383. package/dist/domains/dashboard/types.d.ts.map +1 -0
  384. package/dist/domains/dashboard/types.js +10 -0
  385. package/dist/domains/dashboard/types.js.map +1 -0
  386. package/dist/domains/dashboard/verify-parser.d.ts +18 -0
  387. package/dist/domains/dashboard/verify-parser.d.ts.map +1 -0
  388. package/dist/domains/dashboard/verify-parser.js +94 -0
  389. package/dist/domains/dashboard/verify-parser.js.map +1 -0
  390. package/dist/domains/dashboard/web/assets/demo-DQyfozbi.js +1 -0
  391. package/dist/domains/dashboard/web/assets/index-BcO3_QlT.css +1 -0
  392. package/dist/domains/dashboard/web/assets/index-CjU3VXVu.js +22 -0
  393. package/dist/domains/dashboard/web/favicon.png +0 -0
  394. package/dist/domains/dashboard/web/index.html +16 -0
  395. package/dist/domains/dashboard/yaml.d.ts +13 -0
  396. package/dist/domains/dashboard/yaml.d.ts.map +1 -0
  397. package/dist/domains/dashboard/yaml.js +61 -0
  398. package/dist/domains/dashboard/yaml.js.map +1 -0
  399. package/dist/domains/engine/evals.d.ts +4 -0
  400. package/dist/domains/engine/evals.d.ts.map +1 -0
  401. package/dist/domains/engine/evals.js +25 -0
  402. package/dist/domains/engine/evals.js.map +1 -0
  403. package/dist/domains/engine/guardrails.d.ts +10 -0
  404. package/dist/domains/engine/guardrails.d.ts.map +1 -0
  405. package/dist/domains/engine/guardrails.js +25 -0
  406. package/dist/domains/engine/guardrails.js.map +1 -0
  407. package/dist/domains/engine/loop.d.ts +15 -0
  408. package/dist/domains/engine/loop.d.ts.map +1 -0
  409. package/dist/domains/engine/loop.js +126 -0
  410. package/dist/domains/engine/loop.js.map +1 -0
  411. package/dist/domains/engine/manual-run.d.ts +30 -0
  412. package/dist/domains/engine/manual-run.d.ts.map +1 -0
  413. package/dist/domains/engine/manual-run.js +184 -0
  414. package/dist/domains/engine/manual-run.js.map +1 -0
  415. package/dist/domains/engine/resolver.d.ts +20 -0
  416. package/dist/domains/engine/resolver.d.ts.map +1 -0
  417. package/dist/domains/engine/resolver.js +36 -0
  418. package/dist/domains/engine/resolver.js.map +1 -0
  419. package/dist/domains/engine/run-store.d.ts +13 -0
  420. package/dist/domains/engine/run-store.d.ts.map +1 -0
  421. package/dist/domains/engine/run-store.js +100 -0
  422. package/dist/domains/engine/run-store.js.map +1 -0
  423. package/dist/domains/engine/runtime-types.d.ts +11 -0
  424. package/dist/domains/engine/runtime-types.d.ts.map +1 -0
  425. package/dist/domains/engine/runtime-types.js +2 -0
  426. package/dist/domains/engine/runtime-types.js.map +1 -0
  427. package/dist/domains/engine/standalone-run.d.ts +13 -0
  428. package/dist/domains/engine/standalone-run.d.ts.map +1 -0
  429. package/dist/domains/engine/standalone-run.js +27 -0
  430. package/dist/domains/engine/standalone-run.js.map +1 -0
  431. package/dist/domains/engine/state.d.ts +10 -0
  432. package/dist/domains/engine/state.d.ts.map +1 -0
  433. package/dist/domains/engine/state.js +160 -0
  434. package/dist/domains/engine/state.js.map +1 -0
  435. package/dist/domains/engine/types.d.ts +51 -0
  436. package/dist/domains/engine/types.d.ts.map +1 -0
  437. package/dist/domains/engine/types.js +2 -0
  438. package/dist/domains/engine/types.js.map +1 -0
  439. package/dist/domains/eval/index.d.ts +7 -0
  440. package/dist/domains/eval/index.d.ts.map +1 -0
  441. package/dist/domains/eval/index.js +11 -0
  442. package/dist/domains/eval/index.js.map +1 -0
  443. package/dist/domains/eval/repository-benchmarks.d.ts +6 -0
  444. package/dist/domains/eval/repository-benchmarks.d.ts.map +1 -0
  445. package/dist/domains/eval/repository-benchmarks.js +10 -0
  446. package/dist/domains/eval/repository-benchmarks.js.map +1 -0
  447. package/dist/domains/factory/artifacts.d.ts +53 -0
  448. package/dist/domains/factory/artifacts.d.ts.map +1 -0
  449. package/dist/domains/factory/artifacts.js +8 -0
  450. package/dist/domains/factory/artifacts.js.map +1 -0
  451. package/dist/domains/factory/package.d.ts +7 -0
  452. package/dist/domains/factory/package.d.ts.map +1 -0
  453. package/dist/domains/factory/package.js +1511 -0
  454. package/dist/domains/factory/package.js.map +1 -0
  455. package/dist/domains/factory/types.d.ts +127 -0
  456. package/dist/domains/factory/types.d.ts.map +1 -0
  457. package/dist/domains/factory/types.js +2 -0
  458. package/dist/domains/factory/types.js.map +1 -0
  459. package/dist/domains/integrations/codegraph.d.ts +6 -0
  460. package/dist/domains/integrations/codegraph.d.ts.map +1 -0
  461. package/dist/domains/integrations/codegraph.js +118 -0
  462. package/dist/domains/integrations/codegraph.js.map +1 -0
  463. package/dist/domains/integrations/openspec.d.ts +18 -0
  464. package/dist/domains/integrations/openspec.d.ts.map +1 -0
  465. package/dist/{core → domains/integrations}/openspec.js +114 -31
  466. package/dist/domains/integrations/openspec.js.map +1 -0
  467. package/dist/domains/integrations/superpowers.d.ts +21 -0
  468. package/dist/domains/integrations/superpowers.d.ts.map +1 -0
  469. package/dist/{core → domains/integrations}/superpowers.js +63 -14
  470. package/dist/domains/integrations/superpowers.js.map +1 -0
  471. package/dist/domains/skill/discovery.d.ts +17 -0
  472. package/dist/domains/skill/discovery.d.ts.map +1 -0
  473. package/dist/domains/skill/discovery.js +80 -0
  474. package/dist/domains/skill/discovery.js.map +1 -0
  475. package/dist/domains/skill/find.d.ts +41 -0
  476. package/dist/domains/skill/find.d.ts.map +1 -0
  477. package/dist/domains/skill/find.js +251 -0
  478. package/dist/domains/skill/find.js.map +1 -0
  479. package/dist/domains/skill/install.d.ts +11 -0
  480. package/dist/domains/skill/install.d.ts.map +1 -0
  481. package/dist/domains/skill/install.js +82 -0
  482. package/dist/domains/skill/install.js.map +1 -0
  483. package/dist/domains/skill/inventory.d.ts +19 -0
  484. package/dist/domains/skill/inventory.d.ts.map +1 -0
  485. package/dist/domains/skill/inventory.js +64 -0
  486. package/dist/domains/skill/inventory.js.map +1 -0
  487. package/dist/domains/skill/languages.d.ts +19 -0
  488. package/dist/domains/skill/languages.d.ts.map +1 -0
  489. package/dist/domains/skill/languages.js +21 -0
  490. package/dist/domains/skill/languages.js.map +1 -0
  491. package/dist/domains/skill/load.d.ts +5 -0
  492. package/dist/domains/skill/load.d.ts.map +1 -0
  493. package/dist/domains/skill/load.js +313 -0
  494. package/dist/domains/skill/load.js.map +1 -0
  495. package/dist/domains/skill/platform-install.d.ts +87 -0
  496. package/dist/domains/skill/platform-install.d.ts.map +1 -0
  497. package/dist/{core/skills.js → domains/skill/platform-install.js} +242 -42
  498. package/dist/domains/skill/platform-install.js.map +1 -0
  499. package/dist/domains/skill/preferences.d.ts +42 -0
  500. package/dist/domains/skill/preferences.d.ts.map +1 -0
  501. package/dist/domains/skill/preferences.js +118 -0
  502. package/dist/domains/skill/preferences.js.map +1 -0
  503. package/dist/domains/skill/snapshot.d.ts +8 -0
  504. package/dist/domains/skill/snapshot.d.ts.map +1 -0
  505. package/dist/domains/skill/snapshot.js +184 -0
  506. package/dist/domains/skill/snapshot.js.map +1 -0
  507. package/dist/domains/skill/types.d.ts +85 -0
  508. package/dist/domains/skill/types.d.ts.map +1 -0
  509. package/dist/domains/skill/types.js +2 -0
  510. package/dist/{core → domains/skill}/types.js.map +1 -1
  511. package/dist/{core → domains/skill}/uninstall.d.ts +2 -18
  512. package/dist/domains/skill/uninstall.d.ts.map +1 -0
  513. package/dist/{core → domains/skill}/uninstall.js +15 -66
  514. package/dist/domains/skill/uninstall.js.map +1 -0
  515. package/dist/domains/skill/validate.d.ts +3 -0
  516. package/dist/domains/skill/validate.d.ts.map +1 -0
  517. package/dist/domains/skill/validate.js +81 -0
  518. package/dist/domains/skill/validate.js.map +1 -0
  519. package/dist/domains/workflow-contract/builtins.d.ts +8 -0
  520. package/dist/domains/workflow-contract/builtins.d.ts.map +1 -0
  521. package/dist/domains/workflow-contract/builtins.js +229 -0
  522. package/dist/domains/workflow-contract/builtins.js.map +1 -0
  523. package/dist/domains/workflow-contract/hash.d.ts +3 -0
  524. package/dist/domains/workflow-contract/hash.d.ts.map +1 -0
  525. package/dist/domains/workflow-contract/hash.js +16 -0
  526. package/dist/domains/workflow-contract/hash.js.map +1 -0
  527. package/dist/domains/workflow-contract/index.d.ts +6 -0
  528. package/dist/domains/workflow-contract/index.d.ts.map +1 -0
  529. package/dist/domains/workflow-contract/index.js +5 -0
  530. package/dist/domains/workflow-contract/index.js.map +1 -0
  531. package/dist/domains/workflow-contract/normalize.d.ts +3 -0
  532. package/dist/domains/workflow-contract/normalize.d.ts.map +1 -0
  533. package/dist/domains/workflow-contract/normalize.js +146 -0
  534. package/dist/domains/workflow-contract/normalize.js.map +1 -0
  535. package/dist/domains/workflow-contract/types.d.ts +128 -0
  536. package/dist/domains/workflow-contract/types.d.ts.map +1 -0
  537. package/dist/domains/workflow-contract/types.js +2 -0
  538. package/dist/domains/workflow-contract/types.js.map +1 -0
  539. package/dist/domains/workflow-contract/validation.d.ts +3 -0
  540. package/dist/domains/workflow-contract/validation.d.ts.map +1 -0
  541. package/dist/domains/workflow-contract/validation.js +180 -0
  542. package/dist/domains/workflow-contract/validation.js.map +1 -0
  543. package/dist/platform/fs/file-system.d.ts.map +1 -0
  544. package/dist/platform/fs/file-system.js.map +1 -0
  545. package/dist/{core → platform/install}/detect.d.ts +6 -1
  546. package/dist/platform/install/detect.d.ts.map +1 -0
  547. package/dist/{core → platform/install}/detect.js +32 -14
  548. package/dist/platform/install/detect.js.map +1 -0
  549. package/dist/platform/install/platforms.d.ts.map +1 -0
  550. package/dist/{core → platform/install}/platforms.js +41 -0
  551. package/dist/platform/install/platforms.js.map +1 -0
  552. package/dist/platform/install/types.d.ts +3 -0
  553. package/dist/platform/install/types.d.ts.map +1 -0
  554. package/dist/platform/install/types.js +2 -0
  555. package/dist/platform/install/types.js.map +1 -0
  556. package/dist/platform/paths/repository-layout.d.ts +22 -0
  557. package/dist/platform/paths/repository-layout.d.ts.map +1 -0
  558. package/dist/platform/paths/repository-layout.js +11 -0
  559. package/dist/platform/paths/repository-layout.js.map +1 -0
  560. package/dist/platform/process/command-error.d.ts.map +1 -0
  561. package/dist/platform/process/command-error.js.map +1 -0
  562. package/dist/platform/process/shell-quote.d.ts +22 -0
  563. package/dist/platform/process/shell-quote.d.ts.map +1 -0
  564. package/dist/platform/process/shell-quote.js +34 -0
  565. package/dist/platform/process/shell-quote.js.map +1 -0
  566. package/dist/platform/version/version.d.ts.map +1 -0
  567. package/dist/{core → platform/version}/version.js +16 -3
  568. package/dist/platform/version/version.js.map +1 -0
  569. package/package.json +40 -14
  570. package/assets/skills/comet/scripts/comet-archive.sh +0 -311
  571. package/assets/skills/comet/scripts/comet-env.sh +0 -110
  572. package/assets/skills/comet/scripts/comet-guard.sh +0 -752
  573. package/assets/skills/comet/scripts/comet-handoff.sh +0 -390
  574. package/assets/skills/comet/scripts/comet-hook-guard.sh +0 -260
  575. package/assets/skills/comet/scripts/comet-state.sh +0 -1245
  576. package/assets/skills/comet/scripts/comet-yaml-validate.sh +0 -223
  577. package/dist/cli/index.js +0 -83
  578. package/dist/cli/index.js.map +0 -1
  579. package/dist/commands/doctor.d.ts.map +0 -1
  580. package/dist/commands/doctor.js.map +0 -1
  581. package/dist/commands/init.d.ts.map +0 -1
  582. package/dist/commands/init.js +0 -300
  583. package/dist/commands/init.js.map +0 -1
  584. package/dist/commands/status.d.ts.map +0 -1
  585. package/dist/commands/status.js +0 -108
  586. package/dist/commands/status.js.map +0 -1
  587. package/dist/commands/uninstall.d.ts.map +0 -1
  588. package/dist/commands/uninstall.js.map +0 -1
  589. package/dist/commands/update.d.ts.map +0 -1
  590. package/dist/commands/update.js.map +0 -1
  591. package/dist/core/codegraph.d.ts +0 -4
  592. package/dist/core/codegraph.d.ts.map +0 -1
  593. package/dist/core/codegraph.js +0 -63
  594. package/dist/core/codegraph.js.map +0 -1
  595. package/dist/core/command-error.d.ts.map +0 -1
  596. package/dist/core/command-error.js.map +0 -1
  597. package/dist/core/detect.d.ts.map +0 -1
  598. package/dist/core/detect.js.map +0 -1
  599. package/dist/core/openspec.d.ts +0 -11
  600. package/dist/core/openspec.d.ts.map +0 -1
  601. package/dist/core/openspec.js.map +0 -1
  602. package/dist/core/platforms.d.ts.map +0 -1
  603. package/dist/core/platforms.js.map +0 -1
  604. package/dist/core/skills.d.ts +0 -58
  605. package/dist/core/skills.d.ts.map +0 -1
  606. package/dist/core/skills.js.map +0 -1
  607. package/dist/core/superpowers.d.ts +0 -13
  608. package/dist/core/superpowers.d.ts.map +0 -1
  609. package/dist/core/superpowers.js.map +0 -1
  610. package/dist/core/types.d.ts +0 -2
  611. package/dist/core/types.d.ts.map +0 -1
  612. package/dist/core/uninstall.d.ts.map +0 -1
  613. package/dist/core/uninstall.js.map +0 -1
  614. package/dist/core/version.d.ts.map +0 -1
  615. package/dist/core/version.js.map +0 -1
  616. package/dist/utils/file-system.d.ts.map +0 -1
  617. package/dist/utils/file-system.js.map +0 -1
  618. /package/dist/{cli → app/cli}/index.d.ts +0 -0
  619. /package/dist/{commands → app/commands}/status.d.ts +0 -0
  620. /package/dist/{core → domains/bundle}/types.js +0 -0
  621. /package/dist/{utils → platform/fs}/file-system.d.ts +0 -0
  622. /package/dist/{utils → platform/fs}/file-system.js +0 -0
  623. /package/dist/{core → platform/install}/platforms.d.ts +0 -0
  624. /package/dist/{core → platform/process}/command-error.d.ts +0 -0
  625. /package/dist/{core → platform/process}/command-error.js +0 -0
  626. /package/dist/{core → platform/version}/version.d.ts +0 -0
  627. /package/scripts/{postinstall.js → install/postinstall.js} +0 -0
@@ -1,752 +0,0 @@
1
- #!/bin/bash
2
- # Comet Phase Guard — validates exit conditions before phase transitions
3
- # Usage: comet-guard.sh <change-name> <current-phase> [--apply]
4
- # Phases: open, design, build, verify, archive
5
- # Exit 0 = all checks pass, exit 1 = blocked (reasons printed to stderr)
6
- # shellcheck disable=SC2329 # Functions called indirectly via check() dispatch
7
-
8
- set -euo pipefail
9
-
10
- COMET_BASH="${COMET_BASH:-${BASH:-bash}}"
11
-
12
- red() { echo -e "\033[31m$1\033[0m" >&2; }
13
- green() { echo -e "\033[32m$1\033[0m" >&2; }
14
- warn() { echo -e "\033[33m$1\033[0m" >&2; }
15
-
16
- # Input validation - prevent path traversal
17
- validate_change_name() {
18
- local name="$1"
19
- # Reject empty names
20
- if [ -z "$name" ]; then
21
- red "ERROR: Change name cannot be empty" >&2
22
- exit 1
23
- fi
24
- # Only allow alphanumeric, hyphens, and underscores
25
- if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
26
- red "ERROR: Invalid change name: '$name'" >&2
27
- red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
28
- exit 1
29
- fi
30
- # Reject path traversal attempts
31
- if [[ "$name" =~ \.\. ]]; then
32
- red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
33
- exit 1
34
- fi
35
- }
36
-
37
- if [ "${COMET_GUARD_SOURCE_ONLY:-0}" = "1" ]; then
38
- CHANGE="${CHANGE:-}"
39
- PHASE="${PHASE:-}"
40
- APPLY="${APPLY:-0}"
41
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd -P)"
42
- CHANGE_DIR="${CHANGE_DIR:-}"
43
- else
44
- validate_change_name "$1"
45
-
46
- CHANGE="$1"
47
- PHASE="$2"
48
- APPLY=0
49
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
50
- if [[ "${3:-}" == "--apply" ]]; then
51
- APPLY=1
52
- fi
53
- CHANGE_DIR="openspec/changes/$CHANGE"
54
- if [ "$PHASE" = "archive" ] && [ ! -d "$CHANGE_DIR" ] && [ -d "openspec/changes/archive/$CHANGE" ]; then
55
- CHANGE_DIR="openspec/changes/archive/$CHANGE"
56
- fi
57
- fi
58
-
59
- BLOCK=0
60
- check() {
61
- local desc="$1"
62
- shift
63
- local output
64
- if output=$("$@" 2>&1); then
65
- green " [PASS] $desc"
66
- else
67
- red " [FAIL] $desc"
68
- if [ -n "$output" ]; then
69
- while IFS= read -r line; do
70
- red " $line"
71
- done <<< "$output"
72
- fi
73
- BLOCK=1
74
- fi
75
- }
76
-
77
- # --- Helper functions ---
78
-
79
- tasks_all_done() {
80
- local tasks="$CHANGE_DIR/tasks.md"
81
- if [ ! -f "$tasks" ]; then
82
- echo "tasks.md is missing at $tasks" >&2
83
- echo "Next: restore or create tasks.md for this change before leaving build." >&2
84
- return 1
85
- fi
86
- if ! grep -q '\- \[x\]' "$tasks"; then
87
- echo "tasks.md has no completed tasks." >&2
88
- echo "Next: complete implementation tasks and mark them with '- [x]'." >&2
89
- return 1
90
- fi
91
- if grep -q '\- \[ \]' "$tasks"; then
92
- echo "Unfinished tasks:" >&2
93
- grep -n '\- \[ \]' "$tasks" >&2 || true
94
- echo "Next: complete or explicitly remove unfinished tasks, then mark tasks.md with '- [x]'." >&2
95
- return 1
96
- fi
97
- return 0
98
- }
99
-
100
- tasks_has_any() {
101
- local tasks="$CHANGE_DIR/tasks.md"
102
- [ -f "$tasks" ] && grep -q '\- \[' "$tasks"
103
- }
104
-
105
- plan_tasks_all_done() {
106
- local plan
107
- plan=$(yaml_field_value "plan" 2>/dev/null || true)
108
-
109
- if [ -z "$plan" ] || [ "$plan" = "null" ]; then
110
- return 0
111
- fi
112
- if [ ! -f "$plan" ]; then
113
- echo "plan file is missing at $plan" >&2
114
- echo "Next: restore the Superpowers plan file or update .comet.yaml plan before leaving build." >&2
115
- return 1
116
- fi
117
- if grep -q '^[[:space:]]*- \[ \]' "$plan"; then
118
- echo "Unfinished Superpowers plan tasks:" >&2
119
- grep -n '^[[:space:]]*- \[ \]' "$plan" >&2 || true
120
- echo "Next: check off corresponding completed plan tasks, then commit the plan update." >&2
121
- return 1
122
- fi
123
- return 0
124
- }
125
-
126
- yaml_field_value() {
127
- local field="$1"
128
- local yaml="$CHANGE_DIR/.comet.yaml"
129
- if [ -f "$yaml" ]; then
130
- local value
131
- value=$(grep "^${field}:" "$yaml" 2>/dev/null | sed "s/^${field}: *//" || true)
132
- value=$(strip_inline_comment "$value")
133
- strip_wrapping_quotes "$value"
134
- fi
135
- }
136
-
137
- strip_inline_comment() {
138
- local value="$1"
139
- printf '%s\n' "$value" | awk -v squote="'" '
140
- {
141
- out = ""
142
- quote = ""
143
- for (i = 1; i <= length($0); i++) {
144
- c = substr($0, i, 1)
145
- if (quote == "") {
146
- if (c == "\"" || c == squote) {
147
- quote = c
148
- } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
149
- sub(/[[:space:]]+$/, "", out)
150
- print out
151
- next
152
- }
153
- } else if (c == quote) {
154
- quote = ""
155
- }
156
- out = out c
157
- }
158
- print out
159
- }
160
- '
161
- }
162
-
163
- strip_wrapping_quotes() {
164
- local value="$1"
165
- case "$value" in
166
- \"*\")
167
- printf '%s\n' "${value:1:${#value}-2}"
168
- ;;
169
- \'*\')
170
- printf '%s\n' "${value:1:${#value}-2}"
171
- ;;
172
- *)
173
- printf '%s\n' "$value"
174
- ;;
175
- esac
176
- }
177
-
178
- project_config_value() {
179
- local field="$1"
180
- local value
181
-
182
- value=$(yaml_field_value "$field" 2>/dev/null || true)
183
- if [ -n "$value" ] && [ "$value" != "null" ]; then
184
- echo "$value"
185
- return 0
186
- fi
187
-
188
- for config in ".comet.yaml" "comet.yaml" ".comet.yml" "comet.yml"; do
189
- if [ -f "$config" ]; then
190
- value=$(grep "^${field}:" "$config" 2>/dev/null | sed "s/^${field}: *//" || true)
191
- value=$(strip_inline_comment "$value")
192
- value=$(strip_wrapping_quotes "$value")
193
- if [ -n "$value" ] && [ "$value" != "null" ]; then
194
- echo "$value"
195
- return 0
196
- fi
197
- fi
198
- done
199
- }
200
-
201
- file_nonempty() {
202
- [ -f "$1" ] && [ -s "$1" ]
203
- }
204
-
205
- is_windows_bash() {
206
- case "$(uname -s 2>/dev/null || true)" in
207
- MINGW*|MSYS*|CYGWIN*) return 0 ;;
208
- *) return 1 ;;
209
- esac
210
- }
211
-
212
- run_command_string() {
213
- local command="$1"
214
- if [ -z "$command" ]; then
215
- red "ERROR: build/verify command is empty" >&2
216
- return 1
217
- fi
218
- # Basic command injection guard: reject dangerous shell metacharacters
219
- # Quotes are allowed to support paths with spaces (e.g. Windows)
220
- if [[ "$command" =~ [\;\|\&\$\`] ]]; then
221
- red "ERROR: build/verify command contains shell metacharacters: $command" >&2
222
- red "Allowed: alphanumeric, spaces, hyphens, underscores, dots, colons, forward slashes, quotes" >&2
223
- return 1
224
- fi
225
- echo "+ $command" >&2
226
- "$COMET_BASH" -lc "$command"
227
- }
228
-
229
- hash_stream() {
230
- if command -v sha256sum >/dev/null 2>&1; then
231
- sha256sum | awk '{print $1}'
232
- elif command -v shasum >/dev/null 2>&1; then
233
- shasum -a 256 | awk '{print $1}'
234
- else
235
- echo "sha256sum or shasum is required" >&2
236
- return 1
237
- fi
238
- }
239
-
240
- hash_file() {
241
- local file="$1"
242
- if command -v sha256sum >/dev/null 2>&1; then
243
- sha256sum "$file" | awk '{print $1}'
244
- elif command -v shasum >/dev/null 2>&1; then
245
- shasum -a 256 "$file" | awk '{print $1}'
246
- else
247
- echo "sha256sum or shasum is required" >&2
248
- return 1
249
- fi
250
- }
251
-
252
- handoff_source_files() {
253
- printf '%s\n' "$CHANGE_DIR/proposal.md"
254
- printf '%s\n' "$CHANGE_DIR/design.md"
255
- printf '%s\n' "$CHANGE_DIR/tasks.md"
256
- if [ -d "$CHANGE_DIR/specs" ]; then
257
- find "$CHANGE_DIR/specs" -path '*/spec.md' -type f 2>/dev/null | sort
258
- fi
259
- }
260
-
261
- compute_handoff_hash() {
262
- local hash_input
263
- hash_input=$(handoff_source_files | while IFS= read -r file; do
264
- if [ -f "$file" ]; then
265
- printf 'path:%s\n' "$file"
266
- printf 'sha256:%s\n' "$(hash_file "$file")"
267
- fi
268
- done)
269
- printf '%s' "$hash_input" | hash_stream
270
- }
271
-
272
- preflight() {
273
-
274
- if [ ! -d "$CHANGE_DIR" ]; then
275
- red "FATAL: change directory not found: $CHANGE_DIR"
276
- exit 1
277
- fi
278
- if [ ! -f "$CHANGE_DIR/.comet.yaml" ]; then
279
- red "FATAL: .comet.yaml not found in $CHANGE_DIR"
280
- exit 1
281
- fi
282
-
283
- # Schema validation
284
- local validate_script
285
- validate_script="$SCRIPT_DIR/comet-yaml-validate.sh"
286
- if [ -f "$validate_script" ]; then
287
- if ! "$COMET_BASH" "$validate_script" "$CHANGE" 2>/dev/null; then
288
- "$COMET_BASH" "$validate_script" "$CHANGE" || true
289
- red "FATAL: .comet.yaml schema validation failed"
290
- exit 1
291
- fi
292
- fi
293
- }
294
-
295
- build_passes() {
296
- if [ "${COMET_SKIP_BUILD:-0}" = "1" ]; then
297
- return 0
298
- fi
299
- local configured_build
300
- configured_build=$(project_config_value "build_command" 2>/dev/null || true)
301
- if [ -n "$configured_build" ]; then
302
- run_command_string "$configured_build"
303
- return $?
304
- fi
305
- if [ -f "package.json" ] && grep -q '"build"' "package.json"; then
306
- npm run build
307
- return $?
308
- fi
309
- if [ -f "pom.xml" ]; then
310
- if [ -x "./mvnw" ]; then
311
- ./mvnw compile -q
312
- elif is_windows_bash && command -v mvn.cmd >/dev/null 2>&1; then
313
- mvn.cmd compile -q
314
- else
315
- mvn compile -q
316
- fi
317
- return $?
318
- fi
319
- if [ -f "Cargo.toml" ]; then
320
- cargo build
321
- return $?
322
- fi
323
- return 1
324
- }
325
-
326
- verification_command_passes() {
327
- if [ "${COMET_SKIP_BUILD:-0}" = "1" ]; then
328
- return 0
329
- fi
330
- local configured_verify
331
- configured_verify=$(project_config_value "verify_command" 2>/dev/null || true)
332
- if [ -n "$configured_verify" ]; then
333
- run_command_string "$configured_verify"
334
- return $?
335
- fi
336
- build_passes
337
- }
338
-
339
- isolation_selected() {
340
- local isolation
341
- isolation=$(yaml_field_value "isolation" 2>/dev/null || true)
342
- case "$isolation" in
343
- branch|worktree) return 0 ;;
344
- *)
345
- echo "isolation must be branch or worktree, got '${isolation:-null}'" >&2
346
- echo "Next: ask the user to choose branch or worktree, create the chosen isolation, then run:" >&2
347
- echo " \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE isolation <branch|worktree>" >&2
348
- return 1
349
- ;;
350
- esac
351
- }
352
-
353
- build_mode_selected() {
354
- local build_mode
355
- build_mode=$(yaml_field_value "build_mode" 2>/dev/null || true)
356
- case "$build_mode" in
357
- subagent-driven-development|executing-plans|direct) return 0 ;;
358
- *)
359
- echo "build_mode must be selected before leaving build, got '${build_mode:-null}'" >&2
360
- echo "Next: ask the user to choose an execution mode, then run:" >&2
361
- echo " \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE build_mode <subagent-driven-development|executing-plans>" >&2
362
- return 1
363
- ;;
364
- esac
365
- }
366
-
367
- build_mode_allowed_for_workflow() {
368
- local workflow build_mode direct_override
369
- workflow=$(yaml_field_value "workflow" 2>/dev/null || true)
370
- build_mode=$(yaml_field_value "build_mode" 2>/dev/null || true)
371
- direct_override=$(yaml_field_value "direct_override" 2>/dev/null || true)
372
-
373
- if [ "$build_mode" != "direct" ]; then
374
- return 0
375
- fi
376
- case "$workflow" in
377
- hotfix|tweak) return 0 ;;
378
- *)
379
- if [ "$direct_override" = "true" ]; then
380
- return 0
381
- fi
382
- echo "build_mode=direct is only allowed for hotfix/tweak unless direct_override: true is recorded" >&2
383
- echo "Next: choose executing-plans or subagent-driven-development, or stop and ask the user for an explicit direct override." >&2
384
- return 1
385
- ;;
386
- esac
387
- }
388
-
389
- subagent_dispatch_confirmed() {
390
- local build_mode subagent_dispatch
391
- build_mode=$(yaml_field_value "build_mode" 2>/dev/null || true)
392
- subagent_dispatch=$(yaml_field_value "subagent_dispatch" 2>/dev/null || true)
393
-
394
- if [ "$build_mode" != "subagent-driven-development" ]; then
395
- return 0
396
- fi
397
-
398
- if [ "$subagent_dispatch" = "confirmed" ]; then
399
- return 0
400
- fi
401
-
402
- echo "subagent_dispatch must be confirmed before using build_mode=subagent-driven-development" >&2
403
- echo "Next: confirm the current platform has a real background subagent/Task/multi-agent dispatcher, then run:" >&2
404
- echo " \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE subagent_dispatch confirmed" >&2
405
- echo "Or ask the user to switch to executing-plans and run:" >&2
406
- echo " \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE build_mode executing-plans" >&2
407
- return 1
408
- }
409
-
410
- tdd_mode_selected() {
411
- local workflow tdd_mode
412
- workflow=$(yaml_field_value "workflow" 2>/dev/null || true)
413
- tdd_mode=$(yaml_field_value "tdd_mode" 2>/dev/null || true)
414
-
415
- case "$workflow" in
416
- hotfix|tweak) return 0 ;;
417
- esac
418
-
419
- case "$tdd_mode" in
420
- tdd|direct) return 0 ;;
421
- *)
422
- echo "tdd_mode must be tdd or direct for full workflow, got '${tdd_mode:-null}'" >&2
423
- echo "Next: ask the user to choose TDD enforcement level, then run:" >&2
424
- echo " \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE tdd_mode <tdd|direct>" >&2
425
- return 1
426
- ;;
427
- esac
428
- }
429
-
430
- verify_result_is_pass() {
431
- local result
432
- result=$(yaml_field_value "verify_result" 2>/dev/null || true)
433
- [ "$result" = "pass" ]
434
- }
435
-
436
- verification_report_exists() {
437
- local report
438
- report=$(yaml_field_value "verification_report" 2>/dev/null || true)
439
- [ -n "$report" ] && [ "$report" != "null" ] && [ -f "$report" ]
440
- }
441
-
442
- branch_status_handled() {
443
- local status
444
- status=$(yaml_field_value "branch_status" 2>/dev/null || true)
445
- [ "$status" = "handled" ]
446
- }
447
-
448
- design_handoff_context_valid() {
449
- local context recorded_hash actual_hash markdown
450
- context=$(yaml_field_value "handoff_context" 2>/dev/null || true)
451
- recorded_hash=$(yaml_field_value "handoff_hash" 2>/dev/null || true)
452
-
453
- if [ -z "$context" ] || [ "$context" = "null" ]; then
454
- echo "handoff_context is missing from .comet.yaml" >&2
455
- echo "Next: run \"\$COMET_BASH\" \"\$COMET_HANDOFF\" $CHANGE design --write before invoking Superpowers." >&2
456
- return 1
457
- fi
458
- if [ ! -s "$context" ]; then
459
- echo "handoff_context does not point to a non-empty file: $context" >&2
460
- echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
461
- return 1
462
- fi
463
- if [[ ! "$recorded_hash" =~ ^[a-f0-9]{64}$ ]]; then
464
- echo "handoff_hash is missing or invalid: ${recorded_hash:-null}" >&2
465
- echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
466
- return 1
467
- fi
468
-
469
- actual_hash=$(compute_handoff_hash)
470
- if [ "$actual_hash" != "$recorded_hash" ]; then
471
- echo "OpenSpec artifacts changed after handoff was generated." >&2
472
- echo "Expected handoff_hash: $recorded_hash" >&2
473
- echo "Actual handoff_hash: $actual_hash" >&2
474
- echo "Next: rerun comet-handoff.sh so Superpowers receives the current OpenSpec context." >&2
475
- return 1
476
- fi
477
-
478
- markdown="${context%.json}.md"
479
- if [ ! -s "$markdown" ]; then
480
- echo "design handoff markdown is missing or empty: $markdown" >&2
481
- echo "Next: regenerate the design handoff with comet-handoff.sh." >&2
482
- return 1
483
- fi
484
- }
485
-
486
- design_handoff_markdown_traceable() {
487
- local context markdown missing=0
488
- context=$(yaml_field_value "handoff_context" 2>/dev/null || true)
489
- if [ -z "$context" ] || [ "$context" = "null" ]; then
490
- echo "handoff_context is missing from .comet.yaml" >&2
491
- return 1
492
- fi
493
- markdown="${context%.json}.md"
494
- if [ ! -s "$markdown" ]; then
495
- echo "design handoff markdown is missing or empty: $markdown" >&2
496
- return 1
497
- fi
498
- grep -q '^Generated-by: comet-handoff\.sh$' "$markdown" || {
499
- echo "handoff markdown is missing Generated-by marker" >&2
500
- missing=1
501
- }
502
- grep -Eq '^- Mode: (compact|full|beta)$' "$markdown" || {
503
- echo "handoff markdown is missing Mode marker" >&2
504
- missing=1
505
- }
506
- handoff_source_files | while IFS= read -r file; do
507
- [ -f "$file" ] || continue
508
- if ! grep -q "^- Source: $file$" "$markdown"; then
509
- echo "handoff markdown is missing source reference: $file" >&2
510
- exit 2
511
- fi
512
- if ! grep -q "^- SHA256: $(hash_file "$file")$" "$markdown"; then
513
- echo "handoff markdown is missing current sha256 for: $file" >&2
514
- exit 2
515
- fi
516
- done || missing=1
517
-
518
- [ "$missing" -eq 0 ]
519
- }
520
-
521
- context_compression_mode() {
522
- local mode
523
- mode=$(yaml_field_value "context_compression" 2>/dev/null || true)
524
- printf '%s\n' "${mode:-off}"
525
- }
526
-
527
- beta_spec_json_structurally_valid() {
528
- local context missing=0
529
- if [ "$(context_compression_mode)" != "beta" ]; then
530
- return 0
531
- fi
532
-
533
- context=$(yaml_field_value "handoff_context" 2>/dev/null || true)
534
- if [ -z "$context" ] || [ "$context" = "null" ]; then
535
- echo "handoff_context is missing from .comet.yaml" >&2
536
- return 1
537
- fi
538
- if [ ! -s "$context" ]; then
539
- echo "spec-context.json is missing or empty: $context" >&2
540
- return 1
541
- fi
542
-
543
- # Validate required JSON fields
544
- grep -q '"change"' "$context" || { echo "spec-context.json missing 'change' field" >&2; return 1; }
545
- grep -q '"phase"' "$context" || { echo "spec-context.json missing 'phase' field" >&2; return 1; }
546
- grep -q '"mode": "beta"' "$context" || { echo "spec-context.json mode is not beta" >&2; return 1; }
547
- grep -q '"files"' "$context" || { echo "spec-context.json missing 'files' field" >&2; return 1; }
548
- grep -q '"context_hash"' "$context" || { echo "spec-context.json missing 'context_hash' field" >&2; return 1; }
549
-
550
- # Verify all source files are referenced in the JSON
551
- handoff_source_files | while IFS= read -r file; do
552
- [ -f "$file" ] || continue
553
- if ! grep -qF "$file" "$context"; then
554
- echo "spec-context.json missing source file reference: $file" >&2
555
- exit 2
556
- fi
557
- done || missing=1
558
-
559
- [ "$missing" -eq 0 ]
560
- }
561
-
562
- design_doc_frontmatter_has() {
563
- local design_doc="$1"
564
- local field="$2"
565
- local expected="$3"
566
- awk '
567
- {
568
- line = $0
569
- sub(/^\357\273\277/, "", line)
570
- }
571
- !in_fm && line == "---" { in_fm = 1; next }
572
- in_fm && line == "---" { exit }
573
- in_fm { print line }
574
- ' "$design_doc" | grep -Eq "^${field}: ['\"]?${expected}['\"]?[[:space:]]*$"
575
- }
576
-
577
- design_doc_links_current_change() {
578
- local design_doc
579
- design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
580
- if [ -z "$design_doc" ] || [ "$design_doc" = "null" ] || [ ! -s "$design_doc" ]; then
581
- echo "design_doc must point to an existing Superpowers Design Doc before leaving design." >&2
582
- return 1
583
- fi
584
- design_doc_frontmatter_has "$design_doc" "comet_change" "$CHANGE"
585
- }
586
-
587
- design_doc_declares_technical_role() {
588
- local design_doc
589
- design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
590
- [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -s "$design_doc" ] &&
591
- design_doc_frontmatter_has "$design_doc" "role" "technical-design"
592
- }
593
-
594
- design_doc_declares_canonical_spec() {
595
- local design_doc
596
- design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
597
- [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -s "$design_doc" ] &&
598
- design_doc_frontmatter_has "$design_doc" "canonical_spec" "openspec"
599
- }
600
-
601
- archived_is_true() {
602
- local val
603
- val=$(yaml_field_value "archived" 2>/dev/null || true)
604
- [ "$val" = "true" ]
605
- }
606
-
607
- # --- Phase-specific checks ---
608
-
609
- guard_open() {
610
- echo "=== Guard: open → next ===" >&2
611
-
612
- check "proposal.md exists and non-empty" file_nonempty "$CHANGE_DIR/proposal.md"
613
- check "design.md exists and non-empty" file_nonempty "$CHANGE_DIR/design.md"
614
- check "tasks.md exists and non-empty" file_nonempty "$CHANGE_DIR/tasks.md"
615
- check "tasks.md has at least one task" tasks_has_any
616
- }
617
-
618
- guard_design() {
619
- echo "=== Guard: design → build ===" >&2
620
-
621
- local design_doc workflow
622
- design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
623
- workflow=$(yaml_field_value "workflow" 2>/dev/null || true)
624
-
625
- check "proposal.md exists" file_nonempty "$CHANGE_DIR/proposal.md"
626
- check "design.md exists" file_nonempty "$CHANGE_DIR/design.md"
627
- check "tasks.md exists" file_nonempty "$CHANGE_DIR/tasks.md"
628
- check "design handoff context exists" design_handoff_context_valid
629
- check "design handoff markdown is traceable" design_handoff_markdown_traceable
630
- if [ "$(context_compression_mode)" = "beta" ]; then
631
- check "beta spec-context.json is structurally valid" beta_spec_json_structurally_valid
632
- fi
633
-
634
- if [ "$workflow" = "full" ]; then
635
- # Full workflow: design_doc is REQUIRED
636
- check "design_doc is recorded for full workflow" design_doc_recorded
637
- fi
638
-
639
- if [ -n "$design_doc" ] && [ "$design_doc" != "null" ]; then
640
- check "Design Doc ($design_doc) exists" file_nonempty "$design_doc"
641
- check "Design Doc frontmatter links current change" design_doc_links_current_change
642
- check "Design Doc declares technical design role" design_doc_declares_technical_role
643
- check "Design Doc declares OpenSpec as canonical spec" design_doc_declares_canonical_spec
644
- elif [ "$workflow" != "full" ]; then
645
- warn " [WARN] No design_doc recorded in .comet.yaml (optional for hotfix/tweak)"
646
- fi
647
- }
648
-
649
- design_doc_recorded() {
650
- local design_doc
651
- design_doc=$(yaml_field_value "design_doc" 2>/dev/null || true)
652
- if [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -f "$design_doc" ]; then
653
- return 0
654
- fi
655
- echo "design_doc must point to an existing Superpowers Design Doc for full workflow before leaving design." >&2
656
- echo "Next: create the Design Doc and run: \"\$COMET_BASH\" \"\$COMET_STATE\" set $CHANGE design_doc <path>" >&2
657
- return 1
658
- }
659
-
660
- guard_build() {
661
- echo "=== Guard: build → verify ===" >&2
662
-
663
- check "isolation selected" isolation_selected
664
- check "build_mode selected" build_mode_selected
665
- check "build_mode allowed for workflow" build_mode_allowed_for_workflow
666
- check "subagent dispatch confirmed" subagent_dispatch_confirmed
667
- check "tdd_mode selected" tdd_mode_selected
668
- check "tasks.md all tasks checked" tasks_all_done
669
- check "Superpowers plan all tasks checked" plan_tasks_all_done
670
- check "proposal.md exists" file_nonempty "$CHANGE_DIR/proposal.md"
671
- check "Build passes" build_passes
672
- }
673
-
674
- guard_verify() {
675
- echo "=== Guard: verify → archive ===" >&2
676
-
677
- check "tasks.md all tasks checked" tasks_all_done
678
- check "Build passes" verification_command_passes
679
- check "verification_report exists" verification_report_exists
680
- check "branch_status=handled" branch_status_handled
681
- }
682
-
683
- guard_archive() {
684
- echo "=== Guard: archive completeness ===" >&2
685
-
686
- check "archived is true" archived_is_true
687
- check "proposal.md exists" file_nonempty "$CHANGE_DIR/proposal.md"
688
- check "design.md exists" file_nonempty "$CHANGE_DIR/design.md"
689
- check "tasks.md all tasks checked" tasks_all_done
690
- }
691
-
692
- apply_state_update() {
693
- local state_sh="$SCRIPT_DIR/comet-state.sh"
694
- local p="$1"
695
-
696
- if [ -f "$state_sh" ]; then
697
- case "$p" in
698
- open) "$COMET_BASH" "$state_sh" transition "$CHANGE" open-complete ;;
699
- design) "$COMET_BASH" "$state_sh" transition "$CHANGE" design-complete ;;
700
- build) "$COMET_BASH" "$state_sh" transition "$CHANGE" build-complete ;;
701
- verify) "$COMET_BASH" "$state_sh" transition "$CHANGE" verify-pass ;;
702
- esac
703
- else
704
- red "FATAL: comet-state.sh not found; cannot apply state transition"
705
- exit 1
706
- fi
707
- }
708
-
709
- # --- Main ---
710
-
711
- if [ "${COMET_GUARD_SOURCE_ONLY:-0}" = "1" ]; then
712
- return 0 2>/dev/null
713
- # shellcheck disable=SC2317 # unreachable if sourced; fallback for direct execution
714
- red "ERROR: COMET_GUARD_SOURCE_ONLY=1 is only for sourcing, not direct execution" >&2
715
- # shellcheck disable=SC2317
716
- exit 1
717
- fi
718
-
719
- case "$PHASE" in
720
- open) preflight ; guard_open ;;
721
- design) preflight ; guard_design ;;
722
- build) preflight ; guard_build ;;
723
- verify) preflight ; guard_verify ;;
724
- archive) preflight ; guard_archive ;;
725
- *)
726
- red "Unknown phase: $PHASE"
727
- echo "Valid phases: open, design, build, verify, archive" >&2
728
- exit 1
729
- ;;
730
- esac
731
-
732
- if [ "$BLOCK" -eq 1 ]; then
733
- echo "" >&2
734
- red "BLOCKED — fix failing checks before proceeding to next phase"
735
- exit 1
736
- else
737
- echo "" >&2
738
- green "ALL CHECKS PASSED — ready for next phase"
739
- if [ "$APPLY" -eq 1 ]; then
740
- apply_state_update "$PHASE"
741
- case "$PHASE" in
742
- open)
743
- new_phase=$(yaml_field_value "phase")
744
- green " [APPLY] .comet.yaml updated: phase=$new_phase"
745
- ;;
746
- design) green " [APPLY] .comet.yaml updated: phase=build" ;;
747
- build) green " [APPLY] .comet.yaml updated: phase=verify, verify_result=pending" ;;
748
- verify) green " [APPLY] .comet.yaml updated: phase=archive, verify_result=pass" ;;
749
- esac
750
- fi
751
- exit 0
752
- fi