dsh-plugin-t-expert 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/THIRD-PARTY-NOTICES +33 -0
  4. package/cordis.patch.yml +7 -0
  5. package/data/experts/academic/academic-anthropologist.md +125 -0
  6. package/data/experts/academic/academic-geographer.md +127 -0
  7. package/data/experts/academic/academic-historian.md +123 -0
  8. package/data/experts/academic/academic-narratologist.md +118 -0
  9. package/data/experts/academic/academic-psychologist.md +118 -0
  10. package/data/experts/academic/academic-statistician.md +144 -0
  11. package/data/experts/design/design-brand-guardian.md +322 -0
  12. package/data/experts/design/design-image-prompt-engineer.md +236 -0
  13. package/data/experts/design/design-inclusive-visuals-specialist.md +71 -0
  14. package/data/experts/design/design-persona-walkthrough.md +272 -0
  15. package/data/experts/design/design-ui-designer.md +383 -0
  16. package/data/experts/design/design-ui-finish-gate-reviewer.md +217 -0
  17. package/data/experts/design/design-ux-architect.md +469 -0
  18. package/data/experts/design/design-ux-researcher.md +329 -0
  19. package/data/experts/design/design-visual-storyteller.md +149 -0
  20. package/data/experts/design/design-whimsy-injector.md +438 -0
  21. package/data/experts/engineering/engineering-ai-data-remediation-engineer.md +211 -0
  22. package/data/experts/engineering/engineering-ai-engineer.md +146 -0
  23. package/data/experts/engineering/engineering-api-platform-engineer.md +162 -0
  24. package/data/experts/engineering/engineering-ats-validator-architect.md +383 -0
  25. package/data/experts/engineering/engineering-autonomous-optimization-architect.md +107 -0
  26. package/data/experts/engineering/engineering-backend-architect.md +236 -0
  27. package/data/experts/engineering/engineering-china-network-engineer.md +252 -0
  28. package/data/experts/engineering/engineering-cms-developer.md +536 -0
  29. package/data/experts/engineering/engineering-code-reviewer.md +76 -0
  30. package/data/experts/engineering/engineering-codebase-onboarding-engineer.md +173 -0
  31. package/data/experts/engineering/engineering-data-engineer.md +306 -0
  32. package/data/experts/engineering/engineering-data-visualization-engineer.md +151 -0
  33. package/data/experts/engineering/engineering-database-optimizer.md +176 -0
  34. package/data/experts/engineering/engineering-database-reliability-engineer.md +162 -0
  35. package/data/experts/engineering/engineering-desktop-app-engineer.md +204 -0
  36. package/data/experts/engineering/engineering-developer-tooling-engineer.md +153 -0
  37. package/data/experts/engineering/engineering-devops-automator.md +376 -0
  38. package/data/experts/engineering/engineering-drupal-performance.md +347 -0
  39. package/data/experts/engineering/engineering-drupal-shopping-cart.md +360 -0
  40. package/data/experts/engineering/engineering-email-intelligence-engineer.md +353 -0
  41. package/data/experts/engineering/engineering-embedded-firmware-engineer.md +173 -0
  42. package/data/experts/engineering/engineering-feishu-integration-developer.md +598 -0
  43. package/data/experts/engineering/engineering-filament-optimization-specialist.md +283 -0
  44. package/data/experts/engineering/engineering-finops-engineer.md +153 -0
  45. package/data/experts/engineering/engineering-frontend-developer.md +225 -0
  46. package/data/experts/engineering/engineering-gaussdb-expert.md +334 -0
  47. package/data/experts/engineering/engineering-git-workflow-master.md +84 -0
  48. package/data/experts/engineering/engineering-i18n-engineer.md +184 -0
  49. package/data/experts/engineering/engineering-identity-access-engineer.md +196 -0
  50. package/data/experts/engineering/engineering-incident-response-commander.md +444 -0
  51. package/data/experts/engineering/engineering-iot-fleet-engineer.md +148 -0
  52. package/data/experts/engineering/engineering-it-service-manager.md +561 -0
  53. package/data/experts/engineering/engineering-knowledge-graph-engineer.md +368 -0
  54. package/data/experts/engineering/engineering-llm-post-training-engineer.md +166 -0
  55. package/data/experts/engineering/engineering-minimal-change-engineer.md +207 -0
  56. package/data/experts/engineering/engineering-mobile-app-builder.md +493 -0
  57. package/data/experts/engineering/engineering-mobile-release-engineer.md +163 -0
  58. package/data/experts/engineering/engineering-multi-agent-systems-architect.md +600 -0
  59. package/data/experts/engineering/engineering-network-engineer.md +239 -0
  60. package/data/experts/engineering/engineering-orgscript-engineer.md +113 -0
  61. package/data/experts/engineering/engineering-payments-billing-engineer.md +194 -0
  62. package/data/experts/engineering/engineering-pdf-engine-architect.md +666 -0
  63. package/data/experts/engineering/engineering-platform-engineer.md +270 -0
  64. package/data/experts/engineering/engineering-privacy-engineer.md +152 -0
  65. package/data/experts/engineering/engineering-prompt-engineer.md +202 -0
  66. package/data/experts/engineering/engineering-rag-pipeline-engineer.md +437 -0
  67. package/data/experts/engineering/engineering-rapid-prototyper.md +462 -0
  68. package/data/experts/engineering/engineering-realtime-collaboration-engineer.md +187 -0
  69. package/data/experts/engineering/engineering-rust-refactoring-specialist.md +313 -0
  70. package/data/experts/engineering/engineering-search-relevance-engineer.md +237 -0
  71. package/data/experts/engineering/engineering-section-508-specialist.md +339 -0
  72. package/data/experts/engineering/engineering-senior-developer.md +176 -0
  73. package/data/experts/engineering/engineering-software-architect.md +112 -0
  74. package/data/experts/engineering/engineering-solidity-smart-contract-engineer.md +522 -0
  75. package/data/experts/engineering/engineering-sre.md +90 -0
  76. package/data/experts/engineering/engineering-technical-writer.md +393 -0
  77. package/data/experts/engineering/engineering-universal-document-compiler.md +344 -0
  78. package/data/experts/engineering/engineering-uswds-developer.md +340 -0
  79. package/data/experts/engineering/engineering-video-streaming-engineer.md +150 -0
  80. package/data/experts/engineering/engineering-voice-ai-integration-engineer.md +561 -0
  81. package/data/experts/engineering/engineering-webassembly-engineer.md +156 -0
  82. package/data/experts/engineering/engineering-wechat-mini-program-developer.md +350 -0
  83. package/data/experts/engineering/engineering-wordpress-performance.md +346 -0
  84. package/data/experts/engineering/engineering-wordpress-shopping-cart.md +346 -0
  85. package/data/experts/finance/finance-bookkeeper-controller.md +260 -0
  86. package/data/experts/finance/finance-financial-analyst.md +234 -0
  87. package/data/experts/finance/finance-fpa-analyst.md +263 -0
  88. package/data/experts/finance/finance-investment-researcher.md +272 -0
  89. package/data/experts/finance/finance-tax-strategist.md +239 -0
  90. package/data/experts/game-development/blender/blender-addon-engineer.md +234 -0
  91. package/data/experts/game-development/economy-designer.md +156 -0
  92. package/data/experts/game-development/game-audio-engineer.md +264 -0
  93. package/data/experts/game-development/game-designer.md +167 -0
  94. package/data/experts/game-development/godot/godot-gameplay-scripter.md +334 -0
  95. package/data/experts/game-development/godot/godot-multiplayer-engineer.md +297 -0
  96. package/data/experts/game-development/godot/godot-shader-developer.md +266 -0
  97. package/data/experts/game-development/level-designer.md +208 -0
  98. package/data/experts/game-development/narrative-designer.md +243 -0
  99. package/data/experts/game-development/roblox-studio/roblox-avatar-creator.md +297 -0
  100. package/data/experts/game-development/roblox-studio/roblox-experience-designer.md +305 -0
  101. package/data/experts/game-development/roblox-studio/roblox-systems-scripter.md +325 -0
  102. package/data/experts/game-development/technical-artist.md +229 -0
  103. package/data/experts/game-development/unity/unity-architect.md +271 -0
  104. package/data/experts/game-development/unity/unity-editor-tool-developer.md +310 -0
  105. package/data/experts/game-development/unity/unity-multiplayer-engineer.md +321 -0
  106. package/data/experts/game-development/unity/unity-shader-graph-artist.md +269 -0
  107. package/data/experts/game-development/unreal-engine/unreal-multiplayer-architect.md +313 -0
  108. package/data/experts/game-development/unreal-engine/unreal-systems-engineer.md +310 -0
  109. package/data/experts/game-development/unreal-engine/unreal-technical-artist.md +256 -0
  110. package/data/experts/game-development/unreal-engine/unreal-world-builder.md +273 -0
  111. package/data/experts/gis/gis-3d-scene-developer.md +111 -0
  112. package/data/experts/gis/gis-analyst.md +91 -0
  113. package/data/experts/gis/gis-bim-specialist.md +108 -0
  114. package/data/experts/gis/gis-cartography-designer.md +150 -0
  115. package/data/experts/gis/gis-drone-reality-mapping.md +120 -0
  116. package/data/experts/gis/gis-geoai-ml-engineer.md +105 -0
  117. package/data/experts/gis/gis-geoprocessing-specialist.md +97 -0
  118. package/data/experts/gis/gis-qa-engineer.md +133 -0
  119. package/data/experts/gis/gis-solution-engineer.md +101 -0
  120. package/data/experts/gis/gis-spatial-data-engineer.md +97 -0
  121. package/data/experts/gis/gis-spatial-data-scientist.md +111 -0
  122. package/data/experts/gis/gis-technical-consultant.md +86 -0
  123. package/data/experts/gis/gis-web-gis-developer.md +108 -0
  124. package/data/experts/healthcare/healthcare-clinical-evidence-agent.md +231 -0
  125. package/data/experts/healthcare/healthcare-innovation-strategist.md +433 -0
  126. package/data/experts/healthcare/healthcare-sovereign-health-systems-agent.md +312 -0
  127. package/data/experts/marketing/marketing-aeo-foundations.md +264 -0
  128. package/data/experts/marketing/marketing-agentic-search-optimizer.md +313 -0
  129. package/data/experts/marketing/marketing-ai-citation-strategist.md +172 -0
  130. package/data/experts/marketing/marketing-app-store-optimizer.md +321 -0
  131. package/data/experts/marketing/marketing-baidu-seo-specialist.md +226 -0
  132. package/data/experts/marketing/marketing-bilibili-content-strategist.md +199 -0
  133. package/data/experts/marketing/marketing-book-co-author.md +110 -0
  134. package/data/experts/marketing/marketing-carousel-growth-engine.md +199 -0
  135. package/data/experts/marketing/marketing-china-ecommerce-operator.md +283 -0
  136. package/data/experts/marketing/marketing-china-market-localization-strategist.md +283 -0
  137. package/data/experts/marketing/marketing-content-creator.md +54 -0
  138. package/data/experts/marketing/marketing-cross-border-ecommerce.md +259 -0
  139. package/data/experts/marketing/marketing-douyin-strategist.md +149 -0
  140. package/data/experts/marketing/marketing-email-strategist.md +249 -0
  141. package/data/experts/marketing/marketing-global-podcast-strategist.md +206 -0
  142. package/data/experts/marketing/marketing-growth-hacker.md +54 -0
  143. package/data/experts/marketing/marketing-instagram-curator.md +113 -0
  144. package/data/experts/marketing/marketing-kuaishou-strategist.md +223 -0
  145. package/data/experts/marketing/marketing-linkedin-content-creator.md +214 -0
  146. package/data/experts/marketing/marketing-livestream-commerce-coach.md +305 -0
  147. package/data/experts/marketing/marketing-multi-platform-publisher.md +217 -0
  148. package/data/experts/marketing/marketing-podcast-strategist.md +277 -0
  149. package/data/experts/marketing/marketing-pr-communications-manager.md +473 -0
  150. package/data/experts/marketing/marketing-private-domain-operator.md +308 -0
  151. package/data/experts/marketing/marketing-reddit-community-builder.md +123 -0
  152. package/data/experts/marketing/marketing-seo-specialist.md +370 -0
  153. package/data/experts/marketing/marketing-short-video-editing-coach.md +412 -0
  154. package/data/experts/marketing/marketing-social-media-strategist.md +125 -0
  155. package/data/experts/marketing/marketing-tiktok-strategist.md +125 -0
  156. package/data/experts/marketing/marketing-twitter-engager.md +126 -0
  157. package/data/experts/marketing/marketing-video-optimization-specialist.md +119 -0
  158. package/data/experts/marketing/marketing-wechat-official-account.md +145 -0
  159. package/data/experts/marketing/marketing-weibo-strategist.md +240 -0
  160. package/data/experts/marketing/marketing-x-twitter-intelligence-analyst.md +161 -0
  161. package/data/experts/marketing/marketing-xiaohongshu-specialist.md +138 -0
  162. package/data/experts/marketing/marketing-zhihu-strategist.md +162 -0
  163. package/data/experts/paid-media/paid-media-auditor.md +71 -0
  164. package/data/experts/paid-media/paid-media-creative-strategist.md +71 -0
  165. package/data/experts/paid-media/paid-media-paid-social-strategist.md +71 -0
  166. package/data/experts/paid-media/paid-media-ppc-strategist.md +71 -0
  167. package/data/experts/paid-media/paid-media-programmatic-buyer.md +71 -0
  168. package/data/experts/paid-media/paid-media-search-query-analyst.md +71 -0
  169. package/data/experts/paid-media/paid-media-tracking-specialist.md +71 -0
  170. package/data/experts/product/product-behavioral-nudge-engine.md +80 -0
  171. package/data/experts/product/product-feedback-synthesizer.md +119 -0
  172. package/data/experts/product/product-manager.md +469 -0
  173. package/data/experts/product/product-sprint-prioritizer.md +154 -0
  174. package/data/experts/product/product-trend-researcher.md +159 -0
  175. package/data/experts/project-management/project-management-experiment-tracker.md +198 -0
  176. package/data/experts/project-management/project-management-jira-workflow-steward.md +230 -0
  177. package/data/experts/project-management/project-management-meeting-notes-specialist.md +95 -0
  178. package/data/experts/project-management/project-management-project-shepherd.md +194 -0
  179. package/data/experts/project-management/project-management-studio-operations.md +200 -0
  180. package/data/experts/project-management/project-management-studio-producer.md +203 -0
  181. package/data/experts/project-management/project-manager-senior.md +135 -0
  182. package/data/experts/research/research-synthesist.md +136 -0
  183. package/data/experts/sales/sales-account-strategist.md +227 -0
  184. package/data/experts/sales/sales-coach.md +271 -0
  185. package/data/experts/sales/sales-deal-strategist.md +180 -0
  186. package/data/experts/sales/sales-discovery-coach.md +225 -0
  187. package/data/experts/sales/sales-engineer.md +182 -0
  188. package/data/experts/sales/sales-offer-lead-gen-strategist.md +257 -0
  189. package/data/experts/sales/sales-outbound-strategist.md +201 -0
  190. package/data/experts/sales/sales-pipeline-analyst.md +267 -0
  191. package/data/experts/sales/sales-proposal-strategist.md +217 -0
  192. package/data/experts/security/security-ai-generated-code-auditor.md +207 -0
  193. package/data/experts/security/security-appsec-engineer.md +491 -0
  194. package/data/experts/security/security-architect.md +304 -0
  195. package/data/experts/security/security-blockchain-security-auditor.md +463 -0
  196. package/data/experts/security/security-cloud-security-architect.md +523 -0
  197. package/data/experts/security/security-compliance-auditor.md +158 -0
  198. package/data/experts/security/security-incident-responder.md +437 -0
  199. package/data/experts/security/security-penetration-tester.md +399 -0
  200. package/data/experts/security/security-secrets-credential-engineer.md +176 -0
  201. package/data/experts/security/security-senior-secops.md +750 -0
  202. package/data/experts/security/security-threat-detection-engineer.md +534 -0
  203. package/data/experts/security/security-threat-intelligence-analyst.md +644 -0
  204. package/data/experts/spatial-computing/macos-spatial-metal-engineer.md +337 -0
  205. package/data/experts/spatial-computing/terminal-integration-specialist.md +70 -0
  206. package/data/experts/spatial-computing/visionos-spatial-engineer.md +54 -0
  207. package/data/experts/spatial-computing/xr-cockpit-interaction-specialist.md +32 -0
  208. package/data/experts/spatial-computing/xr-immersive-developer.md +32 -0
  209. package/data/experts/spatial-computing/xr-interface-architect.md +32 -0
  210. package/data/experts/specialized/accounts-payable-agent.md +185 -0
  211. package/data/experts/specialized/agentic-identity-trust.md +387 -0
  212. package/data/experts/specialized/agents-orchestrator.md +367 -0
  213. package/data/experts/specialized/automation-governance-architect.md +216 -0
  214. package/data/experts/specialized/business-strategist.md +488 -0
  215. package/data/experts/specialized/change-management-consultant.md +497 -0
  216. package/data/experts/specialized/chief-financial-officer.md +388 -0
  217. package/data/experts/specialized/corporate-training-designer.md +192 -0
  218. package/data/experts/specialized/customer-service.md +398 -0
  219. package/data/experts/specialized/customer-success-manager.md +460 -0
  220. package/data/experts/specialized/data-consolidation-agent.md +60 -0
  221. package/data/experts/specialized/data-privacy-officer.md +412 -0
  222. package/data/experts/specialized/esg-sustainability-officer.md +396 -0
  223. package/data/experts/specialized/government-digital-presales-consultant.md +363 -0
  224. package/data/experts/specialized/grant-writer.md +511 -0
  225. package/data/experts/specialized/healthcare-aging-parent-care-companion.md +414 -0
  226. package/data/experts/specialized/healthcare-customer-service.md +389 -0
  227. package/data/experts/specialized/healthcare-marketing-compliance.md +395 -0
  228. package/data/experts/specialized/hospitality-guest-services.md +603 -0
  229. package/data/experts/specialized/hr-onboarding.md +451 -0
  230. package/data/experts/specialized/identity-graph-operator.md +260 -0
  231. package/data/experts/specialized/language-translator.md +264 -0
  232. package/data/experts/specialized/legal-billing-time-tracking.md +569 -0
  233. package/data/experts/specialized/legal-client-intake.md +492 -0
  234. package/data/experts/specialized/legal-document-review.md +454 -0
  235. package/data/experts/specialized/loan-officer-assistant.md +555 -0
  236. package/data/experts/specialized/lsp-index-engineer.md +314 -0
  237. package/data/experts/specialized/ma-integration-manager.md +427 -0
  238. package/data/experts/specialized/medical-billing-coding-specialist.md +491 -0
  239. package/data/experts/specialized/operations-manager.md +399 -0
  240. package/data/experts/specialized/organizational-psychologist.md +391 -0
  241. package/data/experts/specialized/personal-growth-mentor.md +159 -0
  242. package/data/experts/specialized/real-estate-buyer-seller.md +596 -0
  243. package/data/experts/specialized/recruitment-specialist.md +509 -0
  244. package/data/experts/specialized/report-distribution-agent.md +65 -0
  245. package/data/experts/specialized/resume-tailor.md +230 -0
  246. package/data/experts/specialized/retail-customer-returns.md +566 -0
  247. package/data/experts/specialized/sales-data-extraction-agent.md +67 -0
  248. package/data/experts/specialized/sales-outreach.md +425 -0
  249. package/data/experts/specialized/specialized-chief-of-staff.md +279 -0
  250. package/data/experts/specialized/specialized-civil-engineer.md +356 -0
  251. package/data/experts/specialized/specialized-codebase-archaeologist.md +341 -0
  252. package/data/experts/specialized/specialized-cultural-intelligence-strategist.md +88 -0
  253. package/data/experts/specialized/specialized-developer-advocate.md +317 -0
  254. package/data/experts/specialized/specialized-document-generator.md +55 -0
  255. package/data/experts/specialized/specialized-fedramp-rmf-compliance.md +378 -0
  256. package/data/experts/specialized/specialized-focus-music-architect.md +172 -0
  257. package/data/experts/specialized/specialized-french-consulting-market.md +194 -0
  258. package/data/experts/specialized/specialized-korean-business-navigator.md +216 -0
  259. package/data/experts/specialized/specialized-master-plan-architect.md +157 -0
  260. package/data/experts/specialized/specialized-mcp-builder.md +248 -0
  261. package/data/experts/specialized/specialized-model-qa.md +488 -0
  262. package/data/experts/specialized/specialized-pricing-analyst.md +243 -0
  263. package/data/experts/specialized/specialized-salesforce-architect.md +182 -0
  264. package/data/experts/specialized/specialized-strategy-duel-agent.md +130 -0
  265. package/data/experts/specialized/specialized-workflow-architect.md +597 -0
  266. package/data/experts/specialized/study-abroad-advisor.md +282 -0
  267. package/data/experts/specialized/supply-chain-strategist.md +582 -0
  268. package/data/experts/specialized/zk-steward.md +211 -0
  269. package/data/experts/support/support-analytics-reporter.md +365 -0
  270. package/data/experts/support/support-executive-summary-generator.md +212 -0
  271. package/data/experts/support/support-finance-tracker.md +442 -0
  272. package/data/experts/support/support-infrastructure-maintainer.md +618 -0
  273. package/data/experts/support/support-legal-compliance-checker.md +588 -0
  274. package/data/experts/support/support-support-responder.md +585 -0
  275. package/data/experts/testing/testing-accessibility-auditor.md +316 -0
  276. package/data/experts/testing/testing-api-tester.md +306 -0
  277. package/data/experts/testing/testing-evidence-collector.md +210 -0
  278. package/data/experts/testing/testing-performance-benchmarker.md +268 -0
  279. package/data/experts/testing/testing-reality-checker.md +249 -0
  280. package/data/experts/testing/testing-test-automation-engineer.md +179 -0
  281. package/data/experts/testing/testing-test-results-analyzer.md +305 -0
  282. package/data/experts/testing/testing-tool-evaluator.md +394 -0
  283. package/data/experts/testing/testing-workflow-optimizer.md +450 -0
  284. package/data/source.json +27 -0
  285. package/data/t-team.config.json +998 -0
  286. package/data/team-profiles.py +365 -0
  287. package/data/teams.json +581 -0
  288. package/data/teams.resolved.json +1121 -0
  289. package/data/zh/COVERAGE.json +20 -0
  290. package/data/zh/academic/academic-anthropologist.md +124 -0
  291. package/data/zh/academic/academic-geographer.md +126 -0
  292. package/data/zh/academic/academic-historian.md +122 -0
  293. package/data/zh/academic/academic-narratologist.md +117 -0
  294. package/data/zh/academic/academic-psychologist.md +117 -0
  295. package/data/zh/academic/academic-statistician.md +40 -0
  296. package/data/zh/descriptions.json +281 -0
  297. package/data/zh/design/design-brand-guardian.md +321 -0
  298. package/data/zh/design/design-image-prompt-engineer.md +255 -0
  299. package/data/zh/design/design-inclusive-visuals-specialist.md +177 -0
  300. package/data/zh/design/design-persona-walkthrough.md +271 -0
  301. package/data/zh/design/design-ui-designer.md +382 -0
  302. package/data/zh/design/design-ui-finish-gate-reviewer.md +40 -0
  303. package/data/zh/design/design-ux-architect.md +482 -0
  304. package/data/zh/design/design-ux-researcher.md +328 -0
  305. package/data/zh/design/design-visual-storyteller.md +159 -0
  306. package/data/zh/design/design-whimsy-injector.md +453 -0
  307. package/data/zh/divisions.json +74 -0
  308. package/data/zh/engineering/engineering-ai-data-remediation-engineer.md +209 -0
  309. package/data/zh/engineering/engineering-ai-engineer.md +161 -0
  310. package/data/zh/engineering/engineering-api-platform-engineer.md +40 -0
  311. package/data/zh/engineering/engineering-ats-validator-architect.md +383 -0
  312. package/data/zh/engineering/engineering-autonomous-optimization-architect.md +115 -0
  313. package/data/zh/engineering/engineering-backend-architect.md +234 -0
  314. package/data/zh/engineering/engineering-china-network-engineer.md +252 -0
  315. package/data/zh/engineering/engineering-cms-developer.md +534 -0
  316. package/data/zh/engineering/engineering-code-reviewer.md +172 -0
  317. package/data/zh/engineering/engineering-codebase-onboarding-engineer.md +172 -0
  318. package/data/zh/engineering/engineering-data-engineer.md +324 -0
  319. package/data/zh/engineering/engineering-data-visualization-engineer.md +40 -0
  320. package/data/zh/engineering/engineering-database-optimizer.md +175 -0
  321. package/data/zh/engineering/engineering-database-reliability-engineer.md +40 -0
  322. package/data/zh/engineering/engineering-desktop-app-engineer.md +40 -0
  323. package/data/zh/engineering/engineering-developer-tooling-engineer.md +40 -0
  324. package/data/zh/engineering/engineering-devops-automator.md +375 -0
  325. package/data/zh/engineering/engineering-drupal-performance.md +40 -0
  326. package/data/zh/engineering/engineering-drupal-shopping-cart.md +359 -0
  327. package/data/zh/engineering/engineering-email-intelligence-engineer.md +349 -0
  328. package/data/zh/engineering/engineering-embedded-firmware-engineer.md +168 -0
  329. package/data/zh/engineering/engineering-feishu-integration-developer.md +597 -0
  330. package/data/zh/engineering/engineering-filament-optimization-specialist.md +283 -0
  331. package/data/zh/engineering/engineering-finops-engineer.md +40 -0
  332. package/data/zh/engineering/engineering-frontend-developer.md +224 -0
  333. package/data/zh/engineering/engineering-gaussdb-expert.md +40 -0
  334. package/data/zh/engineering/engineering-git-workflow-master.md +220 -0
  335. package/data/zh/engineering/engineering-i18n-engineer.md +40 -0
  336. package/data/zh/engineering/engineering-identity-access-engineer.md +40 -0
  337. package/data/zh/engineering/engineering-incident-response-commander.md +465 -0
  338. package/data/zh/engineering/engineering-iot-fleet-engineer.md +40 -0
  339. package/data/zh/engineering/engineering-it-service-manager.md +560 -0
  340. package/data/zh/engineering/engineering-knowledge-graph-engineer.md +40 -0
  341. package/data/zh/engineering/engineering-llm-post-training-engineer.md +40 -0
  342. package/data/zh/engineering/engineering-minimal-change-engineer.md +206 -0
  343. package/data/zh/engineering/engineering-mobile-app-builder.md +434 -0
  344. package/data/zh/engineering/engineering-mobile-release-engineer.md +40 -0
  345. package/data/zh/engineering/engineering-multi-agent-systems-architect.md +599 -0
  346. package/data/zh/engineering/engineering-network-engineer.md +40 -0
  347. package/data/zh/engineering/engineering-orgscript-engineer.md +112 -0
  348. package/data/zh/engineering/engineering-payments-billing-engineer.md +40 -0
  349. package/data/zh/engineering/engineering-pdf-engine-architect.md +666 -0
  350. package/data/zh/engineering/engineering-platform-engineer.md +271 -0
  351. package/data/zh/engineering/engineering-privacy-engineer.md +40 -0
  352. package/data/zh/engineering/engineering-prompt-engineer.md +203 -0
  353. package/data/zh/engineering/engineering-rag-pipeline-engineer.md +40 -0
  354. package/data/zh/engineering/engineering-rapid-prototyper.md +461 -0
  355. package/data/zh/engineering/engineering-realtime-collaboration-engineer.md +40 -0
  356. package/data/zh/engineering/engineering-rust-refactoring-specialist.md +40 -0
  357. package/data/zh/engineering/engineering-search-relevance-engineer.md +40 -0
  358. package/data/zh/engineering/engineering-section-508-specialist.md +40 -0
  359. package/data/zh/engineering/engineering-senior-developer.md +177 -0
  360. package/data/zh/engineering/engineering-software-architect.md +200 -0
  361. package/data/zh/engineering/engineering-solidity-smart-contract-engineer.md +541 -0
  362. package/data/zh/engineering/engineering-sre.md +233 -0
  363. package/data/zh/engineering/engineering-technical-writer.md +409 -0
  364. package/data/zh/engineering/engineering-universal-document-compiler.md +344 -0
  365. package/data/zh/engineering/engineering-uswds-developer.md +40 -0
  366. package/data/zh/engineering/engineering-video-streaming-engineer.md +40 -0
  367. package/data/zh/engineering/engineering-voice-ai-integration-engineer.md +560 -0
  368. package/data/zh/engineering/engineering-webassembly-engineer.md +40 -0
  369. package/data/zh/engineering/engineering-wechat-mini-program-developer.md +288 -0
  370. package/data/zh/engineering/engineering-wordpress-performance.md +40 -0
  371. package/data/zh/engineering/engineering-wordpress-shopping-cart.md +345 -0
  372. package/data/zh/finance/finance-bookkeeper-controller.md +271 -0
  373. package/data/zh/finance/finance-financial-analyst.md +244 -0
  374. package/data/zh/finance/finance-fpa-analyst.md +272 -0
  375. package/data/zh/finance/finance-investment-researcher.md +283 -0
  376. package/data/zh/finance/finance-tax-strategist.md +250 -0
  377. package/data/zh/game-development/blender/blender-addon-engineer.md +233 -0
  378. package/data/zh/game-development/economy-designer.md +40 -0
  379. package/data/zh/game-development/game-audio-engineer.md +265 -0
  380. package/data/zh/game-development/game-designer.md +168 -0
  381. package/data/zh/game-development/godot/godot-gameplay-scripter.md +335 -0
  382. package/data/zh/game-development/godot/godot-multiplayer-engineer.md +296 -0
  383. package/data/zh/game-development/godot/godot-shader-developer.md +267 -0
  384. package/data/zh/game-development/level-designer.md +209 -0
  385. package/data/zh/game-development/narrative-designer.md +244 -0
  386. package/data/zh/game-development/roblox-studio/roblox-avatar-creator.md +298 -0
  387. package/data/zh/game-development/roblox-studio/roblox-experience-designer.md +306 -0
  388. package/data/zh/game-development/roblox-studio/roblox-systems-scripter.md +325 -0
  389. package/data/zh/game-development/technical-artist.md +230 -0
  390. package/data/zh/game-development/unity/unity-architect.md +272 -0
  391. package/data/zh/game-development/unity/unity-editor-tool-developer.md +300 -0
  392. package/data/zh/game-development/unity/unity-multiplayer-engineer.md +238 -0
  393. package/data/zh/game-development/unity/unity-shader-graph-artist.md +270 -0
  394. package/data/zh/game-development/unreal-engine/unreal-multiplayer-architect.md +314 -0
  395. package/data/zh/game-development/unreal-engine/unreal-systems-engineer.md +311 -0
  396. package/data/zh/game-development/unreal-engine/unreal-technical-artist.md +256 -0
  397. package/data/zh/game-development/unreal-engine/unreal-world-builder.md +274 -0
  398. package/data/zh/gis/gis-3d-scene-developer.md +110 -0
  399. package/data/zh/gis/gis-analyst.md +90 -0
  400. package/data/zh/gis/gis-bim-specialist.md +107 -0
  401. package/data/zh/gis/gis-cartography-designer.md +149 -0
  402. package/data/zh/gis/gis-drone-reality-mapping.md +119 -0
  403. package/data/zh/gis/gis-geoai-ml-engineer.md +104 -0
  404. package/data/zh/gis/gis-geoprocessing-specialist.md +96 -0
  405. package/data/zh/gis/gis-qa-engineer.md +132 -0
  406. package/data/zh/gis/gis-solution-engineer.md +100 -0
  407. package/data/zh/gis/gis-spatial-data-engineer.md +96 -0
  408. package/data/zh/gis/gis-spatial-data-scientist.md +110 -0
  409. package/data/zh/gis/gis-technical-consultant.md +85 -0
  410. package/data/zh/gis/gis-web-gis-developer.md +107 -0
  411. package/data/zh/healthcare/healthcare-clinical-evidence-agent.md +40 -0
  412. package/data/zh/healthcare/healthcare-innovation-strategist.md +40 -0
  413. package/data/zh/healthcare/healthcare-sovereign-health-systems-agent.md +40 -0
  414. package/data/zh/manual-bodies/engineering/engineering-ats-validator-architect.md +383 -0
  415. package/data/zh/manual-bodies/engineering/engineering-china-network-engineer.md +252 -0
  416. package/data/zh/manual-bodies/engineering/engineering-pdf-engine-architect.md +666 -0
  417. package/data/zh/manual-bodies/engineering/engineering-platform-engineer.md +271 -0
  418. package/data/zh/manual-bodies/engineering/engineering-universal-document-compiler.md +344 -0
  419. package/data/zh/manual-bodies/specialized/specialized-focus-music-architect.md +172 -0
  420. package/data/zh/manual.json +22 -0
  421. package/data/zh/marketing/marketing-aeo-foundations.md +263 -0
  422. package/data/zh/marketing/marketing-agentic-search-optimizer.md +312 -0
  423. package/data/zh/marketing/marketing-ai-citation-strategist.md +169 -0
  424. package/data/zh/marketing/marketing-app-store-optimizer.md +319 -0
  425. package/data/zh/marketing/marketing-baidu-seo-specialist.md +220 -0
  426. package/data/zh/marketing/marketing-bilibili-content-strategist.md +40 -0
  427. package/data/zh/marketing/marketing-book-co-author.md +109 -0
  428. package/data/zh/marketing/marketing-carousel-growth-engine.md +215 -0
  429. package/data/zh/marketing/marketing-china-ecommerce-operator.md +277 -0
  430. package/data/zh/marketing/marketing-china-market-localization-strategist.md +282 -0
  431. package/data/zh/marketing/marketing-content-creator.md +145 -0
  432. package/data/zh/marketing/marketing-cross-border-ecommerce.md +260 -0
  433. package/data/zh/marketing/marketing-douyin-strategist.md +150 -0
  434. package/data/zh/marketing/marketing-email-strategist.md +248 -0
  435. package/data/zh/marketing/marketing-global-podcast-strategist.md +204 -0
  436. package/data/zh/marketing/marketing-growth-hacker.md +121 -0
  437. package/data/zh/marketing/marketing-instagram-curator.md +179 -0
  438. package/data/zh/marketing/marketing-kuaishou-strategist.md +182 -0
  439. package/data/zh/marketing/marketing-linkedin-content-creator.md +232 -0
  440. package/data/zh/marketing/marketing-livestream-commerce-coach.md +303 -0
  441. package/data/zh/marketing/marketing-multi-platform-publisher.md +216 -0
  442. package/data/zh/marketing/marketing-podcast-strategist.md +278 -0
  443. package/data/zh/marketing/marketing-pr-communications-manager.md +472 -0
  444. package/data/zh/marketing/marketing-private-domain-operator.md +309 -0
  445. package/data/zh/marketing/marketing-reddit-community-builder.md +127 -0
  446. package/data/zh/marketing/marketing-seo-specialist.md +298 -0
  447. package/data/zh/marketing/marketing-short-video-editing-coach.md +413 -0
  448. package/data/zh/marketing/marketing-social-media-strategist.md +118 -0
  449. package/data/zh/marketing/marketing-tiktok-strategist.md +124 -0
  450. package/data/zh/marketing/marketing-twitter-engager.md +132 -0
  451. package/data/zh/marketing/marketing-video-optimization-specialist.md +128 -0
  452. package/data/zh/marketing/marketing-wechat-official-account.md +158 -0
  453. package/data/zh/marketing/marketing-weibo-strategist.md +241 -0
  454. package/data/zh/marketing/marketing-x-twitter-intelligence-analyst.md +160 -0
  455. package/data/zh/marketing/marketing-xiaohongshu-specialist.md +151 -0
  456. package/data/zh/marketing/marketing-zhihu-strategist.md +175 -0
  457. package/data/zh/names.json +281 -0
  458. package/data/zh/paid-media/paid-media-auditor.md +170 -0
  459. package/data/zh/paid-media/paid-media-creative-strategist.md +173 -0
  460. package/data/zh/paid-media/paid-media-paid-social-strategist.md +180 -0
  461. package/data/zh/paid-media/paid-media-ppc-strategist.md +180 -0
  462. package/data/zh/paid-media/paid-media-programmatic-buyer.md +177 -0
  463. package/data/zh/paid-media/paid-media-search-query-analyst.md +182 -0
  464. package/data/zh/paid-media/paid-media-tracking-specialist.md +199 -0
  465. package/data/zh/product/product-behavioral-nudge-engine.md +246 -0
  466. package/data/zh/product/product-feedback-synthesizer.md +175 -0
  467. package/data/zh/product/product-manager.md +474 -0
  468. package/data/zh/product/product-sprint-prioritizer.md +133 -0
  469. package/data/zh/product/product-trend-researcher.md +143 -0
  470. package/data/zh/project-management/project-management-experiment-tracker.md +206 -0
  471. package/data/zh/project-management/project-management-jira-workflow-steward.md +249 -0
  472. package/data/zh/project-management/project-management-meeting-notes-specialist.md +94 -0
  473. package/data/zh/project-management/project-management-project-shepherd.md +202 -0
  474. package/data/zh/project-management/project-management-studio-operations.md +208 -0
  475. package/data/zh/project-management/project-management-studio-producer.md +211 -0
  476. package/data/zh/project-management/project-manager-senior.md +135 -0
  477. package/data/zh/research/research-synthesist.md +40 -0
  478. package/data/zh/sales/sales-account-strategist.md +243 -0
  479. package/data/zh/sales/sales-coach.md +291 -0
  480. package/data/zh/sales/sales-deal-strategist.md +204 -0
  481. package/data/zh/sales/sales-discovery-coach.md +230 -0
  482. package/data/zh/sales/sales-engineer.md +200 -0
  483. package/data/zh/sales/sales-offer-lead-gen-strategist.md +256 -0
  484. package/data/zh/sales/sales-outbound-strategist.md +208 -0
  485. package/data/zh/sales/sales-pipeline-analyst.md +284 -0
  486. package/data/zh/sales/sales-proposal-strategist.md +233 -0
  487. package/data/zh/security/security-ai-generated-code-auditor.md +40 -0
  488. package/data/zh/security/security-appsec-engineer.md +490 -0
  489. package/data/zh/security/security-architect.md +303 -0
  490. package/data/zh/security/security-blockchain-security-auditor.md +462 -0
  491. package/data/zh/security/security-cloud-security-architect.md +522 -0
  492. package/data/zh/security/security-compliance-auditor.md +157 -0
  493. package/data/zh/security/security-incident-responder.md +436 -0
  494. package/data/zh/security/security-penetration-tester.md +398 -0
  495. package/data/zh/security/security-secrets-credential-engineer.md +40 -0
  496. package/data/zh/security/security-senior-secops.md +751 -0
  497. package/data/zh/security/security-threat-detection-engineer.md +533 -0
  498. package/data/zh/security/security-threat-intelligence-analyst.md +643 -0
  499. package/data/zh/spatial-computing/macos-spatial-metal-engineer.md +337 -0
  500. package/data/zh/spatial-computing/terminal-integration-specialist.md +236 -0
  501. package/data/zh/spatial-computing/visionos-spatial-engineer.md +282 -0
  502. package/data/zh/spatial-computing/xr-cockpit-interaction-specialist.md +220 -0
  503. package/data/zh/spatial-computing/xr-immersive-developer.md +229 -0
  504. package/data/zh/spatial-computing/xr-interface-architect.md +253 -0
  505. package/data/zh/specialized/accounts-payable-agent.md +212 -0
  506. package/data/zh/specialized/agentic-identity-trust.md +388 -0
  507. package/data/zh/specialized/agents-orchestrator.md +366 -0
  508. package/data/zh/specialized/automation-governance-architect.md +215 -0
  509. package/data/zh/specialized/business-strategist.md +487 -0
  510. package/data/zh/specialized/change-management-consultant.md +495 -0
  511. package/data/zh/specialized/chief-financial-officer.md +390 -0
  512. package/data/zh/specialized/corporate-training-designer.md +191 -0
  513. package/data/zh/specialized/customer-service.md +40 -0
  514. package/data/zh/specialized/customer-success-manager.md +458 -0
  515. package/data/zh/specialized/data-consolidation-agent.md +327 -0
  516. package/data/zh/specialized/data-privacy-officer.md +411 -0
  517. package/data/zh/specialized/esg-sustainability-officer.md +395 -0
  518. package/data/zh/specialized/government-digital-presales-consultant.md +362 -0
  519. package/data/zh/specialized/grant-writer.md +510 -0
  520. package/data/zh/specialized/healthcare-aging-parent-care-companion.md +40 -0
  521. package/data/zh/specialized/healthcare-customer-service.md +388 -0
  522. package/data/zh/specialized/healthcare-marketing-compliance.md +394 -0
  523. package/data/zh/specialized/hospitality-guest-services.md +597 -0
  524. package/data/zh/specialized/hr-onboarding.md +450 -0
  525. package/data/zh/specialized/identity-graph-operator.md +270 -0
  526. package/data/zh/specialized/language-translator.md +275 -0
  527. package/data/zh/specialized/legal-billing-time-tracking.md +566 -0
  528. package/data/zh/specialized/legal-client-intake.md +487 -0
  529. package/data/zh/specialized/legal-document-review.md +452 -0
  530. package/data/zh/specialized/loan-officer-assistant.md +549 -0
  531. package/data/zh/specialized/lsp-index-engineer.md +334 -0
  532. package/data/zh/specialized/ma-integration-manager.md +426 -0
  533. package/data/zh/specialized/medical-billing-coding-specialist.md +489 -0
  534. package/data/zh/specialized/operations-manager.md +398 -0
  535. package/data/zh/specialized/organizational-psychologist.md +390 -0
  536. package/data/zh/specialized/personal-growth-mentor.md +158 -0
  537. package/data/zh/specialized/real-estate-buyer-seller.md +594 -0
  538. package/data/zh/specialized/recruitment-specialist.md +49 -0
  539. package/data/zh/specialized/report-distribution-agent.md +354 -0
  540. package/data/zh/specialized/resume-tailor.md +40 -0
  541. package/data/zh/specialized/retail-customer-returns.md +564 -0
  542. package/data/zh/specialized/sales-data-extraction-agent.md +159 -0
  543. package/data/zh/specialized/sales-outreach.md +40 -0
  544. package/data/zh/specialized/specialized-chief-of-staff.md +40 -0
  545. package/data/zh/specialized/specialized-civil-engineer.md +355 -0
  546. package/data/zh/specialized/specialized-codebase-archaeologist.md +40 -0
  547. package/data/zh/specialized/specialized-cultural-intelligence-strategist.md +168 -0
  548. package/data/zh/specialized/specialized-developer-advocate.md +334 -0
  549. package/data/zh/specialized/specialized-document-generator.md +346 -0
  550. package/data/zh/specialized/specialized-fedramp-rmf-compliance.md +40 -0
  551. package/data/zh/specialized/specialized-focus-music-architect.md +172 -0
  552. package/data/zh/specialized/specialized-french-consulting-market.md +46 -0
  553. package/data/zh/specialized/specialized-korean-business-navigator.md +46 -0
  554. package/data/zh/specialized/specialized-master-plan-architect.md +40 -0
  555. package/data/zh/specialized/specialized-mcp-builder.md +351 -0
  556. package/data/zh/specialized/specialized-model-qa.md +507 -0
  557. package/data/zh/specialized/specialized-pricing-analyst.md +242 -0
  558. package/data/zh/specialized/specialized-salesforce-architect.md +179 -0
  559. package/data/zh/specialized/specialized-strategy-duel-agent.md +129 -0
  560. package/data/zh/specialized/specialized-workflow-architect.md +596 -0
  561. package/data/zh/specialized/study-abroad-advisor.md +281 -0
  562. package/data/zh/specialized/supply-chain-strategist.md +581 -0
  563. package/data/zh/specialized/zk-steward.md +228 -0
  564. package/data/zh/support/support-analytics-reporter.md +364 -0
  565. package/data/zh/support/support-executive-summary-generator.md +217 -0
  566. package/data/zh/support/support-finance-tracker.md +447 -0
  567. package/data/zh/support/support-infrastructure-maintainer.md +623 -0
  568. package/data/zh/support/support-legal-compliance-checker.md +587 -0
  569. package/data/zh/support/support-support-responder.md +584 -0
  570. package/data/zh/testing/testing-accessibility-auditor.md +329 -0
  571. package/data/zh/testing/testing-api-tester.md +305 -0
  572. package/data/zh/testing/testing-evidence-collector.md +153 -0
  573. package/data/zh/testing/testing-performance-benchmarker.md +196 -0
  574. package/data/zh/testing/testing-reality-checker.md +235 -0
  575. package/data/zh/testing/testing-test-automation-engineer.md +40 -0
  576. package/data/zh/testing/testing-test-results-analyzer.md +313 -0
  577. package/data/zh/testing/testing-tool-evaluator.md +402 -0
  578. package/data/zh/testing/testing-workflow-optimizer.md +458 -0
  579. package/lib/assets/t-team/action-celebrating-v2.png +0 -0
  580. package/lib/assets/t-team/action-reporting-v2.png +0 -0
  581. package/lib/assets/t-team/action-sending-v2.png +0 -0
  582. package/lib/assets/t-team/action-sleeping-v2.png +0 -0
  583. package/lib/assets/t-team/action-thinking-v2.png +0 -0
  584. package/lib/assets/t-team/action-working-v2.png +0 -0
  585. package/lib/assets/t-team/member-data-v2.png +0 -0
  586. package/lib/assets/t-team/member-designer-v2.png +0 -0
  587. package/lib/assets/t-team/member-docs-v2.png +0 -0
  588. package/lib/assets/t-team/member-engineer-v2.png +0 -0
  589. package/lib/assets/t-team/member-operator-v2.png +0 -0
  590. package/lib/assets/t-team/member-qa-v2.png +0 -0
  591. package/lib/assets/t-team/member-researcher-v2.png +0 -0
  592. package/lib/assets/t-team/member-security-v2.png +0 -0
  593. package/lib/assets/t-team/team-lead-v2.png +0 -0
  594. package/lib/bootstrap.js +85 -0
  595. package/lib/catalog.js +376 -0
  596. package/lib/client.js +21034 -0
  597. package/lib/command.js +228 -0
  598. package/lib/i18n.js +136 -0
  599. package/lib/index.js +686 -0
  600. package/lib/plan-check.js +171 -0
  601. package/lib/remote.js +353 -0
  602. package/lib/squads.js +231 -0
  603. package/lib/teams/capabilities.js +106 -0
  604. package/lib/teams/command.js +143 -0
  605. package/lib/teams/event-types.js +12 -0
  606. package/lib/teams/events.js +60 -0
  607. package/lib/teams/harness-compat.js +179 -0
  608. package/lib/teams/index.js +441 -0
  609. package/lib/teams/members.js +602 -0
  610. package/lib/teams/profiles.js +572 -0
  611. package/lib/teams/quality-gates.js +822 -0
  612. package/lib/teams/scheduler.js +434 -0
  613. package/lib/teams/snapshot.js +181 -0
  614. package/lib/teams/state.js +925 -0
  615. package/lib/teams/tool-names.js +11 -0
  616. package/lib/teams/tools.js +2279 -0
  617. package/lib/teams/types.js +22 -0
  618. package/lib/teams/web-routes.js +86 -0
  619. package/package.json +191 -0
package/lib/index.js ADDED
@@ -0,0 +1,686 @@
1
+ /**
2
+ * T专家 host 插件:把 ~/.t-team/experts 里的专家名册接到 DSH。
3
+ *
4
+ * 提供:
5
+ * - 工具 list_t_experts / summon_t_expert / summon_t_experts
6
+ * - 设置段 t-team(enabled: 已启用的专家 slug)
7
+ * - systemPrompt 段(只在父会话里说明 @ 召唤语义与工具用法)
8
+ * - 服务 tTeamCatalog(远程服务用它读名册与 persona)
9
+ *
10
+ * 与其它专家插件并存:工具名、设置命名空间、服务名、remote 服务名都不重叠。
11
+ */
12
+ import { homedir } from "node:os";
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { stat } from "node:fs/promises";
15
+ import { dirname, join } from "node:path";
16
+ import schema from "@deepseek-ai/schemastery";
17
+ import { defineTool } from "@deepseek-ai/dsh-tools";
18
+ import {
19
+ DEFAULT_DIVISIONS,
20
+ catalogDivisions,
21
+ divisionOf,
22
+ groupByDivision,
23
+ loadCatalog,
24
+ mapPool,
25
+ readPersona,
26
+ resolveExpert,
27
+ sanitize,
28
+ truncate,
29
+ } from "./catalog.js";
30
+ import { localized, NS, readLocale, renderList, renderSummonResults, t } from "./i18n.js";
31
+ import { seedData } from "./bootstrap.js";
32
+ import { registerTeamCommand } from "./command.js";
33
+ import { createSquadService } from "./squads.js";
34
+ import { checkPlan } from "./plan-check.js";
35
+ import { findTeamByCaptain } from "./teams/state.js";
36
+ import { createUserMessage } from "@deepseek-ai/dsh-llm";
37
+ // 路线 A:上游团队引擎已 vendor 进 lib/teams/(由 scripts/brand.mjs 从 vendor/dsh-agent-teams/upstream/
38
+ // 改名生成:命令 /agent-teams → /t、工具 agent_teams_* → t_team_*),这里在 T专家 内部挂载它 ——
39
+ // 安装 T专家 即自带团队引擎与团队面板,不再需要单独安装上游插件。
40
+ import * as teamsEngine from "./teams/index.js";
41
+ // 引擎自带的 /t 命令不注册(否则与 T专家 自己的 /t 撞名),但手势边界必须复用:
42
+ // 它把 `/t --profile <小队> <目标>` 这条用户消息翻译成队长协议指令。
43
+ import { installTTeamGestureBoundary } from "./teams/command.js";
44
+ // 设置页「团队」标签复用引擎自己的快照收集与停止实现(不重写一套)。
45
+ import { collectArchivedTeamsActivity, collectTeamsActivity } from "./teams/snapshot.js";
46
+ import { haltTeamWork } from "./teams/tools.js";
47
+
48
+ export const name = NS;
49
+ export const inject = ["tools", "subagents", "systemPrompt", "settings", "commands"];
50
+
51
+ /** 插件配置;root 默认指向 T专家 的固定资产目录。 */
52
+ export const Config = schema.object({
53
+ root: schema.string().default(join(homedir(), ".t-team", "experts")),
54
+ zhRoot: schema.string().default(join(homedir(), ".t-team", "zh")),
55
+ provider: schema.string().default("spawn"),
56
+ /** 留空 = 自动扫描 root 下所有含 .md 的分区目录(上游新增分区不必改配置/代码)。 */
57
+ divisions: schema.array(schema.string()).default([]),
58
+ maxDepth: schema.natural(),
59
+ });
60
+
61
+ /** 供 remote 服务读取名册的服务名。 */
62
+ export const CATALOG_SERVICE = "tTeamCatalog";
63
+ /** 小队定义服务(设置页「小队」标签读写 teams.json)。 */
64
+ export const SQUAD_SERVICE = "tTeamSquads";
65
+ /** 团队运行服务(设置页「团队」标签列活动/归档团队、停止团队)。 */
66
+ export const TEAM_SERVICE = "tTeamTeams";
67
+ /** 设置命名空间(= 插件名)。 */
68
+ export const SETTINGS_NAMESPACE = NS;
69
+
70
+ const SUMMON_EXPERTS_MAX = 8;
71
+ const SUMMON_EXPERTS_CONCURRENCY = 4;
72
+ const SUMMON_TASK_MAX_CHARS = 8000;
73
+ const DESCRIPTION_LIMIT = 120;
74
+
75
+ const settingsSchema = schema.object({
76
+ enabled: schema.array(schema.string()).default([]),
77
+ });
78
+
79
+ export function apply(ctx, config) {
80
+ const locale = () => readLocale(ctx);
81
+ const maxDepth = config.maxDepth;
82
+
83
+ // ---- 首次启动播种:包内自带名册快照 → 可写数据目录(非破坏性,已有内容不动)----
84
+ // 必须在下面同步读取 t-team.config.json / teams.json 之前完成,否则首次安装会读到空配置。
85
+ const seeded = seedData({ root: config.root, zhRoot: config.zhRoot });
86
+ if (seeded.copied.length > 0) {
87
+ console.log(`[t-team] 已把包内名册快照播种到 ${dirname(config.root)}(${seeded.copied.join(", ")})`);
88
+ }
89
+ if (!seeded.ok) {
90
+ console.warn(`[t-team] 名册快照播种失败,将按已有数据继续:${seeded.error}`);
91
+ }
92
+
93
+ // ---- 设置段(T专家 自己的命名空间,与其它插件不冲突)----
94
+ const scope = ctx.settings.register(SETTINGS_NAMESPACE, settingsSchema, {
95
+ base: { enabled: [] },
96
+ applies: "live",
97
+ validate: (value) => {
98
+ const list = value?.enabled;
99
+ if (!Array.isArray(list) || list.some((item) => typeof item !== "string")) {
100
+ throw new Error("t-team.enabled 必须是字符串数组");
101
+ }
102
+ },
103
+ });
104
+ const enabledSet = () => new Set(
105
+ (scope.get()?.enabled ?? []).filter((value) => typeof value === "string"),
106
+ );
107
+
108
+ // ---- 花名册加载 ----
109
+ let entries = [];
110
+ let effectiveDivisions = config.divisions.length > 0 ? config.divisions.slice() : DEFAULT_DIVISIONS.slice();
111
+ let divisionLabels = {};
112
+ let loaded = false;
113
+ let loading = null;
114
+ let stamp = "";
115
+ let loadError = null;
116
+
117
+ /**
118
+ * 名册指纹:source.json 与各分区目录 + 中文侧车文件的 mtime。
119
+ * sync.sh / sync-zh.py 每次都会写这些文件,所以上游更新后**无需重启**即可自动重载;
120
+ * 目录 mtime 同时覆盖「新增/删除专家」。
121
+ */
122
+ async function fingerprint() {
123
+ const mtimeOf = (path) => stat(path).then((info) => info.mtimeMs).catch(() => 0);
124
+ const parts = await Promise.all([
125
+ mtimeOf(config.root),
126
+ mtimeOf(join(dirname(config.root), "source.json")),
127
+ mtimeOf(join(config.zhRoot, "names.json")),
128
+ mtimeOf(join(config.zhRoot, "descriptions.json")),
129
+ mtimeOf(join(config.zhRoot, "divisions.json")),
130
+ ...effectiveDivisions.map((division) => mtimeOf(join(config.root, division))),
131
+ ]);
132
+ return parts.join("|");
133
+ }
134
+
135
+ async function load() {
136
+ try {
137
+ const catalog = await loadCatalog(config.root, config.divisions, { zhRoot: config.zhRoot });
138
+ entries = [...catalog.values()];
139
+ const discovered = catalogDivisions(catalog);
140
+ if (discovered.length > 0) effectiveDivisions = discovered;
141
+ divisionLabels = catalog.labels ?? {};
142
+ loadError = null;
143
+ loaded = true;
144
+ stamp = await fingerprint(); // 记录加载后的指纹
145
+ } catch (error) {
146
+ loadError = error instanceof Error ? error : new Error(String(error));
147
+ loaded = false;
148
+ }
149
+ }
150
+
151
+ async function ensureReady() {
152
+ const now = await fingerprint();
153
+ if (!loaded || now !== stamp) {
154
+ if (loading === null) {
155
+ loading = load().finally(() => {
156
+ loading = null;
157
+ });
158
+ }
159
+ await loading;
160
+ }
161
+ if (loadError !== null) throw loadError;
162
+ }
163
+ /** 可召唤/可展示的专家(排除重名冲突项)。 */
164
+ const usable = () => entries.filter((expert) => expert.conflict !== true);
165
+
166
+ // ---- 设置段修订号与写入 ----
167
+ const revision = () => {
168
+ const descriptor = ctx.settings.describe().find((item) => item.ns === SETTINGS_NAMESPACE);
169
+ if (descriptor === undefined) throw new Error(t(locale(), "error.settingsMissing"));
170
+ return descriptor.revision;
171
+ };
172
+
173
+ /** 客户端面板用的名册快照。 */
174
+ async function snapshot() {
175
+ await ensureReady();
176
+ const enabled = enabledSet();
177
+ return {
178
+ // 面板按 locale 取字段:name/description 为中文(缺译回退英文),nameEn/descriptionEn 恒为英文。
179
+ experts: usable().map((expert) => ({
180
+ slug: expert.slug,
181
+ name: expert.nameZh ?? expert.name,
182
+ nameEn: expert.nameEn,
183
+ description: expert.descriptionZh ?? expert.description,
184
+ descriptionEn: expert.descriptionEn,
185
+ emoji: expert.emoji,
186
+ division: expert.division,
187
+ divisionZh: divisionOf(expert.division, divisionLabels).zh,
188
+ divisionEn: divisionOf(expert.division, divisionLabels).en,
189
+ conflict: expert.conflict === true,
190
+ })),
191
+ enabled: [...enabled],
192
+ revision: revision(),
193
+ };
194
+ }
195
+
196
+ /** 按需读取一位专家的 persona 正文。 */
197
+ async function prompt(slug, division) {
198
+ await ensureReady();
199
+ const expert = usable().find((item) => item.slug === slug && item.division === division);
200
+ if (expert === undefined) throw new Error(`找不到专家:${slug}`);
201
+ return { prompt: await readPersona(expert) };
202
+ }
203
+
204
+ /** 整体替换启用列表(远程服务用)。 */
205
+ async function setEnabled(next, expectedRevision) {
206
+ const list = (Array.isArray(next) ? next : []).filter((item) => typeof item === "string");
207
+ const known = new Set(usable().map((expert) => expert.slug));
208
+ const unknown = list.filter((slug) => !known.has(slug));
209
+ if (unknown.length > 0) throw new Error(`未知专家 slug:${unknown.slice(0, 5).join(", ")}`);
210
+ await ctx.settings.mutate(SETTINGS_NAMESPACE, [{ op: "set", path: ["enabled"], value: list }], expectedRevision);
211
+ return { enabled: [...enabledSet()], revision: revision() };
212
+ }
213
+
214
+ const catalogService = { snapshot, prompt, setEnabled, root: config.root };
215
+ ctx.reflect.provide(CATALOG_SERVICE, catalogService);
216
+
217
+ // ---- 召唤 ----
218
+ async function runExpert(query, task, exec) {
219
+ const current = locale();
220
+ const taskText = String(task ?? "").trim();
221
+ if (taskText === "") throw new Error(t(current, "error.taskEmpty"));
222
+ if ([...taskText].length > SUMMON_TASK_MAX_CHARS) {
223
+ throw new Error(t(current, "error.taskTooLong", { limit: SUMMON_TASK_MAX_CHARS }));
224
+ }
225
+ if (exec.agent === undefined) throw new Error(t(current, "error.summonRequiresAgent"));
226
+
227
+ const provider = ctx.subagents.getProvider(config.provider);
228
+ if (provider === undefined) {
229
+ throw new Error(t(current, "error.providerMissing", { provider: config.provider }));
230
+ }
231
+ if (provider.capabilities.persona !== true) {
232
+ throw new Error(t(current, "error.providerNoPersona", { provider: config.provider }));
233
+ }
234
+ if (provider.capabilities.toolFilter !== true) {
235
+ throw new Error(t(current, "error.providerNoToolFilter", { provider: config.provider }));
236
+ }
237
+ if (maxDepth !== undefined && provider.capabilities.depthLimit !== true) {
238
+ throw new Error(t(current, "error.providerNoMaxDepth", { provider: config.provider }));
239
+ }
240
+
241
+ await ensureReady();
242
+ const expert = resolveExpert(usable(), query, current);
243
+ if (!enabledSet().has(expert.slug)) {
244
+ throw new Error(t(current, "error.expertDisabled", { name: localized(expert, current).name }));
245
+ }
246
+ const persona = await readPersona(expert, current);
247
+ const run = await ctx.subagents.start(config.provider, {
248
+ label: `t-team:${expert.slug}`,
249
+ prompt: [{ type: "text", text: taskText }],
250
+ parent: exec.agent,
251
+ persona: sanitize(persona),
252
+ toolFilter: { deny: ["summon_t_expert", "summon_t_experts", "list_t_experts"] },
253
+ ...(maxDepth === undefined ? {} : { maxDepth }),
254
+ signal: exec.signal,
255
+ });
256
+ try {
257
+ const result = await run.result;
258
+ const text = (result.output ?? [])
259
+ .filter((block) => block?.type === "text")
260
+ .map((block) => block.text)
261
+ .join("");
262
+ if (result.stopReason !== "completed") {
263
+ throw new Error(t(current, "error.expertRun", {
264
+ reason: result.stopReason,
265
+ detail: text === "" ? "" : t(current, "error.partialOutput", { text }),
266
+ }));
267
+ }
268
+ return { expert: localized(expert, current).name, answer: text };
269
+ } finally {
270
+ await run.dispose();
271
+ }
272
+ }
273
+
274
+ /** 预检报告的中文渲染。 */
275
+ function renderPlanReport(value) {
276
+ const lines = [value.ok === true ? "预检通过:这套任务可以按顺序创建。" : `预检未通过:${value.problems.length} 个问题。`];
277
+ for (const problem of value.problems ?? []) {
278
+ const where = problem.id === undefined ? "" : `[${problem.id}] `;
279
+ lines.push(`- ✗ ${where}${problem.subject === "" ? "" : `${problem.subject}:`}${problem.error}`);
280
+ }
281
+ if ((value.warnings ?? []).length > 0) {
282
+ lines.push("提示(不阻塞):");
283
+ for (const warning of value.warnings) lines.push(`- ! ${warning}`);
284
+ }
285
+ if ((value.order ?? []).length > 0) {
286
+ lines.push(`建议创建/执行顺序:${value.order.join(" → ")}`);
287
+ }
288
+ return lines.join("\n");
289
+ }
290
+
291
+ // ---- 工具 ----
292
+ ctx.tools.register(defineTool({
293
+ name: "list_t_experts",
294
+ description: "List the enabled T专家 domain experts grouped by division. Without a division filter it returns division names and counts; pass a division to expand it with expert names and descriptions. Call this before summon_t_expert to choose an expert name.",
295
+ parameters: {
296
+ division: {
297
+ type: "string",
298
+ description: "Optional division key to filter (e.g. engineering, marketing, security, design).",
299
+ },
300
+ },
301
+ output: {
302
+ schema: {
303
+ type: "object",
304
+ additionalProperties: false,
305
+ properties: {
306
+ divisions: { type: "array", required: true, items: { type: "json" } },
307
+ total: { type: "number", required: true },
308
+ },
309
+ },
310
+ render: (args, value) => [{
311
+ type: "text",
312
+ text: renderList(locale(), {
313
+ query: args.division === undefined ? "" : String(args.division).trim(),
314
+ groups: value.divisions,
315
+ total: value.total,
316
+ allDivisions: effectiveDivisions,
317
+ }),
318
+ }],
319
+ },
320
+ async execute(args) {
321
+ await ensureReady();
322
+ const query = args.division === undefined ? "" : String(args.division).trim();
323
+ const enabled = enabledSet();
324
+ const groups = groupByDivision(usable(), enabled);
325
+ if (query === "") {
326
+ return {
327
+ divisions: groups.map((group) => ({
328
+ division: group.division,
329
+ label: group.label,
330
+ labelEn: group.labelEn,
331
+ count: group.count,
332
+ })),
333
+ total: enabled.size,
334
+ };
335
+ }
336
+ const needle = query.toLowerCase();
337
+ const matched = groups
338
+ .filter((group) => group.division.toLowerCase() === needle
339
+ || group.label.toLowerCase() === needle
340
+ || group.labelEn.toLowerCase() === needle)
341
+ .map((group) => ({
342
+ division: group.division,
343
+ label: group.label,
344
+ labelEn: group.labelEn,
345
+ count: group.count,
346
+ experts: group.experts.map((expert) => {
347
+ const { name, description } = localized(expert, locale());
348
+ return {
349
+ slug: expert.slug,
350
+ name,
351
+ emoji: expert.emoji,
352
+ description: truncate(description, DESCRIPTION_LIMIT),
353
+ };
354
+ }),
355
+ }));
356
+ return {
357
+ divisions: matched,
358
+ total: matched.reduce((sum, group) => sum + group.count, 0),
359
+ };
360
+ },
361
+ }));
362
+
363
+ ctx.tools.register(defineTool({
364
+ name: "summon_t_expert",
365
+ description: "Summon one T专家 domain expert to complete a task: a specialist subagent runs with that expert's full persona and returns its result. Use it for tasks that clearly belong to a specialist domain. This call waits for the result. Call list_t_experts first when the expert name is unknown.",
366
+ parameters: {
367
+ expert: { type: "string", required: true, description: "Expert name to summon — the Chinese display name (e.g. \"前端开发者\"), the English name (e.g. \"Frontend Developer\"), or its slug (e.g. engineering-frontend-developer). Copy the name exactly as list_t_experts returned it." },
368
+ task: { type: "string", required: true, description: "The complete, self-contained task to give the expert. Include all necessary context." },
369
+ },
370
+ output: {
371
+ schema: {
372
+ type: "object",
373
+ additionalProperties: false,
374
+ properties: {
375
+ expert: { type: "string", required: true },
376
+ answer: { type: "string", required: true },
377
+ },
378
+ },
379
+ render: (_args, value) => [{ type: "text", text: value.answer }],
380
+ },
381
+ async execute(args, exec) {
382
+ await ensureReady();
383
+ return runExpert(args.expert, args.task, exec);
384
+ },
385
+ }));
386
+
387
+ ctx.tools.register(defineTool({
388
+ name: "summon_t_experts",
389
+ description: "Summon multiple T专家 experts in parallel for one mission. At most 8 experts run with concurrency 4; successful answers are returned even when some fail.",
390
+ parameters: {
391
+ experts: {
392
+ type: "array",
393
+ required: true,
394
+ description: "The experts to summon, each with its own name and task.",
395
+ items: {
396
+ type: "object",
397
+ additionalProperties: false,
398
+ properties: {
399
+ expert: { type: "string", required: true, description: "Expert name — Chinese display name, English name, or slug." },
400
+ task: { type: "string", required: true, description: "That expert's complete task." },
401
+ },
402
+ },
403
+ },
404
+ },
405
+ output: {
406
+ schema: {
407
+ type: "object",
408
+ additionalProperties: false,
409
+ properties: { results: { type: "array", required: true, items: { type: "json" } } },
410
+ },
411
+ render: (_args, value) => [{
412
+ type: "text",
413
+ text: renderSummonResults(locale(), value.results),
414
+ }],
415
+ },
416
+ async execute(args, exec) {
417
+ await ensureReady();
418
+ const current = locale();
419
+ const specs = Array.isArray(args.experts) ? args.experts : [];
420
+ if (specs.length === 0) throw new Error(t(current, "error.specsEmpty"));
421
+ if (specs.length > SUMMON_EXPERTS_MAX) {
422
+ throw new Error(t(current, "error.specsTooMany", { limit: SUMMON_EXPERTS_MAX }));
423
+ }
424
+ specs.forEach((spec, index) => {
425
+ if (spec === null || typeof spec !== "object" || typeof spec.expert !== "string" || typeof spec.task !== "string") {
426
+ throw new Error(t(current, "error.specInvalid", { index }));
427
+ }
428
+ });
429
+ const results = await mapPool(specs, SUMMON_EXPERTS_CONCURRENCY, async (spec) => {
430
+ try {
431
+ const result = await runExpert(spec.expert, spec.task, exec);
432
+ return { expert: result.expert, ok: true, answer: result.answer };
433
+ } catch (error) {
434
+ return {
435
+ expert: spec.expert,
436
+ ok: false,
437
+ answer: "",
438
+ error: error instanceof Error ? error.message : String(error),
439
+ };
440
+ }
441
+ });
442
+ return { results };
443
+ },
444
+ }));
445
+
446
+ // ---- 内置团队引擎(vendor 自上游并品牌化;配置来自 team-profiles.py 生成的 JSON)----
447
+ // 配置文件名已随品牌改为 t-team.config.json,旧名 agent-teams.config.json 仍作为兜底读一次。
448
+ const engineConfigDir = dirname(config.root);
449
+ const engineConfigPath = ["t-team.config.json", "agent-teams.config.json"]
450
+ .map((file) => join(engineConfigDir, file))
451
+ .find((candidate) => existsSync(candidate)) ?? join(engineConfigDir, "t-team.config.json");
452
+ let engineConfig = {};
453
+ try {
454
+ const parsed = JSON.parse(readFileSync(engineConfigPath, "utf8"));
455
+ if (parsed !== null && typeof parsed === "object") engineConfig = parsed;
456
+ } catch {
457
+ console.warn(`[t-team] 未读到团队引擎配置 ${engineConfigPath}(跑一次 team-profiles.py 生成小队后即可用 /t 拉起团队)`);
458
+ }
459
+ // 引擎与名册解耦:引擎挂载失败(例如 Harness 子代理契约不匹配)时,
460
+ // T专家 的专家名册、@ 召唤、/t 列表仍然可用,只是团队功能不可用;失败原因会经 /t 报出来。
461
+ const engineState = { ok: false, detail: "" };
462
+ try {
463
+ ctx.plugin(teamsEngine, {
464
+ stateDir: typeof engineConfig.stateDir === "string" ? engineConfig.stateDir : ".agent-teams",
465
+ memberProvider: typeof engineConfig.memberProvider === "string" ? engineConfig.memberProvider : "spawn",
466
+ ...(engineConfig.memberModel === undefined ? {} : { memberModel: engineConfig.memberModel }),
467
+ ...(engineConfig.memberMaxDepth === undefined ? {} : { memberMaxDepth: engineConfig.memberMaxDepth }),
468
+ ...(engineConfig.maxMembers === undefined ? {} : { maxMembers: engineConfig.maxMembers }),
469
+ // 引擎自带命令必须关掉:T专家 自己注册 /t(带小队别名解析),否则两个同名命令相撞。
470
+ // 手势边界另外复用(见下),它是队长协议真正被触发的地方。
471
+ slashCommand: false,
472
+ profiles: engineConfig.profiles ?? {},
473
+ });
474
+ // 复用引擎导出的手势边界:把 `/t --profile <小队> <目标>` 这条用户消息翻成队长协议指令。
475
+ installTTeamGestureBoundary(ctx, () => engineConfig.profiles ?? {});
476
+ engineState.ok = true;
477
+ } catch (error) {
478
+ engineState.detail = error instanceof Error ? error.message : String(error);
479
+ console.error(`[t-team] 团队引擎挂载失败(专家名册功能不受影响):${engineState.detail}`);
480
+ }
481
+
482
+ // ---- 小队定义服务(设置页「小队」标签用;写回 teams.json 后自动重跑 team-profiles.py)----
483
+ const teamsFile = join(dirname(config.root), "teams.json");
484
+ const squads = createSquadService({
485
+ teamsFile,
486
+ catalog: catalogService,
487
+ });
488
+ ctx.reflect.provide(SQUAD_SERVICE, squads);
489
+
490
+ // ---- 团队运行服务(设置页「团队」标签用;复用引擎的快照与停止实现)----
491
+ const engineStateDir = typeof engineConfig.stateDir === "string" ? engineConfig.stateDir : ".agent-teams";
492
+ const teamRoots = () => {
493
+ const registry = ctx.get("workspaceRegistry") ?? ctx.get("workspace");
494
+ const list = typeof registry?.list === "function" ? registry.list() : [];
495
+ return list
496
+ .map((workspace) => ({
497
+ workspace: workspace.title ?? workspace.path,
498
+ path: workspace.path,
499
+ stateRoot: join(workspace.path, engineStateDir),
500
+ }))
501
+ .filter((root) => typeof root.stateRoot === "string");
502
+ };
503
+ const compactTeam = (team) => ({
504
+ teamId: team.teamId,
505
+ name: team.name,
506
+ workspace: team.workspace,
507
+ captainSessionId: team.captainSessionId,
508
+ phase: team.phase,
509
+ halted: team.halted === true,
510
+ members: (team.members ?? []).map((member) => ({
511
+ name: member.name,
512
+ role: member.role ?? "",
513
+ status: member.status,
514
+ activity: member.activity,
515
+ done: member.done ?? 0,
516
+ total: member.total ?? 0,
517
+ })),
518
+ tasks: (team.tasks ?? []).map((task) => ({
519
+ id: task.id,
520
+ subject: task.subject,
521
+ status: task.status,
522
+ assignee: task.assignee ?? "",
523
+ })),
524
+ });
525
+ ctx.reflect.provide(TEAM_SERVICE, {
526
+ async list(archived = false) {
527
+ const roots = teamRoots();
528
+ if (roots.length === 0) return [];
529
+ const snapshots = archived
530
+ ? await collectArchivedTeamsActivity(ctx, roots)
531
+ : await collectTeamsActivity(ctx, roots);
532
+ return snapshots.map(compactTeam);
533
+ },
534
+ /** 面板里点一支小队:投一条 `/t --profile <key>` 让队长按该小队接活(目标由队长追问用户)。 */
535
+ async start(profileKey, sessionId) {
536
+ const list = await squads.list();
537
+ const hit = list.squads.find((squad) => squad.key === profileKey && squad.enabled !== false);
538
+ if (hit === undefined) throw new Error(`没有可用的「${profileKey}」小队(可能已关停或改名)。`);
539
+ // 注意:cordis 里 `ctx.agents` 是属性访问,未 inject 会抛 "cannot get property agents without inject";
540
+ // 这里要的是「可选服务」,必须走 ctx.get()(与 workspaceRegistry 一样的用法)。
541
+ const agents = ctx.get("agents");
542
+ const agent = typeof sessionId === "string" && sessionId !== "" ? agents?.get?.(sessionId) : undefined;
543
+ if (agent === undefined) throw new Error("当前会话不在运行中,无法从这里拉起小队(先用 /t 试)。");
544
+ agent.followup(createUserMessage({
545
+ content: [{ type: "text", text: `/t --profile ${profileKey}` }],
546
+ source: { kind: "user" },
547
+ }));
548
+ return {
549
+ profile: profileKey,
550
+ label: hit.description === "" ? profileKey : hit.description,
551
+ members: hit.members.length,
552
+ };
553
+ },
554
+ async stop(teamId) {
555
+ const roots = teamRoots();
556
+ for (const root of roots) {
557
+ let snapshots;
558
+ try {
559
+ snapshots = await collectTeamsActivity(ctx, [root]);
560
+ } catch {
561
+ continue;
562
+ }
563
+ const team = snapshots.find((item) => item.teamId === teamId);
564
+ if (team === undefined) continue;
565
+ const captain = ctx.get("agents")?.get?.(team.captainSessionId);
566
+ if (captain === undefined) {
567
+ throw new Error("队长会话已不在运行中:这类团队只能用 /t 恢复后再操作,或直接在活动面板里归档。");
568
+ }
569
+ const result = await haltTeamWork({ ctx, stateRoot: root.stateRoot, teamId, captain });
570
+ return { teamName: result.teamName, cancelledTasks: result.cancelledTasks, alreadyHalted: result.alreadyHalted === true };
571
+ }
572
+ throw new Error(`没找到团队 ${teamId} 的状态目录(它可能已被归档)。`);
573
+ },
574
+ });
575
+
576
+ // ---- `/t` 小队短命令(把 /t <小队> <目标> 转成引擎认得的 /t --profile <key> <目标> 用户消息)----
577
+ registerTeamCommand(ctx, {
578
+ teamsFile,
579
+ hasEngine: () => {
580
+ if (engineState.ok !== true) return false;
581
+ try {
582
+ return ctx.tools.get("t_team_create") !== undefined;
583
+ } catch {
584
+ return false;
585
+ }
586
+ },
587
+ engineError: () => engineState.detail,
588
+ });
589
+
590
+ // ---- DAG 预检工具(只读):把整套拟建任务一次跑完引擎校验,避免"边建边撞"留下半成品 ----
591
+ ctx.tools.register(defineTool({
592
+ name: "t_team_plan_check",
593
+ description: "Dry-run a batch of T Team tasks through the engine's own validators WITHOUT creating anything, and get every problem in one reply: missing contract fields (objective/acceptance/inScope/verify), inScope overlap with existing open write tasks, unknown or cyclic dependencies, unknown assignee. Also returns warnings (a member already owns an open task; duplicate subjects) and the execution order. Call this before creating more than one task, and after any failed t_team_create_task before retrying.",
594
+ parameters: {
595
+ tasks: {
596
+ type: "array",
597
+ required: true,
598
+ description: "Tasks you intend to create, in intended order. Each item accepts: subject (required), id (optional label so later items can reference it), kind, description, dependencies (task ids: existing ones or earlier items' labels), assignee, inScope, outOfScope, verify, acceptance, objective, deliverables, nonGoals, round, reviewedTaskId, sourceTaskId, sourceFindingIds.",
599
+ items: { type: "json" },
600
+ },
601
+ },
602
+ output: {
603
+ schema: {
604
+ type: "object",
605
+ additionalProperties: false,
606
+ properties: {
607
+ ok: { type: "boolean", required: true },
608
+ problems: { type: "array", required: true, items: { type: "json" } },
609
+ warnings: { type: "array", required: true, items: { type: "string" } },
610
+ order: { type: "array", required: true, items: { type: "string" } },
611
+ },
612
+ },
613
+ render: (_args, value) => [{ type: "text", text: renderPlanReport(value) }],
614
+ },
615
+ async execute(args, exec) {
616
+ const agent = exec?.agent;
617
+ if (agent === undefined) return { ok: false, problems: [{ index: -1, id: "agent", subject: "", error: "这个工具需要在会话里调用" }], warnings: [], order: [] };
618
+ const workspace = agent.session?.header?.cwd ?? process.cwd();
619
+ const stateRoot = join(workspace, engineStateDir);
620
+ let team;
621
+ try {
622
+ team = await findTeamByCaptain(stateRoot, agent.id);
623
+ } catch (error) {
624
+ return { ok: false, problems: [{ index: -1, id: "state", subject: "", error: `读团队状态失败:${String(error)}` }], warnings: [], order: [] };
625
+ }
626
+ if (team === undefined) {
627
+ return {
628
+ ok: false,
629
+ problems: [{ index: -1, id: "team", subject: "", error: "当前会话还没有团队;先用 t_team_create(approval=required)建一支 staged 团队,再来预检任务。" }],
630
+ warnings: [],
631
+ order: [],
632
+ };
633
+ }
634
+ const report = checkPlan(team, args.tasks);
635
+ return {
636
+ ok: report.ok,
637
+ problems: report.problems,
638
+ warnings: report.warnings,
639
+ order: report.order,
640
+ };
641
+ },
642
+ }));
643
+
644
+ // ---- 父会话系统提示 ----
645
+ /**
646
+ * T Team 的硬约束:引擎是**逐条硬校验、无事务、无预检**,模型却习惯"一次想好整套 DAG、逐条创建",
647
+ * 于是很容易撞规则并留下半成品(重复任务)。这一节把规则与做法写成明文,减少试错。
648
+ */
649
+ ctx.systemPrompt.section({
650
+ name: "t-team:constraints",
651
+ order: 119,
652
+ text: (context) => {
653
+ if (context.agent?.session?.header?.parentSession !== undefined) return "";
654
+ return [
655
+ "## T Team 硬约束(建任务前必读)",
656
+ "The engine validates task creation one call at a time and never rolls back. Follow these rules:",
657
+ "1. **One writer per path.** Two open write tasks (implementation/repair) must not share any inScope path; if they need the same file, make the later one depend on the earlier one (serialize) or split the file paths. Otherwise: `inScope overlaps …`.",
658
+ "2. **One open task per member.** A member cannot hold two unfinished tasks; extra assignments are rejected/queued. Use the shared pool (leave assignee empty) or more members instead of stacking work on one person.",
659
+ "3. **Captain owns one takeover at a time**, and a dependency-blocked task cannot be taken over. Do not try to fix the plan by taking many tasks yourself.",
660
+ "4. **Dependencies may only reference already-created tasks.** Create in dependency order; never reference a task you have not created yet.",
661
+ "5. **After approval the plan is frozen** (`t_team_edit_plan` works only while staged). Before approving, get the plan right; afterwards you can only create/add, reassign, update.",
662
+ "",
663
+ "Working rules that prevent the failure spiral:",
664
+ "- Planning more than one task? **Call `t_team_plan_check` first** with the whole batch: it dry-runs the engine's own validators and returns every problem at once (contract fields, path overlaps, missing/cyclic dependencies, unknown assignee) plus warnings and the execution order. Fix until it reports ok, then create.",
665
+ "- **After any failed create, call `t_team_status` before retrying.** A failed call may still have created earlier tasks; retrying blindly duplicates work.",
666
+ "- Prefer one atomic batch edit while staged; keep task subjects unique.",
667
+ ].join("\n");
668
+ },
669
+ });
670
+
671
+ ctx.systemPrompt.section({
672
+ name: "t-team:experts",
673
+ order: 118,
674
+ text: (context) => {
675
+ if (context.agent?.session?.header?.parentSession !== undefined) return "";
676
+ return [
677
+ "## T专家 (T Expert) expert mode",
678
+ "The parent session has T专家 — a 279-expert, 18-division roster with full Chinese translations, exposed as summonable domain experts.",
679
+ "Experts are individually enabled/disabled in the T专家 settings tab; ALL are disabled by default and a disabled expert cannot be summoned.",
680
+ "A composer selection inserts one enabled expert as a native reference chip; the remaining draft text is that expert's task.",
681
+ "In the parent session, call `list_t_experts()` for enabled division names and counts, then `list_t_experts(division)` to pick a unique expert name, then `summon_t_expert(expert, task)` — or `summon_t_experts` for a small parallel team (at most 8; partial results when some fail).",
682
+ "For a long multi-step goal that needs a durable team (members, tasks with dependencies, review gates), the user can run a T专家 squad with the `/t <squad> <goal>` slash command (squad names and aliases come from the plugin's squad definitions; plain `/t` lists them); it activates the built-in T专家 team engine with a squad whose members already carry the experts' personas. Do not invent squad names when `/t` is available.",
683
+ ].join("\n");
684
+ },
685
+ });
686
+ }