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.
- package/dist/cli/doctor.js +9 -2
- package/dist/cli/manual.d.ts +4 -4
- package/dist/cli/manual.js +18 -21
- package/dist/cli/read.js +4 -128
- package/dist/cli/team-definition-audit.d.ts +35 -0
- package/dist/cli/team-definition-audit.js +159 -0
- package/dist/cli/validate-team-def.d.ts +2 -0
- package/dist/cli/validate-team-def.js +89 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +22 -5
- package/dist/dialog-factory.d.ts +2 -1
- package/dist/dialog-factory.js +11 -3
- package/dist/dialog-fork.js +71 -40
- package/dist/dialog.d.ts +8 -2
- package/dist/dialog.js +17 -6
- package/dist/docs/app-constitution.md +1 -1
- package/dist/docs/app-constitution.zh.md +1 -1
- package/dist/docs/team_mgmt-toolset.md +12 -1
- package/dist/docs/team_mgmt-toolset.zh.md +7 -1
- package/dist/llm/gen/anthropic.js +30 -115
- package/dist/llm/gen/codex.js +18 -72
- package/dist/llm/gen/openai-compatible.js +15 -73
- package/dist/llm/gen/openai.js +13 -84
- package/dist/llm/gen/tool-call-context.d.ts +19 -0
- package/dist/llm/gen/tool-call-context.js +118 -0
- package/dist/llm/kernel-driver/context.d.ts +1 -0
- package/dist/llm/kernel-driver/context.js +3 -0
- package/dist/llm/kernel-driver/drive.js +291 -97
- package/dist/llm/kernel-driver/fbr.d.ts +13 -0
- package/dist/llm/kernel-driver/fbr.js +110 -0
- package/dist/llm/kernel-driver/flow.js +128 -106
- package/dist/llm/kernel-driver/reply-guidance.d.ts +21 -0
- package/dist/llm/kernel-driver/reply-guidance.js +117 -0
- package/dist/llm/kernel-driver/subdialog.js +2 -1
- package/dist/llm/kernel-driver/tellask-special.d.ts +4 -0
- package/dist/llm/kernel-driver/tellask-special.js +167 -177
- package/dist/llm/kernel-driver/types.d.ts +9 -4
- package/dist/mcp/sdk-client.d.ts +9 -0
- package/dist/mcp/sdk-client.js +216 -3
- package/dist/mcp/supervisor.d.ts +7 -0
- package/dist/mcp/supervisor.js +131 -37
- package/dist/minds/load.js +38 -1
- package/dist/minds/system-prompt.d.ts +7 -0
- package/dist/minds/system-prompt.js +50 -4
- package/dist/persistence.d.ts +8 -1
- package/dist/persistence.js +463 -138
- package/dist/priming.js +163 -0
- package/dist/recovery/reply-special.d.ts +3 -0
- package/dist/recovery/reply-special.js +106 -0
- package/dist/runtime/driver-messages.js +16 -16
- package/dist/runtime/inter-dialog-format.js +6 -8
- package/dist/runtime/reply-prompt-copy.d.ts +23 -0
- package/dist/runtime/reply-prompt-copy.js +82 -0
- package/dist/server/websocket-handler.js +9 -0
- package/dist/server.js +2 -0
- package/dist/team.d.ts +16 -0
- package/dist/team.js +328 -81
- package/dist/tools/fs.js +18 -3
- package/dist/tools/os.js +24 -9
- package/dist/tools/output-limit.d.ts +16 -0
- package/dist/tools/output-limit.js +101 -0
- package/dist/tools/prompts/control/en/principles.md +1 -0
- package/dist/tools/prompts/control/en/tools.md +1 -0
- package/dist/tools/prompts/control/zh/principles.md +1 -0
- package/dist/tools/prompts/control/zh/tools.md +1 -0
- package/dist/tools/team_mgmt.js +179 -53
- package/dist/tools/toolset-manual.d.ts +8 -0
- package/dist/tools/toolset-manual.js +79 -16
- package/dist/tools/txt.js +6 -4
- package/package.json +4 -3
- package/webapp/dist/assets/{_basePickBy-D4e8HPXg.js → _basePickBy-VvT_9kRm.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-D4e8HPXg.js.map → _basePickBy-VvT_9kRm.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-D3NO53o9.js → _baseUniq-D9_-G6c9.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-D3NO53o9.js.map → _baseUniq-D9_-G6c9.js.map} +1 -1
- package/webapp/dist/assets/{arc-DJXAFkV5.js → arc-BbofkRAx.js} +2 -2
- package/webapp/dist/assets/{arc-DJXAFkV5.js.map → arc-BbofkRAx.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BUV1jSp7.js → architectureDiagram-2XIMDMQ5-Dn2yTFsM.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-BUV1jSp7.js.map → architectureDiagram-2XIMDMQ5-Dn2yTFsM.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-YsCUyoV2.js → blockDiagram-WCTKOSBZ-BT13QjyS.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-YsCUyoV2.js.map → blockDiagram-WCTKOSBZ-BT13QjyS.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-ef4SiFoU.js → c4Diagram-IC4MRINW-CDSHxATH.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-ef4SiFoU.js.map → c4Diagram-IC4MRINW-CDSHxATH.js.map} +1 -1
- package/webapp/dist/assets/{channel-F-a_58aT.js → channel-frrfgRkc.js} +2 -2
- package/webapp/dist/assets/{channel-F-a_58aT.js.map → channel-frrfgRkc.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-B2nr4ki0.js → chunk-4BX2VUAB-DfC5GXR7.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-B2nr4ki0.js.map → chunk-4BX2VUAB-DfC5GXR7.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-C58gNCa3.js → chunk-55IACEB6-DSJQfcDq.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-C58gNCa3.js.map → chunk-55IACEB6-DSJQfcDq.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-DKkNEljt.js → chunk-FMBD7UC4-BWQBo1hf.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-DKkNEljt.js.map → chunk-FMBD7UC4-BWQBo1hf.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-CGudn0go.js → chunk-JSJVCQXG-BzT1-gT-.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-CGudn0go.js.map → chunk-JSJVCQXG-BzT1-gT-.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-CKyXsodD.js → chunk-KX2RTZJC-Bn-AG8vE.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-CKyXsodD.js.map → chunk-KX2RTZJC-Bn-AG8vE.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-BfmmdiGT.js → chunk-NQ4KR5QH-yj2oxjjl.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-BfmmdiGT.js.map → chunk-NQ4KR5QH-yj2oxjjl.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-DNM5LBtS.js → chunk-QZHKN3VN-CEKD-_TP.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-DNM5LBtS.js.map → chunk-QZHKN3VN-CEKD-_TP.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-D8SI8pt9.js → chunk-WL4C6EOR-Dp55vgWB.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-D8SI8pt9.js.map → chunk-WL4C6EOR-Dp55vgWB.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-D3FqB_Pt.js → classDiagram-VBA2DB6C-D4N8D7Nj.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-D3FqB_Pt.js.map → classDiagram-VBA2DB6C-D4N8D7Nj.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D3FqB_Pt.js → classDiagram-v2-RAHNMMFH-D4N8D7Nj.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D3FqB_Pt.js.map → classDiagram-v2-RAHNMMFH-D4N8D7Nj.js.map} +1 -1
- package/webapp/dist/assets/{clone-BUUHbHWP.js → clone-DQAXOciv.js} +2 -2
- package/webapp/dist/assets/{clone-BUUHbHWP.js.map → clone-DQAXOciv.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DaeIKBou.js → cose-bilkent-S5V4N54A-Dn19M4ir.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DaeIKBou.js.map → cose-bilkent-S5V4N54A-Dn19M4ir.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-D8Q4W86V.js → dagre-KLK3FWXG-C92c6zqC.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-D8Q4W86V.js.map → dagre-KLK3FWXG-C92c6zqC.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-r0zYbLYT.js → diagram-E7M64L7V-Cjyz7QMT.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-r0zYbLYT.js.map → diagram-E7M64L7V-Cjyz7QMT.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-szokDrE6.js → diagram-IFDJBPK2-D8dhOH6X.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-szokDrE6.js.map → diagram-IFDJBPK2-D8dhOH6X.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-CLPxxRPD.js → diagram-P4PSJMXO-DWPLWoKQ.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-CLPxxRPD.js.map → diagram-P4PSJMXO-DWPLWoKQ.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-B9UtzgLz.js → erDiagram-INFDFZHY-Liu3Eiqm.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-B9UtzgLz.js.map → erDiagram-INFDFZHY-Liu3Eiqm.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DKh6YNZ2.js → flowDiagram-PKNHOUZH-BcJzc7PE.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DKh6YNZ2.js.map → flowDiagram-PKNHOUZH-BcJzc7PE.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-LeXR30gk.js → ganttDiagram-A5KZAMGK-Dj17R6YC.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-LeXR30gk.js.map → ganttDiagram-A5KZAMGK-Dj17R6YC.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js → gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-w29ZiLnY.js.map → gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js.map} +1 -1
- package/webapp/dist/assets/{graph-Dp4sOMhl.js → graph-G5shJbct.js} +3 -3
- package/webapp/dist/assets/{graph-Dp4sOMhl.js.map → graph-G5shJbct.js.map} +1 -1
- package/webapp/dist/assets/{index-DQHhQbf3.js → index-BEmR85VP.js} +532 -342
- package/webapp/dist/assets/index-BEmR85VP.js.map +1 -0
- package/webapp/dist/assets/{index-BPqdTDdm.css → index-YaxF76or.css} +91 -0
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-I-SK7jTK.js → infoDiagram-LFFYTUFH-B55ho_w2.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-I-SK7jTK.js.map → infoDiagram-LFFYTUFH-B55ho_w2.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Dq6VgWn-.js → ishikawaDiagram-PHBUUO56-D0bkA7bh.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Dq6VgWn-.js.map → ishikawaDiagram-PHBUUO56-D0bkA7bh.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DRx1eYmm.js → journeyDiagram-4ABVD52K-COLepLN1.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DRx1eYmm.js.map → journeyDiagram-4ABVD52K-COLepLN1.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-uuizP_jn.js → kanban-definition-K7BYSVSG-Cj4QwKRR.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-uuizP_jn.js.map → kanban-definition-K7BYSVSG-Cj4QwKRR.js.map} +1 -1
- package/webapp/dist/assets/{layout-BPS5Z_Mh.js → layout-eWbM7aoc.js} +5 -5
- package/webapp/dist/assets/{layout-BPS5Z_Mh.js.map → layout-eWbM7aoc.js.map} +1 -1
- package/webapp/dist/assets/{linear-C2pv6VZd.js → linear-D4qe60-s.js} +2 -2
- package/webapp/dist/assets/{linear-C2pv6VZd.js.map → linear-D4qe60-s.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DmztmMq2.js → mindmap-definition-YRQLILUH-ICouzfF0.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DmztmMq2.js.map → mindmap-definition-YRQLILUH-ICouzfF0.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-B9-E1cph.js → pieDiagram-SKSYHLDU-D4ZVmXtl.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-B9-E1cph.js.map → pieDiagram-SKSYHLDU-D4ZVmXtl.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-y8snLk0o.js → quadrantDiagram-337W2JSQ-1ymuNQzm.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-y8snLk0o.js.map → quadrantDiagram-337W2JSQ-1ymuNQzm.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DpqFFg69.js → requirementDiagram-Z7DCOOCP-CTK5MmAU.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DpqFFg69.js.map → requirementDiagram-Z7DCOOCP-CTK5MmAU.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js → sankeyDiagram-WA2Y5GQK-BYqSklsK.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-0N_Dpc0X.js.map → sankeyDiagram-WA2Y5GQK-BYqSklsK.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-D-qxDD9y.js → sequenceDiagram-2WXFIKYE-BrXIJ8YR.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-D-qxDD9y.js.map → sequenceDiagram-2WXFIKYE-BrXIJ8YR.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-DuuYaUrj.js → stateDiagram-RAJIS63D-BO202mAM.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-DuuYaUrj.js.map → stateDiagram-RAJIS63D-BO202mAM.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Du-pyDZk.js → stateDiagram-v2-FVOUBMTO-hN3JtobY.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Du-pyDZk.js.map → stateDiagram-v2-FVOUBMTO-hN3JtobY.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-egNUbGCq.js → timeline-definition-YZTLITO2-BmxM2CZh.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-egNUbGCq.js.map → timeline-definition-YZTLITO2-BmxM2CZh.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-B5iVcLdl.js → treemap-KZPCXAKY-Btqy2bjG.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-B5iVcLdl.js.map → treemap-KZPCXAKY-Btqy2bjG.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-Krw2StjR.js → vennDiagram-LZ73GAT5-C5MQpm3y.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-Krw2StjR.js.map → vennDiagram-LZ73GAT5-C5MQpm3y.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-C-gGxToR.js → xychartDiagram-JWTSCODW-DppnWtyj.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-C-gGxToR.js.map → xychartDiagram-JWTSCODW-DppnWtyj.js.map} +1 -1
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/index-DQHhQbf3.js.map +0 -1
package/dist/cli/doctor.js
CHANGED
|
@@ -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,
|
package/dist/cli/manual.d.ts
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
* Manual subcommand for dominds CLI
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
|
-
* dominds
|
|
7
|
-
* dominds
|
|
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
|
|
11
|
-
* dominds
|
|
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>;
|
package/dist/cli/manual.js
CHANGED
|
@@ -4,28 +4,32 @@
|
|
|
4
4
|
* Manual subcommand for dominds CLI
|
|
5
5
|
*
|
|
6
6
|
* Usage:
|
|
7
|
-
* dominds
|
|
8
|
-
* dominds
|
|
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
|
|
12
|
-
* dominds
|
|
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
|
|
22
|
-
console.log(' dominds
|
|
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
|
|
26
|
-
console.log(' dominds
|
|
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(`
|
|
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
|
|
164
|
+
const content = await (0, toolset_manual_1.renderToolsetManualContent)({
|
|
161
165
|
toolsetId,
|
|
162
166
|
language: parsed.language,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
requestedTopics: parsed.topics,
|
|
166
|
-
},
|
|
167
|
+
topic: parsed.topic,
|
|
168
|
+
topics: parsed.topics,
|
|
167
169
|
availableToolNames,
|
|
168
170
|
});
|
|
169
|
-
|
|
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
|
|
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,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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
}
|