dominds 1.10.3 → 1.11.2

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 (167) hide show
  1. package/dist/cli/doctor.js +9 -2
  2. package/dist/cli/manual.d.ts +4 -4
  3. package/dist/cli/manual.js +18 -21
  4. package/dist/cli/read.js +4 -128
  5. package/dist/cli/team-definition-audit.d.ts +35 -0
  6. package/dist/cli/team-definition-audit.js +159 -0
  7. package/dist/cli/validate-team-def.d.ts +2 -0
  8. package/dist/cli/validate-team-def.js +89 -0
  9. package/dist/cli.d.ts +3 -1
  10. package/dist/cli.js +22 -5
  11. package/dist/dialog-factory.d.ts +2 -1
  12. package/dist/dialog-factory.js +11 -3
  13. package/dist/dialog-fork.js +71 -40
  14. package/dist/dialog.d.ts +8 -2
  15. package/dist/dialog.js +17 -6
  16. package/dist/docs/app-constitution.md +1 -1
  17. package/dist/docs/app-constitution.zh.md +1 -1
  18. package/dist/docs/team_mgmt-toolset.md +12 -1
  19. package/dist/docs/team_mgmt-toolset.zh.md +7 -1
  20. package/dist/llm/gen/anthropic.js +30 -115
  21. package/dist/llm/gen/codex.js +18 -72
  22. package/dist/llm/gen/openai-compatible.js +15 -73
  23. package/dist/llm/gen/openai.js +13 -84
  24. package/dist/llm/gen/tool-call-context.d.ts +19 -0
  25. package/dist/llm/gen/tool-call-context.js +118 -0
  26. package/dist/llm/kernel-driver/context.d.ts +1 -0
  27. package/dist/llm/kernel-driver/context.js +3 -0
  28. package/dist/llm/kernel-driver/drive.js +291 -97
  29. package/dist/llm/kernel-driver/fbr.d.ts +13 -0
  30. package/dist/llm/kernel-driver/fbr.js +110 -0
  31. package/dist/llm/kernel-driver/flow.js +128 -106
  32. package/dist/llm/kernel-driver/reply-guidance.d.ts +21 -0
  33. package/dist/llm/kernel-driver/reply-guidance.js +117 -0
  34. package/dist/llm/kernel-driver/subdialog.js +2 -1
  35. package/dist/llm/kernel-driver/tellask-special.d.ts +4 -0
  36. package/dist/llm/kernel-driver/tellask-special.js +167 -177
  37. package/dist/llm/kernel-driver/types.d.ts +9 -4
  38. package/dist/mcp/sdk-client.d.ts +9 -0
  39. package/dist/mcp/sdk-client.js +216 -3
  40. package/dist/mcp/supervisor.d.ts +7 -0
  41. package/dist/mcp/supervisor.js +131 -37
  42. package/dist/minds/load.js +38 -1
  43. package/dist/minds/system-prompt.d.ts +7 -0
  44. package/dist/minds/system-prompt.js +50 -4
  45. package/dist/persistence.d.ts +8 -1
  46. package/dist/persistence.js +463 -138
  47. package/dist/priming.js +163 -0
  48. package/dist/recovery/reply-special.d.ts +3 -0
  49. package/dist/recovery/reply-special.js +106 -0
  50. package/dist/runtime/driver-messages.js +16 -16
  51. package/dist/runtime/inter-dialog-format.js +6 -8
  52. package/dist/runtime/reply-prompt-copy.d.ts +23 -0
  53. package/dist/runtime/reply-prompt-copy.js +82 -0
  54. package/dist/server/websocket-handler.js +9 -0
  55. package/dist/server.js +2 -0
  56. package/dist/team.d.ts +16 -0
  57. package/dist/team.js +328 -81
  58. package/dist/tools/fs.js +18 -3
  59. package/dist/tools/os.js +24 -9
  60. package/dist/tools/output-limit.d.ts +16 -0
  61. package/dist/tools/output-limit.js +101 -0
  62. package/dist/tools/prompts/control/en/principles.md +1 -0
  63. package/dist/tools/prompts/control/en/tools.md +1 -0
  64. package/dist/tools/prompts/control/zh/principles.md +1 -0
  65. package/dist/tools/prompts/control/zh/tools.md +1 -0
  66. package/dist/tools/team_mgmt.js +179 -53
  67. package/dist/tools/toolset-manual.d.ts +8 -0
  68. package/dist/tools/toolset-manual.js +79 -16
  69. package/dist/tools/txt.js +6 -4
  70. package/package.json +4 -3
  71. package/webapp/dist/assets/{_basePickBy-D4e8HPXg.js → _basePickBy-VvT_9kRm.js} +3 -3
  72. package/webapp/dist/assets/{_basePickBy-D4e8HPXg.js.map → _basePickBy-VvT_9kRm.js.map} +1 -1
  73. package/webapp/dist/assets/{_baseUniq-D3NO53o9.js → _baseUniq-D9_-G6c9.js} +2 -2
  74. package/webapp/dist/assets/{_baseUniq-D3NO53o9.js.map → _baseUniq-D9_-G6c9.js.map} +1 -1
  75. package/webapp/dist/assets/{arc-DJXAFkV5.js → arc-BbofkRAx.js} +2 -2
  76. package/webapp/dist/assets/{arc-DJXAFkV5.js.map → arc-BbofkRAx.js.map} +1 -1
  77. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BUV1jSp7.js → architectureDiagram-2XIMDMQ5-Dn2yTFsM.js} +7 -7
  78. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BUV1jSp7.js.map → architectureDiagram-2XIMDMQ5-Dn2yTFsM.js.map} +1 -1
  79. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-YsCUyoV2.js → blockDiagram-WCTKOSBZ-BT13QjyS.js} +7 -7
  80. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-YsCUyoV2.js.map → blockDiagram-WCTKOSBZ-BT13QjyS.js.map} +1 -1
  81. package/webapp/dist/assets/{c4Diagram-IC4MRINW-ef4SiFoU.js → c4Diagram-IC4MRINW-CDSHxATH.js} +3 -3
  82. package/webapp/dist/assets/{c4Diagram-IC4MRINW-ef4SiFoU.js.map → c4Diagram-IC4MRINW-CDSHxATH.js.map} +1 -1
  83. package/webapp/dist/assets/{channel-F-a_58aT.js → channel-frrfgRkc.js} +2 -2
  84. package/webapp/dist/assets/{channel-F-a_58aT.js.map → channel-frrfgRkc.js.map} +1 -1
  85. package/webapp/dist/assets/{chunk-4BX2VUAB-B2nr4ki0.js → chunk-4BX2VUAB-DfC5GXR7.js} +2 -2
  86. package/webapp/dist/assets/{chunk-4BX2VUAB-B2nr4ki0.js.map → chunk-4BX2VUAB-DfC5GXR7.js.map} +1 -1
  87. package/webapp/dist/assets/{chunk-55IACEB6-C58gNCa3.js → chunk-55IACEB6-DSJQfcDq.js} +2 -2
  88. package/webapp/dist/assets/{chunk-55IACEB6-C58gNCa3.js.map → chunk-55IACEB6-DSJQfcDq.js.map} +1 -1
  89. package/webapp/dist/assets/{chunk-FMBD7UC4-DKkNEljt.js → chunk-FMBD7UC4-BWQBo1hf.js} +2 -2
  90. package/webapp/dist/assets/{chunk-FMBD7UC4-DKkNEljt.js.map → chunk-FMBD7UC4-BWQBo1hf.js.map} +1 -1
  91. package/webapp/dist/assets/{chunk-JSJVCQXG-CGudn0go.js → chunk-JSJVCQXG-BzT1-gT-.js} +2 -2
  92. package/webapp/dist/assets/{chunk-JSJVCQXG-CGudn0go.js.map → chunk-JSJVCQXG-BzT1-gT-.js.map} +1 -1
  93. package/webapp/dist/assets/{chunk-KX2RTZJC-CKyXsodD.js → chunk-KX2RTZJC-Bn-AG8vE.js} +2 -2
  94. package/webapp/dist/assets/{chunk-KX2RTZJC-CKyXsodD.js.map → chunk-KX2RTZJC-Bn-AG8vE.js.map} +1 -1
  95. package/webapp/dist/assets/{chunk-NQ4KR5QH-BfmmdiGT.js → chunk-NQ4KR5QH-yj2oxjjl.js} +4 -4
  96. package/webapp/dist/assets/{chunk-NQ4KR5QH-BfmmdiGT.js.map → chunk-NQ4KR5QH-yj2oxjjl.js.map} +1 -1
  97. package/webapp/dist/assets/{chunk-QZHKN3VN-DNM5LBtS.js → chunk-QZHKN3VN-CEKD-_TP.js} +2 -2
  98. package/webapp/dist/assets/{chunk-QZHKN3VN-DNM5LBtS.js.map → chunk-QZHKN3VN-CEKD-_TP.js.map} +1 -1
  99. package/webapp/dist/assets/{chunk-WL4C6EOR-D8SI8pt9.js → chunk-WL4C6EOR-Dp55vgWB.js} +6 -6
  100. package/webapp/dist/assets/{chunk-WL4C6EOR-D8SI8pt9.js.map → chunk-WL4C6EOR-Dp55vgWB.js.map} +1 -1
  101. package/webapp/dist/assets/{classDiagram-VBA2DB6C-D3FqB_Pt.js → classDiagram-VBA2DB6C-D4N8D7Nj.js} +7 -7
  102. package/webapp/dist/assets/{classDiagram-VBA2DB6C-D3FqB_Pt.js.map → classDiagram-VBA2DB6C-D4N8D7Nj.js.map} +1 -1
  103. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D3FqB_Pt.js → classDiagram-v2-RAHNMMFH-D4N8D7Nj.js} +7 -7
  104. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D3FqB_Pt.js.map → classDiagram-v2-RAHNMMFH-D4N8D7Nj.js.map} +1 -1
  105. package/webapp/dist/assets/{clone-BUUHbHWP.js → clone-DQAXOciv.js} +2 -2
  106. package/webapp/dist/assets/{clone-BUUHbHWP.js.map → clone-DQAXOciv.js.map} +1 -1
  107. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DaeIKBou.js → cose-bilkent-S5V4N54A-Dn19M4ir.js} +2 -2
  108. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DaeIKBou.js.map → cose-bilkent-S5V4N54A-Dn19M4ir.js.map} +1 -1
  109. package/webapp/dist/assets/{dagre-KLK3FWXG-D8Q4W86V.js → dagre-KLK3FWXG-C92c6zqC.js} +7 -7
  110. package/webapp/dist/assets/{dagre-KLK3FWXG-D8Q4W86V.js.map → dagre-KLK3FWXG-C92c6zqC.js.map} +1 -1
  111. package/webapp/dist/assets/{diagram-E7M64L7V-r0zYbLYT.js → diagram-E7M64L7V-Cjyz7QMT.js} +8 -8
  112. package/webapp/dist/assets/{diagram-E7M64L7V-r0zYbLYT.js.map → diagram-E7M64L7V-Cjyz7QMT.js.map} +1 -1
  113. package/webapp/dist/assets/{diagram-IFDJBPK2-szokDrE6.js → diagram-IFDJBPK2-D8dhOH6X.js} +7 -7
  114. package/webapp/dist/assets/{diagram-IFDJBPK2-szokDrE6.js.map → diagram-IFDJBPK2-D8dhOH6X.js.map} +1 -1
  115. package/webapp/dist/assets/{diagram-P4PSJMXO-CLPxxRPD.js → diagram-P4PSJMXO-DWPLWoKQ.js} +7 -7
  116. package/webapp/dist/assets/{diagram-P4PSJMXO-CLPxxRPD.js.map → diagram-P4PSJMXO-DWPLWoKQ.js.map} +1 -1
  117. package/webapp/dist/assets/{erDiagram-INFDFZHY-B9UtzgLz.js → erDiagram-INFDFZHY-Liu3Eiqm.js} +5 -5
  118. package/webapp/dist/assets/{erDiagram-INFDFZHY-B9UtzgLz.js.map → erDiagram-INFDFZHY-Liu3Eiqm.js.map} +1 -1
  119. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DKh6YNZ2.js → flowDiagram-PKNHOUZH-BcJzc7PE.js} +7 -7
  120. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DKh6YNZ2.js.map → flowDiagram-PKNHOUZH-BcJzc7PE.js.map} +1 -1
  121. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-LeXR30gk.js → ganttDiagram-A5KZAMGK-Dj17R6YC.js} +3 -3
  122. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-LeXR30gk.js.map → ganttDiagram-A5KZAMGK-Dj17R6YC.js.map} +1 -1
  123. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js → gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js} +8 -8
  124. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js.map → gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js.map} +1 -1
  125. package/webapp/dist/assets/{graph-Dp4sOMhl.js → graph-G5shJbct.js} +3 -3
  126. package/webapp/dist/assets/{graph-Dp4sOMhl.js.map → graph-G5shJbct.js.map} +1 -1
  127. package/webapp/dist/assets/{index-DQHhQbf3.js → index-BEmR85VP.js} +532 -342
  128. package/webapp/dist/assets/index-BEmR85VP.js.map +1 -0
  129. package/webapp/dist/assets/{index-BPqdTDdm.css → index-YaxF76or.css} +91 -0
  130. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-I-SK7jTK.js → infoDiagram-LFFYTUFH-B55ho_w2.js} +6 -6
  131. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-I-SK7jTK.js.map → infoDiagram-LFFYTUFH-B55ho_w2.js.map} +1 -1
  132. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Dq6VgWn-.js → ishikawaDiagram-PHBUUO56-D0bkA7bh.js} +2 -2
  133. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Dq6VgWn-.js.map → ishikawaDiagram-PHBUUO56-D0bkA7bh.js.map} +1 -1
  134. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DRx1eYmm.js → journeyDiagram-4ABVD52K-COLepLN1.js} +5 -5
  135. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DRx1eYmm.js.map → journeyDiagram-4ABVD52K-COLepLN1.js.map} +1 -1
  136. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-uuizP_jn.js → kanban-definition-K7BYSVSG-Cj4QwKRR.js} +3 -3
  137. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-uuizP_jn.js.map → kanban-definition-K7BYSVSG-Cj4QwKRR.js.map} +1 -1
  138. package/webapp/dist/assets/{layout-BPS5Z_Mh.js → layout-eWbM7aoc.js} +5 -5
  139. package/webapp/dist/assets/{layout-BPS5Z_Mh.js.map → layout-eWbM7aoc.js.map} +1 -1
  140. package/webapp/dist/assets/{linear-C2pv6VZd.js → linear-D4qe60-s.js} +2 -2
  141. package/webapp/dist/assets/{linear-C2pv6VZd.js.map → linear-D4qe60-s.js.map} +1 -1
  142. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DmztmMq2.js → mindmap-definition-YRQLILUH-ICouzfF0.js} +4 -4
  143. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DmztmMq2.js.map → mindmap-definition-YRQLILUH-ICouzfF0.js.map} +1 -1
  144. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-B9-E1cph.js → pieDiagram-SKSYHLDU-D4ZVmXtl.js} +8 -8
  145. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-B9-E1cph.js.map → pieDiagram-SKSYHLDU-D4ZVmXtl.js.map} +1 -1
  146. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-y8snLk0o.js → quadrantDiagram-337W2JSQ-1ymuNQzm.js} +3 -3
  147. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-y8snLk0o.js.map → quadrantDiagram-337W2JSQ-1ymuNQzm.js.map} +1 -1
  148. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DpqFFg69.js → requirementDiagram-Z7DCOOCP-CTK5MmAU.js} +4 -4
  149. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DpqFFg69.js.map → requirementDiagram-Z7DCOOCP-CTK5MmAU.js.map} +1 -1
  150. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js → sankeyDiagram-WA2Y5GQK-BYqSklsK.js} +2 -2
  151. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js.map → sankeyDiagram-WA2Y5GQK-BYqSklsK.js.map} +1 -1
  152. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-D-qxDD9y.js → sequenceDiagram-2WXFIKYE-BrXIJ8YR.js} +4 -4
  153. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-D-qxDD9y.js.map → sequenceDiagram-2WXFIKYE-BrXIJ8YR.js.map} +1 -1
  154. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DuuYaUrj.js → stateDiagram-RAJIS63D-BO202mAM.js} +9 -9
  155. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DuuYaUrj.js.map → stateDiagram-RAJIS63D-BO202mAM.js.map} +1 -1
  156. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Du-pyDZk.js → stateDiagram-v2-FVOUBMTO-hN3JtobY.js} +5 -5
  157. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Du-pyDZk.js.map → stateDiagram-v2-FVOUBMTO-hN3JtobY.js.map} +1 -1
  158. package/webapp/dist/assets/{timeline-definition-YZTLITO2-egNUbGCq.js → timeline-definition-YZTLITO2-BmxM2CZh.js} +3 -3
  159. package/webapp/dist/assets/{timeline-definition-YZTLITO2-egNUbGCq.js.map → timeline-definition-YZTLITO2-BmxM2CZh.js.map} +1 -1
  160. package/webapp/dist/assets/{treemap-KZPCXAKY-B5iVcLdl.js → treemap-KZPCXAKY-Btqy2bjG.js} +5 -5
  161. package/webapp/dist/assets/{treemap-KZPCXAKY-B5iVcLdl.js.map → treemap-KZPCXAKY-Btqy2bjG.js.map} +1 -1
  162. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-Krw2StjR.js → vennDiagram-LZ73GAT5-C5MQpm3y.js} +2 -2
  163. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-Krw2StjR.js.map → vennDiagram-LZ73GAT5-C5MQpm3y.js.map} +1 -1
  164. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-C-gGxToR.js → xychartDiagram-JWTSCODW-DppnWtyj.js} +3 -3
  165. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-C-gGxToR.js.map → xychartDiagram-JWTSCODW-DppnWtyj.js.map} +1 -1
  166. package/webapp/dist/index.html +2 -2
  167. package/webapp/dist/assets/index-DQHhQbf3.js.map +0 -1
@@ -71,6 +71,11 @@ function summarizeIssue(params) {
71
71
  async function runDoctor(params) {
72
72
  const declaredDeps = await (0, manifest_1.loadRtwsDeclaredAppDependencies)({ rtwsRootAbs: params.rtwsRootAbs });
73
73
  const declaredAppIds = new Set(declaredDeps.map((dep) => dep.id));
74
+ const loadedSelfManifest = await (0, manifest_1.loadDomindsAppManifest)({
75
+ packageRootAbs: params.rtwsRootAbs,
76
+ manifestRelPath: manifest_1.DEFAULT_DOMINDS_APP_MANIFEST_REL_PATH,
77
+ });
78
+ const selfManifest = loadedSelfManifest.kind === 'ok' ? loadedSelfManifest.manifest : null;
74
79
  const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs: params.rtwsRootAbs });
75
80
  if (loadedLock.kind === 'error') {
76
81
  throw new Error(`Failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
@@ -115,14 +120,16 @@ async function runDoctor(params) {
115
120
  for (const appId of [...appIds].sort()) {
116
121
  if (params.appId !== null && appId !== params.appId)
117
122
  continue;
123
+ const isSelfTarget = appId === '.';
118
124
  const dep = declaredDeps.find((item) => item.id === appId) ?? null;
125
+ const declaredSelf = isSelfTarget && selfManifest !== null;
119
126
  const locked = lockById.get(appId) ?? null;
120
127
  const disabled = disabledApps.has(appId);
121
128
  const resolutionEntry = resolutionById.get(appId) ?? null;
122
129
  const freshEntry = freshResolutionById.get(appId) ?? null;
123
130
  const reasons = [];
124
131
  const nextActions = [];
125
- if (!dep) {
132
+ if (!dep && !declaredSelf) {
126
133
  addReason(reasons, 'not declared in .minds/app.yaml dependencies');
127
134
  addNextAction(nextActions, `Add '${appId}' to .minds/app.yaml dependencies if this app should be active in the rtws.`);
128
135
  }
@@ -167,7 +174,7 @@ async function runDoctor(params) {
167
174
  diagnoses.push({
168
175
  appId,
169
176
  status: reasons.length === 0 ? 'healthy' : 'degraded',
170
- declared: dep !== null,
177
+ declared: dep !== null || declaredSelf,
171
178
  declaredAsOptional: dep?.optional === true,
172
179
  lockedPackage: locked ? formatLockedPackage(locked.name, locked.version) : null,
173
180
  disabled,
@@ -3,12 +3,12 @@
3
3
  * Manual subcommand for dominds CLI
4
4
  *
5
5
  * Usage:
6
- * dominds manual <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]
7
- * dominds manual --list
6
+ * dominds man <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]
7
+ * dominds man --list
8
8
  *
9
9
  * Examples:
10
- * dominds manual ws_read --lang zh --all
11
- * dominds manual team_mgmt --topics index,tools
10
+ * dominds man ws_read --lang zh --all
11
+ * dominds man team_mgmt --topics index,tools
12
12
  */
13
13
  import '../tools/builtins';
14
14
  export declare function main(): Promise<void>;
@@ -4,28 +4,32 @@
4
4
  * Manual subcommand for dominds CLI
5
5
  *
6
6
  * Usage:
7
- * dominds manual <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]
8
- * dominds manual --list
7
+ * dominds man <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]
8
+ * dominds man --list
9
9
  *
10
10
  * Examples:
11
- * dominds manual ws_read --lang zh --all
12
- * dominds manual team_mgmt --topics index,tools
11
+ * dominds man ws_read --lang zh --all
12
+ * dominds man team_mgmt --topics index,tools
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.main = main;
16
16
  require("../tools/builtins");
17
- const render_1 = require("../tools/manual/render");
18
17
  const spec_1 = require("../tools/manual/spec");
19
18
  const registry_1 = require("../tools/registry");
19
+ const toolset_manual_1 = require("../tools/toolset-manual");
20
20
  function printUsage() {
21
- console.log('Usage: dominds manual <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]');
22
- console.log(' dominds manual --list');
21
+ console.log('Usage: dominds man <toolsetId> [--topic <name>|--topics <a,b,c>|--all] [--lang <en|zh>]');
22
+ console.log(' dominds man --list');
23
+ console.log('Alias: dominds manual ...');
24
+ console.log('');
25
+ console.log("Note: the topic list below shows common manual topics. Some toolsets (for example `team_mgmt`) expose additional toolset-specific topic keys; run `dominds man <toolsetId> --all` to see that toolset's dedicated index.");
23
26
  console.log('');
24
27
  console.log('Examples:');
25
- console.log(' dominds manual ws_read --lang zh --all');
26
- console.log(' dominds manual team_mgmt --topics index,tools');
28
+ console.log(' dominds man ws_read --lang zh --all');
29
+ console.log(' dominds man team_mgmt --topics index,tools');
30
+ console.log(' dominds man team_mgmt --all');
27
31
  console.log('');
28
- console.log(`Topics: ${spec_1.MANUAL_TOPICS.join(', ')} (or 'all')`);
32
+ console.log(`Common topics: ${spec_1.MANUAL_TOPICS.join(', ')} (or 'all')`);
29
33
  }
30
34
  function normalizeLanguage(raw) {
31
35
  if (!raw)
@@ -157,21 +161,14 @@ async function main() {
157
161
  process.exit(1);
158
162
  }
159
163
  const availableToolNames = toAvailableToolNames(toolsetId);
160
- const result = (0, render_1.renderToolsetManual)({
164
+ const content = await (0, toolset_manual_1.renderToolsetManualContent)({
161
165
  toolsetId,
162
166
  language: parsed.language,
163
- request: {
164
- requestedTopic: parsed.topic,
165
- requestedTopics: parsed.topics,
166
- },
167
+ topic: parsed.topic,
168
+ topics: parsed.topics,
167
169
  availableToolNames,
168
170
  });
169
- if (!result.foundToolset) {
170
- console.error(`Error: Toolset '${toolsetId}' not found.`);
171
- listAvailableToolsets();
172
- process.exit(1);
173
- }
174
- console.log(result.content);
171
+ console.log(content);
175
172
  }
176
173
  catch (err) {
177
174
  const message = err instanceof Error ? err.message : String(err);
package/dist/cli/read.js CHANGED
@@ -50,11 +50,9 @@ var __importStar = (this && this.__importStar) || (function () {
50
50
  })();
51
51
  Object.defineProperty(exports, "__esModule", { value: true });
52
52
  exports.main = main;
53
- const promises_1 = require("fs/promises");
54
- const config_1 = require("../mcp/config");
55
53
  const load_1 = require("../minds/load");
56
54
  const team_1 = require("../team");
57
- const registry_1 = require("../tools/registry");
55
+ const team_definition_audit_1 = require("./team-definition-audit");
58
56
  function printUsage() {
59
57
  console.log('Usage: dominds read [<member-id>] [--no-hints] [--only-prompt|--only-mem] [--audit] [--find <pattern>]');
60
58
  console.log('');
@@ -343,128 +341,6 @@ function printPromptAudit(report) {
343
341
  process.stdout.write(`${report.rewriteSuggestion.trim()}\n`);
344
342
  }
345
343
  }
346
- function listExplicitToolsets(member) {
347
- if (!member.toolsets)
348
- return [];
349
- const out = [];
350
- const seen = new Set();
351
- for (const entry of member.toolsets) {
352
- if (entry === '*' || entry.startsWith('!'))
353
- continue;
354
- if (seen.has(entry))
355
- continue;
356
- seen.add(entry);
357
- out.push(entry);
358
- }
359
- return out;
360
- }
361
- async function readMcpDeclaredToolsets() {
362
- const mcpPath = '.minds/mcp.yaml';
363
- let raw;
364
- try {
365
- raw = await (0, promises_1.readFile)(mcpPath, 'utf8');
366
- }
367
- catch (err) {
368
- if (typeof err === 'object' &&
369
- err !== null &&
370
- 'code' in err &&
371
- err.code === 'ENOENT') {
372
- return { kind: 'missing' };
373
- }
374
- return { kind: 'invalid', errorText: err instanceof Error ? err.message : String(err) };
375
- }
376
- const parsed = (0, config_1.parseMcpYaml)(raw);
377
- if (!parsed.ok) {
378
- return { kind: 'invalid', errorText: parsed.errorText };
379
- }
380
- return {
381
- kind: 'loaded',
382
- declaredServerIds: new Set(parsed.serverIdsInYamlOrder),
383
- invalidServerIds: new Set(parsed.invalidServers.map((s) => s.serverId)),
384
- };
385
- }
386
- function buildToolsetAuditReport(params) {
387
- const registeredToolsets = new Set(Object.keys((0, registry_1.listToolsets)()));
388
- const byMember = [];
389
- const warnings = [];
390
- for (const memberId of params.targetMemberIds) {
391
- const member = params.team.getMember(memberId);
392
- if (!member)
393
- continue;
394
- const explicitToolsets = listExplicitToolsets(member);
395
- const items = [];
396
- for (const toolsetName of explicitToolsets) {
397
- if (registeredToolsets.has(toolsetName)) {
398
- items.push({ toolsetName, status: 'registered' });
399
- continue;
400
- }
401
- if (params.mcp.kind === 'loaded' && params.mcp.declaredServerIds.has(toolsetName)) {
402
- if (params.mcp.invalidServerIds.has(toolsetName)) {
403
- items.push({ toolsetName, status: 'mcp_declared_invalid' });
404
- warnings.push(`@${member.id}: toolset '${toolsetName}' is declared in mcp.yaml but server config is invalid.`);
405
- }
406
- else {
407
- items.push({ toolsetName, status: 'mcp_declared_unloaded' });
408
- }
409
- continue;
410
- }
411
- items.push({ toolsetName, status: 'missing' });
412
- warnings.push(`@${member.id}: toolset '${toolsetName}' is neither registered nor declared in mcp.yaml.`);
413
- }
414
- byMember.push({ memberId: member.id, memberName: member.name, items });
415
- }
416
- if (params.mcp.kind === 'invalid') {
417
- warnings.push(`Invalid .minds/mcp.yaml; cannot reliably classify unresolved MCP toolsets: ${params.mcp.errorText}`);
418
- }
419
- return {
420
- mcp: params.mcp,
421
- byMember,
422
- warnings,
423
- };
424
- }
425
- function printToolsetAudit(report) {
426
- process.stdout.write('\n## Toolset Audit\n');
427
- if (report.mcp.kind === 'missing') {
428
- process.stdout.write('- MCP config: missing (`.minds/mcp.yaml` not found)\n');
429
- }
430
- else if (report.mcp.kind === 'invalid') {
431
- process.stdout.write('- MCP config: invalid (`.minds/mcp.yaml` parse/read failed)\n');
432
- }
433
- else {
434
- process.stdout.write(`- MCP config: loaded (declared servers: ${report.mcp.declaredServerIds.size}, invalid server configs: ${report.mcp.invalidServerIds.size})\n`);
435
- }
436
- if (report.byMember.length === 0) {
437
- process.stdout.write('- Members: none\n');
438
- }
439
- else {
440
- for (const memberReport of report.byMember) {
441
- process.stdout.write(`- @${memberReport.memberId} (${memberReport.memberName}):\n`);
442
- if (memberReport.items.length === 0) {
443
- process.stdout.write(' - no explicit toolset declarations\n');
444
- continue;
445
- }
446
- for (const item of memberReport.items) {
447
- const label = item.status === 'registered'
448
- ? 'OK'
449
- : item.status === 'mcp_declared_unloaded'
450
- ? 'DEFERRED'
451
- : item.status === 'mcp_declared_invalid'
452
- ? 'INVALID'
453
- : 'MISS';
454
- process.stdout.write(` - [${label}] ${item.toolsetName}\n`);
455
- }
456
- }
457
- }
458
- if (report.warnings.length > 0) {
459
- process.stdout.write('- Warnings:\n');
460
- for (const warning of report.warnings) {
461
- process.stdout.write(` - ${warning}\n`);
462
- }
463
- }
464
- else {
465
- process.stdout.write('- Warnings: none\n');
466
- }
467
- }
468
344
  function collectFindMatches(text, pattern) {
469
345
  const normalizedPattern = pattern.toLowerCase();
470
346
  const lines = text.split('\n');
@@ -584,10 +460,10 @@ async function main() {
584
460
  const isMultiMemberRun = targetMemberIds.length > 1;
585
461
  const promptAuditRuntime = parsed.audit ? await preparePromptAuditRuntime(team) : undefined;
586
462
  const toolsetAudit = parsed.audit
587
- ? buildToolsetAuditReport({
463
+ ? (0, team_definition_audit_1.buildToolsetAuditReport)({
588
464
  team,
589
465
  targetMemberIds,
590
- mcp: await readMcpDeclaredToolsets(),
466
+ mcp: await (0, team_definition_audit_1.readMcpDeclaredToolsets)(),
591
467
  })
592
468
  : undefined;
593
469
  let auditWarningCount = 0;
@@ -638,7 +514,7 @@ async function main() {
638
514
  }
639
515
  }
640
516
  if (parsed.audit && toolsetAudit) {
641
- printToolsetAudit(toolsetAudit);
517
+ (0, team_definition_audit_1.printToolsetAudit)(toolsetAudit);
642
518
  auditWarningCount += toolsetAudit.warnings.length;
643
519
  }
644
520
  if (parsed.failOnAuditWarning && auditWarningCount > 0) {
@@ -0,0 +1,35 @@
1
+ import { Team } from '../team';
2
+ export type McpDeclaredToolsets = Readonly<{
3
+ kind: 'missing';
4
+ }> | Readonly<{
5
+ kind: 'invalid';
6
+ errorText: string;
7
+ }> | Readonly<{
8
+ kind: 'loaded';
9
+ declaredServerIds: ReadonlySet<string>;
10
+ invalidServerIds: ReadonlySet<string>;
11
+ }>;
12
+ export type ToolsetAuditItem = Readonly<{
13
+ toolsetName: string;
14
+ status: 'registered' | 'mcp_declared_unloaded' | 'mcp_declared_invalid' | 'missing';
15
+ }>;
16
+ export type ToolsetAuditReport = Readonly<{
17
+ mcp: McpDeclaredToolsets;
18
+ byMember: ReadonlyArray<Readonly<{
19
+ memberId: string;
20
+ memberName: string;
21
+ items: ReadonlyArray<ToolsetAuditItem>;
22
+ }>>;
23
+ warnings: string[];
24
+ }>;
25
+ export declare function readMcpDeclaredToolsets(): Promise<McpDeclaredToolsets>;
26
+ export declare function buildToolsetAuditReport(params: {
27
+ team: Team;
28
+ targetMemberIds: ReadonlyArray<string>;
29
+ mcp: McpDeclaredToolsets;
30
+ }): ToolsetAuditReport;
31
+ export declare function hasHardToolsetAuditFailures(report: ToolsetAuditReport): boolean;
32
+ export declare function printToolsetAudit(report: ToolsetAuditReport, options?: Readonly<{
33
+ heading?: string;
34
+ includeTransientLegend?: boolean;
35
+ }>): void;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readMcpDeclaredToolsets = readMcpDeclaredToolsets;
4
+ exports.buildToolsetAuditReport = buildToolsetAuditReport;
5
+ exports.hasHardToolsetAuditFailures = hasHardToolsetAuditFailures;
6
+ exports.printToolsetAudit = printToolsetAudit;
7
+ const promises_1 = require("fs/promises");
8
+ const config_1 = require("../mcp/config");
9
+ const registry_1 = require("../tools/registry");
10
+ function listExplicitToolsets(member) {
11
+ if (!member.toolsets)
12
+ return [];
13
+ const out = [];
14
+ const seen = new Set();
15
+ for (const entry of member.toolsets) {
16
+ if (entry === '*' || entry.startsWith('!'))
17
+ continue;
18
+ if (seen.has(entry))
19
+ continue;
20
+ seen.add(entry);
21
+ out.push(entry);
22
+ }
23
+ return out;
24
+ }
25
+ async function readMcpDeclaredToolsets() {
26
+ const mcpPath = '.minds/mcp.yaml';
27
+ let raw;
28
+ try {
29
+ raw = await (0, promises_1.readFile)(mcpPath, 'utf8');
30
+ }
31
+ catch (err) {
32
+ if (typeof err === 'object' &&
33
+ err !== null &&
34
+ 'code' in err &&
35
+ err.code === 'ENOENT') {
36
+ return { kind: 'missing' };
37
+ }
38
+ return { kind: 'invalid', errorText: err instanceof Error ? err.message : String(err) };
39
+ }
40
+ const parsed = (0, config_1.parseMcpYaml)(raw);
41
+ if (!parsed.ok) {
42
+ return { kind: 'invalid', errorText: parsed.errorText };
43
+ }
44
+ return {
45
+ kind: 'loaded',
46
+ declaredServerIds: new Set(parsed.serverIdsInYamlOrder),
47
+ invalidServerIds: new Set(parsed.invalidServers.map((s) => s.serverId)),
48
+ };
49
+ }
50
+ function buildToolsetAuditReport(params) {
51
+ const registeredToolsets = new Set(Object.keys((0, registry_1.listToolsets)()));
52
+ const byMember = [];
53
+ const warnings = [];
54
+ for (const memberId of params.targetMemberIds) {
55
+ const member = params.team.getMember(memberId);
56
+ if (!member)
57
+ continue;
58
+ const explicitToolsets = listExplicitToolsets(member);
59
+ const items = [];
60
+ for (const toolsetName of explicitToolsets) {
61
+ if (registeredToolsets.has(toolsetName)) {
62
+ items.push({ toolsetName, status: 'registered' });
63
+ continue;
64
+ }
65
+ if (params.mcp.kind === 'loaded' && params.mcp.declaredServerIds.has(toolsetName)) {
66
+ if (params.mcp.invalidServerIds.has(toolsetName)) {
67
+ items.push({ toolsetName, status: 'mcp_declared_invalid' });
68
+ warnings.push(`@${member.id}: toolset '${toolsetName}' is declared in mcp.yaml but server config is invalid.`);
69
+ }
70
+ else {
71
+ items.push({ toolsetName, status: 'mcp_declared_unloaded' });
72
+ }
73
+ continue;
74
+ }
75
+ items.push({ toolsetName, status: 'missing' });
76
+ warnings.push(`@${member.id}: toolset '${toolsetName}' is neither registered nor declared in mcp.yaml.`);
77
+ }
78
+ byMember.push({ memberId: member.id, memberName: member.name, items });
79
+ }
80
+ if (params.mcp.kind === 'invalid') {
81
+ warnings.push(`Invalid .minds/mcp.yaml; cannot reliably classify unresolved MCP toolsets: ${params.mcp.errorText}`);
82
+ }
83
+ return {
84
+ mcp: params.mcp,
85
+ byMember,
86
+ warnings,
87
+ };
88
+ }
89
+ function countByStatus(report) {
90
+ const counts = {
91
+ registered: 0,
92
+ mcp_declared_unloaded: 0,
93
+ mcp_declared_invalid: 0,
94
+ missing: 0,
95
+ };
96
+ for (const memberReport of report.byMember) {
97
+ for (const item of memberReport.items) {
98
+ counts[item.status] += 1;
99
+ }
100
+ }
101
+ return counts;
102
+ }
103
+ function statusLabel(status) {
104
+ if (status === 'registered')
105
+ return 'OK';
106
+ if (status === 'mcp_declared_unloaded')
107
+ return 'DEFERRED';
108
+ if (status === 'mcp_declared_invalid')
109
+ return 'INVALID';
110
+ return 'MISS';
111
+ }
112
+ function hasHardToolsetAuditFailures(report) {
113
+ if (report.mcp.kind === 'invalid')
114
+ return true;
115
+ return report.byMember.some((memberReport) => memberReport.items.some((item) => item.status === 'mcp_declared_invalid' || item.status === 'missing'));
116
+ }
117
+ function printToolsetAudit(report, options) {
118
+ const heading = options?.heading ?? '## Toolset Audit';
119
+ const counts = countByStatus(report);
120
+ process.stdout.write(`\n${heading}\n`);
121
+ if (report.mcp.kind === 'missing') {
122
+ process.stdout.write('- MCP config: missing (`.minds/mcp.yaml` not found)\n');
123
+ }
124
+ else if (report.mcp.kind === 'invalid') {
125
+ process.stdout.write('- MCP config: invalid (`.minds/mcp.yaml` parse/read failed)\n');
126
+ }
127
+ else {
128
+ process.stdout.write(`- MCP config: loaded (declared servers: ${report.mcp.declaredServerIds.size}, invalid server configs: ${report.mcp.invalidServerIds.size})\n`);
129
+ }
130
+ process.stdout.write(`- Summary: ${counts.registered} OK, ${counts.mcp_declared_unloaded} DEFERRED, ${counts.mcp_declared_invalid} INVALID, ${counts.missing} MISS\n`);
131
+ if (options?.includeTransientLegend !== false) {
132
+ process.stdout.write('- Status notes: `DEFERRED` means the toolset is declared via `.minds/mcp.yaml` but is not currently loaded into the registry. This is often temporary (for example MCP server down/unreachable); if the MCP service recovers, rerun validation and it may clear without editing `team.yaml`.\n');
133
+ process.stdout.write('- Status notes: `INVALID` means the MCP server declaration itself is invalid and needs a config fix. `MISS` means the toolset is neither registered nor declared in `.minds/mcp.yaml`.\n');
134
+ }
135
+ if (report.byMember.length === 0) {
136
+ process.stdout.write('- Members: none\n');
137
+ }
138
+ else {
139
+ for (const memberReport of report.byMember) {
140
+ process.stdout.write(`- @${memberReport.memberId} (${memberReport.memberName}):\n`);
141
+ if (memberReport.items.length === 0) {
142
+ process.stdout.write(' - no explicit toolset declarations\n');
143
+ continue;
144
+ }
145
+ for (const item of memberReport.items) {
146
+ process.stdout.write(` - [${statusLabel(item.status)}] ${item.toolsetName}\n`);
147
+ }
148
+ }
149
+ }
150
+ if (report.warnings.length > 0) {
151
+ process.stdout.write('- Warnings:\n');
152
+ for (const warning of report.warnings) {
153
+ process.stdout.write(` - ${warning}\n`);
154
+ }
155
+ }
156
+ else {
157
+ process.stdout.write('- Warnings: none\n');
158
+ }
159
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(): Promise<void>;
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.main = main;
5
+ const team_1 = require("../team");
6
+ const team_definition_audit_1 = require("./team-definition-audit");
7
+ function printUsage() {
8
+ console.log('Usage: dominds validate_team_def [<member-id>]');
9
+ console.log('');
10
+ console.log('Validate explicit toolset declarations in `.minds/team.yaml` against the current toolset registry and `.minds/mcp.yaml` declarations.');
11
+ console.log('MCP-declared but currently unloaded toolsets are reported as `DEFERRED` because they are often transient runtime availability issues rather than permanent team-definition errors.');
12
+ console.log('');
13
+ console.log('Exit codes:');
14
+ console.log(' 0 No hard definition errors (`OK` / `DEFERRED` only)');
15
+ console.log(' 2 Hard definition errors found (`INVALID` / `MISS`)');
16
+ console.log('');
17
+ console.log('Examples:');
18
+ console.log(' dominds validate_team_def');
19
+ console.log(' dominds validate_team_def mentor');
20
+ }
21
+ function parseArgs(args) {
22
+ let memberId;
23
+ for (const arg of args) {
24
+ if (arg === '-h' || arg === '--help') {
25
+ printUsage();
26
+ process.exit(0);
27
+ }
28
+ if (arg.startsWith('-')) {
29
+ throw new Error(`Unknown option '${arg}'.`);
30
+ }
31
+ if (!memberId) {
32
+ memberId = arg;
33
+ continue;
34
+ }
35
+ throw new Error(`Unexpected argument '${arg}'.`);
36
+ }
37
+ return { memberId };
38
+ }
39
+ function resolveTargetMemberIds(team, memberId) {
40
+ if (memberId)
41
+ return [memberId];
42
+ const visibleIds = Object.values(team.members)
43
+ .filter((member) => member.hidden !== true)
44
+ .map((member) => member.id)
45
+ .sort((a, b) => a.localeCompare(b));
46
+ if (visibleIds.length > 0)
47
+ return visibleIds;
48
+ const fallback = team.getDefaultResponder();
49
+ if (!fallback)
50
+ throw new Error('No team members found.');
51
+ return [fallback.id];
52
+ }
53
+ async function main() {
54
+ let parsed;
55
+ try {
56
+ parsed = parseArgs(process.argv.slice(2));
57
+ }
58
+ catch (err) {
59
+ console.error('Error:', err instanceof Error ? err.message : String(err));
60
+ printUsage();
61
+ process.exit(1);
62
+ return;
63
+ }
64
+ try {
65
+ const team = await team_1.Team.load();
66
+ const targetMemberIds = resolveTargetMemberIds(team, parsed.memberId);
67
+ const report = (0, team_definition_audit_1.buildToolsetAuditReport)({
68
+ team,
69
+ targetMemberIds,
70
+ mcp: await (0, team_definition_audit_1.readMcpDeclaredToolsets)(),
71
+ });
72
+ process.stdout.write('# Team Definition Validation\n');
73
+ process.stdout.write('This command checks explicit toolset references in `.minds/team.yaml`. `DEFERRED` usually means the toolset is declared through MCP but is not currently loaded; if the MCP service recovers, rerun this command before editing `team.yaml`.\n');
74
+ (0, team_definition_audit_1.printToolsetAudit)(report, { heading: '## Definition Audit' });
75
+ if ((0, team_definition_audit_1.hasHardToolsetAuditFailures)(report)) {
76
+ process.exit(2);
77
+ }
78
+ }
79
+ catch (err) {
80
+ console.error('Error validating team definition:', err instanceof Error ? err.message : String(err));
81
+ process.exit(1);
82
+ }
83
+ }
84
+ if (require.main === module) {
85
+ main().catch((err) => {
86
+ console.error('Unhandled error:', err);
87
+ process.exit(1);
88
+ });
89
+ }
package/dist/cli.d.ts CHANGED
@@ -10,7 +10,9 @@
10
10
  * tui - Start Text User Interface
11
11
  * run - Run task dialog (alias for tui)
12
12
  * read - Read team configuration
13
- * manual - Render toolset manual to stdout
13
+ * man - Render toolset manual to stdout
14
+ * manual - Alias for man
15
+ * validate_team_def - Validate explicit team toolset declarations
14
16
  * create - Create a new runtime workspace (rtws) from a template
15
17
  * install - Install a Dominds App into this rtws
16
18
  * doctor - Diagnose Dominds App state in this rtws
package/dist/cli.js CHANGED
@@ -11,7 +11,9 @@
11
11
  * tui - Start Text User Interface
12
12
  * run - Run task dialog (alias for tui)
13
13
  * read - Read team configuration
14
- * manual - Render toolset manual to stdout
14
+ * man - Render toolset manual to stdout
15
+ * manual - Alias for man
16
+ * validate_team_def - Validate explicit team toolset declarations
15
17
  * create - Create a new runtime workspace (rtws) from a template
16
18
  * install - Install a Dominds App into this rtws
17
19
  * doctor - Diagnose Dominds App state in this rtws
@@ -76,6 +78,7 @@ const read_1 = require("./cli/read");
76
78
  const tui_1 = require("./cli/tui");
77
79
  const uninstall_1 = require("./cli/uninstall");
78
80
  const update_1 = require("./cli/update");
81
+ const validate_team_def_1 = require("./cli/validate-team-def");
79
82
  const webui_1 = require("./cli/webui");
80
83
  require("./tools/builtins");
81
84
  function printHelp() {
@@ -93,7 +96,9 @@ Subcommands:
93
96
  tui [options] Start Text User Interface
94
97
  run [options] Run task dialog (alias for tui)
95
98
  read [options] Read team configuration
96
- manual [options] Render toolset manual to stdout
99
+ man [options] Render toolset manual to stdout
100
+ manual [options] Alias for man
101
+ validate_team_def [options] Validate explicit team toolset declarations
97
102
  create [options] Create a new runtime workspace (rtws) from a template
98
103
  install [options] Install a Dominds App into this rtws
99
104
  doctor [options] Read-only diagnosis across manifest/lock/configuration/resolution/handshake
@@ -111,7 +116,8 @@ Examples:
111
116
  dominds tui --help # Show TUI help
112
117
  dominds run task.tsk # Run task dialog
113
118
  dominds read # Read team configuration
114
- dominds manual ws_read --lang zh --all
119
+ dominds man ws_read --lang zh --all
120
+ dominds validate_team_def # Validate toolset references in .minds/team.yaml
115
121
  dominds create web-scaffold my-project # Create rtws from a template
116
122
  dominds doctor @longrun-ai/web-dev # Diagnose a single app across all app-state layers
117
123
 
@@ -175,6 +181,8 @@ async function main() {
175
181
  (subcommand === 'tui' && subcommandArgs.includes('-h')) ||
176
182
  (subcommand === 'run' && subcommandArgs.includes('-h')) ||
177
183
  (subcommand === 'read' && subcommandArgs.includes('-h')) ||
184
+ (subcommand === 'validate_team_def' && subcommandArgs.includes('-h')) ||
185
+ (subcommand === 'man' && subcommandArgs.includes('-h')) ||
178
186
  (subcommand === 'manual' && subcommandArgs.includes('-h')) ||
179
187
  ((subcommand === 'create' || subcommand === 'new') && subcommandArgs.includes('-h')) ||
180
188
  (subcommand === 'install' &&
@@ -218,9 +226,9 @@ async function main() {
218
226
  subcommand !== 'update';
219
227
  if (!shouldSkipRtwsSetup && shouldLoadApps) {
220
228
  try {
221
- // Register toolset proxies so Team.load() can validate toolset bindings (read/manual included).
229
+ // Register toolset proxies so Team.load() can validate toolset bindings (read/man/manual included).
222
230
  await (0, runtime_1.registerEnabledAppsToolProxies)({ rtwsRootAbs: process.cwd() });
223
- // Start apps-host only for interactive runtime commands (do not auto-start app frontends for read/manual).
231
+ // Start apps-host only for interactive runtime commands (do not auto-start app frontends for read/man/manual).
224
232
  const shouldStartAppsHost = subcommand === 'tui' || subcommand === 'run';
225
233
  if (shouldStartAppsHost) {
226
234
  await (0, runtime_1.initAppsRuntime)({
@@ -246,9 +254,15 @@ async function main() {
246
254
  case 'read':
247
255
  await runSubcommand('read', subcommandArgs);
248
256
  break;
257
+ case 'man':
258
+ await runSubcommand('manual', subcommandArgs);
259
+ break;
249
260
  case 'manual':
250
261
  await runSubcommand('manual', subcommandArgs);
251
262
  break;
263
+ case 'validate_team_def':
264
+ await runSubcommand('validate_team_def', subcommandArgs);
265
+ break;
252
266
  case 'create':
253
267
  case 'new':
254
268
  await runSubcommand('create', subcommandArgs);
@@ -295,6 +309,9 @@ async function runSubcommand(subcommand, args) {
295
309
  else if (subcommand === 'manual') {
296
310
  await (0, manual_1.main)();
297
311
  }
312
+ else if (subcommand === 'validate_team_def') {
313
+ await (0, validate_team_def_1.main)();
314
+ }
298
315
  else if (subcommand === 'create') {
299
316
  await (0, create_1.main)();
300
317
  }