@yancyyu/openhermit 1.6.41 → 1.6.43
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 +98 -89
- package/bin/hermit.mjs +96 -0
- package/dist-renderer/assets/{ProjectEditorOverlay-Br0X83Jf.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-DHMTbZPZ.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-DzIiX7yH.js → _basePickBy-ZOyLWjMK.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-6hZuzTLU.js → _baseUniq-DBb726rt.js} +1 -1
- package/dist-renderer/assets/{arc-CXgO6fx_.js → arc-CdiTaR_R.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-DKWgtDHr.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-DOMUcC40.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-B_k2L7qX.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
- package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-BeD_ccFy.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-ClZfkA5w.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-5XluxXsn.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BzIjjNVm.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-HgH3MK_H.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-WeC5T3Ba.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-Cu1ApHfW.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BOhlynJM.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
- package/dist-renderer/assets/clone-CriGymY9.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DGZSihDQ.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-CnxwCbku.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-DsIhoxdI.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-Cmh9KUF5.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CKxV456A.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-EnvYjOjc.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-BmNeWY_A.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-D30fyK-u.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-CrUNiYg1.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
- package/dist-renderer/assets/{graph-CY1gTfTb.js → graph-CDP_R8ct.js} +1 -1
- package/dist-renderer/assets/{index-CaEbzwAU.js → index-BSZdT-g-.js} +1 -1
- package/dist-renderer/assets/{index-D5K-SjBG.js → index-BhWvMqsz.js} +1 -1
- package/dist-renderer/assets/{index-9_hO4N1e.js → index-C2_AupSj.js} +1 -1
- package/dist-renderer/assets/{index-59r209c1.js → index-C5ujiwAR.js} +580 -588
- package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
- package/dist-renderer/assets/{index-DMR9B1UP.js → index-CVNjLwkq.js} +1 -1
- package/dist-renderer/assets/{index-BC2hXmg_.js → index-CwG3se0q.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-By_XUlcD.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BM1LJE9m.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-DHIW3aTA.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
- package/dist-renderer/assets/{layout-DAKiL_Mo.js → layout-5nA5wUxO.js} +1 -1
- package/dist-renderer/assets/{linear-DwOaRYea.js → linear-BtF1i2qN.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-b7bJ2cha.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-DxyL9Zr2.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-CR33pHlF.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BAiSRSlh.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-C8JmDjoa.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-c1d0Wi1m.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
- package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-nT8BiH2O.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-DpoRepUA.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-C41UJeIH.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-KMjGARKN.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
- package/dist-renderer/chat-community-qr.jpg +0 -0
- package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
- package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
- package/dist-renderer/icon.png +0 -0
- package/dist-renderer/icon.rar +0 -0
- package/dist-renderer/index.html +3 -3
- package/package.json +21 -26
- package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
- package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
- package/src/features/worker-society/core/application/fakes.ts +101 -0
- package/src/features/worker-society/core/application/ports.ts +70 -0
- package/src/features/worker-society/core/domain/models/society.ts +141 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
- package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
- package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
- package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
- package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
- package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
- package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
- package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
- package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
- package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
- package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
- package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
- package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
- package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
- package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
- package/src/features/worker-society/renderer/index.ts +11 -0
- package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
- package/src/features/worker-society/renderer/societyApi.ts +144 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
- package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
- package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
- package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
- package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
- package/src/features/worker-society/renderer/societyStore.ts +146 -0
- package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
- package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
- package/src/main/ipc/extensions.ts +27 -0
- package/src/main/server.ts +1731 -539
- package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
- package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
- package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
- package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
- package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
- package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
- package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
- package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
- package/src/main/services/direct-cli/index.ts +17 -0
- package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
- package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
- package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
- package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
- package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
- package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
- package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
- package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
- package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
- package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
- package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +744 -0
- package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
- package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
- package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
- package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
- package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
- package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
- package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
- package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
- package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
- package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
- package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
- package/src/main/services/teams-mvp/index.ts +6 -0
- package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
- package/src/main/utils/toolApprovalRules.ts +151 -0
- package/src/renderer/App.tsx +24 -89
- package/src/renderer/api/httpClient.ts +132 -52
- package/src/renderer/api/providers.ts +5 -16
- package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
- package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
- package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
- package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
- package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
- package/src/renderer/components/layout/PaneContent.tsx +10 -2
- package/src/renderer/components/layout/SortableTab.tsx +4 -0
- package/src/renderer/components/layout/TabBarActions.tsx +13 -16
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
- package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
- package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
- package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
- package/src/renderer/components/settings/SettingsView.tsx +22 -13
- package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
- package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
- package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
- package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
- package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
- package/src/renderer/components/settings/components/index.ts +1 -0
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
- package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
- package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
- package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
- package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
- package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
- package/src/renderer/components/splash/splashScene.ts +6 -2
- package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
- package/src/renderer/components/tasks/TasksView.tsx +63 -37
- package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
- package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
- package/src/renderer/components/team/HarnessSelect.tsx +25 -26
- package/src/renderer/components/team/TeamDetailView.tsx +137 -153
- package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
- package/src/renderer/components/team/TeamListView.tsx +144 -30
- package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
- package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
- package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
- package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
- package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +189 -57
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
- package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
- package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
- package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
- package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
- package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
- package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
- package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
- package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
- package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
- package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
- package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
- package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
- package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
- package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
- package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
- package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
- package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
- package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
- package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
- package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
- package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
- package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
- package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
- package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
- package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
- package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
- package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
- package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
- package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
- package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
- package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
- package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
- package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
- package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
- package/src/renderer/constants/teamColors.ts +5 -5
- package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
- package/src/renderer/hooks/useMentionDetection.ts +5 -1
- package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
- package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
- package/src/renderer/index.css +19 -2
- package/src/renderer/main.tsx +7 -1
- package/src/renderer/store/index.ts +18 -1
- package/src/renderer/store/slices/extensionsSlice.ts +83 -0
- package/src/renderer/store/slices/tabSlice.ts +61 -0
- package/src/renderer/store/slices/teamSlice.ts +138 -9
- package/src/renderer/types/mention.ts +8 -0
- package/src/renderer/types/tabs.ts +3 -1
- package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
- package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
- package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
- package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
- package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
- package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
- package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
- package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
- package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
- package/src/renderer/utils/bindProjectSlug.ts +57 -0
- package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
- package/src/renderer/utils/initialRoute.ts +89 -0
- package/src/renderer/utils/leadToolActivity.ts +117 -0
- package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
- package/src/renderer/utils/mentionSuggestions.ts +1 -1
- package/src/renderer/utils/slashCommandRegistry.ts +231 -0
- package/src/renderer/utils/teamMentionDirective.ts +31 -0
- package/src/renderer/utils/workflowCommandExecution.ts +96 -0
- package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
- package/src/shared/types/api.ts +79 -4
- package/src/shared/types/ccConnect.ts +1 -0
- package/src/shared/types/extensions/api.ts +19 -0
- package/src/shared/types/extensions/capabilityPack.ts +118 -0
- package/src/shared/types/extensions/index.ts +29 -1
- package/src/shared/types/index.ts +6 -0
- package/src/shared/types/loopAssets.ts +54 -0
- package/src/shared/types/providers.ts +0 -16
- package/src/shared/types/systemManager.ts +26 -1
- package/src/shared/types/team.ts +43 -3
- package/src/shared/types/terminal.ts +2 -36
- package/src/shared/types/worker.test.ts +28 -0
- package/src/shared/types/worker.ts +3 -0
- package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
- package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
- package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
- package/src/shared/utils/claudeStreamJson.test.ts +187 -0
- package/src/shared/utils/claudeStreamJson.ts +153 -0
- package/src/shared/utils/providerLaunchArgs.ts +217 -0
- package/src/shared/utils/slashCommands.ts +10 -0
- package/src/types/node-pty.d.ts +8 -0
- package/dist-renderer/assets/channel-D0XS_akr.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-D13Ffs0U.js +0 -1
- package/dist-renderer/assets/clone-B1ZrxI1D.js +0 -1
- package/dist-renderer/assets/index-iyjkpSus.css +0 -32
- package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-Dmibmlso.js +0 -1
- package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
- package/src/renderer/components/common/TerminalPane.tsx +0 -213
- package/src/renderer/components/team/dialogs/useTeamEditForm.ts +0 -292
|
@@ -0,0 +1,744 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BuiltinWorkflowSeeder — 将内置 workflow 作为 Claude Code 自定义命令。
|
|
3
|
+
*
|
|
4
|
+
* 官方测试过的 Hermit workflow 会预安装到用户级 `~/.claude/commands/hermit/`,
|
|
5
|
+
* 成为所有团队 / cwd 可复用的 `/hermit:*` 斜杠命令。工作区级
|
|
6
|
+
* `<workspace>/.claude/commands/` 仍作为兼容路径保留。
|
|
7
|
+
*/
|
|
8
|
+
import { mkdir, readFile, writeFile, stat } from 'node:fs/promises';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
|
|
12
|
+
import { createLogger } from '@shared/utils/logger';
|
|
13
|
+
|
|
14
|
+
import type { WorkflowPromptSafety } from '@shared/types/systemManager';
|
|
15
|
+
|
|
16
|
+
const logger = createLogger('BuiltinWorkflowSeeder');
|
|
17
|
+
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Builtin workflow definitions
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
export interface BuiltinWorkflowDefinition {
|
|
23
|
+
id: string;
|
|
24
|
+
filename: string;
|
|
25
|
+
commandName: `/${string}`;
|
|
26
|
+
label: string;
|
|
27
|
+
description: string;
|
|
28
|
+
category:
|
|
29
|
+
| 'overview'
|
|
30
|
+
| 'health'
|
|
31
|
+
| 'improvement'
|
|
32
|
+
| 'usage'
|
|
33
|
+
| 'compliance'
|
|
34
|
+
| 'config'
|
|
35
|
+
| 'loop'
|
|
36
|
+
| 'connector'
|
|
37
|
+
| 'worktree'
|
|
38
|
+
| 'state'
|
|
39
|
+
| 'team';
|
|
40
|
+
safety: WorkflowPromptSafety;
|
|
41
|
+
order: number;
|
|
42
|
+
content: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const BUILTIN_WORKFLOW_MARKER = '<!-- hermit-builtin-workflow:v2-loop -->';
|
|
46
|
+
|
|
47
|
+
const READ_ONLY_SAFETY_RULES = `
|
|
48
|
+
## 安全边界
|
|
49
|
+
|
|
50
|
+
- 默认只读分析:不要修改、删除、移动、格式化、提交、推送、发布或部署任何文件。
|
|
51
|
+
- 不要运行 destructive 命令;需要命令时先说明目的,优先使用只读命令。
|
|
52
|
+
- 不要泄露 secrets、token、cookie、私钥或完整敏感路径。
|
|
53
|
+
- 如果发现需要修复的问题,只输出建议、验证步骤和可选 patch 计划,不要直接 apply。
|
|
54
|
+
- 输出报告时请标注证据来源、风险等级和下一步建议。
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const LOOP_ASSET_SCAN_SCOPE = `
|
|
58
|
+
## Loop Engineering 资产扫描范围
|
|
59
|
+
|
|
60
|
+
请优先检查这些资产是否存在、是否过期、是否冲突、是否值得沉淀成循环:
|
|
61
|
+
|
|
62
|
+
- 自动化:\`.github/workflows/\`、package scripts、cron/schedules、hooks、\`/loop\` 或 goal 类配置
|
|
63
|
+
- 工作树:\`.claude/worktrees/agent-*\`、git worktree 列表、分支/dirty 状态、陈旧 agent 工作区
|
|
64
|
+
- 技能:\`.claude/skills/\`、\`.hermit/skills/\`、\`~/.claude/skills/\` 的项目相关 skill
|
|
65
|
+
- 插件/连接器:\`.cursor/mcp.json\`、\`.claude/settings*.json\`、MCP/plugin 配置、\`src/main/services/extensions/**\`
|
|
66
|
+
- 子 Agent:\`.claude/agents/\`、team manifests、agent teams、subagent tracking
|
|
67
|
+
- 状态:\`.omc/state/\`、\`.omc/sessions/\`、reports、tasks、last-tool-error、mission/setup state
|
|
68
|
+
- 指令层:\`CLAUDE.md\`、\`AGENTS.md\`、\`.claude/commands/\`、\`workflows/\`
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
export const BUILTIN_WORKFLOWS: BuiltinWorkflowDefinition[] = [
|
|
72
|
+
{
|
|
73
|
+
id: 'loop-scan',
|
|
74
|
+
filename: 'loop-scan.md',
|
|
75
|
+
commandName: '/loop-scan',
|
|
76
|
+
label: 'Loop Scan',
|
|
77
|
+
description: '扫描自动化、工作树、技能、连接器、子 Agent 和状态资产。',
|
|
78
|
+
category: 'loop',
|
|
79
|
+
safety: 'read-only',
|
|
80
|
+
order: 5,
|
|
81
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Scan — 循环资产扫描
|
|
82
|
+
|
|
83
|
+
你是 Hermit Helm Loop 的 Loop Engineering 资产扫描员。目标不是写一次提示词,而是找出哪些资产会影响 Agent 自己循环运行。
|
|
84
|
+
|
|
85
|
+
${READ_ONLY_SAFETY_RULES}
|
|
86
|
+
|
|
87
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
88
|
+
|
|
89
|
+
## 输出
|
|
90
|
+
|
|
91
|
+
请输出一份 Loop Scan 报告:
|
|
92
|
+
|
|
93
|
+
1. Automation surface:已有心跳、定时、hooks、CI、loop/goal 入口
|
|
94
|
+
2. Commands/workflows:当前 quick commands 和 workflow 文件是否完整、重复、过期
|
|
95
|
+
3. Worktrees/subagents:并行工作区、agent worktree、脏状态、陈旧风险
|
|
96
|
+
4. Skills/plugins/connectors:技能、MCP、插件、外部工具连通性
|
|
97
|
+
5. State layer:哪些状态落盘,哪些状态缺失,哪些状态已过期
|
|
98
|
+
6. Loop opportunities:最值得产品化的 3 个循环
|
|
99
|
+
7. Human review points:哪些地方必须由工程师审查,不能自动放行
|
|
100
|
+
|
|
101
|
+
不要修改文件。只输出证据和建议。
|
|
102
|
+
`,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'daily-folder-hygiene',
|
|
106
|
+
filename: 'daily-folder-hygiene.md',
|
|
107
|
+
commandName: '/daily-folder-hygiene',
|
|
108
|
+
label: 'Daily Folder Hygiene',
|
|
109
|
+
description: '每日只读扫描工作区是否有混乱目录、临时产物、陈旧报告或脏 worktree。',
|
|
110
|
+
category: 'loop',
|
|
111
|
+
safety: 'read-only',
|
|
112
|
+
order: 8,
|
|
113
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Daily Folder Hygiene — 每日目录整洁巡检
|
|
114
|
+
|
|
115
|
+
你是 Hermit Helm Loop 的工作区整洁巡检助手。目标是每天只读扫一遍文件夹是否变乱:临时文件、重复报告、陈旧 worktree、未知状态目录、未归档产物。
|
|
116
|
+
|
|
117
|
+
${READ_ONLY_SAFETY_RULES}
|
|
118
|
+
|
|
119
|
+
## 检查范围
|
|
120
|
+
|
|
121
|
+
- 根目录、reports/、plans/、.omc/、.claude/、workflows/、临时输出目录
|
|
122
|
+
- git status、git worktree、最近修改的大文件/二进制/截图/日志
|
|
123
|
+
- 重复命名、过期 report、没有 owner 的计划文件、未清理的 agent workspace
|
|
124
|
+
|
|
125
|
+
## 输出
|
|
126
|
+
|
|
127
|
+
1. Folder hygiene:Healthy / Warning / Messy
|
|
128
|
+
2. 证据路径和原因
|
|
129
|
+
3. 可安全清理候选(只提建议,不删除)
|
|
130
|
+
4. 需要人工确认的高风险项
|
|
131
|
+
5. 明天应该继续追踪的状态
|
|
132
|
+
|
|
133
|
+
不要修改文件。只输出整理建议。
|
|
134
|
+
`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: 'daily-memory-conflict-check',
|
|
138
|
+
filename: 'daily-memory-conflict-check.md',
|
|
139
|
+
commandName: '/daily-memory-conflict-check',
|
|
140
|
+
label: 'Daily Memory Conflict Check',
|
|
141
|
+
description: '每日只读检查 CLAUDE/AGENTS/记忆/设置里的重复、过期和冲突指令。',
|
|
142
|
+
category: 'loop',
|
|
143
|
+
safety: 'read-only',
|
|
144
|
+
order: 9,
|
|
145
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Daily Memory Conflict Check — 每日记忆冲突巡检
|
|
146
|
+
|
|
147
|
+
你是 Hermit Helm Loop 的记忆一致性巡检助手。目标是每天只读检查长期指令、项目记忆、设置和状态是否互相冲突或过期。
|
|
148
|
+
|
|
149
|
+
${READ_ONLY_SAFETY_RULES}
|
|
150
|
+
|
|
151
|
+
## 检查范围
|
|
152
|
+
|
|
153
|
+
- CLAUDE.md、AGENTS.md、.claude/settings*.json、.claude/commands/
|
|
154
|
+
- 用户/项目 memory、.omc/state、reports 中反复出现的规则
|
|
155
|
+
- 相同偏好在不同层级重复、过期路径、互相矛盾的流程、安全边界冲突
|
|
156
|
+
|
|
157
|
+
## 输出
|
|
158
|
+
|
|
159
|
+
1. Conflict summary:None / Minor / Blocking
|
|
160
|
+
2. 冲突或重复的证据路径
|
|
161
|
+
3. 建议保留的唯一事实来源
|
|
162
|
+
4. 建议删除/合并/迁移的记忆项
|
|
163
|
+
5. 需要人工确认的问题
|
|
164
|
+
|
|
165
|
+
不要修改或写入 memory。只输出合并计划。
|
|
166
|
+
`,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'daily-workflow-extraction',
|
|
170
|
+
filename: 'daily-workflow-extraction.md',
|
|
171
|
+
commandName: '/daily-workflow-extraction',
|
|
172
|
+
label: 'Daily Workflow Extraction',
|
|
173
|
+
description: '每日从聊天和会话记录中提取重复 workflow,沉淀成下次可执行的 loop/skill/command。',
|
|
174
|
+
category: 'loop',
|
|
175
|
+
safety: 'read-only',
|
|
176
|
+
order: 10,
|
|
177
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Daily Workflow Extraction — 每日重复流程提取
|
|
178
|
+
|
|
179
|
+
你是 Hermit Helm Loop 的 workflow 提取助手。目标是每天只读看最近聊天、会话、任务和报告,把重复的人肉流程提取成下次可执行的 loop、skill、slash command 或 schedule。
|
|
180
|
+
|
|
181
|
+
${READ_ONLY_SAFETY_RULES}
|
|
182
|
+
|
|
183
|
+
## 检查范围
|
|
184
|
+
|
|
185
|
+
- 最近团队消息、任务看板、Claude 会话、reports、.omc/logs
|
|
186
|
+
- 重复出现的搜索步骤、验证步骤、发布步骤、排障步骤、成员分工
|
|
187
|
+
- 可以沉淀为 /command、skill、MCP recipe、schedule、team template 的流程
|
|
188
|
+
|
|
189
|
+
## 输出
|
|
190
|
+
|
|
191
|
+
1. Repeated workflows:按出现频率和价值排序
|
|
192
|
+
2. 每个 workflow 的触发条件、输入、步骤、验证门禁、停止条件
|
|
193
|
+
3. 建议沉淀位置:skill / command / schedule / team template / report
|
|
194
|
+
4. 下次可直接执行的 prompt 草案
|
|
195
|
+
5. 不应自动化、必须人工判断的边界
|
|
196
|
+
|
|
197
|
+
不要创建文件。只输出候选清单和草案。
|
|
198
|
+
`,
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: 'summary',
|
|
202
|
+
filename: 'summary.md',
|
|
203
|
+
commandName: '/summary',
|
|
204
|
+
label: 'Summary',
|
|
205
|
+
description: '生成当前工作区的 Loop Ops 摘要和下一步建议。',
|
|
206
|
+
category: 'overview',
|
|
207
|
+
safety: 'reporting',
|
|
208
|
+
order: 10,
|
|
209
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Ops Summary — 循环运维摘要
|
|
210
|
+
|
|
211
|
+
你是 Hermit Helm Loop 的 Loop Ops 摘要助手。请从 Loop Engineering 角度总结当前工作区状态:循环是否能自己找活、派活、验证、记录状态、推进下一步。
|
|
212
|
+
|
|
213
|
+
${READ_ONLY_SAFETY_RULES}
|
|
214
|
+
|
|
215
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
216
|
+
|
|
217
|
+
## 输出
|
|
218
|
+
|
|
219
|
+
请输出:
|
|
220
|
+
|
|
221
|
+
1. Overall loop readiness:Healthy / Warning / Critical
|
|
222
|
+
2. Top risks:最多 5 条,尤其关注无人值守循环风险
|
|
223
|
+
3. Active loop assets:自动化、工作树、技能、插件/连接器、子 Agent、状态
|
|
224
|
+
4. Missing loop assets:缺什么会导致循环无法持续运行
|
|
225
|
+
5. Next best action:建议下一步运行哪个命令:/loop-scan、/loop-design、/doctor、/self-improve 等
|
|
226
|
+
6. Human judgment needed:哪些结果必须人工读,不要认知投降
|
|
227
|
+
|
|
228
|
+
如适合写报告,请建议路径:\`reports/loop/loop-summary-<date>.md\`,但不要自行写入,除非用户明确要求。
|
|
229
|
+
`,
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: 'doctor',
|
|
233
|
+
filename: 'doctor.md',
|
|
234
|
+
commandName: '/doctor',
|
|
235
|
+
label: 'Doctor',
|
|
236
|
+
description: '诊断 Hermit、Claude Code、cc-connect 和 Loop runtime 健康。',
|
|
237
|
+
category: 'health',
|
|
238
|
+
safety: 'read-only',
|
|
239
|
+
order: 20,
|
|
240
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Runtime Doctor — 环境与循环运行时诊断
|
|
241
|
+
|
|
242
|
+
你是 Hermit 运维诊断助手。请检查当前环境是否适合运行长期 Agent loop。
|
|
243
|
+
|
|
244
|
+
${READ_ONLY_SAFETY_RULES}
|
|
245
|
+
|
|
246
|
+
## 基础环境
|
|
247
|
+
|
|
248
|
+
- 操作系统、内存、磁盘、文件描述符限制
|
|
249
|
+
- \`claude\` 是否可用、版本、登录状态
|
|
250
|
+
- cc-connect / Hermit 服务是否运行
|
|
251
|
+
- 当前工作区路径是否正确
|
|
252
|
+
|
|
253
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
254
|
+
|
|
255
|
+
## Loop runtime 重点诊断
|
|
256
|
+
|
|
257
|
+
- \`.claude/commands\` 是否包含 loop 相关命令,是否和 \`workflows/\` 重复
|
|
258
|
+
- \`.claude/worktrees/agent-*\` 是否过多、过旧、dirty
|
|
259
|
+
- \`.omc/state/subagent-tracking.json\` 和 \`.omc/state/last-tool-error.json\` 是否显示异常
|
|
260
|
+
- MCP/plugin/connector 配置是否存在明显缺失或 secret 风险
|
|
261
|
+
- 是否存在没有停止条件的循环、无人值守 apply、自动 commit/push/deploy 风险
|
|
262
|
+
|
|
263
|
+
## 输出
|
|
264
|
+
|
|
265
|
+
请输出诊断报告:正常项、警告项、异常项、证据路径、建议动作。不要修复问题。
|
|
266
|
+
`,
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
id: 'self-improve',
|
|
270
|
+
filename: 'self-improve.md',
|
|
271
|
+
commandName: '/self-improve',
|
|
272
|
+
label: 'Self Improve',
|
|
273
|
+
description: '从对话、任务和配置中发现可循环化的系统性改进机会。',
|
|
274
|
+
category: 'improvement',
|
|
275
|
+
safety: 'proposal-only',
|
|
276
|
+
order: 30,
|
|
277
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Self Improve — Loop Improvement Planner
|
|
278
|
+
|
|
279
|
+
你是 Hermit 的自我改进 planner。目标不是直接修文件,而是发现哪些重复操作应该变成 loop、skill、command、connector、subagent 或状态文件。
|
|
280
|
+
|
|
281
|
+
## 强制安全规则
|
|
282
|
+
|
|
283
|
+
- 默认只读:不要修改任何文件。
|
|
284
|
+
- 不要直接改 \`~/.claude/CLAUDE.md\`、\`~/.claude/settings.json\`、项目 \`CLAUDE.md\`、team 文件、commands、agents 或 workflows。
|
|
285
|
+
- 不要写 memory;只提出哪些信息值得保存,以及为什么。
|
|
286
|
+
- 不要删除文件;只提出候选清理项和风险。
|
|
287
|
+
- 不要 apply patch、commit、push、release、deploy。
|
|
288
|
+
- 如果发现需要变更,输出明确 plan:目标文件、原因、建议 diff 摘要、风险等级、验证方式。
|
|
289
|
+
|
|
290
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
291
|
+
|
|
292
|
+
## 必须寻找的改进机会
|
|
293
|
+
|
|
294
|
+
- 重复手动搜索:应变成 quick command 或 skill
|
|
295
|
+
- 重复 agent 分工:应变成 agent role 或 team template
|
|
296
|
+
- 重复连接器/MCP 配置:应变成 plugin/connector recipe
|
|
297
|
+
- 重复状态检查:应变成 state-scan 或 report loop
|
|
298
|
+
- 重复 CI/issue/commit triage:应变成自动化 loop
|
|
299
|
+
- 指令冲突:应移动到正确层级,而不是每次靠 prompt 纠正
|
|
300
|
+
|
|
301
|
+
## 输出
|
|
302
|
+
|
|
303
|
+
请输出 Loop Improvement Plan:
|
|
304
|
+
|
|
305
|
+
1. Candidate loop name
|
|
306
|
+
2. Trigger / heartbeat
|
|
307
|
+
3. Assets to scan
|
|
308
|
+
4. Agent/subagent split
|
|
309
|
+
5. Required skills/plugins/connectors
|
|
310
|
+
6. State file or board
|
|
311
|
+
7. Verification gate
|
|
312
|
+
8. Human review boundary
|
|
313
|
+
9. Implementation target and risk
|
|
314
|
+
|
|
315
|
+
本命令本身不要直接修改文件。
|
|
316
|
+
`,
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
id: 'usage-report',
|
|
320
|
+
filename: 'usage-report.md',
|
|
321
|
+
commandName: '/usage-report',
|
|
322
|
+
label: 'Usage Report',
|
|
323
|
+
description: '汇总会话、子 Agent、工作树和循环吞吐线索。',
|
|
324
|
+
category: 'usage',
|
|
325
|
+
safety: 'reporting',
|
|
326
|
+
order: 40,
|
|
327
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Usage Report — 循环吞吐报告
|
|
328
|
+
|
|
329
|
+
你是 Hermit 的循环吞吐分析助手。请分析当前工作区的 agent/session/worktree/state 使用情况,判断哪些循环花费大、停滞、重复,哪些值得自动化。
|
|
330
|
+
|
|
331
|
+
${READ_ONLY_SAFETY_RULES}
|
|
332
|
+
|
|
333
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
334
|
+
|
|
335
|
+
## 分析目标
|
|
336
|
+
|
|
337
|
+
- 活跃 session、团队、子 Agent、worktree 数量和陈旧程度
|
|
338
|
+
- 高频/重型会话、重复任务、重复失败
|
|
339
|
+
- 哪些工作已经具备 loop 化条件:输入、工具、验证、状态
|
|
340
|
+
- token/上下文使用线索(如可用)
|
|
341
|
+
|
|
342
|
+
## 输出
|
|
343
|
+
|
|
344
|
+
1. Throughput overview
|
|
345
|
+
2. Expensive/repeated sessions
|
|
346
|
+
3. Subagent fan-out and review bottlenecks
|
|
347
|
+
4. Stalled worktrees or stale states
|
|
348
|
+
5. Automation candidates
|
|
349
|
+
6. Suggested consolidation into commands/skills/state
|
|
350
|
+
|
|
351
|
+
如适合写入报告,请建议 \`reports/loop/loop-usage-<date>.md\`,但不要自行写入,除非用户明确要求。
|
|
352
|
+
`,
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
id: 'compliance-audit',
|
|
356
|
+
filename: 'compliance-audit.md',
|
|
357
|
+
commandName: '/compliance-audit',
|
|
358
|
+
label: 'Compliance Audit',
|
|
359
|
+
description: '审计循环、连接器、hooks、worktrees 中的安全风险。',
|
|
360
|
+
category: 'compliance',
|
|
361
|
+
safety: 'audit',
|
|
362
|
+
order: 50,
|
|
363
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Safety Audit — 循环安全审计
|
|
364
|
+
|
|
365
|
+
你是 Hermit 的循环安全审计助手。请只读审计当前工作区中会影响无人值守 loop 的风险。
|
|
366
|
+
|
|
367
|
+
${READ_ONLY_SAFETY_RULES}
|
|
368
|
+
|
|
369
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
370
|
+
|
|
371
|
+
## 重点风险
|
|
372
|
+
|
|
373
|
+
- destructive shell、git reset/rm、publish/deploy、自动 commit/push
|
|
374
|
+
- 没有停止条件的 loop、没有验证者的 apply loop
|
|
375
|
+
- hooks/settings 中的危险自动化
|
|
376
|
+
- MCP/plugin/connector 中的 secrets、token、私钥、宽权限
|
|
377
|
+
- commands/skills/plugins 中的 prompt injection surface
|
|
378
|
+
- 陈旧 worktree 中的敏感产物或未审查变更
|
|
379
|
+
|
|
380
|
+
## 输出
|
|
381
|
+
|
|
382
|
+
1. Overall risk level
|
|
383
|
+
2. Findings by severity
|
|
384
|
+
3. Evidence and affected paths
|
|
385
|
+
4. What not to automate
|
|
386
|
+
5. Required human review gates
|
|
387
|
+
6. Recommended containment / follow-up actions
|
|
388
|
+
|
|
389
|
+
不要修复问题;只输出审计报告和建议。
|
|
390
|
+
`,
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
id: 'memory-config-health',
|
|
394
|
+
filename: 'memory-config-health.md',
|
|
395
|
+
commandName: '/memory-config-health',
|
|
396
|
+
label: 'Memory/Config Health',
|
|
397
|
+
description: '检查 loop 相关 memory、配置、commands、skills、状态分层。',
|
|
398
|
+
category: 'config',
|
|
399
|
+
safety: 'read-only',
|
|
400
|
+
order: 60,
|
|
401
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Asset Health — 配置与状态健康检查
|
|
402
|
+
|
|
403
|
+
你是 Hermit 的 Loop Asset Health 检查助手。请只读检查当前工作区中所有影响 loop 的资产分层是否合理。
|
|
404
|
+
|
|
405
|
+
${READ_ONLY_SAFETY_RULES}
|
|
406
|
+
|
|
407
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
408
|
+
|
|
409
|
+
## 输出
|
|
410
|
+
|
|
411
|
+
请输出:
|
|
412
|
+
|
|
413
|
+
1. Command/workflow inventory
|
|
414
|
+
2. Skill inventory
|
|
415
|
+
3. MCP/plugin/connector inventory
|
|
416
|
+
4. Subagent/worktree inventory
|
|
417
|
+
5. State inventory
|
|
418
|
+
6. Missing quick commands or skills
|
|
419
|
+
7. Stale/duplicated/conflicting assets
|
|
420
|
+
8. Suggested merge/move/add plan
|
|
421
|
+
9. Verification checklist
|
|
422
|
+
|
|
423
|
+
不要直接修改配置;只提出建议。
|
|
424
|
+
`,
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
id: 'loop-design',
|
|
428
|
+
filename: 'loop-design.md',
|
|
429
|
+
commandName: '/loop-design',
|
|
430
|
+
label: 'Loop Design',
|
|
431
|
+
description: '根据现有资产设计一个可运行、可验证、可恢复的 Agent 循环。',
|
|
432
|
+
category: 'loop',
|
|
433
|
+
safety: 'proposal-only',
|
|
434
|
+
order: 70,
|
|
435
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Loop Design — 循环设计
|
|
436
|
+
|
|
437
|
+
你是 Loop Engineering 设计师。请基于当前工作区资产设计一个最小可用循环,而不是直接执行改动。
|
|
438
|
+
|
|
439
|
+
${READ_ONLY_SAFETY_RULES}
|
|
440
|
+
|
|
441
|
+
${LOOP_ASSET_SCAN_SCOPE}
|
|
442
|
+
|
|
443
|
+
## 输出模板
|
|
444
|
+
|
|
445
|
+
1. Loop name
|
|
446
|
+
2. Goal and stop condition
|
|
447
|
+
3. Heartbeat:manual / /loop / cron / CI / hook
|
|
448
|
+
4. Input sources:issues、CI、logs、state、reports、files
|
|
449
|
+
5. Work allocation:worktree strategy and subagent roles
|
|
450
|
+
6. Skills/plugins/connectors required
|
|
451
|
+
7. State file / board:循环如何跨 run 记忆
|
|
452
|
+
8. Verification gate:独立 verifier 怎么判断完成
|
|
453
|
+
9. Human review boundary:哪些必须人工读
|
|
454
|
+
10. Token budget and throttling
|
|
455
|
+
11. Failure modes and rollback
|
|
456
|
+
|
|
457
|
+
只输出设计,不创建文件。
|
|
458
|
+
`,
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
id: 'connector-scan',
|
|
462
|
+
filename: 'connector-scan.md',
|
|
463
|
+
commandName: '/connector-scan',
|
|
464
|
+
label: 'Connector Scan',
|
|
465
|
+
description: '扫描 MCP、插件、连接器和外部工具配置。',
|
|
466
|
+
category: 'connector',
|
|
467
|
+
safety: 'audit',
|
|
468
|
+
order: 80,
|
|
469
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Connector Scan — 插件与连接器扫描
|
|
470
|
+
|
|
471
|
+
你是连接器审计助手。请只读扫描当前工作区和用户环境中与 MCP、插件、外部工具连接相关的配置。
|
|
472
|
+
|
|
473
|
+
${READ_ONLY_SAFETY_RULES}
|
|
474
|
+
|
|
475
|
+
## 扫描范围
|
|
476
|
+
|
|
477
|
+
- \`.cursor/mcp.json\`
|
|
478
|
+
- \`.claude/settings*.json\`
|
|
479
|
+
- \`~/.claude/plugins/installed_plugins.json\` 如存在
|
|
480
|
+
- \`src/main/services/extensions/**\`
|
|
481
|
+
- 任何提到 MCP、plugin、connector、server、token、headers、env 的配置
|
|
482
|
+
|
|
483
|
+
## 输出
|
|
484
|
+
|
|
485
|
+
1. MCP servers discovered
|
|
486
|
+
2. Plugin/connector assets
|
|
487
|
+
3. Missing credentials or unsafe credentials handling
|
|
488
|
+
4. Tools available to loops
|
|
489
|
+
5. Prompt injection / over-permission risks
|
|
490
|
+
6. Recommended connector recipes to productize
|
|
491
|
+
|
|
492
|
+
不要打印 secrets 的值。
|
|
493
|
+
`,
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
id: 'worktree-scan',
|
|
497
|
+
filename: 'worktree-scan.md',
|
|
498
|
+
commandName: '/worktree-scan',
|
|
499
|
+
label: 'Worktree Scan',
|
|
500
|
+
description: '扫描 agent worktrees、并行工作区、脏状态和清理候选。',
|
|
501
|
+
category: 'worktree',
|
|
502
|
+
safety: 'read-only',
|
|
503
|
+
order: 90,
|
|
504
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Worktree Scan — 并行工作区扫描
|
|
505
|
+
|
|
506
|
+
你是 worktree 运维助手。请只读扫描当前 repo 的 git worktree 和 \`.claude/worktrees/agent-*\`。
|
|
507
|
+
|
|
508
|
+
${READ_ONLY_SAFETY_RULES}
|
|
509
|
+
|
|
510
|
+
## 检查
|
|
511
|
+
|
|
512
|
+
- git worktree list
|
|
513
|
+
- 每个 worktree 的 branch、HEAD、dirty 状态
|
|
514
|
+
- 是否存在陈旧 agent worktree
|
|
515
|
+
- 是否存在和主工作区冲突的改动
|
|
516
|
+
- 是否有未审查的大范围变更
|
|
517
|
+
- 是否有可清理候选,但不要删除
|
|
518
|
+
|
|
519
|
+
## 输出
|
|
520
|
+
|
|
521
|
+
1. Worktree inventory
|
|
522
|
+
2. Active vs stale
|
|
523
|
+
3. Dirty or risky worktrees
|
|
524
|
+
4. Review bottleneck
|
|
525
|
+
5. Cleanup candidates with evidence
|
|
526
|
+
6. Recommended next action
|
|
527
|
+
`,
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
id: 'state-scan',
|
|
531
|
+
filename: 'state-scan.md',
|
|
532
|
+
commandName: '/state-scan',
|
|
533
|
+
label: 'State Scan',
|
|
534
|
+
description: '扫描 .omc/state、sessions、reports 和 loop 可恢复状态。',
|
|
535
|
+
category: 'state',
|
|
536
|
+
safety: 'read-only',
|
|
537
|
+
order: 100,
|
|
538
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# State Scan — 循环状态扫描
|
|
539
|
+
|
|
540
|
+
你是状态层审计助手。长期 loop 不能依赖单次上下文,必须把状态写在磁盘、看板或报告里。请只读扫描当前工作区状态资产。
|
|
541
|
+
|
|
542
|
+
${READ_ONLY_SAFETY_RULES}
|
|
543
|
+
|
|
544
|
+
## 扫描范围
|
|
545
|
+
|
|
546
|
+
- \`.omc/state/mission-state.json\`
|
|
547
|
+
- \`.omc/state/subagent-tracking.json\`
|
|
548
|
+
- \`.omc/state/setup-state.json\`
|
|
549
|
+
- \`.omc/state/last-tool-error.json\`
|
|
550
|
+
- \`.omc/sessions/\`
|
|
551
|
+
- reports、tasks、TODO、workflow 输出
|
|
552
|
+
- 任何记录下一步、失败、阻塞、验证状态的文件
|
|
553
|
+
|
|
554
|
+
## 输出
|
|
555
|
+
|
|
556
|
+
1. State inventory
|
|
557
|
+
2. Fresh vs stale state
|
|
558
|
+
3. Last error / blockers
|
|
559
|
+
4. Missing persistent state for known loops
|
|
560
|
+
5. Suggested state file shape
|
|
561
|
+
6. What should go to Linear/board/report instead of prompt context
|
|
562
|
+
|
|
563
|
+
不要修改状态文件。
|
|
564
|
+
`,
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
id: 'create-team',
|
|
568
|
+
filename: 'create-team.md',
|
|
569
|
+
commandName: '/create-team',
|
|
570
|
+
label: 'Create Team',
|
|
571
|
+
description: '通过 Hermit HTTP API 快速创建(provision)一个团队,不自动启动 agent。',
|
|
572
|
+
category: 'team',
|
|
573
|
+
safety: 'apply',
|
|
574
|
+
order: 110,
|
|
575
|
+
content: `${BUILTIN_WORKFLOW_MARKER}\n# Create Team — 创建团队
|
|
576
|
+
|
|
577
|
+
你是 Hermit 团队创建助手。目标是通过本地 Hermit HTTP API 快速创建(provision)一个团队目录与清单,让用户马上能在看板里看到并管理它。
|
|
578
|
+
|
|
579
|
+
## 安全边界
|
|
580
|
+
|
|
581
|
+
- 这是 \`apply\` 级别命令:可以调用 Hermit API 创建团队,但只做"创建/登记",不做破坏性操作。
|
|
582
|
+
- 不要自动启动团队 agent:启动 agent 会拉起真实 CLI 进程并在目标 workDir 写代码,必须由用户显式触发(UI 点"启动"或单独命令),本命令不要替用户启动。
|
|
583
|
+
- 不要覆盖或删除已有团队;遇到重复 bindProject(HTTP 409)如实回报,不要强制重写。
|
|
584
|
+
- 创建前先只读确认 workDir 真实存在且是预期目录(\`test -d\`);不要把敏感或无关目录设为 workDir,也不要在本命令里创建或改动 workDir 里的文件。
|
|
585
|
+
- 不要泄露 secrets/token。
|
|
586
|
+
|
|
587
|
+
## 参数
|
|
588
|
+
|
|
589
|
+
从用户的 \`$ARGUMENTS\` 解析,缺失则向用户询问,不要瞎猜:
|
|
590
|
+
|
|
591
|
+
- **bindProject**(必填):团队唯一标识,slug 规则 \`^[a-z0-9][a-z0-9_-]*$\`(小写字母/数字/连字符/下划线,字母或数字开头)。例如 \`payment-svc\`。
|
|
592
|
+
- **displayName**(必填):人类可读团队名。例如 "支付服务团队"。
|
|
593
|
+
- **workDir**(必填):团队工作目录绝对路径,支持 \`~\`。例如 \`~/code/payment-svc\`。
|
|
594
|
+
- **harness**(可选,默认 \`claudecode\`):运行时。可选如 \`claudecode\` \`codex\` \`cursor\` \`gemini\` \`opencode\` \`kimi\` \`iflow\` 等。
|
|
595
|
+
- **color**、**description**(可选):团队颜色与描述。
|
|
596
|
+
|
|
597
|
+
## 步骤
|
|
598
|
+
|
|
599
|
+
1. 确认四个必填参数;bindProject 必须匹配 slug 正则,否则提示用户改名。
|
|
600
|
+
2. 只读确认 workDir 存在:\`test -d "$workDir" && echo ok\`。不存在则告知用户并停下,不要自动建目录。
|
|
601
|
+
3. 调用 Hermit API 创建团队(默认本地端口 5680,可用 \`HERMIT_API_URL\` 覆盖):\`curl -s -X POST "\${HERMIT_API_URL:-http://127.0.0.1:5680}/api/teams/create" -H 'Content-Type: application/json' -d '{"bindProject":"<bindProject>","displayName":"<displayName>","workDir":"<workDir>","harness":"<harness>","color":"<color>","description":"<description>"}'\`
|
|
602
|
+
4. 解析响应:
|
|
603
|
+
- 成功返回 \`{ "runId": "local:<bindProject>:<ts>" }\` → 团队已创建,可在 Hermit "团队" 看板看到。
|
|
604
|
+
- HTTP 400 → 参数缺失或 bindProject 不合法,按提示修正后重试。
|
|
605
|
+
- HTTP 409 → bindProject 已被其他团队占用,提示用户改名。
|
|
606
|
+
- 连接被拒(端口没起)→ 提示用户先启动 Hermit 服务(web 模式或 Electron 应用)。
|
|
607
|
+
|
|
608
|
+
## 输出
|
|
609
|
+
|
|
610
|
+
1. 创建结果(runId / 成功)或具体错误与修复建议。
|
|
611
|
+
2. 下一步提示:团队已在看板可见;如需启动 agent,请在 UI 点"启动"或单独发起,本命令不自动启动。
|
|
612
|
+
|
|
613
|
+
不要在本命令里启动 agent,也不要改动 workDir 里的文件。
|
|
614
|
+
`,
|
|
615
|
+
},
|
|
616
|
+
];
|
|
617
|
+
|
|
618
|
+
const BUILTIN_BY_FILENAME = new Map(BUILTIN_WORKFLOWS.map((item) => [item.filename, item]));
|
|
619
|
+
const BUILTIN_BY_COMMAND = new Map<string, BuiltinWorkflowDefinition>(
|
|
620
|
+
BUILTIN_WORKFLOWS.map((item) => [item.commandName, item])
|
|
621
|
+
);
|
|
622
|
+
// ---------------------------------------------------------------------------
|
|
623
|
+
// Public API
|
|
624
|
+
// ---------------------------------------------------------------------------
|
|
625
|
+
|
|
626
|
+
function hermitHome(): string {
|
|
627
|
+
return process.env.HERMIT_HOME || path.join(os.homedir(), '.hermit');
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function globalClaudeCommandsRoot(): string {
|
|
631
|
+
return path.join(os.homedir(), '.claude', 'commands');
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
export function getGlobalHermitWorkflowDir(commandsRoot = globalClaudeCommandsRoot()): string {
|
|
635
|
+
return path.join(commandsRoot, 'hermit');
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
export function listBuiltinWorkflowMetadata(): BuiltinWorkflowDefinition[] {
|
|
639
|
+
return [...BUILTIN_WORKFLOWS];
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
export function getBuiltinWorkflowByFilename(
|
|
643
|
+
filename: string
|
|
644
|
+
): BuiltinWorkflowDefinition | undefined {
|
|
645
|
+
return BUILTIN_BY_FILENAME.get(path.basename(filename));
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
export function getBuiltinWorkflowByCommand(
|
|
649
|
+
commandName: string
|
|
650
|
+
): BuiltinWorkflowDefinition | undefined {
|
|
651
|
+
return BUILTIN_BY_COMMAND.get(commandName.trim());
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
function shouldRefreshBuiltinWorkflow(
|
|
655
|
+
existingContent: string,
|
|
656
|
+
workflow: BuiltinWorkflowDefinition
|
|
657
|
+
): boolean {
|
|
658
|
+
if (existingContent.includes(BUILTIN_WORKFLOW_MARKER))
|
|
659
|
+
return existingContent !== workflow.content;
|
|
660
|
+
const oldBuiltinHeadings: Record<string, string[]> = {
|
|
661
|
+
'summary.md': ['# Ops Summary — 运维摘要'],
|
|
662
|
+
'doctor.md': ['# Hermit Doctor — 环境诊断'],
|
|
663
|
+
'self-improve.md': ['# Self Improve — 自我改进分析'],
|
|
664
|
+
'usage-report.md': ['# Usage Report — 用量报告'],
|
|
665
|
+
'compliance-audit.md': ['# Compliance Audit — 合规风险审计'],
|
|
666
|
+
'memory-config-health.md': ['# Memory / Config Health — 配置健康检查'],
|
|
667
|
+
};
|
|
668
|
+
return (
|
|
669
|
+
oldBuiltinHeadings[workflow.filename]?.some((heading) => existingContent.includes(heading)) ??
|
|
670
|
+
false
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* 将内置命令文件复制到工作空间的 .claude/commands/ 目录。
|
|
676
|
+
* 如果已存在同名文件则跳过(尊重用户自定义)。
|
|
677
|
+
*
|
|
678
|
+
* @param workspaceDir 工作空间根目录
|
|
679
|
+
* @returns 实际复制的文件数量
|
|
680
|
+
*/
|
|
681
|
+
async function seedBuiltinWorkflowsIntoDir(targetDir: string): Promise<number> {
|
|
682
|
+
let copied = 0;
|
|
683
|
+
await mkdir(targetDir, { recursive: true });
|
|
684
|
+
|
|
685
|
+
for (const workflow of BUILTIN_WORKFLOWS) {
|
|
686
|
+
const targetPath = path.join(targetDir, workflow.filename);
|
|
687
|
+
const exists = await stat(targetPath)
|
|
688
|
+
.then(() => true)
|
|
689
|
+
.catch(() => false);
|
|
690
|
+
if (exists) {
|
|
691
|
+
const existingContent = await readFile(targetPath, 'utf-8').catch(() => '');
|
|
692
|
+
if (!shouldRefreshBuiltinWorkflow(existingContent, workflow)) continue;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
await writeFile(targetPath, workflow.content, 'utf-8');
|
|
696
|
+
copied++;
|
|
697
|
+
logger.info(
|
|
698
|
+
`${exists ? 'refreshed' : 'seeded'} builtin workflow: ${workflow.filename} → ${targetPath}`
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
return copied;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
export async function seedBuiltinWorkflows(workspaceDir: string): Promise<number> {
|
|
705
|
+
try {
|
|
706
|
+
return await seedBuiltinWorkflowsIntoDir(path.join(workspaceDir, '.claude', 'commands'));
|
|
707
|
+
} catch (err) {
|
|
708
|
+
logger.warn('failed to seed builtin workflows:', err instanceof Error ? err.message : err);
|
|
709
|
+
return 0;
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
export async function seedGlobalHermitWorkflows(
|
|
714
|
+
commandsRoot = globalClaudeCommandsRoot()
|
|
715
|
+
): Promise<number> {
|
|
716
|
+
try {
|
|
717
|
+
return await seedBuiltinWorkflowsIntoDir(getGlobalHermitWorkflowDir(commandsRoot));
|
|
718
|
+
} catch (err) {
|
|
719
|
+
logger.warn(
|
|
720
|
+
'failed to seed global Hermit workflows:',
|
|
721
|
+
err instanceof Error ? err.message : err
|
|
722
|
+
);
|
|
723
|
+
return 0;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* Ensure ~/.hermit/.claude/commands/ has the builtin commands.
|
|
729
|
+
* Called once at app startup as fallback.
|
|
730
|
+
*/
|
|
731
|
+
export async function ensureGlobalWorkflows(): Promise<void> {
|
|
732
|
+
const [globalCopied, legacyCopied] = await Promise.all([
|
|
733
|
+
seedGlobalHermitWorkflows(),
|
|
734
|
+
seedBuiltinWorkflows(hermitHome()),
|
|
735
|
+
]);
|
|
736
|
+
if (globalCopied > 0) {
|
|
737
|
+
logger.info(`seeded ${globalCopied} Hermit command(s) to ${getGlobalHermitWorkflowDir()}`);
|
|
738
|
+
}
|
|
739
|
+
if (legacyCopied > 0) {
|
|
740
|
+
logger.info(
|
|
741
|
+
`seeded ${legacyCopied} legacy builtin command(s) to ${path.join(hermitHome(), '.claude', 'commands')}`
|
|
742
|
+
);
|
|
743
|
+
}
|
|
744
|
+
}
|