hammoc 1.5.0 → 1.7.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 (372) hide show
  1. package/README.md +12 -4
  2. package/package.json +2 -2
  3. package/packages/client/dist/assets/{agentExampleHighlight-BgwTm15v.js → agentExampleHighlight-7Olvqdpf.js} +1 -1
  4. package/packages/client/dist/assets/{commandTokenHighlight-BljHwnrK.js → commandTokenHighlight-DtKwh4lx.js} +1 -1
  5. package/packages/client/dist/assets/index-B09doO8H.js +139 -0
  6. package/packages/client/dist/assets/index-Bee52CKG.js +1569 -0
  7. package/packages/client/dist/assets/index-CVy582lU.css +32 -0
  8. package/packages/client/dist/assets/{index-D3LxqW3f.js → index-DLHBUw8c.js} +1 -1
  9. package/packages/client/dist/assets/{snippetTokenHighlight-DWsaQXX0.js → snippetTokenHighlight-C8O688f4.js} +1 -1
  10. package/packages/client/dist/index.html +2 -2
  11. package/packages/client/dist/sw.js +2 -2
  12. package/packages/server/dist/_dbg_agent_rows.d.ts +2 -0
  13. package/packages/server/dist/_dbg_agent_rows.d.ts.map +1 -0
  14. package/packages/server/dist/_dbg_agent_rows.js +60 -0
  15. package/packages/server/dist/_dbg_agent_rows.js.map +1 -0
  16. package/packages/server/dist/_dbg_flicker.d.ts +2 -0
  17. package/packages/server/dist/_dbg_flicker.d.ts.map +1 -0
  18. package/packages/server/dist/_dbg_flicker.js +38 -0
  19. package/packages/server/dist/_dbg_flicker.js.map +1 -0
  20. package/packages/server/dist/_harness_cli.d.ts +2 -0
  21. package/packages/server/dist/_harness_cli.d.ts.map +1 -0
  22. package/packages/server/dist/_harness_cli.js +81 -0
  23. package/packages/server/dist/_harness_cli.js.map +1 -0
  24. package/packages/server/dist/_harness_provcard.d.ts +2 -0
  25. package/packages/server/dist/_harness_provcard.d.ts.map +1 -0
  26. package/packages/server/dist/_harness_provcard.js +67 -0
  27. package/packages/server/dist/_harness_provcard.js.map +1 -0
  28. package/packages/server/dist/_replay_dump.d.ts +2 -0
  29. package/packages/server/dist/_replay_dump.d.ts.map +1 -0
  30. package/packages/server/dist/_replay_dump.js +62 -0
  31. package/packages/server/dist/_replay_dump.js.map +1 -0
  32. package/packages/server/dist/app.d.ts.map +1 -1
  33. package/packages/server/dist/app.js +6 -0
  34. package/packages/server/dist/app.js.map +1 -1
  35. package/packages/server/dist/config/index.d.ts.map +1 -1
  36. package/packages/server/dist/config/index.js.map +1 -1
  37. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts +41 -0
  38. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts.map +1 -0
  39. package/packages/server/dist/controllers/bmadCoreConfigController.js +172 -0
  40. package/packages/server/dist/controllers/bmadCoreConfigController.js.map +1 -0
  41. package/packages/server/dist/controllers/contextBuilderController.d.ts +43 -0
  42. package/packages/server/dist/controllers/contextBuilderController.d.ts.map +1 -0
  43. package/packages/server/dist/controllers/contextBuilderController.js +159 -0
  44. package/packages/server/dist/controllers/contextBuilderController.js.map +1 -0
  45. package/packages/server/dist/controllers/harnessAgentController.d.ts +7 -0
  46. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -1
  47. package/packages/server/dist/controllers/harnessAgentController.js +33 -0
  48. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -1
  49. package/packages/server/dist/controllers/harnessBundleController.d.ts +37 -0
  50. package/packages/server/dist/controllers/harnessBundleController.d.ts.map +1 -0
  51. package/packages/server/dist/controllers/harnessBundleController.js +312 -0
  52. package/packages/server/dist/controllers/harnessBundleController.js.map +1 -0
  53. package/packages/server/dist/controllers/harnessCommandController.d.ts +7 -0
  54. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -1
  55. package/packages/server/dist/controllers/harnessCommandController.js +33 -0
  56. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -1
  57. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -1
  58. package/packages/server/dist/controllers/harnessHookController.js +44 -1
  59. package/packages/server/dist/controllers/harnessHookController.js.map +1 -1
  60. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -1
  61. package/packages/server/dist/controllers/harnessMcpController.js +62 -1
  62. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -1
  63. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +9 -0
  64. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -1
  65. package/packages/server/dist/controllers/harnessShareScopeController.js +48 -1
  66. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -1
  67. package/packages/server/dist/controllers/marketplaceController.d.ts +19 -0
  68. package/packages/server/dist/controllers/marketplaceController.d.ts.map +1 -0
  69. package/packages/server/dist/controllers/marketplaceController.js +74 -0
  70. package/packages/server/dist/controllers/marketplaceController.js.map +1 -0
  71. package/packages/server/dist/controllers/observabilityController.d.ts +32 -0
  72. package/packages/server/dist/controllers/observabilityController.d.ts.map +1 -0
  73. package/packages/server/dist/controllers/observabilityController.js +148 -0
  74. package/packages/server/dist/controllers/observabilityController.js.map +1 -0
  75. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  76. package/packages/server/dist/controllers/projectController.js +7 -1
  77. package/packages/server/dist/controllers/projectController.js.map +1 -1
  78. package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
  79. package/packages/server/dist/controllers/sessionController.js +16 -4
  80. package/packages/server/dist/controllers/sessionController.js.map +1 -1
  81. package/packages/server/dist/controllers/systemBrowseController.d.ts +33 -0
  82. package/packages/server/dist/controllers/systemBrowseController.d.ts.map +1 -0
  83. package/packages/server/dist/controllers/systemBrowseController.js +105 -0
  84. package/packages/server/dist/controllers/systemBrowseController.js.map +1 -0
  85. package/packages/server/dist/handlers/streamCallbacks.d.ts +10 -0
  86. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  87. package/packages/server/dist/handlers/streamCallbacks.js +25 -4
  88. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  89. package/packages/server/dist/handlers/websocket.d.ts +43 -3
  90. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  91. package/packages/server/dist/handlers/websocket.js +385 -93
  92. package/packages/server/dist/handlers/websocket.js.map +1 -1
  93. package/packages/server/dist/index.js +2 -0
  94. package/packages/server/dist/index.js.map +1 -1
  95. package/packages/server/dist/locales/en/server.json +17 -0
  96. package/packages/server/dist/locales/es/server.json +17 -0
  97. package/packages/server/dist/locales/ja/server.json +17 -0
  98. package/packages/server/dist/locales/ko/server.json +17 -0
  99. package/packages/server/dist/locales/pt/server.json +17 -0
  100. package/packages/server/dist/locales/zh-CN/server.json +17 -0
  101. package/packages/server/dist/routes/harness.d.ts.map +1 -1
  102. package/packages/server/dist/routes/harness.js +58 -0
  103. package/packages/server/dist/routes/harness.js.map +1 -1
  104. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  105. package/packages/server/dist/routes/preferences.js +12 -2
  106. package/packages/server/dist/routes/preferences.js.map +1 -1
  107. package/packages/server/dist/routes/systemBrowse.d.ts +17 -0
  108. package/packages/server/dist/routes/systemBrowse.d.ts.map +1 -0
  109. package/packages/server/dist/routes/systemBrowse.js +22 -0
  110. package/packages/server/dist/routes/systemBrowse.js.map +1 -0
  111. package/packages/server/dist/services/bmadCoreConfigService.d.ts +86 -0
  112. package/packages/server/dist/services/bmadCoreConfigService.d.ts.map +1 -0
  113. package/packages/server/dist/services/bmadCoreConfigService.js +175 -0
  114. package/packages/server/dist/services/bmadCoreConfigService.js.map +1 -0
  115. package/packages/server/dist/services/bmadStatusService.d.ts +9 -0
  116. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  117. package/packages/server/dist/services/bmadStatusService.js +77 -13
  118. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  119. package/packages/server/dist/services/chatEngine.d.ts +81 -0
  120. package/packages/server/dist/services/chatEngine.d.ts.map +1 -0
  121. package/packages/server/dist/services/chatEngine.js +2 -0
  122. package/packages/server/dist/services/chatEngine.js.map +1 -0
  123. package/packages/server/dist/services/chatEngineFactory.d.ts +15 -0
  124. package/packages/server/dist/services/chatEngineFactory.d.ts.map +1 -0
  125. package/packages/server/dist/services/chatEngineFactory.js +28 -0
  126. package/packages/server/dist/services/chatEngineFactory.js.map +1 -0
  127. package/packages/server/dist/services/chatService.d.ts +34 -26
  128. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  129. package/packages/server/dist/services/chatService.js +44 -104
  130. package/packages/server/dist/services/chatService.js.map +1 -1
  131. package/packages/server/dist/services/cliChatEngine.d.ts +198 -0
  132. package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -0
  133. package/packages/server/dist/services/cliChatEngine.js +2977 -0
  134. package/packages/server/dist/services/cliChatEngine.js.map +1 -0
  135. package/packages/server/dist/services/cliGridCards.d.ts +87 -0
  136. package/packages/server/dist/services/cliGridCards.d.ts.map +1 -0
  137. package/packages/server/dist/services/cliGridCards.js +298 -0
  138. package/packages/server/dist/services/cliGridCards.js.map +1 -0
  139. package/packages/server/dist/services/cliGridRegion.d.ts +44 -0
  140. package/packages/server/dist/services/cliGridRegion.d.ts.map +1 -0
  141. package/packages/server/dist/services/cliGridRegion.js +94 -0
  142. package/packages/server/dist/services/cliGridRegion.js.map +1 -0
  143. package/packages/server/dist/services/cliModalDetect.d.ts +299 -0
  144. package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -0
  145. package/packages/server/dist/services/cliModalDetect.js +583 -0
  146. package/packages/server/dist/services/cliModalDetect.js.map +1 -0
  147. package/packages/server/dist/services/cliScreenCache.d.ts +33 -0
  148. package/packages/server/dist/services/cliScreenCache.d.ts.map +1 -0
  149. package/packages/server/dist/services/cliScreenCache.js +48 -0
  150. package/packages/server/dist/services/cliScreenCache.js.map +1 -0
  151. package/packages/server/dist/services/cliScreenModel.d.ts +141 -0
  152. package/packages/server/dist/services/cliScreenModel.d.ts.map +1 -0
  153. package/packages/server/dist/services/cliScreenModel.js +196 -0
  154. package/packages/server/dist/services/cliScreenModel.js.map +1 -0
  155. package/packages/server/dist/services/cliScreenStallWatchdog.d.ts +41 -0
  156. package/packages/server/dist/services/cliScreenStallWatchdog.d.ts.map +1 -0
  157. package/packages/server/dist/services/cliScreenStallWatchdog.js +45 -0
  158. package/packages/server/dist/services/cliScreenStallWatchdog.js.map +1 -0
  159. package/packages/server/dist/services/cliSessionPool.d.ts +97 -0
  160. package/packages/server/dist/services/cliSessionPool.d.ts.map +1 -0
  161. package/packages/server/dist/services/cliSessionPool.js +278 -0
  162. package/packages/server/dist/services/cliSessionPool.js.map +1 -0
  163. package/packages/server/dist/services/cliSpinnerProgress.d.ts +41 -0
  164. package/packages/server/dist/services/cliSpinnerProgress.d.ts.map +1 -0
  165. package/packages/server/dist/services/cliSpinnerProgress.js +131 -0
  166. package/packages/server/dist/services/cliSpinnerProgress.js.map +1 -0
  167. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts +24 -0
  168. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts.map +1 -0
  169. package/packages/server/dist/services/contextBuilderScriptTemplate.js +181 -0
  170. package/packages/server/dist/services/contextBuilderScriptTemplate.js.map +1 -0
  171. package/packages/server/dist/services/contextBuilderService.d.ts +68 -0
  172. package/packages/server/dist/services/contextBuilderService.d.ts.map +1 -0
  173. package/packages/server/dist/services/contextBuilderService.js +345 -0
  174. package/packages/server/dist/services/contextBuilderService.js.map +1 -0
  175. package/packages/server/dist/services/fileRewind.d.ts +46 -0
  176. package/packages/server/dist/services/fileRewind.d.ts.map +1 -0
  177. package/packages/server/dist/services/fileRewind.js +77 -0
  178. package/packages/server/dist/services/fileRewind.js.map +1 -0
  179. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -1
  180. package/packages/server/dist/services/fileWatcherService.js +40 -0
  181. package/packages/server/dist/services/fileWatcherService.js.map +1 -1
  182. package/packages/server/dist/services/harnessAgentService.d.ts +18 -0
  183. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -1
  184. package/packages/server/dist/services/harnessAgentService.js +55 -0
  185. package/packages/server/dist/services/harnessAgentService.js.map +1 -1
  186. package/packages/server/dist/services/harnessBundleService.d.ts +145 -0
  187. package/packages/server/dist/services/harnessBundleService.d.ts.map +1 -0
  188. package/packages/server/dist/services/harnessBundleService.js +1318 -0
  189. package/packages/server/dist/services/harnessBundleService.js.map +1 -0
  190. package/packages/server/dist/services/harnessCommandService.d.ts +21 -0
  191. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -1
  192. package/packages/server/dist/services/harnessCommandService.js +64 -0
  193. package/packages/server/dist/services/harnessCommandService.js.map +1 -1
  194. package/packages/server/dist/services/harnessHookService.d.ts +27 -0
  195. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -1
  196. package/packages/server/dist/services/harnessHookService.js +52 -0
  197. package/packages/server/dist/services/harnessHookService.js.map +1 -1
  198. package/packages/server/dist/services/harnessMcpService.d.ts +24 -1
  199. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -1
  200. package/packages/server/dist/services/harnessMcpService.js +70 -0
  201. package/packages/server/dist/services/harnessMcpService.js.map +1 -1
  202. package/packages/server/dist/services/harnessShareScopeService.d.ts +19 -0
  203. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -1
  204. package/packages/server/dist/services/harnessShareScopeService.js +65 -0
  205. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -1
  206. package/packages/server/dist/services/historyParser.d.ts +11 -0
  207. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  208. package/packages/server/dist/services/historyParser.js +10 -8
  209. package/packages/server/dist/services/historyParser.js.map +1 -1
  210. package/packages/server/dist/services/imageStorageService.d.ts +12 -0
  211. package/packages/server/dist/services/imageStorageService.d.ts.map +1 -1
  212. package/packages/server/dist/services/imageStorageService.js +22 -0
  213. package/packages/server/dist/services/imageStorageService.js.map +1 -1
  214. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  215. package/packages/server/dist/services/issueService.js +1 -0
  216. package/packages/server/dist/services/issueService.js.map +1 -1
  217. package/packages/server/dist/services/marketplaceService.d.ts +50 -0
  218. package/packages/server/dist/services/marketplaceService.d.ts.map +1 -0
  219. package/packages/server/dist/services/marketplaceService.js +326 -0
  220. package/packages/server/dist/services/marketplaceService.js.map +1 -0
  221. package/packages/server/dist/services/observabilityService.d.ts +87 -0
  222. package/packages/server/dist/services/observabilityService.d.ts.map +1 -0
  223. package/packages/server/dist/services/observabilityService.js +0 -0
  224. package/packages/server/dist/services/observabilityService.js.map +1 -0
  225. package/packages/server/dist/services/projectService.d.ts +13 -1
  226. package/packages/server/dist/services/projectService.d.ts.map +1 -1
  227. package/packages/server/dist/services/projectService.js +32 -0
  228. package/packages/server/dist/services/projectService.js.map +1 -1
  229. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  230. package/packages/server/dist/services/queueService.js +12 -3
  231. package/packages/server/dist/services/queueService.js.map +1 -1
  232. package/packages/server/dist/services/rateLimitProbeService.d.ts +15 -0
  233. package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
  234. package/packages/server/dist/services/rateLimitProbeService.js +48 -19
  235. package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
  236. package/packages/server/dist/services/sessionService.d.ts +16 -0
  237. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  238. package/packages/server/dist/services/sessionService.js +125 -0
  239. package/packages/server/dist/services/sessionService.js.map +1 -1
  240. package/packages/server/dist/services/streamHandler.d.ts +8 -1
  241. package/packages/server/dist/services/streamHandler.d.ts.map +1 -1
  242. package/packages/server/dist/services/streamHandler.js +12 -5
  243. package/packages/server/dist/services/streamHandler.js.map +1 -1
  244. package/packages/server/dist/services/systemBrowseService.d.ts +91 -0
  245. package/packages/server/dist/services/systemBrowseService.d.ts.map +1 -0
  246. package/packages/server/dist/services/systemBrowseService.js +372 -0
  247. package/packages/server/dist/services/systemBrowseService.js.map +1 -0
  248. package/packages/server/dist/services/tokenCountService.d.ts +71 -0
  249. package/packages/server/dist/services/tokenCountService.d.ts.map +1 -0
  250. package/packages/server/dist/services/tokenCountService.js +313 -0
  251. package/packages/server/dist/services/tokenCountService.js.map +1 -0
  252. package/packages/server/dist/services/workspaceContext.d.ts +24 -0
  253. package/packages/server/dist/services/workspaceContext.d.ts.map +1 -0
  254. package/packages/server/dist/services/workspaceContext.js +109 -0
  255. package/packages/server/dist/services/workspaceContext.js.map +1 -0
  256. package/packages/server/dist/snippets/apply-qa-fixes +7 -5
  257. package/packages/server/dist/snippets/qa-review +7 -1
  258. package/packages/server/dist/utils/assertSafeBundlePath.d.ts +29 -0
  259. package/packages/server/dist/utils/assertSafeBundlePath.d.ts.map +1 -0
  260. package/packages/server/dist/utils/assertSafeBundlePath.js +53 -0
  261. package/packages/server/dist/utils/assertSafeBundlePath.js.map +1 -0
  262. package/packages/server/dist/utils/backgroundBlock.d.ts +29 -0
  263. package/packages/server/dist/utils/backgroundBlock.d.ts.map +1 -0
  264. package/packages/server/dist/utils/backgroundBlock.js +33 -0
  265. package/packages/server/dist/utils/backgroundBlock.js.map +1 -0
  266. package/packages/server/dist/utils/backgroundTaskTracker.d.ts +20 -0
  267. package/packages/server/dist/utils/backgroundTaskTracker.d.ts.map +1 -0
  268. package/packages/server/dist/utils/backgroundTaskTracker.js +40 -0
  269. package/packages/server/dist/utils/backgroundTaskTracker.js.map +1 -0
  270. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts +14 -0
  271. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -0
  272. package/packages/server/dist/utils/bundledBinaryModelSupport.js +112 -0
  273. package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -0
  274. package/packages/server/dist/utils/cliDebugLog.d.ts +38 -0
  275. package/packages/server/dist/utils/cliDebugLog.d.ts.map +1 -0
  276. package/packages/server/dist/utils/cliDebugLog.js +65 -0
  277. package/packages/server/dist/utils/cliDebugLog.js.map +1 -0
  278. package/packages/server/dist/utils/cliEngineUtils.d.ts +35 -0
  279. package/packages/server/dist/utils/cliEngineUtils.d.ts.map +1 -0
  280. package/packages/server/dist/utils/cliEngineUtils.js +38 -0
  281. package/packages/server/dist/utils/cliEngineUtils.js.map +1 -0
  282. package/packages/server/dist/utils/effortUtils.d.ts +2 -2
  283. package/packages/server/dist/utils/effortUtils.d.ts.map +1 -1
  284. package/packages/server/dist/utils/effortUtils.js +7 -5
  285. package/packages/server/dist/utils/effortUtils.js.map +1 -1
  286. package/packages/server/dist/utils/errors.d.ts +1 -0
  287. package/packages/server/dist/utils/errors.d.ts.map +1 -1
  288. package/packages/server/dist/utils/errors.js +17 -0
  289. package/packages/server/dist/utils/errors.js.map +1 -1
  290. package/packages/server/dist/utils/harnessBundleSchema.d.ts +14 -12
  291. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -1
  292. package/packages/server/dist/utils/harnessBundleSchema.js +11 -1
  293. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -1
  294. package/packages/server/dist/utils/harnessPaths.d.ts +40 -0
  295. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -1
  296. package/packages/server/dist/utils/harnessPaths.js +123 -0
  297. package/packages/server/dist/utils/harnessPaths.js.map +1 -1
  298. package/packages/server/dist/utils/trailingThrottle.d.ts +21 -0
  299. package/packages/server/dist/utils/trailingThrottle.d.ts.map +1 -0
  300. package/packages/server/dist/utils/trailingThrottle.js +36 -0
  301. package/packages/server/dist/utils/trailingThrottle.js.map +1 -0
  302. package/packages/server/package.json +61 -58
  303. package/packages/server/resources/internals/INDEX.md +3 -1
  304. package/packages/server/resources/internals/bmad-qa-fix-marker.md +32 -0
  305. package/packages/server/resources/internals/harness-files.md +22 -0
  306. package/packages/server/resources/internals/image-storage.md +9 -0
  307. package/packages/server/resources/internals/observability-storage.md +23 -0
  308. package/packages/server/resources/manual/02-chat.md +23 -4
  309. package/packages/server/resources/manual/03-sessions.md +1 -0
  310. package/packages/server/resources/manual/05-projects.md +15 -2
  311. package/packages/server/resources/manual/10-project-board.md +4 -3
  312. package/packages/server/resources/manual/11-bmad-method-integration.md +12 -8
  313. package/packages/server/resources/manual/12-harness-workbench.md +82 -1
  314. package/packages/server/resources/manual/13-settings.md +61 -9
  315. package/packages/shared/dist/index.d.ts +7 -0
  316. package/packages/shared/dist/index.d.ts.map +1 -1
  317. package/packages/shared/dist/index.js +14 -0
  318. package/packages/shared/dist/index.js.map +1 -1
  319. package/packages/shared/dist/types/bmadCoreConfig.d.ts +71 -0
  320. package/packages/shared/dist/types/bmadCoreConfig.d.ts.map +1 -0
  321. package/packages/shared/dist/types/bmadCoreConfig.js +30 -0
  322. package/packages/shared/dist/types/bmadCoreConfig.js.map +1 -0
  323. package/packages/shared/dist/types/bmadStatus.d.ts +26 -0
  324. package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
  325. package/packages/shared/dist/types/bmadStatus.js.map +1 -1
  326. package/packages/shared/dist/types/board.d.ts +6 -0
  327. package/packages/shared/dist/types/board.d.ts.map +1 -1
  328. package/packages/shared/dist/types/contextBuilder.d.ts +102 -0
  329. package/packages/shared/dist/types/contextBuilder.d.ts.map +1 -0
  330. package/packages/shared/dist/types/contextBuilder.js +55 -0
  331. package/packages/shared/dist/types/contextBuilder.js.map +1 -0
  332. package/packages/shared/dist/types/harnessBundle.d.ts +35 -0
  333. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -1
  334. package/packages/shared/dist/types/marketplace.d.ts +83 -0
  335. package/packages/shared/dist/types/marketplace.d.ts.map +1 -0
  336. package/packages/shared/dist/types/marketplace.js +18 -0
  337. package/packages/shared/dist/types/marketplace.js.map +1 -0
  338. package/packages/shared/dist/types/observability.d.ts +148 -0
  339. package/packages/shared/dist/types/observability.d.ts.map +1 -0
  340. package/packages/shared/dist/types/observability.js +24 -0
  341. package/packages/shared/dist/types/observability.js.map +1 -0
  342. package/packages/shared/dist/types/preferences.d.ts +16 -2
  343. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  344. package/packages/shared/dist/types/preferences.js +1 -0
  345. package/packages/shared/dist/types/preferences.js.map +1 -1
  346. package/packages/shared/dist/types/project.d.ts +7 -1
  347. package/packages/shared/dist/types/project.d.ts.map +1 -1
  348. package/packages/shared/dist/types/project.js.map +1 -1
  349. package/packages/shared/dist/types/sdk.d.ts +124 -12
  350. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  351. package/packages/shared/dist/types/sdk.js +64 -19
  352. package/packages/shared/dist/types/sdk.js.map +1 -1
  353. package/packages/shared/dist/types/streaming.d.ts +2 -2
  354. package/packages/shared/dist/types/streaming.d.ts.map +1 -1
  355. package/packages/shared/dist/types/streaming.js.map +1 -1
  356. package/packages/shared/dist/types/systemBrowse.d.ts +120 -0
  357. package/packages/shared/dist/types/systemBrowse.d.ts.map +1 -0
  358. package/packages/shared/dist/types/systemBrowse.js +57 -0
  359. package/packages/shared/dist/types/systemBrowse.js.map +1 -0
  360. package/packages/shared/dist/types/websocket.d.ts +38 -0
  361. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  362. package/packages/shared/dist/utils/interruptFiller.d.ts +30 -0
  363. package/packages/shared/dist/utils/interruptFiller.d.ts.map +1 -0
  364. package/packages/shared/dist/utils/interruptFiller.js +38 -0
  365. package/packages/shared/dist/utils/interruptFiller.js.map +1 -0
  366. package/packages/shared/dist/utils/toolResultContent.d.ts +22 -0
  367. package/packages/shared/dist/utils/toolResultContent.d.ts.map +1 -0
  368. package/packages/shared/dist/utils/toolResultContent.js +29 -0
  369. package/packages/shared/dist/utils/toolResultContent.js.map +1 -0
  370. package/scripts/run-integration-test.mjs +362 -362
  371. package/packages/client/dist/assets/index-CjyjnXB8.css +0 -32
  372. package/packages/client/dist/assets/index-NqJdhlek.js +0 -1498
@@ -18,6 +18,16 @@ import { z } from 'zod';
18
18
  * future-version bundles fall through to the AC5.a "futureBundle" branch
19
19
  * before this schema is even consulted (the import service inspects the raw
20
20
  * JSON's version field first, then runs full Zod validation).
21
+ *
22
+ * `includes` is intentionally LOOSE (`z.array(z.string())`) rather than
23
+ * `z.array(sectionSchema)` so a `bundleVersion === 1` manifest carrying a
24
+ * future-domain stranger section (e.g. `['claude-md', 'future-section']`)
25
+ * still parses. The import service's `computePreview` then surfaces unknown
26
+ * sections via `preview.unknownSections` per AC5.b instead of bailing with
27
+ * `compatibility: 'malformed'`. Export-request validation
28
+ * (`exportBundleRequestSchema`) keeps `sectionSchema` strict — we never
29
+ * accept unknown sections from outbound callers, only tolerate them
30
+ * inbound.
21
31
  */
22
32
  export declare const bundleManifestSchema: z.ZodObject<{
23
33
  bundleVersion: z.ZodLiteral<1>;
@@ -25,15 +35,7 @@ export declare const bundleManifestSchema: z.ZodObject<{
25
35
  claudeCodeSpecVersion: z.ZodUnion<readonly [z.ZodString, z.ZodNull]>;
26
36
  createdAt: z.ZodString;
27
37
  sourceProjectSlug: z.ZodString;
28
- includes: z.ZodArray<z.ZodEnum<{
29
- agents: "agents";
30
- hooks: "hooks";
31
- commands: "commands";
32
- skills: "skills";
33
- mcp: "mcp";
34
- "claude-md": "claude-md";
35
- bmad: "bmad";
36
- }>>;
38
+ includes: z.ZodArray<z.ZodString>;
37
39
  secretsPolicy: z.ZodEnum<{
38
40
  excluded: "excluded";
39
41
  placeholder: "placeholder";
@@ -49,9 +51,9 @@ export declare const bundleManifestSchema: z.ZodObject<{
49
51
  agent: "agent";
50
52
  command: "command";
51
53
  skill: "skill";
54
+ "claude-md": "claude-md";
52
55
  mcp: "mcp";
53
56
  hook: "hook";
54
- "claude-md": "claude-md";
55
57
  bmad: "bmad";
56
58
  }>;
57
59
  identity: z.ZodString;
@@ -78,10 +80,10 @@ export declare const exportBundleRequestSchema: z.ZodObject<{
78
80
  includes: z.ZodArray<z.ZodEnum<{
79
81
  agents: "agents";
80
82
  hooks: "hooks";
81
- commands: "commands";
82
83
  skills: "skills";
83
- mcp: "mcp";
84
+ commands: "commands";
84
85
  "claude-md": "claude-md";
86
+ mcp: "mcp";
85
87
  bmad: "bmad";
86
88
  }>>;
87
89
  secretsPolicy: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"harnessBundleSchema.d.ts","sourceRoot":"","sources":["../../src/utils/harnessBundleSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAU/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAIpC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAGnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC"}
1
+ {"version":3,"file":"harnessBundleSchema.d.ts","sourceRoot":"","sources":["../../src/utils/harnessBundleSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAU/B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;iBAEjC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAIpC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAGnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC"}
@@ -43,6 +43,16 @@ const bundleItemSchema = z.object({
43
43
  * future-version bundles fall through to the AC5.a "futureBundle" branch
44
44
  * before this schema is even consulted (the import service inspects the raw
45
45
  * JSON's version field first, then runs full Zod validation).
46
+ *
47
+ * `includes` is intentionally LOOSE (`z.array(z.string())`) rather than
48
+ * `z.array(sectionSchema)` so a `bundleVersion === 1` manifest carrying a
49
+ * future-domain stranger section (e.g. `['claude-md', 'future-section']`)
50
+ * still parses. The import service's `computePreview` then surfaces unknown
51
+ * sections via `preview.unknownSections` per AC5.b instead of bailing with
52
+ * `compatibility: 'malformed'`. Export-request validation
53
+ * (`exportBundleRequestSchema`) keeps `sectionSchema` strict — we never
54
+ * accept unknown sections from outbound callers, only tolerate them
55
+ * inbound.
46
56
  */
47
57
  export const bundleManifestSchema = z.object({
48
58
  bundleVersion: z.literal(HARNESS_BUNDLE_VERSION),
@@ -50,7 +60,7 @@ export const bundleManifestSchema = z.object({
50
60
  claudeCodeSpecVersion: z.union([z.string().min(1), z.null()]),
51
61
  createdAt: z.string().min(1),
52
62
  sourceProjectSlug: z.string().min(1),
53
- includes: z.array(sectionSchema),
63
+ includes: z.array(z.string().min(1)),
54
64
  secretsPolicy: secretsPolicySchema,
55
65
  pluginDependencies: z.array(pluginRefSchema),
56
66
  items: z.array(bundleItemSchema),
@@ -1 +1 @@
1
- {"version":3,"file":"harnessBundleSchema.js","sourceRoot":"","sources":["../../src/utils/harnessBundleSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harnessBundleSchema.js","sourceRoot":"","sources":["../../src/utils/harnessBundleSchema.ts"],"names":[],"mappings":"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"}
@@ -31,4 +31,44 @@ export declare function resolveHarnessPath(ref: HarnessPathRef): Promise<Resolve
31
31
  * project root, so traversal is impossible by construction.
32
32
  */
33
33
  export declare function resolveProjectClaudeMdPath(projectSlug: string): Promise<ResolvedHarnessPath>;
34
+ /**
35
+ * Story 30.7 (Task A.5): resolve the project-root `<projectRoot>/.gitignore`
36
+ * path. Like `resolveProjectClaudeMdPath`, `.gitignore` sits outside the
37
+ * `.claude/` subtree, so `resolveHarnessPath` cannot reach it. This helper
38
+ * accepts only `projectSlug` (no caller-supplied relative path), so traversal
39
+ * is impossible by construction. Used by
40
+ * `harnessShareScopeService.appendGitignorePattern()` to safely append
41
+ * patterns like `**\/.claude/**\/*.local.*` when the sibling-save flow detects
42
+ * the pattern is missing.
43
+ */
44
+ export declare function resolveProjectGitignorePath(projectSlug: string): Promise<ResolvedHarnessPath>;
45
+ /**
46
+ * Story 31.1 (Task A.1): resolve the project-root
47
+ * `<projectRoot>/.bmad-core/core-config.yaml` path. Like
48
+ * `resolveProjectClaudeMdPath` / `resolveProjectGitignorePath`, the
49
+ * `.bmad-core/` tree sits OUTSIDE the project's `.claude/` subtree, so
50
+ * `resolveHarnessPath` would reject it as a traversal. This helper accepts
51
+ * only `projectSlug` (no caller-supplied relative path), so traversal is
52
+ * impossible by construction. Used by `bmadCoreConfigService` to read/patch
53
+ * the single config file the BMad config form edits.
54
+ */
55
+ export declare function resolveBmadCoreConfigPath(projectSlug: string): Promise<ResolvedHarnessPath>;
56
+ /**
57
+ * Story 31.2 (Task A.1): resolve the context-builder manifest path
58
+ * `<projectRoot>/.hammoc/context-builder.json`. Like the `.bmad-core/`
59
+ * resolver, the `.hammoc/` tree sits OUTSIDE the project's `.claude/` subtree,
60
+ * so `resolveHarnessPath` would reject it as a traversal. Accepts only
61
+ * `projectSlug` (no caller-supplied relative path), so traversal is impossible
62
+ * by construction. Used by `contextBuilderService` as the single manifest R/W
63
+ * chokepoint (no other module touches this path via `fs`).
64
+ */
65
+ export declare function resolveContextBuilderManifestPath(projectSlug: string): Promise<ResolvedHarnessPath>;
66
+ /**
67
+ * Story 31.2 (Task A.1): resolve the generated script path
68
+ * `<projectRoot>/.hammoc/hooks/context-builder.mjs`. Same traversal-proof
69
+ * construction as `resolveContextBuilderManifestPath`. The generated `.mjs`
70
+ * runs standalone at every session start, assembling the `additionalContext`
71
+ * JSON the SessionStart hook emits.
72
+ */
73
+ export declare function resolveContextBuilderScriptPath(projectSlug: string): Promise<ResolvedHarnessPath>;
34
74
  //# sourceMappingURL=harnessPaths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"harnessPaths.d.ts","sourceRoot":"","sources":["../../src/utils/harnessPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAWrE,6EAA6E;AAC7E,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wFAAwF;AACxF,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBhF;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwC1F;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyBlG"}
1
+ {"version":3,"file":"harnessPaths.d.ts","sourceRoot":"","sources":["../../src/utils/harnessPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAWrE,6EAA6E;AAC7E,wBAAgB,kBAAkB,IAAI,MAAM,CAO3C;AAED,wFAAwF;AACxF,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBhF;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwC1F;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyBlG;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwBnG;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwBjG;AAED;;;;;;;;GAQG;AACH,wBAAsB,iCAAiC,CACrD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAED;;;;;;GAMG;AACH,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
@@ -121,4 +121,127 @@ export async function resolveProjectClaudeMdPath(projectSlug) {
121
121
  const absolutePath = path.join(resolvedRoot, 'CLAUDE.md');
122
122
  return { resolvedRoot, absolutePath };
123
123
  }
124
+ /**
125
+ * Story 30.7 (Task A.5): resolve the project-root `<projectRoot>/.gitignore`
126
+ * path. Like `resolveProjectClaudeMdPath`, `.gitignore` sits outside the
127
+ * `.claude/` subtree, so `resolveHarnessPath` cannot reach it. This helper
128
+ * accepts only `projectSlug` (no caller-supplied relative path), so traversal
129
+ * is impossible by construction. Used by
130
+ * `harnessShareScopeService.appendGitignorePattern()` to safely append
131
+ * patterns like `**\/.claude/**\/*.local.*` when the sibling-save flow detects
132
+ * the pattern is missing.
133
+ */
134
+ export async function resolveProjectGitignorePath(projectSlug) {
135
+ if (!projectSlug || projectSlug.includes('\0')) {
136
+ const err = new Error('invalid projectSlug');
137
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
138
+ throw err;
139
+ }
140
+ if (projectSlug.includes('..') || projectSlug.includes('/') || projectSlug.includes('\\')) {
141
+ const err = new Error('projectSlug must not contain path separators');
142
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
143
+ throw err;
144
+ }
145
+ let projectRoot;
146
+ try {
147
+ projectRoot = await projectService.resolveOriginalPath(projectSlug);
148
+ }
149
+ catch (error) {
150
+ const wrapped = new Error(`Unable to resolve project root for "${projectSlug}": ${error.message}`);
151
+ wrapped.code = HARNESS_ERRORS.HARNESS_ROOT_MISSING.code;
152
+ throw wrapped;
153
+ }
154
+ const resolvedRoot = path.resolve(projectRoot);
155
+ const absolutePath = path.join(resolvedRoot, '.gitignore');
156
+ return { resolvedRoot, absolutePath };
157
+ }
158
+ /**
159
+ * Story 31.1 (Task A.1): resolve the project-root
160
+ * `<projectRoot>/.bmad-core/core-config.yaml` path. Like
161
+ * `resolveProjectClaudeMdPath` / `resolveProjectGitignorePath`, the
162
+ * `.bmad-core/` tree sits OUTSIDE the project's `.claude/` subtree, so
163
+ * `resolveHarnessPath` would reject it as a traversal. This helper accepts
164
+ * only `projectSlug` (no caller-supplied relative path), so traversal is
165
+ * impossible by construction. Used by `bmadCoreConfigService` to read/patch
166
+ * the single config file the BMad config form edits.
167
+ */
168
+ export async function resolveBmadCoreConfigPath(projectSlug) {
169
+ if (!projectSlug || projectSlug.includes('\0')) {
170
+ const err = new Error('invalid projectSlug');
171
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
172
+ throw err;
173
+ }
174
+ if (projectSlug.includes('..') || projectSlug.includes('/') || projectSlug.includes('\\')) {
175
+ const err = new Error('projectSlug must not contain path separators');
176
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
177
+ throw err;
178
+ }
179
+ let projectRoot;
180
+ try {
181
+ projectRoot = await projectService.resolveOriginalPath(projectSlug);
182
+ }
183
+ catch (error) {
184
+ const wrapped = new Error(`Unable to resolve project root for "${projectSlug}": ${error.message}`);
185
+ wrapped.code = HARNESS_ERRORS.HARNESS_ROOT_MISSING.code;
186
+ throw wrapped;
187
+ }
188
+ const resolvedRoot = path.resolve(projectRoot);
189
+ const absolutePath = path.join(resolvedRoot, '.bmad-core', 'core-config.yaml');
190
+ return { resolvedRoot, absolutePath };
191
+ }
192
+ /**
193
+ * Story 31.2 (Task A.1): resolve the context-builder manifest path
194
+ * `<projectRoot>/.hammoc/context-builder.json`. Like the `.bmad-core/`
195
+ * resolver, the `.hammoc/` tree sits OUTSIDE the project's `.claude/` subtree,
196
+ * so `resolveHarnessPath` would reject it as a traversal. Accepts only
197
+ * `projectSlug` (no caller-supplied relative path), so traversal is impossible
198
+ * by construction. Used by `contextBuilderService` as the single manifest R/W
199
+ * chokepoint (no other module touches this path via `fs`).
200
+ */
201
+ export async function resolveContextBuilderManifestPath(projectSlug) {
202
+ const { resolvedRoot } = await resolveHammocRootForProject(projectSlug);
203
+ const absolutePath = path.join(resolvedRoot, '.hammoc', 'context-builder.json');
204
+ return { resolvedRoot, absolutePath };
205
+ }
206
+ /**
207
+ * Story 31.2 (Task A.1): resolve the generated script path
208
+ * `<projectRoot>/.hammoc/hooks/context-builder.mjs`. Same traversal-proof
209
+ * construction as `resolveContextBuilderManifestPath`. The generated `.mjs`
210
+ * runs standalone at every session start, assembling the `additionalContext`
211
+ * JSON the SessionStart hook emits.
212
+ */
213
+ export async function resolveContextBuilderScriptPath(projectSlug) {
214
+ const { resolvedRoot } = await resolveHammocRootForProject(projectSlug);
215
+ const absolutePath = path.join(resolvedRoot, '.hammoc', 'hooks', 'context-builder.mjs');
216
+ return { resolvedRoot, absolutePath };
217
+ }
218
+ /**
219
+ * Shared resolver tail for the two `.hammoc/` helpers above — validates the
220
+ * slug (no null byte / path separators) and resolves the project root. Returns
221
+ * `resolvedRoot` = the project root (NOT `.hammoc/`), so each caller appends its
222
+ * own suffix; this keeps the traversal guard in one place.
223
+ */
224
+ async function resolveHammocRootForProject(projectSlug) {
225
+ if (!projectSlug || projectSlug.includes('\0')) {
226
+ const err = new Error('invalid projectSlug');
227
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
228
+ throw err;
229
+ }
230
+ if (projectSlug.includes('..') || projectSlug.includes('/') || projectSlug.includes('\\')) {
231
+ const err = new Error('projectSlug must not contain path separators');
232
+ err.code = HARNESS_ERRORS.HARNESS_PATH_DENIED.code;
233
+ throw err;
234
+ }
235
+ let projectRoot;
236
+ try {
237
+ projectRoot = await projectService.resolveOriginalPath(projectSlug);
238
+ }
239
+ catch (error) {
240
+ const wrapped = new Error(`Unable to resolve project root for "${projectSlug}": ${error.message}`);
241
+ wrapped.code = HARNESS_ERRORS.HARNESS_ROOT_MISSING.code;
242
+ throw wrapped;
243
+ }
244
+ const resolvedRoot = path.resolve(projectRoot);
245
+ return { resolvedRoot, absolutePath: resolvedRoot };
246
+ }
124
247
  //# sourceMappingURL=harnessPaths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"harnessPaths.js","sourceRoot":"","sources":["../../src/utils/harnessPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAuB,MAAM,gBAAgB,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,6DAA6D;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2CAA2C,CAA0B,CAAC;QAC5F,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACpD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,+CAA+C,WAAW,MAAO,KAAe,CAAC,OAAO,EAAE,CAClE,CAAC;QAC3B,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACxD,MAAM,OAAO,CAAC;IAChB,CAAC;AACH,CAAC;AAOD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAmB;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEnC,0EAA0E;IAC1E,yEAAyE;IACzE,qCAAqC;IACrC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAA0B,CAAC;QAC7E,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAA0B,CAAC;QAC5E,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,0EAA0E;IAC1E,oEAAoE;IACpE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,sBAAsB,CAA0B,CAAC;QACvE,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,KAAK,MAAM;QACvC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,qBAAqB,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;IAErE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAErD,6EAA6E;IAC7E,sEAAsE;IACtE,uBAAuB;IACvB,IAAI,YAAY,KAAK,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvF,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAA0B,CAAC;QAC5E,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,WAAmB;IAClE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAA0B,CAAC;QACtE,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,sFAAsF;IACtF,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,8CAA8C,CAA0B,CAAC;QAC/F,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC;QACnD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,cAAc,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,uCAAuC,WAAW,MAAO,KAAe,CAAC,OAAO,EAAE,CAC1D,CAAC;QAC3B,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC;QACxD,MAAM,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC1D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"harnessPaths.js","sourceRoot":"","sources":["../../src/utils/harnessPaths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Trailing-edge throttle (Story 37.8) — paces CLI mirror screen frames so a burst of PTY
3
+ * redraws (the spinner repaints many times a second) collapses to at most one send per
4
+ * interval, while still guaranteeing the LATEST frame in the burst is delivered.
5
+ *
6
+ * Semantics:
7
+ * - `schedule(value)` — leading edge: if nothing fired within the interval, run `fn`
8
+ * immediately; otherwise stash `value` as pending and run it once when the interval
9
+ * elapses (trailing edge, always the most recent value).
10
+ * - `cancel()` — drop any pending value and clear the timer. Called at turn teardown,
11
+ * which then sends the final screen directly (outside the throttle) so the last frame
12
+ * is never lost to an unelapsed interval.
13
+ *
14
+ * Pure / timer-only: no xterm or socket coupling, so it unit-tests with fake timers.
15
+ */
16
+ export interface TrailingThrottle<T> {
17
+ schedule(value: T): void;
18
+ cancel(): void;
19
+ }
20
+ export declare function createTrailingThrottle<T>(intervalMs: number, fn: (value: T) => void): TrailingThrottle<T>;
21
+ //# sourceMappingURL=trailingThrottle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailingThrottle.d.ts","sourceRoot":"","sources":["../../src/utils/trailingThrottle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GACrB,gBAAgB,CAAC,CAAC,CAAC,CAoCrB"}
@@ -0,0 +1,36 @@
1
+ export function createTrailingThrottle(intervalMs, fn) {
2
+ let timer = null;
3
+ let pending = null;
4
+ const fire = (value) => {
5
+ // Open the cool-down window first; a schedule() during it stashes `pending`, which the
6
+ // trailing timer below flushes. Then run fn.
7
+ timer = setTimeout(onInterval, intervalMs);
8
+ fn(value);
9
+ };
10
+ function onInterval() {
11
+ timer = null;
12
+ if (pending) {
13
+ const { value } = pending;
14
+ pending = null;
15
+ fire(value); // trailing edge — re-opens the window so a steady stream keeps pacing
16
+ }
17
+ }
18
+ return {
19
+ schedule(value) {
20
+ if (timer === null) {
21
+ fire(value); // leading edge — nothing in flight, send immediately
22
+ }
23
+ else {
24
+ pending = { value }; // within the window — keep only the latest
25
+ }
26
+ },
27
+ cancel() {
28
+ if (timer !== null) {
29
+ clearTimeout(timer);
30
+ timer = null;
31
+ }
32
+ pending = null;
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=trailingThrottle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailingThrottle.js","sourceRoot":"","sources":["../../src/utils/trailingThrottle.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,EAAsB;IAEtB,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,IAAI,OAAO,GAAwB,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,CAAC,KAAQ,EAAQ,EAAE;QAC9B,uFAAuF;QACvF,6CAA6C;QAC7C,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3C,EAAE,CAAC,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC;IAEF,SAAS,UAAU;QACjB,KAAK,GAAG,IAAI,CAAC;QACb,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sEAAsE;QACrF,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,CAAC,KAAQ;YACf,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,qDAAqD;YACpE,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,2CAA2C;YAClE,CAAC;QACH,CAAC;QACD,MAAM;YACJ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,58 +1,61 @@
1
- {
2
- "name": "@hammoc/server",
3
- "version": "1.0.3",
4
- "type": "module",
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "dev": "node --import tsx/esm --watch src/dev.ts",
8
- "build": "tsc && node -e \"require('fs').cpSync('src/locales','dist/locales',{recursive:true});require('fs').cpSync('src/snippets','dist/snippets',{recursive:true})\"",
9
- "start": "cross-env NODE_ENV=production node dist/index.js",
10
- "typecheck": "tsc --noEmit",
11
- "test": "vitest run --exclude '**/**.integration.test.ts'",
12
- "test:watch": "vitest --exclude '**/**.integration.test.ts'",
13
- "test:coverage": "vitest run --coverage --exclude '**/**.integration.test.ts'",
14
- "test:integration": "vitest run src/services/__tests__/chatService.integration.test.ts",
15
- "test:all": "vitest run"
16
- },
17
- "dependencies": {
18
- "@anthropic-ai/claude-agent-sdk": "^0.2.114",
19
- "@hammoc/shared": "*",
20
- "bcrypt": "^6.0.0",
21
- "chokidar": "^5.0.0",
22
- "cookie-session": "^2.1.1",
23
- "cors": "^2.8.5",
24
- "express": "^4.21.0",
25
- "helmet": "^8.1.0",
26
- "i18next": "^24.2.3",
27
- "ignore": "^5.3.2",
28
- "js-yaml": "^4.1.1",
29
- "jsonc-parser": "^3.3.1",
30
- "jszip": "^3.10.1",
31
- "multer": "^2.1.1",
32
- "node-pty": "^1.0.0",
33
- "sharp": "^0.34.5",
34
- "simple-git": "^3.27.0",
35
- "socket.io": "^4.8.0",
36
- "web-push": "^3.6.7",
37
- "yaml": "^2.8.3",
38
- "zod": "^4.3.6"
39
- },
40
- "devDependencies": {
41
- "@types/bcrypt": "^6.0.0",
42
- "@types/cookie-session": "^2.0.49",
43
- "@types/cors": "^2.8.19",
44
- "@types/express": "^4.17.25",
45
- "@types/express-serve-static-core": "^4.19.8",
46
- "@types/js-yaml": "^4.0.9",
47
- "@types/multer": "^2.1.0",
48
- "@types/node": "^22.0.0",
49
- "@types/sharp": "^0.31.1",
50
- "@types/supertest": "^6.0.3",
51
- "@types/web-push": "^3.6.4",
52
- "@vitest/coverage-v8": "^2.0.0",
53
- "supertest": "^7.2.2",
54
- "tsx": "^4.19.0",
55
- "typescript": "^5.6.0",
56
- "vitest": "^2.1.9"
57
- }
58
- }
1
+ {
2
+ "name": "@hammoc/server",
3
+ "version": "1.0.3",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "dev": "node --import tsx/esm --watch src/dev.ts",
8
+ "build": "tsc && node -e \"require('fs').cpSync('src/locales','dist/locales',{recursive:true});require('fs').cpSync('src/snippets','dist/snippets',{recursive:true})\"",
9
+ "start": "cross-env NODE_ENV=production node dist/index.js",
10
+ "typecheck": "tsc --noEmit",
11
+ "test": "vitest run --exclude '**/**.integration.test.ts'",
12
+ "test:watch": "vitest --exclude '**/**.integration.test.ts'",
13
+ "test:coverage": "vitest run --coverage --exclude '**/**.integration.test.ts'",
14
+ "test:integration": "vitest run src/services/__tests__/chatService.integration.test.ts",
15
+ "test:all": "vitest run"
16
+ },
17
+ "dependencies": {
18
+ "@anthropic-ai/claude-agent-sdk": "^0.3.177",
19
+ "@anthropic-ai/sdk": "^0.100.1",
20
+ "@hammoc/shared": "*",
21
+ "@xterm/addon-serialize": "0.14.0",
22
+ "@xterm/headless": "5.5.0",
23
+ "bcrypt": "^6.0.0",
24
+ "chokidar": "^5.0.0",
25
+ "cookie-session": "^2.1.1",
26
+ "cors": "^2.8.5",
27
+ "express": "^4.21.0",
28
+ "helmet": "^8.1.0",
29
+ "i18next": "^24.2.3",
30
+ "ignore": "^5.3.2",
31
+ "js-yaml": "^4.1.1",
32
+ "jsonc-parser": "^3.3.1",
33
+ "jszip": "^3.10.1",
34
+ "multer": "^2.1.1",
35
+ "node-pty": "^1.0.0",
36
+ "sharp": "^0.34.5",
37
+ "simple-git": "^3.27.0",
38
+ "socket.io": "^4.8.0",
39
+ "web-push": "^3.6.7",
40
+ "yaml": "^2.8.3",
41
+ "zod": "^4.3.6"
42
+ },
43
+ "devDependencies": {
44
+ "@types/bcrypt": "^6.0.0",
45
+ "@types/cookie-session": "^2.0.49",
46
+ "@types/cors": "^2.8.19",
47
+ "@types/express": "^4.17.25",
48
+ "@types/express-serve-static-core": "^4.19.8",
49
+ "@types/js-yaml": "^4.0.9",
50
+ "@types/multer": "^2.1.0",
51
+ "@types/node": "^22.0.0",
52
+ "@types/sharp": "^0.31.1",
53
+ "@types/supertest": "^6.0.3",
54
+ "@types/web-push": "^3.6.4",
55
+ "@vitest/coverage-v8": "^2.0.0",
56
+ "supertest": "^7.2.2",
57
+ "tsx": "^4.19.0",
58
+ "typescript": "^5.6.0",
59
+ "vitest": "^2.1.9"
60
+ }
61
+ }
@@ -9,7 +9,9 @@ Read individual entries **on demand** when the user's request involves the under
9
9
  ## Entries
10
10
 
11
11
  - [Image Storage](./image-storage.md) — On-disk path and filename scheme for chat-attached images
12
- - [Harness File Layout](./harness-files.md) — Where `.claude/` items (skills, commands, agents, hooks, MCP servers, `CLAUDE.md`) live on disk, when changes take effect, and how the Secret-on-Shared guard relates to direct file writes
12
+ - [Harness File Layout](./harness-files.md) — Where `.claude/` items (skills, commands, agents, hooks, MCP servers, `CLAUDE.md`) live on disk, when changes take effect, the Context Builder's Hammoc-managed SessionStart files, plugin install-state paths, and how the Secret-on-Shared guard relates to direct file writes
13
+ - [Observability Storage](./observability-storage.md) — Where the MCP call log and exact-token-count cache live, their JSONL/JSON format, body-stripping, and 30-day retention
14
+ - [BMad QA-Fix Marker](./bmad-qa-fix-marker.md) — The `<!-- hammoc:qa-fix -->` story-file convention that drives QA re-review recommendations and the board's "QA Fixed" badge
13
15
 
14
16
  ## Maintenance
15
17
 
@@ -0,0 +1,32 @@
1
+ # BMad QA-Fix Marker
2
+
3
+ A Hammoc-specific convention layered on top of standard BMad story files. It lets the project-overview Next Step Recommender (manual §11.5) and the board's "QA Fixed" badge (§10.7) know whether a developer has already addressed the **current** QA gate — without guessing from file modification times (the old, unreliable approach: `review-story` rewrites the story after the gate, which made a freshly-reviewed story look "stale").
4
+
5
+ ## The marker
6
+
7
+ A single HTML comment inside the story markdown file:
8
+
9
+ ```
10
+ <!-- hammoc:qa-fix gate="<the gate's `updated` value>" applied="true|false" -->
11
+ ```
12
+
13
+ - It is an HTML comment, so standard BMad tooling ignores it and it never changes the story's Status or the gate file.
14
+ - `gate` is the QA gate's `updated:` value — it ties the marker to one specific gate. When QA later re-reviews, the gate's `updated` changes and any marker pointing at the old value becomes stale automatically.
15
+ - `applied="false"` → "QA flagged this gate; a fix is still needed." `applied="true"` → "Dev addressed this gate."
16
+
17
+ ## Who writes it
18
+
19
+ - **QA review** (Hammoc's bundled `qa-review` snippet) appends `applied="false"` in the story's **QA Results** section when it issues a CONCERNS or FAIL gate.
20
+ - **Apply QA fixes** (the bundled `apply-qa-fixes` snippet) appends `applied="true"` in the story's **Completion Notes** after the fixes are made — without touching Status or the gate file.
21
+
22
+ If you perform a QA review or apply QA fixes **manually** (not through these snippets), append the matching marker yourself so the recommender and badge stay accurate.
23
+
24
+ ## How it is read
25
+
26
+ The server (BMad status service) collects all markers in a story and matches them against the **current** gate's `updated` value to derive a per-story `gateFixState`:
27
+
28
+ - an `applied="true"` marker for the current gate → **`applied`** (Dev done; QA re-review is the next step)
29
+ - only an `applied="false"` marker for the current gate → **`needed`** (Dev must apply fixes)
30
+ - no marker for the current gate → **`undefined`** → the UI offers **both** actions (Apply QA fixes / Request QA review) and lets the user choose, because it can't tell whether fixes were applied (legacy story, external BMad project, or manually-edited gate)
31
+
32
+ An `applied` marker wins over a `needed` marker for the same gate. The board shows the sky-blue **QA Fixed** badge only when `gateFixState='applied'` for a FAIL/CONCERNS gate.
@@ -29,6 +29,28 @@ When the same name (skill, command, agent, hook, MCP server, snippet) exists in
29
29
 
30
30
  Hammoc-native `%snippets` are a separate layer (see manual §4.6); they live under `<projectRoot>/.hammoc/snippets/` and `<homeDir>/.hammoc/snippets/`, **not** the `.claude/` tree.
31
31
 
32
+ ## Context Builder generated files (Hammoc-managed)
33
+
34
+ The Context Builder (manual §12.17) writes two Hammoc-owned files plus one `settings.json` entry:
35
+
36
+ | File | Role |
37
+ |------|------|
38
+ | `<projectRoot>/.hammoc/context-builder.json` | Manifest — the single source of truth: `enabled` flag, reference-file list, dynamic-variable toggles, recent-commit count, custom-command list |
39
+ | `<projectRoot>/.hammoc/hooks/context-builder.mjs` | Generated Node.js SessionStart hook. Regenerated from the manifest on every change; reads the reference files fresh, recomputes the variables, runs acknowledged custom commands, and prints `{"hookSpecificOutput":{"hookEventName":"SessionStart","additionalContext":"…"}}` |
40
+ | `<projectRoot>/.claude/settings.json` → `hooks.SessionStart[]` | Auto-registered entry whose `command` is `node "<absPath>/.hammoc/hooks/context-builder.mjs"` (forward-slash normalized) |
41
+
42
+ Hammoc recognizes its own SessionStart entry by the `.hammoc/hooks/context-builder.` substring in the command — there is no metadata key. **Do not hand-edit that entry or the `.mjs` script directly**: the Context Builder panel owns them and regenerates the script (overwriting manual edits) on the next save. To change the injected context, edit `context-builder.json` (or use the panel). User-authored SessionStart entries that do not contain the marker substring are left untouched.
43
+
44
+ ## Plugin install state (read-only)
45
+
46
+ The Marketplace panel (manual §12.19) and the Plugins panel read Claude Code's own plugin bookkeeping under `<homeDir>/.claude/plugins/`:
47
+
48
+ - `known_marketplaces.json` — registered marketplace repos
49
+ - `marketplaces/<name>/.claude-plugin/marketplace.json` — each marketplace's catalog manifest (`plugins[]`)
50
+ - `installed_plugins.json` — which plugins are installed (used to mark catalog cards "Installed")
51
+
52
+ Hammoc only **reads** these; installs/uninstalls happen through the interactive `/plugin …` slash commands in a Claude CLI session, after which a file watcher refreshes the cards.
53
+
32
54
  ## Sharing scope
33
55
 
34
56
  Each file's "share" status is computed from the project's `.gitignore`:
@@ -30,6 +30,15 @@ Anything else is rejected at attach time.
30
30
  - The chat message references each image via the API URL `/api/projects/<projectSlug>/sessions/<sessionId>/images/<filename>`. That URL is for the **browser** to render thumbnails — it is not a file-system path and Read tools cannot use it directly.
31
31
  - To open the file from disk, build the absolute path under `<homeDir>/.claude/projects/...` using the rules above, then call Read with that path.
32
32
 
33
+ ## Delivery to the model (SDK vs CLI engine)
34
+
35
+ The on-disk location above is identical for both conversation engines, but how the bytes reach the model differs:
36
+
37
+ - **SDK engine** — The image is embedded inline in the request as a base64 content block. The model receives it as a vision input directly; no file read occurs.
38
+ - **CLI engine** — The interactive CLI channel carries only text, so the image is referenced **by path** instead. Right after storing, Hammoc grants the model read access to the session image directory (`<homeDir>/.claude/projects/<encoded-project-path>/images/<sessionId>`) via the CLI `--add-dir` flag, then appends an instruction to the prompt telling the model to open the listed absolute path(s) with its Read tool. The grant is scoped to exactly that one image directory (which sits outside the project cwd), and reading an `--add-dir`'d image this way does not raise a permission prompt.
39
+
40
+ For an agent: in CLI mode an attached image arrives as a literal "use your Read tool to open this file" instruction carrying an absolute path under `.claude/projects/.../images/...` — that path resolves with the rules above.
41
+
33
42
  ## Lifecycle
34
43
 
35
44
  - Images are written the moment the user sends a message with attachments.
@@ -0,0 +1,23 @@
1
+ # Observability Storage
2
+
3
+ Hammoc's Observability panel (user-facing, manual §12.18) persists two kinds of data under the user's home `.hammoc` directory. These are **not** under `.claude/` and are reached with direct file reads, not through the harness file service.
4
+
5
+ `<homeDir>` must be resolved before use — Read does not expand `~`. On Windows that is `C:\Users\<user>\`.
6
+
7
+ ## MCP / tool call log
8
+
9
+ - **Path:** `<homeDir>/.hammoc/observability/<projectSlug>.jsonl`
10
+ - **Format:** JSON Lines — one tool-call record per line. Each record holds: tool-use id, project slug, session id, server name (parsed from the `mcp__<server>__<tool>` prefix; `null` for built-in tools like Read/Edit/Bash), tool name, start timestamp (epoch ms), duration in ms (`null` if the call never returned), argument byte size, result byte size (`null` if no response), and a success flag (`null` if no response).
11
+ - **Bodies are never written** — only sizes. The log therefore cannot leak file contents or secrets.
12
+ - **Retention:** records older than 30 days (override with the `OBSERVABILITY_RETENTION_DAYS` env var) are pruned on append (throttled to ~30 min) and at server startup.
13
+ - **Written by:** the chat service hooks the existing SDK message stream and appends one record per tool result. "Orphan" calls (started, never returned) are flushed once at turn end with `null` duration / result / success.
14
+
15
+ ## Exact token-count cache
16
+
17
+ - **Path:** `<homeDir>/.hammoc/observability/token-count-cache.json`
18
+ - **Format:** a JSON object mapping a SHA-256 hash of the input text → official token count.
19
+ - The **Exact count** button calls Anthropic's count-tokens API; the result is cached here keyed by content hash, so re-counting an unchanged file is free and the cache is shared across projects (identical files hash the same).
20
+
21
+ ## Tokenizer preference
22
+
23
+ - The inline `~` hint is always a byte-size heuristic (size ÷ 4); a tokenizer-grade tier was evaluated but not adopted (it drifted 25–45% from the official count on Claude 4.x). The preference lives in `<homeDir>/.hammoc/preferences.json` under `observabilityTokenizer` and is global (all projects), though its toggle UI sits inside the Observability panel.