@inharness-ai/claude4spec 1.0.20 → 1.0.22

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 (274) hide show
  1. package/.claude/skills/c4s-brief-implementer/SKILL.md +117 -57
  2. package/CHANGELOG.md +26 -0
  3. package/dist/bin/c4s/commands/agent.d.ts +18 -0
  4. package/dist/bin/c4s/commands/agent.js +102 -0
  5. package/dist/bin/c4s/commands/agent.js.map +1 -0
  6. package/dist/bin/c4s/commands/ask.d.ts +9 -8
  7. package/dist/bin/c4s/commands/ask.js +23 -31
  8. package/dist/bin/c4s/commands/ask.js.map +1 -1
  9. package/dist/bin/c4s/commands/catalog.d.ts +1 -1
  10. package/dist/bin/c4s/commands/catalog.js +2 -2
  11. package/dist/bin/c4s/commands/catalog.js.map +1 -1
  12. package/dist/bin/c4s/commands/describe.d.ts +1 -1
  13. package/dist/bin/c4s/commands/describe.js +2 -2
  14. package/dist/bin/c4s/commands/describe.js.map +1 -1
  15. package/dist/bin/c4s/commands/detail.d.ts +1 -1
  16. package/dist/bin/c4s/commands/detail.js +2 -2
  17. package/dist/bin/c4s/commands/detail.js.map +1 -1
  18. package/dist/bin/c4s/commands/element-list.d.ts +1 -1
  19. package/dist/bin/c4s/commands/element-list.js +2 -2
  20. package/dist/bin/c4s/commands/element-list.js.map +1 -1
  21. package/dist/bin/c4s/commands/find-references.js +1 -1
  22. package/dist/bin/c4s/commands/find-references.js.map +1 -1
  23. package/dist/bin/c4s/commands/inline-mention.d.ts +1 -1
  24. package/dist/bin/c4s/commands/inline-mention.js +2 -2
  25. package/dist/bin/c4s/commands/inline-mention.js.map +1 -1
  26. package/dist/bin/c4s/commands/list-slugs.d.ts +1 -1
  27. package/dist/bin/c4s/commands/list-slugs.js +2 -2
  28. package/dist/bin/c4s/commands/list-slugs.js.map +1 -1
  29. package/dist/bin/c4s/commands/list-tags.d.ts +1 -1
  30. package/dist/bin/c4s/commands/list-tags.js +2 -2
  31. package/dist/bin/c4s/commands/list-tags.js.map +1 -1
  32. package/dist/bin/c4s/commands/plugins.d.ts +9 -0
  33. package/dist/bin/c4s/commands/plugins.js +81 -0
  34. package/dist/bin/c4s/commands/plugins.js.map +1 -0
  35. package/dist/bin/c4s/commands/resolve.d.ts +1 -1
  36. package/dist/bin/c4s/commands/resolve.js +2 -2
  37. package/dist/bin/c4s/commands/resolve.js.map +1 -1
  38. package/dist/bin/c4s/commands/single-element.d.ts +1 -1
  39. package/dist/bin/c4s/commands/single-element.js +2 -2
  40. package/dist/bin/c4s/commands/single-element.js.map +1 -1
  41. package/dist/bin/c4s/commands/tagged-list-mixed.d.ts +1 -1
  42. package/dist/bin/c4s/commands/tagged-list-mixed.js +2 -2
  43. package/dist/bin/c4s/commands/tagged-list-mixed.js.map +1 -1
  44. package/dist/bin/c4s/commands/tagged-list.d.ts +1 -1
  45. package/dist/bin/c4s/commands/tagged-list.js +2 -2
  46. package/dist/bin/c4s/commands/tagged-list.js.map +1 -1
  47. package/dist/bin/c4s/context.d.ts +3 -3
  48. package/dist/bin/c4s/context.js +7 -4
  49. package/dist/bin/c4s/context.js.map +1 -1
  50. package/dist/bin/c4s/errors.d.ts +1 -1
  51. package/dist/bin/c4s/errors.js.map +1 -1
  52. package/dist/bin/c4s-mcp.js +6 -2
  53. package/dist/bin/c4s-mcp.js.map +1 -1
  54. package/dist/bin/c4s.js +19 -4
  55. package/dist/bin/c4s.js.map +1 -1
  56. package/dist/bin/gitignore.js +7 -11
  57. package/dist/bin/gitignore.js.map +1 -1
  58. package/dist/client/assets/{arc-qrIe4IVl.js → arc-C9oTB3b1.js} +1 -1
  59. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CF6sgG8n.js → architectureDiagram-3BPJPVTR-Bno5ViqK.js} +1 -1
  60. package/dist/client/assets/{blockDiagram-GPEHLZMM-Cf8Tx0VN.js → blockDiagram-GPEHLZMM-CJYBoeWQ.js} +1 -1
  61. package/dist/client/assets/{c4Diagram-AAUBKEIU-BDkuMEyf.js → c4Diagram-AAUBKEIU-DaaqWE6s.js} +1 -1
  62. package/dist/client/assets/channel-Cei_E79M.js +1 -0
  63. package/dist/client/assets/{chunk-2J33WTMH-ChycTonk.js → chunk-2J33WTMH-P_I0OPMy.js} +1 -1
  64. package/dist/client/assets/{chunk-4BX2VUAB-BpUgWjxx.js → chunk-4BX2VUAB-CCySMlh5.js} +1 -1
  65. package/dist/client/assets/{chunk-55IACEB6-CeHg_yjT.js → chunk-55IACEB6-CEUyqKGF.js} +1 -1
  66. package/dist/client/assets/{chunk-727SXJPM-BpxYq7ab.js → chunk-727SXJPM-CoTSYOVz.js} +1 -1
  67. package/dist/client/assets/{chunk-AQP2D5EJ-bghkOtr6.js → chunk-AQP2D5EJ-DB0nMxPr.js} +1 -1
  68. package/dist/client/assets/{chunk-FMBD7UC4-4sXokGgd.js → chunk-FMBD7UC4-PG3m6-_a.js} +1 -1
  69. package/dist/client/assets/{chunk-ND2GUHAM-DYQOCE5T.js → chunk-ND2GUHAM-CBNk6IaV.js} +1 -1
  70. package/dist/client/assets/{chunk-QZHKN3VN-NkVuDlFD.js → chunk-QZHKN3VN-CLFa0WvN.js} +1 -1
  71. package/dist/client/assets/classDiagram-4FO5ZUOK-DUe_fAto.js +1 -0
  72. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DUe_fAto.js +1 -0
  73. package/dist/client/assets/{cose-bilkent-S5V4N54A-1l4P4WRI.js → cose-bilkent-S5V4N54A-BDwDDxHN.js} +1 -1
  74. package/dist/client/assets/{dagre-BM42HDAG-CSQie-gR.js → dagre-BM42HDAG-DR-1e8N5.js} +1 -1
  75. package/dist/client/assets/{diagram-2AECGRRQ-DME9ULoN.js → diagram-2AECGRRQ-C-tHgBWt.js} +1 -1
  76. package/dist/client/assets/{diagram-5GNKFQAL-Dn1Rw5k5.js → diagram-5GNKFQAL-uLmoKaJL.js} +1 -1
  77. package/dist/client/assets/{diagram-KO2AKTUF-Duh_PNWR.js → diagram-KO2AKTUF-8Fd-xuOy.js} +1 -1
  78. package/dist/client/assets/{diagram-LMA3HP47-B7Q5pV60.js → diagram-LMA3HP47-C1gniWsn.js} +1 -1
  79. package/dist/client/assets/{diagram-OG6HWLK6-C0KL_RDd.js → diagram-OG6HWLK6-BMWjZbeC.js} +1 -1
  80. package/dist/client/assets/{erDiagram-TEJ5UH35-D5elfwSC.js → erDiagram-TEJ5UH35-CIUO8hrR.js} +1 -1
  81. package/dist/client/assets/{flowDiagram-I6XJVG4X-BHmjX-WI.js → flowDiagram-I6XJVG4X-Ccw5YEf3.js} +1 -1
  82. package/dist/client/assets/{ganttDiagram-6RSMTGT7-KvoGFbS2.js → ganttDiagram-6RSMTGT7-BAvlf8cY.js} +1 -1
  83. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DsZL8BfK.js → gitGraphDiagram-PVQCEYII-ChCkdYar.js} +1 -1
  84. package/dist/client/assets/{index-zzILqHQN.js → index-BotCWOKC.js} +1 -1
  85. package/dist/client/assets/index-CtdzGyqj.js +805 -0
  86. package/dist/client/assets/{index-ClaVbrEF.js → index-DtpKHGD1.js} +1 -1
  87. package/dist/client/assets/{infoDiagram-5YYISTIA-DoQ6iSpJ.js → infoDiagram-5YYISTIA-CZMGwNyB.js} +1 -1
  88. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-akftyN0J.js → ishikawaDiagram-YF4QCWOH-CubjZGk6.js} +1 -1
  89. package/dist/client/assets/{journeyDiagram-JHISSGLW-PPex4PiV.js → journeyDiagram-JHISSGLW-DzwOyVzB.js} +1 -1
  90. package/dist/client/assets/{kanban-definition-UN3LZRKU-D114i3s1.js → kanban-definition-UN3LZRKU-CXznoTY9.js} +1 -1
  91. package/dist/client/assets/{linear-BuwQPJom.js → linear-EDwTFRrU.js} +1 -1
  92. package/dist/client/assets/{mermaid.core-CMX3GAvM.js → mermaid.core-Lae2097R.js} +4 -4
  93. package/dist/client/assets/{mindmap-definition-RKZ34NQL-ClBxWJju.js → mindmap-definition-RKZ34NQL-DFjIW41g.js} +1 -1
  94. package/dist/client/assets/{pieDiagram-4H26LBE5-hj5zVPj5.js → pieDiagram-4H26LBE5-CZDLR1jd.js} +1 -1
  95. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CRbR0G7M.js → quadrantDiagram-W4KKPZXB-CTGDzbqp.js} +1 -1
  96. package/dist/client/assets/{requirementDiagram-4Y6WPE33-Dto4B70I.js → requirementDiagram-4Y6WPE33-CeH0NbMv.js} +1 -1
  97. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DyYP8rwY.js → sankeyDiagram-5OEKKPKP-B6ZTjurV.js} +1 -1
  98. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-C-mrSLrJ.js → sequenceDiagram-3UESZ5HK-DcTRztVx.js} +1 -1
  99. package/dist/client/assets/{stateDiagram-AJRCARHV-IoDlhAe6.js → stateDiagram-AJRCARHV-nUgRVZSA.js} +1 -1
  100. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-D9pJuQbI.js +1 -0
  101. package/dist/client/assets/{timeline-definition-PNZ67QCA-DEXg3TEw.js → timeline-definition-PNZ67QCA-CXm5n4rV.js} +1 -1
  102. package/dist/client/assets/{vennDiagram-CIIHVFJN-CNu7LaT1.js → vennDiagram-CIIHVFJN-EmNJBYNd.js} +1 -1
  103. package/dist/client/assets/{wardley-L42UT6IY-0hGvREmD.js → wardley-L42UT6IY-MLrlp8H-.js} +1 -1
  104. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-CVLz-xFz.js → wardleyDiagram-YWT4CUSO-5QoES25n.js} +1 -1
  105. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CFymKAcX.js → xychartDiagram-2RQKCTM6-CbDEQbY0.js} +1 -1
  106. package/dist/client/index.html +1 -1
  107. package/dist/core/agent/run-agent.d.ts +61 -0
  108. package/dist/core/agent/run-agent.js +212 -0
  109. package/dist/core/agent/run-agent.js.map +1 -0
  110. package/dist/core/ask/run-ask.d.ts +1 -1
  111. package/dist/core/ask/run-ask.js +14 -5
  112. package/dist/core/ask/run-ask.js.map +1 -1
  113. package/dist/core/workspace/resolve.d.ts +2 -0
  114. package/dist/core/workspace/resolve.js +2 -1
  115. package/dist/core/workspace/resolve.js.map +1 -1
  116. package/dist/plugin-types/ambient.d.ts +30 -0
  117. package/dist/plugin-types/plugin-runtime.d.ts +172 -0
  118. package/dist/plugin-types/ui.d.ts +154 -0
  119. package/dist/server/config.d.ts +12 -0
  120. package/dist/server/config.js +26 -0
  121. package/dist/server/config.js.map +1 -1
  122. package/dist/server/core/plugin-host/__fixtures__/plugins.d.ts +14 -0
  123. package/dist/server/core/plugin-host/__fixtures__/plugins.js +56 -0
  124. package/dist/server/core/plugin-host/__fixtures__/plugins.js.map +1 -0
  125. package/dist/server/core/plugin-host/base-packages.d.ts +14 -0
  126. package/dist/server/core/plugin-host/base-packages.js +26 -0
  127. package/dist/server/core/plugin-host/base-packages.js.map +1 -0
  128. package/dist/server/core/plugin-host/cache-bust.d.ts +10 -0
  129. package/dist/server/core/plugin-host/cache-bust.js +21 -0
  130. package/dist/server/core/plugin-host/cache-bust.js.map +1 -0
  131. package/dist/server/core/plugin-host/cli-engine.d.ts +7 -2
  132. package/dist/server/core/plugin-host/cli-engine.js +11 -3
  133. package/dist/server/core/plugin-host/cli-engine.js.map +1 -1
  134. package/dist/server/core/plugin-host/cli-plugins.d.ts +23 -0
  135. package/dist/server/core/plugin-host/cli-plugins.js +49 -0
  136. package/dist/server/core/plugin-host/cli-plugins.js.map +1 -0
  137. package/dist/server/core/plugin-host/cross-cutting.d.ts +41 -4
  138. package/dist/server/core/plugin-host/cross-cutting.js +52 -4
  139. package/dist/server/core/plugin-host/cross-cutting.js.map +1 -1
  140. package/dist/server/core/plugin-host/entities-router.d.ts +2 -1
  141. package/dist/server/core/plugin-host/entities-router.js +16 -1
  142. package/dist/server/core/plugin-host/entities-router.js.map +1 -1
  143. package/dist/server/core/plugin-host/frontend-assets.d.ts +100 -0
  144. package/dist/server/core/plugin-host/frontend-assets.js +262 -0
  145. package/dist/server/core/plugin-host/frontend-assets.js.map +1 -0
  146. package/dist/server/core/plugin-host/frontend-manifest.d.ts +33 -0
  147. package/dist/server/core/plugin-host/frontend-manifest.js +52 -0
  148. package/dist/server/core/plugin-host/frontend-manifest.js.map +1 -0
  149. package/dist/server/core/plugin-host/loader.d.ts +107 -0
  150. package/dist/server/core/plugin-host/loader.js +196 -0
  151. package/dist/server/core/plugin-host/loader.js.map +1 -0
  152. package/dist/server/core/plugin-host/manifest-adapter.d.ts +30 -0
  153. package/dist/server/core/plugin-host/manifest-adapter.js +119 -0
  154. package/dist/server/core/plugin-host/manifest-adapter.js.map +1 -0
  155. package/dist/server/core/plugin-host/overlay-loader.d.ts +60 -0
  156. package/dist/server/core/plugin-host/overlay-loader.js +243 -0
  157. package/dist/server/core/plugin-host/overlay-loader.js.map +1 -0
  158. package/dist/server/core/plugin-host/plugin-watcher.d.ts +41 -0
  159. package/dist/server/core/plugin-host/plugin-watcher.js +95 -0
  160. package/dist/server/core/plugin-host/plugin-watcher.js.map +1 -0
  161. package/dist/server/core/plugin-host/project-host.d.ts +8 -2
  162. package/dist/server/core/plugin-host/project-host.js +56 -6
  163. package/dist/server/core/plugin-host/project-host.js.map +1 -1
  164. package/dist/server/core/plugin-host/registry.d.ts +26 -2
  165. package/dist/server/core/plugin-host/registry.js +107 -2
  166. package/dist/server/core/plugin-host/registry.js.map +1 -1
  167. package/dist/server/core/plugin-host/runtime-shims.d.ts +26 -0
  168. package/dist/server/core/plugin-host/runtime-shims.js +96 -0
  169. package/dist/server/core/plugin-host/runtime-shims.js.map +1 -0
  170. package/dist/server/core/plugin-host/types.d.ts +105 -3
  171. package/dist/server/db/migrations/041_chat_thread_transagent.sql +22 -0
  172. package/dist/server/db/migrations/042_chat_thread_drop_context_type_check.sql +61 -0
  173. package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
  174. package/dist/server/external-skills/brief-implementer-template.js +5 -2
  175. package/dist/server/external-skills/brief-implementer-template.js.map +1 -1
  176. package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
  177. package/dist/server/external-skills/spec-reader-template.js +14 -0
  178. package/dist/server/external-skills/spec-reader-template.js.map +1 -1
  179. package/dist/server/index.js +98 -1
  180. package/dist/server/index.js.map +1 -1
  181. package/dist/server/mcp/c4s-tools.d.ts +6 -1
  182. package/dist/server/mcp/c4s-tools.js +18 -13
  183. package/dist/server/mcp/c4s-tools.js.map +1 -1
  184. package/dist/server/mcp/release-tools/index.d.ts +11 -0
  185. package/dist/server/mcp/release-tools/index.js +68 -5
  186. package/dist/server/mcp/release-tools/index.js.map +1 -1
  187. package/dist/server/mcp/release-tools/projection.d.ts +11 -2
  188. package/dist/server/mcp/release-tools/projection.js +36 -7
  189. package/dist/server/mcp/release-tools/projection.js.map +1 -1
  190. package/dist/server/mcp/release-tools/types.d.ts +39 -2
  191. package/dist/server/mcp/transagent-tools.d.ts +26 -0
  192. package/dist/server/mcp/transagent-tools.js +75 -0
  193. package/dist/server/mcp/transagent-tools.js.map +1 -0
  194. package/dist/server/plugin-runtime/index.d.ts +17 -0
  195. package/dist/server/plugin-runtime/index.js +16 -0
  196. package/dist/server/plugin-runtime/index.js.map +1 -0
  197. package/dist/server/plugin-runtime/ui.d.ts +15 -0
  198. package/dist/server/plugin-runtime/ui.js +15 -0
  199. package/dist/server/plugin-runtime/ui.js.map +1 -0
  200. package/dist/server/routes/agent-turn.d.ts +17 -1
  201. package/dist/server/routes/agent-turn.js +121 -36
  202. package/dist/server/routes/agent-turn.js.map +1 -1
  203. package/dist/server/routes/briefs.js +12 -4
  204. package/dist/server/routes/briefs.js.map +1 -1
  205. package/dist/server/routes/chat.js +18 -0
  206. package/dist/server/routes/chat.js.map +1 -1
  207. package/dist/server/routes/config.d.ts +8 -0
  208. package/dist/server/routes/config.js +41 -3
  209. package/dist/server/routes/config.js.map +1 -1
  210. package/dist/server/routes/plans.js +13 -0
  211. package/dist/server/routes/plans.js.map +1 -1
  212. package/dist/server/routes/plugins.d.ts +43 -0
  213. package/dist/server/routes/plugins.js +93 -0
  214. package/dist/server/routes/plugins.js.map +1 -0
  215. package/dist/server/routes/threads.js +30 -5
  216. package/dist/server/routes/threads.js.map +1 -1
  217. package/dist/server/serialization/registerAll.d.ts +4 -0
  218. package/dist/server/serialization/registerAll.js +4 -2
  219. package/dist/server/serialization/registerAll.js.map +1 -1
  220. package/dist/server/services/brief.d.ts +30 -8
  221. package/dist/server/services/brief.js +58 -28
  222. package/dist/server/services/brief.js.map +1 -1
  223. package/dist/server/services/chat-context.d.ts +34 -0
  224. package/dist/server/services/chat-context.js +68 -21
  225. package/dist/server/services/chat-context.js.map +1 -1
  226. package/dist/server/services/chat.d.ts +18 -1
  227. package/dist/server/services/chat.js +74 -23
  228. package/dist/server/services/chat.js.map +1 -1
  229. package/dist/server/services/entity-indexer.js +21 -14
  230. package/dist/server/services/entity-indexer.js.map +1 -1
  231. package/dist/server/services/entity-writer.d.ts +2 -3
  232. package/dist/server/services/entity-writer.js.map +1 -1
  233. package/dist/server/services/plan.d.ts +7 -1
  234. package/dist/server/services/plan.js +17 -4
  235. package/dist/server/services/plan.js.map +1 -1
  236. package/dist/server/services/skill-registry.d.ts +31 -2
  237. package/dist/server/services/skill-registry.js +73 -1
  238. package/dist/server/services/skill-registry.js.map +1 -1
  239. package/dist/server/services/transagent-dispatcher.d.ts +60 -0
  240. package/dist/server/services/transagent-dispatcher.js +147 -0
  241. package/dist/server/services/transagent-dispatcher.js.map +1 -0
  242. package/dist/server/skills/brief-author/SKILL.md +26 -17
  243. package/dist/server/workspace/context-cache.d.ts +9 -0
  244. package/dist/server/workspace/context-cache.js +14 -0
  245. package/dist/server/workspace/context-cache.js.map +1 -1
  246. package/dist/server/workspace/project-context.d.ts +3 -0
  247. package/dist/server/workspace/project-context.js +108 -5
  248. package/dist/server/workspace/project-context.js.map +1 -1
  249. package/dist/server/workspace/registry.d.ts +28 -1
  250. package/dist/server/workspace/registry.js +57 -1
  251. package/dist/server/workspace/registry.js.map +1 -1
  252. package/dist/server/workspace/types.d.ts +15 -0
  253. package/dist/shared/entities.d.ts +50 -4
  254. package/dist/shared/entities.js +1 -0
  255. package/dist/shared/entities.js.map +1 -1
  256. package/dist/shared/plugin-host/frontend-manifest.d.ts +56 -0
  257. package/dist/shared/plugin-host/frontend-manifest.js +89 -0
  258. package/dist/shared/plugin-host/frontend-manifest.js.map +1 -0
  259. package/dist/shared/plugin-host/host-api.d.ts +60 -0
  260. package/dist/shared/plugin-host/host-api.js +67 -0
  261. package/dist/shared/plugin-host/host-api.js.map +1 -0
  262. package/dist/shared/plugin-host/manifest.d.ts +194 -0
  263. package/dist/shared/plugin-host/manifest.js +52 -0
  264. package/dist/shared/plugin-host/manifest.js.map +1 -0
  265. package/dist/shared/plugin-host/ui-kit-surface.d.ts +22 -0
  266. package/dist/shared/plugin-host/ui-kit-surface.js +25 -0
  267. package/dist/shared/plugin-host/ui-kit-surface.js.map +1 -0
  268. package/dist/shared/types.d.ts +5 -0
  269. package/package.json +18 -3
  270. package/dist/client/assets/channel-CTF_J4I4.js +0 -1
  271. package/dist/client/assets/classDiagram-4FO5ZUOK-Dt9RLC8r.js +0 -1
  272. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Dt9RLC8r.js +0 -1
  273. package/dist/client/assets/index-DnLELaLA.js +0 -798
  274. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BblFLijq.js +0 -1
@@ -10,10 +10,10 @@ This skill describes how to implement a release brief in **your code repository*
10
10
  `.claude4spec/briefs/` that captures everything you need to ship the change:
11
11
  entity snapshots, section diffs, narrative, acceptance criteria.
12
12
 
13
- **This skill does NOT assume the `c4s` CLI is installed.** Briefs are designed
14
- to be self-contained — you do not need to read the main specification or query
15
- the entity database. If the brief references something you cannot find in its
16
- body, treat that as drift and file a patch (step 4 below).
13
+ Briefs are self-contained, so you do **not** need the `c4s` CLI installed, and
14
+ you do **not** read the main specification or query the entity database. If a
15
+ brief references something you cannot find in its body, treat that as drift and
16
+ file a patch (step 6).
17
17
 
18
18
  ## Workflow
19
19
 
@@ -25,9 +25,9 @@ cat .claude4spec/briefs/<slug>.md
25
25
  ```
26
26
 
27
27
  If `.claude4spec/` is not in your current directory, walk up the directory tree
28
- until you find it (similar to how git finds `.git/`).
28
+ until you find it (like git finds `.git/`).
29
29
 
30
- ### 2. Read the brief as self-contained input
30
+ ### 2. Read the brief
31
31
 
32
32
  Every brief has YAML frontmatter:
33
33
 
@@ -41,61 +41,105 @@ implemented: false
41
41
  ---
42
42
  ```
43
43
 
44
- The body contains everything you need — entity snapshots, section diffs, the
45
- narrative of what changes, and acceptance criteria. **Do not read the main
46
- specification.**
44
+ The body has everything you need — entity snapshots, section diffs, narrative,
45
+ and acceptance criteria.
47
46
 
48
- If the brief is unclear — a missing detail, an ambiguous wording, a decision
49
- you'd otherwise have to guess you have two paths:
47
+ If the brief is unclear (missing detail, ambiguous wording, a decision you'd
48
+ otherwise guess), you have two paths:
50
49
 
51
- **Synchronous (preferred when available).** Ask the specification agent in the
52
- same terminal and continue once you have an answer:
50
+ **Synchronous (preferred when available).** Ask the spec agent and continue once
51
+ you have an answer. The CLAUDE 4 SPEC spec lives at `.claude/skills/specyfikacja`
52
+ (a symlink), not at the repo root — always point to it with `--project`; do
53
+ **not** `cd` into it, or `c4s` reports `PROJECT_NOT_FOUND`.
53
54
 
54
55
  ```bash
55
- c4s ask "Brief nie precyzuje X — czy chodzi o A czy B?" --ct brief --brief <brief-slug>.md
56
+ c4s ask "Brief doesn't specify X — is it A or B?" --ct brief --brief <brief-slug>.md --project .claude/skills/specyfikacja
56
57
  ```
57
58
 
58
59
  Continue the same thread with `c4s ask "..." --thread <threadId>` (the
59
- `threadId` is printed with the answer). This path requires `c4s` installed
60
- *and* a running `npx claude4spec` server. When either is unavailable, skip it.
60
+ `threadId` is printed with the answer). This requires `c4s` installed *and* a
61
+ running `npx claude4spec` server; skip it when either is unavailable.
61
62
 
62
- If `c4s ask` returns `PROJECT_NOT_FOUND` despite a running server, your cwd is
63
- probably reached through a **symlink** (common for `.claude/skills/<name>`
64
- projects): `c4s` resolves `process.cwd()` to the real path, which is NOT the one
65
- registered in `~/.claude4spec/workspaces.json`. Pass the registered (symlink) path
66
- explicitly `--project` is run through `path.resolve`, which does NOT canonicalize
67
- symlinks, so it matches the registry:
63
+ **Asynchronous (always available).** If you cannot ask synchronously, proceed
64
+ with your best judgement and file a patch afterwards (step 6) so the spec-author
65
+ can fold the clarification into the next brief.
66
+
67
+ ### 3. Isolate work (worktree + fresh branch)
68
+
69
+ Never implement a brief on top of your current checkout. Branch from a **fresh
70
+ `main`** and work in a dedicated git worktree under **`./.worktrees/<brief-slug>`**
71
+ (that directory is git-ignored, so the nested checkout never shows up in the
72
+ main repo's `git status`):
68
73
 
69
74
  ```bash
70
- c4s ask "Brief nie precyzuje X — ..." --ct brief --brief <brief-slug>.md --project /abs/path/to/registered/skill-dir
75
+ git fetch origin
76
+ git worktree add .worktrees/<brief-slug> -b brief/<brief-slug> origin/main
77
+ cd .worktrees/<brief-slug>
71
78
  ```
72
79
 
73
- **Asynchronous (always available).** If you cannot ask synchronously, proceed
74
- with your best judgement and file a patch afterwards (step 4) so the
75
- spec-author can fold the clarification into the next brief.
80
+ - Branch name `brief/<brief-slug>` mirrors the repo's `feat/…` convention.
81
+ - If `origin` is not configured, branch from local `main`: `git checkout main &&
82
+ git pull`, then `git worktree add .worktrees/<brief-slug> -b brief/<brief-slug> main`.
76
83
 
77
- ### 3. Implement
84
+ **Copy the spec into the worktree.** The smoke test (step 5) runs the dev server
85
+ against the CLAUDE 4 SPEC spec, but `.claude/skills/specyfikacja` is a **symlink**
86
+ to a *separate* repo and is git-ignored — a fresh worktree checkout doesn't contain
87
+ it at all. Pointing the dev server at the real symlinked dir also risks **mutating
88
+ the canonical docs/db**. So make a disposable copy inside the worktree, dereferencing
89
+ the symlink:
78
90
 
79
- Standard code flow in your target repository: read existing code, plan, edit,
80
- test. Stay focused on what the brief specifies.
91
+ ```bash
92
+ # -L follows the symlink so the worktree gets REAL files, not a dangling relative
93
+ # link (a verbatim copy would point outside the worktree and break). The dest path
94
+ # is git-ignored, so the copy stays out of `git status` and `git worktree remove`
95
+ # discards it together with the worktree.
96
+ mkdir -p .claude/skills
97
+ cp -RL ../../.claude/skills/specyfikacja .claude/skills/specyfikacja
98
+ ```
81
99
 
82
- ### 4. Feedback loop (patches)
100
+ - `../../` from the worktree root (`.worktrees/<brief-slug>`) reaches the main repo
101
+ root, where the live symlink lives.
102
+ - If the source symlink is absent (no private spec repo checked out locally), skip
103
+ this copy and the synchronous smoke test, and rely on unit tests — same as the
104
+ "skip when unavailable" rule for `c4s ask` in step 2.
83
105
 
84
- When you discover that the brief diverges from reality — a missing detail, an
85
- incorrect assumption, an edge case not covered, or anything else the
86
- spec-author should know — write a patch file:
106
+ ### 4. Implement
87
107
 
88
- ```sh
89
- mkdir -p .claude4spec/patches
108
+ Standard code flow: read existing code, plan, edit, test. Stay focused on what
109
+ the brief specifies. Commit your work on the `brief/<brief-slug>` branch.
110
+
111
+ ### 5. Smoke-test locally
112
+
113
+ Before opening the PR, launch the app and exercise the change — don't hand off on
114
+ green unit tests alone.
115
+
116
+ ```bash
117
+ # Run the CLI via `npx tsx` (NOT `npm run dev:sandbox`, which uses `tsx watch`).
118
+ # In a worktree whose node_modules symlinks OUTSIDE the worktree, `tsx watch`
119
+ # follows the symlink, sees Vite's .vite-temp/*.timestamp churn, and restarts in
120
+ # an infinite loop. Plain `npx tsx` (no watch) avoids it.
121
+ npx tsx src/bin/claude4spec.ts --mode dev --cwd .claude/skills/specyfikacja --pages . --port 5555
90
122
  ```
91
123
 
92
- Create `.claude4spec/patches/<brief-slug>-<short-desc>.md` with this format:
124
+ - `--cwd .claude/skills/specyfikacja` points at the **worktree's local copy** made
125
+ in step 3 — *not* the symlinked source. So a crash or db write during the smoke
126
+ test can never damage the real specification.
127
+ - **Port 5555 is our test convention.** If it's taken (`EADDRINUSE`), increment —
128
+ `--port 5556`, `5557`, … — until one is free.
129
+ - Open the printed URL, verify the brief's behaviour, then stop the server
130
+ (Ctrl-C). If the smoke test reveals drift, file a patch (step 6).
131
+
132
+ ### 6. Feedback loop (patches)
133
+
134
+ When the brief diverges from reality — a missing detail, an incorrect assumption,
135
+ an edge case not covered, or anything else the spec-author should know — write a
136
+ patch file `.claude4spec/patches/<brief-slug>-<short-desc>.md`:
93
137
 
94
138
  ```markdown
95
139
  ---
96
140
  type: patch
97
141
  brief: v0-1-16-to-v0-1-17.md # path relative to briefs/
98
- patch_kind: drift # drift | missing | incorrect | clarification
142
+ patch_kind: drift
99
143
  created_at: 2026-05-11T17:32:00Z
100
144
  created_by: claude-code # or "cursor", "aider", ...
101
145
  ---
@@ -111,40 +155,56 @@ created_by: claude-code # or "cursor", "aider", ...
111
155
  …what the spec-author should consider in a follow-up brief or entity edits…
112
156
  ```
113
157
 
114
- Patch-kind values:
158
+ `patch_kind` values:
115
159
 
116
160
  - `drift` — the brief described behavior X, but the codebase already does Y.
117
161
  - `missing` — the brief is silent on a detail you had to decide yourself.
118
162
  - `incorrect` — the brief is factually wrong about existing code.
119
163
  - `clarification` — the brief is ambiguous; you guessed but it should be made
120
- explicit for next time.
164
+ explicit next time.
121
165
 
122
- The `.claude4spec/patches/` directory is created **lazily** — only when you
123
- file your first patch. The claude4spec server does NOT create it.
166
+ Create `.claude4spec/patches/` lazily — only when you file your first patch
167
+ (`mkdir -p .claude4spec/patches`). The claude4spec server does NOT create it.
124
168
 
125
- ### 5. Mark brief as implemented
169
+ ### 7. Open a draft PR and STOP
126
170
 
127
- When the implementation is genuinely finished code committed, tests green,
128
- merged to main / accepted by the user — flip the brief's frontmatter to
129
- `implemented: true`:
171
+ Push the branch and open a **draft** PR against `main`, then hand off:
130
172
 
131
173
  ```bash
132
- # Option A Edit tool: change the line `implemented: false` → `implemented: true`.
133
- # Option B yq (idempotent; adds the field to legacy briefs that never had it):
134
- yq -i '.implemented = true' .claude4spec/briefs/<brief-slug>.md
174
+ git push -u origin brief/<brief-slug>
175
+ gh pr create --draft --base main \
176
+ --title "<brief-slug>: <short title>" \
177
+ --body "Implements brief .claude4spec/briefs/<brief-slug>.md
178
+
179
+ <one-paragraph summary of what changed + how it was tested>"
135
180
  ```
136
181
 
137
- `implemented: true` is a **declaration**, not a computed fact derived from git.
138
- A revert on main does NOT roll the flag back. Set it ONLY when implementation
139
- is realistically done — never proactively or "just in case".
182
+ **Do NOT run `gh pr merge`.** Review and merge are the human's call. Stop here and
183
+ report the PR URL.
184
+
185
+ ### 8. Mark brief as implemented
186
+
187
+ `implemented: true` is a **declaration**, set ONLY after the draft PR is reviewed
188
+ and merged to main (or otherwise accepted) — never at PR-open time, never
189
+ proactively, and a later revert on main does NOT roll it back. When implementation
190
+ is genuinely done (code merged, tests green), flip the frontmatter:
191
+
192
+ ```bash
193
+ # Option A — Edit tool: change `implemented: false` → `implemented: true`.
194
+ # Option B — yq (idempotent; adds the field to legacy briefs that lack it):
195
+ yq -i '.implemented = true' .claude4spec/briefs/<brief-slug>.md
196
+ ```
140
197
 
141
- ### 6. Hand-off
198
+ ### 9. Hand-off
142
199
 
143
- The spec-author reads patches manually (`ls .claude4spec/patches/`, `cat`)
144
- and folds them into the next brief or entity edits. There is no UI listing in
145
- this release — patches are raw markdown.
200
+ The spec-author reads patches manually (`ls .claude4spec/patches/`, `cat`) and
201
+ folds them into the next brief or entity edits. There is no UI listing in this
202
+ release — patches are raw markdown.
146
203
 
147
204
  ## Notes
148
205
 
149
- This file is **fully managed** by claude4spec it is overwritten on every
150
- server start when its rendered content changes. Do not edit it by hand.
206
+ This is a **base skill** generated by claude4spec, customized for this project.
207
+ The base copy covers reading briefs and asking the c4s agent questions; this copy
208
+ under `.claude/skills/` additionally pins our git/PR flow (worktree → fresh branch
209
+ → draft PR → stop). It is **yours to edit** — nothing overwrites it. (The
210
+ `.claude4spec/skills/` copy *is* refreshed on server start; this one is not.)
package/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.0.22] - 2026-06-27
9
+
10
+ ### Added
11
+ - **Published Host API types.** The CLI package now ships TypeScript declarations under type-only subpaths `@inharness-ai/claude4spec/plugin-runtime` and `@inharness-ai/claude4spec/plugin-runtime/ui`, plus an ambient binding (`@inharness-ai/claude4spec/plugin-runtime/ambient`) so a single reference types both the `@c4s/plugin-runtime` value specifier and all type names. Plugin authors reference the host's published types directly instead of vendoring a `c4s-runtime.d.ts` copy. `hostApiVersion` is unchanged — this is additive DX infrastructure. (brief 0.1.85→0.1.86)
12
+ - **Host UI Kit** (`@c4s/plugin-runtime/ui`, M34/L12) — a presentational component catalog delivered to plugins through the import-map shim: four `stable` core components (`EntityListHeader`, `DetailPanelShell`, `FieldRow`, `FieldGrid`) whose prop contracts are part of the versioned surface, plus experimental list/action/form components and a token bridge.
13
+ - **M33 plugin system (phase 3)** — the database-table entity now ships as the preinstalled `@inharness-ai/c4s-plugin-simple-database-tables` plugin; workspace-tier plugin frontend serving behind a trust gate; a plugin page-routing contract; per-plugin Settings and editor-command hot-reload.
14
+
15
+ ### Fixed
16
+ - The preinstalled database-table plugin was referenced under a non-existent unscoped name; corrected to the published scoped `@inharness-ai/c4s-plugin-simple-database-tables` so a registry install resolves.
17
+ - Workspace plugin frontend was dropped when the install name differed from the package's `package.json` name.
18
+
19
+ ## [1.0.21] - 2026-06-22
20
+
21
+ ### Added
22
+ - Transagents — agents can now delegate work to nested child threads. A new `TransagentDispatcher` and `transagent-tools` MCP server manage parent→child thread relationships (migration `041`), and the client renders child activity in a dedicated `TransagentPanel` inside `ChatOverlay`, with `useChat` tracking child-thread start/complete state.
23
+ - Pagination and summary options for the `release-tools` MCP server — `release_list` and `release_show` accept `limit`/`offset`, and `release_diff` gains a `summaryOnly` mode that returns a light delta map (identifiers + operation types only, no full snapshots).
24
+
25
+ ### Changed
26
+ - `c4s-brief-implementer` skill now documents pointing `c4s ask` at the symlinked spec dir via `--project .claude/skills/specyfikacja` (and warns against `cd`-ing into it, which resolves to the real path → `PROJECT_NOT_FOUND`).
27
+
28
+ ### Fixed
29
+ - Chat thread-list over-fetch and frontend refetch storm. Server-side, `listThreads`/`forBrief`/`forPatch` drop the `LEFT JOIN chat_message + GROUP BY` (which aggregated `COUNT` over the full message table before `LIMIT`) for a correlated indexed `COUNT` subquery and a shared column list that omits the large `initial_system_prompt` blob — ~1962ms → ~10ms on a 506-thread/37k-message DB. `entity-indexer.indexAll` now rebuilds inside one transaction (~2s → ~117ms). Frontend uses a single shared `ThreadListProvider` with an in-flight guard, pagination, and a light `/entities/counts` aggregate replacing five full entity-list fetches.
30
+
8
31
  ## [1.0.20] - 2026-06-19
9
32
 
10
33
  ### Added
@@ -214,6 +237,7 @@ Initial public release.
214
237
  - Acceptance Criteria entity and tooling.
215
238
  - Briefs and patches workflow for spec-driven implementation.
216
239
 
240
+ [1.0.21]: https://github.com/InHarness/claude4spec/compare/v1.0.20...v1.0.21
217
241
  [1.0.20]: https://github.com/InHarness/claude4spec/compare/v1.0.19...v1.0.20
218
242
  [1.0.19]: https://github.com/InHarness/claude4spec/compare/v1.0.18...v1.0.19
219
243
  [1.0.18]: https://github.com/InHarness/claude4spec/compare/v1.0.17...v1.0.18
@@ -233,3 +257,5 @@ Initial public release.
233
257
  [1.0.4]: https://github.com/InHarness/claude4spec/compare/v1.0.3...v1.0.4
234
258
  [1.0.3]: https://github.com/InHarness/claude4spec/compare/v1.0.2...v1.0.3
235
259
  [1.0.2]: https://github.com/InHarness/claude4spec/compare/v1.0.1...v1.0.2
260
+
261
+ [1.0.22]: https://github.com/InHarness/claude4spec/compare/v1.0.21...v1.0.22
@@ -0,0 +1,18 @@
1
+ import type { ParsedArgs } from '../args.js';
2
+ /**
3
+ * `c4s agent` — generic synchronous agent turn over any thread context (M11).
4
+ *
5
+ * The verbose, developer-facing surface: defaults to `output: 'full'`, so it
6
+ * prints every message of the turn (assistant text + reasoning + tool rows)
7
+ * before the final answer. Cienki wrapper nad `runAgent(...)`; warstwa CLI to
8
+ * parsowanie flag, mapowanie kodow bledow na `CliError`, formatowanie outputu.
9
+ *
10
+ * c4s agent "<msg>" --ct chat
11
+ * c4s agent "<msg>" --ct ask # read-only peer consult
12
+ * c4s agent "<msg>" --ct brief --brief <path>
13
+ * c4s agent "<msg>" --thread <id> # continue (—ct not needed)
14
+ *
15
+ * The terse peer-consult shorthand lives in `ask.ts` (hardcodes --ct=ask,
16
+ * output: 'final').
17
+ */
18
+ export declare function runAgentCmd(args: ParsedArgs): Promise<void>;
@@ -0,0 +1,102 @@
1
+ import { optionalString } from '../args.js';
2
+ import { CliError } from '../errors.js';
3
+ import { AgentError, runAgent, } from '../../../core/agent/run-agent.js';
4
+ /**
5
+ * `c4s agent` — generic synchronous agent turn over any thread context (M11).
6
+ *
7
+ * The verbose, developer-facing surface: defaults to `output: 'full'`, so it
8
+ * prints every message of the turn (assistant text + reasoning + tool rows)
9
+ * before the final answer. Cienki wrapper nad `runAgent(...)`; warstwa CLI to
10
+ * parsowanie flag, mapowanie kodow bledow na `CliError`, formatowanie outputu.
11
+ *
12
+ * c4s agent "<msg>" --ct chat
13
+ * c4s agent "<msg>" --ct ask # read-only peer consult
14
+ * c4s agent "<msg>" --ct brief --brief <path>
15
+ * c4s agent "<msg>" --thread <id> # continue (—ct not needed)
16
+ *
17
+ * The terse peer-consult shorthand lives in `ask.ts` (hardcodes --ct=ask,
18
+ * output: 'final').
19
+ */
20
+ export async function runAgentCmd(args) {
21
+ const message = args.positional[0];
22
+ if (!message || !message.trim()) {
23
+ throw new CliError('INVALID_ARGS', 'message is required: c4s agent "<msg>" --ct chat');
24
+ }
25
+ const threadId = optionalString(args, 'thread');
26
+ const ct = optionalString(args, 'ct');
27
+ const briefPath = optionalString(args, 'brief');
28
+ const server = optionalString(args, 'server');
29
+ const project = args.project;
30
+ const workspace = args.workspace;
31
+ if (project && server) {
32
+ process.stderr.write('warning: both --project and --server given; --server wins, --project ignored\n');
33
+ }
34
+ if (!threadId) {
35
+ // Early CLI-level validation (livelier hints); runAgent re-validates at the
36
+ // library layer.
37
+ if (ct !== 'chat' && ct !== 'brief' && ct !== 'patch' && ct !== 'ask') {
38
+ throw new CliError('INVALID_ARGS', '--ct must be chat|brief|patch|ask (or pass --thread <id> to continue a thread)');
39
+ }
40
+ if (ct === 'patch') {
41
+ throw new CliError('INVALID_ARGS', 'c4s agent cannot create a patch thread; pass --thread <id> to continue one');
42
+ }
43
+ if (ct === 'brief' && !briefPath) {
44
+ throw new CliError('INVALID_ARGS', '--ct brief requires --brief <path>');
45
+ }
46
+ }
47
+ let result;
48
+ try {
49
+ result = await runAgent({
50
+ message,
51
+ project,
52
+ workspace,
53
+ server,
54
+ contextType: ct,
55
+ threadId,
56
+ briefPath,
57
+ output: 'full',
58
+ });
59
+ }
60
+ catch (err) {
61
+ if (err instanceof AgentError) {
62
+ throw new CliError(err.code, err.message, err.hint);
63
+ }
64
+ throw err;
65
+ }
66
+ // --- output --------------------------------------------------------------
67
+ if (args.format === 'text') {
68
+ // Verbose: every message of the turn (text + reasoning + tool rows), then
69
+ // the final answer; threadId hint on stderr.
70
+ for (const m of result.messages ?? []) {
71
+ process.stdout.write(formatMessage(m) + '\n');
72
+ }
73
+ process.stdout.write('\n' + result.answer + '\n');
74
+ process.stderr.write(`thread: ${result.threadId} (continue: c4s agent "..." --thread ${result.threadId})\n`);
75
+ }
76
+ else {
77
+ process.stdout.write(JSON.stringify({ threadId: result.threadId, answer: result.answer, messages: result.messages ?? [] }, null, 2) + '\n');
78
+ }
79
+ }
80
+ /** Render one turn message for the verbose text output. */
81
+ function formatMessage(m) {
82
+ const label = m.toolName ? `${m.role}/${m.toolName}` : m.role;
83
+ const prefix = m.subagentTaskId ? `[${label} · sub]` : `[${label}]`;
84
+ return `${prefix} ${extractText(m.content)}`;
85
+ }
86
+ /**
87
+ * Reasoning + some tool rows persist `content` as `JSON.stringify({ text, ... })`.
88
+ * Unwrap the `text` field for display; fall back to the raw string otherwise.
89
+ */
90
+ function extractText(content) {
91
+ try {
92
+ const parsed = JSON.parse(content);
93
+ if (parsed && typeof parsed === 'object' && typeof parsed.text === 'string') {
94
+ return parsed.thinking ? `(reasoning) ${parsed.text}` : parsed.text;
95
+ }
96
+ }
97
+ catch {
98
+ /* not JSON — raw content below */
99
+ }
100
+ return content;
101
+ }
102
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,16 @@
1
1
  import type { ParsedArgs } from '../args.js';
2
2
  /**
3
- * `c4s ask` — synchroniczny kanal Q&A z agentem specyfikacji (M11).
3
+ * `c4s ask` — read-only peer-consult shorthand (M11 / 0.1.79).
4
4
  *
5
- * Cienki wrapper nad `runAsk(...)` z `core/ask/run-ask.ts`. Wspolne ciezary
6
- * (resolve project, health-check, create-thread, run-turn) zyja w core'rze;
7
- * tutaj zostala tylko warstwa CLI: parsowanie flag, mapowanie kodow bledow
8
- * na `CliError`, formatowanie outputu (stdout/stderr split, --format json|text).
5
+ * Narrowed alias of `c4s agent`: hardcodes `contextType='ask'` and
6
+ * `output: 'final'` (terse `{ threadId, answer }`). It is the canonical
7
+ * peer-consult shorthand and the CLI twin of the MCP `ask` tool — the peer
8
+ * answers read-only, never mutating its own spec. `--ct` / `--brief` are
9
+ * rejected (use `c4s agent` for other contexts).
9
10
  *
10
- * c4s ask "<msg>" --ct chat
11
- * c4s ask "<msg>" --ct brief --brief <path>
12
- * c4s ask "<msg>" --thread <id>
11
+ * c4s ask "<msg>" # consult the peer for the cwd's project
12
+ * c4s ask "<msg>" --project <p> # consult a specific peer
13
+ * c4s ask "<msg>" --thread <id> # continue an existing ask thread
13
14
  */
14
15
  export declare function runAsk_cli(args: ParsedArgs): Promise<void>;
15
16
  export { runAsk_cli as runAsk };
@@ -1,61 +1,53 @@
1
1
  import { optionalString } from '../args.js';
2
2
  import { CliError } from '../errors.js';
3
- import { AskError, runAsk } from '../../../core/ask/run-ask.js';
3
+ import { AgentError, runAgent } from '../../../core/agent/run-agent.js';
4
4
  /**
5
- * `c4s ask` — synchroniczny kanal Q&A z agentem specyfikacji (M11).
5
+ * `c4s ask` — read-only peer-consult shorthand (M11 / 0.1.79).
6
6
  *
7
- * Cienki wrapper nad `runAsk(...)` z `core/ask/run-ask.ts`. Wspolne ciezary
8
- * (resolve project, health-check, create-thread, run-turn) zyja w core'rze;
9
- * tutaj zostala tylko warstwa CLI: parsowanie flag, mapowanie kodow bledow
10
- * na `CliError`, formatowanie outputu (stdout/stderr split, --format json|text).
7
+ * Narrowed alias of `c4s agent`: hardcodes `contextType='ask'` and
8
+ * `output: 'final'` (terse `{ threadId, answer }`). It is the canonical
9
+ * peer-consult shorthand and the CLI twin of the MCP `ask` tool — the peer
10
+ * answers read-only, never mutating its own spec. `--ct` / `--brief` are
11
+ * rejected (use `c4s agent` for other contexts).
11
12
  *
12
- * c4s ask "<msg>" --ct chat
13
- * c4s ask "<msg>" --ct brief --brief <path>
14
- * c4s ask "<msg>" --thread <id>
13
+ * c4s ask "<msg>" # consult the peer for the cwd's project
14
+ * c4s ask "<msg>" --project <p> # consult a specific peer
15
+ * c4s ask "<msg>" --thread <id> # continue an existing ask thread
15
16
  */
16
17
  export async function runAsk_cli(args) {
17
18
  const message = args.positional[0];
18
19
  if (!message || !message.trim()) {
19
- throw new CliError('INVALID_ARGS', 'message is required: c4s ask "<msg>" --ct chat');
20
+ throw new CliError('INVALID_ARGS', 'message is required: c4s ask "<msg>"');
21
+ }
22
+ // `ask` is locked to the read-only ask context — these flags belong to
23
+ // `c4s agent`, not the shorthand.
24
+ if (optionalString(args, 'ct') !== undefined) {
25
+ throw new CliError('INVALID_ARGS', '`c4s ask` is always --ct=ask; use `c4s agent` to pick a context');
26
+ }
27
+ if (optionalString(args, 'brief') !== undefined) {
28
+ throw new CliError('INVALID_ARGS', '`c4s ask` does not take --brief; use `c4s agent --ct brief`');
20
29
  }
21
30
  const threadId = optionalString(args, 'thread');
22
- const ct = optionalString(args, 'ct');
23
- const briefPath = optionalString(args, 'brief');
24
31
  const server = optionalString(args, 'server');
25
32
  const project = args.project;
26
33
  const workspace = args.workspace;
27
34
  if (project && server) {
28
- // Mutex `project` vs `server` — gdy oba podane, `server` wygrywa; CLI
29
- // dopisuje warning na stderr (dla MCP analogicznie, ale przez tool_result).
30
35
  process.stderr.write('warning: both --project and --server given; --server wins, --project ignored\n');
31
36
  }
32
- if (!threadId) {
33
- // Wczesna walidacja flag CLI (drobne komunikaty user-facing); runAsk
34
- // robi to samo na poziomie biblioteki, ale tutaj dajemy zywsze hinty.
35
- if (ct !== 'chat' && ct !== 'brief' && ct !== 'patch') {
36
- throw new CliError('INVALID_ARGS', '--ct must be chat|brief|patch (or pass --thread <id> to continue a thread)');
37
- }
38
- if (ct === 'patch') {
39
- throw new CliError('INVALID_ARGS', 'c4s ask cannot create a patch thread; pass --thread <id> to continue one');
40
- }
41
- if (ct === 'brief' && !briefPath) {
42
- throw new CliError('INVALID_ARGS', '--ct brief requires --brief <path>');
43
- }
44
- }
45
37
  let result;
46
38
  try {
47
- result = await runAsk({
39
+ result = await runAgent({
48
40
  message,
49
41
  project,
50
42
  workspace,
51
43
  server,
52
- contextType: ct,
44
+ contextType: 'ask',
53
45
  threadId,
54
- briefPath,
46
+ output: 'final',
55
47
  });
56
48
  }
57
49
  catch (err) {
58
- if (err instanceof AskError) {
50
+ if (err instanceof AgentError) {
59
51
  throw new CliError(err.code, err.message, err.hint);
60
52
  }
61
53
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/ask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/ask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAqB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,sCAAsC,CAAC,CAAC;IAC7E,CAAC;IAED,uEAAuE;IACvE,kCAAkC;IAClC,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,iEAAiE,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,6DAA6D,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAEjC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,MAA4C,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC;YACtB,OAAO;YACP,OAAO;YACP,SAAS;YACT,MAAM;YACN,WAAW,EAAE,KAAK;YAClB,QAAQ;YACR,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAoB,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAC3C,kDAAkD;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,QAAQ,sCAAsC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC7G,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { ParsedArgs } from '../args.js';
2
- export declare function runCatalog(args: ParsedArgs): void;
2
+ export declare function runCatalog(args: ParsedArgs): Promise<void>;
@@ -3,8 +3,8 @@ import path from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { createContext } from '../context.js';
5
5
  import { writeOutput } from '../output.js';
6
- export function runCatalog(args) {
7
- const ctx = createContext(args);
6
+ export async function runCatalog(args) {
7
+ const ctx = await createContext(args);
8
8
  try {
9
9
  const catalog = ctx.registry.catalog(ctx.reader);
10
10
  writeOutput({ ...catalog, claude4spec: readPackageVersion() }, args);
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,IAAgB;IACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,6EAA6E;QAC7E,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;SACrC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;gBACjF,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB;IAC/C,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,6EAA6E;QAC7E,MAAM,KAAK,GAAG;YACZ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;SACrC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAyB,CAAC;gBACjF,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { type ParsedArgs } from '../args.js';
2
- export declare function runDescribe(args: ParsedArgs): void;
2
+ export declare function runDescribe(args: ParsedArgs): Promise<void>;
@@ -3,11 +3,11 @@ import { createContext } from '../context.js';
3
3
  import { CliError } from '../errors.js';
4
4
  import { writeOutput } from '../output.js';
5
5
  import { normalizeEntityType, normalizeViewKind } from '../type-validation.js';
6
- export function runDescribe(args) {
6
+ export async function runDescribe(args) {
7
7
  const type = normalizeEntityType(requireString(args, 'type'));
8
8
  const viewFlag = optionalString(args, 'view');
9
9
  const view = viewFlag ? normalizeViewKind(viewFlag) : undefined;
10
- const ctx = createContext(args);
10
+ const ctx = await createContext(args);
11
11
  try {
12
12
  const result = ctx.registry.describe(type, view, ctx.db);
13
13
  if (!result) {
@@ -1 +1 @@
1
- {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,gBAAgB,IAAI,iBAAiB,EACrC,gDAAgD,CACjD,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAChD,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,gBAAgB,IAAI,iBAAiB,EACrC,gDAAgD,CACjD,CAAC;QACJ,CAAC;QACD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import type { ParsedArgs } from '../args.js';
2
- export declare function runDetail(args: ParsedArgs): void;
2
+ export declare function runDetail(args: ParsedArgs): Promise<void>;
@@ -4,10 +4,10 @@ import { CliError } from '../errors.js';
4
4
  import { writeOutput } from '../output.js';
5
5
  import { normalizeEntityType } from '../type-validation.js';
6
6
  import { withMeta } from './_meta.js';
7
- export function runDetail(args) {
7
+ export async function runDetail(args) {
8
8
  const type = normalizeEntityType(requireString(args, 'type'));
9
9
  const slug = requireString(args, 'slug');
10
- const ctx = createContext(args);
10
+ const ctx = await createContext(args);
11
11
  try {
12
12
  const entity = ctx.reader.getEntity(type, slug);
13
13
  if (!entity)