@kynetic-ai/spec 0.1.2 → 0.3.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 (510) 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 +116 -0
  32. package/dist/cli/batch-exec.d.ts.map +1 -0
  33. package/dist/cli/batch-exec.js +694 -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 +140 -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 +57 -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 +533 -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 +516 -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 +1097 -169
  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 +811 -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 +1233 -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 +53 -0
  156. package/dist/cli/commands/skill-install.d.ts.map +1 -0
  157. package/dist/cli/commands/skill-install.js +452 -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 +569 -346
  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 +227 -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 +569 -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 +235 -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 +468 -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 +351 -0
  309. package/dist/parser/config.d.ts.map +1 -0
  310. package/dist/parser/config.js +326 -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 +189 -0
  345. package/dist/parser/plan-document.d.ts.map +1 -0
  346. package/dist/parser/plan-document.js +340 -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 +277 -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 +83 -0
  401. package/dist/ralph/subagent.d.ts.map +1 -0
  402. package/dist/ralph/subagent.js +174 -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 +95 -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 +2 -2
  413. package/dist/schema/common.d.ts.map +1 -1
  414. package/dist/schema/common.js +34 -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 +233 -1
  448. package/dist/sessions/store.d.ts.map +1 -1
  449. package/dist/sessions/store.js +628 -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 +51 -0
  456. package/dist/strings/errors.d.ts.map +1 -1
  457. package/dist/strings/errors.js +136 -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/utils/commit.d.ts +1 -1
  474. package/dist/utils/commit.d.ts.map +1 -1
  475. package/dist/utils/commit.js +28 -26
  476. package/dist/utils/commit.js.map +1 -1
  477. package/dist/utils/git.d.ts +1 -1
  478. package/dist/utils/git.d.ts.map +1 -1
  479. package/dist/utils/git.js +40 -38
  480. package/dist/utils/git.js.map +1 -1
  481. package/dist/utils/grep.js +11 -11
  482. package/dist/utils/grep.js.map +1 -1
  483. package/dist/utils/index.d.ts +7 -7
  484. package/dist/utils/index.d.ts.map +1 -1
  485. package/dist/utils/index.js +4 -4
  486. package/dist/utils/index.js.map +1 -1
  487. package/dist/utils/time.d.ts.map +1 -1
  488. package/dist/utils/time.js +10 -10
  489. package/dist/utils/time.js.map +1 -1
  490. package/package.json +28 -5
  491. package/plugin/.claude-plugin/marketplace.json +17 -0
  492. package/plugin/.claude-plugin/plugin.json +5 -0
  493. package/plugin/plugins/kspec/skills/help/SKILL.md +42 -0
  494. package/plugin/plugins/kspec/skills/triage/SKILL.md +206 -0
  495. package/plugin/plugins/kspec/skills/triage/docs/automation.md +120 -0
  496. package/plugin/plugins/kspec/skills/triage/docs/inbox.md +144 -0
  497. package/plugin/plugins/kspec/skills/triage/docs/observations.md +85 -0
  498. package/templates/agents-sections/01-quick-start.md +22 -0
  499. package/templates/agents-sections/02-shadow-branch.md +34 -0
  500. package/templates/agents-sections/03-task-lifecycle.md +48 -0
  501. package/templates/agents-sections/04-pr-workflow.md +17 -0
  502. package/templates/agents-sections/05-commit-convention.md +27 -0
  503. package/templates/agents-sections/06-ralph-loop.md +45 -0
  504. package/templates/hooks/pre-commit +34 -0
  505. package/templates/skills/help/SKILL.md +37 -0
  506. package/templates/skills/manifest.yaml +15 -0
  507. package/templates/skills/triage/SKILL.md +199 -0
  508. package/templates/skills/triage/docs/automation.md +120 -0
  509. package/templates/skills/triage/docs/inbox.md +144 -0
  510. package/templates/skills/triage/docs/observations.md +85 -0
@@ -0,0 +1,351 @@
1
+ /**
2
+ * Project-level configuration for kspec.
3
+ *
4
+ * Loads kspec.config.yaml from the project root (main branch) before shadow
5
+ * branch detection. All fields are optional with backward-compatible defaults.
6
+ *
7
+ * Priority: env vars > config file > defaults
8
+ *
9
+ * @module
10
+ */
11
+ import { z } from "zod";
12
+ /**
13
+ * Complete schema for kspec.config.yaml.
14
+ *
15
+ * AC: @project-config ac-4 — unknown fields are ignored via passthrough
16
+ */
17
+ export declare const KspecConfigSchema: z.ZodObject<{
18
+ /** Shadow branch configuration */
19
+ shadow: z.ZodOptional<z.ZodObject<{
20
+ /** Branch name for shadow branch (default: kspec-meta) */
21
+ branch: z.ZodOptional<z.ZodString>;
22
+ /** Worktree directory name (default: .kspec) */
23
+ directory: z.ZodOptional<z.ZodString>;
24
+ /**
25
+ * Remote target for shadow branch. Can be:
26
+ * - Named remote (e.g., "origin", "specs-origin")
27
+ * - Local filesystem path (starts with /, ./, or ~)
28
+ * - Git URL (contains :// or starts with git@)
29
+ */
30
+ remote: z.ZodOptional<z.ZodString>;
31
+ }, "strict", z.ZodTypeAny, {
32
+ branch?: string | undefined;
33
+ directory?: string | undefined;
34
+ remote?: string | undefined;
35
+ }, {
36
+ branch?: string | undefined;
37
+ directory?: string | undefined;
38
+ remote?: string | undefined;
39
+ }>>;
40
+ /** Identity configuration */
41
+ identity: z.ZodOptional<z.ZodObject<{
42
+ /** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
43
+ author: z.ZodOptional<z.ZodString>;
44
+ }, "strict", z.ZodTypeAny, {
45
+ author?: string | undefined;
46
+ }, {
47
+ author?: string | undefined;
48
+ }>>;
49
+ /** Validation configuration */
50
+ validation: z.ZodOptional<z.ZodObject<{
51
+ /**
52
+ * When true, dangling references are treated as errors instead of warnings.
53
+ * AC: @config-validation ac-2 ac-3 — strict_refs configurable
54
+ */
55
+ strict_refs: z.ZodOptional<z.ZodBoolean>;
56
+ /**
57
+ * When true, specs missing acceptance criteria are reported as errors not warnings.
58
+ * AC: @config-validation ac-1 — require_acceptance configurable
59
+ */
60
+ require_acceptance: z.ZodOptional<z.ZodBoolean>;
61
+ }, "strict", z.ZodTypeAny, {
62
+ strict_refs?: boolean | undefined;
63
+ require_acceptance?: boolean | undefined;
64
+ }, {
65
+ strict_refs?: boolean | undefined;
66
+ require_acceptance?: boolean | undefined;
67
+ }>>;
68
+ /** Daemon configuration */
69
+ daemon: z.ZodOptional<z.ZodObject<{
70
+ /** Default port for daemon (default: 3456) */
71
+ port: z.ZodOptional<z.ZodNumber>;
72
+ /** Host to bind to (default: localhost) */
73
+ host: z.ZodOptional<z.ZodString>;
74
+ /**
75
+ * Whether to auto-start daemon when running kspec commands.
76
+ * AC: @config-daemon ac-3 — auto_start configurable
77
+ */
78
+ auto_start: z.ZodOptional<z.ZodBoolean>;
79
+ }, "strict", z.ZodTypeAny, {
80
+ auto_start?: boolean | undefined;
81
+ port?: number | undefined;
82
+ host?: string | undefined;
83
+ }, {
84
+ auto_start?: boolean | undefined;
85
+ port?: number | undefined;
86
+ host?: string | undefined;
87
+ }>>;
88
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
89
+ /** Shadow branch configuration */
90
+ shadow: z.ZodOptional<z.ZodObject<{
91
+ /** Branch name for shadow branch (default: kspec-meta) */
92
+ branch: z.ZodOptional<z.ZodString>;
93
+ /** Worktree directory name (default: .kspec) */
94
+ directory: z.ZodOptional<z.ZodString>;
95
+ /**
96
+ * Remote target for shadow branch. Can be:
97
+ * - Named remote (e.g., "origin", "specs-origin")
98
+ * - Local filesystem path (starts with /, ./, or ~)
99
+ * - Git URL (contains :// or starts with git@)
100
+ */
101
+ remote: z.ZodOptional<z.ZodString>;
102
+ }, "strict", z.ZodTypeAny, {
103
+ branch?: string | undefined;
104
+ directory?: string | undefined;
105
+ remote?: string | undefined;
106
+ }, {
107
+ branch?: string | undefined;
108
+ directory?: string | undefined;
109
+ remote?: string | undefined;
110
+ }>>;
111
+ /** Identity configuration */
112
+ identity: z.ZodOptional<z.ZodObject<{
113
+ /** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
114
+ author: z.ZodOptional<z.ZodString>;
115
+ }, "strict", z.ZodTypeAny, {
116
+ author?: string | undefined;
117
+ }, {
118
+ author?: string | undefined;
119
+ }>>;
120
+ /** Validation configuration */
121
+ validation: z.ZodOptional<z.ZodObject<{
122
+ /**
123
+ * When true, dangling references are treated as errors instead of warnings.
124
+ * AC: @config-validation ac-2 ac-3 — strict_refs configurable
125
+ */
126
+ strict_refs: z.ZodOptional<z.ZodBoolean>;
127
+ /**
128
+ * When true, specs missing acceptance criteria are reported as errors not warnings.
129
+ * AC: @config-validation ac-1 — require_acceptance configurable
130
+ */
131
+ require_acceptance: z.ZodOptional<z.ZodBoolean>;
132
+ }, "strict", z.ZodTypeAny, {
133
+ strict_refs?: boolean | undefined;
134
+ require_acceptance?: boolean | undefined;
135
+ }, {
136
+ strict_refs?: boolean | undefined;
137
+ require_acceptance?: boolean | undefined;
138
+ }>>;
139
+ /** Daemon configuration */
140
+ daemon: z.ZodOptional<z.ZodObject<{
141
+ /** Default port for daemon (default: 3456) */
142
+ port: z.ZodOptional<z.ZodNumber>;
143
+ /** Host to bind to (default: localhost) */
144
+ host: z.ZodOptional<z.ZodString>;
145
+ /**
146
+ * Whether to auto-start daemon when running kspec commands.
147
+ * AC: @config-daemon ac-3 — auto_start configurable
148
+ */
149
+ auto_start: z.ZodOptional<z.ZodBoolean>;
150
+ }, "strict", z.ZodTypeAny, {
151
+ auto_start?: boolean | undefined;
152
+ port?: number | undefined;
153
+ host?: string | undefined;
154
+ }, {
155
+ auto_start?: boolean | undefined;
156
+ port?: number | undefined;
157
+ host?: string | undefined;
158
+ }>>;
159
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
160
+ /** Shadow branch configuration */
161
+ shadow: z.ZodOptional<z.ZodObject<{
162
+ /** Branch name for shadow branch (default: kspec-meta) */
163
+ branch: z.ZodOptional<z.ZodString>;
164
+ /** Worktree directory name (default: .kspec) */
165
+ directory: z.ZodOptional<z.ZodString>;
166
+ /**
167
+ * Remote target for shadow branch. Can be:
168
+ * - Named remote (e.g., "origin", "specs-origin")
169
+ * - Local filesystem path (starts with /, ./, or ~)
170
+ * - Git URL (contains :// or starts with git@)
171
+ */
172
+ remote: z.ZodOptional<z.ZodString>;
173
+ }, "strict", z.ZodTypeAny, {
174
+ branch?: string | undefined;
175
+ directory?: string | undefined;
176
+ remote?: string | undefined;
177
+ }, {
178
+ branch?: string | undefined;
179
+ directory?: string | undefined;
180
+ remote?: string | undefined;
181
+ }>>;
182
+ /** Identity configuration */
183
+ identity: z.ZodOptional<z.ZodObject<{
184
+ /** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
185
+ author: z.ZodOptional<z.ZodString>;
186
+ }, "strict", z.ZodTypeAny, {
187
+ author?: string | undefined;
188
+ }, {
189
+ author?: string | undefined;
190
+ }>>;
191
+ /** Validation configuration */
192
+ validation: z.ZodOptional<z.ZodObject<{
193
+ /**
194
+ * When true, dangling references are treated as errors instead of warnings.
195
+ * AC: @config-validation ac-2 ac-3 — strict_refs configurable
196
+ */
197
+ strict_refs: z.ZodOptional<z.ZodBoolean>;
198
+ /**
199
+ * When true, specs missing acceptance criteria are reported as errors not warnings.
200
+ * AC: @config-validation ac-1 — require_acceptance configurable
201
+ */
202
+ require_acceptance: z.ZodOptional<z.ZodBoolean>;
203
+ }, "strict", z.ZodTypeAny, {
204
+ strict_refs?: boolean | undefined;
205
+ require_acceptance?: boolean | undefined;
206
+ }, {
207
+ strict_refs?: boolean | undefined;
208
+ require_acceptance?: boolean | undefined;
209
+ }>>;
210
+ /** Daemon configuration */
211
+ daemon: z.ZodOptional<z.ZodObject<{
212
+ /** Default port for daemon (default: 3456) */
213
+ port: z.ZodOptional<z.ZodNumber>;
214
+ /** Host to bind to (default: localhost) */
215
+ host: z.ZodOptional<z.ZodString>;
216
+ /**
217
+ * Whether to auto-start daemon when running kspec commands.
218
+ * AC: @config-daemon ac-3 — auto_start configurable
219
+ */
220
+ auto_start: z.ZodOptional<z.ZodBoolean>;
221
+ }, "strict", z.ZodTypeAny, {
222
+ auto_start?: boolean | undefined;
223
+ port?: number | undefined;
224
+ host?: string | undefined;
225
+ }, {
226
+ auto_start?: boolean | undefined;
227
+ port?: number | undefined;
228
+ host?: string | undefined;
229
+ }>>;
230
+ }, z.ZodTypeAny, "passthrough">>;
231
+ /**
232
+ * Raw config type as parsed from YAML file.
233
+ */
234
+ export type KspecConfig = z.infer<typeof KspecConfigSchema>;
235
+ /**
236
+ * Remote type for shadow branch configuration.
237
+ * - "named": Git remote name (e.g., "origin", "specs-origin")
238
+ * - "path": Local filesystem path
239
+ * - "url": Git URL (https://, git@, etc.)
240
+ */
241
+ export type ShadowRemoteType = "named" | "path" | "url";
242
+ /**
243
+ * Resolved shadow remote configuration.
244
+ */
245
+ export interface ResolvedShadowRemote {
246
+ /** The remote value from config */
247
+ value: string;
248
+ /** Detected type of the remote */
249
+ type: ShadowRemoteType;
250
+ }
251
+ /**
252
+ * Detect the type of a shadow remote string.
253
+ *
254
+ * AC: @config-shadow ac-3 ac-4 ac-5 — remote type detection
255
+ *
256
+ * @param remote Remote string from config
257
+ * @returns Detected type: "path" for filesystem, "url" for git URLs, "named" for git remote names
258
+ */
259
+ export declare function detectRemoteType(remote: string): ShadowRemoteType;
260
+ /**
261
+ * Resolved config with all values finalized (env vars applied, defaults filled).
262
+ */
263
+ export interface ResolvedKspecConfig {
264
+ shadow: {
265
+ /** Branch name (default: kspec-meta) */
266
+ branch: string;
267
+ /** Worktree directory name (default: .kspec) */
268
+ directory: string;
269
+ /** Remote configuration, null if not specified */
270
+ remote: ResolvedShadowRemote | null;
271
+ };
272
+ identity: {
273
+ author: string | null;
274
+ };
275
+ validation: {
276
+ /**
277
+ * When true, dangling references are treated as errors instead of warnings.
278
+ * AC: @config-validation ac-2 ac-3
279
+ */
280
+ strict_refs: boolean;
281
+ /**
282
+ * When true, specs missing acceptance criteria are reported as errors not warnings.
283
+ * AC: @config-validation ac-1
284
+ */
285
+ require_acceptance: boolean;
286
+ };
287
+ daemon: {
288
+ port: number;
289
+ host: string;
290
+ /**
291
+ * Whether to auto-start daemon when running kspec commands.
292
+ * AC: @config-daemon ac-3
293
+ */
294
+ auto_start: boolean;
295
+ };
296
+ }
297
+ /**
298
+ * Result of loading project config.
299
+ */
300
+ export interface LoadConfigResult {
301
+ /** Resolved configuration with all values finalized */
302
+ config: ResolvedKspecConfig;
303
+ /** Path to config file if found, null otherwise */
304
+ configPath: string | null;
305
+ /** Warning message if config had issues but was recoverable */
306
+ warning: string | null;
307
+ /** The git root directory where config was loaded from */
308
+ gitRoot: string | null;
309
+ }
310
+ /**
311
+ * Find git root directory, handling KSPEC_SPEC_DIR batch mode.
312
+ *
313
+ * AC: @project-config ac-7 — in batch mode, we need the REAL project root
314
+ *
315
+ * When KSPEC_SPEC_DIR is set (batch atomic mode), the cwd might be the temp
316
+ * directory. We need to find the real project root by checking:
317
+ * 1. If KSPEC_BATCH_PROJECT_ROOT is set, use that (set by batch executor)
318
+ * 2. Otherwise, use git root from cwd
319
+ *
320
+ * AC: @project-config ac-6 — loads from git root, not cwd subdirectory
321
+ */
322
+ export declare function findProjectRoot(startDir: string): string | null;
323
+ /**
324
+ * Load project configuration from kspec.config.yaml.
325
+ *
326
+ * AC: @project-config ac-1 — no config = all defaults
327
+ * AC: @project-config ac-2 — config parsed and available before shadow detection
328
+ * AC: @project-config ac-3 — invalid YAML = defaults + warning
329
+ * AC: @project-config ac-4 — unknown fields ignored
330
+ * AC: @project-config ac-5 — env vars take precedence
331
+ * AC: @project-config ac-6 — loads from git root
332
+ * AC: @project-config ac-7 — batch mode uses real project root
333
+ *
334
+ * @param startDir Starting directory for git root detection
335
+ */
336
+ export declare function loadProjectConfig(startDir?: string): Promise<LoadConfigResult>;
337
+ /**
338
+ * Resolve configuration by merging file config with env vars and defaults.
339
+ *
340
+ * Priority: env vars > config file > defaults
341
+ *
342
+ * AC: @project-config ac-5 — env vars take precedence
343
+ */
344
+ export declare function resolveConfig(fileConfig: KspecConfig | null): ResolvedKspecConfig;
345
+ /**
346
+ * Get the default configuration (no file, no env vars).
347
+ * Useful for testing or when config loading fails completely.
348
+ * Returns a deep copy to prevent mutation of shared defaults.
349
+ */
350
+ export declare function getDefaultConfig(): ResolvedKspecConfig;
351
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/parser/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Project-level configuration for kspec.
3
+ *
4
+ * Loads kspec.config.yaml from the project root (main branch) before shadow
5
+ * branch detection. All fields are optional with backward-compatible defaults.
6
+ *
7
+ * Priority: env vars > config file > defaults
8
+ *
9
+ * @module
10
+ */
11
+ import * as fs from "node:fs/promises";
12
+ import * as path from "node:path";
13
+ import { z } from "zod";
14
+ import * as YAML from "yaml";
15
+ import { getGitRoot } from "./shadow.js";
16
+ // ── Schema ──────────────────────────────────────────────────────────────
17
+ /**
18
+ * Schema for shadow branch configuration.
19
+ *
20
+ * AC: @config-shadow — shadow.branch, shadow.directory, shadow.remote configurable
21
+ */
22
+ const ShadowConfigSchema = z
23
+ .object({
24
+ /** Branch name for shadow branch (default: kspec-meta) */
25
+ branch: z.string().optional(),
26
+ /** Worktree directory name (default: .kspec) */
27
+ directory: z.string().optional(),
28
+ /**
29
+ * Remote target for shadow branch. Can be:
30
+ * - Named remote (e.g., "origin", "specs-origin")
31
+ * - Local filesystem path (starts with /, ./, or ~)
32
+ * - Git URL (contains :// or starts with git@)
33
+ */
34
+ remote: z.string().optional(),
35
+ })
36
+ .strict()
37
+ .optional();
38
+ /**
39
+ * Schema for identity configuration.
40
+ */
41
+ const IdentityConfigSchema = z
42
+ .object({
43
+ /** Default author for notes/tasks (overridden by KSPEC_AUTHOR env var) */
44
+ author: z.string().optional(),
45
+ })
46
+ .strict()
47
+ .optional();
48
+ /**
49
+ * Schema for validation configuration.
50
+ *
51
+ * AC: @config-validation — validation settings configurable in kspec.config.yaml
52
+ */
53
+ const ValidationConfigSchema = z
54
+ .object({
55
+ /**
56
+ * When true, dangling references are treated as errors instead of warnings.
57
+ * AC: @config-validation ac-2 ac-3 — strict_refs configurable
58
+ */
59
+ strict_refs: z.boolean().optional(),
60
+ /**
61
+ * When true, specs missing acceptance criteria are reported as errors not warnings.
62
+ * AC: @config-validation ac-1 — require_acceptance configurable
63
+ */
64
+ require_acceptance: z.boolean().optional(),
65
+ })
66
+ .strict()
67
+ .optional();
68
+ /**
69
+ * Schema for daemon configuration.
70
+ *
71
+ * AC: @config-daemon — daemon.port, daemon.auto_start configurable
72
+ */
73
+ const DaemonConfigSchema = z
74
+ .object({
75
+ /** Default port for daemon (default: 3456) */
76
+ port: z.number().int().min(1).max(65535).optional(),
77
+ /** Host to bind to (default: localhost) */
78
+ host: z.string().optional(),
79
+ /**
80
+ * Whether to auto-start daemon when running kspec commands.
81
+ * AC: @config-daemon ac-3 — auto_start configurable
82
+ */
83
+ auto_start: z.boolean().optional(),
84
+ })
85
+ .strict()
86
+ .optional();
87
+ /**
88
+ * Complete schema for kspec.config.yaml.
89
+ *
90
+ * AC: @project-config ac-4 — unknown fields are ignored via passthrough
91
+ */
92
+ export const KspecConfigSchema = z
93
+ .object({
94
+ /** Shadow branch configuration */
95
+ shadow: ShadowConfigSchema,
96
+ /** Identity configuration */
97
+ identity: IdentityConfigSchema,
98
+ /** Validation configuration */
99
+ validation: ValidationConfigSchema,
100
+ /** Daemon configuration */
101
+ daemon: DaemonConfigSchema,
102
+ })
103
+ .passthrough(); // AC: ac-4 — ignore unknown fields
104
+ /**
105
+ * Detect the type of a shadow remote string.
106
+ *
107
+ * AC: @config-shadow ac-3 ac-4 ac-5 — remote type detection
108
+ *
109
+ * @param remote Remote string from config
110
+ * @returns Detected type: "path" for filesystem, "url" for git URLs, "named" for git remote names
111
+ */
112
+ export function detectRemoteType(remote) {
113
+ // AC: ac-4 — Local filesystem path (starts with /, ./, ../, or ~)
114
+ if (remote.startsWith("/") ||
115
+ remote.startsWith("./") ||
116
+ remote.startsWith("../") ||
117
+ remote.startsWith("~")) {
118
+ return "path";
119
+ }
120
+ // AC: ac-5 — Git URL (contains :// or starts with git@)
121
+ if (remote.includes("://") || remote.startsWith("git@")) {
122
+ return "url";
123
+ }
124
+ // AC: ac-3 — Otherwise it's a named remote
125
+ return "named";
126
+ }
127
+ // ── Defaults ────────────────────────────────────────────────────────────
128
+ /**
129
+ * Default configuration values.
130
+ *
131
+ * AC: @project-config ac-1 — these are the current defaults
132
+ */
133
+ const DEFAULT_CONFIG = {
134
+ shadow: {
135
+ branch: "kspec-meta",
136
+ directory: ".kspec",
137
+ remote: null,
138
+ },
139
+ identity: {
140
+ author: null,
141
+ },
142
+ validation: {
143
+ // AC: @config-validation — defaults preserve existing behavior
144
+ // strict_refs: true = dangling refs are errors (existing behavior)
145
+ // require_acceptance: false = missing AC is warning (existing behavior)
146
+ strict_refs: true,
147
+ require_acceptance: false,
148
+ },
149
+ daemon: {
150
+ port: 3456,
151
+ host: "localhost",
152
+ auto_start: true, // AC: @config-daemon — default auto-start enabled
153
+ },
154
+ };
155
+ // ── Loading ─────────────────────────────────────────────────────────────
156
+ const CONFIG_FILENAME = "kspec.config.yaml";
157
+ /**
158
+ * Find git root directory, handling KSPEC_SPEC_DIR batch mode.
159
+ *
160
+ * AC: @project-config ac-7 — in batch mode, we need the REAL project root
161
+ *
162
+ * When KSPEC_SPEC_DIR is set (batch atomic mode), the cwd might be the temp
163
+ * directory. We need to find the real project root by checking:
164
+ * 1. If KSPEC_BATCH_PROJECT_ROOT is set, use that (set by batch executor)
165
+ * 2. Otherwise, use git root from cwd
166
+ *
167
+ * AC: @project-config ac-6 — loads from git root, not cwd subdirectory
168
+ */
169
+ export function findProjectRoot(startDir) {
170
+ // In batch mode, the batch executor should set this to the real root
171
+ // before redirecting KSPEC_SPEC_DIR
172
+ const batchRoot = process.env.KSPEC_BATCH_PROJECT_ROOT;
173
+ if (batchRoot) {
174
+ return batchRoot;
175
+ }
176
+ // Normal mode: find git root
177
+ return getGitRoot(startDir);
178
+ }
179
+ /**
180
+ * Load project configuration from kspec.config.yaml.
181
+ *
182
+ * AC: @project-config ac-1 — no config = all defaults
183
+ * AC: @project-config ac-2 — config parsed and available before shadow detection
184
+ * AC: @project-config ac-3 — invalid YAML = defaults + warning
185
+ * AC: @project-config ac-4 — unknown fields ignored
186
+ * AC: @project-config ac-5 — env vars take precedence
187
+ * AC: @project-config ac-6 — loads from git root
188
+ * AC: @project-config ac-7 — batch mode uses real project root
189
+ *
190
+ * @param startDir Starting directory for git root detection
191
+ */
192
+ export async function loadProjectConfig(startDir = process.cwd()) {
193
+ const gitRoot = findProjectRoot(startDir);
194
+ if (!gitRoot) {
195
+ // Not in a git repo, use defaults
196
+ return {
197
+ config: resolveConfig(null),
198
+ configPath: null,
199
+ warning: null,
200
+ gitRoot: null,
201
+ };
202
+ }
203
+ const configPath = path.join(gitRoot, CONFIG_FILENAME);
204
+ // Check if config file exists
205
+ try {
206
+ await fs.access(configPath);
207
+ }
208
+ catch {
209
+ // AC: ac-1 — no config file, use defaults
210
+ return {
211
+ config: resolveConfig(null),
212
+ configPath: null,
213
+ warning: null,
214
+ gitRoot,
215
+ };
216
+ }
217
+ // Try to load and parse config
218
+ try {
219
+ const content = await fs.readFile(configPath, "utf-8");
220
+ const raw = YAML.parse(content);
221
+ // Validate against schema
222
+ const result = KspecConfigSchema.safeParse(raw);
223
+ if (!result.success) {
224
+ // AC: ac-3 — validation error = defaults + warning
225
+ const issues = result.error.issues
226
+ .map((i) => `${i.path.join(".")}: ${i.message}`)
227
+ .join("; ");
228
+ return {
229
+ config: resolveConfig(null),
230
+ configPath,
231
+ warning: `Config validation failed: ${issues}. Using defaults.`,
232
+ gitRoot,
233
+ };
234
+ }
235
+ // AC: ac-5 — apply env var overrides during resolution
236
+ return {
237
+ config: resolveConfig(result.data),
238
+ configPath,
239
+ warning: null,
240
+ gitRoot,
241
+ };
242
+ }
243
+ catch (err) {
244
+ // AC: ac-3 — parse error = defaults + warning
245
+ const message = err instanceof Error ? err.message : String(err);
246
+ return {
247
+ config: resolveConfig(null),
248
+ configPath,
249
+ warning: `Failed to parse ${CONFIG_FILENAME}: ${message}. Using defaults.`,
250
+ gitRoot,
251
+ };
252
+ }
253
+ }
254
+ /**
255
+ * Resolve configuration by merging file config with env vars and defaults.
256
+ *
257
+ * Priority: env vars > config file > defaults
258
+ *
259
+ * AC: @project-config ac-5 — env vars take precedence
260
+ */
261
+ export function resolveConfig(fileConfig) {
262
+ const file = fileConfig || {};
263
+ // Get env var overrides
264
+ const envAuthor = process.env.KSPEC_AUTHOR;
265
+ const envPort = process.env.KSPEC_DAEMON_PORT
266
+ ? parseInt(process.env.KSPEC_DAEMON_PORT, 10)
267
+ : undefined;
268
+ const envHost = process.env.KSPEC_DAEMON_HOST;
269
+ // Resolve shadow remote if specified
270
+ const remoteValue = file.shadow?.remote;
271
+ const resolvedRemote = remoteValue
272
+ ? { value: remoteValue, type: detectRemoteType(remoteValue) }
273
+ : DEFAULT_CONFIG.shadow.remote;
274
+ return {
275
+ shadow: {
276
+ branch: file.shadow?.branch ?? DEFAULT_CONFIG.shadow.branch,
277
+ directory: file.shadow?.directory ?? DEFAULT_CONFIG.shadow.directory,
278
+ remote: resolvedRemote,
279
+ },
280
+ identity: {
281
+ // AC: ac-5 — env var takes precedence
282
+ author: envAuthor ?? file.identity?.author ?? DEFAULT_CONFIG.identity.author,
283
+ },
284
+ validation: {
285
+ // AC: @config-validation ac-2 ac-3 — strict_refs from config
286
+ strict_refs: file.validation?.strict_refs ?? DEFAULT_CONFIG.validation.strict_refs,
287
+ // AC: @config-validation ac-1 — require_acceptance from config
288
+ require_acceptance: file.validation?.require_acceptance ?? DEFAULT_CONFIG.validation.require_acceptance,
289
+ },
290
+ daemon: {
291
+ // AC: ac-5 — env vars take precedence
292
+ port: (envPort && !isNaN(envPort) ? envPort : undefined) ??
293
+ file.daemon?.port ??
294
+ DEFAULT_CONFIG.daemon.port,
295
+ // AC: @config-daemon ac-5 ac-6 — host from config/env
296
+ host: envHost ?? file.daemon?.host ?? DEFAULT_CONFIG.daemon.host,
297
+ // AC: @config-daemon ac-3 — auto_start from config
298
+ auto_start: file.daemon?.auto_start ?? DEFAULT_CONFIG.daemon.auto_start,
299
+ },
300
+ };
301
+ }
302
+ /**
303
+ * Get the default configuration (no file, no env vars).
304
+ * Useful for testing or when config loading fails completely.
305
+ * Returns a deep copy to prevent mutation of shared defaults.
306
+ */
307
+ export function getDefaultConfig() {
308
+ return {
309
+ shadow: {
310
+ branch: DEFAULT_CONFIG.shadow.branch,
311
+ directory: DEFAULT_CONFIG.shadow.directory,
312
+ remote: DEFAULT_CONFIG.shadow.remote,
313
+ },
314
+ identity: { ...DEFAULT_CONFIG.identity },
315
+ validation: {
316
+ strict_refs: DEFAULT_CONFIG.validation.strict_refs,
317
+ require_acceptance: DEFAULT_CONFIG.validation.require_acceptance,
318
+ },
319
+ daemon: {
320
+ port: DEFAULT_CONFIG.daemon.port,
321
+ host: DEFAULT_CONFIG.daemon.host,
322
+ auto_start: DEFAULT_CONFIG.daemon.auto_start,
323
+ },
324
+ };
325
+ }
326
+ //# sourceMappingURL=config.js.map