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,636 @@
1
+ /**
2
+ * Story 28.2: Harness skill service.
3
+ *
4
+ * Combines three sources of `<root>/skills/<name>/` directories — the active
5
+ * project, the user-scope home, and every installed plugin bundle — into a
6
+ * single card list used by the "Harness Workbench → Skills" panel. File I/O,
7
+ * traversal guards, STALE_WRITE detection, and binary detection are delegated
8
+ * to `harnessService`. The plugin source enumerates from
9
+ * `installed_plugins.json` and supports both in-tree (~/.claude/plugins/...)
10
+ * and dev-installed (out-of-tree) install paths — the latter goes through a
11
+ * direct `fs` read after a manual containment check so it never escapes its
12
+ * own `installPath`.
13
+ *
14
+ * frontmatter parsing uses the `yaml` (eemeli) parser so the round-trip story
15
+ * stays consistent with `structuredEditor.ts` (no `js-yaml` for harness code).
16
+ */
17
+ import path from 'path';
18
+ import fs from 'fs/promises';
19
+ import { parseDocument } from 'yaml';
20
+ import { HARNESS_ERRORS, } from '@hammoc/shared';
21
+ import { harnessService } from './harnessService.js';
22
+ import { projectService } from './projectService.js';
23
+ import { getUserHarnessRoot } from '../utils/harnessPaths.js';
24
+ import { applyYamlPatch } from '../utils/structuredEditor.js';
25
+ import { isBinaryFile, MAX_FILE_SIZE } from '../utils/pathUtils.js';
26
+ const BUNDLE_DIRS = ['references', 'examples', 'scripts', 'assets'];
27
+ /** Maximum bundle tree depth before truncating. Prevents pathological trees. */
28
+ const BUNDLE_TREE_MAX_DEPTH = 4;
29
+ /** Priority used to pick a card's `activeScope` when multiple sources exist. */
30
+ const SCOPE_PRIORITY = {
31
+ project: 0,
32
+ user: 1,
33
+ plugin: 2,
34
+ };
35
+ function throwMapped(code, message, extras) {
36
+ const err = new Error(message);
37
+ err.code = code;
38
+ if (extras)
39
+ Object.assign(err, extras);
40
+ throw err;
41
+ }
42
+ function isFileNotFound(err) {
43
+ return err?.code === HARNESS_ERRORS.HARNESS_FILE_NOT_FOUND.code;
44
+ }
45
+ class HarnessSkillService {
46
+ // ---- public surface ----------------------------------------------------
47
+ /**
48
+ * Enumerate skills across project / user / plugin sources and merge entries
49
+ * sharing the same directory name into a single card.
50
+ */
51
+ async listCards(currentProjectSlug) {
52
+ const sources = new Map();
53
+ const malformed = [];
54
+ // Project source — only when a slug is provided.
55
+ if (currentProjectSlug) {
56
+ try {
57
+ await this.enumerateProjectSkills(currentProjectSlug, sources, malformed);
58
+ }
59
+ catch (err) {
60
+ // A missing or unresolved project is not fatal — the panel still
61
+ // renders user/plugin cards. Re-throw any unexpected failure so the
62
+ // controller can surface it as a 500.
63
+ if (err?.code !== HARNESS_ERRORS.HARNESS_ROOT_MISSING.code) {
64
+ throw err;
65
+ }
66
+ }
67
+ }
68
+ // User source.
69
+ await this.enumerateUserSkills(sources, malformed);
70
+ // Plugin sources — every installed plugin bundle, regardless of enabled state.
71
+ await this.enumeratePluginSkills(sources, malformed);
72
+ const cards = [];
73
+ for (const [name, entries] of sources) {
74
+ // Sort sources by priority so `sources[0]` is the active one.
75
+ entries.sort((a, b) => SCOPE_PRIORITY[a.scope] - SCOPE_PRIORITY[b.scope]);
76
+ const active = entries[0];
77
+ cards.push({
78
+ name,
79
+ description: active.frontmatter.description,
80
+ version: active.frontmatter.version,
81
+ sources: entries,
82
+ activeScope: active.scope,
83
+ });
84
+ }
85
+ // Stable-sort by name so the UI never shifts cards around between loads.
86
+ cards.sort((a, b) => a.name.localeCompare(b.name));
87
+ return { cards, malformed };
88
+ }
89
+ /**
90
+ * Read a single skill's SKILL.md plus the bundle file tree. Returns the
91
+ * frontmatter, the body separately, the raw text (for the Raw editor) and a
92
+ * flat list of bundle entries with binary / truncation flags pre-resolved.
93
+ */
94
+ async readSkill(source) {
95
+ const skillRoot = source.absoluteRoot;
96
+ const skillMd = path.join(skillRoot, 'SKILL.md');
97
+ let raw;
98
+ let mtime;
99
+ try {
100
+ const stat = await fs.stat(skillMd);
101
+ if (!stat.isFile()) {
102
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NOT_FOUND.code, 'SKILL.md is not a regular file');
103
+ }
104
+ raw = await fs.readFile(skillMd, 'utf-8');
105
+ mtime = stat.mtime.toISOString();
106
+ }
107
+ catch (err) {
108
+ const code = err.code;
109
+ if (code === 'ENOENT') {
110
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NOT_FOUND.code, `skill not found: ${source.absoluteRoot}`);
111
+ }
112
+ if (code === 'EACCES') {
113
+ throwMapped(HARNESS_ERRORS.HARNESS_FORBIDDEN.code, 'permission denied');
114
+ }
115
+ throw err;
116
+ }
117
+ const split = splitFrontmatter(raw);
118
+ if (!split) {
119
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'SKILL.md has no YAML frontmatter');
120
+ }
121
+ const frontmatter = parseFrontmatterFromBlock(split.frontmatter);
122
+ if (!frontmatter) {
123
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'SKILL.md frontmatter failed validation');
124
+ }
125
+ const bundleCounts = await this.countBundle(skillRoot);
126
+ const { entries: bundleEntries, truncatedAtDepth } = await this.collectBundleEntries(skillRoot);
127
+ return {
128
+ source,
129
+ frontmatter,
130
+ body: split.body,
131
+ raw,
132
+ bundleCounts,
133
+ skillMdMtime: mtime,
134
+ bundleEntries,
135
+ truncatedAtDepth,
136
+ };
137
+ }
138
+ /**
139
+ * Apply a frontmatter / body / raw update against an existing SKILL.md.
140
+ * Plugin scope is read-only — any update against a plugin source is denied
141
+ * with HARNESS_FORBIDDEN.
142
+ */
143
+ async updateSkill(source, body) {
144
+ if (source.scope === 'plugin') {
145
+ throwMapped(HARNESS_ERRORS.HARNESS_FORBIDDEN.code, 'plugin-scope skills are read-only');
146
+ }
147
+ const ref = this.refForEditableSource(source);
148
+ // Raw replace bypasses every per-block helper. The frontmatter is parsed
149
+ // once locally so we surface a 422 before touching disk if it is broken.
150
+ if (body.raw !== undefined) {
151
+ const split = splitFrontmatter(body.raw);
152
+ if (!split || !parseFrontmatterFromBlock(split.frontmatter)) {
153
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'raw payload has no valid frontmatter');
154
+ }
155
+ const written = await harnessService.write(ref, {
156
+ content: body.raw,
157
+ expectedMtime: body.expectedMtime,
158
+ });
159
+ return { success: true, mtime: written.mtime };
160
+ }
161
+ // For frontmatter / body updates we read the current file once, mutate the
162
+ // requested block, and write the merged result. Reading inside the same
163
+ // call also lets us reuse the freshly-observed mtime when the caller
164
+ // supplies both `frontmatter` and `body` — otherwise the second write
165
+ // would falsely flag STALE_WRITE on the mtime that was authoritative
166
+ // before the first write.
167
+ const current = await harnessService.read(ref);
168
+ const text = current.content ?? '';
169
+ const baseSplit = splitFrontmatter(text);
170
+ if (!baseSplit) {
171
+ throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'existing SKILL.md has no frontmatter');
172
+ }
173
+ let nextFrontmatter = baseSplit.frontmatter;
174
+ if (body.frontmatter) {
175
+ nextFrontmatter = this.applyFrontmatterPatch(baseSplit.frontmatter, body.frontmatter);
176
+ }
177
+ const nextBody = body.body !== undefined ? body.body : baseSplit.body;
178
+ const merged = composeSkillMd(nextFrontmatter, nextBody);
179
+ const expectedMtime = body.expectedMtime ?? current.mtime;
180
+ const written = await harnessService.write(ref, { content: merged, expectedMtime });
181
+ return { success: true, mtime: written.mtime };
182
+ }
183
+ /**
184
+ * Recursively copy a skill folder. The destination is always a project or
185
+ * user scope — copies *into* a plugin bundle are blocked by Zod at the
186
+ * controller layer, but we re-assert here as a defensive belt.
187
+ */
188
+ async copySkill(req) {
189
+ if (req.sourceScope === req.targetScope && req.sourceName === req.targetName) {
190
+ // project→project / user→user with the same name — nothing to do that
191
+ // would produce a meaningful new card. Push the user toward rename mode.
192
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NAME_CONFLICT.code, 'same-scope copy must use a different targetName');
193
+ }
194
+ const srcRoot = await this.resolveSkillRoot({
195
+ scope: req.sourceScope,
196
+ projectSlug: req.sourceProjectSlug,
197
+ pluginKey: req.sourcePluginKey,
198
+ name: req.sourceName,
199
+ });
200
+ try {
201
+ const stat = await fs.stat(srcRoot);
202
+ if (!stat.isDirectory()) {
203
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NOT_FOUND.code, 'skill source is not a directory');
204
+ }
205
+ }
206
+ catch (err) {
207
+ const code = err.code;
208
+ if (code === 'ENOENT') {
209
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NOT_FOUND.code, 'skill source not found');
210
+ }
211
+ throw err;
212
+ }
213
+ const dstRoot = await this.resolveSkillRoot({
214
+ scope: req.targetScope,
215
+ projectSlug: req.targetProjectSlug,
216
+ name: req.targetName,
217
+ });
218
+ let skipped = false;
219
+ const finalName = req.targetName;
220
+ const dstExists = await pathExists(dstRoot);
221
+ if (dstExists) {
222
+ switch (req.onConflict) {
223
+ case 'skip':
224
+ skipped = true;
225
+ return { success: true, copied: 0, skipped, finalName };
226
+ case 'overwrite':
227
+ await fs.rm(dstRoot, { recursive: true, force: true });
228
+ break;
229
+ case 'rename': {
230
+ // The caller is expected to have prompted for a new name and to
231
+ // submit it as `targetName`. If that name collides too, we surface
232
+ // 409 so the UI re-prompts rather than silently overwriting.
233
+ throwMapped(HARNESS_ERRORS.HARNESS_SKILL_NAME_CONFLICT.code, `target name already in use: ${req.targetName}`);
234
+ }
235
+ }
236
+ }
237
+ await fs.mkdir(path.dirname(dstRoot), { recursive: true });
238
+ try {
239
+ await fs.cp(srcRoot, dstRoot, { recursive: true, dereference: true });
240
+ }
241
+ catch (err) {
242
+ const code = err.code;
243
+ if (code === 'EXDEV' || code === 'EACCES') {
244
+ // Surface as HARNESS_WRITE_ERROR with a typed cause so the client can
245
+ // route to the dedicated cross-device toast (Risk Mitigation #2).
246
+ throwMapped(HARNESS_ERRORS.HARNESS_WRITE_ERROR.code, 'cross-device copy failed', { cause: 'cross-device' });
247
+ }
248
+ throwMapped(HARNESS_ERRORS.HARNESS_WRITE_ERROR.code, `copy failed: ${err.message}`);
249
+ }
250
+ const copied = await countFilesRecursive(dstRoot);
251
+ return { success: true, copied, skipped: false, finalName };
252
+ }
253
+ // ---- enumeration -------------------------------------------------------
254
+ async enumerateProjectSkills(projectSlug, sources, malformed) {
255
+ const list = await harnessService.list({
256
+ scope: 'project',
257
+ projectSlug,
258
+ relativePath: 'skills',
259
+ });
260
+ for (const entry of list.entries) {
261
+ if (entry.type !== 'directory')
262
+ continue;
263
+ const absoluteRoot = path.join(list.resolvedRoot, 'skills', entry.name);
264
+ await this.collectSourceFromRoot({ scope: 'project', absoluteRoot, projectSlug }, entry.name, sources, malformed);
265
+ }
266
+ }
267
+ async enumerateUserSkills(sources, malformed) {
268
+ const list = await harnessService.list({ scope: 'user', relativePath: 'skills' });
269
+ for (const entry of list.entries) {
270
+ if (entry.type !== 'directory')
271
+ continue;
272
+ const absoluteRoot = path.join(list.resolvedRoot, 'skills', entry.name);
273
+ await this.collectSourceFromRoot({ scope: 'user', absoluteRoot }, entry.name, sources, malformed);
274
+ }
275
+ }
276
+ async enumeratePluginSkills(sources, malformed) {
277
+ let installed = {};
278
+ try {
279
+ const res = await harnessService.read({
280
+ scope: 'user',
281
+ relativePath: 'plugins/installed_plugins.json',
282
+ });
283
+ const trimmed = (res.content ?? '').trim();
284
+ if (trimmed) {
285
+ try {
286
+ installed = JSON.parse(trimmed);
287
+ }
288
+ catch {
289
+ // Malformed catalog — skip plugin enumeration but do not abort the
290
+ // whole listCards call (project / user lists already populated).
291
+ return;
292
+ }
293
+ }
294
+ }
295
+ catch (err) {
296
+ if (isFileNotFound(err))
297
+ return;
298
+ throw err;
299
+ }
300
+ const plugins = installed.plugins ?? {};
301
+ for (const [pluginKey, value] of Object.entries(plugins)) {
302
+ const entries = Array.isArray(value) ? value : [value];
303
+ for (const entry of entries) {
304
+ if (!entry?.installPath || typeof entry.installPath !== 'string')
305
+ continue;
306
+ const skillsDir = path.join(entry.installPath, 'skills');
307
+ let dirEntries = [];
308
+ try {
309
+ const raw = await fs.readdir(skillsDir, { withFileTypes: true });
310
+ dirEntries = raw.map((d) => ({ name: d.name, isDirectory: d.isDirectory() }));
311
+ }
312
+ catch {
313
+ // No skills/ subdirectory in this bundle.
314
+ continue;
315
+ }
316
+ for (const dirent of dirEntries) {
317
+ if (!dirent.isDirectory)
318
+ continue;
319
+ const absoluteRoot = path.join(skillsDir, dirent.name);
320
+ // Defensive containment guard for dev-installed (out-of-tree)
321
+ // plugins — the absolute path must remain under installPath.
322
+ const abs = path.resolve(absoluteRoot);
323
+ const root = path.resolve(entry.installPath);
324
+ if (abs !== root && !abs.startsWith(root + path.sep))
325
+ continue;
326
+ await this.collectSourceFromRoot({ scope: 'plugin', absoluteRoot, pluginKey }, dirent.name, sources, malformed);
327
+ }
328
+ }
329
+ }
330
+ }
331
+ async collectSourceFromRoot(location, skillName, sources, malformed) {
332
+ const skillMd = path.join(location.absoluteRoot, 'SKILL.md');
333
+ let stat;
334
+ try {
335
+ stat = await fs.stat(skillMd);
336
+ if (!stat.isFile())
337
+ return;
338
+ }
339
+ catch {
340
+ return; // No SKILL.md → not a real skill folder; ignore silently.
341
+ }
342
+ let text;
343
+ try {
344
+ text = await fs.readFile(skillMd, 'utf-8');
345
+ }
346
+ catch {
347
+ malformed.push(this.malformedEntry(location, 'failed to read SKILL.md'));
348
+ return;
349
+ }
350
+ const split = splitFrontmatter(text);
351
+ if (!split) {
352
+ malformed.push(this.malformedEntry(location, 'missing YAML frontmatter'));
353
+ return;
354
+ }
355
+ const frontmatter = parseFrontmatterFromBlock(split.frontmatter);
356
+ if (!frontmatter) {
357
+ malformed.push(this.malformedEntry(location, 'frontmatter missing required name/description'));
358
+ return;
359
+ }
360
+ // List path intentionally skips bundle file counting — counting four
361
+ // bundle directories per skill via recursive readdir is the dominant
362
+ // server cost for the panel. The detail view (`readSkill()`) still
363
+ // reports bundle counts for the editor modal.
364
+ const source = {
365
+ ...location,
366
+ frontmatter,
367
+ skillMdMtime: stat.mtime.toISOString(),
368
+ };
369
+ const list = sources.get(skillName);
370
+ if (list) {
371
+ list.push(source);
372
+ }
373
+ else {
374
+ sources.set(skillName, [source]);
375
+ }
376
+ }
377
+ malformedEntry(location, reason) {
378
+ return {
379
+ scope: location.scope,
380
+ absoluteRoot: location.absoluteRoot,
381
+ pluginKey: location.pluginKey,
382
+ projectSlug: location.projectSlug,
383
+ reason,
384
+ };
385
+ }
386
+ // ---- bundle helpers ----------------------------------------------------
387
+ async countBundle(skillRoot) {
388
+ const counts = {
389
+ references: 0,
390
+ examples: 0,
391
+ scripts: 0,
392
+ assets: 0,
393
+ };
394
+ for (const dir of BUNDLE_DIRS) {
395
+ counts[dir] = await countFilesRecursive(path.join(skillRoot, dir));
396
+ }
397
+ return counts;
398
+ }
399
+ async collectBundleEntries(skillRoot) {
400
+ const entries = [];
401
+ let truncatedAtDepth = false;
402
+ const walk = async (relativeBase, absDir, depth) => {
403
+ if (depth > BUNDLE_TREE_MAX_DEPTH) {
404
+ truncatedAtDepth = true;
405
+ return;
406
+ }
407
+ let dirents;
408
+ try {
409
+ dirents = await fs.readdir(absDir, { withFileTypes: true });
410
+ }
411
+ catch {
412
+ return;
413
+ }
414
+ for (const ent of dirents) {
415
+ const childAbs = path.join(absDir, ent.name);
416
+ const childRel = relativeBase ? `${relativeBase}/${ent.name}` : ent.name;
417
+ if (ent.isDirectory()) {
418
+ await walk(childRel, childAbs, depth + 1);
419
+ continue;
420
+ }
421
+ if (!ent.isFile())
422
+ continue;
423
+ try {
424
+ const stat = await fs.stat(childAbs);
425
+ let isBinary = false;
426
+ if (stat.size > 0) {
427
+ try {
428
+ isBinary = await isBinaryFile(childAbs);
429
+ }
430
+ catch {
431
+ isBinary = false;
432
+ }
433
+ }
434
+ entries.push({
435
+ relativePath: childRel,
436
+ isBinary,
437
+ isTruncated: stat.size > MAX_FILE_SIZE,
438
+ size: stat.size,
439
+ mtime: stat.mtime.toISOString(),
440
+ });
441
+ }
442
+ catch {
443
+ // Skip unstat-able entries (broken symlinks, permission edge cases).
444
+ }
445
+ }
446
+ };
447
+ for (const dir of BUNDLE_DIRS) {
448
+ await walk(dir, path.join(skillRoot, dir), 1);
449
+ }
450
+ entries.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
451
+ return { entries, truncatedAtDepth };
452
+ }
453
+ // ---- update helpers ----------------------------------------------------
454
+ /**
455
+ * Build the harnessService path reference for an editable (project or user)
456
+ * source. Plugin scope is rejected by the caller before this runs.
457
+ */
458
+ refForEditableSource(source) {
459
+ // Reuse the directory name on disk — sourceLocation absoluteRoot ends with
460
+ // the skill directory, so we derive the relative path back from the root.
461
+ const skillDirName = path.basename(source.absoluteRoot);
462
+ if (source.scope === 'project') {
463
+ if (!source.projectSlug) {
464
+ throwMapped(HARNESS_ERRORS.HARNESS_ROOT_MISSING.code, 'project skill source missing projectSlug');
465
+ }
466
+ return {
467
+ scope: 'project',
468
+ projectSlug: source.projectSlug,
469
+ relativePath: `skills/${skillDirName}/SKILL.md`,
470
+ };
471
+ }
472
+ return {
473
+ scope: 'user',
474
+ relativePath: `skills/${skillDirName}/SKILL.md`,
475
+ };
476
+ }
477
+ /**
478
+ * Apply a frontmatter form patch by routing through the YAML round-trip
479
+ * editor on the frontmatter block alone. Comments / quoting / key order are
480
+ * preserved exactly the same way `harnessService.patchStructured` would for
481
+ * a pure-YAML file — but since SKILL.md is a hybrid file, we run the patch
482
+ * on the extracted block and recompose the full text afterwards.
483
+ */
484
+ applyFrontmatterPatch(block, patch) {
485
+ const ops = [];
486
+ if (Object.prototype.hasOwnProperty.call(patch, 'name')) {
487
+ ops.push({ path: ['name'], value: patch.name });
488
+ }
489
+ if (Object.prototype.hasOwnProperty.call(patch, 'description')) {
490
+ ops.push({ path: ['description'], value: patch.description });
491
+ }
492
+ if (Object.prototype.hasOwnProperty.call(patch, 'version')) {
493
+ // version is optional — undefined / empty string deletes the key.
494
+ const next = patch.version;
495
+ ops.push({
496
+ path: ['version'],
497
+ value: next === undefined || next === '' ? undefined : next,
498
+ });
499
+ }
500
+ if (ops.length === 0)
501
+ return block;
502
+ return applyYamlPatch(block, ops);
503
+ }
504
+ // ---- root resolution ---------------------------------------------------
505
+ async resolveSkillRoot(input) {
506
+ if (!input.name || input.name.includes('/') || input.name.includes('\\')) {
507
+ throwMapped(HARNESS_ERRORS.HARNESS_PATH_DENIED.code, 'skill name must not contain path separators');
508
+ }
509
+ if (input.scope === 'project') {
510
+ if (!input.projectSlug) {
511
+ throwMapped(HARNESS_ERRORS.HARNESS_ROOT_MISSING.code, 'project scope requires projectSlug');
512
+ }
513
+ const projectRoot = await projectService.resolveOriginalPath(input.projectSlug);
514
+ return path.join(projectRoot, '.claude', 'skills', input.name);
515
+ }
516
+ if (input.scope === 'user') {
517
+ return path.join(getUserHarnessRoot(), 'skills', input.name);
518
+ }
519
+ // plugin
520
+ if (!input.pluginKey) {
521
+ throwMapped(HARNESS_ERRORS.HARNESS_ROOT_MISSING.code, 'plugin scope requires pluginKey');
522
+ }
523
+ const installPath = await this.resolvePluginInstallPath(input.pluginKey);
524
+ if (!installPath) {
525
+ throwMapped(HARNESS_ERRORS.HARNESS_PLUGIN_NOT_FOUND.code, `plugin not installed: ${input.pluginKey}`);
526
+ }
527
+ return path.join(installPath, 'skills', input.name);
528
+ }
529
+ async resolvePluginInstallPath(pluginKey) {
530
+ try {
531
+ const res = await harnessService.read({
532
+ scope: 'user',
533
+ relativePath: 'plugins/installed_plugins.json',
534
+ });
535
+ const trimmed = (res.content ?? '').trim();
536
+ if (!trimmed)
537
+ return undefined;
538
+ const parsed = JSON.parse(trimmed);
539
+ const raw = parsed.plugins?.[pluginKey];
540
+ if (!raw)
541
+ return undefined;
542
+ const entries = Array.isArray(raw) ? raw : [raw];
543
+ const first = entries.find((e) => typeof e?.installPath === 'string');
544
+ return first?.installPath;
545
+ }
546
+ catch (err) {
547
+ if (isFileNotFound(err))
548
+ return undefined;
549
+ throw err;
550
+ }
551
+ }
552
+ }
553
+ /**
554
+ * Split a SKILL.md text into its frontmatter block and body. Returns null
555
+ * when the file does not start with a `---` fence followed by another fence
556
+ * later — i.e. there is no recognizable frontmatter to operate on.
557
+ */
558
+ function splitFrontmatter(text) {
559
+ // Tolerate a leading BOM / CRLF mix without surprising the regex.
560
+ // eslint-disable-next-line no-irregular-whitespace
561
+ const normalized = text.replace(/^/, '');
562
+ const opener = /^---\r?\n/;
563
+ const m = opener.exec(normalized);
564
+ if (!m)
565
+ return null;
566
+ const afterOpen = normalized.slice(m[0].length);
567
+ const closer = /\r?\n---\r?\n/.exec(afterOpen);
568
+ if (!closer)
569
+ return null;
570
+ const frontmatter = afterOpen.slice(0, closer.index);
571
+ const body = afterOpen.slice(closer.index + closer[0].length);
572
+ return { frontmatter, body };
573
+ }
574
+ /**
575
+ * Parse the YAML frontmatter block and validate the required fields. Returns
576
+ * undefined when the block is unparseable or missing `name`/`description`.
577
+ */
578
+ function parseFrontmatterFromBlock(block) {
579
+ let parsed;
580
+ try {
581
+ parsed = parseDocument(block).toJS();
582
+ }
583
+ catch {
584
+ return undefined;
585
+ }
586
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
587
+ return undefined;
588
+ const rec = parsed;
589
+ const name = typeof rec.name === 'string' ? rec.name.trim() : '';
590
+ const description = typeof rec.description === 'string' ? rec.description.trim() : '';
591
+ if (!name || !description)
592
+ return undefined;
593
+ const result = { name, description };
594
+ if (typeof rec.version === 'string' && rec.version.trim() !== '') {
595
+ result.version = rec.version;
596
+ }
597
+ return result;
598
+ }
599
+ /** Stitch a YAML frontmatter block back together with a body, preserving the canonical fence layout. */
600
+ function composeSkillMd(frontmatter, body) {
601
+ // Always ensure the frontmatter block ends with exactly one newline so the
602
+ // closing fence sits on its own line.
603
+ const fm = frontmatter.endsWith('\n') ? frontmatter : `${frontmatter}\n`;
604
+ return `---\n${fm}---\n${body}`;
605
+ }
606
+ /** Recursively count regular files under `dir`. Missing/unreachable dirs → 0. */
607
+ async function countFilesRecursive(dir) {
608
+ let count = 0;
609
+ let dirents;
610
+ try {
611
+ dirents = await fs.readdir(dir, { withFileTypes: true });
612
+ }
613
+ catch {
614
+ return 0;
615
+ }
616
+ for (const ent of dirents) {
617
+ if (ent.isDirectory()) {
618
+ count += await countFilesRecursive(path.join(dir, ent.name));
619
+ }
620
+ else if (ent.isFile()) {
621
+ count += 1;
622
+ }
623
+ }
624
+ return count;
625
+ }
626
+ async function pathExists(p) {
627
+ try {
628
+ await fs.stat(p);
629
+ return true;
630
+ }
631
+ catch {
632
+ return false;
633
+ }
634
+ }
635
+ export const harnessSkillService = new HarnessSkillService();
636
+ //# sourceMappingURL=harnessSkillService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harnessSkillService.js","sourceRoot":"","sources":["../../src/services/harnessSkillService.ts"],"names":[],"mappings":"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"}