hammoc 1.4.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 (252) hide show
  1. package/README.md +422 -405
  2. package/bin/hammoc.js +0 -6
  3. package/package.json +100 -94
  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 +13 -21
  14. package/packages/server/dist/app.js.map +1 -1
  15. package/packages/server/dist/controllers/claudeMdController.d.ts +26 -0
  16. package/packages/server/dist/controllers/claudeMdController.d.ts.map +1 -0
  17. package/packages/server/dist/controllers/claudeMdController.js +158 -0
  18. package/packages/server/dist/controllers/claudeMdController.js.map +1 -0
  19. package/packages/server/dist/controllers/harnessAgentController.d.ts +28 -0
  20. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -0
  21. package/packages/server/dist/controllers/harnessAgentController.js +339 -0
  22. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -0
  23. package/packages/server/dist/controllers/harnessCommandController.d.ts +28 -0
  24. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -0
  25. package/packages/server/dist/controllers/harnessCommandController.js +382 -0
  26. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -0
  27. package/packages/server/dist/controllers/harnessController.d.ts +21 -0
  28. package/packages/server/dist/controllers/harnessController.d.ts.map +1 -0
  29. package/packages/server/dist/controllers/harnessController.js +176 -0
  30. package/packages/server/dist/controllers/harnessController.js.map +1 -0
  31. package/packages/server/dist/controllers/harnessHookController.d.ts +32 -0
  32. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -0
  33. package/packages/server/dist/controllers/harnessHookController.js +363 -0
  34. package/packages/server/dist/controllers/harnessHookController.js.map +1 -0
  35. package/packages/server/dist/controllers/harnessLintController.d.ts +18 -0
  36. package/packages/server/dist/controllers/harnessLintController.d.ts.map +1 -0
  37. package/packages/server/dist/controllers/harnessLintController.js +72 -0
  38. package/packages/server/dist/controllers/harnessLintController.js.map +1 -0
  39. package/packages/server/dist/controllers/harnessMcpController.d.ts +28 -0
  40. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -0
  41. package/packages/server/dist/controllers/harnessMcpController.js +310 -0
  42. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -0
  43. package/packages/server/dist/controllers/harnessPluginController.d.ts +17 -0
  44. package/packages/server/dist/controllers/harnessPluginController.d.ts.map +1 -0
  45. package/packages/server/dist/controllers/harnessPluginController.js +115 -0
  46. package/packages/server/dist/controllers/harnessPluginController.js.map +1 -0
  47. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +15 -0
  48. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -0
  49. package/packages/server/dist/controllers/harnessShareScopeController.js +73 -0
  50. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -0
  51. package/packages/server/dist/controllers/harnessSkillController.d.ts +32 -0
  52. package/packages/server/dist/controllers/harnessSkillController.d.ts.map +1 -0
  53. package/packages/server/dist/controllers/harnessSkillController.js +453 -0
  54. package/packages/server/dist/controllers/harnessSkillController.js.map +1 -0
  55. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  56. package/packages/server/dist/controllers/projectController.js +11 -0
  57. package/packages/server/dist/controllers/projectController.js.map +1 -1
  58. package/packages/server/dist/controllers/snippetController.d.ts +35 -0
  59. package/packages/server/dist/controllers/snippetController.d.ts.map +1 -0
  60. package/packages/server/dist/controllers/snippetController.js +294 -0
  61. package/packages/server/dist/controllers/snippetController.js.map +1 -0
  62. package/packages/server/dist/handlers/websocket.d.ts +15 -0
  63. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  64. package/packages/server/dist/handlers/websocket.js +79 -0
  65. package/packages/server/dist/handlers/websocket.js.map +1 -1
  66. package/packages/server/dist/index.js +5 -0
  67. package/packages/server/dist/index.js.map +1 -1
  68. package/packages/server/dist/locales/en/server.json +37 -4
  69. package/packages/server/dist/locales/es/server.json +0 -4
  70. package/packages/server/dist/locales/ja/server.json +0 -4
  71. package/packages/server/dist/locales/ko/server.json +0 -4
  72. package/packages/server/dist/locales/pt/server.json +0 -4
  73. package/packages/server/dist/locales/zh-CN/server.json +0 -4
  74. package/packages/server/dist/routes/harness.d.ts +8 -0
  75. package/packages/server/dist/routes/harness.d.ts.map +1 -0
  76. package/packages/server/dist/routes/harness.js +92 -0
  77. package/packages/server/dist/routes/harness.js.map +1 -0
  78. package/packages/server/dist/routes/projects.d.ts.map +1 -1
  79. package/packages/server/dist/routes/projects.js +5 -60
  80. package/packages/server/dist/routes/projects.js.map +1 -1
  81. package/packages/server/dist/routes/snippets.d.ts +14 -0
  82. package/packages/server/dist/routes/snippets.d.ts.map +1 -0
  83. package/packages/server/dist/routes/snippets.js +27 -0
  84. package/packages/server/dist/routes/snippets.js.map +1 -0
  85. package/packages/server/dist/services/bmadStatusService.d.ts +6 -2
  86. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  87. package/packages/server/dist/services/bmadStatusService.js +88 -32
  88. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  89. package/packages/server/dist/services/chatService.d.ts +3 -0
  90. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  91. package/packages/server/dist/services/chatService.js +27 -6
  92. package/packages/server/dist/services/chatService.js.map +1 -1
  93. package/packages/server/dist/services/claudeMdService.d.ts +48 -0
  94. package/packages/server/dist/services/claudeMdService.d.ts.map +1 -0
  95. package/packages/server/dist/services/claudeMdService.js +240 -0
  96. package/packages/server/dist/services/claudeMdService.js.map +1 -0
  97. package/packages/server/dist/services/commandService.d.ts +10 -0
  98. package/packages/server/dist/services/commandService.d.ts.map +1 -1
  99. package/packages/server/dist/services/commandService.js +129 -4
  100. package/packages/server/dist/services/commandService.js.map +1 -1
  101. package/packages/server/dist/services/fileWatcherService.d.ts +24 -0
  102. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -1
  103. package/packages/server/dist/services/fileWatcherService.js +192 -1
  104. package/packages/server/dist/services/fileWatcherService.js.map +1 -1
  105. package/packages/server/dist/services/harnessAgentService.d.ts +79 -0
  106. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -0
  107. package/packages/server/dist/services/harnessAgentService.js +933 -0
  108. package/packages/server/dist/services/harnessAgentService.js.map +1 -0
  109. package/packages/server/dist/services/harnessCommandService.d.ts +60 -0
  110. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -0
  111. package/packages/server/dist/services/harnessCommandService.js +853 -0
  112. package/packages/server/dist/services/harnessCommandService.js.map +1 -0
  113. package/packages/server/dist/services/harnessHookService.d.ts +55 -0
  114. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -0
  115. package/packages/server/dist/services/harnessHookService.js +1060 -0
  116. package/packages/server/dist/services/harnessHookService.js.map +1 -0
  117. package/packages/server/dist/services/harnessLintService.d.ts +49 -0
  118. package/packages/server/dist/services/harnessLintService.d.ts.map +1 -0
  119. package/packages/server/dist/services/harnessLintService.js +628 -0
  120. package/packages/server/dist/services/harnessLintService.js.map +1 -0
  121. package/packages/server/dist/services/harnessMcpService.d.ts +77 -0
  122. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -0
  123. package/packages/server/dist/services/harnessMcpService.js +814 -0
  124. package/packages/server/dist/services/harnessMcpService.js.map +1 -0
  125. package/packages/server/dist/services/harnessPluginService.d.ts +66 -0
  126. package/packages/server/dist/services/harnessPluginService.d.ts.map +1 -0
  127. package/packages/server/dist/services/harnessPluginService.js +559 -0
  128. package/packages/server/dist/services/harnessPluginService.js.map +1 -0
  129. package/packages/server/dist/services/harnessService.d.ts +40 -0
  130. package/packages/server/dist/services/harnessService.d.ts.map +1 -0
  131. package/packages/server/dist/services/harnessService.js +222 -0
  132. package/packages/server/dist/services/harnessService.js.map +1 -0
  133. package/packages/server/dist/services/harnessShareScopeService.d.ts +31 -0
  134. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -0
  135. package/packages/server/dist/services/harnessShareScopeService.js +93 -0
  136. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -0
  137. package/packages/server/dist/services/harnessSkillService.d.ts +70 -0
  138. package/packages/server/dist/services/harnessSkillService.d.ts.map +1 -0
  139. package/packages/server/dist/services/harnessSkillService.js +636 -0
  140. package/packages/server/dist/services/harnessSkillService.js.map +1 -0
  141. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  142. package/packages/server/dist/services/issueService.js +2 -1
  143. package/packages/server/dist/services/issueService.js.map +1 -1
  144. package/packages/server/dist/services/manualSyncService.d.ts +19 -0
  145. package/packages/server/dist/services/manualSyncService.d.ts.map +1 -0
  146. package/packages/server/dist/services/manualSyncService.js +110 -0
  147. package/packages/server/dist/services/manualSyncService.js.map +1 -0
  148. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  149. package/packages/server/dist/services/queueService.js +45 -2
  150. package/packages/server/dist/services/queueService.js.map +1 -1
  151. package/packages/server/dist/services/snippetService.d.ts +54 -0
  152. package/packages/server/dist/services/snippetService.d.ts.map +1 -0
  153. package/packages/server/dist/services/snippetService.js +371 -0
  154. package/packages/server/dist/services/snippetService.js.map +1 -0
  155. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts +46 -0
  156. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts.map +1 -0
  157. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js +125 -0
  158. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js.map +1 -0
  159. package/packages/server/dist/snippets/split-commit +9 -0
  160. package/packages/server/dist/utils/applySecretsPolicy.d.ts +53 -0
  161. package/packages/server/dist/utils/applySecretsPolicy.d.ts.map +1 -0
  162. package/packages/server/dist/utils/applySecretsPolicy.js +204 -0
  163. package/packages/server/dist/utils/applySecretsPolicy.js.map +1 -0
  164. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts +40 -0
  165. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts.map +1 -0
  166. package/packages/server/dist/utils/assertNoSecretOnShared.js +47 -0
  167. package/packages/server/dist/utils/assertNoSecretOnShared.js.map +1 -0
  168. package/packages/server/dist/utils/gitignoreFilter.d.ts +23 -0
  169. package/packages/server/dist/utils/gitignoreFilter.d.ts.map +1 -0
  170. package/packages/server/dist/utils/gitignoreFilter.js +42 -0
  171. package/packages/server/dist/utils/gitignoreFilter.js.map +1 -0
  172. package/packages/server/dist/utils/harnessBundleSchema.d.ts +105 -0
  173. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -0
  174. package/packages/server/dist/utils/harnessBundleSchema.js +79 -0
  175. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -0
  176. package/packages/server/dist/utils/harnessPaths.d.ts +34 -0
  177. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -0
  178. package/packages/server/dist/utils/harnessPaths.js +124 -0
  179. package/packages/server/dist/utils/harnessPaths.js.map +1 -0
  180. package/packages/server/dist/utils/secretHeuristic.d.ts +72 -0
  181. package/packages/server/dist/utils/secretHeuristic.d.ts.map +1 -0
  182. package/packages/server/dist/utils/secretHeuristic.js +163 -0
  183. package/packages/server/dist/utils/secretHeuristic.js.map +1 -0
  184. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts +41 -0
  185. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts.map +1 -0
  186. package/packages/server/dist/utils/secretPlaceholderNamer.js +81 -0
  187. package/packages/server/dist/utils/secretPlaceholderNamer.js.map +1 -0
  188. package/packages/server/dist/utils/serverPathResolver.d.ts +29 -0
  189. package/packages/server/dist/utils/serverPathResolver.d.ts.map +1 -0
  190. package/packages/server/dist/utils/serverPathResolver.js +59 -0
  191. package/packages/server/dist/utils/serverPathResolver.js.map +1 -0
  192. package/packages/server/dist/utils/snippetPaths.d.ts +61 -0
  193. package/packages/server/dist/utils/snippetPaths.d.ts.map +1 -0
  194. package/packages/server/dist/utils/snippetPaths.js +123 -0
  195. package/packages/server/dist/utils/snippetPaths.js.map +1 -0
  196. package/packages/server/dist/utils/structuredEditor.d.ts +34 -0
  197. package/packages/server/dist/utils/structuredEditor.d.ts.map +1 -0
  198. package/packages/server/dist/utils/structuredEditor.js +111 -0
  199. package/packages/server/dist/utils/structuredEditor.js.map +1 -0
  200. package/packages/server/package.json +4 -1
  201. package/packages/server/resources/internals/INDEX.md +23 -0
  202. package/packages/server/resources/internals/harness-files.md +63 -0
  203. package/packages/server/resources/internals/image-storage.md +43 -0
  204. package/packages/server/resources/manual/01-getting-started.md +104 -0
  205. package/packages/server/resources/manual/02-chat.md +285 -0
  206. package/packages/server/resources/manual/03-sessions.md +48 -0
  207. package/packages/server/resources/manual/04-slash-commands-favorites.md +152 -0
  208. package/packages/server/resources/manual/05-projects.md +74 -0
  209. package/packages/server/resources/manual/06-file-explorer-editor.md +90 -0
  210. package/packages/server/resources/manual/07-git.md +94 -0
  211. package/packages/server/resources/manual/08-terminal.md +59 -0
  212. package/packages/server/resources/manual/09-queue-runner.md +262 -0
  213. package/packages/server/resources/manual/10-project-board.md +193 -0
  214. package/packages/server/resources/manual/11-bmad-method-integration.md +128 -0
  215. package/packages/server/resources/manual/12-harness-workbench.md +175 -0
  216. package/packages/server/resources/manual/13-settings.md +241 -0
  217. package/packages/server/resources/manual/14-keyboard-shortcuts.md +68 -0
  218. package/packages/server/resources/manual/15-environment-variables.md +28 -0
  219. package/packages/server/resources/manual/16-troubleshooting.md +110 -0
  220. package/packages/server/resources/manual/INDEX.md +60 -0
  221. package/packages/shared/dist/index.d.ts +3 -0
  222. package/packages/shared/dist/index.d.ts.map +1 -1
  223. package/packages/shared/dist/index.js +6 -0
  224. package/packages/shared/dist/index.js.map +1 -1
  225. package/packages/shared/dist/types/command.d.ts +3 -3
  226. package/packages/shared/dist/types/command.d.ts.map +1 -1
  227. package/packages/shared/dist/types/harness.d.ts +1211 -0
  228. package/packages/shared/dist/types/harness.d.ts.map +1 -0
  229. package/packages/shared/dist/types/harness.js +107 -0
  230. package/packages/shared/dist/types/harness.js.map +1 -0
  231. package/packages/shared/dist/types/harnessBundle.d.ts +170 -0
  232. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -0
  233. package/packages/shared/dist/types/harnessBundle.js +18 -0
  234. package/packages/shared/dist/types/harnessBundle.js.map +1 -0
  235. package/packages/shared/dist/types/preferences.d.ts +2 -0
  236. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  237. package/packages/shared/dist/types/preferences.js.map +1 -1
  238. package/packages/shared/dist/types/queue.d.ts +9 -0
  239. package/packages/shared/dist/types/queue.d.ts.map +1 -1
  240. package/packages/shared/dist/types/websocket.d.ts +10 -0
  241. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  242. package/packages/shared/dist/utils/markdownSections.d.ts +50 -0
  243. package/packages/shared/dist/utils/markdownSections.d.ts.map +1 -0
  244. package/packages/shared/dist/utils/markdownSections.js +111 -0
  245. package/packages/shared/dist/utils/markdownSections.js.map +1 -0
  246. package/packages/shared/dist/utils/queueParser.d.ts.map +1 -1
  247. package/packages/shared/dist/utils/queueParser.js +104 -0
  248. package/packages/shared/dist/utils/queueParser.js.map +1 -1
  249. package/scripts/build-manual-shards.mjs +100 -0
  250. package/packages/client/dist/assets/index-6jREnVYd.js +0 -2
  251. package/packages/client/dist/assets/index-BFF0iqyW.css +0 -32
  252. package/packages/client/dist/assets/index-BcI4y-fU.js +0 -1454
@@ -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
+
@@ -0,0 +1,262 @@
1
+ ## 9. Queue Runner
2
+
3
+ The Queue Runner automates sequences of prompts for batch processing.
4
+
5
+ ### 9.1 Queue Editor
6
+
7
+ The editor provides **syntax highlighting**:
8
+
9
+ - **Directives** (`@new`, `@pause`, etc.) — purple
10
+ - **Directive arguments** — teal
11
+ - **Multiline markers** (`@(`, `@)`) — blue
12
+ - **Comments** (`#`) — gray
13
+ - **Regular prompts** — default text color
14
+
15
+ A non-selectable **line-number gutter** runs down the left side, sticky during both vertical and horizontal scroll, so error messages like "parse error at line 47" become directly clickable without manual counting.
16
+
17
+ **Toolbar buttons:**
18
+ - **Run** (Play icon) — Start queue execution; also available via `Ctrl+Enter` / `Cmd+Enter`
19
+ - **Load File** (Upload icon) — Import a `.txt`, `.qlaude-queue`, or similar script file (max 1 MB). Useful for loading shipped sample templates such as the BMad story workflow (see §9.9)
20
+ - **Template** (FileText icon) — Open the template dialog (see §9.9)
21
+ - **Word Wrap** (WrapText icon) — Toggle line wrapping (persisted across sessions)
22
+
23
+ **Editor behavior:**
24
+ - **Validation warnings** displayed above the editor (e.g., missing arguments, unclosed multiline blocks, unknown directives). When more than one warning exists, only the **most recent** is shown with a `(+N)` count badge for the others — keeps the warning area from pushing the editor down on scripts with many issues
25
+ - **Empty state** shows a visual command reference overlay listing all available directives
26
+ - Editor is hidden during queue execution, replaced by the runner panel
27
+
28
+ Each line is one prompt. Special commands start with `@`. Empty lines are ignored.
29
+
30
+ ### 9.2 Special Commands
31
+
32
+ | Command | Description |
33
+ |---------|-------------|
34
+ | `@new` | Start a new chat session before the next prompt |
35
+ | `@save <name>` | Save the current session with a name |
36
+ | `@load <name>` | Load a previously saved session |
37
+ | `@pause [reason]` | Pause execution; optional reason text shown in the pause banner |
38
+ | `@model <name>` | Switch Claude model (e.g., `@model opus`) |
39
+ | `@delay <ms>` | Wait before the next prompt (positive integer in ms, e.g., `@delay 5000`) |
40
+ | `@pauseword "<keyword>"` | Set a keyword that auto-pauses the queue when found in Claude's response. Use `@pauseword ""` to clear |
41
+ | `@loop max=N [until="TOKEN"] [on_exceed="pause\|continue"]` | Start a loop block that repeats up to N times (see §9.5) |
42
+ | `@end` | End a loop block |
43
+ | `@label <name>` | Define a forward jump target (see §9.6) |
44
+ | `@jumpif "<token>" <label>` | Jump to `<label>` if the previous prompt response contains `<token>` (see §9.6) |
45
+ | `@(` | Start a multiline prompt (all lines until `@)` are treated as one prompt) |
46
+ | `@)` | End a multiline prompt |
47
+ | `# comment` | Comment line (not sent to Claude) |
48
+ | `\@` | Escape: send literal `@` as a prompt (not treated as directive) |
49
+
50
+ - Missing required arguments (e.g., `@save` without a name) produce a validation warning
51
+ - Unknown directives (e.g., `@unknown`) produce a warning and are sent as regular prompts
52
+
53
+ ### 9.3 Multiline Prompts
54
+
55
+ For prompts that span multiple lines, use `@(` and `@)`:
56
+
57
+ ```
58
+ @(
59
+ Please review this code and check for:
60
+ 1. Security vulnerabilities
61
+ 2. Performance issues
62
+ 3. Code style violations
63
+ @)
64
+ ```
65
+
66
+ An unclosed multiline block (missing `@)`) produces a warning and is still sent as a single prompt.
67
+
68
+ ### 9.4 Pauseword
69
+
70
+ The `@pauseword` directive lets you set a keyword that automatically pauses queue execution when found in Claude's response.
71
+
72
+ ```
73
+ @pauseword "DONE"
74
+ Implement the login feature
75
+ Fix any remaining issues
76
+ @pauseword ""
77
+ This prompt runs without pauseword
78
+ ```
79
+
80
+ - **Set** — `@pauseword "KEYWORD"` activates the keyword for all subsequent items
81
+ - **Clear** — `@pauseword ""` (empty string) removes the active pauseword
82
+ - When Claude's response contains the keyword, the queue pauses for review
83
+ - The pauseword is snapshotted at the start of each prompt execution
84
+ - Quotes are required around the keyword; mismatched or empty quotes produce a validation warning
85
+
86
+ ### 9.5 Loop Blocks
87
+
88
+ The `@loop`/`@end` directives create iterative workflows that repeat a block of prompts.
89
+
90
+ ```
91
+ @loop max=5 until="SUCCESS" on_exceed="pause"
92
+ Review the code for issues
93
+ Fix any problems found
94
+ @end
95
+ ```
96
+
97
+ **Parameters:**
98
+
99
+ | Parameter | Required | Description |
100
+ |-----------|----------|-------------|
101
+ | `max=N` | Yes | Maximum number of iterations (positive integer) |
102
+ | `until="TOKEN"` | No | Stop looping when this token appears in Claude's response |
103
+ | `on_exceed="pause\|continue"` | No | Action when max iterations reached without the until token (default: `pause`) |
104
+
105
+ **Behavior:**
106
+ - Each iteration executes all prompts inside the block sequentially
107
+ - If `until` token is detected in a response, the loop exits early
108
+ - When `max` is reached without the `until` token: `pause` halts for review, `continue` moves to the next queue item
109
+ - During execution, the banner shows loop progress (e.g., "Loop 2/5") with inner item tracking
110
+
111
+ ### 9.6 Conditional Jump
112
+
113
+ The `@label` and `@jumpif` directives let you skip a range of queue items based on the previous prompt response. They are designed for fast-paths such as "if the QA gate already passed, skip the fix loop".
114
+
115
+ ```
116
+ %qa-review {story_num}
117
+ @(
118
+ If the QA gate is PASS, write exactly QA_GATE_PASS as the last line.
119
+ @)
120
+ @jumpif "QA_GATE_PASS" qa_done
121
+
122
+ @loop max=5 until="QA_GATE_PASS" on_exceed="pause"
123
+ %apply-qa-fixes {story_num}
124
+ %qa-review {story_num}
125
+ @(...QA_GATE_PASS check...@)
126
+ @end
127
+
128
+ @label qa_done
129
+
130
+ @new
131
+ %commit-and-done {story_num}
132
+ ```
133
+
134
+ **`@label <name>`** — declares a jump target. The name must start with a letter or underscore and contain only letters, digits, underscore, or hyphen.
135
+
136
+ **`@jumpif "<token>" <label>`** — when reached, looks for `<token>` (substring match) in the response of the immediately preceding prompt. If found, the executor jumps directly to the matching `@label`, skipping every item in between. If not found, execution falls through to the next item.
137
+
138
+ **Rules:**
139
+ - **Forward only** — the target `@label` must appear later in the script than the `@jumpif`. Backward jumps are rejected with a parse warning.
140
+ - **Not allowed inside `@loop`** — both `@label` and `@jumpif` are rejected with a parse warning when nested inside a loop block. Use `until` for loop exit conditions instead.
141
+ - **Quoted token** — the token must be wrapped in double quotes and cannot contain spaces or be empty. Mismatched or missing quotes produce a parse warning.
142
+ - **Unique label names** — duplicate `@label` definitions emit a warning; only the first one is registered.
143
+ - **Missing target at parse time** — if the target label is never defined later in the script, a parse warning is emitted.
144
+ - **Missing target at runtime** — if the script is edited mid-run and the label disappears, the jump is silently skipped and execution falls through.
145
+
146
+ The token search uses a plain substring match against the previous prompt's complete response text, so prefer artificial single-word tokens like `QA_GATE_PASS` over natural phrases.
147
+
148
+ **Runner panel display** — In the queue runner item list, `@label` items show as `Label: <name>` and `@jumpif` items show as `Jump if: "<token>" → <target>`, so the control flow is easy to follow at a glance while the queue runs.
149
+
150
+ **`@new` boundary** — the "previous prompt response" buffer is **not** cleared by `@new`. It only updates when the next prompt actually runs. So a `@jumpif` placed immediately after `@new` (with no prompt in between) will still see the *previous* session's last prompt response. Place a real prompt between `@new` and `@jumpif` if you need a fresh evaluation.
151
+
152
+ **UI display of skipped items** — when a jump fires, the items between the `@jumpif` and its `@label` are not executed, but the runner panel currently shows them with the same green check icon as completed items. This is a cosmetic limitation; the items did not run and their session-link slots remain empty. The progress bar still advances correctly to the post-label position.
153
+
154
+ ### 9.7 Running the Queue
155
+
156
+ 1. Write your prompts in the queue editor
157
+ 2. Click **"Run"** or press `Ctrl+Enter` to start
158
+ 3. The editor switches to the **Runner Panel** showing:
159
+ - **Progress bar** — With percentage and count (completed / total)
160
+ - **Color coding** — Blue (running), amber (paused), green (completed), red (error)
161
+ - **Item list** with per-item status icons:
162
+ - Spinner (blue) — currently executing
163
+ - Pause icon (amber) — paused at this item
164
+ - Checkmark (green) — completed (shown with strikethrough text)
165
+ - X circle (red) — error
166
+ - Clock (gray) — pending
167
+ - **Auto-scroll** to the current item
168
+ 4. **Controls:**
169
+ - **Pause** — Schedule a pause after the current item finishes. While an item is executing, this sets a "pause reservation" rather than pausing immediately. A **Cancel Pause** button appears to revoke the reservation before the item completes.
170
+ - **Resume** — Shown during paused state; resumes execution from the next pending item
171
+ - **Edit Script** — Shown during paused state; switches to the text editor with remaining items serialized as script text. Edit freely, then click **Apply** to replace pending items or **Cancel** to discard changes.
172
+ - **Abort** — Always available (running or paused); requires confirmation
173
+ - **"Go to Session"** link — Navigate to the active chat session
174
+ 5. **Session links** — Completed items show a link icon to navigate to their associated session
175
+ 6. **"Back to Editor"** button — Dismiss the runner panel after completion or error
176
+
177
+ **During execution (pending items only):**
178
+ - **Drag-and-drop reorder** — Drag pending items by the grip handle to reorder
179
+ - **Delete** — Click the trash icon to remove a pending item
180
+ - **Add** — Inline input at the bottom to add new items to the queue
181
+
182
+ ### 9.8 Session Locking
183
+
184
+ While the queue is running, a **sticky banner** appears at the top of chat sessions:
185
+
186
+ - **Running** (blue) — Spinner + progress (current/total) + current prompt preview (desktop). Inside a `@loop` block, a loop badge shows iteration progress (e.g., "Loop 2/5")
187
+ - **Pause requested** (amber pulse) — Pause scheduled after current item finishes; cancel pause button shown
188
+ - **Waiting for input** (purple pulse) — Queue paused for permission approval or user question; respond in the session to continue
189
+ - **Paused** (amber) — Pause icon + progress; pause reason shown below if provided
190
+ - **Error-paused** (red) — Alert icon + error details
191
+ - **Completed** (green) — Checkmark + total count; dismissible with X button
192
+ - **Error-stopped** (red) — Error message + link to queue editor; dismissible
193
+
194
+ **Expandable item list:**
195
+ - When 2+ items exist, click the chevron to expand a scrollable list of all queue items with status indicators
196
+ - Currently executing items are highlighted; completed items appear with strikethrough text
197
+
198
+ **Banner controls:**
199
+ - **Pause / Cancel Pause / Resume / Abort** buttons directly in the banner (icon-only on mobile, icon+text on desktop)
200
+ - **"Queue Editor"** link — Navigate to the full queue editor (desktop only)
201
+ - **"Go to Session"** link — Navigate to the active queue session
202
+
203
+ **On other sessions:**
204
+ - A banner shows "Queue running in another session" with a link to navigate to it
205
+ - Other sessions remain fully accessible
206
+
207
+ ### 9.9 Templates
208
+
209
+ Templates generate queue scripts by combining a template pattern with story selections from your project's PRD.
210
+
211
+ **Template Dialog** (opened via FileText icon in toolbar):
212
+
213
+ The dialog has two main sections:
214
+
215
+ **1. Template Source** — Three tabs:
216
+ - **Input** — Type template text directly in the editor with word wrap toggle; variable hint shown: `{story_num}, {epic_num}, {story_index}, {story_title}, {date}`
217
+ - **File** — Upload a `.txt` or `.qlaude-queue` file (max 100KB) via drag area
218
+ - **Saved** — Browse, select, edit, or delete previously saved templates
219
+
220
+ **2. Story Selection** — Stories extracted from your PRD:
221
+ - Grouped by epic with collapsible sections and checkbox selection
222
+ - **Select All / Deselect All** toggle
223
+ - **"Pause between epics"** checkbox — Inserts `@pause` between different epic groups
224
+ - Each epic header shows selected/total count
225
+
226
+ **Template Variables:**
227
+
228
+ | Variable | Description | Example |
229
+ |----------|-------------|---------|
230
+ | `{story_num}` | Full story number | `3.1` |
231
+ | `{epic_num}` | Epic number | `3` |
232
+ | `{story_index}` | Story index within epic | `1` |
233
+ | `{story_title}` | Story title (empty if not found) | `Login Page UI` |
234
+ | `{date}` | Execution date (YYYY-MM-DD) | `2026-03-18` |
235
+
236
+ ```
237
+ @load epic-{epic_num}-base
238
+ Implement Story {story_num}: {story_title}
239
+ @save {date}/epic-{epic_num}/story-{story_index}-done
240
+ ```
241
+
242
+ **Live Preview** — Shows the generated script with syntax highlighting below the template and story selection.
243
+
244
+ **Template Management:**
245
+ - **Save** — Save the current template with a name (inline form)
246
+ - **Update** — Overwrite a previously saved template
247
+ - **Delete** — Remove a saved template (with confirmation)
248
+ - Templates are saved per-project
249
+
250
+ **Bundled sample template:**
251
+
252
+ The Hammoc git repository ships a ready-to-use BMad story workflow template at `docs/queue-templates/bmad-story-workflow.qlaude-queue`. It drives a single story through Draft → Validate → Develop → QA Review → Commit and uses `@label` / `@jumpif` (see §9.6) so a first-pass QA PASS skips the fix loop entirely. To use it, download the file from the GitHub repository and import it via the **Load File** toolbar button, or paste its contents into the editor. The `{story_num}` placeholder must be replaced before running.
253
+
254
+ ### 9.10 Queue Status Badge
255
+
256
+ A badge on the project card and session list shows queue status:
257
+
258
+ - **Running** — Blue badge with play icon
259
+ - **Paused** — Amber badge with pause icon
260
+ - **Error** — Red badge with alert icon
261
+ - **Idle** — No badge shown
262
+
@@ -0,0 +1,193 @@
1
+ ## 10. Project Board
2
+
3
+ Visual task and issue management for your projects. The board displays three card types: Issues, Stories, and Epics.
4
+
5
+ ### 10.1 Kanban Board
6
+
7
+ The default view is a scrollable Kanban board:
8
+
9
+ - **Columns** represent statuses — each with a colored top border, label, and item count badge
10
+ - **Cards** display issues, stories, and epics with type badges: **[I]** (amber), **[S]** (blue), **[E]** (purple)
11
+ - **Horizontal scroll** — overflow columns peek from the edge (no drag-and-drop between columns). On desktop, vertical mouse wheel scrolling in empty column areas is automatically converted to horizontal scroll
12
+ - Status changes are made via the card **context menu** (⋮), not by dragging
13
+ - Columns are fully customizable (see §10.11)
14
+
15
+ ### 10.2 List View
16
+
17
+ Switch to an accordion-style list view:
18
+
19
+ - Items grouped by status column with chevron toggle
20
+ - **Item count** displayed next to each group header
21
+ - Only **non-empty columns** are shown (empty ones are hidden)
22
+ - On mobile, the last column auto-collapses to save space
23
+ - Compact card layout for browsing many items at once
24
+
25
+ ### 10.3 Creating Issues
26
+
27
+ Click **"New Issue"** to create:
28
+
29
+ | Field | Details |
30
+ |-------|---------|
31
+ | **Title** | Required, max 200 characters |
32
+ | **Description** | Optional, supports markdown |
33
+ | **Type** | Bug, Improvement |
34
+ | **Severity** | Low, Medium, High, Critical |
35
+ | **Attachments** | Optional — drag-and-drop, click to browse, or paste from clipboard |
36
+
37
+ Status is automatically set to **Open** (not a user-editable field). Each issue is assigned a sequential ID in the **ISSUE-N** format (e.g., ISSUE-1, ISSUE-2) automatically.
38
+
39
+ ### 10.4 Editing Issues
40
+
41
+ Click the context menu (⋮) → **Edit** on any issue card:
42
+
43
+ - Same fields as the create dialog (title, description, type, severity)
44
+ - **Existing attachments** are shown with a delete button to remove each one
45
+ - **Add new attachments** via drag-and-drop, click, or paste
46
+
47
+ ### 10.5 Issue Types
48
+
49
+ - **Bug** — Something is broken and needs fixing
50
+ - **Improvement** — Enhancement to existing functionality
51
+
52
+ ### 10.6 Severity Levels
53
+
54
+ Severity badges are color-coded on cards:
55
+
56
+ - **Critical** — Red badge, urgent, needs immediate attention
57
+ - **High** — Orange badge, important, prioritize soon
58
+ - **Medium** — Yellow badge, should be addressed in normal workflow
59
+ - **Low** — Gray badge, minor issue, no urgency
60
+
61
+ ### 10.7 Status Workflow
62
+
63
+ Items follow this lifecycle. Issues and stories use overlapping but distinct subsets of these statuses:
64
+
65
+ **Issue statuses:**
66
+ ```
67
+ Open → In Progress → Ready for Done → Done → Closed
68
+
69
+ Promoted
70
+ ```
71
+
72
+ **Story statuses (with QA gate):**
73
+ ```
74
+ Draft → Approved → In Progress → Ready for Review → Done
75
+
76
+ ┌────────┴────────┐
77
+ QA Passed QA Failed
78
+ QA Waived QA Concerns
79
+ ↓ ↓
80
+ Ready for Done QA Fixed → (re-review)
81
+ ```
82
+
83
+ **QA gate badges** — When a story reaches "Ready for Review", the QA gate result determines the compound badge:
84
+ - **QA Passed** — Quality review passed
85
+ - **QA Waived** — Quality review waived/skipped
86
+ - **QA Failed** — Quality review failed, fixes needed
87
+ - **QA Concerns** — Quality review raised concerns
88
+ - **QA Fixed** — Fixes applied, ready for re-review
89
+
90
+ Not all statuses are required. Use the context menu to change status directly. **Promoted** indicates an issue that has been escalated to a story or epic.
91
+
92
+ ### 10.8 File Attachments
93
+
94
+ Attach image files to issues:
95
+
96
+ - Up to **10 files** per issue
97
+ - Maximum **10MB** per file
98
+ - Supported formats: PNG, JPEG, GIF, WebP
99
+ - Upload methods: **drag-and-drop** onto the attachment zone, **click** to browse, or **paste** from clipboard
100
+ - Attachments are managed in the issue create/edit dialogs — they are not shown inline on board cards
101
+ - Preview thumbnails are shown in a grid with a remove button (×) for each
102
+
103
+ ### 10.9 Card Context Menu
104
+
105
+ Click the **⋮** button on any card to open the context menu. Actions vary by card type:
106
+
107
+ **Issue actions (by status):**
108
+ - **Open:**
109
+ - **Quick Fix** — Marks the issue as Done and opens a dev session with the issue context
110
+ - **Promote to Story** — Convert an issue into a development story (disabled if already linked)
111
+ - **Promote to Epic** — Elevate an issue into an epic (disabled if already linked)
112
+ - **Edit** — Open the issue edit dialog
113
+ - **Close** — Close the issue
114
+ - **In Progress:**
115
+ - **Resume Dev** — Resume development session for this issue
116
+ - **Ready for Done:**
117
+ - **Commit and Mark Done** — Commit related changes and mark as Done
118
+ - **Mark Done** — Mark as Done without committing
119
+ - **Closed / Done / Promoted:**
120
+ - **Reopen** — Reopen the issue
121
+ - **Delete** — Permanently remove the issue (available in all states)
122
+
123
+ **Story actions (by status):**
124
+ - **Draft:**
125
+ - **Validate and Fix** — Validate the story draft and fix issues
126
+ - **Validate Only** — Validate the story draft without fix
127
+ - **Approved:**
128
+ - **Start Development** — Begin implementing the story
129
+ - **Validate and Fix** / **Validate Only** — Re-validate if needed
130
+ - **In Progress:**
131
+ - **Resume Development** — Continue implementing the story
132
+ - **QA Passed / QA Waived:**
133
+ - **Commit and Complete Story** — Commit related changes and mark as Done
134
+ - **Complete Story** — Mark as Done without committing
135
+ - **Request QA Review** — Re-request quality review
136
+ - **QA Failed / QA Concerns:**
137
+ - **Apply QA Fix** — Apply fixes for QA issues
138
+ - **QA Fixed:**
139
+ - **Review Story** — Request re-review after fixes
140
+ - **Ready for Review / Ready for Done (no QA gate):**
141
+ - **Review Story** — Request quality review
142
+
143
+ **Epic actions:**
144
+ - **View Sub-Stories** — Open a dialog showing all stories under the epic
145
+ - **Create Next Story** — Draft the next story for this epic with the SM agent (hidden when the epic is Done)
146
+
147
+ The menu supports keyboard navigation (Arrow Up/Down, Enter, Escape).
148
+
149
+ ### 10.10 Card Behavior
150
+
151
+ Cards display information based on their type:
152
+
153
+ - **Type badge** — [I], [S], or [E] with color coding
154
+ - **Severity badge** — For issues only, color-coded by level
155
+ - **Status badge** — Color-coded status indicator (stories also show QA gate badges such as QA Passed, QA Failed, etc.)
156
+ - **Issue number prefix** — Issues now show a short `#N` prefix (e.g., `#1`, `#42`) in monospace gray immediately before the title, so a board card and a chat mention or filename like `ISSUE-42.md` can be matched at a glance. Legacy issues without an `ISSUE-N` ID do not get a prefix
157
+ - **Epic progress bar** — On epic cards, shows completion percentage with done/total count
158
+ - **Story epic number** — Shows the parent epic reference
159
+ - **Unmapped status warning** — ⚠ triangle icon when a card's status doesn't map to any column
160
+
161
+ **Click behavior:** Clicking a card navigates to its associated file in the development session.
162
+
163
+ ### 10.11 Board Configuration
164
+
165
+ Customize the board layout via the gear icon:
166
+
167
+ **Columns:**
168
+ - Add, remove, and **reorder** columns (Arrow Up/Down buttons)
169
+ - Maximum **10 columns** allowed
170
+ - **Required columns** (mapped to essential statuses) cannot be deleted
171
+ - Each column has a name and an optional color
172
+
173
+ **Colors:**
174
+ - Pick from a preset **color palette** (swatches) or leave as default
175
+ - Colors appear as the column's top border
176
+
177
+ **Status Mapping:**
178
+ - Map statuses and QA gate badges (Open, Draft, Approved, In Progress, Blocked, Ready for Review, QA Passed, QA Waived, QA Failed, QA Concerns, QA Fixed, Ready for Done, Done, Closed, Promoted) to columns
179
+ - **Custom status mapping** — Define additional custom status strings and assign them to columns
180
+
181
+ **Reset:**
182
+ - **Reset to defaults** button restores the original column layout (with confirmation dialog)
183
+
184
+ ### 10.12 Mobile Kanban
185
+
186
+ On small screens, the board uses a swipe carousel:
187
+
188
+ - **Swipe left/right** to navigate between columns
189
+ - **Rubber-band resistance** at the first and last columns (cannot swipe past edges)
190
+ - **Indicator dots** at the bottom show current position
191
+ - Smooth transition animation between columns
192
+ - Touch-optimized card layout
193
+