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.
Files changed (273) hide show
  1. package/LICENSE +157 -0
  2. package/README.md +250 -0
  3. package/README.zh.md +161 -0
  4. package/dist/access-control.js +253 -0
  5. package/dist/cli/create.js +263 -0
  6. package/dist/cli/read.js +84 -0
  7. package/dist/cli/tui.js +199 -0
  8. package/dist/cli/webui.js +169 -0
  9. package/dist/cli.js +227 -0
  10. package/dist/dialog-factory.js +53 -0
  11. package/dist/dialog-global-registry.js +68 -0
  12. package/dist/dialog-instance-registry.js +78 -0
  13. package/dist/dialog-run-state.js +198 -0
  14. package/dist/dialog.js +1024 -0
  15. package/dist/evt-registry.js +103 -0
  16. package/dist/index.js +8 -0
  17. package/dist/llm/client.js +69 -0
  18. package/dist/llm/defaults.yaml +386 -0
  19. package/dist/llm/driver.js +3214 -0
  20. package/dist/llm/gen/anthropic.js +611 -0
  21. package/dist/llm/gen/codex.js +375 -0
  22. package/dist/llm/gen/mock.js +326 -0
  23. package/dist/llm/gen/openai.js +470 -0
  24. package/dist/llm/gen/registry.js +26 -0
  25. package/dist/llm/gen.js +2 -0
  26. package/dist/llm/tools-projection.js +37 -0
  27. package/dist/log.js +228 -0
  28. package/dist/mcp/config.js +230 -0
  29. package/dist/mcp/sdk-client.js +129 -0
  30. package/dist/mcp/server-runtime.js +57 -0
  31. package/dist/mcp/stdio-client.js +280 -0
  32. package/dist/mcp/supervisor.js +979 -0
  33. package/dist/mcp/tool-names.js +109 -0
  34. package/dist/minds/builtin/cmdr/persona.md +3 -0
  35. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  36. package/dist/minds/builtin/dijiang/persona.md +7 -0
  37. package/dist/minds/builtin/fuxi/persona.en.md +59 -0
  38. package/dist/minds/builtin/fuxi/persona.zh.md +49 -0
  39. package/dist/minds/builtin/pangu/persona.en.md +78 -0
  40. package/dist/minds/builtin/pangu/persona.zh.md +71 -0
  41. package/dist/minds/load.js +617 -0
  42. package/dist/minds/minds-i18n.js +131 -0
  43. package/dist/minds/system-prompt.js +281 -0
  44. package/dist/persistence.js +3128 -0
  45. package/dist/problems.js +109 -0
  46. package/dist/server/api-routes.js +1031 -0
  47. package/dist/server/auth.js +180 -0
  48. package/dist/server/mime-types.js +32 -0
  49. package/dist/server/prompts-routes.js +543 -0
  50. package/dist/server/server-core.js +235 -0
  51. package/dist/server/setup-routes.js +697 -0
  52. package/dist/server/static-server.js +132 -0
  53. package/dist/server/websocket-handler.js +1011 -0
  54. package/dist/server.js +164 -0
  55. package/dist/shared/async-fifo-mutex.js +36 -0
  56. package/dist/shared/diligence.js +20 -0
  57. package/dist/shared/dotenv.js +144 -0
  58. package/dist/shared/evt.js +195 -0
  59. package/dist/shared/i18n/driver-messages.js +267 -0
  60. package/dist/shared/i18n/text.js +9 -0
  61. package/dist/shared/i18n/tool-result-messages.js +51 -0
  62. package/dist/shared/rtws-cli.js +73 -0
  63. package/dist/shared/runtime-language.js +47 -0
  64. package/dist/shared/team-mgmt-manual.js +116 -0
  65. package/dist/shared/types/context-health.js +2 -0
  66. package/dist/shared/types/dialog.js +11 -0
  67. package/dist/shared/types/i18n.js +2 -0
  68. package/dist/shared/types/index.js +26 -0
  69. package/dist/shared/types/language.js +40 -0
  70. package/dist/shared/types/problems.js +2 -0
  71. package/dist/shared/types/prompts.js +2 -0
  72. package/dist/shared/types/q4h.js +7 -0
  73. package/dist/shared/types/run-state.js +8 -0
  74. package/dist/shared/types/setup.js +2 -0
  75. package/dist/shared/types/storage.js +10 -0
  76. package/dist/shared/types/tellask.js +8 -0
  77. package/dist/shared/types/tools-registry.js +2 -0
  78. package/dist/shared/types/wire.js +12 -0
  79. package/dist/shared/utils/fmt.js +9 -0
  80. package/dist/shared/utils/html.js +20 -0
  81. package/dist/shared/utils/id.js +18 -0
  82. package/dist/shared/utils/inter-dialog-format.js +101 -0
  83. package/dist/shared/utils/time.js +13 -0
  84. package/dist/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  85. package/dist/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  86. package/dist/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  87. package/dist/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  88. package/dist/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  89. package/dist/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  90. package/dist/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  91. package/dist/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  92. package/dist/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  93. package/dist/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  94. package/dist/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  95. package/dist/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  96. package/dist/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  97. package/dist/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  98. package/dist/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  99. package/dist/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  100. package/dist/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  101. package/dist/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  102. package/dist/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  103. package/dist/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  104. package/dist/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  105. package/dist/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  106. package/dist/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  107. package/dist/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  108. package/dist/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  109. package/dist/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  110. package/dist/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  111. package/dist/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  112. package/dist/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  113. package/dist/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  114. package/dist/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  115. package/dist/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  116. package/dist/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  117. package/dist/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  118. package/dist/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  119. package/dist/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  120. package/dist/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  121. package/dist/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  122. package/dist/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  123. package/dist/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  124. package/dist/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  125. package/dist/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  126. package/dist/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  127. package/dist/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  128. package/dist/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  129. package/dist/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  130. package/dist/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  131. package/dist/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  132. package/dist/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  133. package/dist/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  134. package/dist/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  135. package/dist/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  136. package/dist/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  137. package/dist/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  138. package/dist/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  139. package/dist/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  140. package/dist/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  141. package/dist/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  142. package/dist/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  143. package/dist/static/assets/_baseUniq-Crfl3d5Y.js +661 -0
  144. package/dist/static/assets/_baseUniq-Crfl3d5Y.js.map +1 -0
  145. package/dist/static/assets/arc-CbA_x9GD.js +132 -0
  146. package/dist/static/assets/arc-CbA_x9GD.js.map +1 -0
  147. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js +8685 -0
  148. package/dist/static/assets/architectureDiagram-VXUJARFQ-lcFS8ZQJ.js.map +1 -0
  149. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js +3608 -0
  150. package/dist/static/assets/blockDiagram-VD42YOAC-B3Q36qRc.js.map +1 -0
  151. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js +2482 -0
  152. package/dist/static/assets/c4Diagram-YG6GDRKO-Mt-aq3VH.js.map +1 -0
  153. package/dist/static/assets/channel-BVr1Yke-.js +8 -0
  154. package/dist/static/assets/channel-BVr1Yke-.js.map +1 -0
  155. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js +17 -0
  156. package/dist/static/assets/chunk-4BX2VUAB-qCIn5Iic.js.map +1 -0
  157. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js +14 -0
  158. package/dist/static/assets/chunk-55IACEB6-q172NeCV.js.map +1 -0
  159. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js +1827 -0
  160. package/dist/static/assets/chunk-B4BG7PRW-CMJmtYzq.js.map +1 -0
  161. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js +1916 -0
  162. package/dist/static/assets/chunk-DI55MBZ5-DiuwwZPL.js.map +1 -0
  163. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js +20 -0
  164. package/dist/static/assets/chunk-FMBD7UC4-06sqZTTn.js.map +1 -0
  165. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js +25 -0
  166. package/dist/static/assets/chunk-QN33PNHL-CnpBNkpP.js.map +1 -0
  167. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js +18 -0
  168. package/dist/static/assets/chunk-QZHKN3VN-CNgjMR-e.js.map +1 -0
  169. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js +109 -0
  170. package/dist/static/assets/chunk-TZMSLE5B-BxtzW6--.js.map +1 -0
  171. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js +23 -0
  172. package/dist/static/assets/classDiagram-2ON5EDUG-29huvmn-.js.map +1 -0
  173. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js +23 -0
  174. package/dist/static/assets/classDiagram-v2-WZHVMYZB-29huvmn-.js.map +1 -0
  175. package/dist/static/assets/clone-D2OgLSSn.js +9 -0
  176. package/dist/static/assets/clone-D2OgLSSn.js.map +1 -0
  177. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js +4943 -0
  178. package/dist/static/assets/cose-bilkent-S5V4N54A-BNegDCxl.js.map +1 -0
  179. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js +30240 -0
  180. package/dist/static/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -0
  181. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js +695 -0
  182. package/dist/static/assets/dagre-6UL2VRFP-f1XrTRSn.js.map +1 -0
  183. package/dist/static/assets/defaultLocale-DVr69WTU.js +207 -0
  184. package/dist/static/assets/defaultLocale-DVr69WTU.js.map +1 -0
  185. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js +849 -0
  186. package/dist/static/assets/diagram-PSM6KHXK-8w1WbeDi.js.map +1 -0
  187. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js +303 -0
  188. package/dist/static/assets/diagram-QEK2KX5R-CF4wtMmR.js.map +1 -0
  189. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js +213 -0
  190. package/dist/static/assets/diagram-S2PKOQOG-8p3Avgn2.js.map +1 -0
  191. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js +1159 -0
  192. package/dist/static/assets/erDiagram-Q2GNP2WA-BMKLxlM9.js.map +1 -0
  193. package/dist/static/assets/favicon-Cmg5RbCj.svg +8 -0
  194. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js +2332 -0
  195. package/dist/static/assets/flowDiagram-NV44I4VS-CgEuPNK2.js.map +1 -0
  196. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js +3681 -0
  197. package/dist/static/assets/ganttDiagram-JELNMOA3-bJkDCf-9.js.map +1 -0
  198. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js +1206 -0
  199. package/dist/static/assets/gitGraphDiagram-NY62KEGX-4QE9kesp.js.map +1 -0
  200. package/dist/static/assets/graph-CS0Pmm7c.js +597 -0
  201. package/dist/static/assets/graph-CS0Pmm7c.js.map +1 -0
  202. package/dist/static/assets/index-BS6HnGzC.js +112303 -0
  203. package/dist/static/assets/index-BS6HnGzC.js.map +1 -0
  204. package/dist/static/assets/index-DaIsSzC_.css +483 -0
  205. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js +34 -0
  206. package/dist/static/assets/infoDiagram-WHAUD3N6-ypBcKfUs.js.map +1 -0
  207. package/dist/static/assets/init-ZxktEp_H.js +17 -0
  208. package/dist/static/assets/init-ZxktEp_H.js.map +1 -0
  209. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js +1255 -0
  210. package/dist/static/assets/journeyDiagram-XKPGCS4Q-QnrxDowJ.js.map +1 -0
  211. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js +1048 -0
  212. package/dist/static/assets/kanban-definition-3W4ZIXB7-CfvEc4z5.js.map +1 -0
  213. package/dist/static/assets/layout-8TGxpm23.js +2218 -0
  214. package/dist/static/assets/layout-8TGxpm23.js.map +1 -0
  215. package/dist/static/assets/linear-BATBPQQv.js +341 -0
  216. package/dist/static/assets/linear-BATBPQQv.js.map +1 -0
  217. package/dist/static/assets/min-B3oVH3AC.js +42 -0
  218. package/dist/static/assets/min-B3oVH3AC.js.map +1 -0
  219. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js +1127 -0
  220. package/dist/static/assets/mindmap-definition-VGOIOE7T-L7VLwwF8.js.map +1 -0
  221. package/dist/static/assets/ordinal-CxptdPJm.js +77 -0
  222. package/dist/static/assets/ordinal-CxptdPJm.js.map +1 -0
  223. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js +241 -0
  224. package/dist/static/assets/pieDiagram-ADFJNKIX-CFW3zIhM.js.map +1 -0
  225. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js +1338 -0
  226. package/dist/static/assets/quadrantDiagram-AYHSOK5B-B7ssen3E.js.map +1 -0
  227. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js +1162 -0
  228. package/dist/static/assets/requirementDiagram-UZGBJVZJ-D0v5BArv.js.map +1 -0
  229. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js +1195 -0
  230. package/dist/static/assets/sankeyDiagram-TZEHDZUN-B7slncJe.js.map +1 -0
  231. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js +3875 -0
  232. package/dist/static/assets/sequenceDiagram-WL72ISMW-oXU2lRh_.js.map +1 -0
  233. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js +452 -0
  234. package/dist/static/assets/stateDiagram-FKZM4ZOC-CFYsEd0x.js.map +1 -0
  235. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js +22 -0
  236. package/dist/static/assets/stateDiagram-v2-4FDKWEC3-C0UWaNA7.js.map +1 -0
  237. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js +1223 -0
  238. package/dist/static/assets/timeline-definition-IT6M3QCI-C3KODUrh.js.map +1 -0
  239. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js +18753 -0
  240. package/dist/static/assets/treemap-KMMF4GRG-DAGDLhj2.js.map +1 -0
  241. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js +1888 -0
  242. package/dist/static/assets/xychartDiagram-PRI3JC2R-C0J9iwTO.js.map +1 -0
  243. package/dist/static/index.html +71 -0
  244. package/dist/static/testing/dom-observation-utils.js +425 -0
  245. package/dist/static/testing/e2e-test-helper.js +3119 -0
  246. package/dist/team.js +1160 -0
  247. package/dist/tellask.js +431 -0
  248. package/dist/tool.js +150 -0
  249. package/dist/tools/apply-patch.js +542 -0
  250. package/dist/tools/builtins.js +196 -0
  251. package/dist/tools/context-health.js +177 -0
  252. package/dist/tools/ctrl.js +478 -0
  253. package/dist/tools/diag.js +583 -0
  254. package/dist/tools/env.js +184 -0
  255. package/dist/tools/fs.js +818 -0
  256. package/dist/tools/mcp.js +138 -0
  257. package/dist/tools/mem.js +349 -0
  258. package/dist/tools/os.js +751 -0
  259. package/dist/tools/prompts/team_mgmt.en.md +70 -0
  260. package/dist/tools/prompts/team_mgmt.zh.md +70 -0
  261. package/dist/tools/prompts/ws_mod.en.md +86 -0
  262. package/dist/tools/prompts/ws_mod.zh.md +87 -0
  263. package/dist/tools/registry-snapshot.js +31 -0
  264. package/dist/tools/registry.js +121 -0
  265. package/dist/tools/ripgrep.js +678 -0
  266. package/dist/tools/team-mgmt.js +3300 -0
  267. package/dist/tools/txt.js +3178 -0
  268. package/dist/utils/id.js +72 -0
  269. package/dist/utils/task-doc.js +236 -0
  270. package/dist/utils/task-package.js +522 -0
  271. package/dist/utils/taskdoc-search.js +280 -0
  272. package/dist/utils/taskdoc.js +400 -0
  273. 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
+ }
@@ -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
+ }