dominds 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +157 -0
- package/README.md +250 -0
- package/README.zh.md +161 -0
- package/dist/access-control.js +253 -0
- package/dist/cli/create.js +263 -0
- package/dist/cli/read.js +84 -0
- package/dist/cli/tui.js +199 -0
- package/dist/cli/webui.js +169 -0
- package/dist/cli.js +227 -0
- package/dist/dialog-factory.js +53 -0
- package/dist/dialog-global-registry.js +68 -0
- package/dist/dialog-instance-registry.js +78 -0
- package/dist/dialog-run-state.js +198 -0
- package/dist/dialog.js +1024 -0
- package/dist/evt-registry.js +103 -0
- package/dist/index.js +8 -0
- package/dist/llm/client.js +69 -0
- package/dist/llm/defaults.yaml +386 -0
- package/dist/llm/driver.js +3214 -0
- package/dist/llm/gen/anthropic.js +611 -0
- package/dist/llm/gen/codex.js +375 -0
- package/dist/llm/gen/mock.js +326 -0
- package/dist/llm/gen/openai.js +470 -0
- package/dist/llm/gen/registry.js +26 -0
- package/dist/llm/gen.js +2 -0
- package/dist/llm/tools-projection.js +37 -0
- package/dist/log.js +228 -0
- package/dist/mcp/config.js +230 -0
- package/dist/mcp/sdk-client.js +129 -0
- package/dist/mcp/server-runtime.js +57 -0
- package/dist/mcp/stdio-client.js +280 -0
- package/dist/mcp/supervisor.js +979 -0
- package/dist/mcp/tool-names.js +109 -0
- package/dist/minds/builtin/cmdr/persona.md +3 -0
- package/dist/minds/builtin/dijiang/knowledge.md +287 -0
- package/dist/minds/builtin/dijiang/persona.md +7 -0
- package/dist/minds/builtin/fuxi/persona.en.md +59 -0
- package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
- package/dist/minds/builtin/pangu/persona.en.md +78 -0
- package/dist/minds/builtin/pangu/persona.zh.md +71 -0
- package/dist/minds/load.js +617 -0
- package/dist/minds/minds-i18n.js +131 -0
- package/dist/minds/system-prompt.js +281 -0
- package/dist/persistence.js +3128 -0
- package/dist/problems.js +109 -0
- package/dist/server/api-routes.js +1031 -0
- package/dist/server/auth.js +180 -0
- package/dist/server/mime-types.js +32 -0
- package/dist/server/prompts-routes.js +543 -0
- package/dist/server/server-core.js +235 -0
- package/dist/server/setup-routes.js +697 -0
- package/dist/server/static-server.js +132 -0
- package/dist/server/websocket-handler.js +1011 -0
- package/dist/server.js +164 -0
- package/dist/shared/async-fifo-mutex.js +36 -0
- package/dist/shared/diligence.js +20 -0
- package/dist/shared/dotenv.js +144 -0
- package/dist/shared/evt.js +195 -0
- package/dist/shared/i18n/driver-messages.js +267 -0
- package/dist/shared/i18n/text.js +9 -0
- package/dist/shared/i18n/tool-result-messages.js +51 -0
- package/dist/shared/rtws-cli.js +73 -0
- package/dist/shared/runtime-language.js +47 -0
- package/dist/shared/team-mgmt-manual.js +116 -0
- package/dist/shared/types/context-health.js +2 -0
- package/dist/shared/types/dialog.js +11 -0
- package/dist/shared/types/i18n.js +2 -0
- package/dist/shared/types/index.js +26 -0
- package/dist/shared/types/language.js +40 -0
- package/dist/shared/types/problems.js +2 -0
- package/dist/shared/types/prompts.js +2 -0
- package/dist/shared/types/q4h.js +7 -0
- package/dist/shared/types/run-state.js +8 -0
- package/dist/shared/types/setup.js +2 -0
- package/dist/shared/types/storage.js +10 -0
- package/dist/shared/types/tellask.js +8 -0
- package/dist/shared/types/tools-registry.js +2 -0
- package/dist/shared/types/wire.js +12 -0
- package/dist/shared/utils/fmt.js +9 -0
- package/dist/shared/utils/html.js +20 -0
- package/dist/shared/utils/id.js +18 -0
- package/dist/shared/utils/inter-dialog-format.js +101 -0
- package/dist/shared/utils/time.js +13 -0
- package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
- package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
- package/dist/static/assets/arc-CbA_x9GD.js +132 -0
- package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
- package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
- package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
- package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
- package/dist/static/assets/channel-BVr1Yke-.js +8 -0
- package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
- package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
- package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
- package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
- package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
- package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
- package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
- package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
- package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
- package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
- package/dist/static/assets/clone-D2OgLSSn.js +9 -0
- package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
- package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
- package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
- package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
- package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
- package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
- package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
- package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
- package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
- package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
- package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
- package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
- package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
- package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
- package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
- package/dist/static/assets/index-BS6HnGzC.js +112303 -0
- package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
- package/dist/static/assets/index-DaIsSzC_.css +483 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
- package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
- package/dist/static/assets/init-ZxktEp_H.js +17 -0
- package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
- package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
- package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
- package/dist/static/assets/layout-8TGxpm23.js +2218 -0
- package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
- package/dist/static/assets/linear-BATBPQQv.js +341 -0
- package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
- package/dist/static/assets/min-B3oVH3AC.js +42 -0
- package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
- package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
- package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
- package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
- package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
- package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
- package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
- package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
- package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
- package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
- package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
- package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
- package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
- package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
- package/dist/static/index.html +71 -0
- package/dist/static/testing/dom-observation-utils.js +425 -0
- package/dist/static/testing/e2e-test-helper.js +3119 -0
- package/dist/team.js +1160 -0
- package/dist/tellask.js +431 -0
- package/dist/tool.js +150 -0
- package/dist/tools/apply-patch.js +542 -0
- package/dist/tools/builtins.js +196 -0
- package/dist/tools/context-health.js +177 -0
- package/dist/tools/ctrl.js +478 -0
- package/dist/tools/diag.js +583 -0
- package/dist/tools/env.js +184 -0
- package/dist/tools/fs.js +818 -0
- package/dist/tools/mcp.js +138 -0
- package/dist/tools/mem.js +349 -0
- package/dist/tools/os.js +751 -0
- package/dist/tools/prompts/team_mgmt.en.md +70 -0
- package/dist/tools/prompts/team_mgmt.zh.md +70 -0
- package/dist/tools/prompts/ws_mod.en.md +86 -0
- package/dist/tools/prompts/ws_mod.zh.md +87 -0
- package/dist/tools/registry-snapshot.js +31 -0
- package/dist/tools/registry.js +121 -0
- package/dist/tools/ripgrep.js +678 -0
- package/dist/tools/team-mgmt.js +3300 -0
- package/dist/tools/txt.js +3178 -0
- package/dist/utils/id.js +72 -0
- package/dist/utils/task-doc.js +236 -0
- package/dist/utils/task-package.js +522 -0
- package/dist/utils/taskdoc-search.js +280 -0
- package/dist/utils/taskdoc.js +400 -0
- package/package.json +69 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.matchesPattern = matchesPattern;
|
|
7
|
+
exports.hasReadAccess = hasReadAccess;
|
|
8
|
+
exports.hasWriteAccess = hasWriteAccess;
|
|
9
|
+
exports.getAccessDeniedMessage = getAccessDeniedMessage;
|
|
10
|
+
/**
|
|
11
|
+
* Module: access-control
|
|
12
|
+
*
|
|
13
|
+
* Directory-based access control helpers:
|
|
14
|
+
* - `matchesPattern` for glob-like directory scope matching (supports `*` and `**`)
|
|
15
|
+
* - `hasReadAccess`/`hasWriteAccess` to evaluate member permissions
|
|
16
|
+
* - `getAccessDeniedMessage` to format denial responses
|
|
17
|
+
*/
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const log_1 = require("./log");
|
|
20
|
+
function isEncapsulatedTaskPath(targetPath) {
|
|
21
|
+
const normalized = targetPath.replace(/\\/g, '/');
|
|
22
|
+
// Matches: "foo.tsk", "foo.tsk/", "a/b/foo.tsk/x", etc.
|
|
23
|
+
return /(^|\/)[^/]+\.tsk(\/|$)/.test(normalized);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Directory-specific pattern matching for access control.
|
|
27
|
+
* This function determines if a target path (file or directory) should be controlled
|
|
28
|
+
* by a directory pattern. The pattern represents a directory scope.
|
|
29
|
+
*
|
|
30
|
+
* Supports:
|
|
31
|
+
* - "*" matches any single directory/file name within a path segment
|
|
32
|
+
* - "**" matches any number of directory levels (including zero)
|
|
33
|
+
* - Exact directory matches
|
|
34
|
+
*
|
|
35
|
+
* Directory semantics:
|
|
36
|
+
* - Pattern "src" matches "src/file.txt", "src/subdir/file.js", etc.
|
|
37
|
+
* - Pattern "src" does NOT match "src-backup/file.txt" (prevents false positives)
|
|
38
|
+
* - Pattern "src/tools" matches "src/tools/fs.ts" but not "src/other/file.ts"
|
|
39
|
+
*/
|
|
40
|
+
function matchesPattern(targetPath, dirPattern) {
|
|
41
|
+
// Normalize paths - remove leading/trailing slashes, convert to forward slashes, handle empty paths
|
|
42
|
+
const normalizedTarget = targetPath.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '') || '.';
|
|
43
|
+
let normalizedDirPattern = dirPattern.replace(/\\/g, '/').replace(/^\/+|\/+$/g, '') || '.';
|
|
44
|
+
// Patterns ending in `/**` represent a directory scope and should match the directory itself too.
|
|
45
|
+
// Example: `.minds/**` must match both `.minds` and `.minds/team.yaml`.
|
|
46
|
+
while (normalizedDirPattern.endsWith('/**')) {
|
|
47
|
+
normalizedDirPattern = normalizedDirPattern.slice(0, -3) || '.';
|
|
48
|
+
}
|
|
49
|
+
// Handle root directory pattern
|
|
50
|
+
if (normalizedDirPattern === '.' || normalizedDirPattern === '') {
|
|
51
|
+
return true; // Root pattern matches everything
|
|
52
|
+
}
|
|
53
|
+
// Handle exact match (target is exactly the directory or a file with same name as directory)
|
|
54
|
+
if (normalizedDirPattern === normalizedTarget) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Handle wildcard patterns
|
|
58
|
+
if (normalizedDirPattern.includes('*')) {
|
|
59
|
+
// For patterns like **/*secret*, check if any path segment contains "secret"
|
|
60
|
+
const patternParts = normalizedDirPattern.split('/');
|
|
61
|
+
const targetParts = normalizedTarget.split('/');
|
|
62
|
+
// Special handling for **/* patterns - check if any target segment matches the final pattern
|
|
63
|
+
if (normalizedDirPattern.includes('**/*') && patternParts.length >= 2) {
|
|
64
|
+
const lastPatternPart = patternParts[patternParts.length - 1];
|
|
65
|
+
if (lastPatternPart.includes('*')) {
|
|
66
|
+
// Convert the last part to regex (e.g., *secret* -> .*secret.*)
|
|
67
|
+
let segmentRegex = lastPatternPart
|
|
68
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
69
|
+
.replace(/\*/g, '.*');
|
|
70
|
+
segmentRegex = '^' + segmentRegex + '$';
|
|
71
|
+
try {
|
|
72
|
+
const regex = new RegExp(segmentRegex);
|
|
73
|
+
// Check if any target segment matches
|
|
74
|
+
for (const segment of targetParts) {
|
|
75
|
+
if (regex.test(segment)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
log_1.log.warn(`Invalid regex pattern in segment matching: ${segmentRegex}`, err);
|
|
82
|
+
// Invalid regex, fall through to other matching
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Full path regex matching for complex patterns
|
|
87
|
+
let regexPattern = normalizedDirPattern
|
|
88
|
+
// Escape special regex characters except * and **
|
|
89
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
90
|
+
// Handle ** first (matches any number of path segments including none)
|
|
91
|
+
.replace(/\*\*/g, '___DOUBLESTAR___')
|
|
92
|
+
// Handle single * (matches any characters within a single path segment, but not path separators)
|
|
93
|
+
.replace(/\*/g, '[^/]*')
|
|
94
|
+
// Replace ** placeholder with pattern that matches any path segments
|
|
95
|
+
.replace(/___DOUBLESTAR___/g, '.*');
|
|
96
|
+
// For directory semantics, the pattern should match:
|
|
97
|
+
// 1. Exact path match
|
|
98
|
+
// 2. Path that starts with pattern followed by a path separator
|
|
99
|
+
regexPattern = '^' + regexPattern + '(?:/.*)?$';
|
|
100
|
+
try {
|
|
101
|
+
const regex = new RegExp(regexPattern);
|
|
102
|
+
return regex.test(normalizedTarget);
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
log_1.log.warn(`Invalid regex pattern in path matching: ${regexPattern}`, err);
|
|
106
|
+
// If regex is invalid, fall back to exact match
|
|
107
|
+
return normalizedDirPattern === normalizedTarget;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// For non-wildcard directory patterns, use proper directory semantics
|
|
111
|
+
// Pattern should match if target is:
|
|
112
|
+
// 1. Exactly the directory path
|
|
113
|
+
// 2. A path that starts with the directory path followed by a path separator
|
|
114
|
+
// Ensure we don't match partial directory names (e.g., "src" shouldn't match "src-backup")
|
|
115
|
+
// by requiring either exact match or match followed by path separator
|
|
116
|
+
const targetParts = normalizedTarget.split('/');
|
|
117
|
+
const patternParts = normalizedDirPattern.split('/');
|
|
118
|
+
// Pattern must be a prefix of target path segments
|
|
119
|
+
if (patternParts.length > targetParts.length) {
|
|
120
|
+
return false; // Pattern is deeper than target
|
|
121
|
+
}
|
|
122
|
+
// Check each pattern segment against corresponding target segment
|
|
123
|
+
for (let i = 0; i < patternParts.length; i++) {
|
|
124
|
+
if (patternParts[i] !== targetParts[i]) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return true; // All pattern segments matched
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a member has read access to a specific path.
|
|
132
|
+
*
|
|
133
|
+
* Access control logic:
|
|
134
|
+
* 1. Check blacklist first (no_read_dirs) - if path matches any blacklist pattern, deny access
|
|
135
|
+
* 2. Check whitelist (read_dirs) - if path matches any whitelist pattern, allow access
|
|
136
|
+
* 3. If no whitelist patterns are defined, allow access (default allow)
|
|
137
|
+
* 4. If whitelist patterns exist but none match, deny access
|
|
138
|
+
*/
|
|
139
|
+
function hasReadAccess(member, targetPath) {
|
|
140
|
+
// Get resolved relative path from workspace root
|
|
141
|
+
const cwd = path_1.default.resolve(process.cwd());
|
|
142
|
+
const resolvedPath = path_1.default.resolve(cwd, targetPath);
|
|
143
|
+
// Ensure path is within workspace
|
|
144
|
+
if (!resolvedPath.startsWith(cwd)) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
// Get relative path from workspace root
|
|
148
|
+
const relativePath = path_1.default.relative(cwd, resolvedPath);
|
|
149
|
+
// Task Docs (`*.tsk/`) are encapsulated and forbidden to all general file tools.
|
|
150
|
+
if (isEncapsulatedTaskPath(relativePath)) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
// Check blacklist first (no_read_dirs)
|
|
154
|
+
const blacklist = member.no_read_dirs || [];
|
|
155
|
+
for (const pattern of blacklist) {
|
|
156
|
+
if (matchesPattern(relativePath, pattern)) {
|
|
157
|
+
return false; // Explicitly denied
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Check whitelist (read_dirs)
|
|
161
|
+
const whitelist = member.read_dirs || [];
|
|
162
|
+
// If no whitelist is defined, allow access (after blacklist check)
|
|
163
|
+
if (whitelist.length === 0) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
// Check if path matches any whitelist pattern
|
|
167
|
+
for (const pattern of whitelist) {
|
|
168
|
+
if (matchesPattern(relativePath, pattern)) {
|
|
169
|
+
return true; // Explicitly allowed
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Path doesn't match any whitelist pattern
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if a member has write access to a specific path.
|
|
177
|
+
*
|
|
178
|
+
* Access control logic:
|
|
179
|
+
* 1. Check blacklist first (no_write_dirs) - if path matches any blacklist pattern, deny access
|
|
180
|
+
* 2. Check whitelist (write_dirs) - if path matches any whitelist pattern, allow access
|
|
181
|
+
* 3. If no whitelist patterns are defined, allow access (default allow)
|
|
182
|
+
* 4. If whitelist patterns exist but none match, deny access
|
|
183
|
+
*/
|
|
184
|
+
function hasWriteAccess(member, targetPath) {
|
|
185
|
+
// Get resolved relative path from workspace root
|
|
186
|
+
const cwd = path_1.default.resolve(process.cwd());
|
|
187
|
+
const resolvedPath = path_1.default.resolve(cwd, targetPath);
|
|
188
|
+
// Ensure path is within workspace
|
|
189
|
+
if (!resolvedPath.startsWith(cwd)) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
// Get relative path from workspace root
|
|
193
|
+
const relativePath = path_1.default.relative(cwd, resolvedPath);
|
|
194
|
+
// Task Docs (`*.tsk/`) are encapsulated and forbidden to all general file tools.
|
|
195
|
+
if (isEncapsulatedTaskPath(relativePath)) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
// Check blacklist first (no_write_dirs)
|
|
199
|
+
const blacklist = member.no_write_dirs || [];
|
|
200
|
+
for (const pattern of blacklist) {
|
|
201
|
+
if (matchesPattern(relativePath, pattern)) {
|
|
202
|
+
return false; // Explicitly denied
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Check whitelist (write_dirs)
|
|
206
|
+
const whitelist = member.write_dirs || [];
|
|
207
|
+
// If no whitelist is defined, allow access (after blacklist check)
|
|
208
|
+
if (whitelist.length === 0) {
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
// Check if path matches any whitelist pattern
|
|
212
|
+
for (const pattern of whitelist) {
|
|
213
|
+
if (matchesPattern(relativePath, pattern)) {
|
|
214
|
+
return true; // Explicitly allowed
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Path doesn't match any whitelist pattern
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get an access denied error message for a specific operation and path.
|
|
222
|
+
*/
|
|
223
|
+
function getAccessDeniedMessage(operation, targetPath, language = 'en') {
|
|
224
|
+
const lines = language === 'zh'
|
|
225
|
+
? [
|
|
226
|
+
'❌ **访问被拒绝**',
|
|
227
|
+
'',
|
|
228
|
+
`- 操作:\`${operation}\``,
|
|
229
|
+
`- 路径:\`${targetPath}\``,
|
|
230
|
+
`- 代码:\`ACCESS_DENIED\``,
|
|
231
|
+
]
|
|
232
|
+
: [
|
|
233
|
+
'❌ **Access Denied**',
|
|
234
|
+
'',
|
|
235
|
+
`- Operation: \`${operation}\``,
|
|
236
|
+
`- Path: \`${targetPath}\``,
|
|
237
|
+
`- Code: \`ACCESS_DENIED\``,
|
|
238
|
+
];
|
|
239
|
+
if (isEncapsulatedTaskPath(targetPath)) {
|
|
240
|
+
lines.push('');
|
|
241
|
+
if (language === 'zh') {
|
|
242
|
+
lines.push(`- 说明:\`*.tsk/\` 是封装差遣牒。通用文件工具不得读/写/列目录/删除其中内容。`);
|
|
243
|
+
lines.push(`- 提示:写入/更新请使用函数工具 \`change_mind\`(顶层:\`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`;额外章节:\`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`)。`);
|
|
244
|
+
lines.push(`- 提示:读取额外章节请使用函数工具 \`recall_taskdoc\`:\`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
lines.push(`- Note: \`*.tsk/\` is an encapsulated Taskdoc. General file tools must not read/write/list/delete it.`);
|
|
248
|
+
lines.push(`- Hint: For updates, use the function tool \`change_mind\` (top-level: \`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`; extra sections: \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`).`);
|
|
249
|
+
lines.push(`- Hint: To read extra sections, use \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return lines.join('\n');
|
|
253
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Create/new subcommand for dominds CLI
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* dominds create <template> [directory] [--repo-url <url>]
|
|
8
|
+
* dominds new <template> [directory] [--repo-url <url>] # alias for create
|
|
9
|
+
*
|
|
10
|
+
* Notes:
|
|
11
|
+
* - Template can be a short name (resolved via DOMINDS_TEMPLATE_BASE) or a git URL.
|
|
12
|
+
* - Workspace directory is `process.cwd()`. Use 'dominds -C <dir> create ...' to create under another base dir.
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.main = main;
|
|
49
|
+
const child_process_1 = require("child_process");
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
function getPackageVersion() {
|
|
53
|
+
try {
|
|
54
|
+
const packagePath = path.join(__dirname, '../package.json');
|
|
55
|
+
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
56
|
+
return typeof packageJson.version === 'string' && packageJson.version.trim()
|
|
57
|
+
? packageJson.version
|
|
58
|
+
: 'unknown';
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return 'unknown';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function looksLikeGitUrl(s) {
|
|
65
|
+
if (s.includes('://'))
|
|
66
|
+
return true;
|
|
67
|
+
if (s.startsWith('git@'))
|
|
68
|
+
return true;
|
|
69
|
+
// scp-like syntax: user@host:org/repo(.git)
|
|
70
|
+
if (/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+:/.test(s))
|
|
71
|
+
return true;
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
function parseTemplateSpec(template, cwd) {
|
|
75
|
+
const trimmed = template.trim();
|
|
76
|
+
if (!trimmed) {
|
|
77
|
+
return { kind: 'short-name', name: '' };
|
|
78
|
+
}
|
|
79
|
+
if (looksLikeGitUrl(trimmed)) {
|
|
80
|
+
return { kind: 'git-url', url: trimmed };
|
|
81
|
+
}
|
|
82
|
+
// Treat existing paths as local templates.
|
|
83
|
+
const absCandidate = path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed);
|
|
84
|
+
if (fs.existsSync(absCandidate)) {
|
|
85
|
+
return { kind: 'local-path', absPath: absCandidate };
|
|
86
|
+
}
|
|
87
|
+
return { kind: 'short-name', name: trimmed };
|
|
88
|
+
}
|
|
89
|
+
function resolveTemplateRepoUrl(spec, env) {
|
|
90
|
+
switch (spec.kind) {
|
|
91
|
+
case 'git-url':
|
|
92
|
+
return spec.url;
|
|
93
|
+
case 'local-path':
|
|
94
|
+
return spec.absPath;
|
|
95
|
+
case 'short-name': {
|
|
96
|
+
const rawBase = env.DOMINDS_TEMPLATE_BASE;
|
|
97
|
+
const base = typeof rawBase === 'string' && rawBase.trim() ? rawBase.trim().replace(/\/+$/g, '') : '';
|
|
98
|
+
const baseOrDefault = base || 'https://github.com/longrun-ai';
|
|
99
|
+
const name = spec.name.endsWith('.git') ? spec.name.slice(0, -'.git'.length) : spec.name;
|
|
100
|
+
return `${baseOrDefault}/${name}.git`;
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
const _exhaustive = spec;
|
|
104
|
+
return _exhaustive;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function deriveTargetDirName(template) {
|
|
109
|
+
const trimmed = template.trim().replace(/\/+$/g, '');
|
|
110
|
+
if (!trimmed)
|
|
111
|
+
return 'dominds-workspace';
|
|
112
|
+
// URL-like cases
|
|
113
|
+
const lastSlash = trimmed.lastIndexOf('/');
|
|
114
|
+
const lastColon = trimmed.lastIndexOf(':');
|
|
115
|
+
const lastSep = Math.max(lastSlash, lastColon);
|
|
116
|
+
const tail = lastSep >= 0 ? trimmed.slice(lastSep + 1) : trimmed;
|
|
117
|
+
const withoutGit = tail.endsWith('.git') ? tail.slice(0, -'.git'.length) : tail;
|
|
118
|
+
return withoutGit || 'dominds-workspace';
|
|
119
|
+
}
|
|
120
|
+
function parseArgs(argv) {
|
|
121
|
+
let template;
|
|
122
|
+
let directory;
|
|
123
|
+
let repoUrl;
|
|
124
|
+
for (let i = 0; i < argv.length; i++) {
|
|
125
|
+
const a = argv[i];
|
|
126
|
+
if (a === '--help' || a === '-h') {
|
|
127
|
+
return { kind: 'help' };
|
|
128
|
+
}
|
|
129
|
+
if (a === '--version' || a === '-v') {
|
|
130
|
+
return { kind: 'version' };
|
|
131
|
+
}
|
|
132
|
+
if (a === '--repo-url') {
|
|
133
|
+
const next = argv[i + 1];
|
|
134
|
+
if (next == null || next.trim() === '') {
|
|
135
|
+
throw new Error('--repo-url requires a value');
|
|
136
|
+
}
|
|
137
|
+
repoUrl = next;
|
|
138
|
+
i++;
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (a.startsWith('-')) {
|
|
142
|
+
throw new Error(`Unknown option: ${a}`);
|
|
143
|
+
}
|
|
144
|
+
if (!template) {
|
|
145
|
+
template = a;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (!directory) {
|
|
149
|
+
directory = a;
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
throw new Error(`Unexpected argument: ${a}`);
|
|
153
|
+
}
|
|
154
|
+
if (!template || template.trim() === '') {
|
|
155
|
+
return { kind: 'help' };
|
|
156
|
+
}
|
|
157
|
+
return { kind: 'run', template, directory, repoUrl };
|
|
158
|
+
}
|
|
159
|
+
function printHelp() {
|
|
160
|
+
console.log(`dominds v${getPackageVersion()}`);
|
|
161
|
+
console.log('');
|
|
162
|
+
console.log('Usage:');
|
|
163
|
+
console.log(' dominds create <template> [directory] [--repo-url <url>]');
|
|
164
|
+
console.log(' dominds new <template> [directory] [--repo-url <url>] # alias for create');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log('Create a new dominds-powered workspace by cloning a template repository.');
|
|
167
|
+
console.log('');
|
|
168
|
+
console.log('Template resolution:');
|
|
169
|
+
console.log(' - If <template> looks like a git URL, it is used as-is.');
|
|
170
|
+
console.log(' - Otherwise it resolves to: ${DOMINDS_TEMPLATE_BASE}/<template>.git');
|
|
171
|
+
console.log(' - Default DOMINDS_TEMPLATE_BASE = https://github.com/longrun-ai');
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log('Options:');
|
|
174
|
+
console.log(' --repo-url <url> After cloning, set git origin to this URL (and keep template as remote).');
|
|
175
|
+
console.log(' -h, --help Show this help message');
|
|
176
|
+
console.log(' -v, --version Show version information');
|
|
177
|
+
console.log('');
|
|
178
|
+
console.log('Examples:');
|
|
179
|
+
console.log(' dominds create web-scaffold my-project');
|
|
180
|
+
console.log(' DOMINDS_TEMPLATE_BASE=https://github.com/myorg dominds create web-scaffold my-project');
|
|
181
|
+
console.log(' dominds create https://github.com/myorg/custom-template.git my-project');
|
|
182
|
+
console.log(' dominds create web-scaffold my-project --repo-url git@github.com:myorg/my-project.git');
|
|
183
|
+
}
|
|
184
|
+
async function run(cmd, args, cwd) {
|
|
185
|
+
const child = (0, child_process_1.spawn)(cmd, [...args], { cwd, stdio: 'inherit' });
|
|
186
|
+
return await new Promise((resolve, reject) => {
|
|
187
|
+
child.on('error', (err) => reject(err));
|
|
188
|
+
child.on('close', (code, signal) => {
|
|
189
|
+
if (code === 0) {
|
|
190
|
+
resolve({ kind: 'ok' });
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
resolve({ kind: 'error', cmd: `${cmd} ${args.join(' ')}`, code, signal });
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async function runGit(args, cwd) {
|
|
198
|
+
const res = await run('git', args, cwd);
|
|
199
|
+
if (res.kind === 'ok')
|
|
200
|
+
return;
|
|
201
|
+
const detail = res.signal ? `signal ${res.signal}` : `exit code ${String(res.code)}`;
|
|
202
|
+
throw new Error(`git failed (${detail}): ${res.cmd}`);
|
|
203
|
+
}
|
|
204
|
+
async function main() {
|
|
205
|
+
try {
|
|
206
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
207
|
+
switch (parsed.kind) {
|
|
208
|
+
case 'help':
|
|
209
|
+
printHelp();
|
|
210
|
+
return;
|
|
211
|
+
case 'version':
|
|
212
|
+
console.log(`dominds v${getPackageVersion()}`);
|
|
213
|
+
return;
|
|
214
|
+
case 'run': {
|
|
215
|
+
const cwd = process.cwd();
|
|
216
|
+
const spec = parseTemplateSpec(parsed.template, cwd);
|
|
217
|
+
const templateRepoUrl = resolveTemplateRepoUrl(spec, process.env);
|
|
218
|
+
const targetName = parsed.directory
|
|
219
|
+
? parsed.directory
|
|
220
|
+
: deriveTargetDirName(parsed.template);
|
|
221
|
+
const targetAbs = path.resolve(cwd, targetName);
|
|
222
|
+
if (fs.existsSync(targetAbs)) {
|
|
223
|
+
throw new Error(`Target directory already exists: ${targetAbs}`);
|
|
224
|
+
}
|
|
225
|
+
fs.mkdirSync(path.dirname(targetAbs), { recursive: true });
|
|
226
|
+
console.log(`Creating workspace: ${targetAbs}`);
|
|
227
|
+
console.log(`Template: ${templateRepoUrl}`);
|
|
228
|
+
await runGit(['clone', '--depth', '1', templateRepoUrl, targetAbs], cwd);
|
|
229
|
+
if (parsed.repoUrl) {
|
|
230
|
+
// Keep the template remote for future pulls/inspection.
|
|
231
|
+
try {
|
|
232
|
+
await runGit(['-C', targetAbs, 'remote', 'add', 'template', templateRepoUrl], cwd);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
await runGit(['-C', targetAbs, 'remote', 'set-url', 'template', templateRepoUrl], cwd);
|
|
236
|
+
}
|
|
237
|
+
await runGit(['-C', targetAbs, 'remote', 'set-url', 'origin', parsed.repoUrl], cwd);
|
|
238
|
+
console.log(`Set git origin to: ${parsed.repoUrl}`);
|
|
239
|
+
}
|
|
240
|
+
const mindsDir = path.join(targetAbs, '.minds');
|
|
241
|
+
if (!fs.existsSync(mindsDir)) {
|
|
242
|
+
console.warn(`Warning: template does not contain '.minds/' (${mindsDir})`);
|
|
243
|
+
}
|
|
244
|
+
console.log('Done.');
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
default: {
|
|
248
|
+
const _exhaustive = parsed;
|
|
249
|
+
return _exhaustive;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
255
|
+
process.exit(1);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (require.main === module) {
|
|
259
|
+
main().catch((err) => {
|
|
260
|
+
console.error('Unhandled error:', err);
|
|
261
|
+
process.exit(1);
|
|
262
|
+
});
|
|
263
|
+
}
|
package/dist/cli/read.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Read subcommand for dominds CLI
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* dominds read [options] [<member-id>]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* --no-hints Don't show hints
|
|
11
|
+
* --only-prompt Show only system prompt
|
|
12
|
+
* --only-mem Show only memories
|
|
13
|
+
* --help Show help
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.main = main;
|
|
17
|
+
const load_1 = require("../minds/load");
|
|
18
|
+
function printUsage() {
|
|
19
|
+
console.log('Usage: dominds read [<member-id>] [--no-hints] [--only-prompt|--only-mem]');
|
|
20
|
+
console.log('');
|
|
21
|
+
console.log('Print agent system prompt and memories with filtering flags.');
|
|
22
|
+
console.log('');
|
|
23
|
+
console.log("Note: Workspace directory is `process.cwd()`. Use 'dominds -C <dir> read' to run in another workspace.");
|
|
24
|
+
console.log('');
|
|
25
|
+
console.log('Examples:');
|
|
26
|
+
console.log(' dominds read # Read all team members');
|
|
27
|
+
console.log(' dominds read developer # Read specific member');
|
|
28
|
+
console.log(' dominds read --only-prompt # Show only system prompts');
|
|
29
|
+
console.log(' dominds read --only-mem # Show only memories');
|
|
30
|
+
}
|
|
31
|
+
async function main() {
|
|
32
|
+
const args = process.argv.slice(2);
|
|
33
|
+
let memberId;
|
|
34
|
+
let onlyPrompt = false;
|
|
35
|
+
let onlyMem = false;
|
|
36
|
+
for (let i = 0; i < args.length; i++) {
|
|
37
|
+
const arg = args[i];
|
|
38
|
+
if (arg === '--only-prompt') {
|
|
39
|
+
onlyPrompt = true;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === '--only-mem') {
|
|
42
|
+
onlyMem = true;
|
|
43
|
+
}
|
|
44
|
+
else if (arg === '--no-hints') {
|
|
45
|
+
// Deprecated, but keep for compatibility
|
|
46
|
+
console.warn('Warning: --no-hints is deprecated, use --only-prompt or --only-mem instead');
|
|
47
|
+
}
|
|
48
|
+
else if (arg === '-h' || arg === '--help') {
|
|
49
|
+
printUsage();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
else if (!memberId) {
|
|
53
|
+
memberId = arg;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.error(`Error: unexpected argument '${arg}'`);
|
|
57
|
+
printUsage();
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const { systemPrompt, memories } = await (0, load_1.loadAgentMinds)(memberId);
|
|
63
|
+
if (!onlyMem) {
|
|
64
|
+
process.stdout.write(systemPrompt.trim() + '\n');
|
|
65
|
+
}
|
|
66
|
+
if (!onlyPrompt) {
|
|
67
|
+
for (const mem of memories) {
|
|
68
|
+
if ('content' in mem && typeof mem.content === 'string' && mem.content.trim()) {
|
|
69
|
+
process.stdout.write('\n' + mem.content.trim() + '\n');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error('Error loading agent minds:', err instanceof Error ? err.message : String(err));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (require.main === module) {
|
|
80
|
+
main().catch((err) => {
|
|
81
|
+
console.error('Unhandled error:', err);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
});
|
|
84
|
+
}
|