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,329 @@
1
+ /**
2
+ * File Watcher Service
3
+ * Watches the filesystem of active projects and broadcasts external-change
4
+ * events to clients subscribed to the project room. Each project is watched
5
+ * under a reference count so multiple subscribers (editor, explorer, chain, etc.)
6
+ * share one chokidar instance and the watcher tears down cleanly when the
7
+ * last client leaves.
8
+ *
9
+ * Self-write suppression: when Hammoc itself writes a file via fileSystemService,
10
+ * chokidar would normally echo that change back to the originating client and
11
+ * cause an "external change" banner on their own save. Callers must invoke
12
+ * noteLocalWrite(absolutePath) immediately after writing — events for paths
13
+ * noted within the last SELF_WRITE_WINDOW_MS are silently dropped.
14
+ *
15
+ * Story 28.0.5: extended with harness-scope watchers over ~/.claude (user) and
16
+ * <project>/.claude (project). Harness watchers emit `harness:external-change`
17
+ * on dedicated rooms and share the same self-write-suppression map so writes
18
+ * coming out of harnessService do not echo back to the originating client.
19
+ */
20
+ import chokidar from 'chokidar';
21
+ import path from 'path';
22
+ import { getIO } from '../handlers/websocket.js';
23
+ import { createLogger } from '../utils/logger.js';
24
+ import { getUserHarnessRoot, getProjectHarnessRoot } from '../utils/harnessPaths.js';
25
+ const log = createLogger('fileWatcher');
26
+ /** Directories where we never recurse — mirrors fileSystemService.SKIP_DIRS. */
27
+ const SKIP_DIRS = new Set([
28
+ 'node_modules', '.git', '.next', '.cache', '__pycache__', 'dist', '.turbo',
29
+ ]);
30
+ function harnessKey(ref) {
31
+ return ref.scope === 'user'
32
+ ? 'harness:user'
33
+ : `harness:project:${ref.projectSlug ?? ''}`;
34
+ }
35
+ function harnessRoom(ref) {
36
+ return harnessKey(ref);
37
+ }
38
+ class FileWatcherService {
39
+ watchers = new Map();
40
+ harnessWatchers = new Map();
41
+ /** absolute path → timestamp (ms) of the last local write */
42
+ pendingLocalWrites = new Map();
43
+ /** Events arriving within this window after a local write are treated as our own echo. */
44
+ static SELF_WRITE_WINDOW_MS = 1500;
45
+ /**
46
+ * Start (or increment the ref count of) a watcher for the given project.
47
+ * No-op if projectRoot is falsy.
48
+ */
49
+ ensureWatcher(projectSlug, projectRoot) {
50
+ if (!projectSlug || !projectRoot)
51
+ return;
52
+ const existing = this.watchers.get(projectSlug);
53
+ if (existing) {
54
+ existing.refCount++;
55
+ return;
56
+ }
57
+ const watcher = chokidar.watch(projectRoot, {
58
+ ignoreInitial: true,
59
+ ignored: (target) => {
60
+ const rel = path.relative(projectRoot, target).replace(/\\/g, '/');
61
+ if (!rel || rel === '.')
62
+ return false;
63
+ const segments = rel.split('/');
64
+ for (const seg of segments) {
65
+ if (SKIP_DIRS.has(seg))
66
+ return true;
67
+ }
68
+ return false;
69
+ },
70
+ awaitWriteFinish: {
71
+ stabilityThreshold: 200,
72
+ pollInterval: 50,
73
+ },
74
+ persistent: true,
75
+ // Do not follow symlinks — keeps watcher bounded even if a project
76
+ // contains a symlink loop.
77
+ followSymlinks: false,
78
+ });
79
+ const emit = (type) => (absolutePath, stats) => {
80
+ try {
81
+ const noteTs = this.pendingLocalWrites.get(absolutePath);
82
+ if (noteTs !== undefined && Date.now() - noteTs < FileWatcherService.SELF_WRITE_WINDOW_MS) {
83
+ this.pendingLocalWrites.delete(absolutePath);
84
+ return;
85
+ }
86
+ const rel = path.relative(projectRoot, absolutePath).replace(/\\/g, '/');
87
+ // Skip root-dir notifications (rel === '.' or '') and any path that
88
+ // somehow resolves outside the project root. Directory mtime bumps
89
+ // produce these and are noise for the editor's file-level listener.
90
+ if (!rel || rel === '.' || rel.startsWith('..'))
91
+ return;
92
+ const payload = {
93
+ projectSlug,
94
+ path: rel,
95
+ type,
96
+ mtime: stats?.mtime ? stats.mtime.toISOString() : undefined,
97
+ };
98
+ try {
99
+ getIO().to(`project:${projectSlug}`).emit('file:external-change', payload);
100
+ }
101
+ catch {
102
+ // Socket.io not initialized yet — drop the event silently.
103
+ }
104
+ }
105
+ catch (err) {
106
+ log.warn(`failed to emit file:external-change for ${projectSlug}: ${String(err)}`);
107
+ }
108
+ };
109
+ watcher.on('change', emit('modified'));
110
+ watcher.on('unlink', emit('deleted'));
111
+ watcher.on('error', (err) => {
112
+ log.warn(`chokidar watcher error (${projectSlug}): ${String(err)}`);
113
+ });
114
+ this.watchers.set(projectSlug, { watcher, refCount: 1, projectRoot });
115
+ log.info(`started file watcher for project "${projectSlug}" at ${projectRoot}`);
116
+ }
117
+ /** Decrement the ref count and close the watcher when it reaches zero. */
118
+ releaseWatcher(projectSlug) {
119
+ if (!projectSlug)
120
+ return;
121
+ const existing = this.watchers.get(projectSlug);
122
+ if (!existing)
123
+ return;
124
+ existing.refCount--;
125
+ if (existing.refCount <= 0) {
126
+ existing.watcher.close().catch(() => { });
127
+ this.watchers.delete(projectSlug);
128
+ log.info(`stopped file watcher for project "${projectSlug}"`);
129
+ }
130
+ }
131
+ /**
132
+ * Start (or increment the ref count of) a harness watcher for the given scope.
133
+ * - `scope='user'` → ~/.claude (via `getUserHarnessRoot()`)
134
+ * - `scope='project'` → <project>/.claude (via `getProjectHarnessRoot()`)
135
+ *
136
+ * Idempotent + reference-counted so concurrent subscribers share one chokidar.
137
+ * Unlike the project watcher, harness watchers subscribe to `add` in addition
138
+ * to `change`/`unlink` so they can fire the `'created'` type required by
139
+ * HarnessExternalChangeEvent.
140
+ */
141
+ async ensureHarnessWatcher(ref) {
142
+ const key = harnessKey(ref);
143
+ const existing = this.harnessWatchers.get(key);
144
+ if (existing) {
145
+ existing.refCount++;
146
+ return;
147
+ }
148
+ let resolvedRoot;
149
+ try {
150
+ resolvedRoot = ref.scope === 'user'
151
+ ? getUserHarnessRoot()
152
+ : await getProjectHarnessRoot(ref.projectSlug ?? '');
153
+ }
154
+ catch (err) {
155
+ log.warn(`failed to resolve harness root for ${key}: ${String(err)}`);
156
+ return;
157
+ }
158
+ // Story 28.3: project scope must also surface external edits to
159
+ // `<projectRoot>/.mcp.json`. The file is the SIBLING of `.claude/`, so
160
+ // the standard root-only watcher cannot pick it up. We add it as a second
161
+ // path in the same chokidar instance and emit `path: '.mcp.json'`
162
+ // (hard-coded relative form) when the event lands on that file.
163
+ //
164
+ // Story 29.1 (AC2.b): same pattern is used to watch `<projectRoot>/CLAUDE.md`,
165
+ // a second sibling of `.claude/`. Its emitted path is normalized to
166
+ // `'../CLAUDE.md'` so it cannot collide with `<projectRoot>/.claude/CLAUDE.md`
167
+ // (which would also normalize to `'CLAUDE.md'`). Using the `..` prefix —
168
+ // a string that path-resolver would otherwise reject as traversal — guarantees
169
+ // a unique discriminator since no path going through the standard harness
170
+ // API can ever match it. Client matching rule (AC2.b) is `path === '../CLAUDE.md'`.
171
+ const projectMcpFilePath = ref.scope === 'project'
172
+ ? path.join(path.dirname(resolvedRoot), '.mcp.json')
173
+ : null;
174
+ const projectClaudeMdPath = ref.scope === 'project'
175
+ ? path.join(path.dirname(resolvedRoot), 'CLAUDE.md')
176
+ : null;
177
+ // Story 30.1 (AC2.b): the project's `.gitignore` lives at <projectRoot>/.gitignore,
178
+ // a sibling of `.claude/`. We watch it on the same chokidar instance as
179
+ // `.mcp.json` and `CLAUDE.md` and emit a discriminated path
180
+ // (`'../.gitignore'`) so the client can route the event to the
181
+ // share-scope store without a new socket event.
182
+ const projectGitignorePath = ref.scope === 'project'
183
+ ? path.join(path.dirname(resolvedRoot), '.gitignore')
184
+ : null;
185
+ const watchTargets = ref.scope === 'project'
186
+ ? [
187
+ resolvedRoot,
188
+ projectMcpFilePath,
189
+ projectClaudeMdPath,
190
+ projectGitignorePath,
191
+ ]
192
+ : resolvedRoot;
193
+ const watcher = chokidar.watch(watchTargets, {
194
+ ignoreInitial: true,
195
+ ignored: (target) => {
196
+ // Always allow the sibling files (`.mcp.json`, `CLAUDE.md`, `.gitignore`) —
197
+ // chokidar would otherwise drop them because they sit outside
198
+ // `resolvedRoot`.
199
+ if (projectMcpFilePath && path.resolve(target) === path.resolve(projectMcpFilePath)) {
200
+ return false;
201
+ }
202
+ if (projectClaudeMdPath && path.resolve(target) === path.resolve(projectClaudeMdPath)) {
203
+ return false;
204
+ }
205
+ if (projectGitignorePath && path.resolve(target) === path.resolve(projectGitignorePath)) {
206
+ return false;
207
+ }
208
+ const rel = path.relative(resolvedRoot, target).replace(/\\/g, '/');
209
+ if (!rel || rel === '.')
210
+ return false;
211
+ const segments = rel.split('/');
212
+ for (const seg of segments) {
213
+ if (SKIP_DIRS.has(seg))
214
+ return true;
215
+ }
216
+ return false;
217
+ },
218
+ awaitWriteFinish: {
219
+ stabilityThreshold: 200,
220
+ pollInterval: 50,
221
+ },
222
+ persistent: true,
223
+ followSymlinks: false,
224
+ });
225
+ const emit = (type) => (absolutePath, stats) => {
226
+ try {
227
+ const noteTs = this.pendingLocalWrites.get(absolutePath);
228
+ if (noteTs !== undefined && Date.now() - noteTs < FileWatcherService.SELF_WRITE_WINDOW_MS) {
229
+ this.pendingLocalWrites.delete(absolutePath);
230
+ return;
231
+ }
232
+ let rel;
233
+ if (projectMcpFilePath
234
+ && path.resolve(absolutePath) === path.resolve(projectMcpFilePath)) {
235
+ rel = '.mcp.json';
236
+ }
237
+ else if (projectClaudeMdPath
238
+ && path.resolve(absolutePath) === path.resolve(projectClaudeMdPath)) {
239
+ // Story 29.1 (AC2.b): `<projectRoot>/CLAUDE.md` emits as
240
+ // `'../CLAUDE.md'` to namespace-separate it from a hypothetical
241
+ // `<projectRoot>/.claude/CLAUDE.md` that would otherwise share
242
+ // the relative path `'CLAUDE.md'`.
243
+ rel = '../CLAUDE.md';
244
+ }
245
+ else if (projectGitignorePath
246
+ && path.resolve(absolutePath) === path.resolve(projectGitignorePath)) {
247
+ // Story 30.1 (AC2.b): same trick — `'../.gitignore'` is the
248
+ // discriminated path the client store keys on to trigger a full
249
+ // share-scope reload (everything depends on `.gitignore`).
250
+ rel = '../.gitignore';
251
+ }
252
+ else {
253
+ rel = path.relative(resolvedRoot, absolutePath).replace(/\\/g, '/');
254
+ if (!rel || rel === '.' || rel.startsWith('..'))
255
+ return;
256
+ }
257
+ const payload = {
258
+ scope: ref.scope,
259
+ projectSlug: ref.projectSlug,
260
+ path: rel,
261
+ type,
262
+ mtime: type !== 'deleted' && stats?.mtime ? stats.mtime.toISOString() : undefined,
263
+ };
264
+ try {
265
+ getIO().to(harnessRoom(ref)).emit('harness:external-change', payload);
266
+ }
267
+ catch {
268
+ // Socket.io not initialized yet — drop silently.
269
+ }
270
+ }
271
+ catch (err) {
272
+ log.warn(`failed to emit harness:external-change for ${key}: ${String(err)}`);
273
+ }
274
+ };
275
+ watcher.on('add', emit('created'));
276
+ watcher.on('change', emit('modified'));
277
+ watcher.on('unlink', emit('deleted'));
278
+ watcher.on('error', (err) => {
279
+ log.warn(`chokidar harness watcher error (${key}): ${String(err)}`);
280
+ });
281
+ this.harnessWatchers.set(key, {
282
+ watcher,
283
+ refCount: 1,
284
+ resolvedRoot,
285
+ scope: ref.scope,
286
+ projectSlug: ref.projectSlug,
287
+ });
288
+ log.info(`started harness watcher for ${key} at ${resolvedRoot}`);
289
+ }
290
+ /** Decrement the harness watcher ref count, closing when it reaches zero. */
291
+ releaseHarnessWatcher(ref) {
292
+ const key = harnessKey(ref);
293
+ const existing = this.harnessWatchers.get(key);
294
+ if (!existing)
295
+ return;
296
+ existing.refCount--;
297
+ if (existing.refCount <= 0) {
298
+ existing.watcher.close().catch(() => { });
299
+ this.harnessWatchers.delete(key);
300
+ log.info(`stopped harness watcher for ${key}`);
301
+ }
302
+ }
303
+ /** Mark an absolute path as just-written so the next watcher event is ignored. */
304
+ noteLocalWrite(absolutePath) {
305
+ this.pendingLocalWrites.set(absolutePath, Date.now());
306
+ // Opportunistic pruning — keep the map bounded without a timer.
307
+ if (this.pendingLocalWrites.size > 64) {
308
+ const now = Date.now();
309
+ for (const [p, ts] of this.pendingLocalWrites.entries()) {
310
+ if (now - ts > FileWatcherService.SELF_WRITE_WINDOW_MS * 2) {
311
+ this.pendingLocalWrites.delete(p);
312
+ }
313
+ }
314
+ }
315
+ }
316
+ /** Close every active watcher. Called on server shutdown. */
317
+ async shutdown() {
318
+ const closers = [
319
+ ...Array.from(this.watchers.values()).map(({ watcher }) => watcher.close().catch(() => { })),
320
+ ...Array.from(this.harnessWatchers.values()).map(({ watcher }) => watcher.close().catch(() => { })),
321
+ ];
322
+ this.watchers.clear();
323
+ this.harnessWatchers.clear();
324
+ this.pendingLocalWrites.clear();
325
+ await Promise.all(closers);
326
+ }
327
+ }
328
+ export const fileWatcherService = new FileWatcherService();
329
+ //# sourceMappingURL=fileWatcherService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWatcherService.js","sourceRoot":"","sources":["../../src/services/fileWatcherService.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAExB,cAAM,UAAU;IACd,OAAO,CAAC,SAAS;IASX,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmC1D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IA6B5E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsB9D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IAyB1F,OAAO,CAAC,mBAAmB;IAMrB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3D,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB1F;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
1
+ {"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAGxB,cAAM,UAAU;IACd,OAAO,CAAC,SAAS;IASX,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmC1D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAkC5E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsB9D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IA2E1F,OAAO,CAAC,mBAAmB;IAMrB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3D,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB1F;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -3,7 +3,10 @@
3
3
  * Wraps simple-git to provide Git read and write operations for projects.
4
4
  * [Source: Story 16.1 - Task 3, Story 16.2 - Task 2]
5
5
  */
6
+ import { promises as fs } from 'fs';
7
+ import path from 'path';
6
8
  import simpleGit from 'simple-git';
9
+ import { isBinaryFile } from '../utils/pathUtils.js';
7
10
  class GitService {
8
11
  wrapError(operation, error) {
9
12
  const message = error instanceof Error ? error.message : String(error);
@@ -64,6 +67,11 @@ class GitService {
64
67
  return { commits };
65
68
  }
66
69
  catch (error) {
70
+ // git log exits with non-zero on repos with no commits yet — treat as empty
71
+ const msg = error instanceof Error ? error.message : String(error);
72
+ if (/does not have any commits yet|bad default revision|unknown revision/i.test(msg)) {
73
+ return { commits: [] };
74
+ }
67
75
  throw this.wrapError('log', error);
68
76
  }
69
77
  }
@@ -93,13 +101,65 @@ class GitService {
93
101
  return { initialized: false };
94
102
  }
95
103
  try {
96
- const args = staged ? ['--cached', '--', file] : ['--', file];
104
+ // Run without --binary so git emits "Binary files differ" for binary
105
+ // paths. The --binary flag causes git to output a "GIT binary patch" block
106
+ // instead, which breaks the "Binary files" regex below.
107
+ const args = staged
108
+ ? ['--cached', '--', file]
109
+ : ['--', file];
97
110
  const diff = await git.diff(args);
111
+ // Detect binary via the standard git marker.
112
+ let isBinary = /^Binary files .* differ$/m.test(diff);
113
+ // Untracked or newly added files never appear in `git diff`, so the
114
+ // output is empty regardless of binary status. Fall back to reading the
115
+ // file directly (covers .zip/.pdf and friends via the extension
116
+ // allowlist in pathUtils.isBinaryFile).
117
+ if (!isBinary && !diff.trim()) {
118
+ try {
119
+ isBinary = await isBinaryFile(path.join(projectPath, file));
120
+ }
121
+ catch {
122
+ // File may not exist (e.g. deleted). Leave isBinary=false.
123
+ }
124
+ }
125
+ let before = '';
126
+ let after = '';
127
+ if (!isBinary) {
128
+ // Staged view: compare HEAD blob (before) against index blob (after).
129
+ // Unstaged view: compare index blob (before) against working copy (after).
130
+ // Any `git show` failure (missing blob — new/untracked file) collapses to ''.
131
+ const beforeRef = staged ? `HEAD:${file}` : `:${file}`;
132
+ try {
133
+ before = await git.show([beforeRef]);
134
+ }
135
+ catch {
136
+ before = '';
137
+ }
138
+ if (staged) {
139
+ try {
140
+ after = await git.show([`:${file}`]);
141
+ }
142
+ catch {
143
+ after = '';
144
+ }
145
+ }
146
+ else {
147
+ try {
148
+ after = await fs.readFile(path.join(projectPath, file), 'utf8');
149
+ }
150
+ catch {
151
+ // Deleted file — working copy missing.
152
+ after = '';
153
+ }
154
+ }
155
+ }
98
156
  return {
99
157
  initialized: true,
100
- diff,
158
+ before,
159
+ after,
101
160
  file,
102
161
  staged,
162
+ isBinary,
103
163
  };
104
164
  }
105
165
  catch (error) {
@@ -168,12 +228,12 @@ class GitService {
168
228
  }
169
229
  async push(projectPath) {
170
230
  const git = simpleGit(projectPath);
171
- const isRepo = await git.checkIsRepo();
172
- if (!isRepo) {
231
+ if (!await git.checkIsRepo()) {
173
232
  this.throwNotInitialized();
174
233
  }
175
234
  try {
176
- await git.push();
235
+ const { current } = await git.branch();
236
+ await git.push(['origin', current, '--set-upstream']);
177
237
  }
178
238
  catch (error) {
179
239
  throw this.wrapError('push', error);
@@ -212,8 +272,8 @@ class GitService {
212
272
  this.throwNotInitialized();
213
273
  }
214
274
  try {
215
- const args = startPoint ? [name, startPoint] : [name];
216
- await git.branch(args);
275
+ const args = startPoint ? ['-b', name, startPoint] : ['-b', name];
276
+ await git.checkout(args);
217
277
  }
218
278
  catch (error) {
219
279
  const msg = error instanceof Error ? error.message : String(error);
@@ -1 +1 @@
1
- {"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Story 28.6: Harness sub-agent service.
3
+ *
4
+ * Combines three sources of `.claude/agents/*.md` files into a single flat
5
+ * card list (flat-only — no recursive subdirectory walk):
6
+ * - <projectRoot>/.claude/agents/ (project scope)
7
+ * - ~/.claude/agents/ (user scope)
8
+ * - <pluginInstallPath>/agents/ (plugin scope, read-only)
9
+ *
10
+ * Each .md file has YAML frontmatter with 4 required fields
11
+ * (name/description/model/color) + 1 optional 3-state `tools` field. Body is
12
+ * the markdown system prompt. Round-trip via `applyYamlFrontmatterPatch`
13
+ * (eemeli yaml — preserves comments / key order / blank lines).
14
+ *
15
+ * Differences from 28.5 (commands):
16
+ * - flat-only scan (no subdirectory walk)
17
+ * - 4 required frontmatter fields (name regex + model/color enum)
18
+ * - tools 3-state model (omitted vs empty vs populated) round-trip
19
+ * - file stem === frontmatter.name (no slash-name conversion)
20
+ * - no chat slash palette dedup
21
+ * - no BMad mirror heuristic (`.claude/agents/` has no BMad presence)
22
+ */
23
+ import { type HarnessAgentCopyRequest, type HarnessAgentCopyResponse, type HarnessAgentCreateRequest, type HarnessAgentCreateResponse, type HarnessAgentDeleteRequest, type HarnessAgentDeleteResponse, type HarnessAgentFrontmatter, type HarnessAgentListResponse, type HarnessAgentMalformedEntry, type HarnessAgentReadResponse, type HarnessAgentSourceLocation, type HarnessAgentSourceScope, type HarnessAgentToolsState, type HarnessAgentUpdateRequest, type HarnessAgentUpdateResponse } from '@hammoc/shared';
24
+ /** Throws HARNESS_PARSE_ERROR with detail when name fails the regex / OS check. */
25
+ declare function validateAgentName(name: string): void;
26
+ declare function detectExampleBlock(body: string): boolean;
27
+ declare function detectSecretsInText(text: string): {
28
+ matched: boolean;
29
+ lines: number[];
30
+ };
31
+ interface ParsedFrontmatter {
32
+ frontmatter: HarnessAgentFrontmatter;
33
+ toolsState: HarnessAgentToolsState;
34
+ }
35
+ interface FrontmatterValidationFailure {
36
+ malformed: true;
37
+ reason: HarnessAgentMalformedEntry['reason'];
38
+ detail?: string;
39
+ }
40
+ type FrontmatterParseResult = ParsedFrontmatter | FrontmatterValidationFailure;
41
+ declare function parseAgentFrontmatter(raw: string | null, fileStem: string): FrontmatterParseResult;
42
+ interface SerializeOptions {
43
+ frontmatter: HarnessAgentFrontmatter;
44
+ toolsState?: HarnessAgentToolsState;
45
+ }
46
+ /**
47
+ * Custom YAML round-trip that preserves comments / key order / blank lines for
48
+ * untouched keys, and explicitly handles the tools 3-state model:
49
+ * - state A (omitted) → delete tools key
50
+ * - state B (empty) → write tools: []
51
+ * - state C (populated) → write tools: [...]
52
+ */
53
+ declare function serializeAgentFrontmatter(prevRaw: string, opts: SerializeOptions): string;
54
+ declare class HarnessAgentService {
55
+ listCards(currentProjectSlug?: string): Promise<HarnessAgentListResponse>;
56
+ readAgent(loc: HarnessAgentSourceLocation): Promise<HarnessAgentReadResponse>;
57
+ createAgent(req: HarnessAgentCreateRequest): Promise<HarnessAgentCreateResponse>;
58
+ updateAgent(loc: HarnessAgentSourceLocation, body: HarnessAgentUpdateRequest): Promise<HarnessAgentUpdateResponse>;
59
+ copyAgent(req: HarnessAgentCopyRequest): Promise<HarnessAgentCopyResponse>;
60
+ deleteAgent(req: HarnessAgentDeleteRequest): Promise<HarnessAgentDeleteResponse>;
61
+ private buildEditableRef;
62
+ }
63
+ export declare function resolveAgentSourceLocation(input: {
64
+ scope: HarnessAgentSourceScope;
65
+ name: string;
66
+ projectSlug?: string;
67
+ pluginKey?: string;
68
+ }): Promise<HarnessAgentSourceLocation>;
69
+ export declare const harnessAgentInternals: {
70
+ detectExampleBlock: typeof detectExampleBlock;
71
+ detectSecretsInText: typeof detectSecretsInText;
72
+ parseAgentFrontmatter: typeof parseAgentFrontmatter;
73
+ serializeAgentFrontmatter: typeof serializeAgentFrontmatter;
74
+ validateAgentName: typeof validateAgentName;
75
+ AGENT_NAME_RE: RegExp;
76
+ };
77
+ export declare const harnessAgentService: HarnessAgentService;
78
+ export {};
79
+ //# sourceMappingURL=harnessAgentService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessAgentService.d.ts","sourceRoot":"","sources":["../../src/services/harnessAgentService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAE/B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAGhC,MAAM,gBAAgB,CAAC;AAqExB,mFAAmF;AACnF,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAwB7C;AAMD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAGhF;AAMD,UAAU,iBAAiB;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,UAAU,4BAA4B;IACpC,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,sBAAsB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC;AAE/E,iBAAS,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAwF3F;AAgaD,UAAU,gBAAgB;IACxB,WAAW,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAmElF;AAMD,cAAM,mBAAmB;IACjB,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA4CzE,SAAS,CAAC,GAAG,EAAE,0BAA0B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgB7E,WAAW,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA0DhF,WAAW,CACf,GAAG,EAAE,0BAA0B,EAC/B,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IAiHhC,SAAS,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAqF1E,WAAW,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;YAyBxE,gBAAgB;CAuB/B;AAMD,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAGtC;AAGD,eAAO,MAAM,qBAAqB;;;;;;;CAOjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}