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,48 @@
1
+ ## 3. Sessions
2
+
3
+ ### 3.1 Session List
4
+
5
+ Access the session list via the sidebar or quick panel:
6
+
7
+ - **Preview** — First prompt of each session
8
+ - **Session name badge** — Custom name shown as a blue badge (if renamed)
9
+ - **Agent badge** — Active BMad agent shown as a purple badge (if set)
10
+ - **Session ID** — Truncated identifier
11
+ - **Message count** — Number of messages in the session
12
+ - **Date** — When the session was last active
13
+ - **Streaming indicator** — Green dot with animation when streaming
14
+ - **Waiting indicator** — Amber pulsing dot with "Waiting" badge when a session is connected but not yet streaming
15
+ - **Queue badge** — Shown when queue runner is active on the session
16
+ - Empty sessions are hidden by default (toggle with the eye icon)
17
+
18
+ ### 3.2 Creating a New Session
19
+
20
+ - Click the **New Session** button in the header
21
+ - Each session gets a unique ID
22
+
23
+ ### 3.3 Session Search
24
+
25
+ Two distinct search modes:
26
+
27
+ - **By name/ID** — Client-side filtering of the session list by name or session ID
28
+ - **By content** — Toggle "Search content" to search through actual conversation messages (server-side, slower but thorough)
29
+ - Matching sessions are filtered and displayed in the list
30
+ - "Load more" pagination for large result sets
31
+
32
+ ### 3.4 Session Operations
33
+
34
+ - **Rename** — Click the edit icon next to the session name
35
+ - **Delete** — Remove a session (with confirmation)
36
+ - **Selection mode** — Select multiple sessions for batch delete
37
+ - **Delete empty sessions** — Bulk-delete all empty sessions at once
38
+
39
+ ### 3.5 Quick Session Panel
40
+
41
+ Access sessions without leaving the chat:
42
+
43
+ - Open the quick panel (sidebar tab)
44
+ - Switch between sessions instantly
45
+ - See session previews and status
46
+ - **Side toggle** — Move the panel to the left or right side using the button in the panel header
47
+ - **Mobile swipe** — Swipe inward from the screen edge to open, swipe back toward the edge to close
48
+
@@ -0,0 +1,152 @@
1
+ ## 4. Slash Commands & Favorites
2
+
3
+ ### 4.1 Command Palette
4
+
5
+ Type `/` in the chat input to open the command palette:
6
+
7
+ - Browse available commands grouped by category — **Agents**, **Tasks**, **Skills**, **Slash Commands** (project / global / plugin `.claude/commands/*.md` files), and **Commands** (everything else)
8
+ - Filter by typing: `/test` shows commands containing "test"
9
+ - Commands are project-specific — loaded from the project's configured agents and tasks
10
+ - **Real-time refresh** — The command and skill list is fetched from the server each time the palette opens, reflecting newly added or removed commands
11
+ - Navigate with **ArrowUp/Down**, close with **Escape**
12
+ - Press **Enter** or click to insert the selected command
13
+
14
+ ### 4.2 Star Command Palette
15
+
16
+ Type `*` in the chat input to open the star command palette (requires an active agent):
17
+
18
+ - Shows commands specific to the currently active agent
19
+ - Filter by typing: `*create` filters matching commands
20
+ - Navigate with **ArrowUp/Down**, close with **Escape**
21
+ - Press **Enter** or click to insert — placeholders like `{name}` are auto-selected
22
+ - Add to star favorites by clicking the star icon on any command
23
+
24
+ ### 4.3 Favorites
25
+
26
+ Pin your most-used slash commands for quick access:
27
+
28
+ - **Favorites bar** — Appears above the chat input (hidden when empty)
29
+ - Hold up to **20 favorites**
30
+ - Click a favorite chip to instantly insert it
31
+ - **Add**: Click the star icon on any command in the slash command palette
32
+ - **Remove**: Open the favorites popup and click the X button
33
+ - **Reorder**: Open the favorites popup and drag to rearrange
34
+ - Disabled during queue runner execution
35
+
36
+ ### 4.4 Star Favorites
37
+
38
+ Mark up to **10 star favorites** per agent for even quicker access:
39
+
40
+ - Star favorites appear with a yellow indicator and `*` prefix
41
+ - They are prioritized at the top of the favorites bar, before slash favorites
42
+ - **Add**: Click the star icon on any command in the star command palette (`*`)
43
+ - **Remove**: Open the favorites popup and click the X button
44
+
45
+ ### 4.5 Favorite Management
46
+
47
+ Click the star button (★) on the favorites bar to open the management popup:
48
+
49
+ - **Two sections**: "Agent Command" (star favorites) and "Slash Command" (slash favorites), separated by a divider
50
+ - Remove favorites with the X button
51
+ - Drag to reorder within each section
52
+ - Click a command to insert it into the chat input
53
+
54
+ ### 4.6 Prompt Snippets
55
+
56
+ Prompt snippets are reusable prompt templates stored as files. Invoke them with the `%` prefix in the chat input.
57
+
58
+ **Snippet storage (3-tier hierarchy, highest priority first):**
59
+
60
+ 1. **Project snippets** — `.hammoc/snippets/` in the project directory
61
+ 2. **Global snippets** — `~/.hammoc/snippets/`
62
+ 3. **Bundled snippets** — Built-in snippets shipped with Hammoc (~22 standard snippets)
63
+
64
+ If the same snippet name exists in multiple tiers, the highest-priority source is used. You can override bundled snippets by placing a file with the same name in your project or global snippets directory.
65
+
66
+ **Snippet files:**
67
+ - Plain text files (optionally with `.md` extension)
68
+ - File name becomes the snippet name (e.g., `commit-and-done` or `commit-and-done.md`)
69
+ - Maximum file size: 100KB
70
+
71
+ **Bundled standard snippets include:**
72
+ - Workflow: `commit-and-done`, `mark-done`, `apply-qa-fixes`, `validate-and-approve`, `validate-and-fix`
73
+ - Issues: `quick-fix-issue`, `promote-issue`, `promote-to-story`, `promote-to-epic`
74
+ - Research: `brainstorm`, `competitor-analysis`, `market-research`, `create-prd`, `create-project-brief`
75
+ - Architecture: `create-backend-arch`, `create-frontend-arch`, `create-fullstack-arch`, `create-frontend-spec`
76
+ - Stories: `develop-story`, `draft-story`, `brownfield-create-story`, `brownfield-create-epic`
77
+ - QA: `qa-review`, `validate-story`
78
+
79
+ ### 4.7 Snippet Autocomplete
80
+
81
+ Type `%` in the chat input to open the snippet autocomplete popup:
82
+
83
+ - **Grouped by source** — Sections labeled "Project", "Global", and "Bundled"
84
+ - **Preview** — Shows the first line of each snippet's content (up to 80 characters)
85
+ - **Real-time filtering** — Type after `%` to filter by name or preview text (case-insensitive)
86
+ - **Keyboard navigation** — ArrowUp/Down to navigate, Enter or Tab to select, Escape to close
87
+ - **Click** to select a snippet
88
+ - **Real-time refresh** — The snippet list is fetched from the server each time the popup opens, reflecting any file changes
89
+
90
+ Selecting a snippet inserts `%snippet-name ` (with trailing space) into the input. Deduplication ensures only the highest-priority version of each snippet name appears.
91
+
92
+ ### 4.8 Snippet Arguments & Context
93
+
94
+ Snippets support placeholder substitution for dynamic content.
95
+
96
+ **Positional arguments** (`{arg1}`, `{arg2}`, ...):
97
+
98
+ Arguments are space-separated after the snippet name:
99
+
100
+ ```
101
+ %commit-and-done BS-2
102
+ ```
103
+
104
+ If the snippet file contains `Commit changes for story {arg1}`, this resolves to `Commit changes for story BS-2`.
105
+
106
+ **Quoted arguments** — Use double quotes for multi-word arguments:
107
+
108
+ ```
109
+ %promote-issue "Fix login button" critical bug
110
+ ```
111
+
112
+ Here `{arg1}` = `Fix login button`, `{arg2}` = `critical`, `{arg3}` = `bug`. Inside quotes, use `\"` for literal quotes and `\\` for literal backslashes.
113
+
114
+ **Context blocks** (`{context}` + `---context`):
115
+
116
+ For injecting longer text into a snippet, add `---context` after the arguments followed by the content:
117
+
118
+ ```
119
+ %quick-fix-issue docs/issues/ISSUE-1.md critical bug
120
+ ---context
121
+ # Button fails on mobile
122
+ The login button doesn't render on iOS devices.
123
+ ```
124
+
125
+ The text after `---context` replaces all `{context}` placeholders in the snippet.
126
+
127
+ **Unreferenced arguments** are ignored. Unreplaced placeholders remain as literal text.
128
+
129
+ ### 4.9 Multi-Prompt Snippets
130
+
131
+ Snippets can contain multiple prompts separated by `---` on its own line:
132
+
133
+ ```
134
+ *validate-story-draft {arg1}
135
+ ---
136
+ Please fix all identified issues.
137
+ ---
138
+ Mark as approved.
139
+ ```
140
+
141
+ When invoked as `%validate-and-fix BS-2`:
142
+
143
+ 1. The first prompt executes immediately as the chat message
144
+ 2. Remaining prompts are added to the prompt chain queue (see §2.9) for sequential execution
145
+
146
+ The total number of chain items is subject to the 10-item chain limit.
147
+
148
+ **Usage in different contexts:**
149
+ - **Chat messages** — First prompt sent immediately, remaining prompts queued as chain items
150
+ - **Prompt chain** — All resolved prompts added as chain items
151
+ - **Queue scripts** — Snippet is expanded inline, with additional prompts spliced into the queue
152
+
@@ -0,0 +1,74 @@
1
+ ## 5. Projects
2
+
3
+ ### 5.1 Project List
4
+
5
+ The project list page shows all your Claude Code projects in a responsive grid:
6
+
7
+ Each project card displays:
8
+
9
+ - **Project name** — Derived from the directory name
10
+ - **Path** — Full project directory path
11
+ - **Session count** — Number of chat sessions
12
+ - **Last modified** — When the project was last active
13
+ - **BMad badge** — Indicates BMAD-METHOD enabled projects
14
+ - **Status indicators** — Active sessions (green dot), queue status badge, terminal count (updates in real-time)
15
+
16
+ Each card has a **kebab menu** (⋮) with:
17
+
18
+ - **Setup BMad** — Initialize BMAD-METHOD on non-BMad projects (with version selection)
19
+ - **Hide / Unhide** — Toggle project visibility
20
+ - **Delete** — Remove the project
21
+
22
+ **Dashboard summary bar** appears at the top when projects exist, showing aggregate stats: Projects, Sessions, Active, Queue, Terminals.
23
+
24
+ ### 5.2 Creating a New Project
25
+
26
+ 1. Click **"New Project"** on the project list page
27
+ 2. Enter the project directory path
28
+ 3. The path is validated automatically with a short debounce while you type (`"Validating path..."` helper text is shown). Blurring the field validates immediately
29
+ 4. Path collision detection — if the path already belongs to an existing project, an amber warning appears with a **"Navigate to existing"** link and the **Create** button is disabled until you pick a different path
30
+ 5. Invalid paths show the server's validation message in red below the input, and also disable **Create**
31
+ 6. Optionally enable BMad Method initialization with version selection
32
+
33
+ ### 5.3 Project Settings
34
+
35
+ Per-project settings live in their own tab inside each project (Overview / Queue / Git / Files / Terminal / Board / **Settings**), no longer under the global Settings page. Opening the tab takes you directly to that project's configuration — there is no project dropdown to disambiguate.
36
+
37
+ The Settings tab has a two-pane layout:
38
+
39
+ - **Left nav** — Two top-level groups: **General** and **Harness Workbench** (see §12)
40
+ - **Right panel** — Form contents for the selected group
41
+
42
+ **General group** (per-project override fields):
43
+
44
+ - **Default model** — Override the global model selection
45
+ - **Permission mode** — Override the global permission mode (Plan, Ask before edits, Edit automatically). Note: Bypass permissions is not available at project level
46
+ - **Hidden toggle** — Hide the project from the project list
47
+ - **Reset to Global Defaults** — Remove all overrides at once
48
+
49
+ On narrow screens, the left nav collapses into a row of buttons above the right panel (the inner Harness Workbench navigator beneath it becomes the horizontally-scrolling pill row — see §12.1).
50
+
51
+ ### 5.4 Hiding Projects
52
+
53
+ - Hide projects from the kebab menu or project settings
54
+ - Hidden projects appear with reduced opacity when visible
55
+ - Toggle "Show hidden" (eye icon in header) to reveal them
56
+ - Hiding doesn't delete any data
57
+
58
+ ### 5.5 Project Overview Page
59
+
60
+ Clicking a project card opens the Overview tab:
61
+
62
+ - **Stats cards** — Three cards showing Total Sessions, Total Messages, and Active Sessions
63
+ - **Recent Sessions** — Last 5 sessions with streaming indicators, session name badges, and message counts. Click to navigate directly to the session
64
+ - **Quick Start** — Buttons for New Session, Queue Runner, and File Explorer
65
+ - **Active streaming banner** — Green banner shown when sessions are actively streaming
66
+
67
+ For BMad projects, additional sections appear above this standard overview (see §11.4).
68
+
69
+ ### 5.6 Deleting Projects
70
+
71
+ - Delete removes the project from Hammoc's list
72
+ - Optionally check **"Delete project files"** to also remove the directory on disk
73
+ - Confirmation dialog prevents accidental deletion
74
+
@@ -0,0 +1,90 @@
1
+ ## 6. File Explorer & Editor
2
+
3
+ ### 6.1 File Explorer
4
+
5
+ Access the file explorer from the sidebar tab. Toggle between views with the toolbar button:
6
+
7
+ **Grid View (Finder-style, default)**
8
+ - Icon-based card display with folder/file icons
9
+ - Click folders to navigate in, click files to open
10
+ - ".." entry to navigate to parent directory
11
+ - Breadcrumb navigation at the top
12
+
13
+ **List View (hierarchical tree)**
14
+ - Recursive tree with expand/collapse chevrons
15
+ - Lazy-loaded subdirectories
16
+ - Sorted by type (folders first) then by name
17
+ - Keyboard navigation: ArrowUp/Down/Left/Right, Enter, Home/End
18
+
19
+ **Context Menu** (right-click or ⋮ button on hover)
20
+ - **New File** / **New Folder** — Creates via inline input
21
+ - **Copy** / **Cut** / **Paste** — Copy or move files and folders within the project
22
+ - **Download** — Download individual files (files only)
23
+ - **Rename** — Inline renaming
24
+ - **Delete** — With confirmation dialog
25
+
26
+ **File Upload**
27
+ - Drag and drop files from your OS into the Grid view to upload them
28
+ - Paste files from clipboard (`Ctrl+V`) while the file explorer is focused
29
+
30
+ **Toolbar**
31
+ - **Search** — File search with real-time filtering
32
+ - **Hidden files** — Toggle visibility of ignored patterns (`.git`, `node_modules`, `.env`, `dist`, etc.)
33
+ - **View toggle** — Switch between Grid and List views
34
+ - **Open in OS explorer** — Opens the project folder in your OS file manager (Explorer, Finder, etc.). Only shown when accessing via localhost
35
+ - Default view mode configurable in settings
36
+
37
+ ### 6.2 Text Editor
38
+
39
+ Click any text file to open it in the built-in editor:
40
+
41
+ - **Syntax highlighting** — Language-aware (detected from file extension)
42
+ - **Line numbers** and **active line highlighting**
43
+ - **Save** — `Ctrl+S` / `Cmd+S` or the save button
44
+ - **Close** — `Escape` key or the X button
45
+ - **Unsaved changes warning** — Confirmation dialog prevents accidental data loss
46
+ - **File size limit** — Files over 1MB are truncated and read-only
47
+ - **Binary files** — When a binary file is opened (images, PDFs, executables, etc.), the editor body shows the file's human-readable size (e.g., `104 B`, `5.0 MB`) together with a **Download** button for direct download
48
+
49
+ **External change detection**
50
+
51
+ The server watches open files and pushes a notification if the file changes on disk outside Hammoc. An alert banner appears above the editor:
52
+
53
+ - **File modified on disk (clean editor)** — Amber banner with **Reload** (re-read from disk) and **Dismiss** (keep current view)
54
+ - **File modified on disk (with unsaved edits)** — Amber banner warning that saving will overwrite the external changes; same Reload / Dismiss buttons
55
+ - **File deleted on disk** — Red banner with a **Dismiss** button (no reload is possible)
56
+ - **Stale-write conflict** — If you try to save a file that was modified on disk since you opened it, the save is rejected and a red banner offers **Reload** (discard your edits) or **Overwrite** (force-save over the external changes)
57
+
58
+ ### 6.3 Markdown Preview
59
+
60
+ For `.md` files:
61
+
62
+ - Toggle between **Edit** and **Preview** modes via the header button
63
+ - Preview renders full markdown with styles
64
+ - Default mode (Edit or Preview) configurable in settings
65
+
66
+ ### 6.4 Image Viewer
67
+
68
+ Click any image file to open the viewer in a fullscreen overlay:
69
+
70
+ - **Zoom in/out** — Button controls or mouse wheel scroll (wheel zoom cancels any active fit mode)
71
+ - **Drag to pan** — Click and drag to move the image. Pan position is clamped so the zoomed image cannot be dragged completely off-screen
72
+ - **Zoom percentage** — Displayed between zoom buttons
73
+ - **Fit controls** — Header buttons for **Actual size (100%)**, **Fit to screen**, **Fit to width**, and **Fit to height**. The active fit mode is cleared when you manually zoom with the wheel
74
+ - **Touch gestures** (mobile / touchscreen):
75
+ - **Pinch** with two fingers to zoom. The zoom is anchored at the midpoint between the two fingers so the content under your fingers stays put
76
+ - **One-finger drag** pans the image when it's zoomed in (with edge clamping)
77
+ - **One-finger horizontal swipe** (when the image fits on screen) navigates to the previous / next image in the set. A swipe needs to exceed roughly 50 px horizontally and be more horizontal than vertical to trigger
78
+ - **Multi-image navigation** — When multiple images are available (a chat message with multiple attachments, **or a file-explorer image opened from a folder containing other images**), they form a navigable set. Left/right arrow keys move between images and zoom resets to fit on each change. The header shows the current position (e.g., `filename (2/5)`)
79
+ - **Close** — `Escape` key or the X button
80
+ - Supports PNG, JPEG, GIF, WebP, SVG, BMP, ICO
81
+
82
+ ### 6.5 Quick File Panel
83
+
84
+ Access files without leaving the chat:
85
+
86
+ - Open the quick panel and switch to the Files tab
87
+ - **Recently opened** files appear at the top (max 5 per session)
88
+ - Search and navigate the file tree
89
+ - Click to open in the editor overlay
90
+
@@ -0,0 +1,94 @@
1
+ ## 7. Git
2
+
3
+ ### 7.1 Git Status
4
+
5
+ The Git tab shows the current repository state with automatic refresh:
6
+
7
+ - **Top bar** — Branch selector dropdown + Pull/Push buttons
8
+ - **File groups** — Three collapsible sections (chevron toggle), each with file count badge:
9
+ - **Staged Changes** — Files ready to commit (status indicators: M green, A green, D red, R blue)
10
+ - **Unstaged Changes** — Modified files not yet staged (status indicators: M yellow, D red)
11
+ - **Untracked Files** — New files not tracked by Git (status indicator: ?)
12
+ - **File click** — Clicking a file name opens the Diff viewer slide panel (see 7.8)
13
+ - **Error banner** — Git errors appear at the top and auto-clear; dismiss manually with X
14
+ - **Clean state** — When no changes exist, a green checkmark with "No changes" message is shown
15
+
16
+ ### 7.2 Staging Files
17
+
18
+ - **Stage individual files** — Click the "+" button next to each file (appears on hover)
19
+ - **Stage all** — Click "+ All" in the group header to stage all files in that group
20
+ - **Unstage individual** — Click the "-" button on staged files (appears on hover)
21
+ - **Unstage all** — Click "- All" in the Staged Changes group header
22
+
23
+ ### 7.3 Committing
24
+
25
+ 1. Stage the files you want to commit
26
+ 2. Write a commit message in the textarea
27
+ 3. Click **"Commit"** (enabled only when staged files exist and message is non-empty)
28
+ 4. The commit history refreshes automatically after a successful commit
29
+
30
+ > **Note:** "Stage All & Commit" is available only in the Quick Git Panel (see 7.7). The full Git tab requires staging first, then committing separately.
31
+
32
+ ### 7.4 Branch Management
33
+
34
+ - **Branch selector** — Dropdown button in the top bar showing the current branch
35
+ - **Branch list** — All local branches displayed; current branch highlighted with a blue checkmark
36
+ - **Create branch** — Input field at the bottom of the dropdown; press Enter to create
37
+ - **Switch branch** — Click on a branch name to switch
38
+ - **Uncommitted changes warning** — If there are staged, unstaged, or untracked files, a confirmation dialog appears before switching
39
+ - **Keyboard navigation** — ArrowUp/Down to navigate, Enter to select, Escape to close dropdown
40
+
41
+ ### 7.5 Commit History
42
+
43
+ - Browse recent commits (up to 20 in the full tab):
44
+ - Short commit hash
45
+ - Commit message
46
+ - Author name
47
+ - Relative timestamp (e.g., "2 hours ago", "3 days ago")
48
+
49
+ ### 7.6 Pull & Push
50
+
51
+ - **Pull** — Fetch and merge remote changes (↓ arrow button)
52
+ - **Push** — Upload local commits to remote (↑ arrow button)
53
+ - **Ahead/Behind counts** — Each button shows the number of commits ahead or behind the remote
54
+ - Errors displayed in the error banner
55
+
56
+ ### 7.7 Quick Git Panel
57
+
58
+ Lightweight Git access from the quick panel side bar:
59
+
60
+ - **Branch name** with changed file count badge (e.g., "3 changes")
61
+ - **Commit input** — Textarea for commit message
62
+ - **"Stage All & Commit"** — Single green button that automatically stages all unstaged/untracked files and commits in one action
63
+ - **Success message** — Displayed briefly after a successful commit
64
+ - **Recent commits** — Shows only the 3 most recent commits (hash, timestamp, message)
65
+ - **"View in Git Tab"** link — Navigates to the full Git tab for advanced operations
66
+ - **Git init support** — If the project is not a Git repository, shows an init button
67
+
68
+ ### 7.8 Diff Viewer
69
+
70
+ - Clicking a file in the Git tab opens a **slide panel** from the right side
71
+ - Shows the diff for the selected file, using side-by-side or inline layout based on screen width
72
+ - **Layout toggle** — A button in the viewer header switches between side-by-side and inline layout. The choice is persisted per user (see §2.7)
73
+ - **Close** — Click X button, click the backdrop, or press Escape
74
+
75
+ ### 7.9 Git Repository Initialization
76
+
77
+ If the project directory is not a Git repository:
78
+
79
+ - **Git tab** — Shows an "Initialize Repository" button
80
+ - **Quick Git panel** — Shows a message and init button
81
+ - After initialization, the Git status refreshes automatically
82
+
83
+ ### 7.10 AI-Assisted Split Commit
84
+
85
+ A purple dashed chip — **"Split changes into logical commits / Claude handles it in a new session"** — appears in the Git tab below the file list whenever there are uncommitted changes (staged, unstaged, or untracked). The chip is hidden on a clean working tree.
86
+
87
+ Clicking it:
88
+
89
+ 1. Creates a fresh chat session
90
+ 2. Auto-sends the bundled `%split-commit` snippet, which asks Claude to inspect the working tree (`git status` / `git diff`), group changes into coherent units, and produce one conventional-style commit per group
91
+ 3. Navigates you into that session so you can watch the work and approve each commit
92
+
93
+ The chip lives only on the full Git tab — the Quick Git panel keeps its single "Stage All & Commit" action for fast manual commits.
94
+
@@ -0,0 +1,59 @@
1
+ ## 8. Terminal
2
+
3
+ ### 8.1 Web Terminal
4
+
5
+ Full terminal access in your browser:
6
+
7
+ - **Shell emulation** — Real terminal connection to your system shell
8
+ - **Working directory** — Opens in your project directory
9
+ - Supports all shell commands, interactive programs, and TUI apps
10
+ - **Theme** — Automatically matches app theme (dark/light)
11
+ - **Font** — Monospace font (JetBrains Mono, Fira Code, Cascadia Code)
12
+
13
+ ### 8.2 Multiple Tabs
14
+
15
+ - Click **"New Terminal"** button (+ icon) in the header to open a new terminal tab
16
+ - **Maximum 5 terminals** per project; button disabled at limit
17
+ - **Tab labels** — Named after shell (e.g., "bash", "zsh"); numbered when multiple share the same shell ("bash 1", "bash 2")
18
+ - **Switch tabs** — Click on a tab label or use **ArrowLeft/ArrowRight** keyboard navigation
19
+ - **Close tabs** — Click the X button on each tab, or press **Delete** to close the active tab
20
+ - **Empty state** — When no terminals exist, a centered prompt with "New Terminal" button is shown
21
+
22
+ ### 8.3 Font Size
23
+
24
+ Font size controls are available both via keyboard shortcuts and GUI buttons in the header:
25
+
26
+ - **GUI controls** — Minus (-), current size display (click to reset), Plus (+) buttons in the header
27
+ - `Ctrl+=` / `Ctrl++` — Increase font size
28
+ - `Ctrl+-` — Decrease font size
29
+ - `Ctrl+0` — Reset to default size
30
+
31
+ ### 8.4 Connection Status
32
+
33
+ The header shows the current terminal status:
34
+
35
+ - **Connecting** — Spinner with "Connecting..." text
36
+ - **Connected** — Green dot indicator with "Connected" text
37
+ - **Disconnected** — Red dot; "Disconnected" message shown over the terminal
38
+ - **Exited** — Gray dot with exit code displayed
39
+
40
+ ### 8.5 Security
41
+
42
+ Terminal access is restricted for safety:
43
+
44
+ - **Local network only** — Blocked when accessed from outside the local/private network. When behind a reverse proxy with `TRUST_PROXY=true`, real client IPs are used for access control
45
+ - **Access denied warning** — When access is denied, a shield icon with explanation is shown
46
+ - **Configurable** — Enable/disable via the `TERMINAL_ENABLED` environment variable (set `false` to disable)
47
+ - **Max sessions** — Server-side limit of 10 (configurable via `MAX_TERMINAL_SESSIONS`); client limits to 5 per project
48
+ - **Session persistence** — Terminal sessions survive browser refreshes and temporary network interruptions
49
+
50
+ ### 8.6 Quick Terminal
51
+
52
+ Lightweight terminal access from the quick panel side bar:
53
+
54
+ - **Multi-terminal support** — Same tab management as the full Terminal tab (create, switch, close, max 5)
55
+ - **Font size controls** — Minus, size display (click to reset), Plus buttons in the header
56
+ - **"Open in Tab"** link — Navigate to the full Terminal tab
57
+ - **Tab keyboard navigation** — ArrowLeft/Right to switch, Delete to close
58
+ - **Security warning** — Same access denied warning when terminal access is restricted
59
+