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.
- package/README.md +422 -403
- package/bin/hammoc.js +0 -6
- package/package.json +100 -93
- package/packages/client/dist/assets/agentExampleHighlight-BgwTm15v.js +1 -0
- package/packages/client/dist/assets/commandTokenHighlight-BljHwnrK.js +1 -0
- package/packages/client/dist/assets/index-CjyjnXB8.css +32 -0
- package/packages/client/dist/assets/index-D3LxqW3f.js +2 -0
- package/packages/client/dist/assets/index-NqJdhlek.js +1498 -0
- package/packages/client/dist/assets/snippetTokenHighlight-DWsaQXX0.js +1 -0
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +24 -24
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/controllers/boardController.d.ts.map +1 -1
- package/packages/server/dist/controllers/boardController.js +0 -5
- package/packages/server/dist/controllers/boardController.js.map +1 -1
- package/packages/server/dist/controllers/claudeMdController.d.ts +26 -0
- package/packages/server/dist/controllers/claudeMdController.d.ts.map +1 -0
- package/packages/server/dist/controllers/claudeMdController.js +158 -0
- package/packages/server/dist/controllers/claudeMdController.js.map +1 -0
- package/packages/server/dist/controllers/fileSystemController.d.ts +4 -0
- package/packages/server/dist/controllers/fileSystemController.d.ts.map +1 -1
- package/packages/server/dist/controllers/fileSystemController.js +20 -2
- package/packages/server/dist/controllers/fileSystemController.js.map +1 -1
- package/packages/server/dist/controllers/harnessAgentController.d.ts +28 -0
- package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessAgentController.js +339 -0
- package/packages/server/dist/controllers/harnessAgentController.js.map +1 -0
- package/packages/server/dist/controllers/harnessCommandController.d.ts +28 -0
- package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessCommandController.js +382 -0
- package/packages/server/dist/controllers/harnessCommandController.js.map +1 -0
- package/packages/server/dist/controllers/harnessController.d.ts +21 -0
- package/packages/server/dist/controllers/harnessController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessController.js +176 -0
- package/packages/server/dist/controllers/harnessController.js.map +1 -0
- package/packages/server/dist/controllers/harnessHookController.d.ts +32 -0
- package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessHookController.js +363 -0
- package/packages/server/dist/controllers/harnessHookController.js.map +1 -0
- package/packages/server/dist/controllers/harnessLintController.d.ts +18 -0
- package/packages/server/dist/controllers/harnessLintController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessLintController.js +72 -0
- package/packages/server/dist/controllers/harnessLintController.js.map +1 -0
- package/packages/server/dist/controllers/harnessMcpController.d.ts +28 -0
- package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessMcpController.js +310 -0
- package/packages/server/dist/controllers/harnessMcpController.js.map +1 -0
- package/packages/server/dist/controllers/harnessPluginController.d.ts +17 -0
- package/packages/server/dist/controllers/harnessPluginController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessPluginController.js +115 -0
- package/packages/server/dist/controllers/harnessPluginController.js.map +1 -0
- package/packages/server/dist/controllers/harnessShareScopeController.d.ts +15 -0
- package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessShareScopeController.js +73 -0
- package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -0
- package/packages/server/dist/controllers/harnessSkillController.d.ts +32 -0
- package/packages/server/dist/controllers/harnessSkillController.d.ts.map +1 -0
- package/packages/server/dist/controllers/harnessSkillController.js +453 -0
- package/packages/server/dist/controllers/harnessSkillController.js.map +1 -0
- package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
- package/packages/server/dist/controllers/projectController.js +11 -0
- package/packages/server/dist/controllers/projectController.js.map +1 -1
- package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
- package/packages/server/dist/controllers/serverController.js +84 -49
- package/packages/server/dist/controllers/serverController.js.map +1 -1
- package/packages/server/dist/controllers/snippetController.d.ts +35 -0
- package/packages/server/dist/controllers/snippetController.d.ts.map +1 -0
- package/packages/server/dist/controllers/snippetController.js +294 -0
- package/packages/server/dist/controllers/snippetController.js.map +1 -0
- package/packages/server/dist/handlers/websocket.d.ts +16 -0
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +221 -8
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/index.js +66 -0
- package/packages/server/dist/index.js.map +1 -1
- package/packages/server/dist/locales/en/server.json +41 -6
- package/packages/server/dist/locales/es/server.json +3 -5
- package/packages/server/dist/locales/ja/server.json +3 -5
- package/packages/server/dist/locales/ko/server.json +4 -6
- package/packages/server/dist/locales/pt/server.json +3 -5
- package/packages/server/dist/locales/zh-CN/server.json +3 -5
- package/packages/server/dist/routes/account.d.ts +7 -0
- package/packages/server/dist/routes/account.d.ts.map +1 -0
- package/packages/server/dist/routes/account.js +35 -0
- package/packages/server/dist/routes/account.js.map +1 -0
- package/packages/server/dist/routes/debug.d.ts +1 -1
- package/packages/server/dist/routes/debug.d.ts.map +1 -1
- package/packages/server/dist/routes/debug.js +60 -1
- package/packages/server/dist/routes/debug.js.map +1 -1
- package/packages/server/dist/routes/harness.d.ts +8 -0
- package/packages/server/dist/routes/harness.d.ts.map +1 -0
- package/packages/server/dist/routes/harness.js +92 -0
- package/packages/server/dist/routes/harness.js.map +1 -0
- package/packages/server/dist/routes/preferences.d.ts.map +1 -1
- package/packages/server/dist/routes/preferences.js +11 -2
- package/packages/server/dist/routes/preferences.js.map +1 -1
- package/packages/server/dist/routes/projects.d.ts.map +1 -1
- package/packages/server/dist/routes/projects.js +5 -60
- package/packages/server/dist/routes/projects.js.map +1 -1
- package/packages/server/dist/routes/snippets.d.ts +14 -0
- package/packages/server/dist/routes/snippets.d.ts.map +1 -0
- package/packages/server/dist/routes/snippets.js +27 -0
- package/packages/server/dist/routes/snippets.js.map +1 -0
- package/packages/server/dist/services/accountInfoService.d.ts +38 -0
- package/packages/server/dist/services/accountInfoService.d.ts.map +1 -0
- package/packages/server/dist/services/accountInfoService.js +118 -0
- package/packages/server/dist/services/accountInfoService.js.map +1 -0
- package/packages/server/dist/services/bmadStatusService.d.ts +6 -2
- package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
- package/packages/server/dist/services/bmadStatusService.js +88 -32
- package/packages/server/dist/services/bmadStatusService.js.map +1 -1
- package/packages/server/dist/services/chatService.d.ts +3 -0
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +36 -8
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/claudeMdService.d.ts +48 -0
- package/packages/server/dist/services/claudeMdService.d.ts.map +1 -0
- package/packages/server/dist/services/claudeMdService.js +240 -0
- package/packages/server/dist/services/claudeMdService.js.map +1 -0
- package/packages/server/dist/services/commandService.d.ts +10 -0
- package/packages/server/dist/services/commandService.d.ts.map +1 -1
- package/packages/server/dist/services/commandService.js +129 -4
- package/packages/server/dist/services/commandService.js.map +1 -1
- package/packages/server/dist/services/fileSystemService.d.ts +7 -1
- package/packages/server/dist/services/fileSystemService.d.ts.map +1 -1
- package/packages/server/dist/services/fileSystemService.js +67 -8
- package/packages/server/dist/services/fileSystemService.js.map +1 -1
- package/packages/server/dist/services/fileWatcherService.d.ts +59 -0
- package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -0
- package/packages/server/dist/services/fileWatcherService.js +329 -0
- package/packages/server/dist/services/fileWatcherService.js.map +1 -0
- package/packages/server/dist/services/gitService.d.ts.map +1 -1
- package/packages/server/dist/services/gitService.js +67 -7
- package/packages/server/dist/services/gitService.js.map +1 -1
- package/packages/server/dist/services/harnessAgentService.d.ts +79 -0
- package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessAgentService.js +933 -0
- package/packages/server/dist/services/harnessAgentService.js.map +1 -0
- package/packages/server/dist/services/harnessCommandService.d.ts +60 -0
- package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessCommandService.js +853 -0
- package/packages/server/dist/services/harnessCommandService.js.map +1 -0
- package/packages/server/dist/services/harnessHookService.d.ts +55 -0
- package/packages/server/dist/services/harnessHookService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessHookService.js +1060 -0
- package/packages/server/dist/services/harnessHookService.js.map +1 -0
- package/packages/server/dist/services/harnessLintService.d.ts +49 -0
- package/packages/server/dist/services/harnessLintService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessLintService.js +628 -0
- package/packages/server/dist/services/harnessLintService.js.map +1 -0
- package/packages/server/dist/services/harnessMcpService.d.ts +77 -0
- package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessMcpService.js +814 -0
- package/packages/server/dist/services/harnessMcpService.js.map +1 -0
- package/packages/server/dist/services/harnessPluginService.d.ts +66 -0
- package/packages/server/dist/services/harnessPluginService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessPluginService.js +559 -0
- package/packages/server/dist/services/harnessPluginService.js.map +1 -0
- package/packages/server/dist/services/harnessService.d.ts +40 -0
- package/packages/server/dist/services/harnessService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessService.js +222 -0
- package/packages/server/dist/services/harnessService.js.map +1 -0
- package/packages/server/dist/services/harnessShareScopeService.d.ts +31 -0
- package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessShareScopeService.js +93 -0
- package/packages/server/dist/services/harnessShareScopeService.js.map +1 -0
- package/packages/server/dist/services/harnessSkillService.d.ts +70 -0
- package/packages/server/dist/services/harnessSkillService.d.ts.map +1 -0
- package/packages/server/dist/services/harnessSkillService.js +636 -0
- package/packages/server/dist/services/harnessSkillService.js.map +1 -0
- package/packages/server/dist/services/historyParser.d.ts +4 -14
- package/packages/server/dist/services/historyParser.d.ts.map +1 -1
- package/packages/server/dist/services/historyParser.js +60 -5
- package/packages/server/dist/services/historyParser.js.map +1 -1
- package/packages/server/dist/services/issueService.d.ts.map +1 -1
- package/packages/server/dist/services/issueService.js +10 -2
- package/packages/server/dist/services/issueService.js.map +1 -1
- package/packages/server/dist/services/manualSyncService.d.ts +19 -0
- package/packages/server/dist/services/manualSyncService.d.ts.map +1 -0
- package/packages/server/dist/services/manualSyncService.js +110 -0
- package/packages/server/dist/services/manualSyncService.js.map +1 -0
- package/packages/server/dist/services/notificationService.d.ts.map +1 -1
- package/packages/server/dist/services/notificationService.js +34 -9
- package/packages/server/dist/services/notificationService.js.map +1 -1
- package/packages/server/dist/services/preferencesService.d.ts.map +1 -1
- package/packages/server/dist/services/preferencesService.js +8 -1
- package/packages/server/dist/services/preferencesService.js.map +1 -1
- package/packages/server/dist/services/projectService.d.ts +5 -0
- package/packages/server/dist/services/projectService.d.ts.map +1 -1
- package/packages/server/dist/services/projectService.js +42 -2
- package/packages/server/dist/services/projectService.js.map +1 -1
- package/packages/server/dist/services/ptyService.d.ts +1 -0
- package/packages/server/dist/services/ptyService.d.ts.map +1 -1
- package/packages/server/dist/services/ptyService.js +36 -5
- package/packages/server/dist/services/ptyService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +83 -14
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -1
- package/packages/server/dist/services/sessionBufferManager.js +26 -0
- package/packages/server/dist/services/sessionBufferManager.js.map +1 -1
- package/packages/server/dist/services/sessionService.d.ts +4 -3
- package/packages/server/dist/services/sessionService.d.ts.map +1 -1
- package/packages/server/dist/services/sessionService.js +5 -4
- package/packages/server/dist/services/sessionService.js.map +1 -1
- package/packages/server/dist/services/snippetService.d.ts +54 -0
- package/packages/server/dist/services/snippetService.d.ts.map +1 -0
- package/packages/server/dist/services/snippetService.js +371 -0
- package/packages/server/dist/services/snippetService.js.map +1 -0
- package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts +46 -0
- package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts.map +1 -0
- package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js +125 -0
- package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js.map +1 -0
- package/packages/server/dist/services/webPushService.d.ts.map +1 -1
- package/packages/server/dist/services/webPushService.js +8 -1
- package/packages/server/dist/services/webPushService.js.map +1 -1
- package/packages/server/dist/snippets/split-commit +9 -0
- package/packages/server/dist/utils/applySecretsPolicy.d.ts +53 -0
- package/packages/server/dist/utils/applySecretsPolicy.d.ts.map +1 -0
- package/packages/server/dist/utils/applySecretsPolicy.js +204 -0
- package/packages/server/dist/utils/applySecretsPolicy.js.map +1 -0
- package/packages/server/dist/utils/assertNoSecretOnShared.d.ts +40 -0
- package/packages/server/dist/utils/assertNoSecretOnShared.d.ts.map +1 -0
- package/packages/server/dist/utils/assertNoSecretOnShared.js +47 -0
- package/packages/server/dist/utils/assertNoSecretOnShared.js.map +1 -0
- package/packages/server/dist/utils/effortUtils.d.ts +21 -0
- package/packages/server/dist/utils/effortUtils.d.ts.map +1 -0
- package/packages/server/dist/utils/effortUtils.js +36 -0
- package/packages/server/dist/utils/effortUtils.js.map +1 -0
- package/packages/server/dist/utils/gitignoreFilter.d.ts +23 -0
- package/packages/server/dist/utils/gitignoreFilter.d.ts.map +1 -0
- package/packages/server/dist/utils/gitignoreFilter.js +42 -0
- package/packages/server/dist/utils/gitignoreFilter.js.map +1 -0
- package/packages/server/dist/utils/harnessBundleSchema.d.ts +105 -0
- package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -0
- package/packages/server/dist/utils/harnessBundleSchema.js +79 -0
- package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -0
- package/packages/server/dist/utils/harnessPaths.d.ts +34 -0
- package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -0
- package/packages/server/dist/utils/harnessPaths.js +124 -0
- package/packages/server/dist/utils/harnessPaths.js.map +1 -0
- package/packages/server/dist/utils/pathUtils.d.ts +3 -2
- package/packages/server/dist/utils/pathUtils.d.ts.map +1 -1
- package/packages/server/dist/utils/pathUtils.js +26 -2
- package/packages/server/dist/utils/pathUtils.js.map +1 -1
- package/packages/server/dist/utils/secretHeuristic.d.ts +72 -0
- package/packages/server/dist/utils/secretHeuristic.d.ts.map +1 -0
- package/packages/server/dist/utils/secretHeuristic.js +163 -0
- package/packages/server/dist/utils/secretHeuristic.js.map +1 -0
- package/packages/server/dist/utils/secretPlaceholderNamer.d.ts +41 -0
- package/packages/server/dist/utils/secretPlaceholderNamer.d.ts.map +1 -0
- package/packages/server/dist/utils/secretPlaceholderNamer.js +81 -0
- package/packages/server/dist/utils/secretPlaceholderNamer.js.map +1 -0
- package/packages/server/dist/utils/serverPathResolver.d.ts +29 -0
- package/packages/server/dist/utils/serverPathResolver.d.ts.map +1 -0
- package/packages/server/dist/utils/serverPathResolver.js +59 -0
- package/packages/server/dist/utils/serverPathResolver.js.map +1 -0
- package/packages/server/dist/utils/snippetPaths.d.ts +61 -0
- package/packages/server/dist/utils/snippetPaths.d.ts.map +1 -0
- package/packages/server/dist/utils/snippetPaths.js +123 -0
- package/packages/server/dist/utils/snippetPaths.js.map +1 -0
- package/packages/server/dist/utils/structuredEditor.d.ts +34 -0
- package/packages/server/dist/utils/structuredEditor.d.ts.map +1 -0
- package/packages/server/dist/utils/structuredEditor.js +111 -0
- package/packages/server/dist/utils/structuredEditor.js.map +1 -0
- package/packages/server/package.json +6 -2
- package/packages/server/resources/internals/INDEX.md +23 -0
- package/packages/server/resources/internals/harness-files.md +63 -0
- package/packages/server/resources/internals/image-storage.md +43 -0
- package/packages/server/resources/manual/01-getting-started.md +104 -0
- package/packages/server/resources/manual/02-chat.md +285 -0
- package/packages/server/resources/manual/03-sessions.md +48 -0
- package/packages/server/resources/manual/04-slash-commands-favorites.md +152 -0
- package/packages/server/resources/manual/05-projects.md +74 -0
- package/packages/server/resources/manual/06-file-explorer-editor.md +90 -0
- package/packages/server/resources/manual/07-git.md +94 -0
- package/packages/server/resources/manual/08-terminal.md +59 -0
- package/packages/server/resources/manual/09-queue-runner.md +262 -0
- package/packages/server/resources/manual/10-project-board.md +193 -0
- package/packages/server/resources/manual/11-bmad-method-integration.md +128 -0
- package/packages/server/resources/manual/12-harness-workbench.md +175 -0
- package/packages/server/resources/manual/13-settings.md +241 -0
- package/packages/server/resources/manual/14-keyboard-shortcuts.md +68 -0
- package/packages/server/resources/manual/15-environment-variables.md +28 -0
- package/packages/server/resources/manual/16-troubleshooting.md +110 -0
- package/packages/server/resources/manual/INDEX.md +60 -0
- package/packages/shared/dist/index.d.ts +3 -0
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +6 -0
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/command.d.ts +3 -3
- package/packages/shared/dist/types/command.d.ts.map +1 -1
- package/packages/shared/dist/types/fileSystem.d.ts +19 -0
- package/packages/shared/dist/types/fileSystem.d.ts.map +1 -1
- package/packages/shared/dist/types/fileSystem.js +5 -0
- package/packages/shared/dist/types/fileSystem.js.map +1 -1
- package/packages/shared/dist/types/git.d.ts +6 -1
- package/packages/shared/dist/types/git.d.ts.map +1 -1
- package/packages/shared/dist/types/git.js.map +1 -1
- package/packages/shared/dist/types/harness.d.ts +1211 -0
- package/packages/shared/dist/types/harness.d.ts.map +1 -0
- package/packages/shared/dist/types/harness.js +107 -0
- package/packages/shared/dist/types/harness.js.map +1 -0
- package/packages/shared/dist/types/harnessBundle.d.ts +170 -0
- package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -0
- package/packages/shared/dist/types/harnessBundle.js +18 -0
- package/packages/shared/dist/types/harnessBundle.js.map +1 -0
- package/packages/shared/dist/types/history.d.ts +7 -0
- package/packages/shared/dist/types/history.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.d.ts +4 -1
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js +1 -0
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/queue.d.ts +9 -0
- package/packages/shared/dist/types/queue.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +42 -1
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js +26 -2
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/websocket.d.ts +24 -0
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/packages/shared/dist/utils/markdownSections.d.ts +50 -0
- package/packages/shared/dist/utils/markdownSections.d.ts.map +1 -0
- package/packages/shared/dist/utils/markdownSections.js +111 -0
- package/packages/shared/dist/utils/markdownSections.js.map +1 -0
- package/packages/shared/dist/utils/queueParser.d.ts.map +1 -1
- package/packages/shared/dist/utils/queueParser.js +104 -0
- package/packages/shared/dist/utils/queueParser.js.map +1 -1
- package/scripts/build-manual-shards.mjs +100 -0
- package/scripts/mock-telegram.mjs +172 -0
- package/scripts/run-integration-test.mjs +362 -0
- package/packages/client/dist/assets/index-Bf0D9oVJ.css +0 -32
- package/packages/client/dist/assets/index-CRmzoqHy.js +0 -2
- package/packages/client/dist/assets/index-CszGQ29O.js +0 -1432
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story 28.1: Harness plugin service.
|
|
3
|
+
*
|
|
4
|
+
* Combines three user-scope files — `plugins/installed_plugins.json`,
|
|
5
|
+
* `plugins/known_marketplaces.json`, and `settings.json` — into a card list
|
|
6
|
+
* consumable by the "Harness Workbench → Plugins" panel. All file I/O is
|
|
7
|
+
* delegated to `harnessService` so traversal guards, STALE_WRITE, and binary
|
|
8
|
+
* detection are reused from Story 28.0.5.
|
|
9
|
+
*
|
|
10
|
+
* The service is intentionally read-heavy on `listCards` and narrow on
|
|
11
|
+
* `toggleEnabled` — it touches only the `enabledPlugins` field of
|
|
12
|
+
* `settings.json` via JSONC round-trip so comments and key order are
|
|
13
|
+
* preserved.
|
|
14
|
+
*/
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import fs from 'fs/promises';
|
|
17
|
+
import { HARNESS_ERRORS, } from '@hammoc/shared';
|
|
18
|
+
import { harnessService } from './harnessService.js';
|
|
19
|
+
import { projectService } from './projectService.js';
|
|
20
|
+
import { getUserHarnessRoot } from '../utils/harnessPaths.js';
|
|
21
|
+
function throwMapped(code, message, extras) {
|
|
22
|
+
const err = new Error(message);
|
|
23
|
+
err.code = code;
|
|
24
|
+
if (extras)
|
|
25
|
+
Object.assign(err, extras);
|
|
26
|
+
throw err;
|
|
27
|
+
}
|
|
28
|
+
function isFileNotFound(err) {
|
|
29
|
+
return err?.code === HARNESS_ERRORS.HARNESS_FILE_NOT_FOUND.code;
|
|
30
|
+
}
|
|
31
|
+
class HarnessPluginService {
|
|
32
|
+
async listCards(currentProjectSlug) {
|
|
33
|
+
const currentProjectPath = await this.resolveCurrentProjectPath(currentProjectSlug);
|
|
34
|
+
// Step 1: installed_plugins.json (file absent → empty catalog, not an error)
|
|
35
|
+
let installed = {};
|
|
36
|
+
try {
|
|
37
|
+
const res = await harnessService.read({
|
|
38
|
+
scope: 'user',
|
|
39
|
+
relativePath: 'plugins/installed_plugins.json',
|
|
40
|
+
});
|
|
41
|
+
installed = this.parseJson(res.content ?? '', {});
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (!isFileNotFound(err))
|
|
45
|
+
throw err;
|
|
46
|
+
const fallbackEnabled = await this.readEnabledPluginsFromSettings('user');
|
|
47
|
+
return {
|
|
48
|
+
cards: [],
|
|
49
|
+
enabledPluginsFormat: 'object',
|
|
50
|
+
currentProjectPath,
|
|
51
|
+
settingsMtime: fallbackEnabled.mtime,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Step 2: known_marketplaces.json (file absent → empty map, keep going)
|
|
55
|
+
let marketplaces = {};
|
|
56
|
+
try {
|
|
57
|
+
const res = await harnessService.read({
|
|
58
|
+
scope: 'user',
|
|
59
|
+
relativePath: 'plugins/known_marketplaces.json',
|
|
60
|
+
});
|
|
61
|
+
marketplaces = this.parseJson(res.content ?? '', {});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (!isFileNotFound(err))
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
// Step 3: per-market marketplace.json files (build a name→meta map)
|
|
68
|
+
const marketMetaByKey = new Map();
|
|
69
|
+
for (const marketName of Object.keys(marketplaces)) {
|
|
70
|
+
try {
|
|
71
|
+
const res = await harnessService.read({
|
|
72
|
+
scope: 'user',
|
|
73
|
+
relativePath: `plugins/marketplaces/${marketName}/.claude-plugin/marketplace.json`,
|
|
74
|
+
});
|
|
75
|
+
const parsed = this.parseJson(res.content ?? '', {});
|
|
76
|
+
for (const meta of parsed.plugins ?? []) {
|
|
77
|
+
if (meta?.name) {
|
|
78
|
+
marketMetaByKey.set(`${meta.name}@${marketName}`, meta);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (!isFileNotFound(err))
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Step 4: enabledPlugins from both settings.json files. The user-scope
|
|
88
|
+
// file (~/.claude/settings.json) is the single source of truth for
|
|
89
|
+
// user-scope cards' enabled flag and toggle target. The project-scope
|
|
90
|
+
// file (<currentProjectPath>/.claude/settings.json) does the same for
|
|
91
|
+
// project-scope cards whose projectPath matches the current session.
|
|
92
|
+
// CLI semantics: `/plugin install --scope project` writes enabledPlugins
|
|
93
|
+
// to the project's settings.json — we mirror that on the toggle path.
|
|
94
|
+
const userEnabled = await this.readEnabledPluginsFromSettings('user');
|
|
95
|
+
const projectEnabled = currentProjectSlug
|
|
96
|
+
? await this.readEnabledPluginsFromSettings('project', currentProjectSlug)
|
|
97
|
+
: null;
|
|
98
|
+
// Step 5: build cards
|
|
99
|
+
const cards = [];
|
|
100
|
+
const plugins = installed.plugins ?? {};
|
|
101
|
+
for (const [key, value] of Object.entries(plugins)) {
|
|
102
|
+
const entries = Array.isArray(value) ? value : [value];
|
|
103
|
+
const [pluginName, marketplace] = this.splitKey(key);
|
|
104
|
+
for (const entry of entries) {
|
|
105
|
+
if (!entry || typeof entry !== 'object')
|
|
106
|
+
continue;
|
|
107
|
+
const routing = this.resolveSettingsRouting(entry, currentProjectPath);
|
|
108
|
+
// Pick which settings.json governs this specific card.
|
|
109
|
+
const enabledRead = routing === 'project' && projectEnabled
|
|
110
|
+
? projectEnabled
|
|
111
|
+
: userEnabled;
|
|
112
|
+
const card = await this.buildCard({
|
|
113
|
+
key,
|
|
114
|
+
pluginName,
|
|
115
|
+
marketplace,
|
|
116
|
+
entry,
|
|
117
|
+
marketMeta: marketMetaByKey.get(key),
|
|
118
|
+
enabled: enabledRead.enabled.has(key),
|
|
119
|
+
settingsScope: routing,
|
|
120
|
+
settingsMtime: enabledRead.mtime,
|
|
121
|
+
});
|
|
122
|
+
cards.push(card);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
cards,
|
|
127
|
+
enabledPluginsFormat: userEnabled.format,
|
|
128
|
+
currentProjectPath,
|
|
129
|
+
settingsMtime: userEnabled.mtime,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async toggleEnabled(req, currentProjectSlug) {
|
|
133
|
+
// Step 1 — Load installed_plugins.json first. Existence check (step 2)
|
|
134
|
+
// must precede scope gating / settings routing so an unknown key surfaces
|
|
135
|
+
// as 404 rather than masquerading as 403 or hitting an unrelated read.
|
|
136
|
+
let installed = {};
|
|
137
|
+
try {
|
|
138
|
+
const res = await harnessService.read({
|
|
139
|
+
scope: 'user',
|
|
140
|
+
relativePath: 'plugins/installed_plugins.json',
|
|
141
|
+
});
|
|
142
|
+
installed = this.parseJson(res.content ?? '', {});
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
if (!isFileNotFound(err))
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
const raw = installed.plugins?.[req.key];
|
|
149
|
+
const entries = raw ? (Array.isArray(raw) ? raw : [raw]) : [];
|
|
150
|
+
if (entries.length === 0) {
|
|
151
|
+
throwMapped(HARNESS_ERRORS.HARNESS_PLUGIN_NOT_FOUND.code, `plugin key not installed: ${req.key}`);
|
|
152
|
+
}
|
|
153
|
+
// Step 3 — Determine which settings.json this toggle should write to.
|
|
154
|
+
// CLI semantics: a plugin installed with `--scope project` keeps its
|
|
155
|
+
// enabledPlugins entry inside the project's settings.json, not the global
|
|
156
|
+
// one. So if any matching `scope:project` entry has `projectPath` equal
|
|
157
|
+
// to the current session's project, we route to that project's settings.
|
|
158
|
+
// Otherwise (only user-scope entries, or project entries that don't
|
|
159
|
+
// match the current project), we fall through to the global settings or
|
|
160
|
+
// surface HARNESS_PLUGIN_SCOPE_DENIED.
|
|
161
|
+
const currentProjectPath = await this.resolveCurrentProjectPath(currentProjectSlug);
|
|
162
|
+
const targetScope = this.pickToggleTargetScope(entries, currentProjectPath);
|
|
163
|
+
if (targetScope === 'denied') {
|
|
164
|
+
throwMapped(HARNESS_ERRORS.HARNESS_PLUGIN_SCOPE_DENIED.code, 'project scope toggle requires the matching project context');
|
|
165
|
+
}
|
|
166
|
+
// Step 4 — Read the chosen settings.json (deferred until after gating so
|
|
167
|
+
// we never speculatively read the project file when the request is for a
|
|
168
|
+
// user-only plugin).
|
|
169
|
+
const targetRef = targetScope === 'project'
|
|
170
|
+
? { scope: 'project', projectSlug: currentProjectSlug, relativePath: 'settings.json' }
|
|
171
|
+
: { scope: 'user', relativePath: 'settings.json' };
|
|
172
|
+
const enabledRead = await this.readEnabledPluginsFromSettings(targetScope, currentProjectSlug);
|
|
173
|
+
// Step 5 — Optimistic concurrency on the chosen file
|
|
174
|
+
if (req.expectedMtime !== undefined && req.expectedMtime !== enabledRead.mtime) {
|
|
175
|
+
throwMapped(HARNESS_ERRORS.HARNESS_STALE_WRITE.code, 'settings.json changed on disk', { currentMtime: enabledRead.mtime });
|
|
176
|
+
}
|
|
177
|
+
// Step 6 — Compute updated enabledPlugins value per current format
|
|
178
|
+
const updated = this.computeUpdatedEnabled(enabledRead.originalField, enabledRead.format, req.key, req.enabled);
|
|
179
|
+
// Step 7 — JSONC round-trip write to preserve comments / order
|
|
180
|
+
const write = await harnessService.patchStructured(targetRef, {
|
|
181
|
+
format: 'jsonc',
|
|
182
|
+
ops: [{ path: ['enabledPlugins'], value: updated }],
|
|
183
|
+
expectedMtime: enabledRead.mtime,
|
|
184
|
+
});
|
|
185
|
+
return { success: true, mtime: write.mtime, appliedFormat: enabledRead.format };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Decide which settings.json a toggle should write to (or that the toggle
|
|
189
|
+
* should be denied entirely). Mirrors the CLI's install-time scope choice.
|
|
190
|
+
*
|
|
191
|
+
* - Any `scope:project` entry whose `projectPath` matches the current
|
|
192
|
+
* project → write to the project's settings.json.
|
|
193
|
+
* - Only `scope:user` entries → write to the global settings.json.
|
|
194
|
+
* - One or more `scope:project` entries with no matching projectPath, and
|
|
195
|
+
* no user-scope entry → deny (HARNESS_PLUGIN_SCOPE_DENIED). This keeps
|
|
196
|
+
* us from silently writing project-scoped state into the wrong file.
|
|
197
|
+
*/
|
|
198
|
+
pickToggleTargetScope(entries, currentProjectPath) {
|
|
199
|
+
const projectEntries = entries.filter((e) => e.scope === 'project');
|
|
200
|
+
const hasUserEntry = entries.some((e) => e.scope === 'user');
|
|
201
|
+
if (projectEntries.length > 0 && currentProjectPath) {
|
|
202
|
+
const matched = projectEntries.some((e) => typeof e.projectPath === 'string' && this.samePath(e.projectPath, currentProjectPath));
|
|
203
|
+
if (matched)
|
|
204
|
+
return 'project';
|
|
205
|
+
}
|
|
206
|
+
if (hasUserEntry)
|
|
207
|
+
return 'user';
|
|
208
|
+
// Only project entries remain, none matching → safe deny.
|
|
209
|
+
return 'denied';
|
|
210
|
+
}
|
|
211
|
+
// ---- internals ---------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Decide whether a card's toggle should target the user-scope or
|
|
214
|
+
* project-scope settings.json. Mirrors `pickToggleTargetScope` but for the
|
|
215
|
+
* single-entry list-card path, where we know exactly which entry is being
|
|
216
|
+
* routed. A `scope:project` entry with a matching `projectPath` → project.
|
|
217
|
+
* Anything else → user (the toggle may still be gated on the toggle path
|
|
218
|
+
* if the entry's projectPath disagrees with the current project — see
|
|
219
|
+
* pickToggleTargetScope's deny branch).
|
|
220
|
+
*/
|
|
221
|
+
resolveSettingsRouting(entry, currentProjectPath) {
|
|
222
|
+
if (entry.scope === 'project'
|
|
223
|
+
&& currentProjectPath
|
|
224
|
+
&& typeof entry.projectPath === 'string'
|
|
225
|
+
&& this.samePath(entry.projectPath, currentProjectPath)) {
|
|
226
|
+
return 'project';
|
|
227
|
+
}
|
|
228
|
+
return 'user';
|
|
229
|
+
}
|
|
230
|
+
async readEnabledPluginsFromSettings(scope = 'user', projectSlug) {
|
|
231
|
+
try {
|
|
232
|
+
const ref = scope === 'project' && projectSlug
|
|
233
|
+
? { scope: 'project', projectSlug, relativePath: 'settings.json' }
|
|
234
|
+
: { scope: 'user', relativePath: 'settings.json' };
|
|
235
|
+
const res = await harnessService.read(ref);
|
|
236
|
+
const content = res.content ?? '';
|
|
237
|
+
let parsed = {};
|
|
238
|
+
try {
|
|
239
|
+
// settings.json is JSONC in practice. For read-only parsing we strip
|
|
240
|
+
// line/block comments before JSON.parse — the structured editor path
|
|
241
|
+
// handles the round-trip on write.
|
|
242
|
+
parsed = JSON.parse(stripJsonComments(content));
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'settings.json is not valid JSON');
|
|
246
|
+
}
|
|
247
|
+
const field = parsed['enabledPlugins'];
|
|
248
|
+
if (field === undefined || field === null) {
|
|
249
|
+
return {
|
|
250
|
+
enabled: new Set(),
|
|
251
|
+
format: 'object',
|
|
252
|
+
mtime: res.mtime,
|
|
253
|
+
raw: parsed,
|
|
254
|
+
originalField: undefined,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
if (Array.isArray(field)) {
|
|
258
|
+
const enabled = new Set(field.filter((v) => typeof v === 'string'));
|
|
259
|
+
return { enabled, format: 'array', mtime: res.mtime, raw: parsed, originalField: field };
|
|
260
|
+
}
|
|
261
|
+
if (typeof field === 'object') {
|
|
262
|
+
const enabled = new Set();
|
|
263
|
+
for (const [k, v] of Object.entries(field)) {
|
|
264
|
+
if (v === true)
|
|
265
|
+
enabled.add(k);
|
|
266
|
+
}
|
|
267
|
+
return { enabled, format: 'object', mtime: res.mtime, raw: parsed, originalField: field };
|
|
268
|
+
}
|
|
269
|
+
// Unknown shape — treat as missing but keep `object` as the write default.
|
|
270
|
+
return { enabled: new Set(), format: 'object', mtime: res.mtime, raw: parsed, originalField: undefined };
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
if (isFileNotFound(err)) {
|
|
274
|
+
return {
|
|
275
|
+
enabled: new Set(),
|
|
276
|
+
format: 'object',
|
|
277
|
+
mtime: '',
|
|
278
|
+
raw: {},
|
|
279
|
+
originalField: undefined,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
throw err;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
computeUpdatedEnabled(original, format, key, enabled) {
|
|
286
|
+
if (format === 'array') {
|
|
287
|
+
const arr = Array.isArray(original)
|
|
288
|
+
? (original.filter((v) => typeof v === 'string'))
|
|
289
|
+
: [];
|
|
290
|
+
if (enabled) {
|
|
291
|
+
return arr.includes(key) ? [...arr] : [...arr, key];
|
|
292
|
+
}
|
|
293
|
+
return arr.filter((k) => k !== key);
|
|
294
|
+
}
|
|
295
|
+
// object format
|
|
296
|
+
const obj = (original && typeof original === 'object' && !Array.isArray(original))
|
|
297
|
+
? { ...original }
|
|
298
|
+
: {};
|
|
299
|
+
if (enabled) {
|
|
300
|
+
obj[key] = true;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
delete obj[key];
|
|
304
|
+
}
|
|
305
|
+
return obj;
|
|
306
|
+
}
|
|
307
|
+
async resolveCurrentProjectPath(slug) {
|
|
308
|
+
if (!slug)
|
|
309
|
+
return undefined;
|
|
310
|
+
try {
|
|
311
|
+
return await projectService.resolveOriginalPath(slug);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
splitKey(key) {
|
|
318
|
+
const at = key.lastIndexOf('@');
|
|
319
|
+
if (at <= 0)
|
|
320
|
+
return [key, ''];
|
|
321
|
+
return [key.slice(0, at), key.slice(at + 1)];
|
|
322
|
+
}
|
|
323
|
+
samePath(a, b) {
|
|
324
|
+
const na = path.resolve(a);
|
|
325
|
+
const nb = path.resolve(b);
|
|
326
|
+
// Windows path comparisons are case-insensitive in practice.
|
|
327
|
+
return process.platform === 'win32'
|
|
328
|
+
? na.toLowerCase() === nb.toLowerCase()
|
|
329
|
+
: na === nb;
|
|
330
|
+
}
|
|
331
|
+
parseJson(content, fallback) {
|
|
332
|
+
const trimmed = content.trim();
|
|
333
|
+
if (!trimmed)
|
|
334
|
+
return fallback;
|
|
335
|
+
try {
|
|
336
|
+
return JSON.parse(trimmed);
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
throwMapped(HARNESS_ERRORS.HARNESS_PARSE_ERROR.code, 'malformed JSON catalog');
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async buildCard(params) {
|
|
343
|
+
const { key, pluginName, marketplace, entry, marketMeta, enabled, settingsScope, settingsMtime } = params;
|
|
344
|
+
const counts = await this.countComponents(entry.installPath);
|
|
345
|
+
const manifest = await this.readManifest(entry.installPath);
|
|
346
|
+
const pluginType = this.decideType(counts);
|
|
347
|
+
const versionShort = (entry.gitCommitSha ?? entry.version ?? '').slice(0, 7);
|
|
348
|
+
return {
|
|
349
|
+
key,
|
|
350
|
+
name: pluginName,
|
|
351
|
+
marketplace,
|
|
352
|
+
version: versionShort,
|
|
353
|
+
scope: entry.scope,
|
|
354
|
+
category: marketMeta?.category,
|
|
355
|
+
projectPath: entry.projectPath,
|
|
356
|
+
enabled,
|
|
357
|
+
pluginType,
|
|
358
|
+
componentCounts: counts,
|
|
359
|
+
manifest,
|
|
360
|
+
settingsScope,
|
|
361
|
+
settingsMtime,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
decideType(counts) {
|
|
365
|
+
const onlyMcp = counts.skills === 0
|
|
366
|
+
&& counts.commands === 0
|
|
367
|
+
&& counts.agents === 0
|
|
368
|
+
&& counts.hooks === 0
|
|
369
|
+
&& counts.mcpServers > 0;
|
|
370
|
+
return onlyMcp ? 'external-mcp' : 'standard';
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Enumerate plugin bundle components. Uses direct `fs` access rather than
|
|
374
|
+
* `harnessService.list` because the install path may live under
|
|
375
|
+
* `~/.claude/plugins/cache/...` but the exact nesting is vendor-controlled
|
|
376
|
+
* and we don't want each subdir to round-trip through the traversal guard
|
|
377
|
+
* individually. We still refuse to enumerate any path that isn't contained
|
|
378
|
+
* in `~/.claude` (per AC — fallback all-zero).
|
|
379
|
+
*/
|
|
380
|
+
async countComponents(installPath) {
|
|
381
|
+
const zero = {
|
|
382
|
+
skills: 0, commands: 0, agents: 0, hooks: 0, mcpServers: 0,
|
|
383
|
+
};
|
|
384
|
+
if (!installPath || typeof installPath !== 'string')
|
|
385
|
+
return zero;
|
|
386
|
+
const userRoot = path.resolve(getUserHarnessRoot());
|
|
387
|
+
const abs = path.resolve(installPath);
|
|
388
|
+
if (abs !== userRoot && !abs.startsWith(userRoot + path.sep)) {
|
|
389
|
+
return zero;
|
|
390
|
+
}
|
|
391
|
+
const [skills, commands, agents, hooks, mcpServers] = await Promise.all([
|
|
392
|
+
this.countSkillsDir(path.join(abs, 'skills')),
|
|
393
|
+
this.countMarkdownFiles(path.join(abs, 'commands')),
|
|
394
|
+
this.countMarkdownFiles(path.join(abs, 'agents')),
|
|
395
|
+
this.countHooksJson(path.join(abs, 'hooks', 'hooks.json')),
|
|
396
|
+
this.countMcpServers(path.join(abs, '.mcp.json')),
|
|
397
|
+
]);
|
|
398
|
+
return { skills, commands, agents, hooks, mcpServers };
|
|
399
|
+
}
|
|
400
|
+
async countSkillsDir(dir) {
|
|
401
|
+
try {
|
|
402
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
403
|
+
let n = 0;
|
|
404
|
+
for (const ent of entries) {
|
|
405
|
+
if (!ent.isDirectory())
|
|
406
|
+
continue;
|
|
407
|
+
try {
|
|
408
|
+
await fs.access(path.join(dir, ent.name, 'SKILL.md'));
|
|
409
|
+
n += 1;
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
// no SKILL.md → skip
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return n;
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return 0;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
async countMarkdownFiles(dir) {
|
|
422
|
+
try {
|
|
423
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
424
|
+
let n = 0;
|
|
425
|
+
for (const ent of entries) {
|
|
426
|
+
if (ent.isFile() && ent.name.toLowerCase().endsWith('.md'))
|
|
427
|
+
n += 1;
|
|
428
|
+
}
|
|
429
|
+
return n;
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
return 0;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
async countHooksJson(file) {
|
|
436
|
+
try {
|
|
437
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
438
|
+
const parsed = JSON.parse(content);
|
|
439
|
+
const hooks = parsed?.hooks;
|
|
440
|
+
if (!hooks || typeof hooks !== 'object')
|
|
441
|
+
return 0;
|
|
442
|
+
return Object.values(hooks)
|
|
443
|
+
.filter(Array.isArray)
|
|
444
|
+
.reduce((sum, arr) => sum + arr.length, 0);
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
return 0;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async countMcpServers(file) {
|
|
451
|
+
try {
|
|
452
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
453
|
+
const parsed = JSON.parse(content);
|
|
454
|
+
if (!parsed || typeof parsed !== 'object')
|
|
455
|
+
return 0;
|
|
456
|
+
// Preferred shape: `{ mcpServers: { ... } }`.
|
|
457
|
+
const wrapper = parsed.mcpServers;
|
|
458
|
+
if (wrapper && typeof wrapper === 'object' && !Array.isArray(wrapper)) {
|
|
459
|
+
return Object.keys(wrapper).length;
|
|
460
|
+
}
|
|
461
|
+
// Fallback for flat-map layouts: only count keys whose value *looks like*
|
|
462
|
+
// a server definition (object with command/url/type/transport). This
|
|
463
|
+
// keeps metadata keys like $schema/version from inflating the count.
|
|
464
|
+
let n = 0;
|
|
465
|
+
for (const value of Object.values(parsed)) {
|
|
466
|
+
if (isLikelyMcpServerEntry(value))
|
|
467
|
+
n += 1;
|
|
468
|
+
}
|
|
469
|
+
return n;
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
return 0;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
async readManifest(installPath) {
|
|
476
|
+
try {
|
|
477
|
+
const file = path.join(installPath, '.claude-plugin', 'plugin.json');
|
|
478
|
+
const content = await fs.readFile(file, 'utf-8');
|
|
479
|
+
const parsed = JSON.parse(content);
|
|
480
|
+
if (!parsed?.name)
|
|
481
|
+
return undefined;
|
|
482
|
+
return {
|
|
483
|
+
name: parsed.name,
|
|
484
|
+
description: parsed.description,
|
|
485
|
+
author: parsed.author,
|
|
486
|
+
version: parsed.version,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
return undefined;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Strip `//` line comments and `/* block * /` comments from JSONC input so the
|
|
496
|
+
* read path can `JSON.parse` safely. Write path still uses `applyJsoncPatch`
|
|
497
|
+
* via `harnessService.patchStructured`, which preserves comments.
|
|
498
|
+
*
|
|
499
|
+
* This is intentionally conservative: it ignores comment-like sequences
|
|
500
|
+
* inside string literals so we don't mangle paths or regex values.
|
|
501
|
+
*/
|
|
502
|
+
function stripJsonComments(input) {
|
|
503
|
+
let out = '';
|
|
504
|
+
let i = 0;
|
|
505
|
+
let inString = false;
|
|
506
|
+
let stringQuote = '';
|
|
507
|
+
while (i < input.length) {
|
|
508
|
+
const ch = input[i];
|
|
509
|
+
const next = input[i + 1];
|
|
510
|
+
if (inString) {
|
|
511
|
+
out += ch;
|
|
512
|
+
if (ch === '\\' && i + 1 < input.length) {
|
|
513
|
+
out += next;
|
|
514
|
+
i += 2;
|
|
515
|
+
continue;
|
|
516
|
+
}
|
|
517
|
+
if (ch === stringQuote) {
|
|
518
|
+
inString = false;
|
|
519
|
+
}
|
|
520
|
+
i += 1;
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
if (ch === '"' || ch === "'") {
|
|
524
|
+
inString = true;
|
|
525
|
+
stringQuote = ch;
|
|
526
|
+
out += ch;
|
|
527
|
+
i += 1;
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
if (ch === '/' && next === '/') {
|
|
531
|
+
// line comment — skip to newline
|
|
532
|
+
i += 2;
|
|
533
|
+
while (i < input.length && input[i] !== '\n')
|
|
534
|
+
i += 1;
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
if (ch === '/' && next === '*') {
|
|
538
|
+
i += 2;
|
|
539
|
+
while (i < input.length && !(input[i] === '*' && input[i + 1] === '/'))
|
|
540
|
+
i += 1;
|
|
541
|
+
i += 2;
|
|
542
|
+
continue;
|
|
543
|
+
}
|
|
544
|
+
out += ch;
|
|
545
|
+
i += 1;
|
|
546
|
+
}
|
|
547
|
+
return out;
|
|
548
|
+
}
|
|
549
|
+
function isLikelyMcpServerEntry(value) {
|
|
550
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
551
|
+
return false;
|
|
552
|
+
const rec = value;
|
|
553
|
+
return (typeof rec.command === 'string'
|
|
554
|
+
|| typeof rec.url === 'string'
|
|
555
|
+
|| typeof rec.type === 'string'
|
|
556
|
+
|| typeof rec.transport === 'string');
|
|
557
|
+
}
|
|
558
|
+
export const harnessPluginService = new HarnessPluginService();
|
|
559
|
+
//# sourceMappingURL=harnessPluginService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessPluginService.js","sourceRoot":"","sources":["../../src/services/harnessPluginService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story 28.0.5: Harness workbench service.
|
|
3
|
+
*
|
|
4
|
+
* Domain: the project's `.claude/` subtree and the global `~/.claude/` subtree
|
|
5
|
+
* — the files that drive plugins, skills, MCP servers, hooks, commands, and
|
|
6
|
+
* subagents. Responsibilities are intentionally separated from
|
|
7
|
+
* `fileSystemService` (which serves arbitrary project files) so that path
|
|
8
|
+
* resolution, scope routing, and the structured-edit surface can evolve
|
|
9
|
+
* independently for harness consumers.
|
|
10
|
+
*
|
|
11
|
+
* Method contract surfaces (all throw typed errors from `HARNESS_ERRORS`):
|
|
12
|
+
* list — directory contents for a `.claude/` subtree
|
|
13
|
+
* read — single file read with binary detection + 1MB truncation
|
|
14
|
+
* write — raw write with expectedMtime / STALE_WRITE guard
|
|
15
|
+
* patchStructured — YAML/JSONC AST-level patch preserving comments & order
|
|
16
|
+
*/
|
|
17
|
+
import { type HarnessPathRef, type HarnessListResponse, type HarnessReadResponse, type HarnessWriteRequest, type HarnessWriteResponse, type HarnessStructuredPatchRequest } from '@hammoc/shared';
|
|
18
|
+
declare class HarnessService {
|
|
19
|
+
/** List entries of a harness subtree. Missing root → empty list (AC1/AC2). */
|
|
20
|
+
list(ref: HarnessPathRef): Promise<HarnessListResponse>;
|
|
21
|
+
/** Read a single harness file. Binary → content:null, >1MB → truncated. */
|
|
22
|
+
read(ref: HarnessPathRef): Promise<HarnessReadResponse>;
|
|
23
|
+
/**
|
|
24
|
+
* Write a harness file with optional ETag/mtime conflict check.
|
|
25
|
+
* - expectedMtime present + file exists + mtime differs → STALE_WRITE
|
|
26
|
+
* - expectedMtime present + file missing → STALE_WRITE (currentMtime: '')
|
|
27
|
+
* - expectedMtime absent → force overwrite/create
|
|
28
|
+
* - parent directory missing → HARNESS_PARENT_NOT_FOUND (no auto-mkdir)
|
|
29
|
+
*/
|
|
30
|
+
write(ref: HarnessPathRef, body: HarnessWriteRequest): Promise<HarnessWriteResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Read-patch-write an AST-level edit. Running the round trip through
|
|
33
|
+
* `write` means an external mutation that sneaks in between our read and
|
|
34
|
+
* write will surface as STALE_WRITE (AC5).
|
|
35
|
+
*/
|
|
36
|
+
patchStructured(ref: HarnessPathRef, body: HarnessStructuredPatchRequest): Promise<HarnessWriteResponse>;
|
|
37
|
+
}
|
|
38
|
+
export declare const harnessService: HarnessService;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=harnessService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessService.d.ts","sourceRoot":"","sources":["../../src/services/harnessService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,EACnC,MAAM,gBAAgB,CAAC;AAaxB,cAAM,cAAc;IAClB,8EAA8E;IACxE,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyD7D,2EAA2E;IACrE,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuD7D;;;;;;OAMG;IACG,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA4D1F;;;;OAIG;IACG,eAAe,CACnB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,oBAAoB,CAAC;CAajC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|