@kynetic-ai/spec 0.1.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/README.md +250 -17
  2. package/dist/acp/client.d.ts +18 -4
  3. package/dist/acp/client.d.ts.map +1 -1
  4. package/dist/acp/client.js +44 -26
  5. package/dist/acp/client.js.map +1 -1
  6. package/dist/acp/framing.d.ts +2 -2
  7. package/dist/acp/framing.d.ts.map +1 -1
  8. package/dist/acp/framing.js +37 -29
  9. package/dist/acp/framing.js.map +1 -1
  10. package/dist/acp/index.d.ts +6 -7
  11. package/dist/acp/index.d.ts.map +1 -1
  12. package/dist/acp/index.js +3 -3
  13. package/dist/acp/index.js.map +1 -1
  14. package/dist/acp/types.d.ts +5 -5
  15. package/dist/acp/types.d.ts.map +1 -1
  16. package/dist/acp/types.js +18 -18
  17. package/dist/acp/types.js.map +1 -1
  18. package/dist/agents/adapters.d.ts.map +1 -1
  19. package/dist/agents/adapters.js +24 -13
  20. package/dist/agents/adapters.js.map +1 -1
  21. package/dist/agents/index.d.ts +2 -2
  22. package/dist/agents/index.js +2 -2
  23. package/dist/agents/spawner.d.ts +4 -4
  24. package/dist/agents/spawner.d.ts.map +1 -1
  25. package/dist/agents/spawner.js +6 -6
  26. package/dist/agents/spawner.js.map +1 -1
  27. package/dist/cli/batch-context.d.ts +43 -0
  28. package/dist/cli/batch-context.d.ts.map +1 -0
  29. package/dist/cli/batch-context.js +93 -0
  30. package/dist/cli/batch-context.js.map +1 -0
  31. package/dist/cli/batch-exec.d.ts +107 -0
  32. package/dist/cli/batch-exec.d.ts.map +1 -0
  33. package/dist/cli/batch-exec.js +706 -0
  34. package/dist/cli/batch-exec.js.map +1 -0
  35. package/dist/cli/batch.d.ts +4 -2
  36. package/dist/cli/batch.d.ts.map +1 -1
  37. package/dist/cli/batch.js +15 -14
  38. package/dist/cli/batch.js.map +1 -1
  39. package/dist/cli/command-annotations.d.ts +23 -0
  40. package/dist/cli/command-annotations.d.ts.map +1 -0
  41. package/dist/cli/command-annotations.js +27 -0
  42. package/dist/cli/command-annotations.js.map +1 -0
  43. package/dist/cli/commands/agents.d.ts +46 -0
  44. package/dist/cli/commands/agents.d.ts.map +1 -0
  45. package/dist/cli/commands/agents.js +377 -0
  46. package/dist/cli/commands/agents.js.map +1 -0
  47. package/dist/cli/commands/batch.d.ts +20 -0
  48. package/dist/cli/commands/batch.d.ts.map +1 -0
  49. package/dist/cli/commands/batch.js +214 -0
  50. package/dist/cli/commands/batch.js.map +1 -0
  51. package/dist/cli/commands/clone-for-testing.d.ts +1 -1
  52. package/dist/cli/commands/clone-for-testing.d.ts.map +1 -1
  53. package/dist/cli/commands/clone-for-testing.js +37 -47
  54. package/dist/cli/commands/clone-for-testing.js.map +1 -1
  55. package/dist/cli/commands/derive.d.ts +1 -1
  56. package/dist/cli/commands/derive.d.ts.map +1 -1
  57. package/dist/cli/commands/derive.js +141 -88
  58. package/dist/cli/commands/derive.js.map +1 -1
  59. package/dist/cli/commands/doctor.d.ts +11 -0
  60. package/dist/cli/commands/doctor.d.ts.map +1 -0
  61. package/dist/cli/commands/doctor.js +152 -0
  62. package/dist/cli/commands/doctor.js.map +1 -0
  63. package/dist/cli/commands/export.d.ts +12 -0
  64. package/dist/cli/commands/export.d.ts.map +1 -0
  65. package/dist/cli/commands/export.js +134 -0
  66. package/dist/cli/commands/export.js.map +1 -0
  67. package/dist/cli/commands/help.d.ts +1 -1
  68. package/dist/cli/commands/help.d.ts.map +1 -1
  69. package/dist/cli/commands/help.js +163 -37
  70. package/dist/cli/commands/help.js.map +1 -1
  71. package/dist/cli/commands/inbox.d.ts +1 -1
  72. package/dist/cli/commands/inbox.d.ts.map +1 -1
  73. package/dist/cli/commands/inbox.js +178 -56
  74. package/dist/cli/commands/inbox.js.map +1 -1
  75. package/dist/cli/commands/index.d.ts +31 -19
  76. package/dist/cli/commands/index.d.ts.map +1 -1
  77. package/dist/cli/commands/index.js +31 -19
  78. package/dist/cli/commands/index.js.map +1 -1
  79. package/dist/cli/commands/init.d.ts +5 -1
  80. package/dist/cli/commands/init.d.ts.map +1 -1
  81. package/dist/cli/commands/init.js +108 -57
  82. package/dist/cli/commands/init.js.map +1 -1
  83. package/dist/cli/commands/item.d.ts +1 -1
  84. package/dist/cli/commands/item.d.ts.map +1 -1
  85. package/dist/cli/commands/item.js +557 -274
  86. package/dist/cli/commands/item.js.map +1 -1
  87. package/dist/cli/commands/link.d.ts +1 -1
  88. package/dist/cli/commands/link.d.ts.map +1 -1
  89. package/dist/cli/commands/link.js +55 -46
  90. package/dist/cli/commands/link.js.map +1 -1
  91. package/dist/cli/commands/log.d.ts +1 -1
  92. package/dist/cli/commands/log.d.ts.map +1 -1
  93. package/dist/cli/commands/log.js +58 -51
  94. package/dist/cli/commands/log.js.map +1 -1
  95. package/dist/cli/commands/merge-driver.d.ts +19 -0
  96. package/dist/cli/commands/merge-driver.d.ts.map +1 -0
  97. package/dist/cli/commands/merge-driver.js +398 -0
  98. package/dist/cli/commands/merge-driver.js.map +1 -0
  99. package/dist/cli/commands/meta.d.ts +1 -1
  100. package/dist/cli/commands/meta.d.ts.map +1 -1
  101. package/dist/cli/commands/meta.js +534 -399
  102. package/dist/cli/commands/meta.js.map +1 -1
  103. package/dist/cli/commands/module.d.ts +1 -1
  104. package/dist/cli/commands/module.d.ts.map +1 -1
  105. package/dist/cli/commands/module.js +30 -25
  106. package/dist/cli/commands/module.js.map +1 -1
  107. package/dist/cli/commands/plan-import.d.ts +11 -0
  108. package/dist/cli/commands/plan-import.d.ts.map +1 -0
  109. package/dist/cli/commands/plan-import.js +547 -0
  110. package/dist/cli/commands/plan-import.js.map +1 -0
  111. package/dist/cli/commands/plan.d.ts +10 -0
  112. package/dist/cli/commands/plan.d.ts.map +1 -0
  113. package/dist/cli/commands/plan.js +421 -0
  114. package/dist/cli/commands/plan.js.map +1 -0
  115. package/dist/cli/commands/ralph.d.ts +1 -1
  116. package/dist/cli/commands/ralph.d.ts.map +1 -1
  117. package/dist/cli/commands/ralph.js +1109 -170
  118. package/dist/cli/commands/ralph.js.map +1 -1
  119. package/dist/cli/commands/refs.d.ts +13 -0
  120. package/dist/cli/commands/refs.d.ts.map +1 -0
  121. package/dist/cli/commands/refs.js +283 -0
  122. package/dist/cli/commands/refs.js.map +1 -0
  123. package/dist/cli/commands/search.d.ts +1 -1
  124. package/dist/cli/commands/search.d.ts.map +1 -1
  125. package/dist/cli/commands/search.js +199 -37
  126. package/dist/cli/commands/search.js.map +1 -1
  127. package/dist/cli/commands/serve.d.ts +10 -0
  128. package/dist/cli/commands/serve.d.ts.map +1 -0
  129. package/dist/cli/commands/serve.js +491 -0
  130. package/dist/cli/commands/serve.js.map +1 -0
  131. package/dist/cli/commands/session.d.ts +25 -6
  132. package/dist/cli/commands/session.d.ts.map +1 -1
  133. package/dist/cli/commands/session.js +810 -127
  134. package/dist/cli/commands/session.js.map +1 -1
  135. package/dist/cli/commands/setup-seeding.d.ts +81 -0
  136. package/dist/cli/commands/setup-seeding.d.ts.map +1 -0
  137. package/dist/cli/commands/setup-seeding.js +292 -0
  138. package/dist/cli/commands/setup-seeding.js.map +1 -0
  139. package/dist/cli/commands/setup.d.ts +77 -3
  140. package/dist/cli/commands/setup.d.ts.map +1 -1
  141. package/dist/cli/commands/setup.js +1267 -274
  142. package/dist/cli/commands/setup.js.map +1 -1
  143. package/dist/cli/commands/shadow.d.ts +1 -1
  144. package/dist/cli/commands/shadow.d.ts.map +1 -1
  145. package/dist/cli/commands/shadow.js +70 -50
  146. package/dist/cli/commands/shadow.js.map +1 -1
  147. package/dist/cli/commands/skill-crud.d.ts +58 -0
  148. package/dist/cli/commands/skill-crud.d.ts.map +1 -0
  149. package/dist/cli/commands/skill-crud.js +753 -0
  150. package/dist/cli/commands/skill-crud.js.map +1 -0
  151. package/dist/cli/commands/skill-diff.d.ts +27 -0
  152. package/dist/cli/commands/skill-diff.d.ts.map +1 -0
  153. package/dist/cli/commands/skill-diff.js +840 -0
  154. package/dist/cli/commands/skill-diff.js.map +1 -0
  155. package/dist/cli/commands/skill-install.d.ts +56 -0
  156. package/dist/cli/commands/skill-install.d.ts.map +1 -0
  157. package/dist/cli/commands/skill-install.js +509 -0
  158. package/dist/cli/commands/skill-install.js.map +1 -0
  159. package/dist/cli/commands/skill.d.ts +20 -0
  160. package/dist/cli/commands/skill.d.ts.map +1 -0
  161. package/dist/cli/commands/skill.js +36 -0
  162. package/dist/cli/commands/skill.js.map +1 -0
  163. package/dist/cli/commands/task.d.ts +1 -1
  164. package/dist/cli/commands/task.d.ts.map +1 -1
  165. package/dist/cli/commands/task.js +584 -350
  166. package/dist/cli/commands/task.js.map +1 -1
  167. package/dist/cli/commands/tasks.d.ts +26 -1
  168. package/dist/cli/commands/tasks.d.ts.map +1 -1
  169. package/dist/cli/commands/tasks.js +225 -122
  170. package/dist/cli/commands/tasks.js.map +1 -1
  171. package/dist/cli/commands/trait.d.ts +1 -1
  172. package/dist/cli/commands/trait.d.ts.map +1 -1
  173. package/dist/cli/commands/trait.js +166 -101
  174. package/dist/cli/commands/trait.js.map +1 -1
  175. package/dist/cli/commands/triage.d.ts +7 -0
  176. package/dist/cli/commands/triage.d.ts.map +1 -0
  177. package/dist/cli/commands/triage.js +483 -0
  178. package/dist/cli/commands/triage.js.map +1 -0
  179. package/dist/cli/commands/util.d.ts +7 -0
  180. package/dist/cli/commands/util.d.ts.map +1 -0
  181. package/dist/cli/commands/util.js +30 -0
  182. package/dist/cli/commands/util.js.map +1 -0
  183. package/dist/cli/commands/validate.d.ts +1 -1
  184. package/dist/cli/commands/validate.d.ts.map +1 -1
  185. package/dist/cli/commands/validate.js +264 -83
  186. package/dist/cli/commands/validate.js.map +1 -1
  187. package/dist/cli/commands/workflow.d.ts +16 -0
  188. package/dist/cli/commands/workflow.d.ts.map +1 -0
  189. package/dist/cli/commands/workflow.js +851 -0
  190. package/dist/cli/commands/workflow.js.map +1 -0
  191. package/dist/cli/exit-codes.d.ts +7 -0
  192. package/dist/cli/exit-codes.d.ts.map +1 -1
  193. package/dist/cli/exit-codes.js +26 -18
  194. package/dist/cli/exit-codes.js.map +1 -1
  195. package/dist/cli/help/content.d.ts.map +1 -1
  196. package/dist/cli/help/content.js +86 -71
  197. package/dist/cli/help/content.js.map +1 -1
  198. package/dist/cli/index.d.ts +1 -1
  199. package/dist/cli/index.d.ts.map +1 -1
  200. package/dist/cli/index.js +131 -19
  201. package/dist/cli/index.js.map +1 -1
  202. package/dist/cli/introspection.d.ts +6 -2
  203. package/dist/cli/introspection.d.ts.map +1 -1
  204. package/dist/cli/introspection.js +11 -8
  205. package/dist/cli/introspection.js.map +1 -1
  206. package/dist/cli/output.d.ts +64 -4
  207. package/dist/cli/output.d.ts.map +1 -1
  208. package/dist/cli/output.js +237 -85
  209. package/dist/cli/output.js.map +1 -1
  210. package/dist/cli/parse-utils.d.ts +21 -0
  211. package/dist/cli/parse-utils.d.ts.map +1 -0
  212. package/dist/cli/parse-utils.js +32 -0
  213. package/dist/cli/parse-utils.js.map +1 -0
  214. package/dist/cli/pid-utils.d.ts +72 -0
  215. package/dist/cli/pid-utils.d.ts.map +1 -0
  216. package/dist/cli/pid-utils.js +174 -0
  217. package/dist/cli/pid-utils.js.map +1 -0
  218. package/dist/cli/suggest.d.ts.map +1 -1
  219. package/dist/cli/suggest.js +1 -2
  220. package/dist/cli/suggest.js.map +1 -1
  221. package/dist/cli/validators.d.ts +43 -0
  222. package/dist/cli/validators.d.ts.map +1 -0
  223. package/dist/cli/validators.js +84 -0
  224. package/dist/cli/validators.js.map +1 -0
  225. package/dist/daemon/index.ts +52 -0
  226. package/dist/daemon/middleware/project-context.ts +126 -0
  227. package/dist/daemon/pid.ts +179 -0
  228. package/dist/daemon/project-context.ts +343 -0
  229. package/dist/daemon/routes/inbox.ts +164 -0
  230. package/dist/daemon/routes/items.ts +322 -0
  231. package/dist/daemon/routes/meta.ts +118 -0
  232. package/dist/daemon/routes/projects.ts +162 -0
  233. package/dist/daemon/routes/tasks.ts +327 -0
  234. package/dist/daemon/routes/triage.ts +402 -0
  235. package/dist/daemon/routes/validation.ts +248 -0
  236. package/dist/daemon/server.ts +408 -0
  237. package/dist/daemon/watcher.ts +195 -0
  238. package/dist/daemon/websocket/handler.ts +138 -0
  239. package/dist/daemon/websocket/heartbeat.ts +71 -0
  240. package/dist/daemon/websocket/pubsub.ts +125 -0
  241. package/dist/daemon/websocket/types.ts +66 -0
  242. package/dist/export/html.d.ts +19 -0
  243. package/dist/export/html.d.ts.map +1 -0
  244. package/dist/export/html.js +239 -0
  245. package/dist/export/html.js.map +1 -0
  246. package/dist/export/index.d.ts +10 -0
  247. package/dist/export/index.d.ts.map +1 -0
  248. package/dist/export/index.js +10 -0
  249. package/dist/export/index.js.map +1 -0
  250. package/dist/export/json.d.ts +24 -0
  251. package/dist/export/json.d.ts.map +1 -0
  252. package/dist/export/json.js +198 -0
  253. package/dist/export/json.js.map +1 -0
  254. package/dist/export/triage.d.ts +51 -0
  255. package/dist/export/triage.d.ts.map +1 -0
  256. package/dist/export/triage.js +83 -0
  257. package/dist/export/triage.js.map +1 -0
  258. package/dist/export/types.d.ts +122 -0
  259. package/dist/export/types.d.ts.map +1 -0
  260. package/dist/export/types.js +9 -0
  261. package/dist/export/types.js.map +1 -0
  262. package/dist/index.d.ts +2 -2
  263. package/dist/index.js +2 -2
  264. package/dist/lib/claude-plugin-registry.d.ts +66 -0
  265. package/dist/lib/claude-plugin-registry.d.ts.map +1 -0
  266. package/dist/lib/claude-plugin-registry.js +318 -0
  267. package/dist/lib/claude-plugin-registry.js.map +1 -0
  268. package/dist/merge/arrays.d.ts +87 -0
  269. package/dist/merge/arrays.d.ts.map +1 -0
  270. package/dist/merge/arrays.js +164 -0
  271. package/dist/merge/arrays.js.map +1 -0
  272. package/dist/merge/file-type.d.ts +32 -0
  273. package/dist/merge/file-type.d.ts.map +1 -0
  274. package/dist/merge/file-type.js +70 -0
  275. package/dist/merge/file-type.js.map +1 -0
  276. package/dist/merge/index.d.ts +14 -0
  277. package/dist/merge/index.d.ts.map +1 -0
  278. package/dist/merge/index.js +11 -0
  279. package/dist/merge/index.js.map +1 -0
  280. package/dist/merge/objects.d.ts +46 -0
  281. package/dist/merge/objects.d.ts.map +1 -0
  282. package/dist/merge/objects.js +193 -0
  283. package/dist/merge/objects.js.map +1 -0
  284. package/dist/merge/parse.d.ts +23 -0
  285. package/dist/merge/parse.d.ts.map +1 -0
  286. package/dist/merge/parse.js +78 -0
  287. package/dist/merge/parse.js.map +1 -0
  288. package/dist/merge/resolve.d.ts +66 -0
  289. package/dist/merge/resolve.d.ts.map +1 -0
  290. package/dist/merge/resolve.js +189 -0
  291. package/dist/merge/resolve.js.map +1 -0
  292. package/dist/merge/types.d.ts +82 -0
  293. package/dist/merge/types.d.ts.map +1 -0
  294. package/dist/merge/types.js +8 -0
  295. package/dist/merge/types.js.map +1 -0
  296. package/dist/parser/agent-data-sections.d.ts +53 -0
  297. package/dist/parser/agent-data-sections.d.ts.map +1 -0
  298. package/dist/parser/agent-data-sections.js +118 -0
  299. package/dist/parser/agent-data-sections.js.map +1 -0
  300. package/dist/parser/alignment.d.ts +4 -4
  301. package/dist/parser/alignment.d.ts.map +1 -1
  302. package/dist/parser/alignment.js +27 -22
  303. package/dist/parser/alignment.js.map +1 -1
  304. package/dist/parser/assess.d.ts +5 -5
  305. package/dist/parser/assess.d.ts.map +1 -1
  306. package/dist/parser/assess.js +36 -32
  307. package/dist/parser/assess.js.map +1 -1
  308. package/dist/parser/config.d.ts +457 -0
  309. package/dist/parser/config.d.ts.map +1 -0
  310. package/dist/parser/config.js +373 -0
  311. package/dist/parser/config.js.map +1 -0
  312. package/dist/parser/convention-validation.d.ts +1 -1
  313. package/dist/parser/convention-validation.d.ts.map +1 -1
  314. package/dist/parser/convention-validation.js +21 -16
  315. package/dist/parser/convention-validation.js.map +1 -1
  316. package/dist/parser/coverage-cache.d.ts +49 -0
  317. package/dist/parser/coverage-cache.d.ts.map +1 -0
  318. package/dist/parser/coverage-cache.js +123 -0
  319. package/dist/parser/coverage-cache.js.map +1 -0
  320. package/dist/parser/daemon-status.d.ts +37 -0
  321. package/dist/parser/daemon-status.d.ts.map +1 -0
  322. package/dist/parser/daemon-status.js +67 -0
  323. package/dist/parser/daemon-status.js.map +1 -0
  324. package/dist/parser/doctor.d.ts +107 -0
  325. package/dist/parser/doctor.d.ts.map +1 -0
  326. package/dist/parser/doctor.js +366 -0
  327. package/dist/parser/doctor.js.map +1 -0
  328. package/dist/parser/fix.d.ts +1 -1
  329. package/dist/parser/fix.d.ts.map +1 -1
  330. package/dist/parser/fix.js +31 -27
  331. package/dist/parser/fix.js.map +1 -1
  332. package/dist/parser/index.d.ts +16 -11
  333. package/dist/parser/index.d.ts.map +1 -1
  334. package/dist/parser/index.js +16 -11
  335. package/dist/parser/index.js.map +1 -1
  336. package/dist/parser/items.d.ts +8 -2
  337. package/dist/parser/items.d.ts.map +1 -1
  338. package/dist/parser/items.js +71 -35
  339. package/dist/parser/items.js.map +1 -1
  340. package/dist/parser/meta.d.ts +167 -9
  341. package/dist/parser/meta.d.ts.map +1 -1
  342. package/dist/parser/meta.js +379 -46
  343. package/dist/parser/meta.js.map +1 -1
  344. package/dist/parser/plan-document.d.ts +197 -0
  345. package/dist/parser/plan-document.d.ts.map +1 -0
  346. package/dist/parser/plan-document.js +341 -0
  347. package/dist/parser/plan-document.js.map +1 -0
  348. package/dist/parser/plans.d.ts +59 -0
  349. package/dist/parser/plans.d.ts.map +1 -0
  350. package/dist/parser/plans.js +239 -0
  351. package/dist/parser/plans.js.map +1 -0
  352. package/dist/parser/refs.d.ts +22 -9
  353. package/dist/parser/refs.d.ts.map +1 -1
  354. package/dist/parser/refs.js +102 -50
  355. package/dist/parser/refs.js.map +1 -1
  356. package/dist/parser/setup-status.d.ts +71 -0
  357. package/dist/parser/setup-status.d.ts.map +1 -0
  358. package/dist/parser/setup-status.js +269 -0
  359. package/dist/parser/setup-status.js.map +1 -0
  360. package/dist/parser/shadow.d.ts +150 -19
  361. package/dist/parser/shadow.d.ts.map +1 -1
  362. package/dist/parser/shadow.js +548 -187
  363. package/dist/parser/shadow.js.map +1 -1
  364. package/dist/parser/skill-render.d.ts +317 -0
  365. package/dist/parser/skill-render.d.ts.map +1 -0
  366. package/dist/parser/skill-render.js +943 -0
  367. package/dist/parser/skill-render.js.map +1 -0
  368. package/dist/parser/traits.d.ts +3 -3
  369. package/dist/parser/traits.d.ts.map +1 -1
  370. package/dist/parser/traits.js +2 -2
  371. package/dist/parser/traits.js.map +1 -1
  372. package/dist/parser/validate-skills.d.ts +32 -0
  373. package/dist/parser/validate-skills.d.ts.map +1 -0
  374. package/dist/parser/validate-skills.js +202 -0
  375. package/dist/parser/validate-skills.js.map +1 -0
  376. package/dist/parser/validate.d.ts +45 -3
  377. package/dist/parser/validate.d.ts.map +1 -1
  378. package/dist/parser/validate.js +622 -105
  379. package/dist/parser/validate.js.map +1 -1
  380. package/dist/parser/yaml.d.ts +83 -19
  381. package/dist/parser/yaml.d.ts.map +1 -1
  382. package/dist/parser/yaml.js +478 -173
  383. package/dist/parser/yaml.js.map +1 -1
  384. package/dist/ralph/cli-renderer.d.ts +8 -1
  385. package/dist/ralph/cli-renderer.d.ts.map +1 -1
  386. package/dist/ralph/cli-renderer.js +105 -34
  387. package/dist/ralph/cli-renderer.js.map +1 -1
  388. package/dist/ralph/events.d.ts +10 -10
  389. package/dist/ralph/events.d.ts.map +1 -1
  390. package/dist/ralph/events.js +301 -98
  391. package/dist/ralph/events.js.map +1 -1
  392. package/dist/ralph/index.d.ts +5 -2
  393. package/dist/ralph/index.d.ts.map +1 -1
  394. package/dist/ralph/index.js +9 -3
  395. package/dist/ralph/index.js.map +1 -1
  396. package/dist/ralph/loop-errors.d.ts +83 -0
  397. package/dist/ralph/loop-errors.d.ts.map +1 -0
  398. package/dist/ralph/loop-errors.js +150 -0
  399. package/dist/ralph/loop-errors.js.map +1 -0
  400. package/dist/ralph/subagent.d.ts +94 -0
  401. package/dist/ralph/subagent.d.ts.map +1 -0
  402. package/dist/ralph/subagent.js +193 -0
  403. package/dist/ralph/subagent.js.map +1 -0
  404. package/dist/ralph/wrap-up.d.ts +125 -0
  405. package/dist/ralph/wrap-up.d.ts.map +1 -0
  406. package/dist/ralph/wrap-up.js +270 -0
  407. package/dist/ralph/wrap-up.js.map +1 -0
  408. package/dist/schema/batch.d.ts +97 -0
  409. package/dist/schema/batch.d.ts.map +1 -0
  410. package/dist/schema/batch.js +24 -0
  411. package/dist/schema/batch.js.map +1 -0
  412. package/dist/schema/common.d.ts +8 -2
  413. package/dist/schema/common.d.ts.map +1 -1
  414. package/dist/schema/common.js +42 -31
  415. package/dist/schema/common.js.map +1 -1
  416. package/dist/schema/inbox.d.ts +12 -12
  417. package/dist/schema/inbox.js +4 -4
  418. package/dist/schema/inbox.js.map +1 -1
  419. package/dist/schema/index.d.ts +8 -5
  420. package/dist/schema/index.d.ts.map +1 -1
  421. package/dist/schema/index.js +8 -5
  422. package/dist/schema/index.js.map +1 -1
  423. package/dist/schema/meta.d.ts +1454 -27
  424. package/dist/schema/meta.d.ts.map +1 -1
  425. package/dist/schema/meta.js +198 -21
  426. package/dist/schema/meta.js.map +1 -1
  427. package/dist/schema/plan.d.ts +285 -0
  428. package/dist/schema/plan.d.ts.map +1 -0
  429. package/dist/schema/plan.js +81 -0
  430. package/dist/schema/plan.js.map +1 -0
  431. package/dist/schema/spec.d.ts +72 -33
  432. package/dist/schema/spec.d.ts.map +1 -1
  433. package/dist/schema/spec.js +22 -9
  434. package/dist/schema/spec.js.map +1 -1
  435. package/dist/schema/task.d.ts +172 -161
  436. package/dist/schema/task.d.ts.map +1 -1
  437. package/dist/schema/task.js +21 -12
  438. package/dist/schema/task.js.map +1 -1
  439. package/dist/schema/triage.d.ts +266 -0
  440. package/dist/schema/triage.d.ts.map +1 -0
  441. package/dist/schema/triage.js +134 -0
  442. package/dist/schema/triage.js.map +1 -0
  443. package/dist/sessions/index.d.ts +2 -2
  444. package/dist/sessions/index.d.ts.map +1 -1
  445. package/dist/sessions/index.js +3 -3
  446. package/dist/sessions/index.js.map +1 -1
  447. package/dist/sessions/store.d.ts +241 -1
  448. package/dist/sessions/store.d.ts.map +1 -1
  449. package/dist/sessions/store.js +810 -31
  450. package/dist/sessions/store.js.map +1 -1
  451. package/dist/sessions/types.d.ts +10 -10
  452. package/dist/sessions/types.d.ts.map +1 -1
  453. package/dist/sessions/types.js +10 -9
  454. package/dist/sessions/types.js.map +1 -1
  455. package/dist/strings/errors.d.ts +55 -0
  456. package/dist/strings/errors.d.ts.map +1 -1
  457. package/dist/strings/errors.js +138 -106
  458. package/dist/strings/errors.js.map +1 -1
  459. package/dist/strings/guidance.d.ts.map +1 -1
  460. package/dist/strings/guidance.js +16 -16
  461. package/dist/strings/guidance.js.map +1 -1
  462. package/dist/strings/index.d.ts +4 -4
  463. package/dist/strings/index.d.ts.map +1 -1
  464. package/dist/strings/index.js +4 -4
  465. package/dist/strings/index.js.map +1 -1
  466. package/dist/strings/labels.d.ts +4 -0
  467. package/dist/strings/labels.d.ts.map +1 -1
  468. package/dist/strings/labels.js +45 -41
  469. package/dist/strings/labels.js.map +1 -1
  470. package/dist/strings/validation.d.ts.map +1 -1
  471. package/dist/strings/validation.js +71 -71
  472. package/dist/strings/validation.js.map +1 -1
  473. package/dist/triage/actions.d.ts +27 -0
  474. package/dist/triage/actions.d.ts.map +1 -0
  475. package/dist/triage/actions.js +95 -0
  476. package/dist/triage/actions.js.map +1 -0
  477. package/dist/triage/constants.d.ts +6 -0
  478. package/dist/triage/constants.d.ts.map +1 -0
  479. package/dist/triage/constants.js +7 -0
  480. package/dist/triage/constants.js.map +1 -0
  481. package/dist/triage/index.d.ts +3 -0
  482. package/dist/triage/index.d.ts.map +1 -0
  483. package/dist/triage/index.js +3 -0
  484. package/dist/triage/index.js.map +1 -0
  485. package/dist/utils/commit.d.ts +1 -1
  486. package/dist/utils/commit.d.ts.map +1 -1
  487. package/dist/utils/commit.js +28 -26
  488. package/dist/utils/commit.js.map +1 -1
  489. package/dist/utils/git.d.ts +1 -1
  490. package/dist/utils/git.d.ts.map +1 -1
  491. package/dist/utils/git.js +40 -38
  492. package/dist/utils/git.js.map +1 -1
  493. package/dist/utils/grep.js +11 -11
  494. package/dist/utils/grep.js.map +1 -1
  495. package/dist/utils/index.d.ts +7 -7
  496. package/dist/utils/index.d.ts.map +1 -1
  497. package/dist/utils/index.js +4 -4
  498. package/dist/utils/index.js.map +1 -1
  499. package/dist/utils/time.d.ts.map +1 -1
  500. package/dist/utils/time.js +10 -10
  501. package/dist/utils/time.js.map +1 -1
  502. package/package.json +28 -5
  503. package/plugin/.claude-plugin/marketplace.json +17 -0
  504. package/plugin/.claude-plugin/plugin.json +5 -0
  505. package/plugin/plugins/kspec/skills/create-workflow/SKILL.md +235 -0
  506. package/plugin/plugins/kspec/skills/help/SKILL.md +42 -0
  507. package/plugin/plugins/kspec/skills/observations/SKILL.md +143 -0
  508. package/plugin/plugins/kspec/skills/plan/SKILL.md +343 -0
  509. package/plugin/plugins/kspec/skills/reflect/SKILL.md +161 -0
  510. package/plugin/plugins/kspec/skills/review/SKILL.md +193 -0
  511. package/plugin/plugins/kspec/skills/task-work/SKILL.md +303 -0
  512. package/plugin/plugins/kspec/skills/triage/SKILL.md +206 -0
  513. package/plugin/plugins/kspec/skills/triage/docs/automation.md +120 -0
  514. package/plugin/plugins/kspec/skills/triage/docs/inbox.md +144 -0
  515. package/plugin/plugins/kspec/skills/triage/docs/observations.md +85 -0
  516. package/plugin/plugins/kspec/skills/triage-automation/SKILL.md +140 -0
  517. package/plugin/plugins/kspec/skills/triage-inbox/SKILL.md +232 -0
  518. package/plugin/plugins/kspec/skills/writing-specs/SKILL.md +340 -0
  519. package/templates/agents-sections/01-quick-start.md +22 -0
  520. package/templates/agents-sections/02-shadow-branch.md +34 -0
  521. package/templates/agents-sections/03-task-lifecycle.md +48 -0
  522. package/templates/agents-sections/04-pr-workflow.md +17 -0
  523. package/templates/agents-sections/05-commit-convention.md +27 -0
  524. package/templates/agents-sections/06-ralph-loop.md +45 -0
  525. package/templates/hooks/pre-commit +34 -0
  526. package/templates/skills/create-workflow/SKILL.md +228 -0
  527. package/templates/skills/help/SKILL.md +37 -0
  528. package/templates/skills/manifest.yaml +60 -0
  529. package/templates/skills/observations/SKILL.md +137 -0
  530. package/templates/skills/plan/SKILL.md +336 -0
  531. package/templates/skills/reflect/SKILL.md +155 -0
  532. package/templates/skills/review/SKILL.md +186 -0
  533. package/templates/skills/task-work/SKILL.md +296 -0
  534. package/templates/skills/triage/SKILL.md +199 -0
  535. package/templates/skills/triage/docs/automation.md +120 -0
  536. package/templates/skills/triage/docs/inbox.md +144 -0
  537. package/templates/skills/triage/docs/observations.md +85 -0
  538. package/templates/skills/triage-automation/SKILL.md +134 -0
  539. package/templates/skills/triage-inbox/SKILL.md +225 -0
  540. package/templates/skills/writing-specs/SKILL.md +333 -0
@@ -0,0 +1,152 @@
1
+ /**
2
+ * kspec doctor command - unified health check
3
+ *
4
+ * AC: @doctor-command
5
+ */
6
+ import chalk from "chalk";
7
+ import { output, isJsonMode } from "../output.js";
8
+ import { EXIT_CODES } from "../exit-codes.js";
9
+ import { getDoctorReport, } from "../../parser/doctor.js";
10
+ /**
11
+ * Register the doctor command
12
+ */
13
+ export function registerDoctorCommand(program) {
14
+ program
15
+ .command("doctor")
16
+ .description("Check kspec health (shadow branch, setup, daemon)")
17
+ .option("--json", "Output as JSON")
18
+ .action(async () => {
19
+ try {
20
+ const report = await getDoctorReport(process.cwd());
21
+ if (isJsonMode()) {
22
+ // AC: @doctor-command ac-json-output
23
+ output(report);
24
+ }
25
+ else {
26
+ formatDoctorReport(report);
27
+ }
28
+ // AC: @doctor-command ac-exit-zero, ac-exit-one
29
+ // AC: @trait-semantic-exit-codes ac-1, ac-2
30
+ // Exit 0 if healthy (no errors, warnings ok), exit 1 if any errors
31
+ if (report.overall.healthy) {
32
+ process.exit(EXIT_CODES.SUCCESS);
33
+ }
34
+ else {
35
+ process.exit(EXIT_CODES.ERROR);
36
+ }
37
+ }
38
+ catch (err) {
39
+ if (isJsonMode()) {
40
+ // AC: @trait-json-output ac-3
41
+ output({ error: err instanceof Error ? err.message : String(err) });
42
+ }
43
+ else {
44
+ console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
45
+ }
46
+ process.exit(EXIT_CODES.ERROR);
47
+ }
48
+ });
49
+ }
50
+ /**
51
+ * Get color for severity level
52
+ */
53
+ function getSeverityColor(severity) {
54
+ switch (severity) {
55
+ case "ok":
56
+ return chalk.green;
57
+ case "warning":
58
+ return chalk.yellow;
59
+ case "error":
60
+ return chalk.red;
61
+ }
62
+ }
63
+ /**
64
+ * Get icon for severity level
65
+ */
66
+ function getSeverityIcon(severity) {
67
+ switch (severity) {
68
+ case "ok":
69
+ return "✓";
70
+ case "warning":
71
+ return "⚠";
72
+ case "error":
73
+ return "✗";
74
+ }
75
+ }
76
+ /**
77
+ * Format a single check result
78
+ */
79
+ function formatCheck(check) {
80
+ const color = getSeverityColor(check.severity);
81
+ const icon = getSeverityIcon(check.severity);
82
+ console.log(` ${color(icon)} ${check.message}`);
83
+ if (check.guidance) {
84
+ console.log(chalk.gray(` ${check.guidance}`));
85
+ }
86
+ }
87
+ /**
88
+ * Format the doctor report for human-readable output
89
+ */
90
+ function formatDoctorReport(report) {
91
+ console.log(chalk.bold("\n=== kspec doctor ===\n"));
92
+ // Shadow section
93
+ // AC: @doctor-command ac-shadow-healthy, ac-not-initialized
94
+ console.log(chalk.bold.blue("Shadow Branch"));
95
+ if (report.shadow.checks.length === 0) {
96
+ console.log(chalk.gray(" No checks performed"));
97
+ }
98
+ else {
99
+ for (const check of report.shadow.checks) {
100
+ formatCheck(check);
101
+ }
102
+ }
103
+ console.log();
104
+ // Setup section (only if shadow is initialized)
105
+ // AC: @doctor-command ac-setup-agent-hooks, ac-setup-skills-agents-md, ac-partial-init
106
+ if (report.shadow.initialized) {
107
+ console.log(chalk.bold.blue("Setup"));
108
+ if (report.setup.checks.length === 0) {
109
+ console.log(chalk.gray(" No checks performed"));
110
+ }
111
+ else {
112
+ for (const check of report.setup.checks) {
113
+ formatCheck(check);
114
+ }
115
+ }
116
+ console.log();
117
+ // Daemon section
118
+ // AC: @doctor-command ac-daemon-running, ac-daemon-not-running, ac-daemon-unreachable
119
+ console.log(chalk.bold.blue("Daemon"));
120
+ if (report.daemon.checks.length === 0) {
121
+ console.log(chalk.gray(" No checks performed"));
122
+ }
123
+ else {
124
+ for (const check of report.daemon.checks) {
125
+ formatCheck(check);
126
+ }
127
+ }
128
+ console.log();
129
+ }
130
+ // Overall verdict
131
+ // AC: @doctor-command ac-overall-verdict
132
+ console.log(chalk.bold("─".repeat(40)));
133
+ if (report.overall.healthy) {
134
+ console.log(chalk.green.bold("✓ Healthy"));
135
+ if (report.overall.warningCount > 0) {
136
+ console.log(chalk.yellow(` ${report.overall.warningCount} warning(s)`));
137
+ }
138
+ }
139
+ else {
140
+ console.log(chalk.red.bold("✗ Issues found"));
141
+ const parts = [];
142
+ if (report.overall.errorCount > 0) {
143
+ parts.push(chalk.red(`${report.overall.errorCount} error(s)`));
144
+ }
145
+ if (report.overall.warningCount > 0) {
146
+ parts.push(chalk.yellow(`${report.overall.warningCount} warning(s)`));
147
+ }
148
+ console.log(` ${parts.join(", ")}`);
149
+ }
150
+ console.log();
151
+ }
152
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Export Command
3
+ *
4
+ * Exports kspec data to JSON or HTML format for static site hosting.
5
+ * AC: @gh-pages-export ac-1, ac-2, ac-3, ac-4, ac-5, ac-6, ac-7
6
+ */
7
+ import type { Command } from "commander";
8
+ /**
9
+ * Register the export command.
10
+ */
11
+ export declare function registerExportCommand(program: Command): void;
12
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4I5D"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Export Command
3
+ *
4
+ * Exports kspec data to JSON or HTML format for static site hosting.
5
+ * AC: @gh-pages-export ac-1, ac-2, ac-3, ac-4, ac-5, ac-6, ac-7
6
+ */
7
+ import * as fs from "node:fs/promises";
8
+ import chalk from "chalk";
9
+ import { calculateExportStats, formatBytes, generateHtmlExport, generateJsonSnapshot, } from "../../export/index.js";
10
+ import { EXIT_CODES } from "../exit-codes.js";
11
+ import { error, info, output, success } from "../output.js";
12
+ /**
13
+ * Register the export command.
14
+ */
15
+ export function registerExportCommand(program) {
16
+ program
17
+ .command("export")
18
+ .description("Export kspec data to JSON or HTML format")
19
+ .requiredOption("--format <format>", "Output format (json or html)", "json")
20
+ .option("-o, --output <path>", "Output file path (defaults to stdout for JSON)")
21
+ .option("--include-validation", "Include validation results in the export", false)
22
+ .option("--dry-run", "Show what would be exported without writing files", false)
23
+ .action(async (options) => {
24
+ try {
25
+ // Validate format
26
+ // AC: @gh-pages-export ac-1, ac-6
27
+ if (options.format !== "json" && options.format !== "html") {
28
+ error(`Invalid format: ${options.format}. Must be 'json' or 'html'.`);
29
+ process.exit(EXIT_CODES.USAGE_ERROR);
30
+ }
31
+ // HTML format requires output file
32
+ // AC: @gh-pages-export ac-6
33
+ if (options.format === "html" && !options.output) {
34
+ error("HTML format requires --output <path>");
35
+ process.exit(EXIT_CODES.USAGE_ERROR);
36
+ }
37
+ // Only show progress when not outputting JSON to stdout (keep stdout clean for piping)
38
+ const jsonToStdout = options.format === "json" && !options.output && !options.dryRun;
39
+ if (!jsonToStdout) {
40
+ info("Generating snapshot...");
41
+ }
42
+ // Generate the snapshot
43
+ // AC: @gh-pages-export ac-1, ac-2, ac-3, ac-4, ac-5
44
+ const snapshot = await generateJsonSnapshot(options.includeValidation);
45
+ // AC: @trait-dry-run ac-1, ac-2, ac-3 - Show preview without writing
46
+ if (options.dryRun) {
47
+ const stats = calculateExportStats(snapshot);
48
+ // AC: @trait-dry-run ac-3 - Clear indication this is a preview
49
+ // AC: @gh-pages-export ac-7
50
+ const dryRunOutput = {
51
+ dry_run: true,
52
+ format: options.format,
53
+ output: options.output || "(stdout)",
54
+ stats: {
55
+ tasks: stats.taskCount,
56
+ items: stats.itemCount,
57
+ inbox: stats.inboxCount,
58
+ observations: stats.observationCount,
59
+ agents: stats.agentCount,
60
+ workflows: stats.workflowCount,
61
+ conventions: stats.conventionCount,
62
+ estimated_size: formatBytes(stats.estimatedSizeBytes),
63
+ },
64
+ validation_included: options.includeValidation,
65
+ ...(options.includeValidation && snapshot.validation
66
+ ? {
67
+ validation_summary: {
68
+ valid: snapshot.validation.valid,
69
+ errors: snapshot.validation.errorCount,
70
+ warnings: snapshot.validation.warningCount,
71
+ },
72
+ }
73
+ : {}),
74
+ };
75
+ output(dryRunOutput, () => {
76
+ console.log(chalk.cyan("\n=== Dry Run - No files will be written ===\n"));
77
+ console.log(chalk.gray("Format:"), options.format);
78
+ console.log(chalk.gray("Output:"), options.output || "(stdout)");
79
+ console.log();
80
+ console.log(chalk.gray("─".repeat(40)));
81
+ console.log(chalk.bold("Export Statistics:"));
82
+ console.log(chalk.gray("─".repeat(40)));
83
+ console.log(` Tasks: ${stats.taskCount}`);
84
+ console.log(` Items: ${stats.itemCount}`);
85
+ console.log(` Inbox: ${stats.inboxCount}`);
86
+ console.log(` Observations: ${stats.observationCount}`);
87
+ console.log(` Agents: ${stats.agentCount}`);
88
+ console.log(` Workflows: ${stats.workflowCount}`);
89
+ console.log(` Conventions: ${stats.conventionCount}`);
90
+ console.log();
91
+ console.log(` Estimated size: ${chalk.cyan(formatBytes(stats.estimatedSizeBytes))}`);
92
+ if (options.includeValidation && snapshot.validation) {
93
+ console.log();
94
+ console.log(chalk.gray("─".repeat(40)));
95
+ console.log(chalk.bold("Validation:"));
96
+ console.log(chalk.gray("─".repeat(40)));
97
+ const validIcon = snapshot.validation.valid
98
+ ? chalk.green("✓")
99
+ : chalk.red("✗");
100
+ console.log(` Status: ${validIcon} ${snapshot.validation.valid ? "Valid" : "Invalid"}`);
101
+ console.log(` Errors: ${snapshot.validation.errorCount}`);
102
+ console.log(` Warnings: ${snapshot.validation.warningCount}`);
103
+ }
104
+ console.log();
105
+ });
106
+ return;
107
+ }
108
+ // Generate output based on format
109
+ let content;
110
+ if (options.format === "json") {
111
+ // AC: @gh-pages-export ac-1
112
+ content = JSON.stringify(snapshot, null, 2);
113
+ }
114
+ else {
115
+ // AC: @gh-pages-export ac-6
116
+ content = generateHtmlExport(snapshot);
117
+ }
118
+ // Write or output
119
+ if (options.output) {
120
+ await fs.writeFile(options.output, content, "utf-8");
121
+ success(`Exported to ${options.output}`);
122
+ }
123
+ else {
124
+ // JSON to stdout (no success message to keep output clean)
125
+ console.log(content);
126
+ }
127
+ }
128
+ catch (err) {
129
+ error("Export failed", err);
130
+ process.exit(EXIT_CODES.ERROR);
131
+ }
132
+ });
133
+ }
134
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Command } from 'commander';
1
+ import type { Command } from "commander";
2
2
  /**
3
3
  * Register the help command
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoNpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB1D"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkVzC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8D1D"}
@@ -1,9 +1,10 @@
1
- import chalk from 'chalk';
2
- import { program } from '../index.js';
3
- import { extractCommandTree, findCommand, flattenCommandTree, formatCommandUsage, } from '../introspection.js';
4
- import { helpContent } from '../help/content.js';
5
- import { output } from '../output.js';
6
- import { EXIT_CODES } from '../exit-codes.js';
1
+ // AC: @auto-cli-docs ac-2, ac-3, ac-4, ac-5
2
+ import chalk from "chalk";
3
+ import { EXIT_CODES, EXIT_CODE_METADATA } from "../exit-codes.js";
4
+ import { helpContent } from "../help/content.js";
5
+ import { program } from "../index.js";
6
+ import { extractCommandTree, findCommand, flattenCommandTree, formatCommandUsage, } from "../introspection.js";
7
+ import { output, setJsonMode, isJsonMode } from "../output.js";
7
8
  /**
8
9
  * Show help for a specific topic (command or concept)
9
10
  */
@@ -11,7 +12,7 @@ function showTopic(topic) {
11
12
  // Extract command tree from program
12
13
  const tree = extractCommandTree(program);
13
14
  // Try to find as a command first
14
- const command = findCommand(tree, topic.split(' '));
15
+ const command = findCommand(tree, topic.split(" "));
15
16
  if (command) {
16
17
  showCommandHelp(command);
17
18
  return;
@@ -24,7 +25,7 @@ function showTopic(topic) {
24
25
  }
25
26
  // Not found
26
27
  console.log(chalk.red(`Unknown topic: ${topic}`));
27
- console.log(`\nAvailable topics: ${getAllTopics(tree).join(', ')}`);
28
+ console.log(`\nAvailable topics: ${getAllTopics(tree).join(", ")}`);
28
29
  console.log(`\nRun 'kspec help' to see all topics.`);
29
30
  process.exit(EXIT_CODES.ERROR);
30
31
  }
@@ -36,13 +37,13 @@ function showCommandHelp(command) {
36
37
  // Title: use content title, or command name
37
38
  const title = content?.title || `${command.name} - ${command.description}`;
38
39
  console.log(chalk.bold.cyan(title));
39
- console.log(chalk.gray(''.repeat(40)));
40
+ console.log(chalk.gray("".repeat(40)));
40
41
  // Usage
41
- console.log(chalk.bold('\nUsage:'));
42
+ console.log(chalk.bold("\nUsage:"));
42
43
  console.log(` ${formatCommandUsage(command)}`);
43
44
  // Subcommands (auto-generated from Commander)
44
45
  if (command.subcommands.length > 0) {
45
- console.log(chalk.bold('\nCommands:'));
46
+ console.log(chalk.bold("\nCommands:"));
46
47
  for (const sub of command.subcommands) {
47
48
  const nameCol = sub.name.padEnd(20);
48
49
  console.log(` ${chalk.green(nameCol)} ${sub.description}`);
@@ -50,7 +51,7 @@ function showCommandHelp(command) {
50
51
  }
51
52
  // Options (auto-generated from Commander)
52
53
  if (command.options.length > 0) {
53
- console.log(chalk.bold('\nOptions:'));
54
+ console.log(chalk.bold("\nOptions:"));
54
55
  for (const opt of command.options) {
55
56
  // Format flags column
56
57
  const flagsCol = opt.flags.padEnd(30);
@@ -60,17 +61,17 @@ function showCommandHelp(command) {
60
61
  // Conceptual content (curated)
61
62
  if (content) {
62
63
  if (content.concept.trim()) {
63
- console.log(chalk.bold('\nDetails:'));
64
+ console.log(chalk.bold("\nDetails:"));
64
65
  console.log(content.concept.trim());
65
66
  }
66
67
  if (content.examples && content.examples.length > 0) {
67
- console.log(chalk.bold('\nExamples:'));
68
+ console.log(chalk.bold("\nExamples:"));
68
69
  for (const example of content.examples) {
69
70
  console.log(chalk.green(` ${example}`));
70
71
  }
71
72
  }
72
73
  if (content.seeAlso && content.seeAlso.length > 0) {
73
- console.log(chalk.gray(`\nSee also: ${content.seeAlso.map((t) => `kspec help ${t}`).join(', ')}`));
74
+ console.log(chalk.gray(`\nSee also: ${content.seeAlso.map((t) => `kspec help ${t}`).join(", ")}`));
74
75
  }
75
76
  }
76
77
  }
@@ -80,16 +81,16 @@ function showCommandHelp(command) {
80
81
  function showConceptHelp(topic, content) {
81
82
  const title = content.title || topic;
82
83
  console.log(chalk.bold.cyan(title));
83
- console.log(chalk.gray(''.repeat(40)));
84
+ console.log(chalk.gray("".repeat(40)));
84
85
  console.log(content.concept.trim());
85
86
  if (content.examples && content.examples.length > 0) {
86
- console.log(chalk.bold('\nExamples:'));
87
+ console.log(chalk.bold("\nExamples:"));
87
88
  for (const example of content.examples) {
88
89
  console.log(chalk.green(` ${example}`));
89
90
  }
90
91
  }
91
92
  if (content.seeAlso && content.seeAlso.length > 0) {
92
- console.log(chalk.gray(`\nSee also: ${content.seeAlso.map((t) => `kspec help ${t}`).join(', ')}`));
93
+ console.log(chalk.gray(`\nSee also: ${content.seeAlso.map((t) => `kspec help ${t}`).join(", ")}`));
93
94
  }
94
95
  }
95
96
  /**
@@ -97,7 +98,7 @@ function showConceptHelp(topic, content) {
97
98
  */
98
99
  function getAllTopics(tree) {
99
100
  const commands = flattenCommandTree(tree)
100
- .filter((cmd) => cmd.name !== 'kspec') // Skip root
101
+ .filter((cmd) => cmd.name !== "kspec") // Skip root
101
102
  .map((cmd) => cmd.name);
102
103
  const concepts = Object.keys(helpContent).filter((key) => !commands.includes(key));
103
104
  return [...new Set([...commands, ...concepts])];
@@ -107,17 +108,17 @@ function getAllTopics(tree) {
107
108
  */
108
109
  function showTopicList() {
109
110
  const tree = extractCommandTree(program);
110
- console.log(chalk.bold.cyan('kspec help'));
111
- console.log(chalk.gray(''.repeat(40)));
112
- console.log('\nExtended help for kspec commands and concepts.\n');
111
+ console.log(chalk.bold.cyan("kspec help"));
112
+ console.log(chalk.gray("".repeat(40)));
113
+ console.log("\nExtended help for kspec commands and concepts.\n");
113
114
  // Show top-level commands (auto-generated)
114
- console.log(chalk.bold('Commands:'));
115
+ console.log(chalk.bold("Commands:"));
115
116
  for (const cmd of tree.subcommands) {
116
117
  const nameCol = cmd.name.padEnd(12);
117
118
  console.log(` ${chalk.green(nameCol)} ${cmd.description}`);
118
119
  }
119
120
  // Show concept topics (curated)
120
- console.log(chalk.bold('\nConcepts:'));
121
+ console.log(chalk.bold("\nConcepts:"));
121
122
  const conceptTopics = Object.keys(helpContent).filter((key) => {
122
123
  // Concepts are topics that don't match command names
123
124
  return !tree.subcommands.some((cmd) => cmd.name === key);
@@ -128,25 +129,25 @@ function showTopicList() {
128
129
  const nameCol = topic.padEnd(12);
129
130
  console.log(` ${chalk.green(nameCol)} ${title}`);
130
131
  }
131
- console.log(chalk.gray('\nUsage: kspec help <topic>'));
132
- console.log(chalk.gray(' kspec help --all (full reference)'));
133
- console.log(chalk.gray(' kspec help --json (structured output)'));
132
+ console.log(chalk.gray("\nUsage: kspec help <topic>"));
133
+ console.log(chalk.gray(" kspec help --all (full reference)"));
134
+ console.log(chalk.gray(" kspec help --json (structured output)"));
134
135
  }
135
136
  /**
136
137
  * Show full reference (all commands with options)
137
138
  */
138
139
  function showFullReference() {
139
140
  const tree = extractCommandTree(program);
140
- const allCommands = flattenCommandTree(tree).filter((cmd) => cmd.name !== 'kspec');
141
- console.log(chalk.bold.cyan('kspec - Full Command Reference'));
142
- console.log(chalk.gray(''.repeat(60)));
141
+ const allCommands = flattenCommandTree(tree).filter((cmd) => cmd.name !== "kspec");
142
+ console.log(chalk.bold.cyan("kspec - Full Command Reference"));
143
+ console.log(chalk.gray("".repeat(60)));
143
144
  for (const cmd of allCommands) {
144
145
  console.log(chalk.bold(`\n${formatCommandUsage(cmd)}`));
145
146
  if (cmd.description) {
146
147
  console.log(` ${cmd.description}`);
147
148
  }
148
149
  if (cmd.options.length > 0) {
149
- console.log(chalk.gray(' Options:'));
150
+ console.log(chalk.gray(" Options:"));
150
151
  for (const opt of cmd.options) {
151
152
  console.log(chalk.gray(` ${opt.flags.padEnd(30)} ${opt.description}`));
152
153
  }
@@ -165,18 +166,143 @@ function showJson() {
165
166
  };
166
167
  output(data);
167
168
  }
169
+ /**
170
+ * Show exit codes documentation
171
+ * AC: @cli-schema-introspection ac-2
172
+ */
173
+ function showExitCodes() {
174
+ console.log(chalk.bold.cyan("kspec - Exit Codes"));
175
+ console.log(chalk.gray("─".repeat(60)));
176
+ console.log("\nExit codes returned by kspec commands:\n");
177
+ for (const exitCode of EXIT_CODE_METADATA) {
178
+ console.log(chalk.bold(`${exitCode.code} - ${exitCode.name}`));
179
+ console.log(` ${exitCode.description}`);
180
+ console.log(chalk.gray(` Commands: ${exitCode.commands}`));
181
+ console.log();
182
+ }
183
+ }
184
+ /**
185
+ * Output exit codes as JSON
186
+ * AC: @cli-schema-introspection ac-3
187
+ */
188
+ function showExitCodesJson() {
189
+ const exitCodesData = EXIT_CODE_METADATA.map((ec) => ({
190
+ code: ec.code,
191
+ name: ec.name,
192
+ description: ec.description,
193
+ commands: ec.commands,
194
+ }));
195
+ output(exitCodesData);
196
+ }
197
+ /**
198
+ * Generate JSON Schema for a command
199
+ * AC: @cli-schema-introspection ac-4
200
+ */
201
+ function showCommandJsonSchema(topic) {
202
+ const tree = extractCommandTree(program);
203
+ const command = findCommand(tree, topic.split(" "));
204
+ if (!command) {
205
+ console.error(chalk.red(`Unknown command: ${topic}`));
206
+ process.exit(EXIT_CODES.NOT_FOUND);
207
+ }
208
+ // Build JSON Schema object
209
+ const schema = {
210
+ $schema: "http://json-schema.org/draft-07/schema#",
211
+ type: "object",
212
+ title: `${command.name} command options`,
213
+ description: command.description,
214
+ properties: {},
215
+ required: [],
216
+ };
217
+ const properties = {};
218
+ const required = [];
219
+ // Add arguments as properties
220
+ for (const arg of command.arguments) {
221
+ const propName = arg.name;
222
+ properties[propName] = {
223
+ type: arg.variadic ? "array" : "string",
224
+ description: arg.description,
225
+ };
226
+ if (arg.variadic) {
227
+ properties[propName].items = {
228
+ type: "string",
229
+ };
230
+ }
231
+ if (arg.required) {
232
+ required.push(propName);
233
+ }
234
+ }
235
+ // Add options as properties
236
+ for (const opt of command.options) {
237
+ // Extract option name from flags (e.g., "-f, --force" -> "force")
238
+ const flagMatch = opt.flags.match(/--([a-zA-Z0-9-]+)/);
239
+ if (!flagMatch)
240
+ continue;
241
+ const propName = flagMatch[1];
242
+ // Determine type from flags
243
+ let type = "boolean";
244
+ if (opt.flags.includes("<")) {
245
+ type = "string";
246
+ }
247
+ else if (opt.flags.includes("[")) {
248
+ type = "string";
249
+ }
250
+ const propSchema = {
251
+ type,
252
+ description: opt.description,
253
+ };
254
+ if (opt.defaultValue !== undefined) {
255
+ propSchema.default = opt.defaultValue;
256
+ }
257
+ properties[propName] = propSchema;
258
+ if (opt.required) {
259
+ required.push(propName);
260
+ }
261
+ }
262
+ schema.properties = properties;
263
+ if (required.length > 0) {
264
+ schema.required = required;
265
+ }
266
+ output(schema);
267
+ }
168
268
  /**
169
269
  * Register the help command
170
270
  */
171
271
  export function registerHelpCommand(program) {
172
272
  program
173
- .command('help [topic]')
174
- .description('Extended help for commands and concepts')
175
- .option('--all', 'Show full command reference')
176
- .option('--json', 'Output as JSON')
273
+ .command("help [topic]")
274
+ .description("Extended help for commands and concepts")
275
+ .option("--all", "Show full command reference")
276
+ .option("--json", "Output as JSON")
277
+ .option("--exit-codes", "Show exit code documentation")
278
+ .option("--json-schema", "Output JSON Schema for command (use with topic)")
177
279
  .action((topic, options) => {
178
- // Handle flags
179
- if (options?.json) {
280
+ // Handle exit codes flag
281
+ if (options?.exitCodes) {
282
+ // AC: @cli-schema-introspection ac-2, ac-3
283
+ // Note: globalJsonMode is already set by preAction hook if --json flag present
284
+ if (isJsonMode()) {
285
+ showExitCodesJson();
286
+ }
287
+ else {
288
+ showExitCodes();
289
+ }
290
+ return;
291
+ }
292
+ // Handle JSON schema flag
293
+ if (options?.jsonSchema) {
294
+ if (!topic) {
295
+ console.error(chalk.red("Error: --json-schema requires a command topic"));
296
+ process.exit(EXIT_CODES.USAGE_ERROR);
297
+ }
298
+ // AC: @cli-schema-introspection ac-4
299
+ setJsonMode(true);
300
+ showCommandJsonSchema(topic);
301
+ return;
302
+ }
303
+ // AC: @cli-schema-introspection ac-1, ac-5
304
+ // If --json flag is present (globalJsonMode set by preAction hook), show JSON
305
+ if (isJsonMode()) {
180
306
  showJson();
181
307
  return;
182
308
  }