dominds 1.1.3 → 1.1.4
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/access-control.js +4 -0
- package/dist/cli/read.js +284 -102
- package/dist/docs/memory-system.md +10 -4
- package/dist/docs/memory-system.zh.md +10 -4
- package/dist/docs/team_mgmt-toolset.md +2 -2
- package/dist/docs/team_mgmt-toolset.zh.md +2 -2
- package/dist/minds/load.js +6 -6
- package/dist/minds/system-prompt-parts.js +5 -2
- package/dist/minds/system-prompt.js +2 -2
- package/dist/shared/diligence.js +8 -4
- package/dist/static/assets/{_basePickBy-BAy0WcNn.js → _basePickBy-D4H_CIr2.js} +3 -3
- package/dist/static/assets/{_basePickBy-BAy0WcNn.js.map → _basePickBy-D4H_CIr2.js.map} +1 -1
- package/dist/static/assets/{_baseUniq-C22j0Hu6.js → _baseUniq-Cam_qUTC.js} +2 -2
- package/dist/static/assets/{_baseUniq-C22j0Hu6.js.map → _baseUniq-Cam_qUTC.js.map} +1 -1
- package/dist/static/assets/{arc-THa7P_CQ.js → arc-Cp03tble.js} +2 -2
- package/dist/static/assets/{arc-THa7P_CQ.js.map → arc-Cp03tble.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-B255PlmG.js → architectureDiagram-VXUJARFQ-CqzFAYuR.js} +7 -7
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-B255PlmG.js.map → architectureDiagram-VXUJARFQ-CqzFAYuR.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-CA-y1RON.js → blockDiagram-VD42YOAC-BJzUefd3.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-CA-y1RON.js.map → blockDiagram-VD42YOAC-BJzUefd3.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-BgCQQIBi.js → c4Diagram-YG6GDRKO-DVeJDi8g.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-BgCQQIBi.js.map → c4Diagram-YG6GDRKO-DVeJDi8g.js.map} +1 -1
- package/dist/static/assets/{channel-2_zRJ_1r.js → channel-BP8WCdPp.js} +2 -2
- package/dist/static/assets/{channel-2_zRJ_1r.js.map → channel-BP8WCdPp.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-DYUdPijE.js → chunk-4BX2VUAB-6gGHbPPy.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-DYUdPijE.js.map → chunk-4BX2VUAB-6gGHbPPy.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-CC0Uw3Fc.js → chunk-55IACEB6-DavH-eLA.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-CC0Uw3Fc.js.map → chunk-55IACEB6-DavH-eLA.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-NMnANHPi.js → chunk-B4BG7PRW-BIEHGik-.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-NMnANHPi.js.map → chunk-B4BG7PRW-BIEHGik-.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-l-bZZU50.js → chunk-DI55MBZ5-Clu1GQTF.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-l-bZZU50.js.map → chunk-DI55MBZ5-Clu1GQTF.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-Czi371-x.js → chunk-FMBD7UC4-BrQ6SHlP.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-Czi371-x.js.map → chunk-FMBD7UC4-BrQ6SHlP.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-B7b7Tdpo.js → chunk-QN33PNHL-BTHZ40VN.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-B7b7Tdpo.js.map → chunk-QN33PNHL-BTHZ40VN.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-Bux8WX8T.js → chunk-QZHKN3VN-hag0dT3B.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-Bux8WX8T.js.map → chunk-QZHKN3VN-hag0dT3B.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-Da1P65RK.js → chunk-TZMSLE5B-D0AYZy0F.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-Da1P65RK.js.map → chunk-TZMSLE5B-D0AYZy0F.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-DB_U2rp6.js → classDiagram-2ON5EDUG-TV5Ns2XR.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-DB_U2rp6.js.map → classDiagram-2ON5EDUG-TV5Ns2XR.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DB_U2rp6.js → classDiagram-v2-WZHVMYZB-TV5Ns2XR.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DB_U2rp6.js.map → classDiagram-v2-WZHVMYZB-TV5Ns2XR.js.map} +1 -1
- package/dist/static/assets/{clone-DdPxcQQp.js → clone-C27DK4mX.js} +2 -2
- package/dist/static/assets/{clone-DdPxcQQp.js.map → clone-C27DK4mX.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-CMH0eqGL.js → cose-bilkent-S5V4N54A-D1WKk9KM.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-CMH0eqGL.js.map → cose-bilkent-S5V4N54A-D1WKk9KM.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-CfVnyuff.js → dagre-6UL2VRFP-BHV9AbhM.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-CfVnyuff.js.map → dagre-6UL2VRFP-BHV9AbhM.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-CjlYpDPZ.js → diagram-PSM6KHXK-Bc-sx7s7.js} +8 -8
- package/dist/static/assets/{diagram-PSM6KHXK-CjlYpDPZ.js.map → diagram-PSM6KHXK-Bc-sx7s7.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-C5i6LKF8.js → diagram-QEK2KX5R-DEMTGbLs.js} +7 -7
- package/dist/static/assets/{diagram-QEK2KX5R-C5i6LKF8.js.map → diagram-QEK2KX5R-DEMTGbLs.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-aSKKxvOh.js → diagram-S2PKOQOG-Z0e4bRPr.js} +7 -7
- package/dist/static/assets/{diagram-S2PKOQOG-aSKKxvOh.js.map → diagram-S2PKOQOG-Z0e4bRPr.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CUjiyvMh.js → erDiagram-Q2GNP2WA-CVrz2zW-.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CUjiyvMh.js.map → erDiagram-Q2GNP2WA-CVrz2zW-.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-KIQWqjoI.js → flowDiagram-NV44I4VS-D0G87s2C.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-KIQWqjoI.js.map → flowDiagram-NV44I4VS-D0G87s2C.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-BUPbaIK1.js → ganttDiagram-JELNMOA3-C6oOkrt2.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-BUPbaIK1.js.map → ganttDiagram-JELNMOA3-C6oOkrt2.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DADfyXv6.js → gitGraphDiagram-V2S2FVAM-CRky7qmU.js} +8 -8
- package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DADfyXv6.js.map → gitGraphDiagram-V2S2FVAM-CRky7qmU.js.map} +1 -1
- package/dist/static/assets/{graph-HLDnoJij.js → graph-BA9_VK_c.js} +3 -3
- package/dist/static/assets/{graph-HLDnoJij.js.map → graph-BA9_VK_c.js.map} +1 -1
- package/dist/static/assets/{index-BHhN1AS0.js → index-C2LCoXUh.js} +39 -35
- package/dist/static/assets/index-C2LCoXUh.js.map +1 -0
- package/dist/static/assets/{infoDiagram-HS3SLOUP-DV5fAmxD.js → infoDiagram-HS3SLOUP-h2v1r5U4.js} +6 -6
- package/dist/static/assets/{infoDiagram-HS3SLOUP-DV5fAmxD.js.map → infoDiagram-HS3SLOUP-h2v1r5U4.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CxNVhQK8.js → journeyDiagram-XKPGCS4Q-DsdOz9je.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CxNVhQK8.js.map → journeyDiagram-XKPGCS4Q-DsdOz9je.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Ddo9NqZm.js → kanban-definition-3W4ZIXB7-BtgqtUWK.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Ddo9NqZm.js.map → kanban-definition-3W4ZIXB7-BtgqtUWK.js.map} +1 -1
- package/dist/static/assets/{layout-BwhvAAwL.js → layout-CaqskGvk.js} +5 -5
- package/dist/static/assets/{layout-BwhvAAwL.js.map → layout-CaqskGvk.js.map} +1 -1
- package/dist/static/assets/{linear-Ts0sbFeV.js → linear-GIia-X9J.js} +2 -2
- package/dist/static/assets/{linear-Ts0sbFeV.js.map → linear-GIia-X9J.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C6Fjr_53.js → mindmap-definition-VGOIOE7T-BV8RaD59.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-C6Fjr_53.js.map → mindmap-definition-VGOIOE7T-BV8RaD59.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-bNP_VNuI.js → pieDiagram-ADFJNKIX-CWVKMbU0.js} +8 -8
- package/dist/static/assets/{pieDiagram-ADFJNKIX-bNP_VNuI.js.map → pieDiagram-ADFJNKIX-CWVKMbU0.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-8oe73Msv.js → quadrantDiagram-AYHSOK5B-Bq0kwFa2.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-8oe73Msv.js.map → quadrantDiagram-AYHSOK5B-Bq0kwFa2.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-FifVoWZR.js → requirementDiagram-UZGBJVZJ-BPrfIKvO.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-FifVoWZR.js.map → requirementDiagram-UZGBJVZJ-BPrfIKvO.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CYZbmiul.js → sankeyDiagram-TZEHDZUN-CM2zak8H.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CYZbmiul.js.map → sankeyDiagram-TZEHDZUN-CM2zak8H.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CbtrBuXL.js → sequenceDiagram-WL72ISMW-De4dbz48.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CbtrBuXL.js.map → sequenceDiagram-WL72ISMW-De4dbz48.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-D-U0YJry.js → stateDiagram-FKZM4ZOC-BmpggztQ.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-D-U0YJry.js.map → stateDiagram-FKZM4ZOC-BmpggztQ.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BjHWtB6u.js → stateDiagram-v2-4FDKWEC3-bDNB8r1W.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BjHWtB6u.js.map → stateDiagram-v2-4FDKWEC3-bDNB8r1W.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BHGBcy0d.js → timeline-definition-IT6M3QCI-CeYsZOwA.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BHGBcy0d.js.map → timeline-definition-IT6M3QCI-CeYsZOwA.js.map} +1 -1
- package/dist/static/assets/{treemap-GDKQZRPO-BIWTr3M2.js → treemap-GDKQZRPO-_U4bMBrl.js} +5 -5
- package/dist/static/assets/{treemap-GDKQZRPO-BIWTr3M2.js.map → treemap-GDKQZRPO-_U4bMBrl.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cbfb9kZD.js → xychartDiagram-PRI3JC2R-CC2Utdsb.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cbfb9kZD.js.map → xychartDiagram-PRI3JC2R-CC2Utdsb.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/builtins.js +13 -8
- package/dist/tools/mem.js +36 -25
- package/dist/tools/pending-tellask-reminder.js +14 -12
- package/dist/tools/prompts/control/en/scenarios.md +3 -3
- package/dist/tools/prompts/control/en/tools.md +1 -1
- package/dist/tools/prompts/control/zh/scenarios.md +3 -3
- package/dist/tools/prompts/control/zh/tools.md +1 -1
- package/dist/tools/prompts/memory/en/principles.md +5 -13
- package/dist/tools/prompts/memory/en/tools.md +36 -11
- package/dist/tools/prompts/memory/zh/principles.md +8 -18
- package/dist/tools/prompts/memory/zh/tools.md +36 -11
- package/dist/tools/prompts/personal_memory/en/errors.md +155 -0
- package/dist/tools/prompts/personal_memory/en/index.md +57 -0
- package/dist/tools/prompts/personal_memory/en/principles.md +94 -0
- package/dist/tools/prompts/personal_memory/en/scenarios.md +174 -0
- package/dist/tools/prompts/personal_memory/en/tools.md +129 -0
- package/dist/tools/prompts/personal_memory/zh/errors.md +155 -0
- package/dist/tools/prompts/personal_memory/zh/index.md +53 -0
- package/dist/tools/prompts/personal_memory/zh/principles.md +96 -0
- package/dist/tools/prompts/personal_memory/zh/scenarios.md +174 -0
- package/dist/tools/prompts/personal_memory/zh/tools.md +129 -0
- package/dist/tools/prompts/team_memory/en/principles.md +2 -2
- package/dist/tools/prompts/team_memory/zh/principles.md +2 -2
- package/dist/tools/prompts/team_mgmt/en/tools.md +1 -1
- package/dist/tools/prompts/team_mgmt/zh/tools.md +1 -1
- package/package.json +1 -1
- package/dist/agent-priming.js +0 -2051
- package/dist/docs/dominds-agent-priming.md +0 -218
- package/dist/docs/dominds-agent-priming.zh.md +0 -196
- package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
- package/dist/docs/keep-going.md +0 -176
- package/dist/docs/keep-going.zh.md +0 -162
- package/dist/docs/showing-by-doing.md +0 -208
- package/dist/docs/showing-by-doing.zh.md +0 -177
- package/dist/docs/team-mgmt-toolset.md +0 -482
- package/dist/docs/team-mgmt-toolset.zh.md +0 -426
- package/dist/llm/driver.js +0 -4093
- package/dist/minds/promptdocs.js +0 -263
- package/dist/server/prompts-routes.js +0 -545
- package/dist/shared/team-mgmt-manual.js +0 -120
- package/dist/shared/types/prompts.js +0 -2
- package/dist/shared/types/tellask.js +0 -8
- package/dist/showing-by-doing.js +0 -1091
- package/dist/snippets/README.en.md +0 -3
- package/dist/snippets/README.md +0 -4
- package/dist/static/assets/index-BHhN1AS0.js.map +0 -1
- package/dist/tellask.js +0 -439
- package/dist/tools/context-health.js +0 -177
- package/dist/tools/diag.js +0 -583
- package/dist/tools/team-mgmt.js +0 -3487
- package/dist/utils/task-doc.js +0 -236
package/dist/access-control.js
CHANGED
|
@@ -333,10 +333,14 @@ function getAccessDeniedMessage(operation, targetPath, language = 'en') {
|
|
|
333
333
|
lines.push('');
|
|
334
334
|
if (language === 'zh') {
|
|
335
335
|
lines.push(`- 说明:\`.minds/\` 是 rtws(运行时工作区)的“团队配置/记忆/资产”目录,通用文件工具无法读写(硬编码无条件拒绝)。`);
|
|
336
|
+
lines.push(`- 提示:如果你是在管理“个人记忆”,请不要尝试直接读/写/列目录 \`.minds/memory/**\`(会被拒绝)。请使用个人记忆工具:\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`。首次创建时直接 \`add_personal_memory\` 即可,目录会自动创建;\`path\` 不应包含你的成员 id。`);
|
|
337
|
+
lines.push(`- 提示:如果你是在管理“团队共享记忆”,请使用团队共享记忆工具:\`add_team_memory\` / \`replace_team_memory\` / \`drop_team_memory\` / \`clear_team_memory\`。`);
|
|
336
338
|
lines.push(`- 提示:若团队配置了 \`team_mgmt\` 工具集,请使用其中工具(\`team_mgmt_*\`)代管;若未配置或你不具备权限,请诉请具备 \`team_mgmt\` 权限的成员/团队管理员成员代管。`);
|
|
337
339
|
}
|
|
338
340
|
else {
|
|
339
341
|
lines.push(`- Note: \`.minds/\` stores rtws (runtime workspace) team config/memory/assets and is hard-denied for general file tools.`);
|
|
342
|
+
lines.push(`- Hint: If you're trying to manage **personal memory**, do not read/write/list \`.minds/memory/**\` directly (it will be denied). Use personal-memory tools: \`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`. For first-time setup, just call \`add_personal_memory\`—the directory is created automatically; \`path\` must not include your member id.`);
|
|
343
|
+
lines.push(`- Hint: If you're trying to manage **team shared memory**, use: \`add_team_memory\` / \`replace_team_memory\` / \`drop_team_memory\` / \`clear_team_memory\`.`);
|
|
340
344
|
lines.push(`- Hint: If your team configured the \`team_mgmt\` toolset, use its tools (\`team_mgmt_*\`); otherwise (or if you lack access), tellask a team-admin / a member with \`team_mgmt\` access to manage it for you.`);
|
|
341
345
|
}
|
|
342
346
|
}
|
package/dist/cli/read.js
CHANGED
|
@@ -10,11 +10,44 @@
|
|
|
10
10
|
* --no-hints Don't show hints
|
|
11
11
|
* --only-prompt Show only system prompt
|
|
12
12
|
* --only-mem Show only memories
|
|
13
|
-
* --audit Run
|
|
13
|
+
* --audit Run prompt audit via hidden teammate @fuxi (skip when default LLM unavailable)
|
|
14
14
|
* --fail-on-audit-warning Exit non-zero when audit emits warnings
|
|
15
15
|
* --find <pattern> Find case-insensitive text in rendered output
|
|
16
16
|
* --help Show help
|
|
17
17
|
*/
|
|
18
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
21
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
22
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
23
|
+
}
|
|
24
|
+
Object.defineProperty(o, k2, desc);
|
|
25
|
+
}) : (function(o, m, k, k2) {
|
|
26
|
+
if (k2 === undefined) k2 = k;
|
|
27
|
+
o[k2] = m[k];
|
|
28
|
+
}));
|
|
29
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
30
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
31
|
+
}) : function(o, v) {
|
|
32
|
+
o["default"] = v;
|
|
33
|
+
});
|
|
34
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
35
|
+
var ownKeys = function(o) {
|
|
36
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
37
|
+
var ar = [];
|
|
38
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
39
|
+
return ar;
|
|
40
|
+
};
|
|
41
|
+
return ownKeys(o);
|
|
42
|
+
};
|
|
43
|
+
return function (mod) {
|
|
44
|
+
if (mod && mod.__esModule) return mod;
|
|
45
|
+
var result = {};
|
|
46
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
47
|
+
__setModuleDefault(result, mod);
|
|
48
|
+
return result;
|
|
49
|
+
};
|
|
50
|
+
})();
|
|
18
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
52
|
exports.main = main;
|
|
20
53
|
const promises_1 = require("fs/promises");
|
|
@@ -26,7 +59,7 @@ function printUsage() {
|
|
|
26
59
|
console.log('Usage: dominds read [<member-id>] [--no-hints] [--only-prompt|--only-mem] [--audit] [--find <pattern>]');
|
|
27
60
|
console.log('');
|
|
28
61
|
console.log('Print agent system prompt and memories with filtering flags.');
|
|
29
|
-
console.log('`--audit` also includes static toolset checks (registry vs `.minds/mcp.yaml` declarations).');
|
|
62
|
+
console.log('`--audit` runs prompt audit via hidden teammate @fuxi using default LLM config (skips when unavailable), and also includes static toolset checks (registry vs `.minds/mcp.yaml` declarations).');
|
|
30
63
|
console.log('When <member-id> is omitted, reads all visible team members.');
|
|
31
64
|
console.log('');
|
|
32
65
|
console.log("Note: rtws (runtime workspace) directory is `process.cwd()`. Use 'dominds -C <dir> read' to run in another rtws.");
|
|
@@ -40,118 +73,259 @@ function printUsage() {
|
|
|
40
73
|
console.log(' dominds read ux --only-prompt --find "pending Tellask"');
|
|
41
74
|
console.log(' dominds read --only-prompt --audit --fail-on-audit-warning');
|
|
42
75
|
}
|
|
43
|
-
function
|
|
44
|
-
return
|
|
45
|
-
.trim()
|
|
46
|
-
.replace(/^[-*]\s+/, '')
|
|
47
|
-
.replace(/[`*_]/g, '')
|
|
48
|
-
.replace(/\s+/g, ' ')
|
|
49
|
-
.toLowerCase();
|
|
76
|
+
function isRecord(value) {
|
|
77
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
50
78
|
}
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
{
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
|
|
66
|
-
label: 'Has pending tellask wait guard',
|
|
67
|
-
pass: /pending Tellask|pending tellask/.test(systemPrompt) ||
|
|
68
|
-
/存在明确 pending tellask/.test(systemPrompt),
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
id: 'relay_ban',
|
|
72
|
-
label: 'Has no-human-relay rule',
|
|
73
|
-
pass: /relay for executable teammate work/.test(systemPrompt) || /转发员/.test(systemPrompt),
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
id: 'tellask_function_boundary',
|
|
77
|
-
label: 'Has tellask vs function-calling boundary',
|
|
78
|
-
pass: /native function-calling/.test(systemPrompt) &&
|
|
79
|
-
(/is only for tellasking teammates\/freshBootsReasoning\/askHuman/.test(systemPrompt) ||
|
|
80
|
-
/仅用于诉请队友\/freshBootsReasoning\/askHuman/.test(systemPrompt)),
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
id: 'fbr_phase_contract',
|
|
84
|
-
label: 'Has FBR phase contract',
|
|
85
|
-
pass: /FBR phase contract|FBR 阶段协议/.test(systemPrompt),
|
|
79
|
+
function truncateForAuditInput(text, maxChars) {
|
|
80
|
+
if (text.length <= maxChars)
|
|
81
|
+
return { text, truncated: false };
|
|
82
|
+
return { text: text.slice(0, maxChars), truncated: true };
|
|
83
|
+
}
|
|
84
|
+
async function runFuxiAuditCall(runtime, userContent) {
|
|
85
|
+
let output = '';
|
|
86
|
+
let sawFuncCall = false;
|
|
87
|
+
const receiver = {
|
|
88
|
+
thinkingStart: async () => { },
|
|
89
|
+
thinkingChunk: async () => { },
|
|
90
|
+
thinkingFinish: async () => { },
|
|
91
|
+
sayingStart: async () => { },
|
|
92
|
+
sayingChunk: async (chunk) => {
|
|
93
|
+
output += chunk;
|
|
86
94
|
},
|
|
87
|
-
{
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
pass: /Taskdoc encapsulation & access restrictions/.test(systemPrompt) ||
|
|
91
|
-
/差遣牒.*封装/.test(systemPrompt),
|
|
95
|
+
sayingFinish: async () => { },
|
|
96
|
+
funcCall: async () => {
|
|
97
|
+
sawFuncCall = true;
|
|
92
98
|
},
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
};
|
|
100
|
+
const context = [{ type: 'environment_msg', role: 'user', content: userContent }];
|
|
101
|
+
await runtime.llmGen.genToReceiver(runtime.providerCfg, runtime.auditAgent, runtime.auditorSystemPrompt, [], context, receiver, 0);
|
|
102
|
+
const trimmed = output.trim();
|
|
103
|
+
if (trimmed.length > 0)
|
|
104
|
+
return trimmed;
|
|
105
|
+
if (sawFuncCall)
|
|
106
|
+
return '{"verdict":"WARN","warnings":["LLM emitted tool call during prompt audit"],"rewrite":""}';
|
|
107
|
+
return '';
|
|
108
|
+
}
|
|
109
|
+
function parseFuxiAuditJson(raw) {
|
|
110
|
+
const start = raw.indexOf('{');
|
|
111
|
+
const end = raw.lastIndexOf('}');
|
|
112
|
+
if (start < 0 || end < start)
|
|
113
|
+
return null;
|
|
114
|
+
const candidate = raw.slice(start, end + 1);
|
|
115
|
+
let parsed;
|
|
116
|
+
try {
|
|
117
|
+
parsed = JSON.parse(candidate);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (!isRecord(parsed))
|
|
123
|
+
return null;
|
|
124
|
+
const verdictRaw = parsed['verdict'];
|
|
125
|
+
if (verdictRaw !== 'PASS' && verdictRaw !== 'WARN')
|
|
126
|
+
return null;
|
|
127
|
+
const warningsRaw = parsed['warnings'];
|
|
128
|
+
if (!Array.isArray(warningsRaw))
|
|
129
|
+
return null;
|
|
130
|
+
const warnings = [];
|
|
131
|
+
for (const item of warningsRaw) {
|
|
132
|
+
if (typeof item !== 'string')
|
|
133
|
+
return null;
|
|
134
|
+
const trimmed = item.trim();
|
|
135
|
+
if (trimmed.length === 0)
|
|
136
|
+
continue;
|
|
137
|
+
warnings.push(trimmed);
|
|
138
|
+
}
|
|
139
|
+
const rewriteRaw = parsed['rewrite'];
|
|
140
|
+
const rewriteSuggestion = typeof rewriteRaw === 'string' && rewriteRaw.trim().length > 0 ? rewriteRaw.trim() : undefined;
|
|
141
|
+
return { verdict: verdictRaw, warnings, rewriteSuggestion };
|
|
142
|
+
}
|
|
143
|
+
async function preparePromptAuditRuntime(team) {
|
|
144
|
+
const fuxi = team.getMember('fuxi');
|
|
145
|
+
if (!fuxi) {
|
|
146
|
+
return { kind: 'skip', reason: 'Hidden teammate @fuxi is not available in current team.' };
|
|
147
|
+
}
|
|
148
|
+
const providerKey = fuxi.provider ?? team.memberDefaults.provider;
|
|
149
|
+
const modelKey = fuxi.model ?? team.memberDefaults.model;
|
|
150
|
+
if (!providerKey || !modelKey) {
|
|
151
|
+
return {
|
|
152
|
+
kind: 'skip',
|
|
153
|
+
reason: 'Default LLM provider/model is not configured for @fuxi (resolved from member + member_defaults).',
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
let providerCfg;
|
|
157
|
+
try {
|
|
158
|
+
const { LlmConfig } = await Promise.resolve().then(() => __importStar(require('../llm/client')));
|
|
159
|
+
const llmCfg = await LlmConfig.load();
|
|
160
|
+
const resolved = llmCfg.getProvider(providerKey);
|
|
161
|
+
if (!resolved) {
|
|
162
|
+
return {
|
|
163
|
+
kind: 'skip',
|
|
164
|
+
reason: `Provider '${providerKey}' is missing in effective LLM config.`,
|
|
165
|
+
};
|
|
104
166
|
}
|
|
167
|
+
if (!resolved.models || !Object.prototype.hasOwnProperty.call(resolved.models, modelKey)) {
|
|
168
|
+
return {
|
|
169
|
+
kind: 'skip',
|
|
170
|
+
reason: `Model '${modelKey}' is not configured under provider '${providerKey}'.`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
providerCfg = resolved;
|
|
105
174
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (!
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
warnings.push(`Missing: ${check.label}`);
|
|
175
|
+
catch (err) {
|
|
176
|
+
return {
|
|
177
|
+
kind: 'skip',
|
|
178
|
+
reason: `Failed to load effective LLM config: ${err instanceof Error ? err.message : String(err)}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (providerCfg.apiType !== 'codex') {
|
|
182
|
+
const envVar = providerCfg.apiKeyEnvVar;
|
|
183
|
+
const envValue = process.env[envVar];
|
|
184
|
+
const envConfigured = typeof envValue === 'string' && envValue.trim().length > 0;
|
|
185
|
+
if (!envConfigured) {
|
|
186
|
+
return {
|
|
187
|
+
kind: 'skip',
|
|
188
|
+
reason: `Provider env var '${envVar}' is not configured (required for non-codex providers).`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const { getLlmGenerator } = await Promise.resolve().then(() => __importStar(require('../llm/gen/registry')));
|
|
193
|
+
const llmGen = getLlmGenerator(providerCfg.apiType);
|
|
194
|
+
if (!llmGen) {
|
|
195
|
+
return {
|
|
196
|
+
kind: 'skip',
|
|
197
|
+
reason: `LLM generator not found for apiType='${providerCfg.apiType}'.`,
|
|
198
|
+
};
|
|
131
199
|
}
|
|
132
|
-
|
|
133
|
-
|
|
200
|
+
let auditorSystemPrompt;
|
|
201
|
+
try {
|
|
202
|
+
const minds = await (0, load_1.loadAgentMinds)('fuxi', undefined, { missingToolsetPolicy: 'silent' });
|
|
203
|
+
auditorSystemPrompt = minds.systemPrompt;
|
|
134
204
|
}
|
|
135
|
-
|
|
136
|
-
|
|
205
|
+
catch (err) {
|
|
206
|
+
return {
|
|
207
|
+
kind: 'skip',
|
|
208
|
+
reason: `Failed to load @fuxi minds: ${err instanceof Error ? err.message : String(err)}`,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const auditAgent = new team_1.Team.Member({
|
|
212
|
+
id: fuxi.id,
|
|
213
|
+
name: fuxi.name,
|
|
214
|
+
provider: providerKey,
|
|
215
|
+
model: modelKey,
|
|
216
|
+
model_params: fuxi.model_params,
|
|
217
|
+
streaming: fuxi.streaming,
|
|
218
|
+
hidden: true,
|
|
219
|
+
internal_allow_minds: true,
|
|
220
|
+
});
|
|
221
|
+
try {
|
|
222
|
+
const probe = await runFuxiAuditCall({
|
|
223
|
+
kind: 'ready',
|
|
224
|
+
auditorId: 'fuxi',
|
|
225
|
+
providerKey,
|
|
226
|
+
modelKey,
|
|
227
|
+
providerCfg,
|
|
228
|
+
llmGen,
|
|
229
|
+
auditAgent,
|
|
230
|
+
auditorSystemPrompt,
|
|
231
|
+
}, 'Connectivity check for prompt audit. Reply with a short JSON: {"verdict":"PASS","warnings":[],"rewrite":""}');
|
|
232
|
+
if (probe.trim().length === 0) {
|
|
233
|
+
return { kind: 'skip', reason: 'Connectivity probe returned empty response.' };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
return {
|
|
238
|
+
kind: 'skip',
|
|
239
|
+
reason: `Connectivity probe failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
kind: 'ready',
|
|
244
|
+
auditorId: 'fuxi',
|
|
245
|
+
providerKey,
|
|
246
|
+
modelKey,
|
|
247
|
+
providerCfg,
|
|
248
|
+
llmGen,
|
|
249
|
+
auditAgent,
|
|
250
|
+
auditorSystemPrompt,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
async function buildPromptAudit(targetMemberId, systemPrompt, runtime) {
|
|
254
|
+
if (runtime.kind === 'skip') {
|
|
255
|
+
return {
|
|
256
|
+
mode: 'skipped',
|
|
257
|
+
targetMemberId,
|
|
258
|
+
auditorId: 'fuxi',
|
|
259
|
+
warnings: [],
|
|
260
|
+
skipReason: runtime.reason,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const clipped = truncateForAuditInput(systemPrompt, 28000);
|
|
264
|
+
const userPrompt = [
|
|
265
|
+
'你是隐藏队友 @fuxi。请审计下面候选系统提示词,只关注会导致真实执行偏差/协作风险的问题,忽略纯措辞润色。',
|
|
266
|
+
'只输出 JSON,不要 markdown,不要额外解释。',
|
|
267
|
+
'JSON schema: {"verdict":"PASS|WARN","warnings":["..."],"rewrite":"..."}',
|
|
268
|
+
'- 若没有实质问题:verdict=PASS 且 warnings=[]。',
|
|
269
|
+
'- 若有问题:verdict=WARN,warnings 只列实质问题(最多 5 条)。',
|
|
270
|
+
'- rewrite 提供一段可直接替换的合并改写建议(最多 8 行)。',
|
|
271
|
+
`target_member_id: ${targetMemberId}`,
|
|
272
|
+
`prompt_truncated: ${clipped.truncated ? 'true' : 'false'}`,
|
|
273
|
+
'candidate_system_prompt:',
|
|
274
|
+
clipped.text,
|
|
275
|
+
].join('\n\n');
|
|
276
|
+
let raw = '';
|
|
277
|
+
try {
|
|
278
|
+
raw = await runFuxiAuditCall(runtime, userPrompt);
|
|
137
279
|
}
|
|
138
|
-
|
|
280
|
+
catch (err) {
|
|
281
|
+
return {
|
|
282
|
+
mode: 'skipped',
|
|
283
|
+
targetMemberId,
|
|
284
|
+
auditorId: 'fuxi',
|
|
285
|
+
warnings: [],
|
|
286
|
+
skipReason: `@fuxi audit call failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const parsed = parseFuxiAuditJson(raw);
|
|
290
|
+
if (!parsed) {
|
|
291
|
+
return {
|
|
292
|
+
mode: 'fuxi_llm',
|
|
293
|
+
targetMemberId,
|
|
294
|
+
auditorId: 'fuxi',
|
|
295
|
+
providerKey: runtime.providerKey,
|
|
296
|
+
modelKey: runtime.modelKey,
|
|
297
|
+
verdict: 'WARN',
|
|
298
|
+
warnings: ['@fuxi audit output is not valid JSON as requested'],
|
|
299
|
+
rewriteSuggestion: raw.trim().length > 0 ? raw.trim() : undefined,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const warnings = parsed.warnings;
|
|
303
|
+
const verdict = warnings.length === 0 ? 'PASS' : parsed.verdict;
|
|
304
|
+
return {
|
|
305
|
+
mode: 'fuxi_llm',
|
|
306
|
+
targetMemberId,
|
|
307
|
+
auditorId: 'fuxi',
|
|
308
|
+
providerKey: runtime.providerKey,
|
|
309
|
+
modelKey: runtime.modelKey,
|
|
310
|
+
verdict,
|
|
311
|
+
warnings,
|
|
312
|
+
rewriteSuggestion: parsed.rewriteSuggestion,
|
|
313
|
+
};
|
|
139
314
|
}
|
|
140
315
|
function printPromptAudit(report) {
|
|
141
316
|
process.stdout.write('\n## Prompt Audit\n');
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
process.stdout.write(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
for (const d of report.duplicates) {
|
|
149
|
-
process.stdout.write(` - x${d.count}: ${d.line}\n`);
|
|
150
|
-
}
|
|
317
|
+
process.stdout.write(`- Target: @${report.targetMemberId}\n`);
|
|
318
|
+
if (report.mode === 'skipped') {
|
|
319
|
+
process.stdout.write('- Mode: skipped (@fuxi audit disabled due to unavailable default LLM)\n');
|
|
320
|
+
process.stdout.write(`- Reason: ${report.skipReason ?? 'unknown'}\n`);
|
|
321
|
+
process.stdout.write('- Warnings: none (audit step skipped)\n');
|
|
322
|
+
return;
|
|
151
323
|
}
|
|
152
|
-
|
|
153
|
-
|
|
324
|
+
process.stdout.write('- Mode: @fuxi (LLM)\n');
|
|
325
|
+
if (report.providerKey && report.modelKey) {
|
|
326
|
+
process.stdout.write(`- Runtime: provider='${report.providerKey}', model='${report.modelKey}'\n`);
|
|
154
327
|
}
|
|
328
|
+
process.stdout.write(`- Verdict: ${report.verdict ?? 'WARN'}\n`);
|
|
155
329
|
if (report.warnings.length > 0) {
|
|
156
330
|
process.stdout.write('- Warnings:\n');
|
|
157
331
|
for (const warning of report.warnings) {
|
|
@@ -161,6 +335,10 @@ function printPromptAudit(report) {
|
|
|
161
335
|
else {
|
|
162
336
|
process.stdout.write('- Warnings: none\n');
|
|
163
337
|
}
|
|
338
|
+
if (report.rewriteSuggestion && report.rewriteSuggestion.trim().length > 0) {
|
|
339
|
+
process.stdout.write('- Suggested Rewrite:\n');
|
|
340
|
+
process.stdout.write(`${report.rewriteSuggestion.trim()}\n`);
|
|
341
|
+
}
|
|
164
342
|
}
|
|
165
343
|
function listExplicitToolsets(member) {
|
|
166
344
|
if (!member.toolsets)
|
|
@@ -401,6 +579,7 @@ async function main() {
|
|
|
401
579
|
const team = await team_1.Team.load();
|
|
402
580
|
const targetMemberIds = resolveTargetMemberIds(team, parsed.memberId);
|
|
403
581
|
const isMultiMemberRun = targetMemberIds.length > 1;
|
|
582
|
+
const promptAuditRuntime = parsed.audit ? await preparePromptAuditRuntime(team) : undefined;
|
|
404
583
|
const toolsetAudit = parsed.audit
|
|
405
584
|
? buildToolsetAuditReport({
|
|
406
585
|
team,
|
|
@@ -433,7 +612,10 @@ async function main() {
|
|
|
433
612
|
}
|
|
434
613
|
}
|
|
435
614
|
if (parsed.audit) {
|
|
436
|
-
const report = buildPromptAudit(systemPrompt
|
|
615
|
+
const report = await buildPromptAudit(agent.id, systemPrompt, promptAuditRuntime ?? {
|
|
616
|
+
kind: 'skip',
|
|
617
|
+
reason: 'Prompt audit runtime was not initialized.',
|
|
618
|
+
});
|
|
437
619
|
printPromptAudit(report);
|
|
438
620
|
auditWarningCount += report.warnings.length;
|
|
439
621
|
}
|
|
@@ -32,7 +32,7 @@ The same information can be categorized by “who needs to see it / who maintain
|
|
|
32
32
|
|
|
33
33
|
- **Individual-scope (per-agent / per-dialog)**:
|
|
34
34
|
- `persona` / `knowledge` / `lessons` (role definitions assigned per member)
|
|
35
|
-
- individual memory (`
|
|
35
|
+
- individual memory (`personal_memory`)
|
|
36
36
|
- dialog history (including tool calls and outputs)
|
|
37
37
|
- reminders (working set / worklog)
|
|
38
38
|
- **Collective-scope (shared by team/task)**:
|
|
@@ -102,11 +102,17 @@ Individual memory is your long-lived “how I work” asset, especially a compac
|
|
|
102
102
|
- exact paths of key docs/code you own
|
|
103
103
|
- minimal key facts (entrypoints, key symbols, local contracts)
|
|
104
104
|
|
|
105
|
-
This lets you start work within your scope with “0 ripgrep”. The hard constraint is accuracy: if you change related files or detect staleness/conflicts, immediately `
|
|
105
|
+
This lets you start work within your scope with “0 ripgrep”. The hard constraint is accuracy: if you change related files or detect staleness/conflicts, immediately `replace_personal_memory` to keep it true.
|
|
106
106
|
|
|
107
107
|
Tools:
|
|
108
108
|
|
|
109
|
-
- `
|
|
109
|
+
- `add_personal_memory` / `replace_personal_memory` / `drop_personal_memory` / `clear_personal_memory`
|
|
110
|
+
|
|
111
|
+
Key notes:
|
|
112
|
+
|
|
113
|
+
- Do not read/write/list `.minds/memory/**` via general file tools (it will be hard-denied). Manage personal memory via the tools above.
|
|
114
|
+
- Personal memory is automatically isolated on disk under `.minds/memory/individual/<member-id>/...`, so your `path` must NOT include your member id (do not write `<member-id>/...`).
|
|
115
|
+
- If you have zero personal memory entries, just call `add_personal_memory` — the directory will be created automatically.
|
|
110
116
|
|
|
111
117
|
### B) Task-term memory: Taskdoc is the single source of truth
|
|
112
118
|
|
|
@@ -202,7 +208,7 @@ The goal for agents’ day-to-day work is not “write more docs”. It’s a lo
|
|
|
202
208
|
- **Taskdoc `constraints`**: hard rules/safety/compliance/style (must be visible to all mainlines)
|
|
203
209
|
- **Team memory `team_memory`**: stable team conventions and invariants (worth reusing)
|
|
204
210
|
- **Env notes `.minds/env*.md`**: rtws baseline facts, runtime constraints, gotchas (align humans + all agents to the same environment)
|
|
205
|
-
- **Individual memory `
|
|
211
|
+
- **Individual memory `personal_memory`**: personal preferences + responsibility-area rtws index (keep accurate)
|
|
206
212
|
- **Reminders**: short-term, high-frequency details (working set / worklog; delete freely)
|
|
207
213
|
- **Dialog history / tool output**: disposable by default; only keep distilled excerpts, not raw dumps
|
|
208
214
|
|
|
@@ -32,7 +32,7 @@ TL;DR:
|
|
|
32
32
|
|
|
33
33
|
- **个体记忆(个人/对话局部)**:
|
|
34
34
|
- `persona` / `knowledge` / `lessons`(按成员分配的角色定义)
|
|
35
|
-
- 个人记忆(`
|
|
35
|
+
- 个人记忆(`personal_memory`)
|
|
36
36
|
- 对话历史(含工具调用与反馈)
|
|
37
37
|
- 提醒项(工作集/工作日志)
|
|
38
38
|
- **集体记忆(团队/任务共享)**:
|
|
@@ -101,11 +101,17 @@ TL;DR:
|
|
|
101
101
|
- 你负责的关键文档/代码的**精确路径**
|
|
102
102
|
- 对应的最小关键事实(入口点、关键符号、局部契约)
|
|
103
103
|
|
|
104
|
-
这样你在职责范围内可以尽量做到“0 次 ripgrep 就能开工”。同时有一个硬约束:**必须保持准确**——一旦你改了相关文件或发现记忆过期/冲突,立刻用 `
|
|
104
|
+
这样你在职责范围内可以尽量做到“0 次 ripgrep 就能开工”。同时有一个硬约束:**必须保持准确**——一旦你改了相关文件或发现记忆过期/冲突,立刻用 `replace_personal_memory` 更新。
|
|
105
105
|
|
|
106
106
|
工具:
|
|
107
107
|
|
|
108
|
-
- `
|
|
108
|
+
- `add_personal_memory` / `replace_personal_memory` / `drop_personal_memory` / `clear_personal_memory`
|
|
109
|
+
|
|
110
|
+
关键提示:
|
|
111
|
+
|
|
112
|
+
- 不要用通用文件工具去读/写/列目录 `.minds/memory/**`(会被硬拒绝);个人记忆应通过上述个人记忆工具管理。
|
|
113
|
+
- 个人记忆会自动隔离到 `.minds/memory/individual/<member-id>/...`,因此 `path` 不应包含你的成员 id(不要写 `<member-id>/...`)。
|
|
114
|
+
- 若你当前没有任何个人记忆条目,直接 `add_personal_memory` 即可:目录会由系统自动创建。
|
|
109
115
|
|
|
110
116
|
### B) 中期(任务)记忆:差遣牒(Taskdoc)是单一真源
|
|
111
117
|
|
|
@@ -201,7 +207,7 @@ TL;DR:
|
|
|
201
207
|
- **差遣牒 `constraints`**:硬规则/安全/合规/风格(必须被所有主线及时看到)
|
|
202
208
|
- **团队记忆 `team_memory`**:稳定的团队约定与不变量(值得长期复用)
|
|
203
209
|
- **环境提示 `.minds/env*.md`**:rtws 的基本事实、运行约束、注意事项(让人类与所有智能体对齐同一环境)
|
|
204
|
-
- **个人记忆 `
|
|
210
|
+
- **个人记忆 `personal_memory`**:个人偏好 + 职责域 rtws 索引(保持准确)
|
|
205
211
|
- **提醒项**:短期高频细节(工作集/工作日志,随时可删)
|
|
206
212
|
- **对话历史/工具输出**:默认可丢弃;需要留的只留“精炼摘录”,不要长期背着原始转储
|
|
207
213
|
|
|
@@ -129,7 +129,7 @@ Notes:
|
|
|
129
129
|
- Prefer an explicit allowlist over “anything in the rtws”.
|
|
130
130
|
- For `team_mgmt`, that explicit allowlist is `.minds/**` (including `.minds/memory/**`) so the
|
|
131
131
|
team manager can repair accidental corruptions made by other tools (even though `.minds/memory/**`
|
|
132
|
-
already has dedicated `
|
|
132
|
+
already has dedicated `personal_memory` / `team_memory` tools for normal use).
|
|
133
133
|
- Require explicit `.minds/...` paths and validate them; do not support “implicitly scoped” paths
|
|
134
134
|
like `team.yaml`.
|
|
135
135
|
|
|
@@ -429,7 +429,7 @@ member_defaults:
|
|
|
429
429
|
model: gpt-5.2
|
|
430
430
|
toolsets:
|
|
431
431
|
- ws_read
|
|
432
|
-
-
|
|
432
|
+
- personal_memory
|
|
433
433
|
# Default posture: deny `.minds/` edits for normal members.
|
|
434
434
|
# (Team management should be done via `team_mgmt` tools, not general file tools.)
|
|
435
435
|
no_read_dirs:
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
- 拒绝包含 `..` 的路径
|
|
107
107
|
- 拒绝规范化后解析到 `.minds/` 之外的任何路径
|
|
108
108
|
- 优先使用显式白名单而非" rtws 中的任何内容"
|
|
109
|
-
|
|
109
|
+
- 对于 `team_mgmt`,该显式白名单是 `.minds/**`(包括 `.minds/memory/**`),以便团队管理者可以修复其他工具造成的意外损坏(即使 `.minds/memory/**` 已有专用的 `personal_memory` / `team_memory` 工具供正常使用)
|
|
110
110
|
- 需要显式的 `.minds/...` 路径并验证它们;不支持像 `team.yaml` 这样的"隐式作用域"路径
|
|
111
111
|
|
|
112
112
|
### 为什么需要专用工具集(而不是仅 `read_dirs` / `write_dirs`)?
|
|
@@ -373,7 +373,7 @@ member_defaults:
|
|
|
373
373
|
model: gpt-5.2
|
|
374
374
|
toolsets:
|
|
375
375
|
- ws_read
|
|
376
|
-
-
|
|
376
|
+
- personal_memory
|
|
377
377
|
# 默认姿态:拒绝普通成员的 `.minds/` 编辑
|
|
378
378
|
#(团队管理应通过 `team_mgmt` 工具完成,而非通用文件工具)
|
|
379
379
|
no_read_dirs:
|
package/dist/minds/load.js
CHANGED
|
@@ -196,10 +196,10 @@ async function loadAgentMinds(agentId, dialog, options) {
|
|
|
196
196
|
'clear_team_memory',
|
|
197
197
|
];
|
|
198
198
|
const PERSONAL_MEMORY_TOOL_NAMES = [
|
|
199
|
-
'
|
|
200
|
-
'
|
|
201
|
-
'
|
|
202
|
-
'
|
|
199
|
+
'add_personal_memory',
|
|
200
|
+
'replace_personal_memory',
|
|
201
|
+
'drop_personal_memory',
|
|
202
|
+
'clear_personal_memory',
|
|
203
203
|
];
|
|
204
204
|
function isTeamMemoryToolName(name) {
|
|
205
205
|
return TEAM_MEMORY_TOOL_NAMES.includes(name);
|
|
@@ -346,8 +346,8 @@ async function loadAgentMinds(agentId, dialog, options) {
|
|
|
346
346
|
'drop_team_memory',
|
|
347
347
|
]);
|
|
348
348
|
await readMemFiles(personalFiles, 'personal', personalScopeLabelText, [
|
|
349
|
-
'
|
|
350
|
-
'
|
|
349
|
+
'replace_personal_memory',
|
|
350
|
+
'drop_personal_memory',
|
|
351
351
|
]);
|
|
352
352
|
}
|
|
353
353
|
catch (err) {
|
|
@@ -149,8 +149,9 @@ function getMemoryPromptCopy(ctx) {
|
|
|
149
149
|
personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;记忆会在每次生成时自动注入上下文,应保持少量且准确(关键文档/代码的精确路径 + 最小必要事实)。不要记录具体任务状态。',
|
|
150
150
|
subdialogDutyLine: `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
|
|
151
151
|
mainlineDutyLine: '你当前处于主线对话:你负责综合维护全队共享差遣牒(尤其是 progress 公告牌)。当队友/支线对话提出更新建议时,及时合并、压缩并保持清晰。',
|
|
152
|
+
teammateTellaskRoundDoneLine: '队友诉请重要语义:当你在上游上下文中收到带【最终完成】标记的回贴,表示该轮诉请已经结束;对方不会继续执行同一轮诉请。此时如果目标未达成,“等待”是错误的:必须显式发起新一轮 tellask 才能继续推进。',
|
|
152
153
|
teamMemoryHintLine: '提示:你具备团队记忆工具(`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`),可在必要时维护团队记忆(谨慎、少量、只写稳定约定)。',
|
|
153
|
-
personalMemoryHintLine:
|
|
154
|
+
personalMemoryHintLine: `提示:你具备个人记忆工具(\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`)。个人记忆仅对当前智能体可见,且系统会自动按成员隔离到 \`.minds/memory/individual/<member-id>/...\`;因此 \`path\` 不应包含你的成员 id(不要写 \`${ctx.agentId}/...\`)。首次创建时直接用 \`add_personal_memory\` 即可,目录会由系统自动创建。记忆会在每次生成时自动注入上下文:保持少量、保持准确、按“未来会一起更新的内容”合并;写稳定事实(关键路径 + 最小必要约定),不要写任务进度/当天状态;一旦你修改了相关文件或发现记忆过期/冲突,立刻用 \`replace_personal_memory\` 更新。`,
|
|
154
155
|
subdialogWorkflowLine: `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`,
|
|
155
156
|
mainlineWorkflowLine: '工作流:先做事 → 再提炼(`update_reminder` + `change_mind(progress)`)→ 然后 `clear_mind` 清空噪音。',
|
|
156
157
|
contextHealthLine: '系统会自动监控并提示上下文健康度:进入"吃紧"或"告急"状态时会插入用户可见提示。当收到此类提示时,立刻停止继续大实现/大阅读;先提炼,再 clear。',
|
|
@@ -171,8 +172,9 @@ function getMemoryPromptCopy(ctx) {
|
|
|
171
172
|
personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Memory is automatically injected into context on each generation: keep it small and accurate (exact key doc/code paths + minimal key facts); do not store per-task state.',
|
|
172
173
|
subdialogDutyLine: `You are currently in a subdialog: \`change_mind\` is not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with a fully merged replacement draft (full-section replacement). Do not claim it is updated until you see a receipt.`,
|
|
173
174
|
mainlineDutyLine: 'You are currently in the main dialog: you are responsible for keeping the team-shared Taskdoc coherent and up to date (especially the progress bulletin board). Merge proposals from teammates/subdialogs promptly and keep it concise.',
|
|
175
|
+
teammateTellaskRoundDoneLine: 'Teammate Tellask semantics: when you receive an upstream reply with the 【最终完成】 marker, that Tellask round is finished; the responder will not keep executing the same call in the background. If the objective is not met, “waiting” is wrong: you must explicitly start a new Tellask round to continue.',
|
|
174
176
|
teamMemoryHintLine: 'Hint: you have team-memory tools (`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`) and may maintain team memory when it is truly stable and worth sharing.',
|
|
175
|
-
personalMemoryHintLine:
|
|
177
|
+
personalMemoryHintLine: `Hint: you have personal-memory tools (\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`). Personal memory is private to the current agent and is automatically isolated under \`.minds/memory/individual/<member-id>/...\`; therefore \`path\` MUST NOT include your member id (do not write \`${ctx.agentId}/...\`). For first-time setup, just call \`add_personal_memory\`—the directory will be created automatically. Memory is automatically injected into context on each generation: keep it small, keep it accurate, and group facts that are updated together. Store stable facts (exact key paths + minimal contracts), not daily state/progress. If you changed those files or detect staleness/conflicts, immediately \`replace_personal_memory\` to keep it accurate.`,
|
|
176
178
|
subdialogWorkflowLine: `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft a merged replacement and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`,
|
|
177
179
|
mainlineWorkflowLine: 'Workflow: do work → distill (`update_reminder` + `change_mind(progress)`) → then `clear_mind` to drop noise.',
|
|
178
180
|
contextHealthLine: 'System will automatically monitor and alert on context health: yellow (caution/"Caution") or red (critical/"Critical") will insert a user-visible prompt. When you receive such alerts, immediately stop large implementations/reads; distill first, then clear.',
|
|
@@ -194,6 +196,7 @@ function buildMemorySystemPrompt(ctx) {
|
|
|
194
196
|
copy.personalMemoryLine,
|
|
195
197
|
'',
|
|
196
198
|
ctx.isSubdialog ? copy.subdialogDutyLine : copy.mainlineDutyLine,
|
|
199
|
+
copy.teammateTellaskRoundDoneLine,
|
|
197
200
|
...(ctx.agentHasTeamMemoryTools ? [copy.teamMemoryHintLine] : []),
|
|
198
201
|
...(ctx.agentHasPersonalMemoryTools ? [copy.personalMemoryHintLine] : []),
|
|
199
202
|
ctx.isSubdialog ? copy.subdialogWorkflowLine : copy.mainlineWorkflowLine,
|