hammoc 1.3.0 → 1.5.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 (336) hide show
  1. package/README.md +422 -403
  2. package/bin/hammoc.js +0 -6
  3. package/package.json +100 -93
  4. package/packages/client/dist/assets/agentExampleHighlight-BgwTm15v.js +1 -0
  5. package/packages/client/dist/assets/commandTokenHighlight-BljHwnrK.js +1 -0
  6. package/packages/client/dist/assets/index-CjyjnXB8.css +32 -0
  7. package/packages/client/dist/assets/index-D3LxqW3f.js +2 -0
  8. package/packages/client/dist/assets/index-NqJdhlek.js +1498 -0
  9. package/packages/client/dist/assets/snippetTokenHighlight-DWsaQXX0.js +1 -0
  10. package/packages/client/dist/index.html +2 -2
  11. package/packages/client/dist/sw.js +1 -1
  12. package/packages/server/dist/app.d.ts.map +1 -1
  13. package/packages/server/dist/app.js +24 -24
  14. package/packages/server/dist/app.js.map +1 -1
  15. package/packages/server/dist/controllers/boardController.d.ts.map +1 -1
  16. package/packages/server/dist/controllers/boardController.js +0 -5
  17. package/packages/server/dist/controllers/boardController.js.map +1 -1
  18. package/packages/server/dist/controllers/claudeMdController.d.ts +26 -0
  19. package/packages/server/dist/controllers/claudeMdController.d.ts.map +1 -0
  20. package/packages/server/dist/controllers/claudeMdController.js +158 -0
  21. package/packages/server/dist/controllers/claudeMdController.js.map +1 -0
  22. package/packages/server/dist/controllers/fileSystemController.d.ts +4 -0
  23. package/packages/server/dist/controllers/fileSystemController.d.ts.map +1 -1
  24. package/packages/server/dist/controllers/fileSystemController.js +20 -2
  25. package/packages/server/dist/controllers/fileSystemController.js.map +1 -1
  26. package/packages/server/dist/controllers/harnessAgentController.d.ts +28 -0
  27. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -0
  28. package/packages/server/dist/controllers/harnessAgentController.js +339 -0
  29. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -0
  30. package/packages/server/dist/controllers/harnessCommandController.d.ts +28 -0
  31. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -0
  32. package/packages/server/dist/controllers/harnessCommandController.js +382 -0
  33. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -0
  34. package/packages/server/dist/controllers/harnessController.d.ts +21 -0
  35. package/packages/server/dist/controllers/harnessController.d.ts.map +1 -0
  36. package/packages/server/dist/controllers/harnessController.js +176 -0
  37. package/packages/server/dist/controllers/harnessController.js.map +1 -0
  38. package/packages/server/dist/controllers/harnessHookController.d.ts +32 -0
  39. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -0
  40. package/packages/server/dist/controllers/harnessHookController.js +363 -0
  41. package/packages/server/dist/controllers/harnessHookController.js.map +1 -0
  42. package/packages/server/dist/controllers/harnessLintController.d.ts +18 -0
  43. package/packages/server/dist/controllers/harnessLintController.d.ts.map +1 -0
  44. package/packages/server/dist/controllers/harnessLintController.js +72 -0
  45. package/packages/server/dist/controllers/harnessLintController.js.map +1 -0
  46. package/packages/server/dist/controllers/harnessMcpController.d.ts +28 -0
  47. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -0
  48. package/packages/server/dist/controllers/harnessMcpController.js +310 -0
  49. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -0
  50. package/packages/server/dist/controllers/harnessPluginController.d.ts +17 -0
  51. package/packages/server/dist/controllers/harnessPluginController.d.ts.map +1 -0
  52. package/packages/server/dist/controllers/harnessPluginController.js +115 -0
  53. package/packages/server/dist/controllers/harnessPluginController.js.map +1 -0
  54. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +15 -0
  55. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -0
  56. package/packages/server/dist/controllers/harnessShareScopeController.js +73 -0
  57. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -0
  58. package/packages/server/dist/controllers/harnessSkillController.d.ts +32 -0
  59. package/packages/server/dist/controllers/harnessSkillController.d.ts.map +1 -0
  60. package/packages/server/dist/controllers/harnessSkillController.js +453 -0
  61. package/packages/server/dist/controllers/harnessSkillController.js.map +1 -0
  62. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  63. package/packages/server/dist/controllers/projectController.js +11 -0
  64. package/packages/server/dist/controllers/projectController.js.map +1 -1
  65. package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
  66. package/packages/server/dist/controllers/serverController.js +84 -49
  67. package/packages/server/dist/controllers/serverController.js.map +1 -1
  68. package/packages/server/dist/controllers/snippetController.d.ts +35 -0
  69. package/packages/server/dist/controllers/snippetController.d.ts.map +1 -0
  70. package/packages/server/dist/controllers/snippetController.js +294 -0
  71. package/packages/server/dist/controllers/snippetController.js.map +1 -0
  72. package/packages/server/dist/handlers/websocket.d.ts +16 -0
  73. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  74. package/packages/server/dist/handlers/websocket.js +221 -8
  75. package/packages/server/dist/handlers/websocket.js.map +1 -1
  76. package/packages/server/dist/index.js +66 -0
  77. package/packages/server/dist/index.js.map +1 -1
  78. package/packages/server/dist/locales/en/server.json +41 -6
  79. package/packages/server/dist/locales/es/server.json +3 -5
  80. package/packages/server/dist/locales/ja/server.json +3 -5
  81. package/packages/server/dist/locales/ko/server.json +4 -6
  82. package/packages/server/dist/locales/pt/server.json +3 -5
  83. package/packages/server/dist/locales/zh-CN/server.json +3 -5
  84. package/packages/server/dist/routes/account.d.ts +7 -0
  85. package/packages/server/dist/routes/account.d.ts.map +1 -0
  86. package/packages/server/dist/routes/account.js +35 -0
  87. package/packages/server/dist/routes/account.js.map +1 -0
  88. package/packages/server/dist/routes/debug.d.ts +1 -1
  89. package/packages/server/dist/routes/debug.d.ts.map +1 -1
  90. package/packages/server/dist/routes/debug.js +60 -1
  91. package/packages/server/dist/routes/debug.js.map +1 -1
  92. package/packages/server/dist/routes/harness.d.ts +8 -0
  93. package/packages/server/dist/routes/harness.d.ts.map +1 -0
  94. package/packages/server/dist/routes/harness.js +92 -0
  95. package/packages/server/dist/routes/harness.js.map +1 -0
  96. package/packages/server/dist/routes/preferences.d.ts.map +1 -1
  97. package/packages/server/dist/routes/preferences.js +11 -2
  98. package/packages/server/dist/routes/preferences.js.map +1 -1
  99. package/packages/server/dist/routes/projects.d.ts.map +1 -1
  100. package/packages/server/dist/routes/projects.js +5 -60
  101. package/packages/server/dist/routes/projects.js.map +1 -1
  102. package/packages/server/dist/routes/snippets.d.ts +14 -0
  103. package/packages/server/dist/routes/snippets.d.ts.map +1 -0
  104. package/packages/server/dist/routes/snippets.js +27 -0
  105. package/packages/server/dist/routes/snippets.js.map +1 -0
  106. package/packages/server/dist/services/accountInfoService.d.ts +38 -0
  107. package/packages/server/dist/services/accountInfoService.d.ts.map +1 -0
  108. package/packages/server/dist/services/accountInfoService.js +118 -0
  109. package/packages/server/dist/services/accountInfoService.js.map +1 -0
  110. package/packages/server/dist/services/bmadStatusService.d.ts +6 -2
  111. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  112. package/packages/server/dist/services/bmadStatusService.js +88 -32
  113. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  114. package/packages/server/dist/services/chatService.d.ts +3 -0
  115. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  116. package/packages/server/dist/services/chatService.js +36 -8
  117. package/packages/server/dist/services/chatService.js.map +1 -1
  118. package/packages/server/dist/services/claudeMdService.d.ts +48 -0
  119. package/packages/server/dist/services/claudeMdService.d.ts.map +1 -0
  120. package/packages/server/dist/services/claudeMdService.js +240 -0
  121. package/packages/server/dist/services/claudeMdService.js.map +1 -0
  122. package/packages/server/dist/services/commandService.d.ts +10 -0
  123. package/packages/server/dist/services/commandService.d.ts.map +1 -1
  124. package/packages/server/dist/services/commandService.js +129 -4
  125. package/packages/server/dist/services/commandService.js.map +1 -1
  126. package/packages/server/dist/services/fileSystemService.d.ts +7 -1
  127. package/packages/server/dist/services/fileSystemService.d.ts.map +1 -1
  128. package/packages/server/dist/services/fileSystemService.js +67 -8
  129. package/packages/server/dist/services/fileSystemService.js.map +1 -1
  130. package/packages/server/dist/services/fileWatcherService.d.ts +59 -0
  131. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -0
  132. package/packages/server/dist/services/fileWatcherService.js +329 -0
  133. package/packages/server/dist/services/fileWatcherService.js.map +1 -0
  134. package/packages/server/dist/services/gitService.d.ts.map +1 -1
  135. package/packages/server/dist/services/gitService.js +67 -7
  136. package/packages/server/dist/services/gitService.js.map +1 -1
  137. package/packages/server/dist/services/harnessAgentService.d.ts +79 -0
  138. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -0
  139. package/packages/server/dist/services/harnessAgentService.js +933 -0
  140. package/packages/server/dist/services/harnessAgentService.js.map +1 -0
  141. package/packages/server/dist/services/harnessCommandService.d.ts +60 -0
  142. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -0
  143. package/packages/server/dist/services/harnessCommandService.js +853 -0
  144. package/packages/server/dist/services/harnessCommandService.js.map +1 -0
  145. package/packages/server/dist/services/harnessHookService.d.ts +55 -0
  146. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -0
  147. package/packages/server/dist/services/harnessHookService.js +1060 -0
  148. package/packages/server/dist/services/harnessHookService.js.map +1 -0
  149. package/packages/server/dist/services/harnessLintService.d.ts +49 -0
  150. package/packages/server/dist/services/harnessLintService.d.ts.map +1 -0
  151. package/packages/server/dist/services/harnessLintService.js +628 -0
  152. package/packages/server/dist/services/harnessLintService.js.map +1 -0
  153. package/packages/server/dist/services/harnessMcpService.d.ts +77 -0
  154. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -0
  155. package/packages/server/dist/services/harnessMcpService.js +814 -0
  156. package/packages/server/dist/services/harnessMcpService.js.map +1 -0
  157. package/packages/server/dist/services/harnessPluginService.d.ts +66 -0
  158. package/packages/server/dist/services/harnessPluginService.d.ts.map +1 -0
  159. package/packages/server/dist/services/harnessPluginService.js +559 -0
  160. package/packages/server/dist/services/harnessPluginService.js.map +1 -0
  161. package/packages/server/dist/services/harnessService.d.ts +40 -0
  162. package/packages/server/dist/services/harnessService.d.ts.map +1 -0
  163. package/packages/server/dist/services/harnessService.js +222 -0
  164. package/packages/server/dist/services/harnessService.js.map +1 -0
  165. package/packages/server/dist/services/harnessShareScopeService.d.ts +31 -0
  166. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -0
  167. package/packages/server/dist/services/harnessShareScopeService.js +93 -0
  168. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -0
  169. package/packages/server/dist/services/harnessSkillService.d.ts +70 -0
  170. package/packages/server/dist/services/harnessSkillService.d.ts.map +1 -0
  171. package/packages/server/dist/services/harnessSkillService.js +636 -0
  172. package/packages/server/dist/services/harnessSkillService.js.map +1 -0
  173. package/packages/server/dist/services/historyParser.d.ts +4 -14
  174. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  175. package/packages/server/dist/services/historyParser.js +60 -5
  176. package/packages/server/dist/services/historyParser.js.map +1 -1
  177. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  178. package/packages/server/dist/services/issueService.js +10 -2
  179. package/packages/server/dist/services/issueService.js.map +1 -1
  180. package/packages/server/dist/services/manualSyncService.d.ts +19 -0
  181. package/packages/server/dist/services/manualSyncService.d.ts.map +1 -0
  182. package/packages/server/dist/services/manualSyncService.js +110 -0
  183. package/packages/server/dist/services/manualSyncService.js.map +1 -0
  184. package/packages/server/dist/services/notificationService.d.ts.map +1 -1
  185. package/packages/server/dist/services/notificationService.js +34 -9
  186. package/packages/server/dist/services/notificationService.js.map +1 -1
  187. package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
  188. package/packages/server/dist/services/preferencesService.js +8 -1
  189. package/packages/server/dist/services/preferencesService.js.map +1 -1
  190. package/packages/server/dist/services/projectService.d.ts +5 -0
  191. package/packages/server/dist/services/projectService.d.ts.map +1 -1
  192. package/packages/server/dist/services/projectService.js +42 -2
  193. package/packages/server/dist/services/projectService.js.map +1 -1
  194. package/packages/server/dist/services/ptyService.d.ts +1 -0
  195. package/packages/server/dist/services/ptyService.d.ts.map +1 -1
  196. package/packages/server/dist/services/ptyService.js +36 -5
  197. package/packages/server/dist/services/ptyService.js.map +1 -1
  198. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  199. package/packages/server/dist/services/queueService.js +83 -14
  200. package/packages/server/dist/services/queueService.js.map +1 -1
  201. package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -1
  202. package/packages/server/dist/services/sessionBufferManager.js +26 -0
  203. package/packages/server/dist/services/sessionBufferManager.js.map +1 -1
  204. package/packages/server/dist/services/sessionService.d.ts +4 -3
  205. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  206. package/packages/server/dist/services/sessionService.js +5 -4
  207. package/packages/server/dist/services/sessionService.js.map +1 -1
  208. package/packages/server/dist/services/snippetService.d.ts +54 -0
  209. package/packages/server/dist/services/snippetService.d.ts.map +1 -0
  210. package/packages/server/dist/services/snippetService.js +371 -0
  211. package/packages/server/dist/services/snippetService.js.map +1 -0
  212. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts +46 -0
  213. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts.map +1 -0
  214. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js +125 -0
  215. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js.map +1 -0
  216. package/packages/server/dist/services/webPushService.d.ts.map +1 -1
  217. package/packages/server/dist/services/webPushService.js +8 -1
  218. package/packages/server/dist/services/webPushService.js.map +1 -1
  219. package/packages/server/dist/snippets/split-commit +9 -0
  220. package/packages/server/dist/utils/applySecretsPolicy.d.ts +53 -0
  221. package/packages/server/dist/utils/applySecretsPolicy.d.ts.map +1 -0
  222. package/packages/server/dist/utils/applySecretsPolicy.js +204 -0
  223. package/packages/server/dist/utils/applySecretsPolicy.js.map +1 -0
  224. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts +40 -0
  225. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts.map +1 -0
  226. package/packages/server/dist/utils/assertNoSecretOnShared.js +47 -0
  227. package/packages/server/dist/utils/assertNoSecretOnShared.js.map +1 -0
  228. package/packages/server/dist/utils/effortUtils.d.ts +21 -0
  229. package/packages/server/dist/utils/effortUtils.d.ts.map +1 -0
  230. package/packages/server/dist/utils/effortUtils.js +36 -0
  231. package/packages/server/dist/utils/effortUtils.js.map +1 -0
  232. package/packages/server/dist/utils/gitignoreFilter.d.ts +23 -0
  233. package/packages/server/dist/utils/gitignoreFilter.d.ts.map +1 -0
  234. package/packages/server/dist/utils/gitignoreFilter.js +42 -0
  235. package/packages/server/dist/utils/gitignoreFilter.js.map +1 -0
  236. package/packages/server/dist/utils/harnessBundleSchema.d.ts +105 -0
  237. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -0
  238. package/packages/server/dist/utils/harnessBundleSchema.js +79 -0
  239. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -0
  240. package/packages/server/dist/utils/harnessPaths.d.ts +34 -0
  241. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -0
  242. package/packages/server/dist/utils/harnessPaths.js +124 -0
  243. package/packages/server/dist/utils/harnessPaths.js.map +1 -0
  244. package/packages/server/dist/utils/pathUtils.d.ts +3 -2
  245. package/packages/server/dist/utils/pathUtils.d.ts.map +1 -1
  246. package/packages/server/dist/utils/pathUtils.js +26 -2
  247. package/packages/server/dist/utils/pathUtils.js.map +1 -1
  248. package/packages/server/dist/utils/secretHeuristic.d.ts +72 -0
  249. package/packages/server/dist/utils/secretHeuristic.d.ts.map +1 -0
  250. package/packages/server/dist/utils/secretHeuristic.js +163 -0
  251. package/packages/server/dist/utils/secretHeuristic.js.map +1 -0
  252. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts +41 -0
  253. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts.map +1 -0
  254. package/packages/server/dist/utils/secretPlaceholderNamer.js +81 -0
  255. package/packages/server/dist/utils/secretPlaceholderNamer.js.map +1 -0
  256. package/packages/server/dist/utils/serverPathResolver.d.ts +29 -0
  257. package/packages/server/dist/utils/serverPathResolver.d.ts.map +1 -0
  258. package/packages/server/dist/utils/serverPathResolver.js +59 -0
  259. package/packages/server/dist/utils/serverPathResolver.js.map +1 -0
  260. package/packages/server/dist/utils/snippetPaths.d.ts +61 -0
  261. package/packages/server/dist/utils/snippetPaths.d.ts.map +1 -0
  262. package/packages/server/dist/utils/snippetPaths.js +123 -0
  263. package/packages/server/dist/utils/snippetPaths.js.map +1 -0
  264. package/packages/server/dist/utils/structuredEditor.d.ts +34 -0
  265. package/packages/server/dist/utils/structuredEditor.d.ts.map +1 -0
  266. package/packages/server/dist/utils/structuredEditor.js +111 -0
  267. package/packages/server/dist/utils/structuredEditor.js.map +1 -0
  268. package/packages/server/package.json +6 -2
  269. package/packages/server/resources/internals/INDEX.md +23 -0
  270. package/packages/server/resources/internals/harness-files.md +63 -0
  271. package/packages/server/resources/internals/image-storage.md +43 -0
  272. package/packages/server/resources/manual/01-getting-started.md +104 -0
  273. package/packages/server/resources/manual/02-chat.md +285 -0
  274. package/packages/server/resources/manual/03-sessions.md +48 -0
  275. package/packages/server/resources/manual/04-slash-commands-favorites.md +152 -0
  276. package/packages/server/resources/manual/05-projects.md +74 -0
  277. package/packages/server/resources/manual/06-file-explorer-editor.md +90 -0
  278. package/packages/server/resources/manual/07-git.md +94 -0
  279. package/packages/server/resources/manual/08-terminal.md +59 -0
  280. package/packages/server/resources/manual/09-queue-runner.md +262 -0
  281. package/packages/server/resources/manual/10-project-board.md +193 -0
  282. package/packages/server/resources/manual/11-bmad-method-integration.md +128 -0
  283. package/packages/server/resources/manual/12-harness-workbench.md +175 -0
  284. package/packages/server/resources/manual/13-settings.md +241 -0
  285. package/packages/server/resources/manual/14-keyboard-shortcuts.md +68 -0
  286. package/packages/server/resources/manual/15-environment-variables.md +28 -0
  287. package/packages/server/resources/manual/16-troubleshooting.md +110 -0
  288. package/packages/server/resources/manual/INDEX.md +60 -0
  289. package/packages/shared/dist/index.d.ts +3 -0
  290. package/packages/shared/dist/index.d.ts.map +1 -1
  291. package/packages/shared/dist/index.js +6 -0
  292. package/packages/shared/dist/index.js.map +1 -1
  293. package/packages/shared/dist/types/command.d.ts +3 -3
  294. package/packages/shared/dist/types/command.d.ts.map +1 -1
  295. package/packages/shared/dist/types/fileSystem.d.ts +19 -0
  296. package/packages/shared/dist/types/fileSystem.d.ts.map +1 -1
  297. package/packages/shared/dist/types/fileSystem.js +5 -0
  298. package/packages/shared/dist/types/fileSystem.js.map +1 -1
  299. package/packages/shared/dist/types/git.d.ts +6 -1
  300. package/packages/shared/dist/types/git.d.ts.map +1 -1
  301. package/packages/shared/dist/types/git.js.map +1 -1
  302. package/packages/shared/dist/types/harness.d.ts +1211 -0
  303. package/packages/shared/dist/types/harness.d.ts.map +1 -0
  304. package/packages/shared/dist/types/harness.js +107 -0
  305. package/packages/shared/dist/types/harness.js.map +1 -0
  306. package/packages/shared/dist/types/harnessBundle.d.ts +170 -0
  307. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -0
  308. package/packages/shared/dist/types/harnessBundle.js +18 -0
  309. package/packages/shared/dist/types/harnessBundle.js.map +1 -0
  310. package/packages/shared/dist/types/history.d.ts +7 -0
  311. package/packages/shared/dist/types/history.d.ts.map +1 -1
  312. package/packages/shared/dist/types/preferences.d.ts +4 -1
  313. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  314. package/packages/shared/dist/types/preferences.js +1 -0
  315. package/packages/shared/dist/types/preferences.js.map +1 -1
  316. package/packages/shared/dist/types/queue.d.ts +9 -0
  317. package/packages/shared/dist/types/queue.d.ts.map +1 -1
  318. package/packages/shared/dist/types/sdk.d.ts +42 -1
  319. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  320. package/packages/shared/dist/types/sdk.js +26 -2
  321. package/packages/shared/dist/types/sdk.js.map +1 -1
  322. package/packages/shared/dist/types/websocket.d.ts +24 -0
  323. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  324. package/packages/shared/dist/utils/markdownSections.d.ts +50 -0
  325. package/packages/shared/dist/utils/markdownSections.d.ts.map +1 -0
  326. package/packages/shared/dist/utils/markdownSections.js +111 -0
  327. package/packages/shared/dist/utils/markdownSections.js.map +1 -0
  328. package/packages/shared/dist/utils/queueParser.d.ts.map +1 -1
  329. package/packages/shared/dist/utils/queueParser.js +104 -0
  330. package/packages/shared/dist/utils/queueParser.js.map +1 -1
  331. package/scripts/build-manual-shards.mjs +100 -0
  332. package/scripts/mock-telegram.mjs +172 -0
  333. package/scripts/run-integration-test.mjs +362 -0
  334. package/packages/client/dist/assets/index-Bf0D9oVJ.css +0 -32
  335. package/packages/client/dist/assets/index-CRmzoqHy.js +0 -2
  336. package/packages/client/dist/assets/index-CszGQ29O.js +0 -1432
@@ -0,0 +1,559 @@
1
+ /**
2
+ * Story 28.1: Harness plugin service.
3
+ *
4
+ * Combines three user-scope files — `plugins/installed_plugins.json`,
5
+ * `plugins/known_marketplaces.json`, and `settings.json` — into a card list
6
+ * consumable by the "Harness Workbench → Plugins" panel. All file I/O is
7
+ * delegated to `harnessService` so traversal guards, STALE_WRITE, and binary
8
+ * detection are reused from Story 28.0.5.
9
+ *
10
+ * The service is intentionally read-heavy on `listCards` and narrow on
11
+ * `toggleEnabled` — it touches only the `enabledPlugins` field of
12
+ * `settings.json` via JSONC round-trip so comments and key order are
13
+ * preserved.
14
+ */
15
+ import path from 'path';
16
+ import fs from 'fs/promises';
17
+ import { HARNESS_ERRORS, } from '@hammoc/shared';
18
+ import { harnessService } from './harnessService.js';
19
+ import { projectService } from './projectService.js';
20
+ import { getUserHarnessRoot } from '../utils/harnessPaths.js';
21
+ function throwMapped(code, message, extras) {
22
+ const err = new Error(message);
23
+ err.code = code;
24
+ if (extras)
25
+ Object.assign(err, extras);
26
+ throw err;
27
+ }
28
+ function isFileNotFound(err) {
29
+ return err?.code === HARNESS_ERRORS.HARNESS_FILE_NOT_FOUND.code;
30
+ }
31
+ class HarnessPluginService {
32
+ async listCards(currentProjectSlug) {
33
+ const currentProjectPath = await this.resolveCurrentProjectPath(currentProjectSlug);
34
+ // Step 1: installed_plugins.json (file absent → empty catalog, not an error)
35
+ let installed = {};
36
+ try {
37
+ const res = await harnessService.read({
38
+ scope: 'user',
39
+ relativePath: 'plugins/installed_plugins.json',
40
+ });
41
+ installed = this.parseJson(res.content ?? '', {});
42
+ }
43
+ catch (err) {
44
+ if (!isFileNotFound(err))
45
+ throw err;
46
+ const fallbackEnabled = await this.readEnabledPluginsFromSettings('user');
47
+ return {
48
+ cards: [],
49
+ enabledPluginsFormat: 'object',
50
+ currentProjectPath,
51
+ settingsMtime: fallbackEnabled.mtime,
52
+ };
53
+ }
54
+ // Step 2: known_marketplaces.json (file absent → empty map, keep going)
55
+ let marketplaces = {};
56
+ try {
57
+ const res = await harnessService.read({
58
+ scope: 'user',
59
+ relativePath: 'plugins/known_marketplaces.json',
60
+ });
61
+ marketplaces = this.parseJson(res.content ?? '', {});
62
+ }
63
+ catch (err) {
64
+ if (!isFileNotFound(err))
65
+ throw err;
66
+ }
67
+ // Step 3: per-market marketplace.json files (build a name→meta map)
68
+ const marketMetaByKey = new Map();
69
+ for (const marketName of Object.keys(marketplaces)) {
70
+ try {
71
+ const res = await harnessService.read({
72
+ scope: 'user',
73
+ relativePath: `plugins/marketplaces/${marketName}/.claude-plugin/marketplace.json`,
74
+ });
75
+ const parsed = this.parseJson(res.content ?? '', {});
76
+ for (const meta of parsed.plugins ?? []) {
77
+ if (meta?.name) {
78
+ marketMetaByKey.set(`${meta.name}@${marketName}`, meta);
79
+ }
80
+ }
81
+ }
82
+ catch (err) {
83
+ if (!isFileNotFound(err))
84
+ throw err;
85
+ }
86
+ }
87
+ // Step 4: enabledPlugins from both settings.json files. The user-scope
88
+ // file (~/.claude/settings.json) is the single source of truth for
89
+ // user-scope cards' enabled flag and toggle target. The project-scope
90
+ // file (<currentProjectPath>/.claude/settings.json) does the same for
91
+ // project-scope cards whose projectPath matches the current session.
92
+ // CLI semantics: `/plugin install --scope project` writes enabledPlugins
93
+ // to the project's settings.json — we mirror that on the toggle path.
94
+ const userEnabled = await this.readEnabledPluginsFromSettings('user');
95
+ const projectEnabled = currentProjectSlug
96
+ ? await this.readEnabledPluginsFromSettings('project', currentProjectSlug)
97
+ : null;
98
+ // Step 5: build cards
99
+ const cards = [];
100
+ const plugins = installed.plugins ?? {};
101
+ for (const [key, value] of Object.entries(plugins)) {
102
+ const entries = Array.isArray(value) ? value : [value];
103
+ const [pluginName, marketplace] = this.splitKey(key);
104
+ for (const entry of entries) {
105
+ if (!entry || typeof entry !== 'object')
106
+ continue;
107
+ const routing = this.resolveSettingsRouting(entry, currentProjectPath);
108
+ // Pick which settings.json governs this specific card.
109
+ const enabledRead = routing === 'project' && projectEnabled
110
+ ? projectEnabled
111
+ : userEnabled;
112
+ const card = await this.buildCard({
113
+ key,
114
+ pluginName,
115
+ marketplace,
116
+ entry,
117
+ marketMeta: marketMetaByKey.get(key),
118
+ enabled: enabledRead.enabled.has(key),
119
+ settingsScope: routing,
120
+ settingsMtime: enabledRead.mtime,
121
+ });
122
+ cards.push(card);
123
+ }
124
+ }
125
+ return {
126
+ cards,
127
+ enabledPluginsFormat: userEnabled.format,
128
+ currentProjectPath,
129
+ settingsMtime: userEnabled.mtime,
130
+ };
131
+ }
132
+ async toggleEnabled(req, currentProjectSlug) {
133
+ // Step 1 — Load installed_plugins.json first. Existence check (step 2)
134
+ // must precede scope gating / settings routing so an unknown key surfaces
135
+ // as 404 rather than masquerading as 403 or hitting an unrelated read.
136
+ let installed = {};
137
+ try {
138
+ const res = await harnessService.read({
139
+ scope: 'user',
140
+ relativePath: 'plugins/installed_plugins.json',
141
+ });
142
+ installed = this.parseJson(res.content ?? '', {});
143
+ }
144
+ catch (err) {
145
+ if (!isFileNotFound(err))
146
+ throw err;
147
+ }
148
+ const raw = installed.plugins?.[req.key];
149
+ const entries = raw ? (Array.isArray(raw) ? raw : [raw]) : [];
150
+ if (entries.length === 0) {
151
+ throwMapped(HARNESS_ERRORS.HARNESS_PLUGIN_NOT_FOUND.code, `plugin key not installed: ${req.key}`);
152
+ }
153
+ // Step 3 — Determine which settings.json this toggle should write to.
154
+ // CLI semantics: a plugin installed with `--scope project` keeps its
155
+ // enabledPlugins entry inside the project's settings.json, not the global
156
+ // one. So if any matching `scope:project` entry has `projectPath` equal
157
+ // to the current session's project, we route to that project's settings.
158
+ // Otherwise (only user-scope entries, or project entries that don't
159
+ // match the current project), we fall through to the global settings or
160
+ // surface HARNESS_PLUGIN_SCOPE_DENIED.
161
+ const currentProjectPath = await this.resolveCurrentProjectPath(currentProjectSlug);
162
+ const targetScope = this.pickToggleTargetScope(entries, currentProjectPath);
163
+ if (targetScope === 'denied') {
164
+ throwMapped(HARNESS_ERRORS.HARNESS_PLUGIN_SCOPE_DENIED.code, 'project scope toggle requires the matching project context');
165
+ }
166
+ // Step 4 — Read the chosen settings.json (deferred until after gating so
167
+ // we never speculatively read the project file when the request is for a
168
+ // user-only plugin).
169
+ const targetRef = targetScope === 'project'
170
+ ? { scope: 'project', projectSlug: currentProjectSlug, relativePath: 'settings.json' }
171
+ : { scope: 'user', relativePath: 'settings.json' };
172
+ const enabledRead = await this.readEnabledPluginsFromSettings(targetScope, currentProjectSlug);
173
+ // Step 5 — Optimistic concurrency on the chosen file
174
+ if (req.expectedMtime !== undefined && req.expectedMtime !== enabledRead.mtime) {
175
+ throwMapped(HARNESS_ERRORS.HARNESS_STALE_WRITE.code, 'settings.json changed on disk', { currentMtime: enabledRead.mtime });
176
+ }
177
+ // Step 6 — Compute updated enabledPlugins value per current format
178
+ const updated = this.computeUpdatedEnabled(enabledRead.originalField, enabledRead.format, req.key, req.enabled);
179
+ // Step 7 — JSONC round-trip write to preserve comments / order
180
+ const write = await harnessService.patchStructured(targetRef, {
181
+ format: 'jsonc',
182
+ ops: [{ path: ['enabledPlugins'], value: updated }],
183
+ expectedMtime: enabledRead.mtime,
184
+ });
185
+ return { success: true, mtime: write.mtime, appliedFormat: enabledRead.format };
186
+ }
187
+ /**
188
+ * Decide which settings.json a toggle should write to (or that the toggle
189
+ * should be denied entirely). Mirrors the CLI's install-time scope choice.
190
+ *
191
+ * - Any `scope:project` entry whose `projectPath` matches the current
192
+ * project → write to the project's settings.json.
193
+ * - Only `scope:user` entries → write to the global settings.json.
194
+ * - One or more `scope:project` entries with no matching projectPath, and
195
+ * no user-scope entry → deny (HARNESS_PLUGIN_SCOPE_DENIED). This keeps
196
+ * us from silently writing project-scoped state into the wrong file.
197
+ */
198
+ pickToggleTargetScope(entries, currentProjectPath) {
199
+ const projectEntries = entries.filter((e) => e.scope === 'project');
200
+ const hasUserEntry = entries.some((e) => e.scope === 'user');
201
+ if (projectEntries.length > 0 && currentProjectPath) {
202
+ const matched = projectEntries.some((e) => typeof e.projectPath === 'string' && this.samePath(e.projectPath, currentProjectPath));
203
+ if (matched)
204
+ return 'project';
205
+ }
206
+ if (hasUserEntry)
207
+ return 'user';
208
+ // Only project entries remain, none matching → safe deny.
209
+ return 'denied';
210
+ }
211
+ // ---- internals ---------------------------------------------------------
212
+ /**
213
+ * Decide whether a card's toggle should target the user-scope or
214
+ * project-scope settings.json. Mirrors `pickToggleTargetScope` but for the
215
+ * single-entry list-card path, where we know exactly which entry is being
216
+ * routed. A `scope:project` entry with a matching `projectPath` → project.
217
+ * Anything else → user (the toggle may still be gated on the toggle path
218
+ * if the entry's projectPath disagrees with the current project — see
219
+ * pickToggleTargetScope's deny branch).
220
+ */
221
+ resolveSettingsRouting(entry, currentProjectPath) {
222
+ if (entry.scope === 'project'
223
+ && currentProjectPath
224
+ && typeof entry.projectPath === 'string'
225
+ && this.samePath(entry.projectPath, currentProjectPath)) {
226
+ return 'project';
227
+ }
228
+ return 'user';
229
+ }
230
+ async readEnabledPluginsFromSettings(scope = 'user', projectSlug) {
231
+ try {
232
+ const ref = scope === 'project' && projectSlug
233
+ ? { scope: 'project', projectSlug, relativePath: 'settings.json' }
234
+ : { scope: 'user', relativePath: 'settings.json' };
235
+ const res = await harnessService.read(ref);
236
+ const content = res.content ?? '';
237
+ let parsed = {};
238
+ try {
239
+ // settings.json is JSONC in practice. For read-only parsing we strip
240
+ // line/block comments before JSON.parse — the structured editor path
241
+ // handles the round-trip on write.
242
+ parsed = JSON.parse(stripJsonComments(content));
243
+ }
244
+ catch {
245
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'settings.json is not valid JSON');
246
+ }
247
+ const field = parsed['enabledPlugins'];
248
+ if (field === undefined || field === null) {
249
+ return {
250
+ enabled: new Set(),
251
+ format: 'object',
252
+ mtime: res.mtime,
253
+ raw: parsed,
254
+ originalField: undefined,
255
+ };
256
+ }
257
+ if (Array.isArray(field)) {
258
+ const enabled = new Set(field.filter((v) => typeof v === 'string'));
259
+ return { enabled, format: 'array', mtime: res.mtime, raw: parsed, originalField: field };
260
+ }
261
+ if (typeof field === 'object') {
262
+ const enabled = new Set();
263
+ for (const [k, v] of Object.entries(field)) {
264
+ if (v === true)
265
+ enabled.add(k);
266
+ }
267
+ return { enabled, format: 'object', mtime: res.mtime, raw: parsed, originalField: field };
268
+ }
269
+ // Unknown shape — treat as missing but keep `object` as the write default.
270
+ return { enabled: new Set(), format: 'object', mtime: res.mtime, raw: parsed, originalField: undefined };
271
+ }
272
+ catch (err) {
273
+ if (isFileNotFound(err)) {
274
+ return {
275
+ enabled: new Set(),
276
+ format: 'object',
277
+ mtime: '',
278
+ raw: {},
279
+ originalField: undefined,
280
+ };
281
+ }
282
+ throw err;
283
+ }
284
+ }
285
+ computeUpdatedEnabled(original, format, key, enabled) {
286
+ if (format === 'array') {
287
+ const arr = Array.isArray(original)
288
+ ? (original.filter((v) => typeof v === 'string'))
289
+ : [];
290
+ if (enabled) {
291
+ return arr.includes(key) ? [...arr] : [...arr, key];
292
+ }
293
+ return arr.filter((k) => k !== key);
294
+ }
295
+ // object format
296
+ const obj = (original && typeof original === 'object' && !Array.isArray(original))
297
+ ? { ...original }
298
+ : {};
299
+ if (enabled) {
300
+ obj[key] = true;
301
+ }
302
+ else {
303
+ delete obj[key];
304
+ }
305
+ return obj;
306
+ }
307
+ async resolveCurrentProjectPath(slug) {
308
+ if (!slug)
309
+ return undefined;
310
+ try {
311
+ return await projectService.resolveOriginalPath(slug);
312
+ }
313
+ catch {
314
+ return undefined;
315
+ }
316
+ }
317
+ splitKey(key) {
318
+ const at = key.lastIndexOf('@');
319
+ if (at <= 0)
320
+ return [key, ''];
321
+ return [key.slice(0, at), key.slice(at + 1)];
322
+ }
323
+ samePath(a, b) {
324
+ const na = path.resolve(a);
325
+ const nb = path.resolve(b);
326
+ // Windows path comparisons are case-insensitive in practice.
327
+ return process.platform === 'win32'
328
+ ? na.toLowerCase() === nb.toLowerCase()
329
+ : na === nb;
330
+ }
331
+ parseJson(content, fallback) {
332
+ const trimmed = content.trim();
333
+ if (!trimmed)
334
+ return fallback;
335
+ try {
336
+ return JSON.parse(trimmed);
337
+ }
338
+ catch {
339
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'malformed JSON catalog');
340
+ }
341
+ }
342
+ async buildCard(params) {
343
+ const { key, pluginName, marketplace, entry, marketMeta, enabled, settingsScope, settingsMtime } = params;
344
+ const counts = await this.countComponents(entry.installPath);
345
+ const manifest = await this.readManifest(entry.installPath);
346
+ const pluginType = this.decideType(counts);
347
+ const versionShort = (entry.gitCommitSha ?? entry.version ?? '').slice(0, 7);
348
+ return {
349
+ key,
350
+ name: pluginName,
351
+ marketplace,
352
+ version: versionShort,
353
+ scope: entry.scope,
354
+ category: marketMeta?.category,
355
+ projectPath: entry.projectPath,
356
+ enabled,
357
+ pluginType,
358
+ componentCounts: counts,
359
+ manifest,
360
+ settingsScope,
361
+ settingsMtime,
362
+ };
363
+ }
364
+ decideType(counts) {
365
+ const onlyMcp = counts.skills === 0
366
+ && counts.commands === 0
367
+ && counts.agents === 0
368
+ && counts.hooks === 0
369
+ && counts.mcpServers > 0;
370
+ return onlyMcp ? 'external-mcp' : 'standard';
371
+ }
372
+ /**
373
+ * Enumerate plugin bundle components. Uses direct `fs` access rather than
374
+ * `harnessService.list` because the install path may live under
375
+ * `~/.claude/plugins/cache/...` but the exact nesting is vendor-controlled
376
+ * and we don't want each subdir to round-trip through the traversal guard
377
+ * individually. We still refuse to enumerate any path that isn't contained
378
+ * in `~/.claude` (per AC — fallback all-zero).
379
+ */
380
+ async countComponents(installPath) {
381
+ const zero = {
382
+ skills: 0, commands: 0, agents: 0, hooks: 0, mcpServers: 0,
383
+ };
384
+ if (!installPath || typeof installPath !== 'string')
385
+ return zero;
386
+ const userRoot = path.resolve(getUserHarnessRoot());
387
+ const abs = path.resolve(installPath);
388
+ if (abs !== userRoot && !abs.startsWith(userRoot + path.sep)) {
389
+ return zero;
390
+ }
391
+ const [skills, commands, agents, hooks, mcpServers] = await Promise.all([
392
+ this.countSkillsDir(path.join(abs, 'skills')),
393
+ this.countMarkdownFiles(path.join(abs, 'commands')),
394
+ this.countMarkdownFiles(path.join(abs, 'agents')),
395
+ this.countHooksJson(path.join(abs, 'hooks', 'hooks.json')),
396
+ this.countMcpServers(path.join(abs, '.mcp.json')),
397
+ ]);
398
+ return { skills, commands, agents, hooks, mcpServers };
399
+ }
400
+ async countSkillsDir(dir) {
401
+ try {
402
+ const entries = await fs.readdir(dir, { withFileTypes: true });
403
+ let n = 0;
404
+ for (const ent of entries) {
405
+ if (!ent.isDirectory())
406
+ continue;
407
+ try {
408
+ await fs.access(path.join(dir, ent.name, 'SKILL.md'));
409
+ n += 1;
410
+ }
411
+ catch {
412
+ // no SKILL.md → skip
413
+ }
414
+ }
415
+ return n;
416
+ }
417
+ catch {
418
+ return 0;
419
+ }
420
+ }
421
+ async countMarkdownFiles(dir) {
422
+ try {
423
+ const entries = await fs.readdir(dir, { withFileTypes: true });
424
+ let n = 0;
425
+ for (const ent of entries) {
426
+ if (ent.isFile() && ent.name.toLowerCase().endsWith('.md'))
427
+ n += 1;
428
+ }
429
+ return n;
430
+ }
431
+ catch {
432
+ return 0;
433
+ }
434
+ }
435
+ async countHooksJson(file) {
436
+ try {
437
+ const content = await fs.readFile(file, 'utf-8');
438
+ const parsed = JSON.parse(content);
439
+ const hooks = parsed?.hooks;
440
+ if (!hooks || typeof hooks !== 'object')
441
+ return 0;
442
+ return Object.values(hooks)
443
+ .filter(Array.isArray)
444
+ .reduce((sum, arr) => sum + arr.length, 0);
445
+ }
446
+ catch {
447
+ return 0;
448
+ }
449
+ }
450
+ async countMcpServers(file) {
451
+ try {
452
+ const content = await fs.readFile(file, 'utf-8');
453
+ const parsed = JSON.parse(content);
454
+ if (!parsed || typeof parsed !== 'object')
455
+ return 0;
456
+ // Preferred shape: `{ mcpServers: { ... } }`.
457
+ const wrapper = parsed.mcpServers;
458
+ if (wrapper && typeof wrapper === 'object' && !Array.isArray(wrapper)) {
459
+ return Object.keys(wrapper).length;
460
+ }
461
+ // Fallback for flat-map layouts: only count keys whose value *looks like*
462
+ // a server definition (object with command/url/type/transport). This
463
+ // keeps metadata keys like $schema/version from inflating the count.
464
+ let n = 0;
465
+ for (const value of Object.values(parsed)) {
466
+ if (isLikelyMcpServerEntry(value))
467
+ n += 1;
468
+ }
469
+ return n;
470
+ }
471
+ catch {
472
+ return 0;
473
+ }
474
+ }
475
+ async readManifest(installPath) {
476
+ try {
477
+ const file = path.join(installPath, '.claude-plugin', 'plugin.json');
478
+ const content = await fs.readFile(file, 'utf-8');
479
+ const parsed = JSON.parse(content);
480
+ if (!parsed?.name)
481
+ return undefined;
482
+ return {
483
+ name: parsed.name,
484
+ description: parsed.description,
485
+ author: parsed.author,
486
+ version: parsed.version,
487
+ };
488
+ }
489
+ catch {
490
+ return undefined;
491
+ }
492
+ }
493
+ }
494
+ /**
495
+ * Strip `//` line comments and `/* block * /` comments from JSONC input so the
496
+ * read path can `JSON.parse` safely. Write path still uses `applyJsoncPatch`
497
+ * via `harnessService.patchStructured`, which preserves comments.
498
+ *
499
+ * This is intentionally conservative: it ignores comment-like sequences
500
+ * inside string literals so we don't mangle paths or regex values.
501
+ */
502
+ function stripJsonComments(input) {
503
+ let out = '';
504
+ let i = 0;
505
+ let inString = false;
506
+ let stringQuote = '';
507
+ while (i < input.length) {
508
+ const ch = input[i];
509
+ const next = input[i + 1];
510
+ if (inString) {
511
+ out += ch;
512
+ if (ch === '\\' && i + 1 < input.length) {
513
+ out += next;
514
+ i += 2;
515
+ continue;
516
+ }
517
+ if (ch === stringQuote) {
518
+ inString = false;
519
+ }
520
+ i += 1;
521
+ continue;
522
+ }
523
+ if (ch === '"' || ch === "'") {
524
+ inString = true;
525
+ stringQuote = ch;
526
+ out += ch;
527
+ i += 1;
528
+ continue;
529
+ }
530
+ if (ch === '/' && next === '/') {
531
+ // line comment — skip to newline
532
+ i += 2;
533
+ while (i < input.length && input[i] !== '\n')
534
+ i += 1;
535
+ continue;
536
+ }
537
+ if (ch === '/' && next === '*') {
538
+ i += 2;
539
+ while (i < input.length && !(input[i] === '*' && input[i + 1] === '/'))
540
+ i += 1;
541
+ i += 2;
542
+ continue;
543
+ }
544
+ out += ch;
545
+ i += 1;
546
+ }
547
+ return out;
548
+ }
549
+ function isLikelyMcpServerEntry(value) {
550
+ if (!value || typeof value !== 'object' || Array.isArray(value))
551
+ return false;
552
+ const rec = value;
553
+ return (typeof rec.command === 'string'
554
+ || typeof rec.url === 'string'
555
+ || typeof rec.type === 'string'
556
+ || typeof rec.transport === 'string');
557
+ }
558
+ export const harnessPluginService = new HarnessPluginService();
559
+ //# sourceMappingURL=harnessPluginService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessPluginService.js","sourceRoot":"","sources":["../../src/services/harnessPluginService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Story 28.0.5: Harness workbench service.
3
+ *
4
+ * Domain: the project's `.claude/` subtree and the global `~/.claude/` subtree
5
+ * — the files that drive plugins, skills, MCP servers, hooks, commands, and
6
+ * subagents. Responsibilities are intentionally separated from
7
+ * `fileSystemService` (which serves arbitrary project files) so that path
8
+ * resolution, scope routing, and the structured-edit surface can evolve
9
+ * independently for harness consumers.
10
+ *
11
+ * Method contract surfaces (all throw typed errors from `HARNESS_ERRORS`):
12
+ * list — directory contents for a `.claude/` subtree
13
+ * read — single file read with binary detection + 1MB truncation
14
+ * write — raw write with expectedMtime / STALE_WRITE guard
15
+ * patchStructured — YAML/JSONC AST-level patch preserving comments & order
16
+ */
17
+ import { type HarnessPathRef, type HarnessListResponse, type HarnessReadResponse, type HarnessWriteRequest, type HarnessWriteResponse, type HarnessStructuredPatchRequest } from '@hammoc/shared';
18
+ declare class HarnessService {
19
+ /** List entries of a harness subtree. Missing root → empty list (AC1/AC2). */
20
+ list(ref: HarnessPathRef): Promise<HarnessListResponse>;
21
+ /** Read a single harness file. Binary → content:null, >1MB → truncated. */
22
+ read(ref: HarnessPathRef): Promise<HarnessReadResponse>;
23
+ /**
24
+ * Write a harness file with optional ETag/mtime conflict check.
25
+ * - expectedMtime present + file exists + mtime differs → STALE_WRITE
26
+ * - expectedMtime present + file missing → STALE_WRITE (currentMtime: '')
27
+ * - expectedMtime absent → force overwrite/create
28
+ * - parent directory missing → HARNESS_PARENT_NOT_FOUND (no auto-mkdir)
29
+ */
30
+ write(ref: HarnessPathRef, body: HarnessWriteRequest): Promise<HarnessWriteResponse>;
31
+ /**
32
+ * Read-patch-write an AST-level edit. Running the round trip through
33
+ * `write` means an external mutation that sneaks in between our read and
34
+ * write will surface as STALE_WRITE (AC5).
35
+ */
36
+ patchStructured(ref: HarnessPathRef, body: HarnessStructuredPatchRequest): Promise<HarnessWriteResponse>;
37
+ }
38
+ export declare const harnessService: HarnessService;
39
+ export {};
40
+ //# sourceMappingURL=harnessService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessService.d.ts","sourceRoot":"","sources":["../../src/services/harnessService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,EACnC,MAAM,gBAAgB,CAAC;AAaxB,cAAM,cAAc;IAClB,8EAA8E;IACxE,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyD7D,2EAA2E;IACrE,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuD7D;;;;;;OAMG;IACG,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4D1F;;;;OAIG;IACG,eAAe,CACnB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,oBAAoB,CAAC;CAajC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}