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,175 @@
1
+ ## 12. Harness Workbench
2
+
3
+ The **Harness Workbench** is the unified surface for managing everything Claude Code reads from the `.claude/` configuration tree — plugins, skills, MCP servers, hooks, slash commands, sub-agents, `CLAUDE.md`, and Hammoc-native `%snippets`. It lives inside each project's **Settings** tab (see §5.3) under the "Harness Workbench" group, so the workbench is always scoped to the project you're working on but can also reach the global (`~/.claude/`) versions of each item.
4
+
5
+ ### 12.1 Layout
6
+
7
+ The workbench has two stacked headers above an eight-section navigator:
8
+
9
+ - **Mode banner** — Workbench-wide; explains whether the project's `.claude/` is git-tracked or ignored (see §12.2)
10
+ - **Lint preferences button** — Top-right; opens a dialog to toggle the seven static-lint rules (see §12.12)
11
+
12
+ The section navigator is a vertical sidebar on desktop and a horizontally-scrolling pill row on mobile. Sections, in order:
13
+
14
+ 1. **Plugins** — Installed Claude Code plugins (see §12.4)
15
+ 2. **Skills** — `SKILL.md` skill bundles (see §12.5)
16
+ 3. **MCP** — MCP server entries from `.mcp.json` / `~/.claude/.mcp.json` (see §12.6)
17
+ 4. **Hooks** — Lifecycle hooks declared in `settings.json` (see §12.7)
18
+ 5. **Commands** — Slash command files (see §12.8)
19
+ 6. **Agents** — Sub-agent definitions (see §12.9)
20
+ 7. **CLAUDE.md** — Project and global instruction documents (see §12.10)
21
+ 8. **Snippets** — Hammoc `%snippet` library + Claude Code slash-command favorites (see §12.11)
22
+
23
+ When the workbench loads, every section's data is fetched in parallel and cached, so switching between sections feels instant. Each section's data also stays in sync with disk: any external change (made outside Hammoc) updates the corresponding card without a reload.
24
+
25
+ ### 12.2 Share Mode Banner
26
+
27
+ A workbench-wide banner just above the navigator tells you how the project shares its `.claude/` configuration:
28
+
29
+ - **Team-shared** (gray banner) — `.claude/` is **not** ignored by git. Files committed here (skills, hook definitions, the project `CLAUDE.md`, etc.) ship with the repo and reach every teammate.
30
+ - **Private** (amber banner) — `.claude/` (or a parent path) is excluded by `.gitignore`. Files here stay on your machine, so a teammate cloning the repo gets none of them.
31
+
32
+ The banner is derived from the project root's `.gitignore`. Edit the rules and the banner updates the next time the workbench refreshes.
33
+
34
+ > An **Export bundle** action is planned for the Private mode banner so you can ship the current harness state to a teammate as a single file. The button is intentionally hidden until the export/import flow is fully wired — until then, copy individual files by hand or via the workbench's Project ↔ Global copy actions.
35
+
36
+ ### 12.3 Share Badges
37
+
38
+ Every editable card (skill, MCP, hook, command, agent, `CLAUDE.md`, snippet) shows a small **share badge** indicating that specific file's git scope:
39
+
40
+ - **Shared** (blue) — File tracked by git; team will see your edits after a commit
41
+ - **Local** (gray) — File exists but is not tracked
42
+ - **Ignored** (amber) — `.claude/` is fully git-excluded; this file will not be committed
43
+
44
+ The badge is computed per-file so a single project can mix shared and local items.
45
+
46
+ ### 12.4 Plugins Panel
47
+
48
+ Lists every Claude Code plugin discovered under the project and global plugin roots:
49
+
50
+ - One card per plugin with name, version, and small component counts (skills, commands, agents, hooks, MCP servers it ships)
51
+ - A toggle switch enables or disables the plugin without uninstalling it
52
+ - Plugin-provided items appear (read-only) in the other workbench sections too, with a **"Plugin: <key>"** scope badge
53
+
54
+ ### 12.5 Skills Panel
55
+
56
+ Card grid for skill bundles (a `SKILL.md` plus optional supporting files):
57
+
58
+ - **Scope filter** — All / Project / Global / Plugin
59
+ - **Card front** — Name, description, scope badge, share badge, lint marker (if the skill has lint issues), and a kebab menu for copy actions
60
+ - **Open** — Click the card to open the **Skill Editor**, a modal with two modes:
61
+ - **Form mode** — Separate fields for the YAML frontmatter (Name, Description, Version) and a Markdown body with edit/preview toggle
62
+ - **Raw mode** — Edit the raw `SKILL.md` text directly when the frontmatter cannot be parsed
63
+ - **Bundle resources** — A nested tree of supporting files (references, examples, scripts, assets) with file counts. Binary files are marked read-only; files over 1 MB are truncated
64
+ - **Copy actions** — Copy a skill between Project / Global / Plugin scopes. If the destination already has a skill with the same name, a **conflict dialog** offers Overwrite / Skip / Rename
65
+ - **Auto-save** — Edits debounce-save every ~300 ms; no manual save button
66
+ - **External-change banner** — If another tool overwrites the skill while you are editing, the editor reloads with a banner explaining the change
67
+
68
+ Bundled skills (from a plugin's `skills/`) can only be opened read-only — copy them to Project or Global scope first to customize.
69
+
70
+ ### 12.6 MCP Panel
71
+
72
+ Card grid for MCP server entries (from `.mcp.json` or `~/.claude/.mcp.json`):
73
+
74
+ - **Type badges** — `stdio`, `sse`, `http`, `ws`
75
+ - **Toggle** — Enable / Disable a server. Disabling moves the entry to a backup section of the JSON file rather than deleting it, so you can re-enable later
76
+ - **Editor** — Form fields for the server type, command, arguments (one per line), URL, headers (key/value rows), and environment variables (key/value rows). A mask toggle hides secret-looking values
77
+ - **Secret detection** — Values that look like API keys are marked inline. When you copy a server between scopes, a warning dialog lists detected secrets and requires explicit acknowledgement before copying
78
+ - **Fresh-spawn banner** — After enabling/disabling or editing a server, a banner reminds you that MCP changes only take effect on your **next** message in a new chat turn. A **Start new session** button is available
79
+
80
+ ### 12.7 Hooks Panel
81
+
82
+ Hooks are grouped by lifecycle event (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification):
83
+
84
+ - **Per-event sections** — Each event shows its hook cards and an inline "+ Add" button
85
+ - **Type badges** — `command` (shell command) and `prompt` (LLM-invoking)
86
+ - **Toggle** — Enable / Disable individual hooks
87
+ - **Matcher field** — Regex pattern that filters which tool calls (or events) the hook applies to; empty matcher means "all"
88
+ - **Parallel-execution badge** — Indicates when the hook runs alongside hooks from other sources for the same event
89
+ - **Cost warning** — `prompt`-type hooks invoke the LLM each time and show a cost/latency warning banner
90
+ - **Copy actions** — Same Project ↔ Global ↔ Plugin copy matrix as skills, with a review dialog that surfaces secret-looking values and command bodies before copying
91
+
92
+ ### 12.8 Commands Panel
93
+
94
+ Slash command files (the `.md` files behind `/your-command`):
95
+
96
+ - One card per command with name, description, scope badge, share badge, and lint marker
97
+ - **Editor** — Markdown body with edit/preview toggle and frontmatter fields (description, argument hints)
98
+ - **Copy / Override-clone** — Copy to the other scope, or clone a plugin-provided command into Project / Global so you can customize it without losing the upstream copy
99
+
100
+ ### 12.9 Agents Panel
101
+
102
+ Sub-agent definitions (`AGENT.md`-style files used by the `Agent` tool):
103
+
104
+ - One card per agent with name, role description, scope badge, share badge, lint marker
105
+ - **Editor** — Frontmatter fields (Name, Description, Tools), Markdown system prompt body, edit/preview toggle
106
+ - **Non-standard tools warning** — Lint rule flags tools that aren't part of the standard Claude Code toolset
107
+
108
+ ### 12.10 CLAUDE.md Editor
109
+
110
+ Two-column editor for the instruction documents Claude Code loads at session start:
111
+
112
+ - **Left column** — Global `~/.claude/CLAUDE.md`
113
+ - **Right column** — Project `<root>/.claude/CLAUDE.md` with its own share badge
114
+ - **Mobile** — Columns collapse to a User / Project toggle above a single editor pane
115
+
116
+ Each column is a CodeMirror Markdown editor with edit/preview toggle and the same 300 ms debounce auto-save as the other panels. Copy buttons (← / →) move content between columns; if both files have content, a confirmation dialog warns before overwriting.
117
+
118
+ Both files load into every Claude Code session in this project; the project version takes precedence when an instruction is defined in both.
119
+
120
+ ### 12.11 Snippets & Favorites Panel
121
+
122
+ A single panel manages both Hammoc-native snippets and Claude Code slash-command favorites.
123
+
124
+ **Snippets section** (top):
125
+
126
+ - Manages `%name` snippets from `<project-root>/.hammoc/snippets/`, `~/.hammoc/snippets/`, and the bundled set shipped with Hammoc (see §4.6)
127
+ - **Scope filter** — All / Project / Global / Bundled
128
+ - **+ New snippet** — Choose scope (Project or Global) and a name; an empty file is created and the editor opens
129
+ - **Editor** — CodeMirror with syntax highlighting for `%name%`, `{arg1}`, `{context}` tokens and an inline warning when a snippet references itself or forms a reference cycle (heuristic only — saves are not blocked)
130
+ - **Kebab menu** — Copy to the other scope, delete (with confirmation)
131
+ - **Bundled snippets** are read-only — copy to Project or Global scope first to customize
132
+
133
+ **Command Favorites section** (bottom):
134
+
135
+ - Drag-reorder list of slash command favorites (the same favorites shown in the chat input's favorites bar, see §4.3)
136
+ - Each entry shows the command name, scope, and a star toggle that moves it between regular and star favorites
137
+ - **Invalid chip** marker on favorites whose underlying command no longer exists on disk
138
+ - Up to 20 regular + 10 star favorites per scope
139
+
140
+ ### 12.12 Static Lint
141
+
142
+ Every harness panel (skills, MCP, hooks, commands, agents) runs a background static-lint pass against its files. Lint output surfaces in three places:
143
+
144
+ - **Count badges on section nav** — A red dot with the error count and an amber dot with the warning count appear on the section tab when issues exist
145
+ - **Inline marker on cards** — The card header shows a small red or amber pill with the issue count; clicking jumps to the card detail or opens the editor
146
+ - **Issues list at the top of each panel** — Expandable list of every issue with file path, severity, message, and a "Open" link
147
+
148
+ **Rule preferences:** The **Lint preferences** button at the top-right of the workbench opens a dialog listing all seven rules. Each rule has an on/off toggle plus a description, and a **Restore defaults** button reverts the preferences. Preferences are stored globally (not per-project).
149
+
150
+ **Available rules:**
151
+
152
+ | Rule | Default | Catches |
153
+ |------|---------|---------|
154
+ | `naming/duplicate-across-sources` | on | The same name exists in two scopes (project + global, etc.) — surfaces which copy will actually load |
155
+ | `hook/matcher-regex-invalid` | on | Hook `matcher` regex won't compile |
156
+ | `parse/yaml-json-error` | on | Frontmatter or JSON config can't be parsed |
157
+ | `mcp/command-not-on-path` | off | MCP `stdio` command is not on the server's `PATH` |
158
+ | `mcp/url-invalid` | on | MCP `url` field is malformed for the chosen transport |
159
+ | `agent/tools-non-standard` | on | Agent declares a tool name Claude Code does not recognize |
160
+ | `hook/env-var-undefined` | on | Hook body references `${VAR}` that is not set on the server |
161
+
162
+ ### 12.13 Secret-on-Shared Guard
163
+
164
+ When you save (or copy) a harness file whose share badge is **Shared**, Hammoc scans the content for plaintext secrets — long base64-looking values, AWS-style keys, bearer tokens — using both pattern and Shannon-entropy checks. If a likely secret is detected, the save is blocked and a dialog appears with three options:
165
+
166
+ - **Move to local file** — Auto-create a sibling file (e.g., `settings.local.json` next to `settings.json`), move the value there, and re-save the original with a reference. This keeps the secret out of git
167
+ - **Mark this value as not a secret** — One-shot opt-out for this save only; the heuristic does not persist the decision
168
+ - **Cancel** — Close the dialog without saving
169
+
170
+ The dialog lists exactly which values were flagged (line numbers for text files, dot-paths for JSON/YAML) so you can verify before deciding. The entropy gate avoids tripping on ordinary base64-looking strings (image tokens, integration test fixtures) that fall below the threshold.
171
+
172
+ ### 12.14 Fullscreen Editor
173
+
174
+ Every Markdown body in the workbench — skill body and raw view, skill bundle files, command body and raw view, agent system prompt and raw view, `CLAUDE.md` (both columns), snippet body — shows a small **Expand** button (⤢ icon) above the editor area. Clicking it opens a fullscreen overlay with the same CodeMirror instance, line wrapping, and a Markdown edit / preview toggle, so you can write long content without scrolling inside a narrow modal. Edits in the overlay sync back to the host panel through the same 300 ms debounce auto-save — there is no separate save button. Close the overlay with **X** or `Escape`. Read-only buffers (a plugin-scope file, a bundled snippet) show a small "read-only" chip in the overlay header.
175
+
@@ -0,0 +1,241 @@
1
+ ## 13. Settings
2
+
3
+ Access settings via the gear icon or the Settings page. The page has **8 tabs**: Global, Project, Notifications, Claude Account, Hammoc User, Advanced, Help, and About. On desktop, tabs appear as a sidebar; on mobile, they use an accordion layout.
4
+
5
+ > Per-project overrides have moved out of this page. See §5.3 — they now live in each project's own Settings tab (the workbench-level General section).
6
+
7
+ ### 13.1 Theme
8
+
9
+ - **Dark** — Dark background, light text (default)
10
+ - **Light** — Warm gray background, dark text
11
+ - **System** — Follows your OS/browser preference
12
+
13
+ ### 13.2 Language
14
+
15
+ Hammoc supports 6 languages:
16
+
17
+ - English
18
+ - 中文(简体) (Chinese Simplified)
19
+ - 日本語 (Japanese)
20
+ - 한국어 (Korean)
21
+ - Español (Spanish)
22
+ - Português (Portuguese)
23
+
24
+ Language is auto-detected from your browser settings. Override it manually in settings.
25
+
26
+ ### 13.3 Default Model
27
+
28
+ Choose the default Claude model:
29
+
30
+ **Default:**
31
+ - **Default** — Uses the SDK/system default model
32
+
33
+ **Aliases (always latest version):**
34
+ - **Sonnet** — Latest Sonnet
35
+ - **Opus** — Latest Opus
36
+ - **Haiku** — Latest Haiku
37
+
38
+ **Claude 4.x:**
39
+ - Opus 4.7 (most capable, 1M context), 4.6, 4.5, 4.1, 4
40
+ - Sonnet 4.5, 4
41
+ - Haiku 4.5
42
+
43
+ **Claude 3.x:**
44
+ - Sonnet 3.7, 3.5
45
+ - Haiku 3.5
46
+ - Opus 3, Sonnet 3, Haiku 3
47
+
48
+ Can be overridden per-project (see §5.3).
49
+
50
+ ### 13.4 Default Permission Mode
51
+
52
+ Set how Claude handles file modifications:
53
+
54
+ | Mode | Behavior |
55
+ |------|----------|
56
+ | **Last Used** | Keeps the permission mode from the previous session |
57
+ | **Plan** | Claude plans but doesn't make changes |
58
+ | **Ask before edits** | Claude asks for approval before each change (default) |
59
+ | **Edit automatically** | Claude edits files automatically |
60
+ | **Bypass permissions** | Full autonomy, no restrictions |
61
+
62
+ **Auto-approve safety checks** — When Bypass mode is selected, a checkbox option appears to automatically approve CLI safety check prompts without user confirmation. Enabled by default.
63
+
64
+ Can be overridden per-project (see §5.3). Quick-cycle with `Shift+Tab` when the chat input is focused.
65
+
66
+ ### 13.5 Markdown File Open Mode
67
+
68
+ Choose how `.md` files open by default:
69
+
70
+ - **Edit** — Opens in text editing mode
71
+ - **Preview** — Opens in rendered preview mode
72
+
73
+ ### 13.6 File Explorer View
74
+
75
+ Default view for the file explorer:
76
+
77
+ - **Grid** — Icon-based Finder-style layout (default)
78
+ - **List** — Traditional file list
79
+
80
+ ### 13.7 Layout Mode
81
+
82
+ Control the overall page width:
83
+
84
+ - **Narrow** — Content centered with a max width
85
+ - **Wide** — Full-width layout using all available screen space
86
+
87
+ Toggle via the layout button in the header.
88
+
89
+ ### 13.8 Project Settings
90
+
91
+ Per-project overrides have moved out of the global Settings page. They now live inside each project under **Project → Settings → General** (see §5.3). The Harness Workbench group on the same tab covers plugin / skill / hook / MCP / command / agent / CLAUDE.md / snippet management for that project (see §12).
92
+
93
+ ### 13.9 Chat Timeout
94
+
95
+ How long to wait for Claude's response:
96
+
97
+ - 1 minute
98
+ - 3 minutes
99
+ - **5 minutes** (default)
100
+ - 10 minutes
101
+ - 30 minutes
102
+
103
+ The timeout resets on every activity. If overridden by an environment variable, the field is disabled with an amber warning.
104
+
105
+ ### 13.10 Default Thinking Effort
106
+
107
+ Set the default thinking effort for new sessions:
108
+
109
+ - **SDK Default** / Low / Medium / High / XHigh / Max
110
+ - Max is available on Opus 4.6, Sonnet 4.6, and Opus 4.7
111
+ - XHigh is available only on Opus 4.7 (and is the SDK default for that model)
112
+ - If the active model does not support the configured level, it falls back to High automatically — the saved preference is kept, only the request to the SDK is clamped
113
+ - The chosen level is preserved while the active model is still resolving (no flicker back to Default during project switches)
114
+
115
+ ### 13.11 Quick Panel Defaults
116
+
117
+ - **Default Open** — Whether the quick panel opens automatically when entering a chat page (default: On)
118
+ - **Default Side** — Which side the quick panel appears on:
119
+ - **Left** — Always opens on the left
120
+ - **Right** — Always opens on the right (default)
121
+ - **Last Used** — Remembers the last side you used and restores it
122
+
123
+ ### 13.12 Notifications
124
+
125
+ The Notifications tab contains two sections: Web Push and Telegram.
126
+
127
+ #### 13.12.1 Web Push Notifications
128
+
129
+ Receive browser push notifications when Claude needs attention. Requires HTTPS and a browser that supports the Push API (Chrome, Firefox, Edge, Safari 16+).
130
+
131
+ - **Subscribe** — Register the current browser to receive push notifications (requests browser notification permission)
132
+ - **Unsubscribe** — Remove the current browser's push subscription
133
+ - **Enable toggle** — Master switch to enable or disable web push delivery
134
+ - **Subscribed devices** — Shows the number of browsers currently registered
135
+ - **Test** — Send a test push notification to verify setup
136
+
137
+ > iOS: Add Hammoc to Home Screen first, then subscribe from within the PWA.
138
+
139
+ #### 13.12.2 Telegram Notifications
140
+
141
+ Get notified on your phone when Claude needs attention:
142
+
143
+ **Setup:**
144
+ 1. Create a Telegram bot via [@BotFather](https://t.me/BotFather) — enter the Bot Token
145
+ 2. Get your Chat ID via [@userinfobot](https://t.me/userinfobot) — enter the Chat ID
146
+ 3. Both fields support **change** and **delete** operations; bot tokens are shown **masked** for security
147
+
148
+ **Enable/Disable:**
149
+ - Master **enable checkbox** — requires both Bot Token and Chat ID to be configured before it can be toggled on
150
+
151
+ **Chat Notification Types:**
152
+ - **Permission requests** — Claude needs approval for file changes
153
+ - **Completion** — Chat task finished
154
+ - **Error** — Something went wrong during chat
155
+
156
+ **Queue Notification Types:**
157
+ - **Queue start** — Queue execution began
158
+ - **Queue complete** — Queue finished all items
159
+ - **Queue error** — Queue encountered an error
160
+ - **Queue input needed** — Queue paused, waiting for user input
161
+
162
+ **Other Options:**
163
+ - **Always notify** — Get notified for every message (suppressed when the session is visible in the browser)
164
+
165
+ **Test:** Click "Send Test" to verify your configuration.
166
+
167
+ **Access URL:** Set your Hammoc base URL (e.g., `http://192.168.1.100:3000`) so notification links open directly in your browser.
168
+
169
+ **Environment Variables:** Bot Token and Chat ID can be set via environment variables, which take priority over saved values (shown with an amber "Env" indicator).
170
+
171
+ ### 13.13 Claude Account
172
+
173
+ Shows the Claude Code account that Hammoc is using, plus live subscription usage:
174
+
175
+ - **Account info** — Email, Subscription plan, Provider (e.g., Claude API / Claude.ai), Organization (if applicable), and the timestamp of the last fetch
176
+ - **Usage bars** — Two progress bars showing consumption of the **5-hour window** and **7-day window** quotas, with color thresholds (green / yellow / red at 50% / 80%) and reset times
177
+ - **Refresh** — Manually fetch the latest account info and usage from the API (spinner shown while refreshing). Toast confirms success or failure
178
+ - If no data has been fetched yet, a helper line explains that account info fills in automatically after the first chat or after clicking Refresh
179
+
180
+ ### 13.14 Hammoc User
181
+
182
+ Local Hammoc authentication (independent of your Claude Code account):
183
+
184
+ - **Change password** — Enter your current password, new password, and confirm. Minimum 4 characters. After changing, you'll be signed out and redirected to the login page.
185
+ - **Logout** — Sign out immediately.
186
+
187
+ ### 13.15 System Prompt
188
+
189
+ Customize Claude's behavior with a fully editable system prompt template:
190
+
191
+ - **Warning banner** — Displayed at the top, cautioning about the impact of modifications
192
+ - **Editable textarea** — Edit the system prompt with **auto-save**
193
+ - **Character count** — Shown below the editor
194
+ - **"Customized" indicator** — Blue banner when a custom prompt is active
195
+ - **Restore to Default** button — Appears when the prompt has been modified
196
+ - **Template variables** — Listed below the editor with descriptions (e.g., `{gitBranch}`, `{gitMainBranch}`, `{gitStatus}`); variables are resolved at runtime
197
+ - **Resolved preview** — Toggle to see the fully rendered prompt with variables replaced for the current project
198
+
199
+ > The default template focuses Claude on Hammoc-specific features (snippets, queue runner, board, BMAD, permission modes, sessions) and points at the manual + internals docs that Hammoc syncs to `~/.hammoc/docs/` on every server boot, so agents always have current docs even when run from a fresh install. The `{gitStatus}` block is no longer baked into the default — re-add it via this editor if you want it pre-included.
200
+
201
+ ### 13.16 Advanced Settings
202
+
203
+ **Server Management (mode-dependent):**
204
+
205
+ - **Development mode:** "Server Rebuild" button — rebuilds and restarts the server. Shows elapsed time during the build process
206
+ - **Production mode:** Shows current version number, "Check for Updates" button, and "Install Update" button (appears only when an update is available). Includes build progress with elapsed timer
207
+
208
+ **File Checkpointing:**
209
+ - **Chat sessions** — Save file snapshots during chat for rewind/restore (default: on). Disabling this prevents the Code Rewind feature (see §2.20) from working
210
+ - **Queue runner** — Save file snapshots during queue execution (default: off). Enabling increases JSONL session file size
211
+
212
+ **SDK Parameters:**
213
+ - **Max Thinking Tokens** — Limit Claude's extended thinking tokens (1,024–128,000)
214
+ - **Max Turns** — Limit conversation turns per query (1–100)
215
+ - **Max Budget (USD)** — Set cost limit per query ($0.01–$100)
216
+
217
+ > **Scope (as of v1.3.0)**: these SDK parameters now apply to **both** direct chat sends and Queue Runner executions. Earlier releases silently dropped them in the queue path — if your queue runs started honoring Max Turns or Max Thinking Tokens after upgrading, this is why. Adjust the values if the new behavior surprises you.
218
+
219
+ ### 13.17 Help
220
+
221
+ In-app usage guide within the Settings page:
222
+
223
+ - **Basic chat usage** — How to use the chat interface
224
+ - **Slash commands** — Available command reference
225
+ - **Permission mode guide** — Plan, Ask Before Edits, Edit Automatically explained
226
+ - **BMad Method** — Quick guide to the BMad workflow
227
+ - **Keyboard shortcuts** — Key bindings table (Enter, Shift+Enter, Escape, Ctrl+C, F7/Shift+F7, /)
228
+
229
+ ### 13.18 About
230
+
231
+ Displays app information:
232
+
233
+ - App name and version number
234
+ - Project description
235
+ - Author with link
236
+ - License type
237
+ - **GitHub Issues** link
238
+ - **Server status** — Healthy/unhealthy with color indicator dot
239
+ - **Server version**
240
+ - **Server time** — Localized timestamp
241
+
@@ -0,0 +1,68 @@
1
+ ## 14. Keyboard Shortcuts
2
+
3
+ ### Chat
4
+
5
+ | Shortcut | Action |
6
+ |----------|--------|
7
+ | `Enter` | Send message (desktop only) |
8
+ | `Shift+Enter` | New line in message |
9
+ | `ESC` | Abort generation / close command palette |
10
+ | `Ctrl+C` | Abort generation (only when no text is selected; otherwise copies) |
11
+ | `↑` / `↓` | Navigate prompt history (when cursor is at start/end of input) |
12
+ | `/` | Open slash command palette (auto-triggered when input starts with `/`) |
13
+ | `*` | Open star command palette (auto-triggered when input starts with `*`, requires active agent) |
14
+ | `%` | Open snippet autocomplete palette (auto-triggered when input starts with `%`) |
15
+ | `Tab` | Select highlighted command from palette |
16
+ | `Shift+Tab` | Cycle permission mode (Plan → Ask before edits → Edit automatically → Bypass) |
17
+ | `Ctrl` (hold) | Temporary chain mode while held |
18
+
19
+ ### Message Actions
20
+
21
+ | Shortcut | Action |
22
+ |----------|--------|
23
+ | `Ctrl+Enter` / `Cmd+Enter` | Accept edited message |
24
+ | `ESC` | Cancel message edit |
25
+
26
+ ### Quick Panel
27
+
28
+ | Shortcut | Action |
29
+ |----------|--------|
30
+ | `Alt+1` | Toggle Sessions panel |
31
+ | `Alt+2` | Toggle Files panel |
32
+ | `Alt+3` | Toggle Git panel |
33
+ | `Alt+4` | Toggle Terminal panel |
34
+
35
+ Note: Quick panel shortcuts are disabled when an input or textarea is focused.
36
+
37
+ ### Editor
38
+
39
+ | Shortcut | Action |
40
+ |----------|--------|
41
+ | `Ctrl+S` / `Cmd+S` | Save file |
42
+ | `ESC` | Close editor |
43
+
44
+ ### Diff Viewer
45
+
46
+ | Shortcut | Action |
47
+ |----------|--------|
48
+ | `F7` | Next change |
49
+ | `Shift+F7` | Previous change |
50
+ | `ESC` | Close diff viewer (fullscreen mode) |
51
+
52
+ ### Image Viewer
53
+
54
+ | Shortcut | Action |
55
+ |----------|--------|
56
+ | `←` / `→` | Previous / next image (when multiple images form a set) |
57
+ | `ESC` | Close image viewer |
58
+
59
+ ### Terminal
60
+
61
+ | Shortcut | Action |
62
+ |----------|--------|
63
+ | `Ctrl++` or `Ctrl+=` | Increase font size |
64
+ | `Ctrl+-` | Decrease font size |
65
+ | `Ctrl+0` | Reset font size |
66
+ | `←` / `→` | Switch between terminal tabs |
67
+ | `Delete` | Close active terminal tab |
68
+
@@ -0,0 +1,28 @@
1
+ ## 15. Environment Variables
2
+
3
+ ### Server
4
+
5
+ | Variable | Default | Description |
6
+ |----------|---------|-------------|
7
+ | `PORT` | `3000` | Server port |
8
+ | `HOST` | `0.0.0.0` | Bind address (all interfaces) |
9
+ | `NODE_ENV` | — | Set to `production` for optimized mode |
10
+ | `TRUST_PROXY` | `false` | Enable reverse proxy support. Set to `true` when behind Cloudflare Tunnel, nginx, etc. |
11
+ | `CORS_ORIGIN` | `true` | CORS origin policy. `true` allows any origin (local/VPN use). Set a specific URL (e.g., `https://hammoc.example.com`) to restrict |
12
+ | `ANTHROPIC_API_KEY` | — | Anthropic API key (required for Claude Code to function) |
13
+ | `CHAT_TIMEOUT_MS` | `300000` | Chat response timeout in milliseconds (5 minutes). Overrides the Settings UI value |
14
+ | `LOG_LEVEL` | `INFO` (prod) / `DEBUG` (dev) | Logging level: ERROR, WARN, INFO, DEBUG, VERBOSE |
15
+ | `TERMINAL_ENABLED` | `true` | Enable/disable terminal feature (set `false` to disable). Overrides the Settings UI value |
16
+ | `SHELL_TIMEOUT` | `30000` | Time (in ms) before an idle terminal session is cleaned up |
17
+ | `MAX_TERMINAL_SESSIONS` | `10` | Maximum concurrent terminal sessions |
18
+ | `TELEGRAM_BOT_TOKEN` | — | Telegram bot token (takes priority over Settings UI value) |
19
+ | `TELEGRAM_CHAT_ID` | — | Telegram chat ID (takes priority over Settings UI value) |
20
+ | `BASE_URL` | — | Fallback base URL for Telegram notification links (e.g., `http://192.168.1.100:3000`) |
21
+
22
+ ### Client (Vite)
23
+
24
+ | Variable | Default | Description |
25
+ |----------|---------|-------------|
26
+ | `VITE_SERVER_PORT` | `3000` | Server port the client connects to (useful for multi-instance setups) |
27
+ | `VITE_LOG_LEVEL` | — | Client-side debug log level: ERROR, WARN, INFO, DEBUG, VERBOSE |
28
+
@@ -0,0 +1,110 @@
1
+ ## 16. Troubleshooting
2
+
3
+ ### 16.1 "Claude Code CLI not found"
4
+
5
+ Claude Code CLI must be installed and in your PATH:
6
+
7
+ ```bash
8
+ claude --version
9
+ ```
10
+
11
+ If not installed, follow the [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code). The Onboarding page shows CLI installation, authentication, and API key status at a glance.
12
+
13
+ ### 16.2 "Authentication required" / `claude login`
14
+
15
+ If the chat displays an authentication error, Claude Code CLI needs to be logged in:
16
+
17
+ ```bash
18
+ claude login
19
+ ```
20
+
21
+ The Onboarding page (shown when CLI is not authenticated) displays the current auth status and provides setup commands.
22
+
23
+ ### 16.3 API rate limit exceeded
24
+
25
+ When Anthropic API rate limits are reached, the chat shows a rate limit error with a retry delay. Solutions:
26
+
27
+ 1. Wait for the indicated retry period and try again
28
+ 2. Reduce concurrent sessions or shorten prompts
29
+ 3. Check your API usage / plan limits on the Anthropic console
30
+ 4. The header status indicator shows API health (yellow triangle = API unavailable)
31
+
32
+ ### 16.4 "Connection lost" / Reconnecting
33
+
34
+ Hammoc automatically reconnects when the connection is lost. The header shows a status indicator: green (connected), yellow spinning (reconnecting), or red (disconnected with manual Reconnect button).
35
+
36
+ On mobile, the app automatically recovers when returning from background.
37
+
38
+ If the connection doesn't recover:
39
+
40
+ 1. Check that the server is still running
41
+ 2. Click the Reconnect button in the header (appears when disconnected)
42
+ 3. Refresh the browser
43
+ 4. Restart the server: `hammoc` or `npm start`
44
+
45
+ ### 16.5 Port already in use
46
+
47
+ The server automatically retries when the port is in use. If it still fails:
48
+
49
+ ```bash
50
+ hammoc --port 3001
51
+ ```
52
+
53
+ Or set the environment variable: `PORT=3001 hammoc`
54
+
55
+ ### 16.6 Terminal not available
56
+
57
+ Terminal may be disabled when:
58
+
59
+ - Accessing from an external network (security restriction — only local IPs are allowed)
60
+ - `TERMINAL_ENABLED=false` is set in environment
61
+ - Maximum terminal sessions reached (default 10, configurable via `MAX_TERMINAL_SESSIONS`)
62
+
63
+ ### 16.7 Reset password
64
+
65
+ If you forgot your password:
66
+
67
+ ```bash
68
+ hammoc --reset-password
69
+ ```
70
+
71
+ This prompts you to set a new password. Alternatively, delete `~/.hammoc/config.json` and restart the server to re-trigger the password setup flow in the browser.
72
+
73
+ ### 16.8 Chat timeout
74
+
75
+ If Claude's responses are timing out:
76
+
77
+ 1. Go to **Settings > Global** and adjust the **Chat Timeout** dropdown
78
+ 2. Available values: 1 min, 3 min, 5 min (default), 10 min, 30 min
79
+ 3. Complex tasks (large codebases, multi-file edits) may need longer timeouts
80
+ 4. If the `CHAT_TIMEOUT_MS` environment variable is set, it overrides the UI setting (shown with an indicator)
81
+
82
+ ### 16.9 Large file warning
83
+
84
+ Files over 1 MB display a truncation warning. Consider:
85
+
86
+ - Using the terminal to view large files
87
+ - Opening in an external editor
88
+ - Breaking large files into smaller ones
89
+
90
+ ### 16.10 Data locations
91
+
92
+ If you need to find or back up your data:
93
+
94
+ | Data | Path |
95
+ |------|------|
96
+ | App config & password | `~/.hammoc/config.json` |
97
+ | User preferences | `~/.hammoc/preferences.json` |
98
+ | Queue templates | `<project-root>/.hammoc/queue-templates.json` (per project) |
99
+ | Chain failures | `~/.hammoc/chain-failures/<sessionId>.json` (per session) |
100
+ | Global snippets | `~/.hammoc/snippets/` (shared across all projects) |
101
+ | Project snippets | `<project-root>/.hammoc/snippets/` (per project) |
102
+ | Global harness items | `~/.claude/` (skills, agents, commands, hooks, `CLAUDE.md`, `.mcp.json`, `settings.json`) |
103
+ | Project harness items | `<project-root>/.claude/` (same layout as global; project takes precedence) |
104
+ | Session data | `~/.claude/projects/` |
105
+ | Web Push VAPID keys | `~/.hammoc/vapid-keys.json` |
106
+ | Web Push subscriptions | `~/.hammoc/push-subscriptions.json` |
107
+ | TLS certificates | `~/.hammoc/key.pem`, `~/.hammoc/cert.pem` |
108
+ | Manual shards (synced) | `~/.hammoc/docs/manual/` and `~/.hammoc/docs/.manual-version` (auto-synced from the npm package on server boot; agents read these via the absolute path embedded in the system prompt) |
109
+ | Internals docs (synced) | `~/.hammoc/docs/internals/` (agent-only mechanism reference; also re-synced when the package version changes) |
110
+ | Server logs | `./logs/server-YYYY-MM-DD.log` (daily log files in working directory) |