@skaile/workspaces 1.0.0 → 1.2.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 (183) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/{asset-feeds-677S5NX7.js → asset-feeds-OBPWVUDL.js} +11 -11
  3. package/dist/{asset-feeds-677S5NX7.js.map → asset-feeds-OBPWVUDL.js.map} +1 -1
  4. package/dist/asset-manager/index.js +8 -8
  5. package/dist/asset-manager/installer.js +7 -7
  6. package/dist/asset-manager/src/index.d.ts +128 -0
  7. package/dist/asset-manager/src/index.d.ts.map +1 -1
  8. package/dist/bridge/drivers/claude-sdk.js +2 -2
  9. package/dist/bridge/drivers/codex.js +1 -1
  10. package/dist/bridge/drivers/continue.js +2 -2
  11. package/dist/bridge/drivers/echo.js +1 -1
  12. package/dist/bridge/drivers/gemini.js +3 -3
  13. package/dist/bridge/drivers/goose.js +2 -2
  14. package/dist/bridge/drivers/omp.js +1 -1
  15. package/dist/bridge/drivers/opencode.js +2 -2
  16. package/dist/bridge/drivers/qwen.js +3 -3
  17. package/dist/bridge/index.js +3 -3
  18. package/dist/{chunk-FLRHP3UC.js → chunk-35TLBMHX.js} +4 -4
  19. package/dist/{chunk-FLRHP3UC.js.map → chunk-35TLBMHX.js.map} +1 -1
  20. package/dist/{chunk-7X53KHQ4.js → chunk-4OVPB7SI.js} +4 -2
  21. package/dist/chunk-4OVPB7SI.js.map +1 -0
  22. package/dist/{chunk-6VUP6XHK.js → chunk-52XHXSBN.js} +3 -3
  23. package/dist/{chunk-6VUP6XHK.js.map → chunk-52XHXSBN.js.map} +1 -1
  24. package/dist/{chunk-NXC6IEL4.js → chunk-5AGARSQT.js} +267 -261
  25. package/dist/chunk-5AGARSQT.js.map +1 -0
  26. package/dist/{chunk-EXNTTJGP.js → chunk-BCJL2UNH.js} +3 -3
  27. package/dist/{chunk-EXNTTJGP.js.map → chunk-BCJL2UNH.js.map} +1 -1
  28. package/dist/{chunk-W53D5Q52.js → chunk-BM37QD6U.js} +3 -3
  29. package/dist/{chunk-W53D5Q52.js.map → chunk-BM37QD6U.js.map} +1 -1
  30. package/dist/{chunk-PLQVAEM2.js → chunk-CLUJLV7Z.js} +5 -5
  31. package/dist/{chunk-PLQVAEM2.js.map → chunk-CLUJLV7Z.js.map} +1 -1
  32. package/dist/{chunk-KSISPZV3.js → chunk-EPLYVB3L.js} +2 -2
  33. package/dist/{chunk-KSISPZV3.js.map → chunk-EPLYVB3L.js.map} +1 -1
  34. package/dist/{chunk-SFVEHSCI.js → chunk-KAWKKMU4.js} +253 -14
  35. package/dist/chunk-KAWKKMU4.js.map +1 -0
  36. package/dist/{chunk-UTHEIPEY.js → chunk-KVZ6XKVN.js} +56 -14
  37. package/dist/chunk-KVZ6XKVN.js.map +1 -0
  38. package/dist/{chunk-3KPNDTMR.js → chunk-MG6UIS7G.js} +3 -3
  39. package/dist/{chunk-3KPNDTMR.js.map → chunk-MG6UIS7G.js.map} +1 -1
  40. package/dist/{chunk-GYPA2Q7F.js → chunk-MQEZE6TU.js} +25 -4
  41. package/dist/chunk-MQEZE6TU.js.map +1 -0
  42. package/dist/{chunk-2D5YE3FL.js → chunk-NUS5L5ZJ.js} +104 -6
  43. package/dist/chunk-NUS5L5ZJ.js.map +1 -0
  44. package/dist/{chunk-LKOMH3QC.js → chunk-OIGYDVCM.js} +3 -3
  45. package/dist/{chunk-LKOMH3QC.js.map → chunk-OIGYDVCM.js.map} +1 -1
  46. package/dist/{chunk-N5AE5SOC.js → chunk-QVE3ILCY.js} +2 -2
  47. package/dist/{chunk-N5AE5SOC.js.map → chunk-QVE3ILCY.js.map} +1 -1
  48. package/dist/{chunk-K5JIAHDV.js → chunk-TTTLCSEQ.js} +32 -28
  49. package/dist/chunk-TTTLCSEQ.js.map +1 -0
  50. package/dist/{chunk-6AD3NS7R.js → chunk-U5J77IIZ.js} +4 -4
  51. package/dist/{chunk-6AD3NS7R.js.map → chunk-U5J77IIZ.js.map} +1 -1
  52. package/dist/{chunk-OYMSCV7T.js → chunk-UY5Q2NZH.js} +3 -3
  53. package/dist/{chunk-OYMSCV7T.js.map → chunk-UY5Q2NZH.js.map} +1 -1
  54. package/dist/{chunk-WSQ5J7CE.js → chunk-VCBLXF7D.js} +113 -53
  55. package/dist/chunk-VCBLXF7D.js.map +1 -0
  56. package/dist/{chunk-43JDPQJ4.js → chunk-W65IK4MH.js} +5 -5
  57. package/dist/{chunk-43JDPQJ4.js.map → chunk-W65IK4MH.js.map} +1 -1
  58. package/dist/{chunk-XD7GYMAU.js → chunk-XWLVIEWD.js} +7 -7
  59. package/dist/{chunk-XD7GYMAU.js.map → chunk-XWLVIEWD.js.map} +1 -1
  60. package/dist/{chunk-DW5MIJK3.js → chunk-YI5OZ7QO.js} +2 -2
  61. package/dist/{chunk-DW5MIJK3.js.map → chunk-YI5OZ7QO.js.map} +1 -1
  62. package/dist/{chunk-2ZK7M2SG.js → chunk-ZUE2PIJ5.js} +3 -3
  63. package/dist/{chunk-2ZK7M2SG.js.map → chunk-ZUE2PIJ5.js.map} +1 -1
  64. package/dist/cli/index.js +232 -56
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/cli/src/commands/catalog.d.ts +38 -0
  67. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  68. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  69. package/dist/cli/src/commands/project.d.ts +9 -0
  70. package/dist/cli/src/commands/project.d.ts.map +1 -1
  71. package/dist/cli/src/commands/tree.d.ts.map +1 -1
  72. package/dist/cli/src/commands/why.d.ts.map +1 -1
  73. package/dist/cli/src/helpers.d.ts +35 -0
  74. package/dist/cli/src/helpers.d.ts.map +1 -1
  75. package/dist/connectors/config.js +7 -7
  76. package/dist/connectors/index.js +8 -8
  77. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  78. package/dist/core/index.js +6 -6
  79. package/dist/core/runtime-assets.js +2 -2
  80. package/dist/core/src/index.d.ts +1 -1
  81. package/dist/core/src/index.d.ts.map +1 -1
  82. package/dist/core/src/repo-manager.d.ts +19 -1
  83. package/dist/core/src/repo-manager.d.ts.map +1 -1
  84. package/dist/core/src/walker.d.ts +7 -0
  85. package/dist/core/src/walker.d.ts.map +1 -1
  86. package/dist/core/workspace-config.js +1 -1
  87. package/dist/deploy/index.js +6 -6
  88. package/dist/discovery/index.js +1 -1
  89. package/dist/discovery/src/discover.d.ts.map +1 -1
  90. package/dist/discovery/src/index.d.ts +1 -1
  91. package/dist/discovery/src/index.d.ts.map +1 -1
  92. package/dist/discovery/src/reference-lint.d.ts +30 -0
  93. package/dist/discovery/src/reference-lint.d.ts.map +1 -1
  94. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  95. package/dist/{ensure-sources-OCMHK7LT.js → ensure-sources-BQI2TOZZ.js} +16 -9
  96. package/dist/ensure-sources-BQI2TOZZ.js.map +1 -0
  97. package/dist/factory-assets/connectors/box/CONNECTOR.md +33 -0
  98. package/dist/factory-assets/connectors/box/driver.d.ts +27 -0
  99. package/dist/factory-assets/connectors/box/driver.d.ts.map +1 -0
  100. package/dist/factory-assets/connectors/box.d.ts +2 -0
  101. package/dist/factory-assets/connectors/box.js +20 -0
  102. package/dist/factory-assets/connectors/box.js.map +1 -0
  103. package/dist/factory-assets/connectors/deploy.js +8 -8
  104. package/dist/factory-assets/connectors/devserver.js +8 -8
  105. package/dist/factory-assets/connectors/flow/adapter.js +8 -8
  106. package/dist/factory-assets/connectors/flow/engine.js +6 -6
  107. package/dist/factory-assets/connectors/flow/run-flow.js +9 -9
  108. package/dist/factory-assets/connectors/flow.js +8 -8
  109. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  110. package/dist/factory-assets/connectors/git.js +8 -8
  111. package/dist/factory-assets/connectors/gmail.js +8 -8
  112. package/dist/factory-assets/connectors/googledrive.js +8 -8
  113. package/dist/factory-assets/connectors/local.js +8 -8
  114. package/dist/factory-assets/connectors/mattermost.js +8 -8
  115. package/dist/factory-assets/connectors/memory.js +8 -8
  116. package/dist/factory-assets/connectors/minio.js +8 -8
  117. package/dist/factory-assets/connectors/postgres.js +8 -8
  118. package/dist/factory-assets/connectors/s3.js +8 -8
  119. package/dist/factory-assets/connectors/sharepoint.js +8 -8
  120. package/dist/factory-assets/connectors/sqlite.js +8 -8
  121. package/dist/factory-assets/connectors/static-server.js +8 -8
  122. package/dist/factory-assets/connectors/tunnel.js +8 -8
  123. package/dist/factory-assets/connectors/webdav.js +8 -8
  124. package/dist/factory-assets/connectors/xstate-store.js +8 -8
  125. package/dist/factory-assets/connectors/xstate.js +8 -8
  126. package/dist/factory-assets/skaile.manifest.yaml +4 -1
  127. package/dist/{flows-36PZESON.js → flows-4Z74KY2H.js} +3 -3
  128. package/dist/{flows-36PZESON.js.map → flows-4Z74KY2H.js.map} +1 -1
  129. package/dist/helpers-SC4PWN2F.js +22 -0
  130. package/dist/{helpers-F4NZ66VD.js.map → helpers-SC4PWN2F.js.map} +1 -1
  131. package/dist/library/index.js +8 -8
  132. package/dist/library/install.js +6 -6
  133. package/dist/library/src/library.d.ts +6 -0
  134. package/dist/library/src/library.d.ts.map +1 -1
  135. package/dist/library/src/local/db.d.ts.map +1 -1
  136. package/dist/library/src/local/library.d.ts +9 -0
  137. package/dist/library/src/local/library.d.ts.map +1 -1
  138. package/dist/library/src/local/local-catalog-source.d.ts +9 -0
  139. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  140. package/dist/library/src/local/schema.d.ts +19 -0
  141. package/dist/library/src/local/schema.d.ts.map +1 -1
  142. package/dist/open-library-ZNYIND7N.js +29 -0
  143. package/dist/{open-library-WRFYABFP.js.map → open-library-ZNYIND7N.js.map} +1 -1
  144. package/dist/{paths-EUNVMONC.js → paths-S7QNXYMB.js} +9 -9
  145. package/dist/{paths-EUNVMONC.js.map → paths-S7QNXYMB.js.map} +1 -1
  146. package/dist/{plugin-store-35KIMX6W.js → plugin-store-3DAVGKHN.js} +8 -8
  147. package/dist/{plugin-store-35KIMX6W.js.map → plugin-store-3DAVGKHN.js.map} +1 -1
  148. package/dist/plugins/src/catalog-source.d.ts +7 -0
  149. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  150. package/dist/runner/index.js +13 -13
  151. package/dist/runner/src/resources.d.ts.map +1 -1
  152. package/dist/runner/src/serve.d.ts.map +1 -1
  153. package/dist/sdk/asset-manager.js +8 -8
  154. package/dist/sdk/bridge.js +3 -3
  155. package/dist/sdk/core.js +6 -6
  156. package/dist/sdk/flow.js +6 -6
  157. package/dist/sdk/index.js +13 -13
  158. package/dist/sdk/runner.js +13 -13
  159. package/dist/sdk/store.js +1 -1
  160. package/dist/{setup-HM6HATAC.js → setup-WBGDT2WY.js} +11 -11
  161. package/dist/{setup-HM6HATAC.js.map → setup-WBGDT2WY.js.map} +1 -1
  162. package/dist/{source-EZ5Y3CKP.js → source-SBFVULTG.js} +19 -13
  163. package/dist/{source-EZ5Y3CKP.js.map → source-SBFVULTG.js.map} +1 -1
  164. package/dist/store/index.js +1 -1
  165. package/dist/store/src/store.d.ts.map +1 -1
  166. package/dist/{store-client-BUUF7BPK.js → store-client-YGDN4L2G.js} +9 -9
  167. package/dist/{store-client-BUUF7BPK.js.map → store-client-YGDN4L2G.js.map} +1 -1
  168. package/dist/tui/index.js +13 -13
  169. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  170. package/dist/workspace-plugin/adapters/omp.js +3 -3
  171. package/dist/workspace-plugin/index.js +1 -1
  172. package/package.json +7 -1
  173. package/dist/chunk-2D5YE3FL.js.map +0 -1
  174. package/dist/chunk-7X53KHQ4.js.map +0 -1
  175. package/dist/chunk-GYPA2Q7F.js.map +0 -1
  176. package/dist/chunk-K5JIAHDV.js.map +0 -1
  177. package/dist/chunk-NXC6IEL4.js.map +0 -1
  178. package/dist/chunk-SFVEHSCI.js.map +0 -1
  179. package/dist/chunk-UTHEIPEY.js.map +0 -1
  180. package/dist/chunk-WSQ5J7CE.js.map +0 -1
  181. package/dist/ensure-sources-OCMHK7LT.js.map +0 -1
  182. package/dist/helpers-F4NZ66VD.js +0 -4
  183. package/dist/open-library-WRFYABFP.js +0 -23
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- import { makeSourceCommand, syncProjectSources } from '../chunk-XD7GYMAU.js';
3
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-PLQVAEM2.js';
4
- import { logErr, S, logOk, logInfo, colorRef, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-GYPA2Q7F.js';
5
- import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-2ZK7M2SG.js';
6
- import { AI_RESOURCES, aiResourceRoots } from '../chunk-LKOMH3QC.js';
2
+ import { makeSourceCommand, syncProjectSources } from '../chunk-XWLVIEWD.js';
3
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-CLUJLV7Z.js';
4
+ import { logErr, S, logOk, logInfo, colorRef, logWarn, kindColorPad, kindColor, formatSoftDepSection, bareSoftDepName, formatSoftDepHint, formatRelativeTime, fitWidth, formatSoftDepRemovePreview, formatSoftDepAddPreview } from '../chunk-MQEZE6TU.js';
5
+ import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-ZUE2PIJ5.js';
6
+ import { AI_RESOURCES, aiResourceRoots } from '../chunk-OIGYDVCM.js';
7
7
  import { LocalSecretsProvider } from '../chunk-6BEGKO2Q.js';
8
- import { resolveLibraryDir } from '../chunk-2D5YE3FL.js';
9
- import '../chunk-UTHEIPEY.js';
8
+ import { resolveLibraryDir } from '../chunk-NUS5L5ZJ.js';
9
+ import '../chunk-KVZ6XKVN.js';
10
10
  import '../chunk-UKJMQZV6.js';
11
11
  import '../chunk-R7FOF242.js';
12
12
  import '../chunk-JXT46QFC.js';
13
- import { runFlow, resumeFlow } from '../chunk-43JDPQJ4.js';
13
+ import { runFlow, resumeFlow } from '../chunk-W65IK4MH.js';
14
14
  import '../chunk-4R6DROGN.js';
15
15
  import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-GXC3TYMQ.js';
16
- import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-K5JIAHDV.js';
17
- import { buildClaudePluginFiles } from '../chunk-KSISPZV3.js';
16
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-TTTLCSEQ.js';
17
+ import { buildClaudePluginFiles } from '../chunk-EPLYVB3L.js';
18
18
  import '../chunk-X5YPJV4N.js';
19
19
  import '../chunk-O7SG5PC2.js';
20
20
  import '../chunk-7QBNJTTQ.js';
@@ -23,30 +23,30 @@ import '../chunk-WQ7DE5UC.js';
23
23
  import '../chunk-32NA4TVC.js';
24
24
  import '../chunk-W3UDISS2.js';
25
25
  import '../chunk-EVZKWY5J.js';
26
- import '../chunk-OYMSCV7T.js';
27
- import '../chunk-RRVQAE5D.js';
26
+ import '../chunk-UY5Q2NZH.js';
28
27
  import '../chunk-BMQKMOQY.js';
29
28
  import '../chunk-GAH4YRCI.js';
30
- import '../chunk-N5AE5SOC.js';
29
+ import '../chunk-RRVQAE5D.js';
30
+ import '../chunk-QVE3ILCY.js';
31
31
  import '../chunk-LV2HPH3C.js';
32
- import '../chunk-WSQ5J7CE.js';
33
- import '../chunk-EXNTTJGP.js';
32
+ import '../chunk-VCBLXF7D.js';
33
+ import '../chunk-BCJL2UNH.js';
34
34
  import '../chunk-6E6PKKAD.js';
35
35
  import { loadFlow, loadAllFlows } from '../chunk-SKADPHAM.js';
36
36
  import '../chunk-DEYYRFQU.js';
37
37
  import '../chunk-IFGTRL2I.js';
38
- import { AssetManager, NON_DEPLOYABLE_KINDS, MissingManifestError } from '../chunk-SFVEHSCI.js';
39
- import '../chunk-FLRHP3UC.js';
40
- import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor, checkAgentSkillConformance } from '../chunk-3KPNDTMR.js';
41
- import '../chunk-W53D5Q52.js';
42
- import '../chunk-F3HNW354.js';
43
- import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
44
- import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
45
- import { globalCacheRoot, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, resolveSkWorkspaceConfig } from '../chunk-NXC6IEL4.js';
38
+ import { AssetManager, NON_DEPLOYABLE_KINDS, MissingManifestError } from '../chunk-KAWKKMU4.js';
39
+ import '../chunk-35TLBMHX.js';
40
+ import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor, checkAgentSkillConformance } from '../chunk-MG6UIS7G.js';
41
+ import '../chunk-BM37QD6U.js';
42
+ import { globalCacheRoot, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, resolveSkWorkspaceConfig } from '../chunk-5AGARSQT.js';
46
43
  import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest, loadSkPublishManifest, saveSkPublishManifest } from '../chunk-DZCK7GRW.js';
47
44
  import { parseFrontmatter } from '../chunk-BQCGFPHW.js';
48
45
  import { parseAssetRef, ASSET_KINDS, isValidAssetName, slugifyAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-GEEW6SY2.js';
46
+ import '../chunk-F3HNW354.js';
49
47
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-MENCWIHW.js';
48
+ import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
49
+ import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
50
50
  import { openSqlite } from '../chunk-JB35MVBN.js';
51
51
  import '../chunk-KTBKW2FI.js';
52
52
  import '../chunk-UQ6LFBPZ.js';
@@ -92,7 +92,7 @@ async function searchLocal(query, kind, opts, showStore, airGapped) {
92
92
  const projectDir = path14__default.resolve(opts.projectDir);
93
93
  let entries = new AssetManager({ projectDir }).search(query, kind);
94
94
  if (entries.length === 0 && !query && !kind && !airGapped) {
95
- const { autoSyncForSearch } = await import('../source-EZ5Y3CKP.js');
95
+ const { autoSyncForSearch } = await import('../source-SBFVULTG.js');
96
96
  if (await autoSyncForSearch(projectDir)) {
97
97
  entries = new AssetManager({ projectDir }).search(query, kind);
98
98
  }
@@ -145,7 +145,7 @@ async function searchStore(query, kind, opts, airGapped) {
145
145
  return;
146
146
  }
147
147
  try {
148
- const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-BUUF7BPK.js');
148
+ const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-YGDN4L2G.js');
149
149
  const config = getStoreConfig2();
150
150
  const params = {};
151
151
  if (query) params.q = query;
@@ -189,6 +189,57 @@ function parseBackendFilter(raw) {
189
189
  }
190
190
  return out.length > 0 ? out : void 0;
191
191
  }
192
+ async function promptSoftDepAdds(am2, ref, io) {
193
+ if (io.noSoftDeps) return;
194
+ const edges = await am2.reportSoftDeps([ref]);
195
+ if (edges.length === 0) return;
196
+ const addEdge = async (toRef) => {
197
+ try {
198
+ for (const a of await am2.add(toRef, { link: io.link })) io.onAdded(a);
199
+ } catch (err) {
200
+ io.onError(`Failed to add ${toRef}: ${err}`);
201
+ }
202
+ };
203
+ if (io.withSoftDeps) {
204
+ for (const edge of edges) {
205
+ if (edge.toRef) await addEdge(edge.toRef);
206
+ else io.onError(`Cannot auto-add ${bareSoftDepName(edge.to)} \u2014 no resolvable ref.`);
207
+ }
208
+ return;
209
+ }
210
+ if (!io.isTTY) {
211
+ for (const edge of edges) io.onHint(formatSoftDepHint(edge));
212
+ return;
213
+ }
214
+ for (const edge of edges) {
215
+ if (!edge.toRef) continue;
216
+ const yes = await io.confirm(
217
+ `${bareSoftDepName(edge.from)} references ${bareSoftDepName(edge.to)} (soft dependency) \u2014 also add it?`
218
+ );
219
+ if (io.isCancel(yes)) break;
220
+ if (yes === true) await addEdge(edge.toRef);
221
+ }
222
+ }
223
+ async function promptSoftDepRemovals(am2, ref, io) {
224
+ if (io.noSoftDeps) return;
225
+ const orphans = (await am2.orphanedSoftDepsAfterRemoving([ref])).filter((o) => o.targetRef);
226
+ if (orphans.length === 0) return;
227
+ if (!io.isTTY) {
228
+ for (const o of orphans) {
229
+ io.onHint(
230
+ `${bareSoftDepName(o.target)} is now an orphaned soft dependency of ${ref} \u2014 run \`skaile remove ${o.targetRef}\` to remove it.`
231
+ );
232
+ }
233
+ return;
234
+ }
235
+ for (const o of orphans) {
236
+ const yes = await io.confirm(
237
+ `${bareSoftDepName(o.target)} is a soft dependency of ${ref} and is no longer referenced by any installed asset \u2014 also remove it?`
238
+ );
239
+ if (io.isCancel(yes)) break;
240
+ if (yes === true && am2.remove(o.targetRef)) io.onRemoved(`Removed ${o.targetRef}`);
241
+ }
242
+ }
192
243
  function makeAddCommand() {
193
244
  return new Command("add").description("Add to skaile.yaml + deploy").argument("<ref>", "Asset reference (kind:@<publisher>/name#<version>)").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Record in ~/.skaile/skaile.yaml + deploy to every global backend").option(
194
245
  "--backend <ids>",
@@ -196,7 +247,14 @@ function makeAddCommand() {
196
247
  ).option("--target <agent>", "Driver target", "claude-code").option(
197
248
  "--link",
198
249
  "symlink local-path assets instead of copying (dev loop; machine-local, not for committing)"
199
- ).action(async (ref, opts) => {
250
+ ).option(
251
+ "--with-soft-deps",
252
+ "also add the asset's report-only soft (body-link) deps, without prompting"
253
+ ).option("--no-soft-deps", "skip the soft-dep prompt entirely (don't add, don't report)").action(async (ref, opts) => {
254
+ if (opts.withSoftDeps && opts.softDeps === false) {
255
+ logErr("--with-soft-deps and --no-soft-deps are mutually exclusive.");
256
+ process.exit(1);
257
+ }
200
258
  const backends = parseBackendFilter(opts.backend);
201
259
  const am2 = new AssetManager({
202
260
  projectDir: path14__default.resolve(opts.projectDir),
@@ -209,6 +267,17 @@ function makeAddCommand() {
209
267
  try {
210
268
  const added = await am2.add(ref, { link: opts.link });
211
269
  spinner5.stop("Done");
270
+ await promptSoftDepAdds(am2, ref, {
271
+ isTTY: !!process.stdin.isTTY,
272
+ link: opts.link,
273
+ withSoftDeps: opts.withSoftDeps,
274
+ noSoftDeps: opts.softDeps === false,
275
+ confirm: (message) => p6.confirm({ message, initialValue: false }),
276
+ isCancel: p6.isCancel,
277
+ onAdded: logOk,
278
+ onError: logErr,
279
+ onHint: (line) => logInfo(S.dim(line))
280
+ });
212
281
  if (added.length === 0) {
213
282
  const kind = parseAssetRef(ref).kind;
214
283
  if (NON_DEPLOYABLE_KINDS.has(kind))
@@ -228,7 +297,7 @@ function makeRemoveCommand() {
228
297
  return new Command("remove").description("Remove from skaile.yaml + undeploy").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Remove from ~/.skaile/skaile.yaml + undeploy from every global backend").option(
229
298
  "--backend <ids>",
230
299
  "Comma-separated global backends to undeploy from (default: all resolved); implies --global"
231
- ).option("--target <agent>", "Driver target", "claude-code").action((ref, opts) => {
300
+ ).option("--target <agent>", "Driver target", "claude-code").option("--no-soft-deps", "skip the orphaned-soft-dep prompt (don't remove, don't report)").action(async (ref, opts) => {
232
301
  const backends = parseBackendFilter(opts.backend);
233
302
  const am2 = new AssetManager({
234
303
  projectDir: path14__default.resolve(opts.projectDir),
@@ -237,8 +306,19 @@ function makeRemoveCommand() {
237
306
  driverTarget: opts.target
238
307
  });
239
308
  const ok = am2.remove(ref);
240
- if (ok) logOk(`Removed ${ref}`);
241
- else logErr(`Not deployed: ${ref}`);
309
+ if (!ok) {
310
+ logErr(`Not deployed: ${ref}`);
311
+ return;
312
+ }
313
+ logOk(`Removed ${ref}`);
314
+ await promptSoftDepRemovals(am2, ref, {
315
+ isTTY: !!process.stdin.isTTY,
316
+ noSoftDeps: opts.softDeps === false,
317
+ confirm: (message) => p6.confirm({ message, initialValue: false }),
318
+ isCancel: p6.isCancel,
319
+ onRemoved: logOk,
320
+ onHint: (line) => logInfo(S.dim(line))
321
+ });
242
322
  });
243
323
  }
244
324
  function stateLabel(s) {
@@ -345,7 +425,7 @@ function runGlobalList(kind, opts, backends) {
345
425
  console.log();
346
426
  }
347
427
  function makeInfoCommand() {
348
- return new Command("info").description("Show asset metadata, deps, deploy status").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
428
+ return new Command("info").description("Show asset metadata, deps, deploy status").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
349
429
  const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
350
430
  const entry = am2.info(ref);
351
431
  if (!entry) {
@@ -354,6 +434,7 @@ function makeInfoCommand() {
354
434
  );
355
435
  process.exit(1);
356
436
  }
437
+ const softDeps = await am2.softDepsOf([ref]);
357
438
  console.log();
358
439
  console.log(` ${S.heading(entry.name)}`);
359
440
  console.log(` ${S.rule(40)}`);
@@ -371,6 +452,8 @@ function makeInfoCommand() {
371
452
  console.log(` dependencies:`);
372
453
  for (const s of entry.dependencies) console.log(` ${S.dim("\xB7")} ${colorRef(s)}`);
373
454
  }
455
+ for (const line of formatSoftDepSection(softDeps.map((e) => bareSoftDepName(e.to))))
456
+ console.log(line);
374
457
  console.log();
375
458
  });
376
459
  }
@@ -922,7 +1005,7 @@ function makeCatalogCommand() {
922
1005
  return catalog;
923
1006
  }
924
1007
  async function runLocalCatalogTest(projectDir) {
925
- const { resolveCatalogSource } = await import('../open-library-WRFYABFP.js');
1008
+ const { resolveCatalogSource } = await import('../open-library-ZNYIND7N.js');
926
1009
  let resolved;
927
1010
  try {
928
1011
  resolved = await resolveCatalogSource({ projectDir });
@@ -1912,7 +1995,7 @@ async function ensureTargetsRegistered(projectDir) {
1912
1995
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1913
1996
  const config = resolveSkWorkspaceConfig2(projectDir);
1914
1997
  if (config.plugins && config.plugins.length > 0) {
1915
- const { ensurePluginsLoaded } = await import('../plugin-store-35KIMX6W.js');
1998
+ const { ensurePluginsLoaded } = await import('../plugin-store-3DAVGKHN.js');
1916
1999
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
1917
2000
  for (const f of result.failed) logWarn(f.error);
1918
2001
  }
@@ -3591,8 +3674,44 @@ function actOnHeader(row, action3) {
3591
3674
  }
3592
3675
  return row.type === "domain-header" || row.type === "domain-info";
3593
3676
  }
3677
+ var softDepPreviewCache = /* @__PURE__ */ new Map();
3678
+ function softDepCacheKeyUnderCursor() {
3679
+ if (state.tab !== "assets" && state.tab !== "sources") return null;
3680
+ const rows = state.tab === "sources" ? state.visibleSourceRows : state.visibleRows;
3681
+ const row = rows[state.cursor];
3682
+ const ref = row?.type === "asset" ? assetRefOf(row) : null;
3683
+ if (!row || !ref) return null;
3684
+ return `${row.installed ? "remove" : "add"}:${ref}`;
3685
+ }
3686
+ async function previewSoftDepsUnderCursor() {
3687
+ if (state.tab !== "assets" && state.tab !== "sources") return;
3688
+ const rows = state.tab === "sources" ? state.visibleSourceRows : state.visibleRows;
3689
+ const row = rows[state.cursor];
3690
+ const ref = row?.type === "asset" ? assetRefOf(row) : null;
3691
+ if (!row || !ref) {
3692
+ state.message = "";
3693
+ return;
3694
+ }
3695
+ const mode = row.installed ? "remove" : "add";
3696
+ const cacheKey = `${mode}:${ref}`;
3697
+ let msg = softDepPreviewCache.get(cacheKey);
3698
+ if (msg === void 0) {
3699
+ if (mode === "remove") {
3700
+ const targets = (await am.orphanedSoftDepsAfterRemoving([ref])).map(
3701
+ (o) => bareSoftDepName(o.target)
3702
+ );
3703
+ msg = formatSoftDepRemovePreview(row.entry.name, targets);
3704
+ } else {
3705
+ const targets = (await am.reportSoftDeps([ref])).map((e) => bareSoftDepName(e.to));
3706
+ msg = formatSoftDepAddPreview(row.entry.name, targets);
3707
+ }
3708
+ softDepPreviewCache.set(cacheKey, msg);
3709
+ }
3710
+ if (softDepCacheKeyUnderCursor() === cacheKey) state.message = msg;
3711
+ }
3594
3712
  async function loadAssets() {
3595
- const { gatherAssetFeeds } = await import('../asset-feeds-677S5NX7.js');
3713
+ softDepPreviewCache.clear();
3714
+ const { gatherAssetFeeds } = await import('../asset-feeds-OBPWVUDL.js');
3596
3715
  const { entries, domains, notes } = await gatherAssetFeeds(am, am.projectDir);
3597
3716
  if (notes.length > 0) {
3598
3717
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -3759,7 +3878,7 @@ function reconcileCollapsedSets(rows) {
3759
3878
  async function loadSourcesAndLibraries() {
3760
3879
  try {
3761
3880
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir }, { getGlobalCacheDir: getGlobalCacheDir2 }] = await Promise.all([
3762
- import('../open-library-WRFYABFP.js'),
3881
+ import('../open-library-ZNYIND7N.js'),
3763
3882
  import('../library/index.js'),
3764
3883
  import('../core/index.js')
3765
3884
  ]);
@@ -4164,13 +4283,19 @@ async function applyChanges() {
4164
4283
  render();
4165
4284
  let added = 0;
4166
4285
  let removed = 0;
4286
+ const appliedAdds = [];
4287
+ const appliedRemoves = [];
4167
4288
  for (const ref of state.pendingRemoves) {
4168
- if (am.remove(ref)) removed++;
4289
+ if (am.remove(ref)) {
4290
+ removed++;
4291
+ appliedRemoves.push(ref);
4292
+ }
4169
4293
  }
4170
4294
  for (const ref of state.pendingAdds) {
4171
4295
  try {
4172
- am.add(ref);
4296
+ await am.add(ref);
4173
4297
  added++;
4298
+ appliedAdds.push(ref);
4174
4299
  } catch (err) {
4175
4300
  state.message = pc5.red(`Failed to add ${ref}: ${err}`);
4176
4301
  }
@@ -4181,6 +4306,19 @@ async function applyChanges() {
4181
4306
  const parts = [];
4182
4307
  if (added > 0) parts.push(pc5.green(`+${added} added`));
4183
4308
  if (removed > 0) parts.push(pc5.red(`-${removed} removed`));
4309
+ const softDeps = appliedAdds.length > 0 ? await am.reportSoftDeps(appliedAdds) : [];
4310
+ if (softDeps.length > 0) {
4311
+ parts.push(pc5.dim(`${softDeps.length} soft dep${softDeps.length === 1 ? "" : "s"} referenced`));
4312
+ }
4313
+ const orphans = (appliedRemoves.length > 0 ? await am.orphanedSoftDepsAfterRemoving(appliedRemoves) : []).filter((o) => o.targetRef);
4314
+ if (orphans.length > 0) {
4315
+ const names = orphans.map((o) => bareSoftDepName(o.target)).join(", ");
4316
+ parts.push(
4317
+ pc5.dim(
4318
+ `${names} no longer referenced by any installed asset \u2014 remove with \`skaile remove\``
4319
+ )
4320
+ );
4321
+ }
4184
4322
  if (parts.length) state.message = parts.join(" ");
4185
4323
  }
4186
4324
  async function syncAll() {
@@ -4458,8 +4596,20 @@ var KEYMAP = [
4458
4596
  }
4459
4597
  },
4460
4598
  { keys: [" "], run: () => void nextTab() },
4461
- { keys: ["\x1B[A", "k"], run: () => void moveCursor(-1) },
4462
- { keys: ["\x1B[B", "j"], run: () => void moveCursor(1) },
4599
+ {
4600
+ keys: ["\x1B[A", "k"],
4601
+ run: async () => {
4602
+ moveCursor(-1);
4603
+ await previewSoftDepsUnderCursor();
4604
+ }
4605
+ },
4606
+ {
4607
+ keys: ["\x1B[B", "j"],
4608
+ run: async () => {
4609
+ moveCursor(1);
4610
+ await previewSoftDepsUnderCursor();
4611
+ }
4612
+ },
4463
4613
  // Collapse / expand — assets tab
4464
4614
  { keys: ["\x1B[C"], when: TAB_ASSETS, run: expandUnderCursor },
4465
4615
  { keys: ["\x1B[D"], when: TAB_ASSETS, run: collapseOrJumpUnderCursor },
@@ -4470,13 +4620,14 @@ var KEYMAP = [
4470
4620
  {
4471
4621
  keys: ["+"],
4472
4622
  when: TAB_ASSETS,
4473
- run: () => {
4623
+ run: async () => {
4474
4624
  const row = state.visibleRows[state.cursor];
4475
4625
  if (!row) return;
4476
4626
  if (!actOnHeader(row, "add")) {
4477
4627
  const ref = assetRefOf(row);
4478
4628
  if (ref) setSelection(ref, state.pendingAdds.has(ref) ? "clear" : "add");
4479
4629
  }
4630
+ await previewSoftDepsUnderCursor();
4480
4631
  }
4481
4632
  },
4482
4633
  // Sources tab: + / - / space select (asset leaf or org/repo bulk header).
@@ -4507,13 +4658,14 @@ var KEYMAP = [
4507
4658
  {
4508
4659
  keys: ["-"],
4509
4660
  when: TAB_ASSETS,
4510
- run: () => {
4661
+ run: async () => {
4511
4662
  const row = state.visibleRows[state.cursor];
4512
4663
  if (!row) return;
4513
4664
  if (!actOnHeader(row, "remove")) {
4514
4665
  const ref = assetRefOf(row);
4515
4666
  if (ref) setSelection(ref, state.pendingRemoves.has(ref) ? "clear" : "remove");
4516
4667
  }
4668
+ await previewSoftDepsUnderCursor();
4517
4669
  }
4518
4670
  },
4519
4671
  // Space — auto-toggle (single asset or bulk header)
@@ -4812,7 +4964,7 @@ function action2(fn) {
4812
4964
  };
4813
4965
  }
4814
4966
  async function reconcileAndReport(projectDir, plugins) {
4815
- const { reconcilePlugins } = await import('../plugin-store-35KIMX6W.js');
4967
+ const { reconcilePlugins } = await import('../plugin-store-3DAVGKHN.js');
4816
4968
  if (plugins.length === 0) {
4817
4969
  logInfo("No plugins declared \u2014 nothing to reconcile.");
4818
4970
  return;
@@ -4828,7 +4980,7 @@ async function reconcileAndReport(projectDir, plugins) {
4828
4980
  async function runInstall2(spec, opts) {
4829
4981
  const projectDir = path14__default.resolve(opts.projectDir);
4830
4982
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
4831
- const { specName } = await import('../plugin-store-35KIMX6W.js');
4983
+ const { specName } = await import('../plugin-store-3DAVGKHN.js');
4832
4984
  const yamlPath = path14__default.join(projectDir, "skaile.yaml");
4833
4985
  const editor = WorkspaceYamlEditor2.load(yamlPath);
4834
4986
  const replaced = editor.addPlugin(spec, specName);
@@ -4840,7 +4992,7 @@ async function runInstall2(spec, opts) {
4840
4992
  async function runRemove(name, opts) {
4841
4993
  const projectDir = path14__default.resolve(opts.projectDir);
4842
4994
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
4843
- const { specName } = await import('../plugin-store-35KIMX6W.js');
4995
+ const { specName } = await import('../plugin-store-3DAVGKHN.js');
4844
4996
  const yamlPath = path14__default.join(projectDir, "skaile.yaml");
4845
4997
  const editor = WorkspaceYamlEditor2.load(yamlPath);
4846
4998
  const removed = editor.removePlugin(name, specName);
@@ -4868,7 +5020,7 @@ async function runList(opts) {
4868
5020
  const registry = createPluginRegistry();
4869
5021
  if (declared.length > 0) {
4870
5022
  try {
4871
- const { loadPlugins } = await import('../plugin-store-35KIMX6W.js');
5023
+ const { loadPlugins } = await import('../plugin-store-3DAVGKHN.js');
4872
5024
  const result = await loadPlugins(projectDir, declared, registry);
4873
5025
  for (const f of result.failed) logWarn(f.error);
4874
5026
  } catch (err) {
@@ -5122,7 +5274,7 @@ async function runRefInstall(ref, opts) {
5122
5274
  const spinner5 = p6.spinner();
5123
5275
  spinner5.start(`Installing ${ref}`);
5124
5276
  try {
5125
- const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-WRFYABFP.js');
5277
+ const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-ZNYIND7N.js');
5126
5278
  const catalog = await openCatalogSource2({ projectDir: path14__default.resolve(opts.projectDir) });
5127
5279
  if (!supportsInstallManifest(catalog)) {
5128
5280
  throw new Error(
@@ -5159,7 +5311,7 @@ async function runYamlInstall(opts) {
5159
5311
  return;
5160
5312
  }
5161
5313
  try {
5162
- const { ensureSourcesCloned } = await import('../ensure-sources-OCMHK7LT.js');
5314
+ const { ensureSourcesCloned } = await import('../ensure-sources-BQI2TOZZ.js');
5163
5315
  const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
5164
5316
  if (hydrate.cloned.length > 0) {
5165
5317
  logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
@@ -5195,12 +5347,22 @@ async function runYamlInstall(opts) {
5195
5347
  if (result.lockWritten) {
5196
5348
  logInfo(`Lock file written: ${S.dim("skaile.lock.yaml")}`);
5197
5349
  }
5350
+ if (!opts.locked) await reportInstalledSoftDeps(am2);
5198
5351
  } catch (err) {
5199
5352
  spinner5.stop("Failed");
5200
5353
  logErr(String(err));
5201
5354
  process.exit(1);
5202
5355
  }
5203
5356
  }
5357
+ async function reportInstalledSoftDeps(am2, onHint = (l) => logInfo(S.dim(l))) {
5358
+ try {
5359
+ const declared = am2.listDeclared().map((d) => d.ref);
5360
+ if (declared.length === 0) return;
5361
+ const edges = await am2.reportSoftDeps(declared);
5362
+ for (const edge of edges) onHint(formatSoftDepHint(edge));
5363
+ } catch {
5364
+ }
5365
+ }
5204
5366
  async function runGlobalInstall(opts, backends) {
5205
5367
  const am2 = new AssetManager({
5206
5368
  projectDir: path14__default.resolve(opts.projectDir),
@@ -5278,8 +5440,8 @@ function makeCleanCommand() {
5278
5440
  return;
5279
5441
  }
5280
5442
  if (!opts.yes) {
5281
- const confirm6 = await p6.confirm({ message: "Proceed?" });
5282
- if (p6.isCancel(confirm6) || !confirm6) {
5443
+ const confirm7 = await p6.confirm({ message: "Proceed?" });
5444
+ if (p6.isCancel(confirm7) || !confirm7) {
5283
5445
  logInfo("Cancelled.");
5284
5446
  return;
5285
5447
  }
@@ -5623,12 +5785,12 @@ function makeServeCommand() {
5623
5785
  );
5624
5786
  }
5625
5787
  async function ensurePluginsLoadedForServe(projectDir) {
5626
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-F4NZ66VD.js');
5788
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-SC4PWN2F.js');
5627
5789
  try {
5628
5790
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
5629
5791
  const config = resolveSkWorkspaceConfig2(projectDir);
5630
5792
  if (!config.plugins || config.plugins.length === 0) return;
5631
- const { ensurePluginsLoaded } = await import('../plugin-store-35KIMX6W.js');
5793
+ const { ensurePluginsLoaded } = await import('../plugin-store-3DAVGKHN.js');
5632
5794
  const { pluginRegistry } = await import('../plugin-registry/index.js');
5633
5795
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
5634
5796
  if (result.loaded.length > 0) {
@@ -5642,14 +5804,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
5642
5804
  }
5643
5805
  }
5644
5806
  async function runCompileTest(opts) {
5645
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-F4NZ66VD.js');
5807
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-SC4PWN2F.js');
5646
5808
  const { tmpdir } = await import('os');
5647
5809
  const { dirname: dirname4, join: join5, resolve: resolve5 } = await import('path');
5648
5810
  const { fileURLToPath: fileURLToPath2 } = await import('url');
5649
5811
  const { unlinkSync, existsSync: existsSync13 } = await import('fs');
5650
5812
  const { spawn } = await import('child_process');
5651
5813
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
5652
- const { MONOREPO_ROOT } = await import('../paths-EUNVMONC.js');
5814
+ const { MONOREPO_ROOT } = await import('../paths-S7QNXYMB.js');
5653
5815
  if (MONOREPO_ROOT === null) {
5654
5816
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
5655
5817
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -6626,7 +6788,7 @@ function printTree(node, prefix = "", isLast = true) {
6626
6788
  }
6627
6789
  }
6628
6790
  function makeTreeCommand() {
6629
- return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
6791
+ return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
6630
6792
  const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
6631
6793
  const root = am2.tree();
6632
6794
  if (root.children.length === 0) {
@@ -6635,6 +6797,14 @@ function makeTreeCommand() {
6635
6797
  }
6636
6798
  console.log();
6637
6799
  printTree(root);
6800
+ const softDeps = await am2.softDepsOf(root.children.map((c) => c.ref));
6801
+ if (softDeps.length > 0) {
6802
+ console.log(` ${S.label("Soft dependencies (inferred)")}:`);
6803
+ for (const e of softDeps)
6804
+ console.log(
6805
+ ` ${S.dim("\xB7")} ${bareSoftDepName(e.from)} \u2192 ${bareSoftDepName(e.to)} ${S.dim("(soft)")}`
6806
+ );
6807
+ }
6638
6808
  console.log();
6639
6809
  });
6640
6810
  }
@@ -7278,7 +7448,7 @@ function makeVerifyCommand() {
7278
7448
  });
7279
7449
  }
7280
7450
  function makeWhyCommand() {
7281
- return new Command("why").description("Show why an asset is installed (dependency chain)").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
7451
+ return new Command("why").description("Show why an asset is installed (dependency chain)").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action(async (ref, opts) => {
7282
7452
  const am2 = new AssetManager({ projectDir: path14__default.resolve(opts.projectDir) });
7283
7453
  const chain = am2.why(ref);
7284
7454
  if (chain.length === 0) {
@@ -7292,6 +7462,12 @@ function makeWhyCommand() {
7292
7462
  const arrow = i === 0 ? "" : "\u2190 ";
7293
7463
  console.log(` ${indent}${arrow}${colorRef(chain[i])}`);
7294
7464
  }
7465
+ const softDeps = await am2.softDepsOf([ref]);
7466
+ if (softDeps.length > 0) {
7467
+ console.log(
7468
+ ` ${S.dim(`also pulls (soft): ${softDeps.map((e) => bareSoftDepName(e.to)).join(", ")}`)}`
7469
+ );
7470
+ }
7295
7471
  console.log();
7296
7472
  });
7297
7473
  }
@@ -7541,7 +7717,7 @@ async function bootstrapUserConfig() {
7541
7717
  }
7542
7718
  async function hydrateInitSources(resolved, created) {
7543
7719
  try {
7544
- const { ensureSourcesCloned } = await import('../ensure-sources-OCMHK7LT.js');
7720
+ const { ensureSourcesCloned } = await import('../ensure-sources-BQI2TOZZ.js');
7545
7721
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
7546
7722
  for (const n of hydrate.cloned) created.push(`~/.skaile/cache/sources/${n}/`);
7547
7723
  if (hydrate.failed.length > 0) {
@@ -7577,7 +7753,7 @@ function printInitSummary(resolved, projectDir, created) {
7577
7753
  console.log();
7578
7754
  }
7579
7755
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
7580
- const { cmdSetup } = await import('../setup-HM6HATAC.js');
7756
+ const { cmdSetup } = await import('../setup-WBGDT2WY.js');
7581
7757
  await cmdSetup([], { projectDir: process.cwd() });
7582
7758
  });
7583
7759
  program.addCommand(makeInstallCommand());