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,522 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Module: utils/task-package
|
|
4
|
+
*
|
|
5
|
+
* Encapsulated Task Docs (`*.tsk/`).
|
|
6
|
+
*
|
|
7
|
+
* A Task Doc is a directory ending in `.tsk`. It *may* contain:
|
|
8
|
+
* - goals.md
|
|
9
|
+
* - constraints.md
|
|
10
|
+
* - progress.md
|
|
11
|
+
*
|
|
12
|
+
* These files are considered high-integrity state and MUST NOT be accessible via general file tools.
|
|
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.BEAR_IN_MIND_SECTIONS = void 0;
|
|
49
|
+
exports.isTaskPackagePath = isTaskPackagePath;
|
|
50
|
+
exports.taskPackageSectionFromSelector = taskPackageSectionFromSelector;
|
|
51
|
+
exports.bearInMindSectionFromSelector = bearInMindSectionFromSelector;
|
|
52
|
+
exports.parseTaskPackageChangeMindTarget = parseTaskPackageChangeMindTarget;
|
|
53
|
+
exports.taskPackageFilenameForSection = taskPackageFilenameForSection;
|
|
54
|
+
exports.bearInMindFilenameForSection = bearInMindFilenameForSection;
|
|
55
|
+
exports.updateTaskPackageByChangeMindTarget = updateTaskPackageByChangeMindTarget;
|
|
56
|
+
exports.ensureTaskPackage = ensureTaskPackage;
|
|
57
|
+
exports.readTaskPackageSections = readTaskPackageSections;
|
|
58
|
+
exports.formatEffectiveTaskDocFromSections = formatEffectiveTaskDocFromSections;
|
|
59
|
+
exports.validateTaskPackageLayout = validateTaskPackageLayout;
|
|
60
|
+
exports.readTaskPackageForInjection = readTaskPackageForInjection;
|
|
61
|
+
exports.updateTaskPackageSection = updateTaskPackageSection;
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const path = __importStar(require("path"));
|
|
64
|
+
const taskPackageIdentifierRe = /^[a-zA-Z][a-zA-Z0-9_-]*(?:\.[a-zA-Z0-9_-]+)*$/;
|
|
65
|
+
function isTaskPackageIdentifier(value) {
|
|
66
|
+
return taskPackageIdentifierRe.test(value);
|
|
67
|
+
}
|
|
68
|
+
exports.BEAR_IN_MIND_SECTIONS = [
|
|
69
|
+
'contracts',
|
|
70
|
+
'acceptance',
|
|
71
|
+
'grants',
|
|
72
|
+
'runbook',
|
|
73
|
+
'decisions',
|
|
74
|
+
'risks',
|
|
75
|
+
];
|
|
76
|
+
const sectionToFilename = {
|
|
77
|
+
goals: 'goals.md',
|
|
78
|
+
constraints: 'constraints.md',
|
|
79
|
+
progress: 'progress.md',
|
|
80
|
+
};
|
|
81
|
+
const bearInMindSectionToFilename = {
|
|
82
|
+
contracts: 'contracts.md',
|
|
83
|
+
acceptance: 'acceptance.md',
|
|
84
|
+
grants: 'grants.md',
|
|
85
|
+
runbook: 'runbook.md',
|
|
86
|
+
decisions: 'decisions.md',
|
|
87
|
+
risks: 'risks.md',
|
|
88
|
+
};
|
|
89
|
+
function normalizeTaskPackagePath(taskDocPath) {
|
|
90
|
+
return taskDocPath.replace(/\\/g, '/').replace(/\/+$/g, '');
|
|
91
|
+
}
|
|
92
|
+
function isTaskPackagePath(taskDocPath) {
|
|
93
|
+
return normalizeTaskPackagePath(taskDocPath).endsWith('.tsk');
|
|
94
|
+
}
|
|
95
|
+
function taskPackageSectionFromSelector(selector) {
|
|
96
|
+
const normalized = selector.startsWith('!') ? selector.slice(1) : selector;
|
|
97
|
+
if (normalized === 'goals')
|
|
98
|
+
return normalized;
|
|
99
|
+
if (normalized === 'constraints')
|
|
100
|
+
return normalized;
|
|
101
|
+
if (normalized === 'progress')
|
|
102
|
+
return normalized;
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function bearInMindSectionFromSelector(selector) {
|
|
106
|
+
const normalized = selector.startsWith('!') ? selector.slice(1) : selector;
|
|
107
|
+
if (normalized === 'contracts')
|
|
108
|
+
return normalized;
|
|
109
|
+
if (normalized === 'acceptance')
|
|
110
|
+
return normalized;
|
|
111
|
+
if (normalized === 'grants')
|
|
112
|
+
return normalized;
|
|
113
|
+
if (normalized === 'runbook')
|
|
114
|
+
return normalized;
|
|
115
|
+
if (normalized === 'decisions')
|
|
116
|
+
return normalized;
|
|
117
|
+
if (normalized === 'risks')
|
|
118
|
+
return normalized;
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
function parseTaskPackageChangeMindTarget(params) {
|
|
122
|
+
const selector = params.selector.trim();
|
|
123
|
+
if (selector === '') {
|
|
124
|
+
return { kind: 'err', error: { kind: 'selector_required' } };
|
|
125
|
+
}
|
|
126
|
+
const categoryValue = typeof params.category === 'string' ? params.category.trim() : '';
|
|
127
|
+
const category = categoryValue !== '' ? categoryValue : null;
|
|
128
|
+
// Category missing/empty => top-level only.
|
|
129
|
+
if (category === null) {
|
|
130
|
+
const topLevel = taskPackageSectionFromSelector(selector);
|
|
131
|
+
if (topLevel !== null) {
|
|
132
|
+
return { kind: 'ok', target: { kind: 'top_level', section: topLevel } };
|
|
133
|
+
}
|
|
134
|
+
return { kind: 'err', error: { kind: 'invalid_top_level_selector', selector } };
|
|
135
|
+
}
|
|
136
|
+
// Category present => validate category name first.
|
|
137
|
+
if (!isTaskPackageIdentifier(category)) {
|
|
138
|
+
return { kind: 'err', error: { kind: 'invalid_category_name', category } };
|
|
139
|
+
}
|
|
140
|
+
if (category === 'bearinmind') {
|
|
141
|
+
const bear = bearInMindSectionFromSelector(selector);
|
|
142
|
+
if (bear !== null) {
|
|
143
|
+
return { kind: 'ok', target: { kind: 'bearinmind', section: bear } };
|
|
144
|
+
}
|
|
145
|
+
// Reserved top-level selectors must not be nested under any category.
|
|
146
|
+
const topLevel = taskPackageSectionFromSelector(selector);
|
|
147
|
+
if (topLevel !== null) {
|
|
148
|
+
return {
|
|
149
|
+
kind: 'err',
|
|
150
|
+
error: { kind: 'top_level_selector_requires_no_category', category, selector },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return { kind: 'err', error: { kind: 'invalid_bearinmind_selector', selector } };
|
|
154
|
+
}
|
|
155
|
+
// Reserved top-level selectors must not be nested under any category.
|
|
156
|
+
const topLevel = taskPackageSectionFromSelector(selector);
|
|
157
|
+
if (topLevel !== null) {
|
|
158
|
+
return {
|
|
159
|
+
kind: 'err',
|
|
160
|
+
error: { kind: 'top_level_selector_requires_no_category', category, selector },
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// Reserved bearinmind selectors must only appear under category="bearinmind".
|
|
164
|
+
const bear = bearInMindSectionFromSelector(selector);
|
|
165
|
+
if (bear !== null) {
|
|
166
|
+
return {
|
|
167
|
+
kind: 'err',
|
|
168
|
+
error: { kind: 'bearinmind_selector_requires_bearinmind_category', category, selector },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const normalizedSelector = selector.startsWith('!') ? selector.slice(1) : selector;
|
|
172
|
+
if (!isTaskPackageIdentifier(normalizedSelector)) {
|
|
173
|
+
return { kind: 'err', error: { kind: 'invalid_category_selector', selector } };
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
kind: 'ok',
|
|
177
|
+
target: { kind: 'category', category, selector: normalizedSelector },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function taskPackageFilenameForSection(section) {
|
|
181
|
+
return sectionToFilename[section];
|
|
182
|
+
}
|
|
183
|
+
function bearInMindFilenameForSection(section) {
|
|
184
|
+
return bearInMindSectionToFilename[section];
|
|
185
|
+
}
|
|
186
|
+
async function updateTaskPackageByChangeMindTarget(params) {
|
|
187
|
+
const { taskPackageDirFullPath, target, content, updatedBy } = params;
|
|
188
|
+
await ensureTaskPackage(taskPackageDirFullPath, updatedBy);
|
|
189
|
+
switch (target.kind) {
|
|
190
|
+
case 'top_level': {
|
|
191
|
+
await updateTaskPackageSection({
|
|
192
|
+
taskPackageDirFullPath,
|
|
193
|
+
section: target.section,
|
|
194
|
+
content,
|
|
195
|
+
updatedBy,
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
case 'bearinmind': {
|
|
200
|
+
const dir = path.join(taskPackageDirFullPath, 'bearinmind');
|
|
201
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
202
|
+
const filePath = path.join(dir, bearInMindFilenameForSection(target.section));
|
|
203
|
+
await fs.promises.writeFile(filePath, content, 'utf8');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
case 'category': {
|
|
207
|
+
const dir = path.join(taskPackageDirFullPath, target.category);
|
|
208
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
209
|
+
const filePath = path.join(dir, `${target.selector}.md`);
|
|
210
|
+
await fs.promises.writeFile(filePath, content, 'utf8');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
default: {
|
|
214
|
+
const _exhaustive = target;
|
|
215
|
+
return _exhaustive;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async function fileExists(fullPath) {
|
|
220
|
+
try {
|
|
221
|
+
await fs.promises.stat(fullPath);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
if (typeof err === 'object' &&
|
|
226
|
+
err !== null &&
|
|
227
|
+
'code' in err &&
|
|
228
|
+
err.code === 'ENOENT') {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
throw err;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async function ensureTaskPackage(taskPackageDirFullPath, _updatedBy) {
|
|
235
|
+
await fs.promises.mkdir(taskPackageDirFullPath, { recursive: true });
|
|
236
|
+
}
|
|
237
|
+
async function readSectionFile(sectionPath) {
|
|
238
|
+
if (!(await fileExists(sectionPath))) {
|
|
239
|
+
return { kind: 'missing' };
|
|
240
|
+
}
|
|
241
|
+
const content = await fs.promises.readFile(sectionPath, 'utf8');
|
|
242
|
+
return { kind: 'present', content };
|
|
243
|
+
}
|
|
244
|
+
async function readTaskPackageSections(taskPackageDirFullPath) {
|
|
245
|
+
const goals = await readSectionFile(path.join(taskPackageDirFullPath, taskPackageFilenameForSection('goals')));
|
|
246
|
+
const constraints = await readSectionFile(path.join(taskPackageDirFullPath, taskPackageFilenameForSection('constraints')));
|
|
247
|
+
const progress = await readSectionFile(path.join(taskPackageDirFullPath, taskPackageFilenameForSection('progress')));
|
|
248
|
+
return { goals, constraints, progress };
|
|
249
|
+
}
|
|
250
|
+
function formatSectionBodyI18n(state) {
|
|
251
|
+
// Injection must be deterministic and treat section bodies as opaque markdown.
|
|
252
|
+
// If a required file is missing, inject an empty body (status should be shown elsewhere).
|
|
253
|
+
if (state.kind === 'present')
|
|
254
|
+
return state.content;
|
|
255
|
+
return '';
|
|
256
|
+
}
|
|
257
|
+
function formatBearInMindBody(state) {
|
|
258
|
+
if (state.kind !== 'present')
|
|
259
|
+
return null;
|
|
260
|
+
if (state.content.trim() === '')
|
|
261
|
+
return null;
|
|
262
|
+
return state.content;
|
|
263
|
+
}
|
|
264
|
+
function formatEffectiveTaskDocFromSections(language, sections, bearInMind) {
|
|
265
|
+
// Deterministic framing only; section bodies are treated as opaque markdown.
|
|
266
|
+
if (language === 'zh') {
|
|
267
|
+
const bearBlocks = [];
|
|
268
|
+
if (bearInMind?.kind === 'present') {
|
|
269
|
+
for (const section of exports.BEAR_IN_MIND_SECTIONS) {
|
|
270
|
+
const body = formatBearInMindBody(bearInMind.sections[section]);
|
|
271
|
+
if (!body)
|
|
272
|
+
continue;
|
|
273
|
+
bearBlocks.push(`### ${bearInMindFilenameForSection(section)}`, body);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const bearInMindBlock = bearBlocks.length > 0 ? [`## Bear In Mind`, ...bearBlocks, ``].join('\n') : '';
|
|
277
|
+
return [
|
|
278
|
+
`# 差遣牒(对话树)`,
|
|
279
|
+
``,
|
|
280
|
+
`## Goals`,
|
|
281
|
+
formatSectionBodyI18n(sections.goals),
|
|
282
|
+
``,
|
|
283
|
+
`## Constraints`,
|
|
284
|
+
formatSectionBodyI18n(sections.constraints),
|
|
285
|
+
``,
|
|
286
|
+
...(bearInMindBlock ? [bearInMindBlock] : []),
|
|
287
|
+
`## Progress`,
|
|
288
|
+
formatSectionBodyI18n(sections.progress),
|
|
289
|
+
].join('\n');
|
|
290
|
+
}
|
|
291
|
+
const bearBlocks = [];
|
|
292
|
+
if (bearInMind?.kind === 'present') {
|
|
293
|
+
for (const section of exports.BEAR_IN_MIND_SECTIONS) {
|
|
294
|
+
const body = formatBearInMindBody(bearInMind.sections[section]);
|
|
295
|
+
if (!body)
|
|
296
|
+
continue;
|
|
297
|
+
bearBlocks.push(`### ${bearInMindFilenameForSection(section)}`, body);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const bearInMindBlock = bearBlocks.length > 0 ? [`## Bear In Mind`, ...bearBlocks, ``].join('\n') : '';
|
|
301
|
+
return [
|
|
302
|
+
`# Taskdoc (Dialog Tree)`,
|
|
303
|
+
``,
|
|
304
|
+
`## Goals`,
|
|
305
|
+
formatSectionBodyI18n(sections.goals),
|
|
306
|
+
``,
|
|
307
|
+
`## Constraints`,
|
|
308
|
+
formatSectionBodyI18n(sections.constraints),
|
|
309
|
+
``,
|
|
310
|
+
...(bearInMindBlock ? [bearInMindBlock] : []),
|
|
311
|
+
`## Progress`,
|
|
312
|
+
formatSectionBodyI18n(sections.progress),
|
|
313
|
+
].join('\n');
|
|
314
|
+
}
|
|
315
|
+
async function readBearInMindSections(taskPackageDirFullPath) {
|
|
316
|
+
const bearDir = path.join(taskPackageDirFullPath, 'bearinmind');
|
|
317
|
+
try {
|
|
318
|
+
const st = await fs.promises.stat(bearDir);
|
|
319
|
+
if (!st.isDirectory()) {
|
|
320
|
+
return { kind: 'invalid', reason: 'not_a_directory' };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
if (typeof err === 'object' &&
|
|
325
|
+
err !== null &&
|
|
326
|
+
'code' in err &&
|
|
327
|
+
err.code === 'ENOENT') {
|
|
328
|
+
return { kind: 'absent' };
|
|
329
|
+
}
|
|
330
|
+
throw err;
|
|
331
|
+
}
|
|
332
|
+
const sections = {
|
|
333
|
+
contracts: { kind: 'missing' },
|
|
334
|
+
acceptance: { kind: 'missing' },
|
|
335
|
+
grants: { kind: 'missing' },
|
|
336
|
+
runbook: { kind: 'missing' },
|
|
337
|
+
decisions: { kind: 'missing' },
|
|
338
|
+
risks: { kind: 'missing' },
|
|
339
|
+
};
|
|
340
|
+
for (const section of exports.BEAR_IN_MIND_SECTIONS) {
|
|
341
|
+
sections[section] = await readSectionFile(path.join(bearDir, bearInMindFilenameForSection(section)));
|
|
342
|
+
}
|
|
343
|
+
const extraEntries = [];
|
|
344
|
+
const allowed = new Set(Object.values(bearInMindSectionToFilename));
|
|
345
|
+
const entries = await fs.promises.readdir(bearDir, { withFileTypes: true });
|
|
346
|
+
for (const entry of entries) {
|
|
347
|
+
if (entry.name.startsWith('.'))
|
|
348
|
+
continue;
|
|
349
|
+
if (!allowed.has(entry.name)) {
|
|
350
|
+
extraEntries.push(entry.name);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return { kind: 'present', sections, extraEntries };
|
|
354
|
+
}
|
|
355
|
+
async function validateTaskPackageLayout(taskPackageDirFullPath) {
|
|
356
|
+
const violations = [];
|
|
357
|
+
const maxEntries = 2048;
|
|
358
|
+
let seenEntries = 0;
|
|
359
|
+
const topLevelFilenames = new Set(Object.values(sectionToFilename));
|
|
360
|
+
const bearFilenames = new Set(Object.values(bearInMindSectionToFilename));
|
|
361
|
+
const allowedBearDirEntries = new Set(Object.values(bearInMindSectionToFilename));
|
|
362
|
+
const stack = [
|
|
363
|
+
{ absDir: taskPackageDirFullPath, relDir: '' },
|
|
364
|
+
];
|
|
365
|
+
while (stack.length > 0) {
|
|
366
|
+
const cur = stack.pop();
|
|
367
|
+
if (!cur)
|
|
368
|
+
break;
|
|
369
|
+
let entries;
|
|
370
|
+
try {
|
|
371
|
+
entries = await fs.promises.readdir(cur.absDir, { withFileTypes: true });
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
for (const entry of entries) {
|
|
377
|
+
seenEntries++;
|
|
378
|
+
if (seenEntries > maxEntries) {
|
|
379
|
+
violations.push({ kind: 'scan_limit_exceeded', maxEntries });
|
|
380
|
+
return violations;
|
|
381
|
+
}
|
|
382
|
+
const relPath = cur.relDir ? path.posix.join(cur.relDir, entry.name) : entry.name;
|
|
383
|
+
const absPath = path.join(cur.absDir, entry.name);
|
|
384
|
+
if (entry.isDirectory()) {
|
|
385
|
+
if (cur.relDir === 'bearinmind') {
|
|
386
|
+
violations.push({ kind: 'bearinmind_extra_entry', foundAt: relPath });
|
|
387
|
+
}
|
|
388
|
+
stack.push({ absDir: absPath, relDir: relPath.replace(/\\/g, '/') });
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
if (!entry.isFile()) {
|
|
392
|
+
if (cur.relDir === 'bearinmind') {
|
|
393
|
+
violations.push({ kind: 'bearinmind_extra_entry', foundAt: relPath });
|
|
394
|
+
}
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
if (cur.relDir === 'bearinmind' && !allowedBearDirEntries.has(entry.name)) {
|
|
398
|
+
violations.push({ kind: 'bearinmind_extra_entry', foundAt: relPath });
|
|
399
|
+
}
|
|
400
|
+
if (topLevelFilenames.has(entry.name) && cur.relDir !== '') {
|
|
401
|
+
violations.push({
|
|
402
|
+
kind: 'top_level_file_under_subdir',
|
|
403
|
+
filename: entry.name,
|
|
404
|
+
foundAt: relPath,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
if (bearFilenames.has(entry.name)) {
|
|
408
|
+
if (cur.relDir !== 'bearinmind') {
|
|
409
|
+
violations.push({
|
|
410
|
+
kind: 'bearinmind_file_outside_bearinmind',
|
|
411
|
+
filename: entry.name,
|
|
412
|
+
foundAt: relPath,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// Special-case: bearinmind exists but is not a directory.
|
|
419
|
+
const bearDir = path.join(taskPackageDirFullPath, 'bearinmind');
|
|
420
|
+
try {
|
|
421
|
+
const st = await fs.promises.stat(bearDir);
|
|
422
|
+
if (!st.isDirectory()) {
|
|
423
|
+
violations.push({ kind: 'bearinmind_not_directory', foundAt: 'bearinmind' });
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
if (typeof err === 'object' &&
|
|
428
|
+
err !== null &&
|
|
429
|
+
'code' in err &&
|
|
430
|
+
err.code === 'ENOENT') {
|
|
431
|
+
// ok
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// ignore unexpected validation errors to avoid blocking prompt injection
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return violations;
|
|
438
|
+
}
|
|
439
|
+
async function readTaskPackageForInjection(taskPackageDirFullPath) {
|
|
440
|
+
const sections = await readTaskPackageSections(taskPackageDirFullPath);
|
|
441
|
+
const bearInMind = await readBearInMindSections(taskPackageDirFullPath);
|
|
442
|
+
const extraSections = await readTaskPackageExtraSectionsIndex(taskPackageDirFullPath);
|
|
443
|
+
const violations = await validateTaskPackageLayout(taskPackageDirFullPath);
|
|
444
|
+
return { sections, bearInMind, extraSections, violations };
|
|
445
|
+
}
|
|
446
|
+
async function updateTaskPackageSection(params) {
|
|
447
|
+
const { taskPackageDirFullPath, section, content, updatedBy } = params;
|
|
448
|
+
await ensureTaskPackage(taskPackageDirFullPath, updatedBy);
|
|
449
|
+
const filePath = path.join(taskPackageDirFullPath, taskPackageFilenameForSection(section));
|
|
450
|
+
await fs.promises.writeFile(filePath, content, 'utf8');
|
|
451
|
+
}
|
|
452
|
+
async function readTaskPackageExtraSectionsIndex(taskPackageDirFullPath) {
|
|
453
|
+
const maxEntries = 64;
|
|
454
|
+
let total = 0;
|
|
455
|
+
try {
|
|
456
|
+
const dirents = await fs.promises.readdir(taskPackageDirFullPath, { withFileTypes: true });
|
|
457
|
+
const categoryToSelectors = new Map();
|
|
458
|
+
for (const entry of dirents) {
|
|
459
|
+
if (!entry.isDirectory())
|
|
460
|
+
continue;
|
|
461
|
+
if (entry.name.startsWith('.'))
|
|
462
|
+
continue;
|
|
463
|
+
if (entry.name === 'bearinmind')
|
|
464
|
+
continue;
|
|
465
|
+
if (!isTaskPackageIdentifier(entry.name))
|
|
466
|
+
continue;
|
|
467
|
+
const category = entry.name;
|
|
468
|
+
const catAbs = path.join(taskPackageDirFullPath, category);
|
|
469
|
+
let catEntries;
|
|
470
|
+
try {
|
|
471
|
+
catEntries = await fs.promises.readdir(catAbs, { withFileTypes: true });
|
|
472
|
+
}
|
|
473
|
+
catch {
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
for (const child of catEntries) {
|
|
477
|
+
if (total >= maxEntries) {
|
|
478
|
+
return {
|
|
479
|
+
kind: 'present',
|
|
480
|
+
categories: materializeExtraCategories(categoryToSelectors),
|
|
481
|
+
truncated: true,
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
if (!child.isFile())
|
|
485
|
+
continue;
|
|
486
|
+
if (child.name.startsWith('.'))
|
|
487
|
+
continue;
|
|
488
|
+
if (!child.name.endsWith('.md'))
|
|
489
|
+
continue;
|
|
490
|
+
const selector = child.name.slice(0, -3);
|
|
491
|
+
if (!isTaskPackageIdentifier(selector))
|
|
492
|
+
continue;
|
|
493
|
+
if (taskPackageSectionFromSelector(selector) !== null)
|
|
494
|
+
continue;
|
|
495
|
+
if (bearInMindSectionFromSelector(selector) !== null)
|
|
496
|
+
continue;
|
|
497
|
+
const set = categoryToSelectors.get(category) ?? new Set();
|
|
498
|
+
set.add(selector);
|
|
499
|
+
categoryToSelectors.set(category, set);
|
|
500
|
+
total++;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return {
|
|
504
|
+
kind: 'present',
|
|
505
|
+
categories: materializeExtraCategories(categoryToSelectors),
|
|
506
|
+
truncated: false,
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
return { kind: 'unavailable', reason: 'scan_error' };
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
function materializeExtraCategories(categoryToSelectors) {
|
|
514
|
+
const categories = Array.from(categoryToSelectors.entries())
|
|
515
|
+
.filter(([, selectors]) => selectors.size > 0)
|
|
516
|
+
.map(([category, selectors]) => ({
|
|
517
|
+
category,
|
|
518
|
+
selectors: Array.from(selectors.values()).sort(),
|
|
519
|
+
}))
|
|
520
|
+
.sort((a, b) => a.category.localeCompare(b.category));
|
|
521
|
+
return categories;
|
|
522
|
+
}
|