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,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher Service
|
|
3
|
+
* Watches the filesystem of active projects and broadcasts external-change
|
|
4
|
+
* events to clients subscribed to the project room. Each project is watched
|
|
5
|
+
* under a reference count so multiple subscribers (editor, explorer, chain, etc.)
|
|
6
|
+
* share one chokidar instance and the watcher tears down cleanly when the
|
|
7
|
+
* last client leaves.
|
|
8
|
+
*
|
|
9
|
+
* Self-write suppression: when Hammoc itself writes a file via fileSystemService,
|
|
10
|
+
* chokidar would normally echo that change back to the originating client and
|
|
11
|
+
* cause an "external change" banner on their own save. Callers must invoke
|
|
12
|
+
* noteLocalWrite(absolutePath) immediately after writing — events for paths
|
|
13
|
+
* noted within the last SELF_WRITE_WINDOW_MS are silently dropped.
|
|
14
|
+
*
|
|
15
|
+
* Story 28.0.5: extended with harness-scope watchers over ~/.claude (user) and
|
|
16
|
+
* <project>/.claude (project). Harness watchers emit `harness:external-change`
|
|
17
|
+
* on dedicated rooms and share the same self-write-suppression map so writes
|
|
18
|
+
* coming out of harnessService do not echo back to the originating client.
|
|
19
|
+
*/
|
|
20
|
+
import chokidar from 'chokidar';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { getIO } from '../handlers/websocket.js';
|
|
23
|
+
import { createLogger } from '../utils/logger.js';
|
|
24
|
+
import { getUserHarnessRoot, getProjectHarnessRoot } from '../utils/harnessPaths.js';
|
|
25
|
+
const log = createLogger('fileWatcher');
|
|
26
|
+
/** Directories where we never recurse — mirrors fileSystemService.SKIP_DIRS. */
|
|
27
|
+
const SKIP_DIRS = new Set([
|
|
28
|
+
'node_modules', '.git', '.next', '.cache', '__pycache__', 'dist', '.turbo',
|
|
29
|
+
]);
|
|
30
|
+
function harnessKey(ref) {
|
|
31
|
+
return ref.scope === 'user'
|
|
32
|
+
? 'harness:user'
|
|
33
|
+
: `harness:project:${ref.projectSlug ?? ''}`;
|
|
34
|
+
}
|
|
35
|
+
function harnessRoom(ref) {
|
|
36
|
+
return harnessKey(ref);
|
|
37
|
+
}
|
|
38
|
+
class FileWatcherService {
|
|
39
|
+
watchers = new Map();
|
|
40
|
+
harnessWatchers = new Map();
|
|
41
|
+
/** absolute path → timestamp (ms) of the last local write */
|
|
42
|
+
pendingLocalWrites = new Map();
|
|
43
|
+
/** Events arriving within this window after a local write are treated as our own echo. */
|
|
44
|
+
static SELF_WRITE_WINDOW_MS = 1500;
|
|
45
|
+
/**
|
|
46
|
+
* Start (or increment the ref count of) a watcher for the given project.
|
|
47
|
+
* No-op if projectRoot is falsy.
|
|
48
|
+
*/
|
|
49
|
+
ensureWatcher(projectSlug, projectRoot) {
|
|
50
|
+
if (!projectSlug || !projectRoot)
|
|
51
|
+
return;
|
|
52
|
+
const existing = this.watchers.get(projectSlug);
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.refCount++;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const watcher = chokidar.watch(projectRoot, {
|
|
58
|
+
ignoreInitial: true,
|
|
59
|
+
ignored: (target) => {
|
|
60
|
+
const rel = path.relative(projectRoot, target).replace(/\\/g, '/');
|
|
61
|
+
if (!rel || rel === '.')
|
|
62
|
+
return false;
|
|
63
|
+
const segments = rel.split('/');
|
|
64
|
+
for (const seg of segments) {
|
|
65
|
+
if (SKIP_DIRS.has(seg))
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
},
|
|
70
|
+
awaitWriteFinish: {
|
|
71
|
+
stabilityThreshold: 200,
|
|
72
|
+
pollInterval: 50,
|
|
73
|
+
},
|
|
74
|
+
persistent: true,
|
|
75
|
+
// Do not follow symlinks — keeps watcher bounded even if a project
|
|
76
|
+
// contains a symlink loop.
|
|
77
|
+
followSymlinks: false,
|
|
78
|
+
});
|
|
79
|
+
const emit = (type) => (absolutePath, stats) => {
|
|
80
|
+
try {
|
|
81
|
+
const noteTs = this.pendingLocalWrites.get(absolutePath);
|
|
82
|
+
if (noteTs !== undefined && Date.now() - noteTs < FileWatcherService.SELF_WRITE_WINDOW_MS) {
|
|
83
|
+
this.pendingLocalWrites.delete(absolutePath);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const rel = path.relative(projectRoot, absolutePath).replace(/\\/g, '/');
|
|
87
|
+
// Skip root-dir notifications (rel === '.' or '') and any path that
|
|
88
|
+
// somehow resolves outside the project root. Directory mtime bumps
|
|
89
|
+
// produce these and are noise for the editor's file-level listener.
|
|
90
|
+
if (!rel || rel === '.' || rel.startsWith('..'))
|
|
91
|
+
return;
|
|
92
|
+
const payload = {
|
|
93
|
+
projectSlug,
|
|
94
|
+
path: rel,
|
|
95
|
+
type,
|
|
96
|
+
mtime: stats?.mtime ? stats.mtime.toISOString() : undefined,
|
|
97
|
+
};
|
|
98
|
+
try {
|
|
99
|
+
getIO().to(`project:${projectSlug}`).emit('file:external-change', payload);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Socket.io not initialized yet — drop the event silently.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
log.warn(`failed to emit file:external-change for ${projectSlug}: ${String(err)}`);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
watcher.on('change', emit('modified'));
|
|
110
|
+
watcher.on('unlink', emit('deleted'));
|
|
111
|
+
watcher.on('error', (err) => {
|
|
112
|
+
log.warn(`chokidar watcher error (${projectSlug}): ${String(err)}`);
|
|
113
|
+
});
|
|
114
|
+
this.watchers.set(projectSlug, { watcher, refCount: 1, projectRoot });
|
|
115
|
+
log.info(`started file watcher for project "${projectSlug}" at ${projectRoot}`);
|
|
116
|
+
}
|
|
117
|
+
/** Decrement the ref count and close the watcher when it reaches zero. */
|
|
118
|
+
releaseWatcher(projectSlug) {
|
|
119
|
+
if (!projectSlug)
|
|
120
|
+
return;
|
|
121
|
+
const existing = this.watchers.get(projectSlug);
|
|
122
|
+
if (!existing)
|
|
123
|
+
return;
|
|
124
|
+
existing.refCount--;
|
|
125
|
+
if (existing.refCount <= 0) {
|
|
126
|
+
existing.watcher.close().catch(() => { });
|
|
127
|
+
this.watchers.delete(projectSlug);
|
|
128
|
+
log.info(`stopped file watcher for project "${projectSlug}"`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Start (or increment the ref count of) a harness watcher for the given scope.
|
|
133
|
+
* - `scope='user'` → ~/.claude (via `getUserHarnessRoot()`)
|
|
134
|
+
* - `scope='project'` → <project>/.claude (via `getProjectHarnessRoot()`)
|
|
135
|
+
*
|
|
136
|
+
* Idempotent + reference-counted so concurrent subscribers share one chokidar.
|
|
137
|
+
* Unlike the project watcher, harness watchers subscribe to `add` in addition
|
|
138
|
+
* to `change`/`unlink` so they can fire the `'created'` type required by
|
|
139
|
+
* HarnessExternalChangeEvent.
|
|
140
|
+
*/
|
|
141
|
+
async ensureHarnessWatcher(ref) {
|
|
142
|
+
const key = harnessKey(ref);
|
|
143
|
+
const existing = this.harnessWatchers.get(key);
|
|
144
|
+
if (existing) {
|
|
145
|
+
existing.refCount++;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
let resolvedRoot;
|
|
149
|
+
try {
|
|
150
|
+
resolvedRoot = ref.scope === 'user'
|
|
151
|
+
? getUserHarnessRoot()
|
|
152
|
+
: await getProjectHarnessRoot(ref.projectSlug ?? '');
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
log.warn(`failed to resolve harness root for ${key}: ${String(err)}`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Story 28.3: project scope must also surface external edits to
|
|
159
|
+
// `<projectRoot>/.mcp.json`. The file is the SIBLING of `.claude/`, so
|
|
160
|
+
// the standard root-only watcher cannot pick it up. We add it as a second
|
|
161
|
+
// path in the same chokidar instance and emit `path: '.mcp.json'`
|
|
162
|
+
// (hard-coded relative form) when the event lands on that file.
|
|
163
|
+
//
|
|
164
|
+
// Story 29.1 (AC2.b): same pattern is used to watch `<projectRoot>/CLAUDE.md`,
|
|
165
|
+
// a second sibling of `.claude/`. Its emitted path is normalized to
|
|
166
|
+
// `'../CLAUDE.md'` so it cannot collide with `<projectRoot>/.claude/CLAUDE.md`
|
|
167
|
+
// (which would also normalize to `'CLAUDE.md'`). Using the `..` prefix —
|
|
168
|
+
// a string that path-resolver would otherwise reject as traversal — guarantees
|
|
169
|
+
// a unique discriminator since no path going through the standard harness
|
|
170
|
+
// API can ever match it. Client matching rule (AC2.b) is `path === '../CLAUDE.md'`.
|
|
171
|
+
const projectMcpFilePath = ref.scope === 'project'
|
|
172
|
+
? path.join(path.dirname(resolvedRoot), '.mcp.json')
|
|
173
|
+
: null;
|
|
174
|
+
const projectClaudeMdPath = ref.scope === 'project'
|
|
175
|
+
? path.join(path.dirname(resolvedRoot), 'CLAUDE.md')
|
|
176
|
+
: null;
|
|
177
|
+
// Story 30.1 (AC2.b): the project's `.gitignore` lives at <projectRoot>/.gitignore,
|
|
178
|
+
// a sibling of `.claude/`. We watch it on the same chokidar instance as
|
|
179
|
+
// `.mcp.json` and `CLAUDE.md` and emit a discriminated path
|
|
180
|
+
// (`'../.gitignore'`) so the client can route the event to the
|
|
181
|
+
// share-scope store without a new socket event.
|
|
182
|
+
const projectGitignorePath = ref.scope === 'project'
|
|
183
|
+
? path.join(path.dirname(resolvedRoot), '.gitignore')
|
|
184
|
+
: null;
|
|
185
|
+
const watchTargets = ref.scope === 'project'
|
|
186
|
+
? [
|
|
187
|
+
resolvedRoot,
|
|
188
|
+
projectMcpFilePath,
|
|
189
|
+
projectClaudeMdPath,
|
|
190
|
+
projectGitignorePath,
|
|
191
|
+
]
|
|
192
|
+
: resolvedRoot;
|
|
193
|
+
const watcher = chokidar.watch(watchTargets, {
|
|
194
|
+
ignoreInitial: true,
|
|
195
|
+
ignored: (target) => {
|
|
196
|
+
// Always allow the sibling files (`.mcp.json`, `CLAUDE.md`, `.gitignore`) —
|
|
197
|
+
// chokidar would otherwise drop them because they sit outside
|
|
198
|
+
// `resolvedRoot`.
|
|
199
|
+
if (projectMcpFilePath && path.resolve(target) === path.resolve(projectMcpFilePath)) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
if (projectClaudeMdPath && path.resolve(target) === path.resolve(projectClaudeMdPath)) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (projectGitignorePath && path.resolve(target) === path.resolve(projectGitignorePath)) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
const rel = path.relative(resolvedRoot, target).replace(/\\/g, '/');
|
|
209
|
+
if (!rel || rel === '.')
|
|
210
|
+
return false;
|
|
211
|
+
const segments = rel.split('/');
|
|
212
|
+
for (const seg of segments) {
|
|
213
|
+
if (SKIP_DIRS.has(seg))
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
return false;
|
|
217
|
+
},
|
|
218
|
+
awaitWriteFinish: {
|
|
219
|
+
stabilityThreshold: 200,
|
|
220
|
+
pollInterval: 50,
|
|
221
|
+
},
|
|
222
|
+
persistent: true,
|
|
223
|
+
followSymlinks: false,
|
|
224
|
+
});
|
|
225
|
+
const emit = (type) => (absolutePath, stats) => {
|
|
226
|
+
try {
|
|
227
|
+
const noteTs = this.pendingLocalWrites.get(absolutePath);
|
|
228
|
+
if (noteTs !== undefined && Date.now() - noteTs < FileWatcherService.SELF_WRITE_WINDOW_MS) {
|
|
229
|
+
this.pendingLocalWrites.delete(absolutePath);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
let rel;
|
|
233
|
+
if (projectMcpFilePath
|
|
234
|
+
&& path.resolve(absolutePath) === path.resolve(projectMcpFilePath)) {
|
|
235
|
+
rel = '.mcp.json';
|
|
236
|
+
}
|
|
237
|
+
else if (projectClaudeMdPath
|
|
238
|
+
&& path.resolve(absolutePath) === path.resolve(projectClaudeMdPath)) {
|
|
239
|
+
// Story 29.1 (AC2.b): `<projectRoot>/CLAUDE.md` emits as
|
|
240
|
+
// `'../CLAUDE.md'` to namespace-separate it from a hypothetical
|
|
241
|
+
// `<projectRoot>/.claude/CLAUDE.md` that would otherwise share
|
|
242
|
+
// the relative path `'CLAUDE.md'`.
|
|
243
|
+
rel = '../CLAUDE.md';
|
|
244
|
+
}
|
|
245
|
+
else if (projectGitignorePath
|
|
246
|
+
&& path.resolve(absolutePath) === path.resolve(projectGitignorePath)) {
|
|
247
|
+
// Story 30.1 (AC2.b): same trick — `'../.gitignore'` is the
|
|
248
|
+
// discriminated path the client store keys on to trigger a full
|
|
249
|
+
// share-scope reload (everything depends on `.gitignore`).
|
|
250
|
+
rel = '../.gitignore';
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
rel = path.relative(resolvedRoot, absolutePath).replace(/\\/g, '/');
|
|
254
|
+
if (!rel || rel === '.' || rel.startsWith('..'))
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const payload = {
|
|
258
|
+
scope: ref.scope,
|
|
259
|
+
projectSlug: ref.projectSlug,
|
|
260
|
+
path: rel,
|
|
261
|
+
type,
|
|
262
|
+
mtime: type !== 'deleted' && stats?.mtime ? stats.mtime.toISOString() : undefined,
|
|
263
|
+
};
|
|
264
|
+
try {
|
|
265
|
+
getIO().to(harnessRoom(ref)).emit('harness:external-change', payload);
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Socket.io not initialized yet — drop silently.
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
log.warn(`failed to emit harness:external-change for ${key}: ${String(err)}`);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
watcher.on('add', emit('created'));
|
|
276
|
+
watcher.on('change', emit('modified'));
|
|
277
|
+
watcher.on('unlink', emit('deleted'));
|
|
278
|
+
watcher.on('error', (err) => {
|
|
279
|
+
log.warn(`chokidar harness watcher error (${key}): ${String(err)}`);
|
|
280
|
+
});
|
|
281
|
+
this.harnessWatchers.set(key, {
|
|
282
|
+
watcher,
|
|
283
|
+
refCount: 1,
|
|
284
|
+
resolvedRoot,
|
|
285
|
+
scope: ref.scope,
|
|
286
|
+
projectSlug: ref.projectSlug,
|
|
287
|
+
});
|
|
288
|
+
log.info(`started harness watcher for ${key} at ${resolvedRoot}`);
|
|
289
|
+
}
|
|
290
|
+
/** Decrement the harness watcher ref count, closing when it reaches zero. */
|
|
291
|
+
releaseHarnessWatcher(ref) {
|
|
292
|
+
const key = harnessKey(ref);
|
|
293
|
+
const existing = this.harnessWatchers.get(key);
|
|
294
|
+
if (!existing)
|
|
295
|
+
return;
|
|
296
|
+
existing.refCount--;
|
|
297
|
+
if (existing.refCount <= 0) {
|
|
298
|
+
existing.watcher.close().catch(() => { });
|
|
299
|
+
this.harnessWatchers.delete(key);
|
|
300
|
+
log.info(`stopped harness watcher for ${key}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/** Mark an absolute path as just-written so the next watcher event is ignored. */
|
|
304
|
+
noteLocalWrite(absolutePath) {
|
|
305
|
+
this.pendingLocalWrites.set(absolutePath, Date.now());
|
|
306
|
+
// Opportunistic pruning — keep the map bounded without a timer.
|
|
307
|
+
if (this.pendingLocalWrites.size > 64) {
|
|
308
|
+
const now = Date.now();
|
|
309
|
+
for (const [p, ts] of this.pendingLocalWrites.entries()) {
|
|
310
|
+
if (now - ts > FileWatcherService.SELF_WRITE_WINDOW_MS * 2) {
|
|
311
|
+
this.pendingLocalWrites.delete(p);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/** Close every active watcher. Called on server shutdown. */
|
|
317
|
+
async shutdown() {
|
|
318
|
+
const closers = [
|
|
319
|
+
...Array.from(this.watchers.values()).map(({ watcher }) => watcher.close().catch(() => { })),
|
|
320
|
+
...Array.from(this.harnessWatchers.values()).map(({ watcher }) => watcher.close().catch(() => { })),
|
|
321
|
+
];
|
|
322
|
+
this.watchers.clear();
|
|
323
|
+
this.harnessWatchers.clear();
|
|
324
|
+
this.pendingLocalWrites.clear();
|
|
325
|
+
await Promise.all(closers);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export const fileWatcherService = new FileWatcherService();
|
|
329
|
+
//# sourceMappingURL=fileWatcherService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileWatcherService.js","sourceRoot":"","sources":["../../src/services/fileWatcherService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"gitService.d.ts","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAGxB,cAAM,UAAU;IACd,OAAO,CAAC,SAAS;IASX,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmC1D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAkC5E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsB9D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IA2E1F,OAAO,CAAC,mBAAmB;IAMrB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3D,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB1F;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
* Wraps simple-git to provide Git read and write operations for projects.
|
|
4
4
|
* [Source: Story 16.1 - Task 3, Story 16.2 - Task 2]
|
|
5
5
|
*/
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
6
8
|
import simpleGit from 'simple-git';
|
|
9
|
+
import { isBinaryFile } from '../utils/pathUtils.js';
|
|
7
10
|
class GitService {
|
|
8
11
|
wrapError(operation, error) {
|
|
9
12
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -64,6 +67,11 @@ class GitService {
|
|
|
64
67
|
return { commits };
|
|
65
68
|
}
|
|
66
69
|
catch (error) {
|
|
70
|
+
// git log exits with non-zero on repos with no commits yet — treat as empty
|
|
71
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
72
|
+
if (/does not have any commits yet|bad default revision|unknown revision/i.test(msg)) {
|
|
73
|
+
return { commits: [] };
|
|
74
|
+
}
|
|
67
75
|
throw this.wrapError('log', error);
|
|
68
76
|
}
|
|
69
77
|
}
|
|
@@ -93,13 +101,65 @@ class GitService {
|
|
|
93
101
|
return { initialized: false };
|
|
94
102
|
}
|
|
95
103
|
try {
|
|
96
|
-
|
|
104
|
+
// Run without --binary so git emits "Binary files … differ" for binary
|
|
105
|
+
// paths. The --binary flag causes git to output a "GIT binary patch" block
|
|
106
|
+
// instead, which breaks the "Binary files" regex below.
|
|
107
|
+
const args = staged
|
|
108
|
+
? ['--cached', '--', file]
|
|
109
|
+
: ['--', file];
|
|
97
110
|
const diff = await git.diff(args);
|
|
111
|
+
// Detect binary via the standard git marker.
|
|
112
|
+
let isBinary = /^Binary files .* differ$/m.test(diff);
|
|
113
|
+
// Untracked or newly added files never appear in `git diff`, so the
|
|
114
|
+
// output is empty regardless of binary status. Fall back to reading the
|
|
115
|
+
// file directly (covers .zip/.pdf and friends via the extension
|
|
116
|
+
// allowlist in pathUtils.isBinaryFile).
|
|
117
|
+
if (!isBinary && !diff.trim()) {
|
|
118
|
+
try {
|
|
119
|
+
isBinary = await isBinaryFile(path.join(projectPath, file));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// File may not exist (e.g. deleted). Leave isBinary=false.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
let before = '';
|
|
126
|
+
let after = '';
|
|
127
|
+
if (!isBinary) {
|
|
128
|
+
// Staged view: compare HEAD blob (before) against index blob (after).
|
|
129
|
+
// Unstaged view: compare index blob (before) against working copy (after).
|
|
130
|
+
// Any `git show` failure (missing blob — new/untracked file) collapses to ''.
|
|
131
|
+
const beforeRef = staged ? `HEAD:${file}` : `:${file}`;
|
|
132
|
+
try {
|
|
133
|
+
before = await git.show([beforeRef]);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
before = '';
|
|
137
|
+
}
|
|
138
|
+
if (staged) {
|
|
139
|
+
try {
|
|
140
|
+
after = await git.show([`:${file}`]);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
after = '';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
try {
|
|
148
|
+
after = await fs.readFile(path.join(projectPath, file), 'utf8');
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Deleted file — working copy missing.
|
|
152
|
+
after = '';
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
98
156
|
return {
|
|
99
157
|
initialized: true,
|
|
100
|
-
|
|
158
|
+
before,
|
|
159
|
+
after,
|
|
101
160
|
file,
|
|
102
161
|
staged,
|
|
162
|
+
isBinary,
|
|
103
163
|
};
|
|
104
164
|
}
|
|
105
165
|
catch (error) {
|
|
@@ -168,12 +228,12 @@ class GitService {
|
|
|
168
228
|
}
|
|
169
229
|
async push(projectPath) {
|
|
170
230
|
const git = simpleGit(projectPath);
|
|
171
|
-
|
|
172
|
-
if (!isRepo) {
|
|
231
|
+
if (!await git.checkIsRepo()) {
|
|
173
232
|
this.throwNotInitialized();
|
|
174
233
|
}
|
|
175
234
|
try {
|
|
176
|
-
await git.
|
|
235
|
+
const { current } = await git.branch();
|
|
236
|
+
await git.push(['origin', current, '--set-upstream']);
|
|
177
237
|
}
|
|
178
238
|
catch (error) {
|
|
179
239
|
throw this.wrapError('push', error);
|
|
@@ -212,8 +272,8 @@ class GitService {
|
|
|
212
272
|
this.throwNotInitialized();
|
|
213
273
|
}
|
|
214
274
|
try {
|
|
215
|
-
const args = startPoint ? [name, startPoint] : [name];
|
|
216
|
-
await git.
|
|
275
|
+
const args = startPoint ? ['-b', name, startPoint] : ['-b', name];
|
|
276
|
+
await git.checkout(args);
|
|
217
277
|
}
|
|
218
278
|
catch (error) {
|
|
219
279
|
const msg = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,SAAS,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gitService.js","sourceRoot":"","sources":["../../src/services/gitService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Story 28.6: Harness sub-agent service.
|
|
3
|
+
*
|
|
4
|
+
* Combines three sources of `.claude/agents/*.md` files into a single flat
|
|
5
|
+
* card list (flat-only — no recursive subdirectory walk):
|
|
6
|
+
* - <projectRoot>/.claude/agents/ (project scope)
|
|
7
|
+
* - ~/.claude/agents/ (user scope)
|
|
8
|
+
* - <pluginInstallPath>/agents/ (plugin scope, read-only)
|
|
9
|
+
*
|
|
10
|
+
* Each .md file has YAML frontmatter with 4 required fields
|
|
11
|
+
* (name/description/model/color) + 1 optional 3-state `tools` field. Body is
|
|
12
|
+
* the markdown system prompt. Round-trip via `applyYamlFrontmatterPatch`
|
|
13
|
+
* (eemeli yaml — preserves comments / key order / blank lines).
|
|
14
|
+
*
|
|
15
|
+
* Differences from 28.5 (commands):
|
|
16
|
+
* - flat-only scan (no subdirectory walk)
|
|
17
|
+
* - 4 required frontmatter fields (name regex + model/color enum)
|
|
18
|
+
* - tools 3-state model (omitted vs empty vs populated) round-trip
|
|
19
|
+
* - file stem === frontmatter.name (no slash-name conversion)
|
|
20
|
+
* - no chat slash palette dedup
|
|
21
|
+
* - no BMad mirror heuristic (`.claude/agents/` has no BMad presence)
|
|
22
|
+
*/
|
|
23
|
+
import { type HarnessAgentCopyRequest, type HarnessAgentCopyResponse, type HarnessAgentCreateRequest, type HarnessAgentCreateResponse, type HarnessAgentDeleteRequest, type HarnessAgentDeleteResponse, type HarnessAgentFrontmatter, type HarnessAgentListResponse, type HarnessAgentMalformedEntry, type HarnessAgentReadResponse, type HarnessAgentSourceLocation, type HarnessAgentSourceScope, type HarnessAgentToolsState, type HarnessAgentUpdateRequest, type HarnessAgentUpdateResponse } from '@hammoc/shared';
|
|
24
|
+
/** Throws HARNESS_PARSE_ERROR with detail when name fails the regex / OS check. */
|
|
25
|
+
declare function validateAgentName(name: string): void;
|
|
26
|
+
declare function detectExampleBlock(body: string): boolean;
|
|
27
|
+
declare function detectSecretsInText(text: string): {
|
|
28
|
+
matched: boolean;
|
|
29
|
+
lines: number[];
|
|
30
|
+
};
|
|
31
|
+
interface ParsedFrontmatter {
|
|
32
|
+
frontmatter: HarnessAgentFrontmatter;
|
|
33
|
+
toolsState: HarnessAgentToolsState;
|
|
34
|
+
}
|
|
35
|
+
interface FrontmatterValidationFailure {
|
|
36
|
+
malformed: true;
|
|
37
|
+
reason: HarnessAgentMalformedEntry['reason'];
|
|
38
|
+
detail?: string;
|
|
39
|
+
}
|
|
40
|
+
type FrontmatterParseResult = ParsedFrontmatter | FrontmatterValidationFailure;
|
|
41
|
+
declare function parseAgentFrontmatter(raw: string | null, fileStem: string): FrontmatterParseResult;
|
|
42
|
+
interface SerializeOptions {
|
|
43
|
+
frontmatter: HarnessAgentFrontmatter;
|
|
44
|
+
toolsState?: HarnessAgentToolsState;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Custom YAML round-trip that preserves comments / key order / blank lines for
|
|
48
|
+
* untouched keys, and explicitly handles the tools 3-state model:
|
|
49
|
+
* - state A (omitted) → delete tools key
|
|
50
|
+
* - state B (empty) → write tools: []
|
|
51
|
+
* - state C (populated) → write tools: [...]
|
|
52
|
+
*/
|
|
53
|
+
declare function serializeAgentFrontmatter(prevRaw: string, opts: SerializeOptions): string;
|
|
54
|
+
declare class HarnessAgentService {
|
|
55
|
+
listCards(currentProjectSlug?: string): Promise<HarnessAgentListResponse>;
|
|
56
|
+
readAgent(loc: HarnessAgentSourceLocation): Promise<HarnessAgentReadResponse>;
|
|
57
|
+
createAgent(req: HarnessAgentCreateRequest): Promise<HarnessAgentCreateResponse>;
|
|
58
|
+
updateAgent(loc: HarnessAgentSourceLocation, body: HarnessAgentUpdateRequest): Promise<HarnessAgentUpdateResponse>;
|
|
59
|
+
copyAgent(req: HarnessAgentCopyRequest): Promise<HarnessAgentCopyResponse>;
|
|
60
|
+
deleteAgent(req: HarnessAgentDeleteRequest): Promise<HarnessAgentDeleteResponse>;
|
|
61
|
+
private buildEditableRef;
|
|
62
|
+
}
|
|
63
|
+
export declare function resolveAgentSourceLocation(input: {
|
|
64
|
+
scope: HarnessAgentSourceScope;
|
|
65
|
+
name: string;
|
|
66
|
+
projectSlug?: string;
|
|
67
|
+
pluginKey?: string;
|
|
68
|
+
}): Promise<HarnessAgentSourceLocation>;
|
|
69
|
+
export declare const harnessAgentInternals: {
|
|
70
|
+
detectExampleBlock: typeof detectExampleBlock;
|
|
71
|
+
detectSecretsInText: typeof detectSecretsInText;
|
|
72
|
+
parseAgentFrontmatter: typeof parseAgentFrontmatter;
|
|
73
|
+
serializeAgentFrontmatter: typeof serializeAgentFrontmatter;
|
|
74
|
+
validateAgentName: typeof validateAgentName;
|
|
75
|
+
AGENT_NAME_RE: RegExp;
|
|
76
|
+
};
|
|
77
|
+
export declare const harnessAgentService: HarnessAgentService;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=harnessAgentService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harnessAgentService.d.ts","sourceRoot":"","sources":["../../src/services/harnessAgentService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAE/B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAGhC,MAAM,gBAAgB,CAAC;AAqExB,mFAAmF;AACnF,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAwB7C;AAMD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAGhF;AAMD,UAAU,iBAAiB;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,UAAU,4BAA4B;IACpC,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,sBAAsB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC;AAE/E,iBAAS,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAwF3F;AAgaD,UAAU,gBAAgB;IACxB,WAAW,EAAE,uBAAuB,CAAC;IACrC,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAmElF;AAMD,cAAM,mBAAmB;IACjB,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA4CzE,SAAS,CAAC,GAAG,EAAE,0BAA0B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAgB7E,WAAW,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IA0DhF,WAAW,CACf,GAAG,EAAE,0BAA0B,EAC/B,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IAiHhC,SAAS,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAqF1E,WAAW,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC;YAyBxE,gBAAgB;CAuB/B;AAMD,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAGtC;AAGD,eAAO,MAAM,qBAAqB;;;;;;;CAOjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|