dominds 1.2.5 → 1.2.7
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/agent-priming.js +2051 -0
- package/dist/apps/app-lock-file.js +228 -0
- package/dist/apps/assigned-port.js +124 -0
- package/dist/apps/enabled-apps.js +472 -7
- package/dist/apps/manifest.js +37 -0
- package/dist/apps/override-paths.js +19 -6
- package/dist/apps/problems.js +43 -0
- package/dist/apps/resolution-file.js +370 -0
- package/dist/apps/runtime.js +5 -17
- package/dist/apps/teammates.js +102 -1
- package/dist/cli/disable.js +10 -6
- package/dist/cli/enable.js +21 -19
- package/dist/cli/install.js +40 -18
- package/dist/cli/uninstall.js +6 -6
- package/dist/cli/update.js +38 -13
- package/dist/dialog.js +5 -0
- package/dist/docs/app-constitution.md +85 -18
- package/dist/docs/app-constitution.zh.md +86 -21
- package/dist/docs/dialog-system.md +1 -1
- package/dist/docs/dialog-system.zh.md +1 -1
- package/dist/docs/dominds-agent-priming.md +218 -0
- package/dist/docs/dominds-agent-priming.zh.md +196 -0
- package/dist/docs/drive-logic-context-refactor-plan.zh.md +338 -0
- package/dist/docs/keep-going.md +176 -0
- package/dist/docs/keep-going.zh.md +162 -0
- package/dist/docs/showing-by-doing.md +208 -0
- package/dist/docs/showing-by-doing.zh.md +177 -0
- package/dist/docs/team-mgmt-toolset.md +482 -0
- package/dist/docs/team-mgmt-toolset.zh.md +426 -0
- package/dist/llm/defaults.yaml +1 -1
- package/dist/llm/driver.js +4093 -0
- package/dist/llm/kernel-driver/drive.js +5 -2
- package/dist/llm/kernel-driver/flow.js +3 -0
- package/dist/minds/promptdocs.js +263 -0
- package/dist/problems.js +67 -16
- package/dist/server/api-routes.js +333 -0
- package/dist/server/prompts-routes.js +545 -0
- package/dist/server/server-core.js +4 -0
- package/dist/server/websocket-handler.js +17 -0
- package/dist/shared/team-mgmt-manual.js +120 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/showing-by-doing.js +1091 -0
- package/dist/snippets/README.en.md +3 -0
- package/dist/snippets/README.md +4 -0
- package/dist/static/assets/{_basePickBy-CF9r08iy.js → _basePickBy-BMCtwrV7.js} +3 -3
- package/dist/static/assets/{_basePickBy-CF9r08iy.js.map → _basePickBy-BMCtwrV7.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-CxKv0cd4.js → _baseUniq-BuyCgJiA.js} +2 -2
- package/dist/static/assets/{_baseUniq-CxKv0cd4.js.map → _baseUniq-BuyCgJiA.js.map} +1 -1
- package/dist/static/assets/{arc-C9JyvnlB.js → arc-BDuN8lwA.js} +2 -2
- package/dist/static/assets/{arc-C9JyvnlB.js.map → arc-BDuN8lwA.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js → architectureDiagram-VXUJARFQ-C-ekqGAD.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CpcUgjHf.js.map → architectureDiagram-VXUJARFQ-C-ekqGAD.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js → blockDiagram-VD42YOAC-CgQiNuuQ.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-BA9vtmm7.js.map → blockDiagram-VD42YOAC-CgQiNuuQ.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js → c4Diagram-YG6GDRKO-DONC39q-.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-D49MGNdF.js.map → c4Diagram-YG6GDRKO-DONC39q-.js.map} +1 -1
- package/dist/static/assets/{channel-B4KzL0Kg.js → channel-CJTFwXIG.js} +2 -2
- package/dist/static/assets/{channel-B4KzL0Kg.js.map → channel-CJTFwXIG.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js → chunk-4BX2VUAB-NaIy4uLJ.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-0F-1ayl0.js.map → chunk-4BX2VUAB-NaIy4uLJ.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js → chunk-55IACEB6-JUKI_Ayx.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-Dnl2HDTZ.js.map → chunk-55IACEB6-JUKI_Ayx.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js → chunk-B4BG7PRW-dIswFJDn.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-Bhx5RbkQ.js.map → chunk-B4BG7PRW-dIswFJDn.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js → chunk-DI55MBZ5-DU2b_N30.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-EYd1wL3E.js.map → chunk-DI55MBZ5-DU2b_N30.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js → chunk-FMBD7UC4-BgExcScw.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DAjkhhUU.js.map → chunk-FMBD7UC4-BgExcScw.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js → chunk-QN33PNHL-bitxyqh7.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-CK6TY7IE.js.map → chunk-QN33PNHL-bitxyqh7.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js → chunk-QZHKN3VN-Cor8u7DT.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-CketngiE.js.map → chunk-QZHKN3VN-Cor8u7DT.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js → chunk-TZMSLE5B-Aceoxav_.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Bcuvqo45.js.map → chunk-TZMSLE5B-Aceoxav_.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js → classDiagram-2ON5EDUG-D1Q6a8Hg.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-CaP4T3r4.js.map → classDiagram-2ON5EDUG-D1Q6a8Hg.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CaP4T3r4.js.map → classDiagram-v2-WZHVMYZB-D1Q6a8Hg.js.map} +1 -1
- package/dist/static/assets/{clone-C-JULvnG.js → clone-MlWbv1V0.js} +2 -2
- package/dist/static/assets/{clone-C-JULvnG.js.map → clone-MlWbv1V0.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js → cose-bilkent-S5V4N54A-DWPCXSrn.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-vXCmi_eC.js.map → cose-bilkent-S5V4N54A-DWPCXSrn.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js → dagre-6UL2VRFP-C8ptQ9V3.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-bhGzX6kO.js.map → dagre-6UL2VRFP-C8ptQ9V3.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js → diagram-PSM6KHXK-Bgf1FqkE.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-BUKfmfGk.js.map → diagram-PSM6KHXK-Bgf1FqkE.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js → diagram-QEK2KX5R-BZ5xzofU.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-DYlq3uFq.js.map → diagram-QEK2KX5R-BZ5xzofU.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js → diagram-S2PKOQOG-Dwp47T9I.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-CjxkLHWG.js.map → diagram-S2PKOQOG-Dwp47T9I.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js → erDiagram-Q2GNP2WA-Cx4weIHl.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-S3hR85On.js.map → erDiagram-Q2GNP2WA-Cx4weIHl.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js → flowDiagram-NV44I4VS-vNUuIeRk.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-aBmNMuQ0.js.map → flowDiagram-NV44I4VS-vNUuIeRk.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js → ganttDiagram-JELNMOA3-BEfozJAr.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-DJxXaiW1.js.map → ganttDiagram-JELNMOA3-BEfozJAr.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DEOBCM0G.js.map → gitGraphDiagram-V2S2FVAM-eHxwc3d9.js.map} +1 -1
- package/dist/static/assets/{graph-DwrKSIE7.js → graph-C6a6uAok.js} +3 -3
- package/dist/static/assets/{graph-DwrKSIE7.js.map → graph-C6a6uAok.js.map} +1 -1
- package/dist/static/assets/{index-HWTRvE2k.js → index-D3TQbAKh.js} +383 -59
- package/dist/static/assets/index-D3TQbAKh.js.map +1 -0
- package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js → infoDiagram-HS3SLOUP-CX0NiId3.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-BH9kVuYd.js.map → infoDiagram-HS3SLOUP-CX0NiId3.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js → journeyDiagram-XKPGCS4Q-C1IepPZ-.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-Dap7AcjR.js.map → journeyDiagram-XKPGCS4Q-C1IepPZ-.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js → kanban-definition-3W4ZIXB7-uMNX4Z1W.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-4NOl8MEj.js.map → kanban-definition-3W4ZIXB7-uMNX4Z1W.js.map} +1 -1
- package/dist/static/assets/{layout-D6uIxu1E.js → layout-CpE3kk5z.js} +5 -5
- package/dist/static/assets/{layout-D6uIxu1E.js.map → layout-CpE3kk5z.js.map} +1 -1
- package/dist/static/assets/{linear-CvBOGQA2.js → linear-DV8laXr9.js} +2 -2
- package/dist/static/assets/{linear-CvBOGQA2.js.map → linear-DV8laXr9.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js → mindmap-definition-VGOIOE7T-CKjgVM9S.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-ugsrLNY5.js.map → mindmap-definition-VGOIOE7T-CKjgVM9S.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js → pieDiagram-ADFJNKIX-BBonlNyT.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-CdVZjM8g.js.map → pieDiagram-ADFJNKIX-BBonlNyT.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js → quadrantDiagram-AYHSOK5B-BTI8HbBu.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-A6m5lZKd.js.map → quadrantDiagram-AYHSOK5B-BTI8HbBu.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-Cac3zSJH.js.map → requirementDiagram-UZGBJVZJ-ZtSr9Q5R.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js → sankeyDiagram-TZEHDZUN-DibLVGzg.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DXDdUUl1.js.map → sankeyDiagram-TZEHDZUN-DibLVGzg.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js → sequenceDiagram-WL72ISMW-qXatfzVt.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-Domsjl5Y.js.map → sequenceDiagram-WL72ISMW-qXatfzVt.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js → stateDiagram-FKZM4ZOC-7fgxCQHo.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bu0lRQK1.js.map → stateDiagram-FKZM4ZOC-7fgxCQHo.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-D0K-n3ic.js.map → stateDiagram-v2-4FDKWEC3-DcWlOAnF.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js → timeline-definition-IT6M3QCI-iX2MRdpY.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BGvpddwR.js.map → timeline-definition-IT6M3QCI-iX2MRdpY.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js → treemap-GDKQZRPO-AVRnyXu1.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-BoOzOm2j.js.map → treemap-GDKQZRPO-AVRnyXu1.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js → xychartDiagram-PRI3JC2R-DVYEo5aJ.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_h3_ICR.js.map → xychartDiagram-PRI3JC2R-DVYEo5aJ.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/team.js +52 -48
- package/dist/tellask.js +439 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/fs.js +194 -68
- package/dist/tools/prompts/memory/en/principles.md +13 -5
- package/dist/tools/prompts/memory/en/tools.md +11 -36
- package/dist/tools/prompts/memory/zh/principles.md +18 -8
- package/dist/tools/prompts/memory/zh/tools.md +11 -36
- package/dist/tools/team-mgmt.js +3487 -0
- package/dist/utils/task-doc.js +236 -0
- package/package.json +1 -1
- package/dist/static/assets/index-HWTRvE2k.js.map +0 -1
package/dist/cli/install.js
CHANGED
|
@@ -13,10 +13,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.main = main;
|
|
14
14
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const
|
|
16
|
+
const app_lock_file_1 = require("../apps/app-lock-file");
|
|
17
|
+
const assigned_port_1 = require("../apps/assigned-port");
|
|
18
|
+
const resolution_file_1 = require("../apps/resolution-file");
|
|
17
19
|
const run_app_json_1 = require("../apps/run-app-json");
|
|
18
|
-
const runtime_port_1 = require("../apps/runtime-port");
|
|
19
|
-
const time_1 = require("../shared/utils/time");
|
|
20
20
|
function printHelp() {
|
|
21
21
|
console.log(`Usage:
|
|
22
22
|
dominds install <spec|path> [--local] [--id <appId>] [--enable] [--force]
|
|
@@ -28,7 +28,7 @@ Options:
|
|
|
28
28
|
--force Replace existing installed entry with the same id
|
|
29
29
|
|
|
30
30
|
Notes:
|
|
31
|
-
- State is stored in ${
|
|
31
|
+
- State is stored in ${resolution_file_1.APPS_RESOLUTION_REL_PATH} under the current rtws (process.cwd()).
|
|
32
32
|
- dominds installs apps by running '<app> --json' via npx or local package bin.
|
|
33
33
|
`);
|
|
34
34
|
}
|
|
@@ -103,9 +103,9 @@ async function main() {
|
|
|
103
103
|
}
|
|
104
104
|
const localAbs = path_1.default.resolve(rtwsRootAbs, specOrPath);
|
|
105
105
|
const shouldUseLocal = args.local || (await pathIsDirectory(localAbs));
|
|
106
|
-
const
|
|
107
|
-
if (
|
|
108
|
-
console.error(`Error: failed to read ${
|
|
106
|
+
const loadedResolution = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
|
|
107
|
+
if (loadedResolution.kind === 'error') {
|
|
108
|
+
console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loadedResolution.errorText}`);
|
|
109
109
|
process.exit(1);
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
@@ -117,33 +117,55 @@ async function main() {
|
|
|
117
117
|
process.exit(1);
|
|
118
118
|
return;
|
|
119
119
|
}
|
|
120
|
-
const prev =
|
|
120
|
+
const prev = loadedResolution.file.apps.find((a) => a.id === installJson.appId) ?? null;
|
|
121
121
|
if (prev && !args.force) {
|
|
122
122
|
console.error(`Error: app '${installJson.appId}' already installed. Use 'dominds update ${installJson.appId}' or 'dominds install ... --force'.`);
|
|
123
123
|
process.exit(1);
|
|
124
124
|
return;
|
|
125
125
|
}
|
|
126
|
-
const
|
|
127
|
-
const enabled =
|
|
128
|
-
const
|
|
126
|
+
const userEnabled = args.enable || (prev ? prev.userEnabled : false);
|
|
127
|
+
const enabled = userEnabled;
|
|
128
|
+
const assignedPort = await (0, assigned_port_1.resolveStableAssignedPort)({
|
|
129
129
|
appId: installJson.appId,
|
|
130
130
|
installJson,
|
|
131
|
-
existingApps:
|
|
132
|
-
|
|
131
|
+
existingApps: loadedResolution.file.apps,
|
|
132
|
+
existingAssignedPort: prev?.assignedPort ?? null,
|
|
133
133
|
});
|
|
134
134
|
const entry = {
|
|
135
135
|
id: installJson.appId,
|
|
136
136
|
enabled,
|
|
137
|
+
userEnabled,
|
|
137
138
|
source: shouldUseLocal
|
|
138
139
|
? { kind: 'local', pathAbs: localAbs }
|
|
139
140
|
: { kind: 'npx', spec: specOrPath },
|
|
140
|
-
|
|
141
|
+
assignedPort,
|
|
141
142
|
installJson,
|
|
142
|
-
installedAt: prev ? prev.installedAt : now,
|
|
143
|
-
updatedAt: now,
|
|
144
143
|
};
|
|
145
|
-
const nextFile = (0,
|
|
146
|
-
await (0,
|
|
144
|
+
const nextFile = (0, resolution_file_1.upsertResolvedApp)({ existing: loadedResolution.file, next: entry });
|
|
145
|
+
await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: nextFile });
|
|
146
|
+
try {
|
|
147
|
+
const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
|
|
148
|
+
if (loadedLock.kind === 'error') {
|
|
149
|
+
console.error(`Warning: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const nextLock = (0, app_lock_file_1.upsertLockedApp)({
|
|
153
|
+
existing: loadedLock.file,
|
|
154
|
+
next: {
|
|
155
|
+
id: entry.id,
|
|
156
|
+
source: entry.source,
|
|
157
|
+
package: {
|
|
158
|
+
name: entry.installJson.package.name,
|
|
159
|
+
version: entry.installJson.package.version,
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
console.error(`Warning: failed to update .minds/app-lock.yaml: ${err instanceof Error ? err.message : String(err)}`);
|
|
168
|
+
}
|
|
147
169
|
console.log(shouldUseLocal
|
|
148
170
|
? `Installed app '${entry.id}' from local package: ${localAbs}`
|
|
149
171
|
: `Installed app '${entry.id}' via npx spec: ${specOrPath}`);
|
package/dist/cli/uninstall.js
CHANGED
|
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
13
13
|
exports.main = main;
|
|
14
14
|
const promises_1 = __importDefault(require("fs/promises"));
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const
|
|
16
|
+
const resolution_file_1 = require("../apps/resolution-file");
|
|
17
17
|
function printHelp() {
|
|
18
18
|
console.log(`Usage:
|
|
19
19
|
dominds uninstall <appId> [--purge]
|
|
@@ -54,20 +54,20 @@ async function main() {
|
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
const rtwsRootAbs = process.cwd();
|
|
57
|
-
const loaded = await (0,
|
|
57
|
+
const loaded = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
|
|
58
58
|
if (loaded.kind === 'error') {
|
|
59
|
-
console.error(`Error: failed to read ${
|
|
59
|
+
console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loaded.errorText}`);
|
|
60
60
|
process.exit(1);
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
|
-
const found = (0,
|
|
63
|
+
const found = (0, resolution_file_1.findResolvedApp)(loaded.file, args.appId);
|
|
64
64
|
if (!found) {
|
|
65
65
|
console.error(`Error: app '${args.appId}' not installed`);
|
|
66
66
|
process.exit(1);
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
|
-
const next = (0,
|
|
70
|
-
await (0,
|
|
69
|
+
const next = (0, resolution_file_1.removeResolvedApp)({ existing: loaded.file, appId: args.appId });
|
|
70
|
+
await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: next });
|
|
71
71
|
if (args.purge) {
|
|
72
72
|
const rtwsAppDirAbs = path_1.default.resolve(rtwsRootAbs, '.apps', args.appId);
|
|
73
73
|
await promises_1.default.rm(rtwsAppDirAbs, { recursive: true, force: true });
|
package/dist/cli/update.js
CHANGED
|
@@ -12,10 +12,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.main = main;
|
|
14
14
|
const path_1 = __importDefault(require("path"));
|
|
15
|
-
const
|
|
15
|
+
const app_lock_file_1 = require("../apps/app-lock-file");
|
|
16
|
+
const assigned_port_1 = require("../apps/assigned-port");
|
|
17
|
+
const resolution_file_1 = require("../apps/resolution-file");
|
|
16
18
|
const run_app_json_1 = require("../apps/run-app-json");
|
|
17
|
-
const runtime_port_1 = require("../apps/runtime-port");
|
|
18
|
-
const time_1 = require("../shared/utils/time");
|
|
19
19
|
function printHelp() {
|
|
20
20
|
console.log(`Usage:
|
|
21
21
|
dominds update [<appId>]
|
|
@@ -52,16 +52,22 @@ async function main() {
|
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
54
|
const rtwsRootAbs = process.cwd();
|
|
55
|
-
const loaded = await (0,
|
|
55
|
+
const loaded = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
|
|
56
56
|
if (loaded.kind === 'error') {
|
|
57
|
-
console.error(`Error: failed to read ${
|
|
57
|
+
console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loaded.errorText}`);
|
|
58
58
|
process.exit(1);
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
|
+
const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
|
|
62
|
+
const shouldUpdateLock = loadedLock.kind === 'ok';
|
|
63
|
+
if (loadedLock.kind === 'error') {
|
|
64
|
+
console.error(`Warning: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
|
|
65
|
+
}
|
|
66
|
+
let nextLock = loadedLock.kind === 'ok' ? loadedLock.file : null;
|
|
61
67
|
const targets = args.appId === null
|
|
62
68
|
? [...loaded.file.apps]
|
|
63
69
|
: (() => {
|
|
64
|
-
const found = (0,
|
|
70
|
+
const found = (0, resolution_file_1.findResolvedApp)(loaded.file, args.appId);
|
|
65
71
|
if (!found) {
|
|
66
72
|
console.error(`Error: app '${args.appId}' not installed`);
|
|
67
73
|
process.exit(1);
|
|
@@ -70,7 +76,6 @@ async function main() {
|
|
|
70
76
|
return [found];
|
|
71
77
|
})();
|
|
72
78
|
let nextFile = loaded.file;
|
|
73
|
-
const now = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
74
79
|
for (const entry of targets) {
|
|
75
80
|
const installJson = entry.source.kind === 'npx'
|
|
76
81
|
? await (0, run_app_json_1.runDomindsAppJsonViaNpx)({ spec: entry.source.spec, cwdAbs: rtwsRootAbs })
|
|
@@ -80,22 +85,42 @@ async function main() {
|
|
|
80
85
|
if (installJson.appId !== entry.id) {
|
|
81
86
|
throw new Error(`Update failed: appId mismatch for '${entry.id}': got '${installJson.appId}' from --json handshake`);
|
|
82
87
|
}
|
|
83
|
-
const
|
|
88
|
+
const assignedPort = await (0, assigned_port_1.resolveStableAssignedPort)({
|
|
84
89
|
appId: entry.id,
|
|
85
90
|
installJson,
|
|
86
91
|
existingApps: nextFile.apps,
|
|
87
|
-
|
|
92
|
+
existingAssignedPort: entry.assignedPort,
|
|
88
93
|
});
|
|
89
94
|
const updated = {
|
|
90
95
|
...entry,
|
|
91
|
-
|
|
96
|
+
assignedPort,
|
|
92
97
|
installJson,
|
|
93
|
-
updatedAt: now,
|
|
94
98
|
};
|
|
95
|
-
nextFile = (0,
|
|
99
|
+
nextFile = (0, resolution_file_1.upsertResolvedApp)({ existing: nextFile, next: updated });
|
|
100
|
+
if (shouldUpdateLock && nextLock) {
|
|
101
|
+
nextLock = (0, app_lock_file_1.upsertLockedApp)({
|
|
102
|
+
existing: nextLock,
|
|
103
|
+
next: {
|
|
104
|
+
id: updated.id,
|
|
105
|
+
source: updated.source,
|
|
106
|
+
package: {
|
|
107
|
+
name: updated.installJson.package.name,
|
|
108
|
+
version: updated.installJson.package.version,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
96
113
|
console.log(`Updated app '${entry.id}'`);
|
|
97
114
|
}
|
|
98
|
-
await (0,
|
|
115
|
+
await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: nextFile });
|
|
116
|
+
if (shouldUpdateLock && nextLock) {
|
|
117
|
+
try {
|
|
118
|
+
await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error(`Warning: failed to update .minds/app-lock.yaml: ${err instanceof Error ? err.message : String(err)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
99
124
|
}
|
|
100
125
|
if (require.main === module) {
|
|
101
126
|
main().catch((err) => {
|
package/dist/dialog.js
CHANGED
|
@@ -514,6 +514,7 @@ class Dialog {
|
|
|
514
514
|
msgId: (0, id_1.generateShortId)(),
|
|
515
515
|
grammar: 'markdown',
|
|
516
516
|
userLanguageCode: this._lastUserLanguageCode,
|
|
517
|
+
origin: 'runtime',
|
|
517
518
|
}
|
|
518
519
|
: prompt;
|
|
519
520
|
const trimmed = prepared.content.trim();
|
|
@@ -532,6 +533,7 @@ class Dialog {
|
|
|
532
533
|
msgId: normalized.msgId,
|
|
533
534
|
grammar: normalized.grammar,
|
|
534
535
|
userLanguageCode: normalized.userLanguageCode,
|
|
536
|
+
origin: normalized.origin,
|
|
535
537
|
q4hAnswerCallIds: normalized.q4hAnswerCallIds,
|
|
536
538
|
runControl: undefined,
|
|
537
539
|
};
|
|
@@ -550,6 +552,7 @@ class Dialog {
|
|
|
550
552
|
msgId: options.msgId,
|
|
551
553
|
grammar: options.grammar,
|
|
552
554
|
userLanguageCode: options.userLanguageCode ?? this._lastUserLanguageCode,
|
|
555
|
+
origin: options.origin,
|
|
553
556
|
q4hAnswerCallIds: options.q4hAnswerCallIds,
|
|
554
557
|
runControl: options.runControl,
|
|
555
558
|
};
|
|
@@ -560,6 +563,7 @@ class Dialog {
|
|
|
560
563
|
msgId: options.msgId,
|
|
561
564
|
grammar: options.grammar,
|
|
562
565
|
userLanguageCode: options.userLanguageCode ?? this._lastUserLanguageCode,
|
|
566
|
+
origin: options.origin,
|
|
563
567
|
q4hAnswerCallIds: options.q4hAnswerCallIds,
|
|
564
568
|
},
|
|
565
569
|
runControl: options.runControl,
|
|
@@ -622,6 +626,7 @@ class Dialog {
|
|
|
622
626
|
msgId: (0, id_1.generateShortId)(),
|
|
623
627
|
grammar: 'markdown',
|
|
624
628
|
userLanguageCode: this._lastUserLanguageCode,
|
|
629
|
+
origin: 'runtime',
|
|
625
630
|
};
|
|
626
631
|
const runControlSpec = options?.runControl ?? this._activeRunControlSpec;
|
|
627
632
|
let nextPrompt = basePrompt;
|
|
@@ -18,10 +18,60 @@ This document covers:
|
|
|
18
18
|
- “Dev app” mode: allow an rtws to run _as_ a Dominds app during development, reusing the same directory structure/mechanisms.
|
|
19
19
|
- Enhanced `.minds/team.yaml`: `use` / `import` to reference teammates provided by other apps, with clear execution context semantics.
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
This document is the unified entry point for app-related semantics and mechanisms.
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
## Roadmap: Phases A/B/C/D (MVP = phase)
|
|
24
|
+
|
|
25
|
+
This document uses **A/B/C/D** to describe the evolution phases of this feature.
|
|
26
|
+
|
|
27
|
+
- What “**MVP=C**” means: the acceptance gate for this stage is the **Phase C** checklist (i.e. only Phase C capabilities are required for this milestone; anything outside Phase C is not part of the gate even if implemented).
|
|
28
|
+
- Phases are not a compatibility/stability promise: Dominds is still in a prototype/alpha iteration mode; phases are used to define **scope + acceptance focus** for this feature.
|
|
29
|
+
|
|
30
|
+
> Note: This roadmap is an RFC-ish “scope definition”; it does not automatically imply everything is implemented today. The rest of this doc still marks items as “Current (implemented)” vs “Target (planned)”.
|
|
31
|
+
|
|
32
|
+
### Phase A: Concepts and minimal skeleton (Foundations)
|
|
33
|
+
|
|
34
|
+
Goal: make the kernel/app boundary and the minimal data flow runnable, so the install/resolve/boot path can be validated.
|
|
35
|
+
|
|
36
|
+
- Key capabilities (at minimum):
|
|
37
|
+
- App install handshake (`<app> --json`) can be consumed by the kernel/CLI.
|
|
38
|
+
- App manifest (`.minds/app.yaml`) schema/loader is available.
|
|
39
|
+
- Basic local resolution strategy (`local`) works: discover local apps under `<rtws>/dominds-apps/<appId>/`.
|
|
40
|
+
|
|
41
|
+
### Phase B: Team composition and cross-app references (Team Composition)
|
|
42
|
+
|
|
43
|
+
Goal: allow app-provided teammates to participate in team composition, with explicit execution-context semantics for cross-app references.
|
|
44
|
+
|
|
45
|
+
- Key capabilities (at minimum):
|
|
46
|
+
- Load enabled apps’ teammates YAML (with workspace overrides).
|
|
47
|
+
- Workspace `.minds/team.yaml` supports explicit cross-app referencing via `members.<id>.from + (use|import)`.
|
|
48
|
+
- Name collisions / reference failures are diagnosed and routed through Problems/defunc (retryable).
|
|
49
|
+
|
|
50
|
+
### Phase C: MVP gate (deps/lock/override contract/port pinning/Problems)
|
|
51
|
+
|
|
52
|
+
Goal: close the loop for “dependency resolution + observability + regressability”, so dogfooding is diagnosable and recoverable.
|
|
53
|
+
|
|
54
|
+
- Key capabilities (must-pass):
|
|
55
|
+
- required/optional dependencies:
|
|
56
|
+
- optional missing/disabled: silently skipped (must not block startup; Problems not required; debug logs allowed).
|
|
57
|
+
- required missing/disabled: must not block startup; must be observable in WebUI Problems; related capability enters defunc/unavailable.
|
|
58
|
+
- required disable propagation:
|
|
59
|
+
- `<rtws>/.apps/resolution.yaml` must represent both user intent (explicit user disable) and the propagated effective state.
|
|
60
|
+
- when dependencies recover, propagated disables must auto-recover (without overriding explicit user disables).
|
|
61
|
+
- Override precedence (documented contract): `rtws override > app override > app defaults`.
|
|
62
|
+
- Lock semantics (design contract): `.minds/app-lock.yaml` freezes dependency versions only; enable/disable must not jitter the lock.
|
|
63
|
+
- assignedPort: once pinned, `assignedPort` must be non-zero; conflicts must be surfaced and re-assigned; uninstall naturally frees ports.
|
|
64
|
+
- Problems: Problems ids use a stable prefix (currently `apps/apps_resolution/`); after a fix, issues must reconcile/clear (no permanent residue).
|
|
65
|
+
|
|
66
|
+
### Phase D: Integrator packaging and UX (Integration & UX)
|
|
67
|
+
|
|
68
|
+
Goal: let an integrator app ship publishable default overrides for dependency apps, and polish the observability/Problems experience.
|
|
69
|
+
|
|
70
|
+
- Key capabilities (target):
|
|
71
|
+
- app override: app packages may ship default overrides for dependency apps (publishable integration config), while rtws overrides still take precedence.
|
|
72
|
+
- Override surface expands to more `.minds/**` assets (persona/knowledge/lessons, memory, mcp, etc.).
|
|
73
|
+
- Problems mechanism enhancements: record and display “occurred at / resolved at / resolved state”, and allow “clear resolved” in UI.
|
|
74
|
+
- More complete error-path contracts (corrupt YAML, partial availability, recovery strategy) with regression coverage.
|
|
25
75
|
|
|
26
76
|
## Non-goals
|
|
27
77
|
|
|
@@ -29,6 +79,22 @@ Relationship to `dominds/docs/kernel-app-architecture.md`:
|
|
|
29
79
|
- No sandbox/isolation definition (permissions/resource isolation is out of scope).
|
|
30
80
|
- Not a full implementation plan; we keep implementation details as “anchors”.
|
|
31
81
|
|
|
82
|
+
## Kernel-App Runtime Skeleton
|
|
83
|
+
|
|
84
|
+
The following rules define the key runtime boundaries between kernel and apps:
|
|
85
|
+
|
|
86
|
+
- Resolution order inside an app is fixed: `local(app) -> kernel`.
|
|
87
|
+
- Override semantics: overrides happen at the **configuration layer**, not by “registering and overwriting” runtime objects:
|
|
88
|
+
- For a given app asset path `p`: `<rtws>/.apps/override/<app-id>/.minds/<p>` (rtws override) wins over the app package default.
|
|
89
|
+
- (Target: planned) an app integrator may ship _app overrides_ for its dependency apps (e.g. default overrides packaged with the app), but rtws overrides still take precedence.
|
|
90
|
+
- Shadowing kernel registry names is not a goal: name collisions should be diagnosed explicitly (and handled via defunc / Problems), not silently overwritten by last-writer-wins.
|
|
91
|
+
- Conflict semantics: import name conflicts or unsatisfied dependencies put the app into defunc.
|
|
92
|
+
- Registry boundary: app objects do not register into kernel registry; defunc does not require “removing app objects from kernel”.
|
|
93
|
+
- Observability: defunc reasons should surface in Problems (at minimum with `appId`, reason kind, and suggested action).
|
|
94
|
+
- Retry semantics: defunc is retryable by default (reload on a later refresh cycle once dependency/config issues are fixed).
|
|
95
|
+
- Fixed tool contract: `app_integration_manual({ appId, language? })` failures should be observable but must not trigger defunc.
|
|
96
|
+
- Typical load sequence: register toolsets first, then team/imports, apply overrides, validate, and finally register members; failures result in defunc.
|
|
97
|
+
|
|
32
98
|
## Core concepts
|
|
33
99
|
|
|
34
100
|
### Kernel
|
|
@@ -114,7 +180,14 @@ Recommended principles:
|
|
|
114
180
|
(Current: implemented) existing anchors:
|
|
115
181
|
|
|
116
182
|
- JSON schema: `dominds/main/apps/app-json.ts` (`DomindsAppInstallJsonV1`).
|
|
117
|
-
-
|
|
183
|
+
- Apps resolution file: `dominds/main/apps/resolution-file.ts`.
|
|
184
|
+
|
|
185
|
+
(Current: implemented) the kernel treats `<rtws>/.apps/resolution.yaml` as **overlay + strategy**:
|
|
186
|
+
|
|
187
|
+
- If the file exists: `apps[]` is the overlay (stores `enabled` / `assignedPort` / `source` / `installJson`), and `resolutionStrategy?` (if present) overrides the default strategy.
|
|
188
|
+
- If the file is missing: the overlay is empty, and the strategy falls back to defaults (`order=['local']`, `localRoots=['dominds-apps']`).
|
|
189
|
+
|
|
190
|
+
So even without `<rtws>/.apps/resolution.yaml`, as long as `.minds/app.yaml` declares dependencies, the kernel still resolves local apps via the default strategy; if the root manifest has no dependencies, the effective enabled apps set is empty.
|
|
118
191
|
|
|
119
192
|
## App-provided `.minds/**` assets
|
|
120
193
|
|
|
@@ -145,8 +218,9 @@ It describes:
|
|
|
145
218
|
- how those members see each other and collaborate within the app.
|
|
146
219
|
|
|
147
220
|
> Current prototype behavior: the kernel loads enabled app teammates YAML and **additively merges `members` into workspace `.minds/team.yaml`**.
|
|
148
|
-
>
|
|
149
|
-
>
|
|
221
|
+
> Current (v0): the kernel loads enabled app teammates YAML but does **not** flatten-merge their `members` into workspace `.minds/team.yaml`.
|
|
222
|
+
> You must explicitly reference a dependency app teammate via `members.<id>.from + (use|import)` in workspace `.minds/team.yaml`.
|
|
223
|
+
> Loader: `dominds/main/apps/teammates.ts`; resolver/execution: `dominds/main/team.ts`.
|
|
150
224
|
|
|
151
225
|
### `.minds/mcp.yaml`
|
|
152
226
|
|
|
@@ -166,14 +240,6 @@ Key semantics:
|
|
|
166
240
|
|
|
167
241
|
## `<rtws>/.apps/override/<app-id>/`: override layer
|
|
168
242
|
|
|
169
|
-
### `.apps/installed.yaml`
|
|
170
|
-
|
|
171
|
-
(Current: implemented) The kernel stores the installed/enabled apps list in `<rtws>/.apps/installed.yaml`.
|
|
172
|
-
|
|
173
|
-
This file is a source of truth for enabled apps snapshot.
|
|
174
|
-
|
|
175
|
-
(Target: planned) Replace the mixed responsibilities of `.apps/installed.yaml` with `.minds/app-lock.yaml` + `<rtws>/.apps/resolution.yaml`.
|
|
176
|
-
|
|
177
243
|
### Override root
|
|
178
244
|
|
|
179
245
|
(Target: planned) The workspace override directory for an app is:
|
|
@@ -206,8 +272,7 @@ Suggested override resolution for any app asset path `p`:
|
|
|
206
272
|
|
|
207
273
|
This naturally supports “override dependency apps”: once a dependency app is enabled in the same rtws, it can be overridden via its own `.apps/<dep-id>/...` directory.
|
|
208
274
|
|
|
209
|
-
>
|
|
210
|
-
> This document generalizes the idea to the broader `.minds/**` asset set (not only team).
|
|
275
|
+
> This document also covers the `<rtws>/.apps/<app-id>/team.yaml` override DSL concept, and generalizes it to broader `.minds/**` assets (not only team).
|
|
211
276
|
|
|
212
277
|
#### Override scope (recommended)
|
|
213
278
|
|
|
@@ -265,7 +330,9 @@ Constraints:
|
|
|
265
330
|
|
|
266
331
|
### Suggested YAML shape
|
|
267
332
|
|
|
268
|
-
>
|
|
333
|
+
> Current (v0): the `.minds/team.yaml` parser supports this syntax.
|
|
334
|
+
> However, since app-context isolation/bridging is not implemented yet, `use` and `import` are runtime-equivalent for now.
|
|
335
|
+
> Also: `from`-only is accepted but has no effect in v0 (it is treated as a local member definition).
|
|
269
336
|
|
|
270
337
|
Example snippet:
|
|
271
338
|
|
|
@@ -359,7 +426,7 @@ This makes it possible that:
|
|
|
359
426
|
## Implementation anchors (current code)
|
|
360
427
|
|
|
361
428
|
- install json schema: `dominds/main/apps/app-json.ts`
|
|
362
|
-
-
|
|
429
|
+
- apps resolution file: `dominds/main/apps/resolution-file.ts`
|
|
363
430
|
- apps runtime (proxy tools): `dominds/main/apps/runtime.ts`
|
|
364
431
|
- app teammates loader (prototype flat merge): `dominds/main/apps/teammates.ts`, `dominds/main/team.ts`
|
|
365
432
|
- manifest parser: `dominds/main/apps/manifest.ts`
|
|
@@ -17,10 +17,60 @@
|
|
|
17
17
|
- “开发中 app(dev app)”模式:让一个 rtws 以一个 Dominds App 的身份运行,从而复用相同的目录结构与机制。
|
|
18
18
|
- `.minds/team.yaml` 的增强语法:支持 `use`/`import` 引用其它 app 提供的 teammate,并定义运行上下文与诉请语义。
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
本文作为 App 相关语义与机制的统一入口。
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
## 路线图:A/B/C/D 阶段(MVP=阶段)
|
|
23
|
+
|
|
24
|
+
本文使用 **A/B/C/D** 表示该特性的演进阶段。
|
|
25
|
+
|
|
26
|
+
- “**MVP=C**” 的含义:本阶段的验收口径以 **C 阶段**的清单为准(即:只要求达到 C 阶段所列能力;其它能力即使已实现,也不作为 C 阶段 gate)。
|
|
27
|
+
- 阶段不等同于“兼容策略/稳定性承诺”:Dominds 仍处于原型期,阶段只用来定义**本特性**的可交付范围与验收重点。
|
|
28
|
+
|
|
29
|
+
> 说明:本路线图是 RFC-ish 的“目标范围定义”,并不自动代表“当前实现已具备”。文中仍以“现状(已实现)/目标(拟实现)”分别标注。
|
|
30
|
+
|
|
31
|
+
### 阶段 A:概念与最小骨架可跑(Foundations)
|
|
32
|
+
|
|
33
|
+
目标:把 Kernel/App 的边界与最小数据流跑通,让“安装/解析/启动路径”可被验证。
|
|
34
|
+
|
|
35
|
+
- 关键能力(至少):
|
|
36
|
+
- App 的 install handshake(`<app> --json`)可被 Kernel/CLI 读取。
|
|
37
|
+
- App manifest(`.minds/app.yaml`)schema/loader 可用。
|
|
38
|
+
- 基本的本地解析策略(`local`)可工作:按 `<rtws>/dominds-apps/<appId>/` 发现本地 app。
|
|
39
|
+
|
|
40
|
+
### 阶段 B:团队组装与跨 app 引用(Team Composition)
|
|
41
|
+
|
|
42
|
+
目标:让 app 提供的 teammates 能参与 team 组装,并明确跨 app 引用的运行上下文语义。
|
|
43
|
+
|
|
44
|
+
- 关键能力(至少):
|
|
45
|
+
- 读取 enabled apps 的 teammates YAML(并支持 workspace override)。
|
|
46
|
+
- `.minds/team.yaml` 支持在 `members.<id>.from + (use|import)` 显式引用依赖 app 的 teammate。
|
|
47
|
+
- 同名冲突/引用失败可诊断,并进入 Problems/defunc 路径(可重试)。
|
|
48
|
+
|
|
49
|
+
### 阶段 C:MVP gate(依赖/锁定/覆盖口径/端口固化/Problems)
|
|
50
|
+
|
|
51
|
+
目标:把“依赖解析 + 可观测 + 可回归”的闭环打齐,确保 dogfooding 下可诊断、可恢复。
|
|
52
|
+
|
|
53
|
+
- 关键能力(必过):
|
|
54
|
+
- required/optional 依赖:
|
|
55
|
+
- optional 缺失/被 disable:静默跳过(不阻塞启动;不要求产生 Problems;允许 debug 日志)。
|
|
56
|
+
- required 缺失/被 disable:不阻塞启动;必须在 WebUI Problems 可观测;相关能力进入 defunc/不可用。
|
|
57
|
+
- disable 传导(required):
|
|
58
|
+
- `<rtws>/.apps/resolution.yaml` 需要同时表达:用户意图(是否用户 disable)与被动传导后的有效状态。
|
|
59
|
+
- 依赖恢复后,能自动恢复被动传导导致的 disable(不覆盖用户显式 disable)。
|
|
60
|
+
- override 优先级(文档口径固定):`rtws override > app override > app defaults`。
|
|
61
|
+
- lock 语义(设计口径):`.minds/app-lock.yaml` 仅冻结依赖项版本;enable/disable 不应导致 lock 抖动。
|
|
62
|
+
- assignedPort:resolver 产出的 `assignedPort` 一旦固化必须为非 0;冲突时提示并重分配;卸载后自然回收。
|
|
63
|
+
- Problems:Problems id 使用稳定前缀(当前为 `apps/apps_resolution/`),修复后可 reconcile 清理(不应永久残留)。
|
|
64
|
+
|
|
65
|
+
### 阶段 D:整合与体验完善(Integration & UX)
|
|
66
|
+
|
|
67
|
+
目标:让 integrator app 能“可发布地整合”依赖 app 的默认覆盖,并完善 Problems/可观测性体验。
|
|
68
|
+
|
|
69
|
+
- 关键能力(目标):
|
|
70
|
+
- app override:app 包内可携带对依赖 app 的默认覆盖(作为 integrator 的可发布整合配置),且仍以 rtws override 为最高优先级。
|
|
71
|
+
- override 覆盖范围扩展到更多 `.minds/**` 资产(persona/knowledge/lessons、memory、mcp 等)。
|
|
72
|
+
- Problems 机制增强:记录并展示“发生时间/解决时间/已解决状态”,并支持“一键清理已解决项目”。
|
|
73
|
+
- 更完整的异常路径契约(损坏 YAML、部分可用、恢复策略)与回归覆盖。
|
|
24
74
|
|
|
25
75
|
## 非目标
|
|
26
76
|
|
|
@@ -28,6 +78,22 @@
|
|
|
28
78
|
- 本文不定义 sandbox/隔离(例如权限隔离、资源隔离)。
|
|
29
79
|
- 本文不把所有实现细节塞进来;实现锚点以“关键落点”形式列出。
|
|
30
80
|
|
|
81
|
+
## Kernel–App 运行时骨架
|
|
82
|
+
|
|
83
|
+
以下规则定义 Kernel 与 App 的关键运行时边界:
|
|
84
|
+
|
|
85
|
+
- 解析顺序:app 内固定为 `local(app) -> kernel`。
|
|
86
|
+
- 覆盖语义:覆盖按“配置层”发生,而不是按“对象注册”发生:
|
|
87
|
+
- 对同一 app 的资产路径 `p`:`<rtws>/.apps/override/<app-id>/.minds/<p>`(rtws override)优先于 app 包内默认值。
|
|
88
|
+
- (目标:拟实现)app 作为集成者可以为其依赖 app 提供 _app override_(例如随包发布的默认覆盖),但最终仍以 rtws override 为准。
|
|
89
|
+
- 对 kernel registry 的同名覆盖不是目标:同名冲突应被显式诊断(并按规则进入 defunc / Problems),而不是“后写覆盖前写”。
|
|
90
|
+
- 冲突语义:import 引入同名冲突或依赖不满足时,app 进入 defunc。
|
|
91
|
+
- registry 边界:app 对象不注册到 kernel registry;defunc 不涉及“从 kernel 移除 app 对象”。
|
|
92
|
+
- 可观测性:defunc 原因应进入 Problems(至少可定位 `appId`、原因分类与建议动作)。
|
|
93
|
+
- 重试语义:defunc 默认可重试(依赖或配置修复后,下一次刷新周期可重载)。
|
|
94
|
+
- 固定工具契约:`app_integration_manual({ appId, language? })` 失败应可观测,但不触发 defunc。
|
|
95
|
+
- 典型加载顺序:先解析并注册工具集,再读取 team 与 imports,应用 override,校验后注册成员;失败则 defunc。
|
|
96
|
+
|
|
31
97
|
## 核心概念
|
|
32
98
|
|
|
33
99
|
### Kernel
|
|
@@ -110,10 +176,17 @@ rtws 是一次运行的工作区根目录(`process.cwd()`)。Kernel 在其
|
|
|
110
176
|
- Install JSON 只承载“定位与缓存”所需的最小字段。
|
|
111
177
|
- App 的能力清单(teammates/tools/web/seed 等)**只以 manifest 为准**,避免双写导致漂移。
|
|
112
178
|
|
|
113
|
-
(现状:已实现)install json schema 与
|
|
179
|
+
(现状:已实现)install json schema 与 apps resolution 锚点仍可参考:
|
|
114
180
|
|
|
115
181
|
- JSON schema:`dominds/main/apps/app-json.ts`(`DomindsAppInstallJsonV1`)。
|
|
116
|
-
- `.apps/
|
|
182
|
+
- `.apps/resolution.yaml`:`dominds/main/apps/resolution-file.ts`。
|
|
183
|
+
|
|
184
|
+
(现状:已实现)Kernel 的 app 解析以 `<rtws>/.apps/resolution.yaml` 提供 **overlay + strategy**:
|
|
185
|
+
|
|
186
|
+
- 若文件存在:`apps[]` 作为 overlay(保存 `enabled` / `assignedPort` / `source` / `installJson`),`resolutionStrategy?`(若提供)覆盖默认策略。
|
|
187
|
+
- 若文件不存在:overlay 视为空,strategy 使用默认值(`order=['local']`,`localRoots=['dominds-apps']`)。
|
|
188
|
+
|
|
189
|
+
因此,即使缺少 `<rtws>/.apps/resolution.yaml`,只要 `.minds/app.yaml` 声明了依赖,Kernel 仍会按默认策略去解析本地 app;反之若根 manifest 没有依赖,则最终 enabled apps 为空。
|
|
117
190
|
|
|
118
191
|
## App 可提供的 `.minds/**` 资产
|
|
119
192
|
|
|
@@ -143,9 +216,9 @@ rtws 是一次运行的工作区根目录(`process.cwd()`)。Kernel 在其
|
|
|
143
216
|
- 这些 teammates 默认拥有哪些 toolsets/tools;
|
|
144
217
|
- 这些 teammates 在 app 上下文里互相如何可见/可 tellask。
|
|
145
218
|
|
|
146
|
-
>
|
|
147
|
-
>
|
|
148
|
-
>
|
|
219
|
+
> 现状(v0):Kernel 会从 enabled apps 读取 teammates YAML,但**不会**把其 `members` 扁平合并进 rtws 的 `.minds/team.yaml`。
|
|
220
|
+
> 你必须在 rtws 的 `.minds/team.yaml` 里通过 `members.<id>.from + (use|import)` 显式引用依赖 app 的 teammate。
|
|
221
|
+
> 读取锚点:`dominds/main/apps/teammates.ts`;解析/落地锚点:`dominds/main/team.ts`。
|
|
149
222
|
|
|
150
223
|
### `.minds/mcp.yaml`
|
|
151
224
|
|
|
@@ -163,15 +236,7 @@ rtws 是一次运行的工作区根目录(`process.cwd()`)。Kernel 在其
|
|
|
163
236
|
- Kernel 不应自动把 `env.md` 写入 shell rc 或环境;它只提供可见性(文档/提示)。
|
|
164
237
|
- 若 Kernel 提供“写入 rc managed block”的能力(例如 setup flow),也应基于明确的 UI/确认,而不是隐式执行。
|
|
165
238
|
|
|
166
|
-
## `<rtws>/.apps/<app-id
|
|
167
|
-
|
|
168
|
-
### `.apps/installed.yaml`
|
|
169
|
-
|
|
170
|
-
(现状:已实现)Kernel 把“安装/启用的 apps 列表”写入 `<rtws>/.apps/installed.yaml`。
|
|
171
|
-
|
|
172
|
-
它是 workspace 侧 app 系统的事实来源之一(至少用于 enabled apps snapshot)。
|
|
173
|
-
|
|
174
|
-
(目标:拟实现)以 `.minds/app-lock.yaml` + `<rtws>/.apps/resolution.yaml` 替代 `.apps/installed.yaml` 的“混合职责”,将 enable/disable、来源解析、端口固化等收敛到 resolution 层。
|
|
239
|
+
## `<rtws>/.apps/override/<app-id>/`:覆盖层
|
|
175
240
|
|
|
176
241
|
### 覆盖层目录(override root)
|
|
177
242
|
|
|
@@ -205,8 +270,7 @@ rtws 是一次运行的工作区根目录(`process.cwd()`)。Kernel 在其
|
|
|
205
270
|
|
|
206
271
|
这条规则天然支持“覆盖依赖 app”:只要某个依赖 app 在该 rtws 中被启用,workspace 就可以通过它自己的 `.apps/<dep-id>/...` 覆盖它。
|
|
207
272
|
|
|
208
|
-
>
|
|
209
|
-
> 本文把“override”扩展到更通用的 `.minds/**` 资产(不仅限于 team)。
|
|
273
|
+
> 本文同时覆盖 `<rtws>/.apps/<app-id>/team.yaml` override DSL 的构想,并扩展到更通用的 `.minds/**` 资产(不仅限于 team)。
|
|
210
274
|
|
|
211
275
|
#### 覆盖范围(建议)
|
|
212
276
|
|
|
@@ -264,7 +328,8 @@ rtws 是一次运行的工作区根目录(`process.cwd()`)。Kernel 在其
|
|
|
264
328
|
|
|
265
329
|
### 建议的 YAML 形态
|
|
266
330
|
|
|
267
|
-
>
|
|
331
|
+
> 现状(v0):`.minds/team.yaml` 解析器已支持该语法。
|
|
332
|
+
> 但由于 App 上下文隔离/桥接机制尚未完成,`use` 与 `import` 在运行时暂时等价(都会把来源 member 的配置导入为当前 team 的一个成员),差异仅作为未来语义的占位。
|
|
268
333
|
|
|
269
334
|
示例(片段):
|
|
270
335
|
|
|
@@ -358,7 +423,7 @@ Problem id 应体现“定义方 scope 的从属层级”,并保持短小稳
|
|
|
358
423
|
## 关键落点(现有实现锚点)
|
|
359
424
|
|
|
360
425
|
- install json 解析:`dominds/main/apps/app-json.ts`
|
|
361
|
-
- `.apps/
|
|
426
|
+
- `.apps/resolution.yaml`:`dominds/main/apps/resolution-file.ts`
|
|
362
427
|
- apps runtime(proxy tools):`dominds/main/apps/runtime.ts`
|
|
363
428
|
- app teammates loader(原型期扁平合并):`dominds/main/apps/teammates.ts`、`dominds/main/team.ts`
|
|
364
429
|
- manifest(`.minds/app.yaml`)解析:`dominds/main/apps/manifest.ts`
|
|
@@ -454,7 +454,7 @@ sequenceDiagram
|
|
|
454
454
|
Q4H is raised when the `askHuman({ tellaskContent: "..." })` tellask function is invoked by ANY dialog (root or subdialog) on its own right:
|
|
455
455
|
|
|
456
456
|
```typescript
|
|
457
|
-
// From main/llm/driver
|
|
457
|
+
// From main/llm/kernel-driver/tellask-special.ts
|
|
458
458
|
const isQ4H = callName === 'askHuman';
|
|
459
459
|
```
|
|
460
460
|
|
|
@@ -445,7 +445,7 @@ sequenceDiagram
|
|
|
445
445
|
当 `askHuman({ tellaskContent: "..." })` tellask 函数被任何对话(根或子对话)自行调用时,会提出 Q4H:
|
|
446
446
|
|
|
447
447
|
```typescript
|
|
448
|
-
// 来自 main/llm/driver
|
|
448
|
+
// 来自 main/llm/kernel-driver/tellask-special.ts
|
|
449
449
|
const isQ4H = callName === 'askHuman';
|
|
450
450
|
```
|
|
451
451
|
|