@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,1245 +0,0 @@
1
- #!/bin/bash
2
- # Comet State — unified interface for .comet.yaml state management
3
- # Usage: comet-state.sh <subcommand> <change-name> [args...]
4
- #
5
- # Subcommands:
6
- # init <change-name> <workflow> — Initialize .comet.yaml with workflow defaults
7
- # get <change-name> <field> — Read a field value from .comet.yaml
8
- # set <change-name> <field> <val> — Update a field value
9
- # transition <change-name> <event> — Apply a validated state transition
10
- # check <change-name> <phase> — Verify entry requirements for a phase
11
- # check <change-name> <phase> --recover — Output structured recovery context for compaction resume
12
- # scale <change-name> — Assess and set verification mode based on metrics
13
- # task-checkoff <file> <task-text> — Verify one unique task is checked
14
- #
15
- # Workflows: full, hotfix, tweak
16
- # Phases for check: open, design, build, verify, archive
17
-
18
- set -euo pipefail
19
-
20
- # --- Color output helpers ---
21
-
22
- red() { echo -e "\033[31m$1\033[0m" >&2; }
23
- green() { echo -e "\033[32m$1\033[0m" >&2; }
24
- yellow() { echo -e "\033[33m$1\033[0m" >&2; }
25
-
26
- # --- Script location ---
27
-
28
- # shellcheck disable=SC2034
29
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
30
-
31
- # --- Input validation ---
32
-
33
- validate_change_name() {
34
- local name="$1"
35
- # Reject empty names
36
- if [ -z "$name" ]; then
37
- red "ERROR: Change name cannot be empty" >&2
38
- exit 1
39
- fi
40
- # Only allow alphanumeric, hyphens, and underscores
41
- if [[ ! "$name" =~ ^[a-zA-Z0-9_-]+$ ]]; then
42
- red "ERROR: Invalid change name: '$name'" >&2
43
- red "Valid characters: a-z, A-Z, 0-9, -, _" >&2
44
- exit 1
45
- fi
46
- # Reject path traversal attempts
47
- if [[ "$name" =~ \.\. ]]; then
48
- red "ERROR: Change name cannot contain '..' (path traversal not allowed)" >&2
49
- exit 1
50
- fi
51
- }
52
-
53
- validate_enum() {
54
- local value="$1"
55
- shift
56
- local valid_values=("$@")
57
-
58
- for valid in "${valid_values[@]}"; do
59
- if [ "$value" = "$valid" ]; then
60
- return 0
61
- fi
62
- done
63
-
64
- red "ERROR: Invalid value: '$value'" >&2
65
- red "Valid values: ${valid_values[*]}" >&2
66
- exit 1
67
- }
68
-
69
- validate_path_field() {
70
- local value="$1"
71
- local field="$2"
72
- # null and empty are acceptable (means "not set")
73
- if [ -z "$value" ] || [ "$value" = "null" ]; then
74
- return 0
75
- fi
76
- # Reject absolute paths and home-directory references
77
- case "$value" in
78
- /*|~*|[A-Za-z]:*|\\*)
79
- red "ERROR: $field must be a relative path within the repo: '$value'" >&2
80
- exit 1
81
- ;;
82
- esac
83
- if [[ "$value" =~ \.\. ]]; then
84
- red "ERROR: $field cannot contain '..' (path traversal not allowed): '$value'" >&2
85
- exit 1
86
- fi
87
- }
88
-
89
- # --- Helper functions ---
90
-
91
- yaml_field() {
92
- local field="$1"
93
- local yaml_file="$2"
94
- if [ -f "$yaml_file" ]; then
95
- local value
96
- value=$(grep "^${field}:" "$yaml_file" 2>/dev/null | sed "s/^${field}: *//" || true)
97
- value=$(strip_inline_comment "$value")
98
- strip_wrapping_quotes "$value"
99
- fi
100
- }
101
-
102
- strip_inline_comment() {
103
- local value="$1"
104
- printf '%s\n' "$value" | awk -v squote="'" '
105
- {
106
- out = ""
107
- quote = ""
108
- for (i = 1; i <= length($0); i++) {
109
- c = substr($0, i, 1)
110
- if (quote == "") {
111
- if (c == "\"" || c == squote) {
112
- quote = c
113
- } else if (c == "#" && (i == 1 || substr($0, i - 1, 1) ~ /[[:space:]]/)) {
114
- sub(/[[:space:]]+$/, "", out)
115
- print out
116
- next
117
- }
118
- } else if (c == quote) {
119
- quote = ""
120
- }
121
- out = out c
122
- }
123
- print out
124
- }
125
- '
126
- }
127
-
128
- strip_wrapping_quotes() {
129
- local value="$1"
130
- case "$value" in
131
- \"*\")
132
- printf '%s\n' "${value:1:${#value}-2}"
133
- ;;
134
- \'*\')
135
- printf '%s\n' "${value:1:${#value}-2}"
136
- ;;
137
- *)
138
- printf '%s\n' "$value"
139
- ;;
140
- esac
141
- }
142
-
143
- replace_yaml_field() {
144
- local yaml_file="$1"
145
- local field="$2"
146
- local value="$3"
147
- local tmp_file
148
-
149
- tmp_file=$(mktemp)
150
- chmod 600 "$tmp_file"
151
- # Replace the target field, then deduplicate all fields keeping only the
152
- # last occurrence of each key. Prevents stale earlier values from
153
- # persisting when a field is set multiple times.
154
- awk -v field="$field" -v value="$value" '
155
- index($0, field ":") == 1 { $0 = field ": " value }
156
- { buf[NR] = $0; keys[NR] = $0; sub(/:.*$/, "", keys[NR]); n = NR }
157
- END {
158
- for (i = 1; i <= n; i++) last[keys[i]] = i
159
- for (i = 1; i <= n; i++) if (last[keys[i]] == i) print buf[i]
160
- }
161
- ' "$yaml_file" > "$tmp_file"
162
- mv "$tmp_file" "$yaml_file"
163
- }
164
-
165
- file_nonempty() {
166
- [ -f "$1" ] && [ -s "$1" ]
167
- }
168
-
169
- change_dir_for() {
170
- local change_name="$1"
171
- if [ -d "openspec/changes/$change_name" ]; then
172
- echo "openspec/changes/$change_name"
173
- elif [ -d "openspec/changes/archive/$change_name" ]; then
174
- echo "openspec/changes/archive/$change_name"
175
- else
176
- echo "openspec/changes/$change_name"
177
- fi
178
- }
179
-
180
- yaml_file_for() {
181
- local change_name="$1"
182
- local change_dir
183
- change_dir=$(change_dir_for "$change_name")
184
- echo "$change_dir/.comet.yaml"
185
- }
186
-
187
- project_context_compression() {
188
- local value="off"
189
- local source="default"
190
- if [ -n "${COMET_CONTEXT_COMPRESSION:-}" ]; then
191
- value="$COMET_CONTEXT_COMPRESSION"
192
- source="COMET_CONTEXT_COMPRESSION"
193
- elif [ -f ".comet/config.yaml" ]; then
194
- value=$(yaml_field "context_compression" ".comet/config.yaml")
195
- value="${value:-off}"
196
- source=".comet/config.yaml"
197
- fi
198
-
199
- case "$value" in
200
- off|beta)
201
- printf '%s\n' "$value"
202
- ;;
203
- *)
204
- red "ERROR: Invalid context_compression from ${source}: '$value'" >&2
205
- red "Valid values: off, beta" >&2
206
- exit 1
207
- ;;
208
- esac
209
- }
210
-
211
- project_auto_transition_default() {
212
- local value="true"
213
- local source="default"
214
- if [ -n "${COMET_AUTO_TRANSITION:-}" ]; then
215
- value="$COMET_AUTO_TRANSITION"
216
- source="COMET_AUTO_TRANSITION"
217
- elif [ -f ".comet/config.yaml" ]; then
218
- local raw
219
- raw=$(yaml_field "auto_transition" ".comet/config.yaml" 2>/dev/null || true)
220
- if [ -n "$raw" ]; then
221
- value="$raw"
222
- source=".comet/config.yaml"
223
- fi
224
- fi
225
-
226
- case "$value" in
227
- true|false)
228
- printf '%s\n' "$value"
229
- ;;
230
- *)
231
- red "ERROR: Invalid auto_transition from ${source}: '$value'" >&2
232
- red "Valid values: true, false" >&2
233
- exit 1
234
- ;;
235
- esac
236
- }
237
-
238
- # --- Subcommands ---
239
-
240
- cmd_init() {
241
- local change_name="$1"
242
- local workflow="$2"
243
-
244
- validate_change_name "$change_name"
245
- validate_enum "$workflow" "full" "hotfix" "tweak"
246
-
247
- local change_dir yaml_file
248
- change_dir=$(change_dir_for "$change_name")
249
- yaml_file=$(yaml_file_for "$change_name")
250
-
251
- # Check if .comet.yaml already exists
252
- if [ -f "$yaml_file" ]; then
253
- red "ERROR: .comet.yaml already exists at $yaml_file"
254
- exit 1
255
- fi
256
-
257
- # Create change directory if it doesn't exist
258
- mkdir -p "$change_dir"
259
-
260
- # Set workflow-appropriate defaults
261
- local phase build_mode isolation verify_mode context_compression auto_transition
262
- phase="open"
263
- context_compression=$(project_context_compression)
264
- auto_transition="$(project_auto_transition_default)"
265
-
266
- case "$workflow" in
267
- full)
268
- build_mode="null"
269
- tdd_mode="null"
270
- isolation="null"
271
- verify_mode="null"
272
- ;;
273
- hotfix|tweak)
274
- build_mode="direct"
275
- tdd_mode="direct"
276
- isolation="branch"
277
- verify_mode="light"
278
- ;;
279
- esac
280
-
281
- # Write .comet.yaml
282
- # Record current HEAD as base_ref for scale assessment fallback
283
- local base_ref="null"
284
- if git rev-parse --verify HEAD >/dev/null 2>&1; then
285
- base_ref=$(git rev-parse HEAD 2>/dev/null || echo "null")
286
- fi
287
-
288
- cat > "$yaml_file" <<EOF
289
- workflow: $workflow
290
- phase: $phase
291
- context_compression: $context_compression
292
- build_mode: $build_mode
293
- build_pause: null
294
- subagent_dispatch: null
295
- tdd_mode: $tdd_mode
296
- isolation: $isolation
297
- verify_mode: $verify_mode
298
- auto_transition: $auto_transition
299
- base_ref: $base_ref
300
- design_doc: null
301
- plan: null
302
- verify_result: pending
303
- verification_report: null
304
- branch_status: pending
305
- created_at: $(date -u +%Y-%m-%d)
306
- verified_at: null
307
- archived: false
308
- EOF
309
-
310
- green "Initialized: $yaml_file (workflow=$workflow)"
311
- }
312
-
313
- cmd_get() {
314
- local change_name="$1"
315
- local field="$2"
316
-
317
- validate_change_name "$change_name"
318
-
319
- local yaml_file
320
- yaml_file=$(yaml_file_for "$change_name")
321
-
322
- # Check if .comet.yaml exists
323
- if [ ! -f "$yaml_file" ]; then
324
- red "ERROR: .comet.yaml not found at $yaml_file"
325
- exit 1
326
- fi
327
-
328
- # Read and output the field value
329
- local value
330
- value=$(yaml_field "$field" "$yaml_file")
331
- if [ "$field" = "auto_transition" ] && { [ -z "$value" ] || [ "$value" = "null" ]; }; then
332
- value="$(project_auto_transition_default)"
333
- fi
334
- echo "${value:-}"
335
- }
336
-
337
- cmd_set() {
338
- local change_name="$1"
339
- local field="$2"
340
- local value="$3"
341
-
342
- validate_change_name "$change_name"
343
-
344
- local yaml_file
345
- yaml_file=$(yaml_file_for "$change_name")
346
-
347
- # Check if .comet.yaml exists
348
- if [ ! -f "$yaml_file" ]; then
349
- red "ERROR: .comet.yaml not found at $yaml_file"
350
- exit 1
351
- fi
352
-
353
- # Validate field name
354
- case "$field" in
355
- phase)
356
- yellow "WARNING: Setting 'phase' directly bypasses state machine constraints." >&2
357
- yellow " Consider using: comet-state.sh transition <change-name> <event>" >&2
358
- ;;
359
- workflow|context_compression|build_mode|build_pause|subagent_dispatch|tdd_mode|isolation|verify_mode|auto_transition|verify_result|verification_report|branch_status|archived|design_doc|plan|verified_at|created_at|direct_override|build_command|verify_command|handoff_context|handoff_hash|base_ref)
360
- # Valid field
361
- ;;
362
- *)
363
- red "ERROR: Unknown field: '$field'" >&2
364
- red "Valid fields:" >&2
365
- red " workflow, phase, context_compression, design_doc, plan, build_mode, build_pause, subagent_dispatch, tdd_mode, isolation," >&2
366
- red " verify_mode, auto_transition, verify_result, verification_report, branch_status," >&2
367
- red " verified_at, created_at, archived, base_ref, direct_override," >&2
368
- red " build_command, verify_command, handoff_context, handoff_hash" >&2
369
- exit 1
370
- ;;
371
- esac
372
-
373
- # Validate enum values
374
- case "$field" in
375
- workflow)
376
- validate_enum "$value" "full" "hotfix" "tweak"
377
- ;;
378
- context_compression)
379
- validate_enum "$value" "off" "beta"
380
- ;;
381
- phase)
382
- validate_enum "$value" "open" "design" "build" "verify" "archive"
383
- ;;
384
- build_mode)
385
- validate_enum "$value" "subagent-driven-development" "executing-plans" "direct"
386
- ;;
387
- build_pause)
388
- validate_enum "$value" "null" "plan-ready"
389
- ;;
390
- subagent_dispatch)
391
- validate_enum "$value" "null" "confirmed"
392
- ;;
393
- tdd_mode)
394
- validate_enum "$value" "tdd" "direct"
395
- ;;
396
- isolation)
397
- validate_enum "$value" "branch" "worktree"
398
- ;;
399
- verify_mode)
400
- validate_enum "$value" "light" "full"
401
- ;;
402
- auto_transition)
403
- validate_enum "$value" "true" "false"
404
- ;;
405
- verify_result)
406
- validate_enum "$value" "pending" "pass" "fail"
407
- ;;
408
- branch_status)
409
- validate_enum "$value" "pending" "handled"
410
- ;;
411
- archived)
412
- validate_enum "$value" "true" "false"
413
- ;;
414
- direct_override)
415
- validate_enum "$value" "true" "false"
416
- ;;
417
- design_doc|plan|verification_report|handoff_context|handoff_hash)
418
- validate_path_field "$value" "$field"
419
- ;;
420
- verified_at|created_at|build_command|verify_command)
421
- # No validation for date fields or project command strings
422
- ;;
423
- esac
424
-
425
- # Write or update the field
426
- if grep -q "^${field}:" "$yaml_file"; then
427
- replace_yaml_field "$yaml_file" "$field" "$value"
428
- else
429
- # Field doesn't exist, append it
430
- echo "${field}: ${value}" >> "$yaml_file"
431
- fi
432
-
433
- green "[SET] ${field}=${value}"
434
- }
435
-
436
- require_phase() {
437
- local change_name="$1"
438
- local expected="$2"
439
- local actual
440
- actual=$(cmd_get "$change_name" "phase")
441
- if [ "$actual" != "$expected" ]; then
442
- red "ERROR: Cannot transition '$change_name': expected phase ${expected}, got ${actual}" >&2
443
- exit 1
444
- fi
445
- }
446
-
447
- require_verification_evidence() {
448
- local change_name="$1"
449
- local report branch_status
450
- report=$(cmd_get "$change_name" "verification_report")
451
- branch_status=$(cmd_get "$change_name" "branch_status")
452
-
453
- if [ -z "$report" ] || [ "$report" = "null" ] || [ ! -f "$report" ]; then
454
- red "ERROR: Cannot transition '$change_name': verification_report must point to an existing report file" >&2
455
- exit 1
456
- fi
457
-
458
- if [ "$branch_status" != "handled" ]; then
459
- red "ERROR: Cannot transition '$change_name': branch_status must be handled" >&2
460
- exit 1
461
- fi
462
- }
463
-
464
- require_build_decisions() {
465
- local change_name="$1"
466
- local workflow build_mode isolation direct_override subagent_dispatch tdd_mode
467
- workflow=$(cmd_get "$change_name" "workflow")
468
- build_mode=$(cmd_get "$change_name" "build_mode")
469
- isolation=$(cmd_get "$change_name" "isolation")
470
- direct_override=$(cmd_get "$change_name" "direct_override" 2>/dev/null || true)
471
- subagent_dispatch=$(cmd_get "$change_name" "subagent_dispatch" 2>/dev/null || true)
472
- tdd_mode=$(cmd_get "$change_name" "tdd_mode" 2>/dev/null || true)
473
-
474
- case "$isolation" in
475
- branch|worktree) ;;
476
- *)
477
- red "ERROR: Cannot transition '$change_name': isolation must be branch or worktree, got '${isolation:-null}'" >&2
478
- exit 1
479
- ;;
480
- esac
481
-
482
- case "$build_mode" in
483
- subagent-driven-development|executing-plans|direct) ;;
484
- *)
485
- red "ERROR: Cannot transition '$change_name': build_mode must be selected before leaving build, got '${build_mode:-null}'" >&2
486
- exit 1
487
- ;;
488
- esac
489
-
490
- if [ "$build_mode" = "direct" ] && [ "$workflow" != "hotfix" ] && [ "$workflow" != "tweak" ] && [ "$direct_override" != "true" ]; then
491
- red "ERROR: Cannot transition '$change_name': build_mode=direct is only allowed for hotfix/tweak unless direct_override=true" >&2
492
- exit 1
493
- fi
494
-
495
- if [ "$build_mode" = "subagent-driven-development" ] && [ "$subagent_dispatch" != "confirmed" ]; then
496
- red "ERROR: Cannot transition '$change_name': subagent_dispatch must be confirmed before using build_mode=subagent-driven-development" >&2
497
- exit 1
498
- fi
499
-
500
- if [ "$workflow" = "full" ] && { [ "$tdd_mode" = "null" ] || [ -z "$tdd_mode" ]; }; then
501
- red "ERROR: Cannot transition '$change_name': tdd_mode must be selected before leaving build (full workflow)" >&2
502
- exit 1
503
- fi
504
- }
505
-
506
- cmd_transition() {
507
- local change_name="$1"
508
- local event="$2"
509
-
510
- validate_change_name "$change_name"
511
- validate_enum "$event" "open-complete" "design-complete" "build-complete" "verify-pass" "verify-fail" "archive-reopen" "archived"
512
-
513
- case "$event" in
514
- open-complete)
515
- require_phase "$change_name" "open"
516
- local workflow
517
- workflow=$(cmd_get "$change_name" "workflow")
518
- if [ "$workflow" = "full" ]; then
519
- cmd_set "$change_name" phase design
520
- else
521
- cmd_set "$change_name" phase build
522
- fi
523
- ;;
524
- design-complete)
525
- require_phase "$change_name" "design"
526
- cmd_set "$change_name" phase build
527
- ;;
528
- build-complete)
529
- require_phase "$change_name" "build"
530
- require_build_decisions "$change_name"
531
- local current_verify_result
532
- current_verify_result=$(cmd_get "$change_name" "verify_result")
533
- cmd_set "$change_name" phase verify
534
- cmd_set "$change_name" verify_result pending
535
- # Preserve verification evidence on re-verify (verify-fail → build → build-complete)
536
- # so the fix can reference the original failure report
537
- if [ "$current_verify_result" != "fail" ]; then
538
- cmd_set "$change_name" verification_report null
539
- cmd_set "$change_name" branch_status pending
540
- fi
541
- ;;
542
- verify-pass)
543
- require_phase "$change_name" "verify"
544
- require_verification_evidence "$change_name"
545
- cmd_set "$change_name" verify_result pass
546
- cmd_set "$change_name" phase archive
547
- cmd_set "$change_name" verified_at "$(date -u +%Y-%m-%d)"
548
- ;;
549
- verify-fail)
550
- require_phase "$change_name" "verify"
551
- cmd_set "$change_name" verify_result fail
552
- cmd_set "$change_name" phase build
553
- # Preserve branch_status so re-verify doesn't require re-handling branches
554
- ;;
555
- archive-reopen)
556
- require_phase "$change_name" "archive"
557
- local archived
558
- archived=$(cmd_get "$change_name" "archived")
559
- if [ "$archived" = "true" ]; then
560
- red "ERROR: Cannot transition '$change_name': already archived" >&2
561
- exit 1
562
- fi
563
- cmd_set "$change_name" verify_result pending
564
- cmd_set "$change_name" phase verify
565
- cmd_set "$change_name" verified_at null
566
- ;;
567
- archived)
568
- require_phase "$change_name" "archive"
569
- cmd_set "$change_name" archived true
570
- ;;
571
- esac
572
-
573
- green "[TRANSITION] ${event}"
574
- }
575
-
576
- # --- Check helpers for entry verification ---
577
-
578
- CHECK_BLOCK=0
579
-
580
- check_pass() {
581
- local msg="$1"
582
- echo " $(green "[PASS]") $msg"
583
- }
584
-
585
- check_fail() {
586
- local msg="$1"
587
- echo " $(red "[FAIL]") $msg"
588
- CHECK_BLOCK=1
589
- }
590
-
591
- check_nonempty() {
592
- local desc="$1"
593
- local path="$2"
594
- if file_nonempty "$path"; then
595
- check_pass "$desc non-empty"
596
- else
597
- check_fail "$desc missing or empty"
598
- fi
599
- }
600
-
601
- check_yaml_is() {
602
- local field="$1"
603
- local expected="$2"
604
- local change_name="$3"
605
- local actual
606
- actual=$(cmd_get "$change_name" "$field")
607
- if [ "$actual" = "$expected" ]; then
608
- check_pass "${field}=${actual} (expected: ${expected})"
609
- else
610
- check_fail "${field}=${actual} (expected: ${expected})"
611
- fi
612
- }
613
-
614
- check_yaml_empty() {
615
- local field="$1"
616
- local change_name="$2"
617
- local value
618
- value=$(cmd_get "$change_name" "$field")
619
- if [ -z "$value" ] || [ "$value" = "null" ]; then
620
- check_pass "${field} is empty/null"
621
- else
622
- check_fail "${field}=${value} (expected: empty/null)"
623
- fi
624
- }
625
-
626
- check_file_not_exists() {
627
- local desc="$1"
628
- local path="$2"
629
- if [ ! -f "$path" ]; then
630
- check_pass "$desc does not exist"
631
- else
632
- check_fail "$desc exists (should not exist)"
633
- fi
634
- }
635
-
636
- cmd_check() {
637
- local change_name="$1"
638
- local phase="$2"
639
-
640
- validate_change_name "$change_name"
641
- validate_enum "$phase" "open" "design" "build" "verify" "archive"
642
-
643
- local change_dir="openspec/changes/$change_name"
644
- local yaml_file="$change_dir/.comet.yaml"
645
- local proposal_file="$change_dir/proposal.md"
646
- local design_file="$change_dir/design.md"
647
- local tasks_file="$change_dir/tasks.md"
648
-
649
- echo "=== Entry Check: comet-${phase} ==="
650
-
651
- # .comet.yaml must exist for all phases (state machine core)
652
- if [ ! -f "$yaml_file" ]; then
653
- red "ERROR: .comet.yaml not found at $yaml_file"
654
- exit 1
655
- fi
656
-
657
- # Phase-specific checks
658
- case "$phase" in
659
- open)
660
- check_pass ".comet.yaml exists"
661
- check_yaml_is "phase" "open" "$change_name"
662
- ;;
663
- design)
664
- check_pass ".comet.yaml exists"
665
- check_yaml_is "phase" "design" "$change_name"
666
- check_yaml_is "workflow" "full" "$change_name"
667
- check_yaml_empty "design_doc" "$change_name"
668
- check_nonempty "proposal.md" "$proposal_file"
669
- check_nonempty "design.md" "$design_file"
670
- check_nonempty "tasks.md" "$tasks_file"
671
- ;;
672
- build)
673
- check_pass ".comet.yaml exists"
674
- check_yaml_is "phase" "build" "$change_name"
675
- # design_doc required for full workflow only
676
- local workflow
677
- workflow=$(cmd_get "$change_name" "workflow")
678
- if [ "$workflow" = "full" ]; then
679
- local design_doc
680
- design_doc=$(cmd_get "$change_name" "design_doc")
681
- if [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -f "$design_doc" ]; then
682
- check_pass "design_doc=${design_doc} (file exists)"
683
- else
684
- check_fail "design_doc=${design_doc} (expected: non-null and file exists)"
685
- fi
686
- else
687
- check_pass "workflow=${workflow} (design_doc not required)"
688
- fi
689
- check_nonempty "proposal.md" "$proposal_file"
690
- check_nonempty "tasks.md" "$tasks_file"
691
- ;;
692
- verify)
693
- check_pass ".comet.yaml exists"
694
- check_yaml_is "phase" "verify" "$change_name"
695
- # Check verify_result is pending or null
696
- local verify_result
697
- verify_result=$(cmd_get "$change_name" "verify_result")
698
- if [ "$verify_result" = "pending" ] || [ -z "$verify_result" ] || [ "$verify_result" = "null" ]; then
699
- check_pass "verify_result=${verify_result} (expected: pending or null)"
700
- else
701
- check_fail "verify_result=${verify_result} (expected: pending or null)"
702
- fi
703
- ;;
704
- archive)
705
- check_pass ".comet.yaml exists"
706
- check_yaml_is "phase" "archive" "$change_name"
707
- check_yaml_is "verify_result" "pass" "$change_name"
708
- # Check archived is NOT true
709
- local archived
710
- archived=$(cmd_get "$change_name" "archived")
711
- if [ "$archived" != "true" ]; then
712
- check_pass "archived=${archived} (expected: not true)"
713
- else
714
- check_fail "archived=${archived} (expected: not true)"
715
- fi
716
- ;;
717
- *)
718
- red "ERROR: Unknown phase for check: $phase"
719
- exit 1
720
- ;;
721
- esac
722
-
723
- echo ""
724
- if [ "$CHECK_BLOCK" -eq 1 ]; then
725
- red "BLOCKED — fix failing checks before proceeding"
726
- exit 1
727
- else
728
- green "ALL CHECKS PASSED — ready to proceed"
729
- exit 0
730
- fi
731
- }
732
-
733
- # --- Recovery context for compaction resume ---
734
-
735
- field_status() {
736
- # Args: field_name value [file_path]
737
- # Prints: "field_name: DONE (value)" or "field_name: PENDING"
738
- local field="$1"
739
- local value="$2"
740
- local file_path="${3:-}"
741
-
742
- if [ -z "$value" ] || [ "$value" = "null" ]; then
743
- echo " - ${field}: PENDING"
744
- elif [ -n "$file_path" ] && [ ! -f "$file_path" ]; then
745
- echo " - ${field}: BROKEN (path ${value} does not exist)"
746
- else
747
- echo " - ${field}: DONE (${value})"
748
- fi
749
- }
750
-
751
- cmd_recover() {
752
- local change_name="$1"
753
-
754
- validate_change_name "$change_name"
755
-
756
- local change_dir="openspec/changes/$change_name"
757
- local yaml_file="$change_dir/.comet.yaml"
758
-
759
- if [ ! -f "$yaml_file" ]; then
760
- red "ERROR: .comet.yaml not found at $yaml_file"
761
- exit 1
762
- fi
763
-
764
- local phase workflow
765
- phase=$(cmd_get "$change_name" "phase")
766
- workflow=$(cmd_get "$change_name" "workflow")
767
-
768
- echo "=== Recovery Context: ${change_name} ==="
769
- echo "Phase: ${phase}"
770
- echo "Workflow: ${workflow}"
771
- echo ""
772
-
773
- # Read all relevant fields
774
- local design_doc plan verify_result verify_mode verification_report
775
- local branch_status handoff_context handoff_hash isolation build_mode build_pause subagent_dispatch tdd_mode direct_override
776
- design_doc=$(cmd_get "$change_name" "design_doc")
777
- plan=$(cmd_get "$change_name" "plan")
778
- verify_result=$(cmd_get "$change_name" "verify_result")
779
- verify_mode=$(cmd_get "$change_name" "verify_mode")
780
- verification_report=$(cmd_get "$change_name" "verification_report")
781
- branch_status=$(cmd_get "$change_name" "branch_status")
782
- handoff_context=$(cmd_get "$change_name" "handoff_context")
783
- handoff_hash=$(cmd_get "$change_name" "handoff_hash")
784
- isolation=$(cmd_get "$change_name" "isolation")
785
- build_mode=$(cmd_get "$change_name" "build_mode")
786
- build_pause=$(cmd_get "$change_name" "build_pause" 2>/dev/null || true)
787
- subagent_dispatch=$(cmd_get "$change_name" "subagent_dispatch" 2>/dev/null || true)
788
- tdd_mode=$(cmd_get "$change_name" "tdd_mode" 2>/dev/null || true)
789
- direct_override=$(cmd_get "$change_name" "direct_override" 2>/dev/null || true)
790
-
791
- echo "State fields:"
792
-
793
- # Phase-specific field reporting
794
- case "$phase" in
795
- open)
796
- echo " Artifacts:"
797
- local artifacts_done=0
798
- for f in proposal.md design.md tasks.md; do
799
- if file_nonempty "$change_dir/$f"; then
800
- echo " - ${f}: DONE"
801
- artifacts_done=$((artifacts_done + 1))
802
- else
803
- echo " - ${f}: PENDING"
804
- fi
805
- done
806
- echo ""
807
- if [ "$artifacts_done" -eq 3 ]; then
808
- echo "Recovery action: All artifacts complete. Run /comet-open user confirmation, then guard to transition."
809
- elif [ "$artifacts_done" -eq 0 ]; then
810
- echo "Recovery action: No artifacts created yet. Start from /comet-open Step 1 (explore and clarify)."
811
- else
812
- echo "Recovery action: Some artifacts incomplete. Resume /comet-open from the first missing artifact."
813
- fi
814
- ;;
815
- design)
816
- echo " Artifacts:"
817
- for f in proposal.md design.md tasks.md; do
818
- if file_nonempty "$change_dir/$f"; then
819
- echo " - ${f}: DONE"
820
- else
821
- echo " - ${f}: MISSING (unexpected in design phase)"
822
- fi
823
- done
824
- echo ""
825
- echo " Design progress:"
826
- field_status "handoff_context" "$handoff_context" "$handoff_context"
827
- field_status "handoff_hash" "$handoff_hash"
828
- field_status "design_doc" "$design_doc" "$design_doc"
829
- echo ""
830
- if [ -n "$design_doc" ] && [ "$design_doc" != "null" ] && [ -f "$design_doc" ]; then
831
- echo "Recovery action: Design Doc already created and linked. Run guard to transition to build."
832
- elif [ -n "$handoff_context" ] && [ "$handoff_context" != "null" ] && [ -f "$handoff_context" ]; then
833
- echo "Recovery action: Handoff generated but Design Doc not yet created. Resume from brainstorming confirmation (Step 1c)."
834
- else
835
- echo "Recovery action: No handoff generated yet. Start from Step 1a (generate handoff package)."
836
- fi
837
- ;;
838
- build)
839
- echo " Build decisions:"
840
- field_status "isolation" "$isolation"
841
- field_status "build_mode" "$build_mode"
842
- field_status "build_pause" "$build_pause"
843
- field_status "tdd_mode" "$tdd_mode"
844
- if [ "$build_mode" = "subagent-driven-development" ] || { [ -n "$subagent_dispatch" ] && [ "$subagent_dispatch" != "null" ]; }; then
845
- field_status "subagent_dispatch" "$subagent_dispatch"
846
- fi
847
- if [ "$build_mode" = "direct" ] && [ "$workflow" != "hotfix" ] && [ "$workflow" != "tweak" ]; then
848
- field_status "direct_override" "$direct_override"
849
- fi
850
- echo ""
851
- echo " Plan:"
852
- field_status "plan" "$plan" "$plan"
853
- echo ""
854
- # Count completed vs pending tasks
855
- local tasks_file="$change_dir/tasks.md"
856
- local total=0 done=0 pending=0
857
- local plan_total=0 plan_done=0 plan_pending=0
858
- if [ -f "$tasks_file" ]; then
859
- total=$(grep -c '^[[:space:]]*- \[' "$tasks_file" 2>/dev/null || true)
860
- done=$(grep -c '^[[:space:]]*- \[x\]' "$tasks_file" 2>/dev/null || true)
861
- total="${total:-0}"
862
- done="${done:-0}"
863
- pending=$((total - done))
864
- echo " Tasks: ${done}/${total} done, ${pending} pending"
865
- else
866
- echo " Tasks: tasks.md MISSING"
867
- fi
868
- if [ -n "$plan" ] && [ "$plan" != "null" ] && [ -f "$plan" ]; then
869
- plan_total=$(grep -c '^[[:space:]]*- \[' "$plan" 2>/dev/null || true)
870
- plan_done=$(grep -c '^[[:space:]]*- \[x\]' "$plan" 2>/dev/null || true)
871
- plan_total="${plan_total:-0}"
872
- plan_done="${plan_done:-0}"
873
- plan_pending=$((plan_total - plan_done))
874
- if [ "$plan_total" -gt 0 ]; then
875
- echo " Plan tasks: ${plan_done}/${plan_total} done, ${plan_pending} pending"
876
- fi
877
- fi
878
- echo ""
879
- if [ "$build_pause" = "plan-ready" ] && [ -n "$plan" ] && [ "$plan" != "null" ] && [ -f "$plan" ] && { [ "$isolation" = "null" ] || [ -z "$isolation" ] || [ "$build_mode" = "null" ] || [ -z "$build_mode" ]; }; then
880
- echo "Recovery action: Plan-ready pause detected. Ask the user whether to continue, then choose isolation and build mode without regenerating the plan."
881
- elif [ "$build_pause" = "plan-ready" ] && { [ -z "$plan" ] || [ "$plan" = "null" ] || [ ! -f "$plan" ]; }; then
882
- echo "Recovery action: Plan-ready pause is recorded, but the plan file is missing. Restore the plan file or rerun writing-plans before choosing execution."
883
- elif [ "$build_pause" = "plan-ready" ]; then
884
- if [ "$build_mode" = "subagent-driven-development" ] && { [ "$pending" -gt 0 ] || [ "$plan_pending" -gt 0 ]; }; then
885
- if [ "$subagent_dispatch" = "confirmed" ]; then
886
- echo "Recovery action: Plan-ready pause is stale because build decisions are already selected. Clear build_pause to null, then inspect the first unchecked task (OpenSpec or plan additions) against recent git history/diff. If implemented, check it off; otherwise dispatch a real background subagent. Do not execute the pending task directly in the main window."
887
- else
888
- echo "Recovery action: Plan-ready pause is stale and subagent dispatch is not confirmed. Confirm a real background subagent/Task/multi-agent dispatcher and set subagent_dispatch to confirmed, or set build_mode to executing-plans before continuing."
889
- fi
890
- elif [ "$pending" -gt 0 ] || [ "$plan_pending" -gt 0 ]; then
891
- echo "Recovery action: Plan-ready pause is stale because build decisions are already selected. Clear build_pause to null, then continue from the first unchecked task."
892
- else
893
- echo "Recovery action: Plan-ready pause is stale and all tasks are done. Clear build_pause to null, then run guard to transition to verify."
894
- fi
895
- elif [ "$isolation" = "null" ] || [ -z "$isolation" ]; then
896
- echo "Recovery action: Isolation not selected. Use the current platform's user confirmation mechanism to ask user for branch/worktree choice."
897
- elif [ "$build_mode" = "null" ] || [ -z "$build_mode" ]; then
898
- echo "Recovery action: Build mode not selected. Use the current platform's user confirmation mechanism to ask user for execution method."
899
- elif [ -z "$tdd_mode" ] || [ "$tdd_mode" = "null" ]; then
900
- echo "Recovery action: TDD mode not selected. Use the current platform's user confirmation mechanism to ask user for tdd or direct."
901
- elif [ ! -f "$tasks_file" ]; then
902
- echo "Recovery action: tasks.md missing. Verify change directory integrity."
903
- elif [ "$pending" -gt 0 ]; then
904
- if [ "$build_mode" = "subagent-driven-development" ]; then
905
- if [ "$subagent_dispatch" = "confirmed" ]; then
906
- echo "Recovery action: Read tasks.md and the Superpowers plan (which may include additions beyond OpenSpec), then inspect the first unchecked task against recent git history/diff. If implemented, check it off; otherwise dispatch a real background subagent. Do not execute the pending task directly in the main window."
907
- else
908
- echo "Recovery action: Subagent dispatch is not confirmed. Confirm a real background subagent/Task/multi-agent dispatcher and set subagent_dispatch to confirmed, or set build_mode to executing-plans before continuing."
909
- fi
910
- else
911
- echo "Recovery action: Read tasks.md and continue from first unchecked task."
912
- fi
913
- elif [ "$plan_pending" -gt 0 ]; then
914
- if [ "$build_mode" = "subagent-driven-development" ]; then
915
- if [ "$subagent_dispatch" = "confirmed" ]; then
916
- echo "Recovery action: Read the Superpowers plan, then inspect the first unchecked Superpowers plan task against recent git history/diff. If implemented, check it off; otherwise dispatch a real background subagent. Do not execute the pending task directly in the main window."
917
- else
918
- echo "Recovery action: Subagent dispatch is not confirmed. Confirm a real background subagent/Task/multi-agent dispatcher and set subagent_dispatch to confirmed, or set build_mode to executing-plans before continuing."
919
- fi
920
- else
921
- echo "Recovery action: Read the Superpowers plan and continue from the first unchecked plan task."
922
- fi
923
- else
924
- echo "Recovery action: All tasks done. Run guard to transition to verify."
925
- fi
926
- ;;
927
- verify)
928
- echo " Verification:"
929
- field_status "verify_result" "$verify_result"
930
- field_status "verify_mode" "$verify_mode"
931
- field_status "verification_report" "$verification_report" "$verification_report"
932
- field_status "branch_status" "$branch_status"
933
- echo ""
934
- if [ "$verify_result" = "pass" ] && [ "$branch_status" = "handled" ]; then
935
- echo "Recovery action: Verification complete. Run guard to transition to archive."
936
- elif [ "$verify_result" = "pass" ]; then
937
- echo "Recovery action: Verification passed but branch not yet handled. Complete branch handling and set branch_status to handled."
938
- elif [ "$verify_result" = "fail" ]; then
939
- echo "Recovery action: Verification failed and rolled back to build. Resume from /comet-build."
940
- else
941
- echo "Recovery action: Verification not yet started or in progress. Run scale assessment then verify."
942
- fi
943
- ;;
944
- archive)
945
- echo " Archive:"
946
- field_status "verify_result" "$verify_result"
947
- field_status "archived" "$(cmd_get "$change_name" "archived")"
948
- echo ""
949
- echo "Recovery action: Run /comet-archive to complete archiving."
950
- ;;
951
- *)
952
- red "ERROR: Unknown phase: $phase"
953
- exit 1
954
- ;;
955
- esac
956
-
957
- echo ""
958
- echo "=== End Recovery Context ==="
959
- }
960
-
961
- cmd_scale() {
962
- local change_name="$1"
963
-
964
- validate_change_name "$change_name"
965
-
966
- local change_dir="openspec/changes/$change_name"
967
- local yaml_file="$change_dir/.comet.yaml"
968
-
969
- # Verify .comet.yaml exists
970
- if [ ! -f "$yaml_file" ]; then
971
- red "ERROR: .comet.yaml not found at $yaml_file"
972
- exit 1
973
- fi
974
-
975
- # Read metrics
976
- # 1. Task count: count lines matching `- [` in tasks.md
977
- local tasks_file="$change_dir/tasks.md"
978
- local task_count=0
979
- if [ -f "$tasks_file" ]; then
980
- task_count=$(grep -c '^\- \[' "$tasks_file" 2>/dev/null || echo "0")
981
- fi
982
-
983
- # 2. Delta spec count: count files named spec.md under specs/*/spec.md
984
- local delta_spec_count=0
985
- if [ -d "$change_dir/specs" ]; then
986
- delta_spec_count=$(find "$change_dir/specs" -name "spec.md" -type f 2>/dev/null | wc -l | tr -d ' ')
987
- fi
988
-
989
- # 3. Changed files: prefer plan base-ref, then .comet.yaml base_ref, fall back to worktree diff
990
- local changed_files=0
991
- if git rev-parse --git-dir > /dev/null 2>&1; then
992
- local plan_file base_ref=""
993
- plan_file=$(cmd_get "$change_name" "plan" 2>/dev/null || true)
994
- if [ -n "$plan_file" ] && [ "$plan_file" != "null" ] && [ -f "$plan_file" ]; then
995
- base_ref=$(grep '^base-ref:' "$plan_file" 2>/dev/null | head -1 | sed 's/^base-ref: *//' || true)
996
- fi
997
- # Fallback to base_ref stored in .comet.yaml (set during init)
998
- if [ -z "$base_ref" ] || [ "$base_ref" = "null" ]; then
999
- base_ref=$(cmd_get "$change_name" "base_ref" 2>/dev/null || true)
1000
- fi
1001
-
1002
- if [ -n "${base_ref:-}" ] && [ "$base_ref" != "null" ] && git rev-parse --verify "$base_ref" >/dev/null 2>&1; then
1003
- changed_files=$(git diff --name-only "$base_ref"...HEAD 2>/dev/null | wc -l | tr -d ' ')
1004
- else
1005
- changed_files=$(git diff --name-only HEAD 2>/dev/null | wc -l | tr -d ' ')
1006
- fi
1007
- fi
1008
-
1009
- # Decision rules
1010
- local result="light"
1011
- if [ "$task_count" -gt 3 ] || [ "$delta_spec_count" -gt 1 ] || [ "$changed_files" -gt 4 ]; then
1012
- result="full"
1013
- fi
1014
-
1015
- # Output assessment to stderr
1016
- echo "=== Scale Assessment: $change_name ===" >&2
1017
- echo " Tasks: $task_count (threshold: 3)" >&2
1018
- echo " Delta specs: $delta_spec_count capabilities (threshold: 1)" >&2
1019
- echo " Changed files: $changed_files (threshold: 4)" >&2
1020
- echo " → Result: $result" >&2
1021
-
1022
- # Update verify_mode in .comet.yaml
1023
- replace_yaml_field "$yaml_file" "verify_mode" "$result"
1024
-
1025
- green "[SCALE] verify_mode=$result"
1026
- }
1027
-
1028
- cmd_task_checkoff() {
1029
- local task_file="$1"
1030
- local task_text="$2"
1031
-
1032
- validate_path_field "$task_file" "task file"
1033
-
1034
- if [ -z "$task_text" ]; then
1035
- red "ERROR: Task text cannot be empty" >&2
1036
- exit 1
1037
- fi
1038
-
1039
- if [ ! -f "$task_file" ]; then
1040
- red "ERROR: Task file not found: $task_file" >&2
1041
- exit 1
1042
- fi
1043
-
1044
- local counts
1045
- counts=$(TASK_TEXT="$task_text" awk '
1046
- BEGIN {
1047
- task = ENVIRON["TASK_TEXT"]
1048
- }
1049
- {
1050
- sub(/\r$/, "")
1051
- if ($0 == "- [ ] " task || $0 == "- [x] " task || $0 == "- [X] " task) {
1052
- total++
1053
- }
1054
- if ($0 == "- [x] " task || $0 == "- [X] " task) {
1055
- checked++
1056
- }
1057
- }
1058
- END {
1059
- printf "%d %d\n", total + 0, checked + 0
1060
- }
1061
- ' "$task_file")
1062
-
1063
- local total="${counts%% *}"
1064
- local checked="${counts##* }"
1065
-
1066
- if [ "$total" -ne 1 ]; then
1067
- red "ERROR: task text must appear exactly once in $task_file (found $total): $task_text" >&2
1068
- exit 1
1069
- fi
1070
-
1071
- if [ "$checked" -ne 1 ]; then
1072
- red "ERROR: task is not checked in $task_file: $task_text" >&2
1073
- exit 1
1074
- fi
1075
-
1076
- echo "TASK_CHECKOFF: PASS"
1077
- echo "FILE: $task_file"
1078
- echo "TASK: $task_text"
1079
- }
1080
-
1081
- # Resolve the next workflow step after a guard --apply phase advance.
1082
- # Reads the (already advanced) phase, workflow, and auto_transition, then emits
1083
- # a deterministic next-step contract so skills don't hardcode the next skill name.
1084
- #
1085
- # Output contract (stdout):
1086
- # NEXT: auto|manual|done
1087
- # SKILL: <skill-name> (omitted when NEXT=done)
1088
- # HINT: <message> (only when NEXT=manual)
1089
- cmd_next() {
1090
- local change_name="$1"
1091
- validate_change_name "$change_name"
1092
-
1093
- local change_dir="openspec/changes/$change_name"
1094
- local yaml_file="$change_dir/.comet.yaml"
1095
- if [ ! -f "$yaml_file" ]; then
1096
- red "ERROR: .comet.yaml not found at $yaml_file" >&2
1097
- exit 1
1098
- fi
1099
-
1100
- local phase workflow auto_transition archived
1101
- phase=$(cmd_get "$change_name" "phase" 2>/dev/null || true)
1102
- workflow=$(cmd_get "$change_name" "workflow" 2>/dev/null || true)
1103
- auto_transition=$(cmd_get "$change_name" "auto_transition" 2>/dev/null || true)
1104
- archived=$(cmd_get "$change_name" "archived" 2>/dev/null || true)
1105
-
1106
- # Change-level auto_transition overrides project-level; fall back to project default
1107
- if [ -z "$auto_transition" ] || [ "$auto_transition" = "null" ]; then
1108
- auto_transition="$(project_auto_transition_default)"
1109
- fi
1110
-
1111
- # Terminal state: archived change has no next step.
1112
- if [ "$archived" = "true" ]; then
1113
- echo "NEXT: done"
1114
- return 0
1115
- fi
1116
-
1117
- # Map the current (post-advance) phase to the skill that owns it.
1118
- local skill=""
1119
- case "$phase" in
1120
- open)
1121
- skill="comet-open"
1122
- ;;
1123
- design)
1124
- skill="comet-design"
1125
- ;;
1126
- build)
1127
- case "$workflow" in
1128
- hotfix) skill="comet-hotfix" ;;
1129
- tweak) skill="comet-tweak" ;;
1130
- *) skill="comet-build" ;;
1131
- esac
1132
- ;;
1133
- verify)
1134
- skill="comet-verify"
1135
- ;;
1136
- archive)
1137
- skill="comet-archive"
1138
- ;;
1139
- *)
1140
- red "ERROR: Cannot resolve next step for '$change_name': unknown phase '${phase:-null}'" >&2
1141
- exit 1
1142
- ;;
1143
- esac
1144
-
1145
- # auto_transition=false pauses the next skill invocation only; phase is already advanced.
1146
- if [ "$auto_transition" = "false" ]; then
1147
- echo "NEXT: manual"
1148
- echo "SKILL: $skill"
1149
- echo "HINT: phase is '$phase'; run /$skill manually to continue"
1150
- else
1151
- echo "NEXT: auto"
1152
- echo "SKILL: $skill"
1153
- fi
1154
- }
1155
-
1156
- # --- Main ---
1157
-
1158
- SUBCOMMAND="${1:-}"
1159
- shift || true
1160
-
1161
- case "$SUBCOMMAND" in
1162
- init)
1163
- if [ $# -lt 2 ]; then
1164
- red "Usage: comet-state.sh init <change-name> <workflow>" >&2
1165
- red "Workflows: full, hotfix, tweak" >&2
1166
- exit 1
1167
- fi
1168
- cmd_init "$@"
1169
- ;;
1170
- get)
1171
- if [ $# -lt 2 ]; then
1172
- red "Usage: comet-state.sh get <change-name> <field>" >&2
1173
- exit 1
1174
- fi
1175
- cmd_get "$@"
1176
- ;;
1177
- set)
1178
- if [ $# -lt 3 ]; then
1179
- red "Usage: comet-state.sh set <change-name> <field> <value>" >&2
1180
- exit 1
1181
- fi
1182
- cmd_set "$@"
1183
- ;;
1184
- transition)
1185
- if [ $# -lt 2 ]; then
1186
- red "Usage: comet-state.sh transition <change-name> <event>" >&2
1187
- red "Events: open-complete, design-complete, build-complete, verify-pass, verify-fail, archive-reopen, archived" >&2
1188
- exit 1
1189
- fi
1190
- cmd_transition "$@"
1191
- ;;
1192
- check)
1193
- if [ $# -lt 2 ]; then
1194
- red "Usage: comet-state.sh check <change-name> <phase> [--recover]" >&2
1195
- red "Phases: open, design, build, verify, archive" >&2
1196
- exit 1
1197
- fi
1198
- # Detect --recover flag (3rd argument)
1199
- if [ "${3:-}" = "--recover" ]; then
1200
- cmd_recover "$1"
1201
- else
1202
- cmd_check "$@"
1203
- fi
1204
- ;;
1205
- scale)
1206
- if [ $# -lt 1 ]; then
1207
- red "Usage: comet-state.sh scale <change-name>" >&2
1208
- exit 1
1209
- fi
1210
- cmd_scale "$@"
1211
- ;;
1212
- task-checkoff)
1213
- if [ $# -lt 2 ]; then
1214
- red "Usage: comet-state.sh task-checkoff <file> <task-text>" >&2
1215
- exit 1
1216
- fi
1217
- cmd_task_checkoff "$@"
1218
- ;;
1219
- next)
1220
- if [ $# -lt 1 ]; then
1221
- red "Usage: comet-state.sh next <change-name>" >&2
1222
- exit 1
1223
- fi
1224
- cmd_next "$@"
1225
- ;;
1226
- *)
1227
- red "Unknown subcommand: $SUBCOMMAND" >&2
1228
- echo "" >&2
1229
- echo "Usage: comet-state.sh <subcommand> <change-name> [args...]" >&2
1230
- echo "" >&2
1231
- echo "Subcommands:" >&2
1232
- echo " init <change-name> <workflow> — Initialize .comet.yaml with workflow defaults" >&2
1233
- echo " get <change-name> <field> — Read a field value from .comet.yaml" >&2
1234
- echo " set <change-name> <field> <val> — Update a field value in .comet.yaml" >&2
1235
- echo " transition <change-name> <event> — Apply a validated state transition" >&2
1236
- echo " check <change-name> <phase> — Verify entry requirements for a phase" >&2
1237
- echo " scale <change-name> — Assess and set verification mode based on metrics" >&2
1238
- echo " task-checkoff <file> <task-text> — Verify one unique task is checked" >&2
1239
- echo " next <change-name> — Resolve the next workflow step (auto/manual/done)" >&2
1240
- echo "" >&2
1241
- echo "Workflows: full, hotfix, tweak" >&2
1242
- echo "Phases for check: open, design, build, verify, archive" >&2
1243
- exit 1
1244
- ;;
1245
- esac