@yancyyu/openhermit 1.6.42 → 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.
Files changed (281) hide show
  1. package/README.md +98 -89
  2. package/bin/hermit.mjs +96 -0
  3. package/dist-renderer/assets/{ProjectEditorOverlay-DlFQ6mai.js → ProjectEditorOverlay-C98qSs7-.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-D2TPMPGR.js → TeamGraphOverlay-CsBbZwcL.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-Cmd0RHLQ.js → _basePickBy-ZOyLWjMK.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-BI_iy8ea.js → _baseUniq-DBb726rt.js} +1 -1
  7. package/dist-renderer/assets/{arc-NzW2mjTP.js → arc-CdiTaR_R.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Bzq85AYv.js → architectureDiagram-VXUJARFQ-Cz3sc5TH.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-D1PvYS-b.js → blockDiagram-VD42YOAC-DE4c-KJ3.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-D49RKzPC.js → c4Diagram-YG6GDRKO-CmTMDTrV.js} +1 -1
  11. package/dist-renderer/assets/channel-KTpqi9eT.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-fmI_MQmQ.js → chunk-4BX2VUAB-rhHy3tFl.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-Xsv9RCXZ.js → chunk-55IACEB6-fLZBzuo_.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-BE1KO8Um.js → chunk-B4BG7PRW-DOzxQhim.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-tqJ7Mv7f.js → chunk-DI55MBZ5-COQCcXC5.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-DMD45MVJ.js → chunk-FMBD7UC4-IKU9U_Y4.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-DOhGrz-q.js → chunk-QN33PNHL-D6WV154X.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-D8yDgJdD.js → chunk-QZHKN3VN-D90_2DQp.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-BcsEDu7A.js → chunk-TZMSLE5B-BQEil57G.js} +1 -1
  20. package/dist-renderer/assets/classDiagram-2ON5EDUG-lpzulY5X.js +1 -0
  21. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-lpzulY5X.js +1 -0
  22. package/dist-renderer/assets/clone-CriGymY9.js +1 -0
  23. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-DlSqGHMX.js → cose-bilkent-S5V4N54A-6WiK6U2P.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-BTT9tSAx.js → dagre-6UL2VRFP-DF4MMuTn.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-Du-U-mK2.js → diagram-PSM6KHXK-CcF1eZ7E.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-jFdHeKas.js → diagram-QEK2KX5R-DYlOVPQB.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-DKLNK2bu.js → diagram-S2PKOQOG-BHXWsZOP.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-CZxHgIIo.js → erDiagram-Q2GNP2WA-GjmuBx8d.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-v4XStCD0.js → flowDiagram-NV44I4VS-BuS7YVHk.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DJjD_BEL.js → ganttDiagram-JELNMOA3-3Teu5tAa.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-BNy-jr03.js → gitGraphDiagram-V2S2FVAM-BiLdCYu5.js} +1 -1
  32. package/dist-renderer/assets/{graph-DDTrn6je.js → graph-CDP_R8ct.js} +1 -1
  33. package/dist-renderer/assets/{index-BBp78BAu.js → index-BSZdT-g-.js} +1 -1
  34. package/dist-renderer/assets/{index-eotrJaYy.js → index-BhWvMqsz.js} +1 -1
  35. package/dist-renderer/assets/{index-D8_B-cfs.js → index-C2_AupSj.js} +1 -1
  36. package/dist-renderer/assets/{index-BQrwHZ-k.js → index-C5ujiwAR.js} +580 -588
  37. package/dist-renderer/assets/index-CIS2CTK9.css +1 -0
  38. package/dist-renderer/assets/{index-CRKQSG9S.js → index-CVNjLwkq.js} +1 -1
  39. package/dist-renderer/assets/{index-DR6Wz52b.js → index-CwG3se0q.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DqnOsuza.js → infoDiagram-HS3SLOUP-DLHUFo72.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-DTobaO1d.js → journeyDiagram-XKPGCS4Q-BE07RpJD.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-HbwVOvWc.js → kanban-definition-3W4ZIXB7-DDHZy4NB.js} +1 -1
  43. package/dist-renderer/assets/{layout--VYmTcw2.js → layout-5nA5wUxO.js} +1 -1
  44. package/dist-renderer/assets/{linear-BsJh89Mr.js → linear-BtF1i2qN.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BZqUZePd.js → mindmap-definition-VGOIOE7T-Z1Ui9Sqy.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-B1q_nH6P.js → pieDiagram-ADFJNKIX-LCjxckWv.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-UD8QhSEu.js → quadrantDiagram-AYHSOK5B-BOwKjSco.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-BA_i7Nw8.js → requirementDiagram-UZGBJVZJ-pChP8Znd.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-CMTnX-2d.js → sankeyDiagram-TZEHDZUN-DifZ2qpo.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BQXDB615.js → sequenceDiagram-WL72ISMW-CJg-WYyY.js} +1 -1
  51. package/dist-renderer/assets/{splashScene-D0YB9uxm.js → splashScene-94xWCzLA.js} +1 -1
  52. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-BAsPXy6X.js → stateDiagram-FKZM4ZOC-DWHOoFdv.js} +1 -1
  53. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-CGYZOoMb.js +1 -0
  54. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BdasmVkC.js → timeline-definition-IT6M3QCI-CPgokIo8.js} +1 -1
  55. package/dist-renderer/assets/{treemap-GDKQZRPO-BkKQqIui.js → treemap-GDKQZRPO-DAVqSR9L.js} +1 -1
  56. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-EAlPHOdx.js → xychartDiagram-PRI3JC2R-CCOcGbrD.js} +1 -1
  57. package/dist-renderer/chat-community-qr.jpg +0 -0
  58. package/dist-renderer/fonts/Agave-Bold.ttf +0 -0
  59. package/dist-renderer/fonts/Agave-Regular.ttf +0 -0
  60. package/dist-renderer/icon.png +0 -0
  61. package/dist-renderer/icon.rar +0 -0
  62. package/dist-renderer/index.html +3 -3
  63. package/package.json +21 -26
  64. package/src/features/worker-society/core/application/WorkerSocietyService.test.ts +802 -0
  65. package/src/features/worker-society/core/application/WorkerSocietyService.ts +428 -0
  66. package/src/features/worker-society/core/application/fakes.ts +101 -0
  67. package/src/features/worker-society/core/application/ports.ts +70 -0
  68. package/src/features/worker-society/core/domain/models/society.ts +141 -0
  69. package/src/features/worker-society/core/domain/policies/societyPolicies.test.ts +739 -0
  70. package/src/features/worker-society/core/domain/policies/societyPolicies.ts +496 -0
  71. package/src/features/worker-society/main/adapters/input/societyMcp.test.ts +317 -0
  72. package/src/features/worker-society/main/adapters/input/societyMcp.ts +257 -0
  73. package/src/features/worker-society/main/adapters/input/societyRoutes.test.ts +695 -0
  74. package/src/features/worker-society/main/adapters/input/societyRoutes.ts +194 -0
  75. package/src/features/worker-society/main/composition/societyComposition.test.ts +74 -0
  76. package/src/features/worker-society/main/composition/societyComposition.ts +70 -0
  77. package/src/features/worker-society/main/composition/workerSocietyPlugin.test.ts +69 -0
  78. package/src/features/worker-society/main/composition/workerSocietyPlugin.ts +67 -0
  79. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.test.ts +132 -0
  80. package/src/features/worker-society/main/infrastructure/crossTeamMessageGateway.ts +84 -0
  81. package/src/features/worker-society/main/infrastructure/fsStores.test.ts +216 -0
  82. package/src/features/worker-society/main/infrastructure/fsStores.ts +113 -0
  83. package/src/features/worker-society/main/infrastructure/mergingProfileStore.test.ts +195 -0
  84. package/src/features/worker-society/main/infrastructure/mergingProfileStore.ts +96 -0
  85. package/src/features/worker-society/renderer/SocietyGraph.tsx +166 -0
  86. package/src/features/worker-society/renderer/SocietyNodeLabels.tsx +139 -0
  87. package/src/features/worker-society/renderer/SocietyNodeOverlay.tsx +339 -0
  88. package/src/features/worker-society/renderer/SocietyView.tsx +437 -0
  89. package/src/features/worker-society/renderer/index.ts +11 -0
  90. package/src/features/worker-society/renderer/societyApi.test.ts +259 -0
  91. package/src/features/worker-society/renderer/societyApi.ts +144 -0
  92. package/src/features/worker-society/renderer/societyGraphAdapter.test.ts +321 -0
  93. package/src/features/worker-society/renderer/societyGraphAdapter.ts +240 -0
  94. package/src/features/worker-society/renderer/societyOverlayActions.test.ts +57 -0
  95. package/src/features/worker-society/renderer/societyOverlayActions.ts +49 -0
  96. package/src/features/worker-society/renderer/societyStore.test.ts +218 -0
  97. package/src/features/worker-society/renderer/societyStore.ts +146 -0
  98. package/src/features/worker-society/renderer/societyViewUtils.test.ts +81 -0
  99. package/src/features/worker-society/renderer/societyViewUtils.ts +68 -0
  100. package/src/main/ipc/extensions.ts +27 -0
  101. package/src/main/server.ts +1709 -534
  102. package/src/main/services/ccConnect/CcConnectBridge.ts +26 -11
  103. package/src/main/services/ccConnect/CcConnectClient.ts +9 -2
  104. package/src/main/services/ccConnect/workDirReconcile.test.ts +57 -0
  105. package/src/main/services/ccConnect/workDirReconcile.ts +36 -0
  106. package/src/main/services/direct-cli/DirectCliSessionManager.test.ts +397 -0
  107. package/src/main/services/direct-cli/DirectCliSessionManager.ts +508 -0
  108. package/src/main/services/direct-cli/DirectCliSessionStore.test.ts +79 -0
  109. package/src/main/services/direct-cli/DirectCliSessionStore.ts +97 -0
  110. package/src/main/services/direct-cli/__tests__/directCliMessageId.test.ts +40 -0
  111. package/src/main/services/direct-cli/directCliMessageId.ts +21 -0
  112. package/src/main/services/direct-cli/index.ts +17 -0
  113. package/src/main/services/extensions/capability-packs/CapabilityPackLoaderService.ts +637 -0
  114. package/src/main/services/extensions/catalog/PluginCatalogService.ts +2 -2
  115. package/src/main/services/loop-assets/LoopAssetsScannerService.ts +657 -0
  116. package/src/main/services/runtime/providerAwareCliEnv.ts +33 -5
  117. package/src/main/services/session-intelligence/LocalSessionScanner.ts +156 -71
  118. package/src/main/services/session-intelligence/SessionUsageParser.ts +103 -8
  119. package/src/main/services/session-intelligence/UsageTelemetryService.ts +11 -0
  120. package/src/main/services/session-intelligence/__tests__/teamSessionListMapper.test.ts +104 -0
  121. package/src/main/services/session-intelligence/teamSessionListMapper.ts +78 -0
  122. package/src/main/services/system-manager/AdminLoopInitializer.ts +95 -0
  123. package/src/main/services/system-manager/BuiltinWorkflowSeeder.ts +679 -74
  124. package/src/main/services/system-manager/SystemManagerConfigService.ts +19 -1
  125. package/src/main/services/system-manager/WorkflowPromptService.ts +58 -5
  126. package/src/main/services/system-manager/__tests__/AdminLoopInitializer.test.ts +129 -0
  127. package/src/main/services/system-manager/__tests__/SystemManagerConfigService.test.ts +60 -0
  128. package/src/main/services/teams-mvp/CollaborationBoardService.ts +2 -0
  129. package/src/main/services/teams-mvp/OpsRunbookContext.ts +60 -0
  130. package/src/main/services/teams-mvp/TaskDispatchService.test.ts +305 -0
  131. package/src/main/services/teams-mvp/TaskDispatchService.ts +250 -131
  132. package/src/main/services/teams-mvp/TeamProvisioningService.ts +12 -2
  133. package/src/main/services/teams-mvp/TeamWorkspaceService.test.ts +207 -0
  134. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +104 -51
  135. package/src/main/services/teams-mvp/index.ts +6 -0
  136. package/src/main/utils/externalPlatformSessionRouting.ts +92 -0
  137. package/src/main/utils/toolApprovalRules.ts +151 -0
  138. package/src/renderer/App.tsx +24 -89
  139. package/src/renderer/api/httpClient.ts +115 -37
  140. package/src/renderer/api/providers.ts +5 -16
  141. package/src/renderer/components/chat/CommunityChatView.tsx +81 -0
  142. package/src/renderer/components/dashboard/DashboardView.tsx +130 -84
  143. package/src/renderer/components/extensions/ExtensionStoreView.tsx +39 -5
  144. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +2 -1
  145. package/src/renderer/components/extensions/capability-packs/CapabilityPacksPanel.tsx +170 -0
  146. package/src/renderer/components/layout/PaneContent.tsx +10 -2
  147. package/src/renderer/components/layout/SortableTab.tsx +4 -0
  148. package/src/renderer/components/layout/TabBarActions.tsx +13 -16
  149. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +4 -135
  150. package/src/renderer/components/schedules/SchedulesView.tsx +22 -14
  151. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +7 -6
  152. package/src/renderer/components/settings/SettingsTabs.tsx +24 -21
  153. package/src/renderer/components/settings/SettingsView.tsx +22 -13
  154. package/src/renderer/components/settings/components/SettingRow.tsx +13 -5
  155. package/src/renderer/components/settings/components/SettingsSectionCard.tsx +53 -0
  156. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +10 -6
  157. package/src/renderer/components/settings/components/SettingsSelect.tsx +12 -9
  158. package/src/renderer/components/settings/components/SettingsToggle.tsx +6 -5
  159. package/src/renderer/components/settings/components/index.ts +1 -0
  160. package/src/renderer/components/settings/sections/AdvancedSection.tsx +78 -59
  161. package/src/renderer/components/settings/sections/CliStatusSection.tsx +32 -44
  162. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  163. package/src/renderer/components/settings/sections/GeneralSection.tsx +216 -186
  164. package/src/renderer/components/settings/sections/PlatformsSection.tsx +25 -17
  165. package/src/renderer/components/settings/sections/TaskBusSection.tsx +63 -22
  166. package/src/renderer/components/sidebar/SidebarSessions.tsx +120 -80
  167. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +1 -1
  168. package/src/renderer/components/splash/splashScene.ts +6 -2
  169. package/src/renderer/components/system-manager/SystemManagerView.tsx +169 -255
  170. package/src/renderer/components/tasks/TasksView.tsx +63 -37
  171. package/src/renderer/components/team/CcSessionsSection.tsx +124 -89
  172. package/src/renderer/components/team/HarnessBrandLogos.tsx +318 -0
  173. package/src/renderer/components/team/HarnessSelect.tsx +25 -26
  174. package/src/renderer/components/team/TeamDetailView.tsx +137 -153
  175. package/src/renderer/components/team/TeamEmptyState.tsx +9 -37
  176. package/src/renderer/components/team/TeamListView.tsx +143 -30
  177. package/src/renderer/components/team/__tests__/CcSessionsSection.hasLocalFile.test.tsx +128 -0
  178. package/src/renderer/components/team/activity/ActivityItem.tsx +21 -9
  179. package/src/renderer/components/team/activity/ActivityTimeline.tsx +2 -2
  180. package/src/renderer/components/team/dialogs/AdvancedCliSection.tsx +1 -1
  181. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +13 -10
  182. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +156 -83
  183. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -157
  184. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +19 -15
  185. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +48 -10
  186. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +11 -12
  187. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +39 -37
  188. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +434 -64
  189. package/src/renderer/components/team/dialogs/SendMessageDialog.tsx +12 -10
  190. package/src/renderer/components/team/dialogs/TaskDetailDialog.tsx +2 -2
  191. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.bindProject.test.tsx +399 -0
  192. package/src/renderer/components/team/dialogs/__tests__/CreateTeamDialog.chineseRepro.test.tsx +253 -0
  193. package/src/renderer/components/team/dialogs/platformAllowUtils.ts +91 -0
  194. package/src/renderer/components/team/dialogs/teammateRuntimeCompatibility.tsx +1 -1
  195. package/src/renderer/components/team/kanban/KanbanTaskCard.test.tsx +41 -0
  196. package/src/renderer/components/team/kanban/KanbanTaskCard.tsx +41 -86
  197. package/src/renderer/components/team/loop-console/LoopCommandComposer.tsx +310 -0
  198. package/src/renderer/components/team/loop-console/LoopConsolePanel.tsx +372 -0
  199. package/src/renderer/components/team/loop-console/loopSendIntent.test.ts +85 -0
  200. package/src/renderer/components/team/loop-console/loopSendIntent.ts +221 -0
  201. package/src/renderer/components/team/loop-console/useLeadSessionToolActivity.ts +74 -0
  202. package/src/renderer/components/team/loop-console/useLoopCommandSuggestions.ts +165 -0
  203. package/src/renderer/components/team/loop-console/useLoopConsoleController.ts +266 -0
  204. package/src/renderer/components/team/members/LeadModelRow.test.tsx +1 -1
  205. package/src/renderer/components/team/members/LeadModelRow.tsx +5 -3
  206. package/src/renderer/components/team/members/MemberDetailDialog.tsx +11 -0
  207. package/src/renderer/components/team/members/MemberDetailStats.tsx +13 -3
  208. package/src/renderer/components/team/members/MemberDraftRow.test.tsx +1 -1
  209. package/src/renderer/components/team/members/MemberDraftRow.tsx +1 -1
  210. package/src/renderer/components/team/members/MemberMessagesTab.tsx +2 -2
  211. package/src/renderer/components/team/members/MemberStatsTab.tsx +1 -1
  212. package/src/renderer/components/team/messages/MessageComposer.tsx +150 -44
  213. package/src/renderer/components/team/messages/MessagesFilterPopover.tsx +2 -2
  214. package/src/renderer/components/team/messages/MessagesPanel.tsx +34 -28
  215. package/src/renderer/components/team/schedule/CcCronScheduleDialog.tsx +6 -6
  216. package/src/renderer/components/team/taskLogs/ExactTaskLogCard.tsx +2 -2
  217. package/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +1 -1
  218. package/src/renderer/components/terminal/TerminalPanel.tsx +2 -3
  219. package/src/renderer/components/ui/MentionableTextarea.tsx +5 -1
  220. package/src/renderer/constants/teamColors.ts +5 -5
  221. package/src/renderer/hooks/useExtensionsTabState.ts +1 -1
  222. package/src/renderer/hooks/useMentionDetection.ts +5 -1
  223. package/src/renderer/hooks/useProjectWorkflowCommands.ts +57 -0
  224. package/src/renderer/hooks/useTeamSuggestions.ts +2 -0
  225. package/src/renderer/index.css +19 -2
  226. package/src/renderer/main.tsx +7 -1
  227. package/src/renderer/store/index.ts +18 -1
  228. package/src/renderer/store/slices/extensionsSlice.ts +83 -0
  229. package/src/renderer/store/slices/tabSlice.ts +61 -0
  230. package/src/renderer/store/slices/teamSlice.ts +138 -9
  231. package/src/renderer/types/mention.ts +8 -0
  232. package/src/renderer/types/tabs.ts +3 -1
  233. package/src/renderer/utils/__tests__/bindProjectSlug.test.ts +69 -0
  234. package/src/renderer/utils/__tests__/groupTransformer.test.ts +148 -0
  235. package/src/renderer/utils/__tests__/initialRoute.test.ts +101 -0
  236. package/src/renderer/utils/__tests__/leadToolActivity.test.ts +124 -0
  237. package/src/renderer/utils/__tests__/mergeTeamMessages.test.ts +81 -0
  238. package/src/renderer/utils/__tests__/teamMessageFiltering.test.ts +213 -0
  239. package/src/renderer/utils/__tests__/teamMessageKey.test.ts +75 -0
  240. package/src/renderer/utils/__tests__/workflowCommandExecution.test.ts +173 -0
  241. package/src/renderer/utils/__tests__/workflowCommandSuggestions.test.ts +59 -0
  242. package/src/renderer/utils/bindProjectSlug.ts +57 -0
  243. package/src/renderer/utils/capabilityCommandExecution.ts +113 -0
  244. package/src/renderer/utils/initialRoute.ts +89 -0
  245. package/src/renderer/utils/leadToolActivity.ts +117 -0
  246. package/src/renderer/utils/loopShortcutSuggestions.ts +106 -0
  247. package/src/renderer/utils/mentionSuggestions.ts +1 -1
  248. package/src/renderer/utils/slashCommandRegistry.ts +231 -0
  249. package/src/renderer/utils/teamMentionDirective.ts +31 -0
  250. package/src/renderer/utils/workflowCommandExecution.ts +96 -0
  251. package/src/renderer/utils/workflowCommandSuggestions.ts +49 -0
  252. package/src/shared/types/api.ts +79 -4
  253. package/src/shared/types/ccConnect.ts +1 -0
  254. package/src/shared/types/extensions/api.ts +19 -0
  255. package/src/shared/types/extensions/capabilityPack.ts +118 -0
  256. package/src/shared/types/extensions/index.ts +29 -1
  257. package/src/shared/types/index.ts +6 -0
  258. package/src/shared/types/loopAssets.ts +54 -0
  259. package/src/shared/types/providers.ts +0 -16
  260. package/src/shared/types/systemManager.ts +26 -1
  261. package/src/shared/types/team.ts +41 -5
  262. package/src/shared/types/terminal.ts +2 -36
  263. package/src/shared/types/worker.test.ts +28 -0
  264. package/src/shared/types/worker.ts +3 -0
  265. package/src/shared/utils/__tests__/effortLevels.test.ts +88 -0
  266. package/src/shared/utils/__tests__/providerBackend.test.ts +88 -0
  267. package/src/shared/utils/__tests__/providerLaunchArgs.test.ts +220 -0
  268. package/src/shared/utils/claudeStreamJson.test.ts +187 -0
  269. package/src/shared/utils/claudeStreamJson.ts +153 -0
  270. package/src/shared/utils/providerLaunchArgs.ts +217 -0
  271. package/src/shared/utils/slashCommands.ts +10 -0
  272. package/src/types/node-pty.d.ts +8 -0
  273. package/dist-renderer/assets/channel-Ch7JrfUu.js +0 -1
  274. package/dist-renderer/assets/classDiagram-2ON5EDUG-z9I4AnFy.js +0 -1
  275. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-z9I4AnFy.js +0 -1
  276. package/dist-renderer/assets/clone-Dfi1Jx6l.js +0 -1
  277. package/dist-renderer/assets/index-iyjkpSus.css +0 -32
  278. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DTUIBfce.js +0 -1
  279. package/src/main/services/system-manager/SystemManagerPtyService.ts +0 -233
  280. package/src/renderer/components/common/TerminalPane.tsx +0 -213
  281. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +0 -292
@@ -1,95 +1,624 @@
1
1
  /**
2
- * BuiltinWorkflowSeeder — 将内置 workflow 作为 Claude Code 自定义命令
3
- * 复制到控制台工作空间的 `.claude/commands/` 目录。
2
+ * BuiltinWorkflowSeeder — 将内置 workflow 作为 Claude Code 自定义命令。
4
3
  *
5
- * 内置 workflow 以代码常量形式内嵌,在控制台打开工作空间时自动复制到
6
- * <workspace>/.claude/commands/ 目录,成为原生 `/doctor` 等斜杠命令。
4
+ * 官方测试过的 Hermit workflow 会预安装到用户级 `~/.claude/commands/hermit/`,
5
+ * 成为所有团队 / cwd 可复用的 `/hermit:*` 斜杠命令。工作区级
6
+ * `<workspace>/.claude/commands/` 仍作为兼容路径保留。
7
7
  */
8
- import { mkdir, writeFile, stat } from 'node:fs/promises';
8
+ import { mkdir, readFile, writeFile, stat } from 'node:fs/promises';
9
9
  import os from 'node:os';
10
10
  import path from 'node:path';
11
11
 
12
12
  import { createLogger } from '@shared/utils/logger';
13
13
 
14
+ import type { WorkflowPromptSafety } from '@shared/types/systemManager';
15
+
14
16
  const logger = createLogger('BuiltinWorkflowSeeder');
15
17
 
16
18
  // ---------------------------------------------------------------------------
17
19
  // Builtin workflow definitions
18
20
  // ---------------------------------------------------------------------------
19
21
 
20
- const BUILTIN_WORKFLOWS: Record<string, string> = {
21
- 'doctor.md': `# Hermit Doctor — 环境诊断
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 的流程
22
188
 
23
- 你是一个 Hermit 运维诊断助手。请按以下步骤逐一检查当前环境,报告每项状态(✅ 正常 / ⚠️ 警告 / ❌ 异常),并在最后给出总结和建议。
189
+ ## 输出
24
190
 
25
- ## 1. 基础环境
191
+ 1. Repeated workflows:按出现频率和价值排序
192
+ 2. 每个 workflow 的触发条件、输入、步骤、验证门禁、停止条件
193
+ 3. 建议沉淀位置:skill / command / schedule / team template / report
194
+ 4. 下次可直接执行的 prompt 草案
195
+ 5. 不应自动化、必须人工判断的边界
26
196
 
27
- - 检查操作系统和版本
28
- - 检查可用内存(\`free -h\` 或 \`vm_stat\`)
29
- - 检查磁盘空间(\`df -h .\`)
30
- - 检查文件描述符限制(\`ulimit -n\`)
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 — 循环运维摘要
31
210
 
32
- ## 2. Claude Code CLI
211
+ 你是 Hermit Helm Loop 的 Loop Ops 摘要助手。请从 Loop Engineering 角度总结当前工作区状态:循环是否能自己找活、派活、验证、记录状态、推进下一步。
33
212
 
34
- - 检查 \`claude\` 是否在 PATH 中(\`which claude\`)
35
- - 检查 Claude Code 版本(\`claude --version\`)
36
- - 检查登录状态(\`claude auth status\` 或检查 \`~/.claude\` 目录)
213
+ ${READ_ONLY_SAFETY_RULES}
37
214
 
38
- ## 3. cc-connect 连通性
215
+ ${LOOP_ASSET_SCAN_SCOPE}
39
216
 
40
- - 检查 cc-connect 进程是否运行(\`ps aux | grep cc-connect\`)
41
- - 检查 cc-connect API 是否可达(\`curl -s http://127.0.0.1:6300/api/v1/status\`)
42
- - 检查 cc-connect 配置文件是否存在(\`~/.cc-connect/config.toml\`)
43
- - 列出已配置的项目数量
217
+ ## 输出
44
218
 
45
- ## 4. Hermit 数据目录
219
+ 请输出:
46
220
 
47
- - 检查 \`~/.hermit/\` 目录结构是否完整
48
- - 检查 \`~/.hermit/teams/\` 下的团队数量和状态
49
- - 检查是否有 pendingDelete restartRequired 标记的团队
50
- - 检查团队 team.json 是否有效(schemaVersion 字段)
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:哪些结果必须人工读,不要认知投降
51
227
 
52
- ## 5. 会话健康
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 — 环境与循环运行时诊断
53
241
 
54
- - 统计当前运行的 Claude 会话数量(\`ps aux | grep claude | grep -v grep\`)
55
- - 检查是否有僵尸进程
56
- - 检查内存占用是否异常(单个会话 > 200MB 为警告)
242
+ 你是 Hermit 运维诊断助手。请检查当前环境是否适合运行长期 Agent loop。
57
243
 
58
- ## 6. 网络和端口
244
+ ${READ_ONLY_SAFETY_RULES}
59
245
 
60
- - 检查 Hermit 服务端口是否正常监听
61
- - 检查 cc-connect 端口是否正常监听
62
- - 检查 DNS 解析是否正常(\`nslookup api.anthropic.com\`)
246
+ ## 基础环境
63
247
 
64
- ## 输出格式
248
+ - 操作系统、内存、磁盘、文件描述符限制
249
+ - \`claude\` 是否可用、版本、登录状态
250
+ - cc-connect / Hermit 服务是否运行
251
+ - 当前工作区路径是否正确
65
252
 
66
- 完成后请输出:
253
+ ${LOOP_ASSET_SCAN_SCOPE}
67
254
 
68
- \`\`\`
69
- 🔍 Hermit Doctor 诊断报告
70
- =========================
71
- 操作系统: ...
72
- 内存: ... (可用 / 总计)
73
- 磁盘: ... (可用 / 总计)
255
+ ## Loop runtime 重点诊断
74
256
 
75
- ✅/⚠️/❌ Claude Code CLI: ...
76
- ✅/⚠️/❌ cc-connect: ...
77
- ✅/⚠️/❌ Hermit 数据: ...
78
- ✅/⚠️/❌ 会话健康: ...
79
- ✅/⚠️/❌ 网络: ...
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 风险
80
262
 
81
- 📊 总结:
82
- - 正常项: N
83
- - 警告项: N
84
- - 异常项: N
263
+ ## 输出
85
264
 
86
- 💡 建议:
87
- 1. ...
88
- 2. ...
89
- \`\`\`
265
+ 请输出诊断报告:正常项、警告项、异常项、证据路径、建议动作。不要修复问题。
90
266
  `,
91
- };
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
92
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
+ );
93
622
  // ---------------------------------------------------------------------------
94
623
  // Public API
95
624
  // ---------------------------------------------------------------------------
@@ -98,6 +627,50 @@ function hermitHome(): string {
98
627
  return process.env.HERMIT_HOME || path.join(os.homedir(), '.hermit');
99
628
  }
100
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
+
101
674
  /**
102
675
  * 将内置命令文件复制到工作空间的 .claude/commands/ 目录。
103
676
  * 如果已存在同名文件则跳过(尊重用户自定义)。
@@ -105,25 +678,50 @@ function hermitHome(): string {
105
678
  * @param workspaceDir 工作空间根目录
106
679
  * @returns 实际复制的文件数量
107
680
  */
108
- export async function seedBuiltinWorkflows(workspaceDir: string): Promise<number> {
681
+ async function seedBuiltinWorkflowsIntoDir(targetDir: string): Promise<number> {
109
682
  let copied = 0;
110
- try {
111
- const targetDir = path.join(workspaceDir, '.claude', 'commands');
112
- await mkdir(targetDir, { recursive: true });
683
+ await mkdir(targetDir, { recursive: true });
113
684
 
114
- for (const [filename, content] of Object.entries(BUILTIN_WORKFLOWS)) {
115
- const targetPath = path.join(targetDir, filename);
116
- const exists = await stat(targetPath).then(() => true).catch(() => false);
117
- if (exists) continue;
118
-
119
- await writeFile(targetPath, content, 'utf-8');
120
- copied++;
121
- logger.info(`seeded builtin workflow: ${filename} → ${targetPath}`);
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;
122
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'));
123
707
  } catch (err) {
124
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;
125
724
  }
126
- return copied;
127
725
  }
128
726
 
129
727
  /**
@@ -131,9 +729,16 @@ export async function seedBuiltinWorkflows(workspaceDir: string): Promise<number
131
729
  * Called once at app startup as fallback.
132
730
  */
133
731
  export async function ensureGlobalWorkflows(): Promise<void> {
134
- const globalWorkspace = hermitHome();
135
- const copied = await seedBuiltinWorkflows(globalWorkspace);
136
- if (copied > 0) {
137
- logger.info(`seeded ${copied} builtin command(s) to ${path.join(globalWorkspace, '.claude', 'commands')}`);
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
+ );
138
743
  }
139
744
  }