dominds 1.3.1 → 1.4.2

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 (184) hide show
  1. package/README.md +9 -2
  2. package/README.zh.md +9 -2
  3. package/dist/apps/app-lock-file.js +33 -57
  4. package/dist/apps/configuration-file.js +267 -0
  5. package/dist/apps/enabled-apps.js +217 -252
  6. package/dist/apps/manifest.js +132 -0
  7. package/dist/apps/resolution-file.js +80 -192
  8. package/dist/apps/workspace-app-state.js +8 -0
  9. package/dist/cli/disable.js +18 -22
  10. package/dist/cli/enable.js +20 -58
  11. package/dist/cli/install.js +74 -80
  12. package/dist/cli/uninstall.js +48 -25
  13. package/dist/cli/update.js +36 -80
  14. package/dist/docs/app-constitution.md +12 -7
  15. package/dist/docs/app-constitution.zh.md +13 -8
  16. package/dist/llm/kernel-driver/engine.js +10 -4
  17. package/dist/llm/kernel-driver/flow.js +93 -0
  18. package/dist/llm/kernel-driver/loop.js +4 -1
  19. package/dist/llm/kernel-driver/subdialog.js +5 -1
  20. package/dist/llm/kernel-driver/tellask-special.js +48 -6
  21. package/dist/server/server-core.js +19 -4
  22. package/dist/server/websocket-handler.js +26 -6
  23. package/dist/static/assets/{_basePickBy-CmziIRM9.js → _basePickBy-B2o4z1Hf.js} +3 -3
  24. package/dist/static/assets/{_basePickBy-CmziIRM9.js.map → _basePickBy-B2o4z1Hf.js.map} +1 -1
  25. package/dist/static/assets/{_baseUniq-CgDZxcD0.js → _baseUniq-CLmcxjdl.js} +2 -2
  26. package/dist/static/assets/{_baseUniq-CgDZxcD0.js.map → _baseUniq-CLmcxjdl.js.map} +1 -1
  27. package/dist/static/assets/{arc-Df9rjNNk.js → arc-CymD_KN7.js} +2 -2
  28. package/dist/static/assets/{arc-Df9rjNNk.js.map → arc-CymD_KN7.js.map} +1 -1
  29. package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js → architectureDiagram-VXUJARFQ-DJQfSJUH.js} +7 -7
  30. package/dist/static/assets/{architectureDiagram-VXUJARFQ-Bif8topC.js.map → architectureDiagram-VXUJARFQ-DJQfSJUH.js.map} +1 -1
  31. package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js → blockDiagram-VD42YOAC-pHVz60D0.js} +7 -7
  32. package/dist/static/assets/{blockDiagram-VD42YOAC-D9Egoflr.js.map → blockDiagram-VD42YOAC-pHVz60D0.js.map} +1 -1
  33. package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js → c4Diagram-YG6GDRKO-B0WnCfAT.js} +3 -3
  34. package/dist/static/assets/{c4Diagram-YG6GDRKO-DBf1NeBf.js.map → c4Diagram-YG6GDRKO-B0WnCfAT.js.map} +1 -1
  35. package/dist/static/assets/{channel-Dc34yAJl.js → channel-CX9BlKil.js} +2 -2
  36. package/dist/static/assets/{channel-Dc34yAJl.js.map → channel-CX9BlKil.js.map} +1 -1
  37. package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js → chunk-4BX2VUAB-lXArRj3o.js} +2 -2
  38. package/dist/static/assets/{chunk-4BX2VUAB-B65G1dJI.js.map → chunk-4BX2VUAB-lXArRj3o.js.map} +1 -1
  39. package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js → chunk-55IACEB6-CdqwynH9.js} +2 -2
  40. package/dist/static/assets/{chunk-55IACEB6-CSDEOGl2.js.map → chunk-55IACEB6-CdqwynH9.js.map} +1 -1
  41. package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js → chunk-B4BG7PRW-Y-uXcJst.js} +5 -5
  42. package/dist/static/assets/{chunk-B4BG7PRW-Cb6W3QWJ.js.map → chunk-B4BG7PRW-Y-uXcJst.js.map} +1 -1
  43. package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js → chunk-DI55MBZ5-C5xSbRST.js} +4 -4
  44. package/dist/static/assets/{chunk-DI55MBZ5-ZAJWeVWH.js.map → chunk-DI55MBZ5-C5xSbRST.js.map} +1 -1
  45. package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js → chunk-FMBD7UC4-5uefwCjI.js} +2 -2
  46. package/dist/static/assets/{chunk-FMBD7UC4-DiwRlImb.js.map → chunk-FMBD7UC4-5uefwCjI.js.map} +1 -1
  47. package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js → chunk-QN33PNHL-DzWVcvpI.js} +2 -2
  48. package/dist/static/assets/{chunk-QN33PNHL-wilj7fb5.js.map → chunk-QN33PNHL-DzWVcvpI.js.map} +1 -1
  49. package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js → chunk-QZHKN3VN-BrrvAZdP.js} +2 -2
  50. package/dist/static/assets/{chunk-QZHKN3VN-DGmviJfR.js.map → chunk-QZHKN3VN-BrrvAZdP.js.map} +1 -1
  51. package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js → chunk-TZMSLE5B-DyKOlPTY.js} +2 -2
  52. package/dist/static/assets/{chunk-TZMSLE5B-Nm5wTXa_.js.map → chunk-TZMSLE5B-DyKOlPTY.js.map} +1 -1
  53. package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js → classDiagram-2ON5EDUG-FCrnlCWC.js} +6 -6
  54. package/dist/static/assets/{classDiagram-2ON5EDUG-BvUbXD6H.js.map → classDiagram-2ON5EDUG-FCrnlCWC.js.map} +1 -1
  55. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js → classDiagram-v2-WZHVMYZB-FCrnlCWC.js} +6 -6
  56. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-BvUbXD6H.js.map → classDiagram-v2-WZHVMYZB-FCrnlCWC.js.map} +1 -1
  57. package/dist/static/assets/{clone-0VLS7GaA.js → clone-BlI81KqZ.js} +2 -2
  58. package/dist/static/assets/{clone-0VLS7GaA.js.map → clone-BlI81KqZ.js.map} +1 -1
  59. package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js → cose-bilkent-S5V4N54A-yM7S2atz.js} +2 -2
  60. package/dist/static/assets/{cose-bilkent-S5V4N54A-anaPs-75.js.map → cose-bilkent-S5V4N54A-yM7S2atz.js.map} +1 -1
  61. package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js → dagre-6UL2VRFP-BcweuZHt.js} +7 -7
  62. package/dist/static/assets/{dagre-6UL2VRFP-YwdsZ11r.js.map → dagre-6UL2VRFP-BcweuZHt.js.map} +1 -1
  63. package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js → diagram-PSM6KHXK-D4-QwLW1.js} +8 -8
  64. package/dist/static/assets/{diagram-PSM6KHXK-5KQCf3h2.js.map → diagram-PSM6KHXK-D4-QwLW1.js.map} +1 -1
  65. package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js → diagram-QEK2KX5R-BVbuejJn.js} +7 -7
  66. package/dist/static/assets/{diagram-QEK2KX5R-Mf24XxZL.js.map → diagram-QEK2KX5R-BVbuejJn.js.map} +1 -1
  67. package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js → diagram-S2PKOQOG-pB6N6Tq_.js} +7 -7
  68. package/dist/static/assets/{diagram-S2PKOQOG-DyQjD4D5.js.map → diagram-S2PKOQOG-pB6N6Tq_.js.map} +1 -1
  69. package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js → erDiagram-Q2GNP2WA-DLKmthuw.js} +5 -5
  70. package/dist/static/assets/{erDiagram-Q2GNP2WA-CEzTKw1u.js.map → erDiagram-Q2GNP2WA-DLKmthuw.js.map} +1 -1
  71. package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js → flowDiagram-NV44I4VS-BsBhWukh.js} +6 -6
  72. package/dist/static/assets/{flowDiagram-NV44I4VS-DT821XSz.js.map → flowDiagram-NV44I4VS-BsBhWukh.js.map} +1 -1
  73. package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js → ganttDiagram-JELNMOA3-Debz-J-C.js} +3 -3
  74. package/dist/static/assets/{ganttDiagram-JELNMOA3-DlmeVsGg.js.map → ganttDiagram-JELNMOA3-Debz-J-C.js.map} +1 -1
  75. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js} +8 -8
  76. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-yAfyBG_d.js.map → gitGraphDiagram-V2S2FVAM-BnAPFBGR.js.map} +1 -1
  77. package/dist/static/assets/{graph-BYv8vyWe.js → graph-DbzWiBNK.js} +3 -3
  78. package/dist/static/assets/{graph-BYv8vyWe.js.map → graph-DbzWiBNK.js.map} +1 -1
  79. package/dist/static/assets/{index-DMbwqOm6.js → index-B-8J28g7.js} +987 -1049
  80. package/dist/static/assets/index-B-8J28g7.js.map +1 -0
  81. package/dist/static/assets/{index-BiNcBn_U.css → index-CD5wtC_i.css} +1 -1
  82. package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js → infoDiagram-HS3SLOUP-CZ5hWoxV.js} +6 -6
  83. package/dist/static/assets/{infoDiagram-HS3SLOUP-DaadramQ.js.map → infoDiagram-HS3SLOUP-CZ5hWoxV.js.map} +1 -1
  84. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js → journeyDiagram-XKPGCS4Q-CKN3oSxk.js} +5 -5
  85. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ftN8hxu3.js.map → journeyDiagram-XKPGCS4Q-CKN3oSxk.js.map} +1 -1
  86. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js → kanban-definition-3W4ZIXB7-BQCMklfJ.js} +3 -3
  87. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BIXETQ-C.js.map → kanban-definition-3W4ZIXB7-BQCMklfJ.js.map} +1 -1
  88. package/dist/static/assets/{layout-OTbrj0Ye.js → layout-C5B58szc.js} +5 -5
  89. package/dist/static/assets/{layout-OTbrj0Ye.js.map → layout-C5B58szc.js.map} +1 -1
  90. package/dist/static/assets/{linear-CVfOC669.js → linear-_32fut6G.js} +2 -2
  91. package/dist/static/assets/{linear-CVfOC669.js.map → linear-_32fut6G.js.map} +1 -1
  92. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js → mindmap-definition-VGOIOE7T-C_goMzjx.js} +4 -4
  93. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D2zv5uI9.js.map → mindmap-definition-VGOIOE7T-C_goMzjx.js.map} +1 -1
  94. package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js → pieDiagram-ADFJNKIX-BQ2n0cOB.js} +8 -8
  95. package/dist/static/assets/{pieDiagram-ADFJNKIX-DaUXTsv7.js.map → pieDiagram-ADFJNKIX-BQ2n0cOB.js.map} +1 -1
  96. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js → quadrantDiagram-AYHSOK5B-BLg7_neg.js} +3 -3
  97. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B7O2wPX9.js.map → quadrantDiagram-AYHSOK5B-BLg7_neg.js.map} +1 -1
  98. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js → requirementDiagram-UZGBJVZJ-DwkJt0zi.js} +4 -4
  99. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DpauVPY1.js.map → requirementDiagram-UZGBJVZJ-DwkJt0zi.js.map} +1 -1
  100. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js → sankeyDiagram-TZEHDZUN-DmxmatUB.js} +2 -2
  101. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-B3Hbfvad.js.map → sankeyDiagram-TZEHDZUN-DmxmatUB.js.map} +1 -1
  102. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js → sequenceDiagram-WL72ISMW-KHU_eApU.js} +4 -4
  103. package/dist/static/assets/{sequenceDiagram-WL72ISMW-KdbWByWT.js.map → sequenceDiagram-WL72ISMW-KHU_eApU.js.map} +1 -1
  104. package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js → stateDiagram-FKZM4ZOC-B3DBCxAL.js} +9 -9
  105. package/dist/static/assets/{stateDiagram-FKZM4ZOC-yDOCVezC.js.map → stateDiagram-FKZM4ZOC-B3DBCxAL.js.map} +1 -1
  106. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js} +5 -5
  107. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CpCJhvQO.js.map → stateDiagram-v2-4FDKWEC3-C-uIk7gh.js.map} +1 -1
  108. package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js → timeline-definition-IT6M3QCI-SysEcQCC.js} +3 -3
  109. package/dist/static/assets/{timeline-definition-IT6M3QCI-CHxuEjhV.js.map → timeline-definition-IT6M3QCI-SysEcQCC.js.map} +1 -1
  110. package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js → treemap-GDKQZRPO-d0AbKEc4.js} +5 -5
  111. package/dist/static/assets/{treemap-GDKQZRPO-Bsqu3wIy.js.map → treemap-GDKQZRPO-d0AbKEc4.js.map} +1 -1
  112. package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js → xychartDiagram-PRI3JC2R-CmSQMxUh.js} +3 -3
  113. package/dist/static/assets/{xychartDiagram-PRI3JC2R-RZy33lFF.js.map → xychartDiagram-PRI3JC2R-CmSQMxUh.js.map} +1 -1
  114. package/dist/static/index.html +2 -2
  115. package/dist/tools/fs.js +1 -1
  116. package/package.json +9 -7
  117. package/dist/agent-priming.js +0 -2051
  118. package/dist/apps/installed-file.js +0 -207
  119. package/dist/apps/runtime-port.js +0 -91
  120. package/dist/docs/dominds-agent-priming.md +0 -218
  121. package/dist/docs/dominds-agent-priming.zh.md +0 -196
  122. package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
  123. package/dist/docs/keep-going.md +0 -176
  124. package/dist/docs/keep-going.zh.md +0 -162
  125. package/dist/docs/kernel-app-architecture.md +0 -286
  126. package/dist/docs/kernel-app-architecture.zh.md +0 -285
  127. package/dist/docs/showing-by-doing.md +0 -208
  128. package/dist/docs/showing-by-doing.zh.md +0 -177
  129. package/dist/docs/team-mgmt-toolset.md +0 -482
  130. package/dist/docs/team-mgmt-toolset.zh.md +0 -426
  131. package/dist/llm/driver-entry.js +0 -28
  132. package/dist/llm/driver-v2/context-health.js +0 -121
  133. package/dist/llm/driver-v2/context.js +0 -56
  134. package/dist/llm/driver-v2/core.js +0 -1545
  135. package/dist/llm/driver-v2/index.js +0 -26
  136. package/dist/llm/driver-v2/orchestrator.js +0 -158
  137. package/dist/llm/driver-v2/policy.js +0 -129
  138. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +0 -73
  139. package/dist/llm/driver-v2/round.js +0 -366
  140. package/dist/llm/driver-v2/runtime-utils.js +0 -365
  141. package/dist/llm/driver-v2/saying-events.js +0 -20
  142. package/dist/llm/driver-v2/subdialog-txn.js +0 -42
  143. package/dist/llm/driver-v2/supdialog-response.js +0 -400
  144. package/dist/llm/driver-v2/tellask-bridge.js +0 -1148
  145. package/dist/llm/driver-v2/types.js +0 -10
  146. package/dist/llm/driver-v2-ref-only/context-health.js +0 -121
  147. package/dist/llm/driver-v2-ref-only/context.js +0 -17
  148. package/dist/llm/driver-v2-ref-only/core.js +0 -1710
  149. package/dist/llm/driver-v2-ref-only/index.js +0 -26
  150. package/dist/llm/driver-v2-ref-only/orchestrator.js +0 -158
  151. package/dist/llm/driver-v2-ref-only/policy.js +0 -129
  152. package/dist/llm/driver-v2-ref-only/restore-dialog-hierarchy.js +0 -73
  153. package/dist/llm/driver-v2-ref-only/round.js +0 -366
  154. package/dist/llm/driver-v2-ref-only/runtime-utils.js +0 -473
  155. package/dist/llm/driver-v2-ref-only/saying-events.js +0 -18
  156. package/dist/llm/driver-v2-ref-only/subdialog-txn.js +0 -42
  157. package/dist/llm/driver-v2-ref-only/supdialog-response.js +0 -453
  158. package/dist/llm/driver-v2-ref-only/tellask-bridge.js +0 -1178
  159. package/dist/llm/driver-v2-ref-only/types.js +0 -10
  160. package/dist/llm/driver.js +0 -4093
  161. package/dist/minds/promptdocs.js +0 -263
  162. package/dist/server/prompts-routes.js +0 -545
  163. package/dist/shared/team-mgmt-manual.js +0 -120
  164. package/dist/shared/types/prompts.js +0 -2
  165. package/dist/shared/types/tellask.js +0 -8
  166. package/dist/showing-by-doing.js +0 -1091
  167. package/dist/snippets/README.en.md +0 -3
  168. package/dist/snippets/README.md +0 -4
  169. package/dist/static/assets/index-DMbwqOm6.js.map +0 -1
  170. package/dist/tellask.js +0 -439
  171. package/dist/tools/context-health.js +0 -177
  172. package/dist/tools/diag.js +0 -583
  173. package/dist/tools/prompts/memory/en/errors.md +0 -155
  174. package/dist/tools/prompts/memory/en/index.md +0 -47
  175. package/dist/tools/prompts/memory/en/principles.md +0 -87
  176. package/dist/tools/prompts/memory/en/scenarios.md +0 -174
  177. package/dist/tools/prompts/memory/en/tools.md +0 -129
  178. package/dist/tools/prompts/memory/zh/errors.md +0 -155
  179. package/dist/tools/prompts/memory/zh/index.md +0 -47
  180. package/dist/tools/prompts/memory/zh/principles.md +0 -89
  181. package/dist/tools/prompts/memory/zh/scenarios.md +0 -174
  182. package/dist/tools/prompts/memory/zh/tools.md +0 -129
  183. package/dist/tools/team-mgmt.js +0 -3487
  184. package/dist/utils/task-doc.js +0 -236
@@ -1,51 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- /**
4
- * enable subcommand for dominds CLI (Apps)
5
- *
6
- * Usage:
7
- * dominds enable <appId> [--port <port>]
8
- */
9
3
  Object.defineProperty(exports, "__esModule", { value: true });
10
4
  exports.main = main;
11
- const assigned_port_1 = require("../apps/assigned-port");
12
- const resolution_file_1 = require("../apps/resolution-file");
5
+ const configuration_file_1 = require("../apps/configuration-file");
6
+ const manifest_1 = require("../apps/manifest");
7
+ const workspace_app_state_1 = require("../apps/workspace-app-state");
13
8
  function printHelp() {
14
9
  console.log(`Usage:
15
- dominds enable <appId> [--port <port>]
16
-
17
- Options:
18
- --port <port> Set frontend port (stored in ${resolution_file_1.APPS_RESOLUTION_REL_PATH}); use 0 to clear
10
+ dominds enable <appId>
19
11
  `);
20
12
  }
21
13
  function parseArgs(argv) {
22
14
  const positional = [];
23
- let port = null;
24
- for (let i = 0; i < argv.length; i += 1) {
25
- const a = argv[i];
26
- if (a === '--help' || a === '-h') {
15
+ for (const arg of argv) {
16
+ if (arg === '--help' || arg === '-h') {
27
17
  printHelp();
28
18
  process.exit(0);
29
19
  }
30
- if (a === '--port') {
31
- const v = argv[i + 1];
32
- if (!v)
33
- throw new Error('Missing value for --port');
34
- const n = Number(v);
35
- if (!Number.isFinite(n) || n < 0 || !Number.isInteger(n)) {
36
- throw new Error(`Invalid --port value: ${v}`);
37
- }
38
- port = n;
39
- i += 1;
40
- continue;
41
- }
42
- if (a.startsWith('-'))
43
- throw new Error(`Unknown option: ${a}`);
44
- positional.push(a);
20
+ if (arg.startsWith('-'))
21
+ throw new Error(`Unknown option: ${arg}`);
22
+ positional.push(arg);
45
23
  }
46
24
  if (positional.length !== 1)
47
25
  throw new Error('enable requires exactly one <appId>');
48
- return { appId: positional[0], port };
26
+ return { appId: positional[0] };
49
27
  }
50
28
  async function main() {
51
29
  let args;
@@ -59,40 +37,24 @@ async function main() {
59
37
  return;
60
38
  }
61
39
  const rtwsRootAbs = process.cwd();
62
- const loaded = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
63
- if (loaded.kind === 'error') {
64
- console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loaded.errorText}`);
40
+ if (!(await (0, manifest_1.hasRtwsDeclaredAppDependency)({ rtwsRootAbs, appId: args.appId }))) {
41
+ console.error(`Error: app '${args.appId}' is not declared in .minds/app.yaml dependencies`);
65
42
  process.exit(1);
66
43
  return;
67
44
  }
68
- const found = (0, resolution_file_1.findResolvedApp)(loaded.file, args.appId);
69
- if (!found) {
70
- console.error(`Error: app '${args.appId}' not installed`);
45
+ const loadedConfig = await (0, configuration_file_1.loadAppsConfigurationFile)({ rtwsRootAbs });
46
+ if (loadedConfig.kind === 'error') {
47
+ console.error(`Error: failed to read .apps/configuration.yaml: ${loadedConfig.errorText}`);
71
48
  process.exit(1);
72
49
  return;
73
50
  }
74
- let next = (0, resolution_file_1.setResolvedAppUserEnabled)({
75
- existing: loaded.file,
51
+ const nextConfig = (0, configuration_file_1.setAppDisabledInConfiguration)({
52
+ existing: loadedConfig.file,
76
53
  appId: args.appId,
77
- userEnabled: true,
54
+ disabled: false,
78
55
  });
79
- if (args.port !== null) {
80
- next = (0, resolution_file_1.setResolvedAppAssignedPort)({
81
- existing: next,
82
- appId: args.appId,
83
- assignedPort: args.port === 0 ? null : args.port,
84
- });
85
- }
86
- else {
87
- const assignedPort = await (0, assigned_port_1.resolveStableAssignedPort)({
88
- appId: found.id,
89
- installJson: found.installJson,
90
- existingApps: next.apps,
91
- existingAssignedPort: found.assignedPort,
92
- });
93
- next = (0, resolution_file_1.setResolvedAppAssignedPort)({ existing: next, appId: args.appId, assignedPort });
94
- }
95
- await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: next });
56
+ await (0, configuration_file_1.writeAppsConfigurationFileIfChanged)({ rtwsRootAbs, file: nextConfig });
57
+ await (0, workspace_app_state_1.refreshAppsDerivedState)({ rtwsRootAbs });
96
58
  console.log(`Enabled app '${args.appId}'`);
97
59
  }
98
60
  if (require.main === module) {
@@ -11,12 +11,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.main = main;
14
- const promises_1 = __importDefault(require("fs/promises"));
15
- const path_1 = __importDefault(require("path"));
14
+ const promises_1 = __importDefault(require("node:fs/promises"));
15
+ const node_path_1 = __importDefault(require("node:path"));
16
16
  const app_lock_file_1 = require("../apps/app-lock-file");
17
- const assigned_port_1 = require("../apps/assigned-port");
18
- const resolution_file_1 = require("../apps/resolution-file");
17
+ const configuration_file_1 = require("../apps/configuration-file");
18
+ const manifest_1 = require("../apps/manifest");
19
19
  const run_app_json_1 = require("../apps/run-app-json");
20
+ const workspace_app_state_1 = require("../apps/workspace-app-state");
20
21
  function printHelp() {
21
22
  console.log(`Usage:
22
23
  dominds install <spec|path> [--local] [--id <appId>] [--enable] [--force]
@@ -24,12 +25,12 @@ function printHelp() {
24
25
  Options:
25
26
  --local Treat <spec|path> as a local package directory (dev package)
26
27
  --id <appId> Require app id (must match app --json appId)
27
- --enable Enable immediately after install
28
- --force Replace existing installed entry with the same id
28
+ --enable Remove the app from disabledApps after install
29
+ --force Reserved for future use; currently ignored
29
30
 
30
31
  Notes:
31
- - State is stored in ${resolution_file_1.APPS_RESOLUTION_REL_PATH} under the current rtws (process.cwd()).
32
- - dominds installs apps by running '<app> --json' via npx or local package bin.
32
+ - install adds the app to .minds/app.yaml dependencies.
33
+ - app resolution source is determined dynamically via .apps/configuration.yaml resolutionStrategy.
33
34
  `);
34
35
  }
35
36
  function parseArgs(argv) {
@@ -39,45 +40,43 @@ function parseArgs(argv) {
39
40
  let local = false;
40
41
  let idOverride = null;
41
42
  for (let i = 0; i < argv.length; i += 1) {
42
- const a = argv[i];
43
- if (a === '--help' || a === '-h') {
43
+ const arg = argv[i];
44
+ if (arg === '--help' || arg === '-h') {
44
45
  printHelp();
45
46
  process.exit(0);
46
47
  }
47
- if (a === '--force') {
48
+ if (arg === '--force') {
48
49
  force = true;
49
50
  continue;
50
51
  }
51
- if (a === '--enable') {
52
+ if (arg === '--enable') {
52
53
  enable = true;
53
54
  continue;
54
55
  }
55
- if (a === '--local') {
56
+ if (arg === '--local') {
56
57
  local = true;
57
58
  continue;
58
59
  }
59
- if (a === '--id') {
60
- const v = argv[i + 1];
61
- if (!v)
60
+ if (arg === '--id') {
61
+ const value = argv[i + 1];
62
+ if (!value)
62
63
  throw new Error('Missing value for --id');
63
- idOverride = v.trim() || null;
64
+ idOverride = value.trim() || null;
64
65
  i += 1;
65
66
  continue;
66
67
  }
67
- if (a.startsWith('-')) {
68
- throw new Error(`Unknown option: ${a}`);
69
- }
70
- positional.push(a);
68
+ if (arg.startsWith('-'))
69
+ throw new Error(`Unknown option: ${arg}`);
70
+ positional.push(arg);
71
71
  }
72
- if (positional.length !== 1) {
72
+ if (positional.length !== 1)
73
73
  throw new Error('install requires exactly one <spec|path>');
74
- }
75
74
  return { specOrPath: positional[0], force, enable, local, idOverride };
76
75
  }
77
- async function pathIsDirectory(p) {
76
+ async function pathIsDirectory(pathAbs) {
78
77
  try {
79
- const st = await promises_1.default.stat(p);
80
- return st.isDirectory();
78
+ const stat = await promises_1.default.stat(pathAbs);
79
+ return stat.isDirectory();
81
80
  }
82
81
  catch {
83
82
  return false;
@@ -101,14 +100,8 @@ async function main() {
101
100
  process.exit(1);
102
101
  return;
103
102
  }
104
- const localAbs = path_1.default.resolve(rtwsRootAbs, specOrPath);
103
+ const localAbs = node_path_1.default.resolve(rtwsRootAbs, specOrPath);
105
104
  const shouldUseLocal = args.local || (await pathIsDirectory(localAbs));
106
- const loadedResolution = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
107
- if (loadedResolution.kind === 'error') {
108
- console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loadedResolution.errorText}`);
109
- process.exit(1);
110
- return;
111
- }
112
105
  const installJson = shouldUseLocal
113
106
  ? await (0, run_app_json_1.runDomindsAppJsonViaLocalPackage)({ packageRootAbs: localAbs })
114
107
  : await (0, run_app_json_1.runDomindsAppJsonViaNpx)({ spec: specOrPath, cwdAbs: rtwsRootAbs });
@@ -117,62 +110,63 @@ async function main() {
117
110
  process.exit(1);
118
111
  return;
119
112
  }
120
- const prev = loadedResolution.file.apps.find((a) => a.id === installJson.appId) ?? null;
121
- if (prev && !args.force) {
122
- console.error(`Error: app '${installJson.appId}' already installed. Use 'dominds update ${installJson.appId}' or 'dominds install ... --force'.`);
113
+ const loadedManifest = await (0, manifest_1.loadDomindsAppManifest)({
114
+ packageRootAbs: rtwsRootAbs,
115
+ manifestRelPath: manifest_1.DEFAULT_DOMINDS_APP_MANIFEST_REL_PATH,
116
+ });
117
+ const manifest = loadedManifest.kind === 'ok' ? loadedManifest.manifest : (0, manifest_1.makeDefaultRtwsAppManifest)();
118
+ const nextManifest = (0, manifest_1.upsertManifestDependency)({
119
+ manifest,
120
+ dependency: { id: installJson.appId },
121
+ });
122
+ await (0, manifest_1.writeDomindsAppManifestIfChanged)({
123
+ packageRootAbs: rtwsRootAbs,
124
+ manifestRelPath: manifest_1.DEFAULT_DOMINDS_APP_MANIFEST_REL_PATH,
125
+ manifest: nextManifest,
126
+ });
127
+ const loadedConfig = await (0, configuration_file_1.loadAppsConfigurationFile)({ rtwsRootAbs });
128
+ if (loadedConfig.kind === 'error') {
129
+ console.error(`Error: failed to read .apps/configuration.yaml: ${loadedConfig.errorText}`);
123
130
  process.exit(1);
124
131
  return;
125
132
  }
126
- const userEnabled = args.enable || (prev ? prev.userEnabled : false);
127
- const enabled = userEnabled;
128
- const assignedPort = await (0, assigned_port_1.resolveStableAssignedPort)({
133
+ const nextConfig = (0, configuration_file_1.setAppDisabledInConfiguration)({
134
+ existing: loadedConfig.file,
129
135
  appId: installJson.appId,
130
- installJson,
131
- existingApps: loadedResolution.file.apps,
132
- existingAssignedPort: prev?.assignedPort ?? null,
136
+ disabled: args.enable
137
+ ? false
138
+ : isAppCurrentlyDisabled(loadedConfig.file.disabledApps, installJson.appId),
133
139
  });
134
- const entry = {
135
- id: installJson.appId,
136
- enabled,
137
- userEnabled,
138
- source: shouldUseLocal
139
- ? { kind: 'local', pathAbs: localAbs }
140
- : { kind: 'npx', spec: specOrPath },
141
- assignedPort,
142
- installJson,
143
- };
144
- const nextFile = (0, resolution_file_1.upsertResolvedApp)({ existing: loadedResolution.file, next: entry });
145
- await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: nextFile });
146
- try {
147
- const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
148
- if (loadedLock.kind === 'error') {
149
- console.error(`Warning: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
150
- }
151
- else {
152
- const nextLock = (0, app_lock_file_1.upsertLockedApp)({
153
- existing: loadedLock.file,
154
- next: {
155
- id: entry.id,
156
- source: entry.source,
157
- package: {
158
- name: entry.installJson.package.name,
159
- version: entry.installJson.package.version,
160
- },
161
- },
162
- });
163
- await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
164
- }
165
- }
166
- catch (err) {
167
- console.error(`Warning: failed to update .minds/app-lock.yaml: ${err instanceof Error ? err.message : String(err)}`);
140
+ await (0, configuration_file_1.writeAppsConfigurationFileIfChanged)({ rtwsRootAbs, file: nextConfig });
141
+ const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
142
+ if (loadedLock.kind === 'error') {
143
+ console.error(`Error: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
144
+ process.exit(1);
145
+ return;
168
146
  }
147
+ const nextLock = (0, app_lock_file_1.upsertLockedApp)({
148
+ existing: loadedLock.file,
149
+ next: {
150
+ id: installJson.appId,
151
+ package: {
152
+ name: installJson.package.name,
153
+ version: installJson.package.version,
154
+ },
155
+ },
156
+ });
157
+ await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
158
+ await (0, workspace_app_state_1.refreshAppsDerivedState)({ rtwsRootAbs });
159
+ void args.force;
169
160
  console.log(shouldUseLocal
170
- ? `Installed app '${entry.id}' from local package: ${localAbs}`
171
- : `Installed app '${entry.id}' via npx spec: ${specOrPath}`);
172
- if (enabled) {
173
- console.log(`Enabled app '${entry.id}'`);
161
+ ? `Installed app '${installJson.appId}' from local package: ${localAbs}`
162
+ : `Installed app '${installJson.appId}' via resolver strategy seed: ${specOrPath}`);
163
+ if (args.enable) {
164
+ console.log(`Enabled app '${installJson.appId}'`);
174
165
  }
175
166
  }
167
+ function isAppCurrentlyDisabled(disabledApps, appId) {
168
+ return (disabledApps ?? []).includes(appId);
169
+ }
176
170
  if (require.main === module) {
177
171
  main().catch((err) => {
178
172
  console.error('Unhandled error:', err);
@@ -1,19 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- /**
4
- * uninstall subcommand for dominds CLI (Apps)
5
- *
6
- * Usage:
7
- * dominds uninstall <appId> [--purge]
8
- */
9
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
10
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
11
5
  };
12
6
  Object.defineProperty(exports, "__esModule", { value: true });
13
7
  exports.main = main;
14
- const promises_1 = __importDefault(require("fs/promises"));
15
- const path_1 = __importDefault(require("path"));
16
- const resolution_file_1 = require("../apps/resolution-file");
8
+ const promises_1 = __importDefault(require("node:fs/promises"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const app_lock_file_1 = require("../apps/app-lock-file");
11
+ const configuration_file_1 = require("../apps/configuration-file");
12
+ const manifest_1 = require("../apps/manifest");
13
+ const workspace_app_state_1 = require("../apps/workspace-app-state");
17
14
  function printHelp() {
18
15
  console.log(`Usage:
19
16
  dominds uninstall <appId> [--purge]
@@ -25,18 +22,18 @@ Options:
25
22
  function parseArgs(argv) {
26
23
  const positional = [];
27
24
  let purge = false;
28
- for (const a of argv) {
29
- if (a === '--help' || a === '-h') {
25
+ for (const arg of argv) {
26
+ if (arg === '--help' || arg === '-h') {
30
27
  printHelp();
31
28
  process.exit(0);
32
29
  }
33
- if (a === '--purge') {
30
+ if (arg === '--purge') {
34
31
  purge = true;
35
32
  continue;
36
33
  }
37
- if (a.startsWith('-'))
38
- throw new Error(`Unknown option: ${a}`);
39
- positional.push(a);
34
+ if (arg.startsWith('-'))
35
+ throw new Error(`Unknown option: ${arg}`);
36
+ positional.push(arg);
40
37
  }
41
38
  if (positional.length !== 1)
42
39
  throw new Error('uninstall requires exactly one <appId>');
@@ -54,23 +51,49 @@ async function main() {
54
51
  return;
55
52
  }
56
53
  const rtwsRootAbs = process.cwd();
57
- const loaded = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
58
- if (loaded.kind === 'error') {
59
- console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loaded.errorText}`);
54
+ const loadedManifest = await (0, manifest_1.loadDomindsAppManifest)({
55
+ packageRootAbs: rtwsRootAbs,
56
+ manifestRelPath: manifest_1.DEFAULT_DOMINDS_APP_MANIFEST_REL_PATH,
57
+ });
58
+ const manifest = loadedManifest.kind === 'ok' ? loadedManifest.manifest : (0, manifest_1.makeDefaultRtwsAppManifest)();
59
+ const nextManifest = (0, manifest_1.removeManifestDependency)({
60
+ manifest,
61
+ dependencyId: args.appId,
62
+ });
63
+ if (nextManifest === manifest) {
64
+ console.error(`Error: app '${args.appId}' is not declared in .minds/app.yaml dependencies`);
60
65
  process.exit(1);
61
66
  return;
62
67
  }
63
- const found = (0, resolution_file_1.findResolvedApp)(loaded.file, args.appId);
64
- if (!found) {
65
- console.error(`Error: app '${args.appId}' not installed`);
68
+ await (0, manifest_1.writeDomindsAppManifestIfChanged)({
69
+ packageRootAbs: rtwsRootAbs,
70
+ manifestRelPath: manifest_1.DEFAULT_DOMINDS_APP_MANIFEST_REL_PATH,
71
+ manifest: nextManifest,
72
+ });
73
+ const loadedConfig = await (0, configuration_file_1.loadAppsConfigurationFile)({ rtwsRootAbs });
74
+ if (loadedConfig.kind === 'error') {
75
+ console.error(`Error: failed to read .apps/configuration.yaml: ${loadedConfig.errorText}`);
76
+ process.exit(1);
77
+ return;
78
+ }
79
+ const nextConfig = (0, configuration_file_1.setAppDisabledInConfiguration)({
80
+ existing: loadedConfig.file,
81
+ appId: args.appId,
82
+ disabled: false,
83
+ });
84
+ await (0, configuration_file_1.writeAppsConfigurationFileIfChanged)({ rtwsRootAbs, file: nextConfig });
85
+ const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
86
+ if (loadedLock.kind === 'error') {
87
+ console.error(`Error: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
66
88
  process.exit(1);
67
89
  return;
68
90
  }
69
- const next = (0, resolution_file_1.removeResolvedApp)({ existing: loaded.file, appId: args.appId });
70
- await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: next });
91
+ const nextLock = (0, app_lock_file_1.removeLockedApp)({ existing: loadedLock.file, appId: args.appId });
92
+ await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
93
+ await (0, workspace_app_state_1.refreshAppsDerivedState)({ rtwsRootAbs });
71
94
  if (args.purge) {
72
- const rtwsAppDirAbs = path_1.default.resolve(rtwsRootAbs, '.apps', args.appId);
73
- await promises_1.default.rm(rtwsAppDirAbs, { recursive: true, force: true });
95
+ const appDirAbs = node_path_1.default.resolve(rtwsRootAbs, '.apps', args.appId);
96
+ await promises_1.default.rm(appDirAbs, { recursive: true, force: true });
74
97
  console.log(`Uninstalled app '${args.appId}' (purged rtws state: .apps/${args.appId}/)`);
75
98
  }
76
99
  else {
@@ -1,44 +1,33 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- /**
4
- * update subcommand for dominds CLI (Apps)
5
- *
6
- * Usage:
7
- * dominds update [<appId>]
8
- */
9
- var __importDefault = (this && this.__importDefault) || function (mod) {
10
- return (mod && mod.__esModule) ? mod : { "default": mod };
11
- };
12
3
  Object.defineProperty(exports, "__esModule", { value: true });
13
4
  exports.main = main;
14
- const path_1 = __importDefault(require("path"));
15
5
  const app_lock_file_1 = require("../apps/app-lock-file");
16
- const assigned_port_1 = require("../apps/assigned-port");
17
- const resolution_file_1 = require("../apps/resolution-file");
18
- const run_app_json_1 = require("../apps/run-app-json");
6
+ const manifest_1 = require("../apps/manifest");
7
+ const workspace_app_state_1 = require("../apps/workspace-app-state");
19
8
  function printHelp() {
20
9
  console.log(`Usage:
21
10
  dominds update [<appId>]
22
11
 
23
12
  Notes:
24
- - When <appId> is omitted, updates all installed apps by re-running their '<app> --json' handshake.
25
- - Updates installJson and package root info as returned by the app.
13
+ - Re-runs dynamic app resolution using .minds/app.yaml + .apps/configuration.yaml.
14
+ - Refreshes .apps/resolution.yaml and .minds/app-lock.yaml.
26
15
  `);
27
16
  }
28
17
  function parseArgs(argv) {
29
18
  const positional = [];
30
- for (const a of argv) {
31
- if (a === '--help' || a === '-h') {
19
+ for (const arg of argv) {
20
+ if (arg === '--help' || arg === '-h') {
32
21
  printHelp();
33
22
  process.exit(0);
34
23
  }
35
- if (a.startsWith('-'))
36
- throw new Error(`Unknown option: ${a}`);
37
- positional.push(a);
24
+ if (arg.startsWith('-'))
25
+ throw new Error(`Unknown option: ${arg}`);
26
+ positional.push(arg);
38
27
  }
39
28
  if (positional.length > 1)
40
29
  throw new Error('update accepts at most one <appId>');
41
- return { appId: positional.length === 1 ? positional[0] : null };
30
+ return { appId: positional[0] ?? null };
42
31
  }
43
32
  async function main() {
44
33
  let args;
@@ -52,75 +41,42 @@ async function main() {
52
41
  return;
53
42
  }
54
43
  const rtwsRootAbs = process.cwd();
55
- const loaded = await (0, resolution_file_1.loadAppsResolutionFile)({ rtwsRootAbs });
56
- if (loaded.kind === 'error') {
57
- console.error(`Error: failed to read ${resolution_file_1.APPS_RESOLUTION_REL_PATH}: ${loaded.errorText}`);
44
+ if (args.appId !== null &&
45
+ !(await (0, manifest_1.hasRtwsDeclaredAppDependency)({ rtwsRootAbs, appId: args.appId }))) {
46
+ console.error(`Error: app '${args.appId}' is not declared in .minds/app.yaml dependencies`);
58
47
  process.exit(1);
59
48
  return;
60
49
  }
50
+ const resolution = await (0, workspace_app_state_1.refreshAppsDerivedState)({ rtwsRootAbs });
61
51
  const loadedLock = await (0, app_lock_file_1.loadAppLockFile)({ rtwsRootAbs });
62
- const shouldUpdateLock = loadedLock.kind === 'ok';
63
52
  if (loadedLock.kind === 'error') {
64
- console.error(`Warning: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
53
+ console.error(`Error: failed to read .minds/app-lock.yaml: ${loadedLock.errorText}`);
54
+ process.exit(1);
55
+ return;
65
56
  }
66
- let nextLock = loadedLock.kind === 'ok' ? loadedLock.file : null;
67
- const targets = args.appId === null
68
- ? [...loaded.file.apps]
69
- : (() => {
70
- const found = (0, resolution_file_1.findResolvedApp)(loaded.file, args.appId);
71
- if (!found) {
72
- console.error(`Error: app '${args.appId}' not installed`);
73
- process.exit(1);
74
- return [];
75
- }
76
- return [found];
77
- })();
78
- let nextFile = loaded.file;
79
- for (const entry of targets) {
80
- const installJson = entry.source.kind === 'npx'
81
- ? await (0, run_app_json_1.runDomindsAppJsonViaNpx)({ spec: entry.source.spec, cwdAbs: rtwsRootAbs })
82
- : await (0, run_app_json_1.runDomindsAppJsonViaLocalPackage)({
83
- packageRootAbs: path_1.default.resolve(entry.source.pathAbs),
84
- });
85
- if (installJson.appId !== entry.id) {
86
- throw new Error(`Update failed: appId mismatch for '${entry.id}': got '${installJson.appId}' from --json handshake`);
87
- }
88
- const assignedPort = await (0, assigned_port_1.resolveStableAssignedPort)({
89
- appId: entry.id,
90
- installJson,
91
- existingApps: nextFile.apps,
92
- existingAssignedPort: entry.assignedPort,
93
- });
94
- const updated = {
95
- ...entry,
96
- assignedPort,
97
- installJson,
98
- };
99
- nextFile = (0, resolution_file_1.upsertResolvedApp)({ existing: nextFile, next: updated });
100
- if (shouldUpdateLock && nextLock) {
101
- nextLock = (0, app_lock_file_1.upsertLockedApp)({
102
- existing: nextLock,
103
- next: {
104
- id: updated.id,
105
- source: updated.source,
106
- package: {
107
- name: updated.installJson.package.name,
108
- version: updated.installJson.package.version,
109
- },
57
+ let nextLock = loadedLock.file;
58
+ for (const app of resolution.apps) {
59
+ if (args.appId !== null && app.id !== args.appId)
60
+ continue;
61
+ nextLock = (0, app_lock_file_1.upsertLockedApp)({
62
+ existing: nextLock,
63
+ next: {
64
+ id: app.id,
65
+ package: {
66
+ name: app.installJson.package.name,
67
+ version: app.installJson.package.version,
110
68
  },
111
- });
112
- }
113
- console.log(`Updated app '${entry.id}'`);
69
+ },
70
+ });
114
71
  }
115
- await (0, resolution_file_1.writeAppsResolutionFile)({ rtwsRootAbs, file: nextFile });
116
- if (shouldUpdateLock && nextLock) {
117
- try {
118
- await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
119
- }
120
- catch (err) {
121
- console.error(`Warning: failed to update .minds/app-lock.yaml: ${err instanceof Error ? err.message : String(err)}`);
72
+ await (0, app_lock_file_1.writeAppLockFileIfChanged)({ rtwsRootAbs, file: nextLock });
73
+ if (args.appId === null) {
74
+ for (const app of resolution.apps) {
75
+ console.log(`Updated app '${app.id}'`);
122
76
  }
77
+ return;
123
78
  }
79
+ console.log(`Updated app '${args.appId}'`);
124
80
  }
125
81
  if (require.main === module) {
126
82
  main().catch((err) => {
@@ -56,7 +56,8 @@ Goal: close the loop for “dependency resolution + observability + regressabili
56
56
  - optional missing/disabled: silently skipped (must not block startup; Problems not required; debug logs allowed).
57
57
  - required missing/disabled: must not block startup; must be observable in WebUI Problems; related capability enters defunc/unavailable.
58
58
  - required disable propagation:
59
- - `<rtws>/.apps/resolution.yaml` must represent both user intent (explicit user disable) and the propagated effective state.
59
+ - `<rtws>/.apps/configuration.yaml` must represent explicit user disables (`disabledApps`).
60
+ - `<rtws>/.apps/resolution.yaml` must only record the resolved effective enabled state.
60
61
  - when dependencies recover, propagated disables must auto-recover (without overriding explicit user disables).
61
62
  - Override precedence (documented contract): `rtws override > app override > app defaults`.
62
63
  - Lock semantics (design contract): `.minds/app-lock.yaml` freezes dependency versions only; enable/disable must not jitter the lock.
@@ -153,11 +154,12 @@ Analogy (intuition only):
153
154
 
154
155
  - `.minds/app.yaml`: like `package.json` (declares the dependency graph + app default config such as `frontend.defaultPort`).
155
156
  - `.minds/app-lock.yaml`: like `pnpm-lock.yaml` (freezes dependency versions; should not jitter due to enable/disable).
156
- - `<rtws>/.apps/resolution.yaml`: like `pnpm-workspace.yaml` (for a given rtws: “where each app actually comes from / whether it’s enabled / whether its port is already pinned”).
157
+ - `<rtws>/.apps/configuration.yaml`: workspace user config (resolution strategy + explicit `disabledApps`).
158
+ - `<rtws>/.apps/resolution.yaml`: per-rtws resolution snapshot (“where each app resolved from / whether it is effectively enabled / whether its port is already pinned”).
157
159
 
158
160
  Key semantics:
159
161
 
160
- - enable/disable operations must only affect `<rtws>/.apps/resolution.yaml`.
162
+ - enable/disable operations must only affect `<rtws>/.apps/configuration.yaml.disabledApps`.
161
163
  - dependencies can be declared as `required` vs `optional`:
162
164
  - disabling a `required` dependency must transitively make dependents _effectively disabled_ (at minimum observable via UI/Problems).
163
165
  - disabling an `optional` dependency must not disable dependents.
@@ -180,14 +182,17 @@ Recommended principles:
180
182
  (Current: implemented) existing anchors:
181
183
 
182
184
  - JSON schema: `dominds/main/apps/app-json.ts` (`DomindsAppInstallJsonV1`).
185
+ - Apps configuration file: `dominds/main/apps/configuration-file.ts`.
183
186
  - Apps resolution file: `dominds/main/apps/resolution-file.ts`.
184
187
 
185
- (Current: implemented) the kernel treats `<rtws>/.apps/resolution.yaml` as **overlay + strategy**:
188
+ (Current: implemented) the kernel now splits `<rtws>/.apps/configuration.yaml` from `<rtws>/.apps/resolution.yaml`:
186
189
 
187
- - If the file exists: `apps[]` is the overlay (stores `enabled` / `assignedPort` / `source` / `installJson`), and `resolutionStrategy?` (if present) overrides the default strategy.
188
- - If the file is missing: the overlay is empty, and the strategy falls back to defaults (`order=['local']`, `localRoots=['dominds-apps']`).
190
+ - `configuration.yaml` carries user config: `resolutionStrategy?` (if present) overrides the default strategy, and `disabledApps` records explicit disables.
191
+ - `resolution.yaml` carries derived state only: `apps[]` stores `enabled` / `assignedPort` / `source` / `installJson`.
192
+ - If `configuration.yaml` is missing, strategy falls back to defaults (`order=['local']`, `localRoots=['dominds-apps']`) and no explicit disables apply.
193
+ - If `resolution.yaml` is missing, the snapshot starts empty and the kernel re-materializes it from the declared dependency graph.
189
194
 
190
- So even without `<rtws>/.apps/resolution.yaml`, as long as `.minds/app.yaml` declares dependencies, the kernel still resolves local apps via the default strategy; if the root manifest has no dependencies, the effective enabled apps set is empty.
195
+ So even without `<rtws>/.apps/configuration.yaml` or `<rtws>/.apps/resolution.yaml`, as long as `.minds/app.yaml` declares dependencies, the kernel still resolves local apps via the default strategy; if the root manifest has no dependencies, the effective enabled apps set is empty.
191
196
 
192
197
  ## App-provided `.minds/**` assets
193
198