@detergent-software/atk 8.1.2-dev.3 → 8.1.2-dev.30

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 (131) hide show
  1. package/CHANGELOG.md +195 -0
  2. package/build/commands/browse.js +5 -9
  3. package/build/commands/browse.js.map +1 -1
  4. package/build/commands/install.js +2 -2
  5. package/build/commands/install.js.map +1 -1
  6. package/build/commands/list.js +2 -2
  7. package/build/commands/list.js.map +1 -1
  8. package/build/commands/login.js +2 -2
  9. package/build/commands/login.js.map +1 -1
  10. package/build/commands/register.js +3 -3
  11. package/build/commands/register.js.map +1 -1
  12. package/build/commands/sync.d.ts.map +1 -1
  13. package/build/commands/sync.js +16 -11
  14. package/build/commands/sync.js.map +1 -1
  15. package/build/commands/uninstall.d.ts +9 -1
  16. package/build/commands/uninstall.d.ts.map +1 -1
  17. package/build/commands/uninstall.js +23 -26
  18. package/build/commands/uninstall.js.map +1 -1
  19. package/build/commands/update.d.ts +9 -1
  20. package/build/commands/update.d.ts.map +1 -1
  21. package/build/commands/update.js +54 -14
  22. package/build/commands/update.js.map +1 -1
  23. package/build/components/InstallConfirmBar.d.ts.map +1 -1
  24. package/build/components/InstallConfirmBar.js +2 -1
  25. package/build/components/InstallConfirmBar.js.map +1 -1
  26. package/build/components/ListActionBar.d.ts.map +1 -1
  27. package/build/components/ListActionBar.js +3 -2
  28. package/build/components/ListActionBar.js.map +1 -1
  29. package/build/components/RunStoppedHint.d.ts +13 -0
  30. package/build/components/RunStoppedHint.d.ts.map +1 -0
  31. package/build/components/RunStoppedHint.js +12 -0
  32. package/build/components/RunStoppedHint.js.map +1 -0
  33. package/build/components/SkippedAssetSection.d.ts +2 -0
  34. package/build/components/SkippedAssetSection.d.ts.map +1 -1
  35. package/build/components/SkippedAssetSection.js +1 -1
  36. package/build/components/SkippedAssetSection.js.map +1 -1
  37. package/build/components/SyncDriftedList.d.ts +3 -2
  38. package/build/components/SyncDriftedList.d.ts.map +1 -1
  39. package/build/components/SyncDriftedList.js +11 -3
  40. package/build/components/SyncDriftedList.js.map +1 -1
  41. package/build/components/index.d.ts +1 -0
  42. package/build/components/index.d.ts.map +1 -1
  43. package/build/components/index.js +1 -0
  44. package/build/components/index.js.map +1 -1
  45. package/build/hooks/useCommand.js +2 -2
  46. package/build/hooks/useCommand.js.map +1 -1
  47. package/build/hooks/useInitState.js +5 -5
  48. package/build/hooks/useInitState.js.map +1 -1
  49. package/build/hooks/useListActions.d.ts.map +1 -1
  50. package/build/hooks/useListActions.js +34 -18
  51. package/build/hooks/useListActions.js.map +1 -1
  52. package/build/hooks/usePruneState.js +7 -7
  53. package/build/hooks/usePruneState.js.map +1 -1
  54. package/build/hooks/usePublishState.js +3 -3
  55. package/build/hooks/usePublishState.js.map +1 -1
  56. package/build/hooks/useRegistryChangeState.js +2 -2
  57. package/build/hooks/useRegistryChangeState.js.map +1 -1
  58. package/build/hooks/useSetupState.js +3 -3
  59. package/build/hooks/useSetupState.js.map +1 -1
  60. package/build/hooks/useUninstallState.d.ts +16 -29
  61. package/build/hooks/useUninstallState.d.ts.map +1 -1
  62. package/build/hooks/useUninstallState.js +147 -140
  63. package/build/hooks/useUninstallState.js.map +1 -1
  64. package/build/lib/adapter.d.ts.map +1 -1
  65. package/build/lib/adapter.js +3 -3
  66. package/build/lib/adapter.js.map +1 -1
  67. package/build/lib/asset-tools.d.ts +5 -0
  68. package/build/lib/asset-tools.d.ts.map +1 -1
  69. package/build/lib/asset-tools.js +7 -0
  70. package/build/lib/asset-tools.js.map +1 -1
  71. package/build/lib/auth.d.ts.map +1 -1
  72. package/build/lib/auth.js +3 -3
  73. package/build/lib/auth.js.map +1 -1
  74. package/build/lib/checksum.d.ts.map +1 -1
  75. package/build/lib/checksum.js +2 -1
  76. package/build/lib/checksum.js.map +1 -1
  77. package/build/lib/diagnostics.d.ts.map +1 -1
  78. package/build/lib/diagnostics.js +6 -5
  79. package/build/lib/diagnostics.js.map +1 -1
  80. package/build/lib/diff-command.d.ts.map +1 -1
  81. package/build/lib/diff-command.js +10 -6
  82. package/build/lib/diff-command.js.map +1 -1
  83. package/build/lib/entra.d.ts.map +1 -1
  84. package/build/lib/entra.js +3 -2
  85. package/build/lib/entra.js.map +1 -1
  86. package/build/lib/errors.d.ts +9 -0
  87. package/build/lib/errors.d.ts.map +1 -1
  88. package/build/lib/errors.js +29 -0
  89. package/build/lib/errors.js.map +1 -1
  90. package/build/lib/file-snapshot.d.ts +17 -0
  91. package/build/lib/file-snapshot.d.ts.map +1 -0
  92. package/build/lib/file-snapshot.js +41 -0
  93. package/build/lib/file-snapshot.js.map +1 -0
  94. package/build/lib/installer.d.ts +61 -0
  95. package/build/lib/installer.d.ts.map +1 -1
  96. package/build/lib/installer.js +148 -43
  97. package/build/lib/installer.js.map +1 -1
  98. package/build/lib/lockfile.d.ts +23 -4
  99. package/build/lib/lockfile.d.ts.map +1 -1
  100. package/build/lib/lockfile.js +32 -14
  101. package/build/lib/lockfile.js.map +1 -1
  102. package/build/lib/org.d.ts +16 -0
  103. package/build/lib/org.d.ts.map +1 -1
  104. package/build/lib/org.js +18 -0
  105. package/build/lib/org.js.map +1 -1
  106. package/build/lib/owned-paths.d.ts +9 -0
  107. package/build/lib/owned-paths.d.ts.map +1 -0
  108. package/build/lib/owned-paths.js +23 -0
  109. package/build/lib/owned-paths.js.map +1 -0
  110. package/build/lib/publisher.d.ts.map +1 -1
  111. package/build/lib/publisher.js +2 -1
  112. package/build/lib/publisher.js.map +1 -1
  113. package/build/lib/registry.d.ts.map +1 -1
  114. package/build/lib/registry.js +10 -6
  115. package/build/lib/registry.js.map +1 -1
  116. package/build/lib/setup.d.ts.map +1 -1
  117. package/build/lib/setup.js +4 -3
  118. package/build/lib/setup.js.map +1 -1
  119. package/build/lib/sync.d.ts +17 -4
  120. package/build/lib/sync.d.ts.map +1 -1
  121. package/build/lib/sync.js +110 -41
  122. package/build/lib/sync.js.map +1 -1
  123. package/build/lib/uninstaller.d.ts +21 -4
  124. package/build/lib/uninstaller.d.ts.map +1 -1
  125. package/build/lib/uninstaller.js +45 -36
  126. package/build/lib/uninstaller.js.map +1 -1
  127. package/build/lib/updater.d.ts +64 -3
  128. package/build/lib/updater.d.ts.map +1 -1
  129. package/build/lib/updater.js +355 -83
  130. package/build/lib/updater.js.map +1 -1
  131. package/package.json +1 -1
package/build/lib/sync.js CHANGED
@@ -1,15 +1,21 @@
1
1
  import { join } from 'node:path';
2
2
  import { resolveInstalledPaths } from './adapter.js';
3
3
  import { isExcludedForTool, supportsType } from './asset-tools.js';
4
+ import { getCredential } from './auth.js';
4
5
  import { verifyChecksums, verifyConfigEntries } from './checksum.js';
5
6
  import { getConfigEntriesForTool, needsConfigRegistration } from './config-entries.js';
6
7
  import { isFrozenInConfig } from './config.js';
7
- import { errorGuidance } from './errors.js';
8
+ import { errorGuidance, GuidedError, isRunWideFailure } from './errors.js';
8
9
  import { hookScriptPath, lacksExecBit } from './hook-script.js';
9
- import { executeInstallPlan, InstallerError } from './installer.js';
10
- import { addAssetToLockfile, readLockfile, removeAssetFromLockfile, withLockfileErrorHandling, writeLockfile, } from './lockfile.js';
11
- import { resolveInstallPlan, ResolverError } from './resolver.js';
10
+ import { executeInstallPlan, fetchPlanFiles, installFailureMessage } from './installer.js';
11
+ import { addAssetToLockfile, getLockfilePath, LockfileError, readLockfile, removeAssetFromLockfile, withLockfileErrorHandling, writeLockfile, } from './lockfile.js';
12
+ import { scopeSwitchGuidance } from './org.js';
13
+ import { findAsset } from './registry.js';
14
+ import { resolveInstallPlan } from './resolver.js';
12
15
  import { removeSingleAsset, UninstallerError } from './uninstaller.js';
16
+ export class SyncError extends GuidedError {
17
+ name = 'SyncError';
18
+ }
13
19
  // ---------------------------------------------------------------------------
14
20
  // Dry-run orchestration
15
21
  // ---------------------------------------------------------------------------
@@ -98,7 +104,7 @@ export async function classifySyncEntries(options) {
98
104
  * installed assets, which the original inline dry-run path in sync.tsx omitted.
99
105
  */
100
106
  export async function dryRunSync(options) {
101
- const { force, onProgress, projectConfig, projectDir, tools } = options;
107
+ const { force, onProgress, projectConfig, projectDir, registry, tools } = options;
102
108
  onProgress?.('Reading lockfile...');
103
109
  const lockfile = await readLockfile(projectDir);
104
110
  const toolResults = [];
@@ -122,12 +128,31 @@ export async function dryRunSync(options) {
122
128
  projectConfig,
123
129
  projectDir,
124
130
  });
131
+ const toSync = [];
132
+ const wouldFail = [];
133
+ for (const entry of classified.toSync) {
134
+ const refusal = scopeSwitchError(registry, entry.asset);
135
+ if (refusal) {
136
+ const { asset } = entry;
137
+ wouldFail.push({
138
+ assetName: asset.name,
139
+ assetType: asset.type,
140
+ error: refusal.message,
141
+ version: asset.version,
142
+ ...errorGuidance(refusal),
143
+ });
144
+ }
145
+ else {
146
+ toSync.push(entry);
147
+ }
148
+ }
125
149
  toolResults.push({
126
150
  ...(classified.excludedSkipped > 0 ? { excludedSkipped: classified.excludedSkipped } : {}),
127
151
  frozenSkipped: classified.frozenSkipped,
128
152
  skipped: classified.skipped,
129
153
  tool: toolName,
130
- toSync: classified.toSync,
154
+ toSync,
155
+ ...(wouldFail.length > 0 ? { wouldFail } : {}),
131
156
  });
132
157
  }
133
158
  return toolResults;
@@ -186,73 +211,101 @@ export async function syncAssets(options) {
186
211
  });
187
212
  continue;
188
213
  }
214
+ // Resolve the credential once, up front. A missing or expired sign-in carries no API code
215
+ // for isRunWideFailure, and with a fresh registry cache it would otherwise fail each
216
+ // asset's download in turn.
217
+ await getCredential();
189
218
  const failures = [];
190
- for (const entry of classified.toSync) {
219
+ let notAttempted;
220
+ for (const [index, entry] of classified.toSync.entries()) {
191
221
  onProgress?.(`Syncing ${entry.asset.name} for ${toolName}...`);
192
222
  // Save the original lockfile entry so we can restore it on reinstall failure
193
223
  const originalEntry = entry.asset;
194
- // Step 1: Disk-only cleanup via removeSingleAsset (no lockfile I/O).
195
- // Tolerate UninstallerError (e.g., files already missing) but propagate
196
- // unexpected errors.
197
- try {
198
- await removeSingleAsset(originalEntry, adapter, projectDir, onProgress);
199
- }
200
- catch (error) {
201
- if (!(error instanceof UninstallerError)) {
202
- throw error;
203
- }
204
- }
205
- // Step 2: Track removal in the in-memory lockfile
206
- lockfile = removeAssetFromLockfile(lockfile, originalEntry.name, originalEntry.type, originalEntry.org);
207
- // Step 3: Reinstall the direct asset only (not dependencies — intentional per F4.2).
208
- // Resolve the full plan but filter to just the direct asset entry.
224
+ // An error in this asset's re-sync is recorded as its failure and the run moves on,
225
+ // as update does. A lockfile that can't be read aborts the run instead: every later
226
+ // asset would hit it too, after its files were already removed.
209
227
  try {
228
+ // Refuse before planning, downloading or removing anything, as update does.
229
+ const refusal = scopeSwitchError(registry, originalEntry);
230
+ if (refusal)
231
+ throw refusal;
232
+ // Step 1: Plan the reinstall of the direct asset only (not dependencies — intentional
233
+ // per F4.2). Resolve the full plan but filter to just the direct asset entry.
210
234
  const plan = resolveInstallPlan(registry, originalEntry.name, originalEntry.type, originalEntry.version, originalEntry.org);
211
- // The plan treats the asset as a fresh top-level install, so carry over what the
212
- // lockfile entry recorded: a dependency stays a dependency, a pin stays pinned
213
- // (sync reinstalls the locked version), and a bundle member keeps its bundle.
235
+ // The resolver marks only the requested asset 'direct'. Its dependencies may share
236
+ // its name. The plan treats the asset as a fresh top-level install, so carry over
237
+ // what the lockfile entry recorded: a dependency stays a dependency, a pin stays
238
+ // pinned (sync reinstalls the locked version), and a bundle member keeps its bundle.
214
239
  const directEntries = plan.entries
215
- .filter((e) => e.asset.name === originalEntry.name)
240
+ .filter((e) => e.reason === 'direct')
216
241
  .map((e) => ({ ...e, reason: originalEntry.installReason ?? 'direct' }));
217
242
  const directPlan = { entries: directEntries, totalCount: directEntries.length };
243
+ // Step 2: Download before removing anything, so a refused download (an outdated CLI,
244
+ // an expired sign-in, the API down) leaves the installed files in place.
245
+ const files = await fetchPlanFiles(directPlan, adapter);
246
+ // Step 3: Disk-only cleanup via removeSingleAsset (no lockfile I/O).
247
+ // Tolerate UninstallerError (e.g., files already missing); any other error fails
248
+ // this asset without reinstalling over a half-removed state.
249
+ try {
250
+ await removeSingleAsset(originalEntry, adapter, projectDir, { lockfile, onProgress });
251
+ }
252
+ catch (error) {
253
+ if (!(error instanceof UninstallerError)) {
254
+ throw error;
255
+ }
256
+ }
257
+ // Step 4: Track removal in the in-memory lockfile, then reinstall
258
+ lockfile = removeAssetFromLockfile(lockfile, originalEntry.name, originalEntry.type, originalEntry.org);
218
259
  const results = await executeInstallPlan(directPlan, {
219
260
  adapter,
220
261
  ...(originalEntry.bundleOrigin ? { bundleOrigin: originalEntry.bundleOrigin } : {}),
262
+ files,
221
263
  onProgress,
222
264
  pin: !!originalEntry.pinnedVersion,
223
265
  projectDir,
224
266
  });
225
- entry.result = results[0];
226
- // Step 4: After successful reinstall, re-read the lockfile from disk
267
+ // Step 5: After successful reinstall, re-read the lockfile from disk
227
268
  // to capture the state that executeInstallPlan wrote, and keep our
228
269
  // in-memory copy in sync.
229
270
  lockfile = await readLockfile(projectDir);
271
+ entry.result = results[0];
230
272
  }
231
273
  catch (error) {
232
- if (error instanceof ResolverError || error instanceof InstallerError) {
233
- // On reinstall failure, restore the original InstalledAsset entry
234
- // back into the in-memory lockfile so it is not silently dropped.
235
- lockfile = addAssetToLockfile(lockfile, originalEntry);
236
- failures.push({
237
- assetName: originalEntry.name,
238
- assetType: originalEntry.type,
239
- error: error.message,
240
- version: originalEntry.version,
241
- ...errorGuidance(error),
242
- });
243
- continue;
274
+ if (isLockfileReadFailure(error, projectDir)) {
275
+ throw error;
276
+ }
277
+ // The failure is reported under the asset's name, so don't name it again.
278
+ const message = installFailureMessage(error, originalEntry);
279
+ onProgress?.(`Failed to sync ${originalEntry.name}: ${message}`);
280
+ // Restore the original InstalledAsset entry in the in-memory lockfile so it is
281
+ // not silently dropped (an upsert, so a cleanup failure cannot duplicate it).
282
+ lockfile = addAssetToLockfile(lockfile, originalEntry);
283
+ const guidance = errorGuidance(error);
284
+ failures.push({
285
+ assetName: originalEntry.name,
286
+ assetType: originalEntry.type,
287
+ error: message,
288
+ version: originalEntry.version,
289
+ ...guidance,
290
+ });
291
+ // The same error would fail every remaining asset and tool.
292
+ if (isRunWideFailure(guidance)) {
293
+ notAttempted = classified.toSync.slice(index + 1).map((e) => e.asset.name);
294
+ break;
244
295
  }
245
- throw error;
246
296
  }
247
297
  }
248
298
  toolResults.push({
249
299
  ...(classified.excludedSkipped > 0 ? { excludedSkipped: classified.excludedSkipped } : {}),
250
300
  failures,
251
301
  frozenSkipped: classified.frozenSkipped,
302
+ ...(notAttempted ? { notAttempted } : {}),
252
303
  skipped: classified.skipped,
253
304
  synced: classified.toSync.filter((e) => e.result !== undefined),
254
305
  tool: toolName,
255
306
  });
307
+ if (notAttempted)
308
+ break;
256
309
  }
257
310
  // Write the lockfile once at the end to persist any in-memory mutations
258
311
  // (e.g., restored entries from failed reinstalls)
@@ -260,4 +313,20 @@ export async function syncAssets(options) {
260
313
  return toolResults;
261
314
  });
262
315
  }
316
+ /** A lockfile that is invalid (`LockfileError`) or that the filesystem refused to read. */
317
+ function isLockfileReadFailure(error, projectDir) {
318
+ return (error instanceof LockfileError ||
319
+ (error instanceof Error && 'path' in error && error.path === getLockfilePath(projectDir)));
320
+ }
321
+ /**
322
+ * The refusal for an org entry whose asset is gone from the registry: its lookup falls back to the
323
+ * global asset of the same name, which is another asset, so sync does not reinstall from it.
324
+ */
325
+ function scopeSwitchError(registry, entry) {
326
+ const current = findAsset(registry, entry.name, entry.type, undefined, entry.org);
327
+ if (!current || current.asset.org === entry.org)
328
+ return undefined;
329
+ const { message, ...guidance } = scopeSwitchGuidance(entry, current.asset, 'sync');
330
+ return new SyncError(message, guidance);
331
+ }
263
332
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/lib/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/lib/sync.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { Adapter } from './schemas/adapter.js';
2
+ import type { AssetType } from './schemas/index.js';
2
3
  import type { InstalledAsset, Lockfile } from './schemas/lockfile.js';
3
4
  import { GuidedError } from './errors.js';
4
5
  export interface BundleUninstallPlan {
@@ -65,6 +66,13 @@ export interface UninstallOptions {
65
66
  keepLockfileEntry?: boolean;
66
67
  /** Pre-computed lockfile to avoid re-reading from disk. */
67
68
  lockfile?: Lockfile;
69
+ /**
70
+ * The lockfile as the removing tool has it, for deciding which of the primary asset's files
71
+ * another installed asset still owns. In a multi-tool update the shared lockfile can list an
72
+ * asset an earlier tool installed that this tool does not have. Only that decision uses it;
73
+ * the lockfile written back is `lockfile`. Defaults to `lockfile`.
74
+ */
75
+ managedFrom?: Lockfile;
68
76
  /** Callback for progress updates. */
69
77
  onProgress?: (message: string) => void;
70
78
  /** Optional org scope for asset identity matching. */
@@ -83,6 +91,8 @@ export interface UninstallOptions {
83
91
  toolScope?: {
84
92
  configuredAdapters: Adapter[];
85
93
  };
94
+ /** Type of the asset to uninstall. Omit to take the first entry with the name, of any type. */
95
+ type?: AssetType;
86
96
  }
87
97
  export interface UninstallPlan {
88
98
  /** Other installed assets that depend on the asset being removed. */
@@ -120,23 +130,30 @@ export declare function executeBundleUninstall(plan: BundleUninstallPlan, option
120
130
  * Compute a bundle uninstall plan.
121
131
  * Identifies which bundle assets can be removed, which must be skipped (because
122
132
  * non-bundle assets depend on them), and which transitive dependencies would
123
- * become orphaned.
133
+ * become orphaned. `removingTools` works as in {@link planUninstall}.
124
134
  */
125
- export declare function planBundleUninstall(lockfile: Lockfile, bundleName: string, bundleVersion: string, bundleOrg?: string): BundleUninstallPlan;
135
+ export declare function planBundleUninstall(lockfile: Lockfile, bundleName: string, bundleVersion: string, bundleOrg?: string, removingTools?: string[]): BundleUninstallPlan;
126
136
  /**
127
137
  * Compute the uninstall plan before removing anything.
128
138
  * Identifies dependents (for warnings) and orphaned dependencies (for cascade removal).
129
139
  * Handles transitive orphans via BFS.
140
+ *
141
+ * A tool-scoped uninstall passes the tools it removes for as `removingTools`, so that assets
142
+ * already uninstalled for all of them are not counted as dependents.
130
143
  */
131
- export declare function planUninstall(lockfile: Lockfile, assetName: string, org?: string): UninstallPlan;
144
+ export declare function planUninstall(lockfile: Lockfile, assetName: string, org?: string, type?: AssetType, removingTools?: string[]): UninstallPlan;
132
145
  /**
133
146
  * Remove a single asset's files and config entries from disk.
134
147
  * Does NOT touch the lockfile — caller is responsible for lockfile updates.
135
148
  *
136
149
  * Uses the adapter to dynamically resolve installed file paths and config entries
137
150
  * from the asset's source paths, rather than reading pre-computed paths from the lockfile.
151
+ * A file that another entry of `lockfile` also places for the tool is kept.
138
152
  */
139
- export declare function removeSingleAsset(installed: InstalledAsset, adapter: Adapter, projectDir: string, onProgress?: (message: string) => void): Promise<{
153
+ export declare function removeSingleAsset(installed: InstalledAsset, adapter: Adapter, projectDir: string, { lockfile, onProgress }: {
154
+ lockfile: Lockfile;
155
+ onProgress?: (message: string) => void;
156
+ }): Promise<{
140
157
  configEntriesCleaned: Array<{
141
158
  file: string;
142
159
  key: string;
@@ -1 +1 @@
1
- {"version":3,"file":"uninstaller.d.ts","sourceRoot":"","sources":["../../src/lib/uninstaller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninstaller.d.ts","sourceRoot":"","sources":["../../src/lib/uninstaller.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,13 @@ import { existsSync } from 'node:fs';
2
2
  import { readdir, readFile, rmdir, unlink } from 'node:fs/promises';
3
3
  import { dirname, join } from 'node:path';
4
4
  import { getPlacement, resolveInstalledPaths } from './adapter.js';
5
- import { excludeToolFromAsset, getRemainingTools, supportsType } from './asset-tools.js';
5
+ import { excludeToolFromAsset, getRemainingTools, isExcludedForTools, supportsType } from './asset-tools.js';
6
6
  import { getConfigEntriesForTool } from './config-entries.js';
7
7
  import { detectConfigFormat, readConfigFile, resolveConfigFormat, writeConfigFile, } from './config-file.js';
8
- import { GuidedError } from './errors.js';
8
+ import { errorMessage, GuidedError } from './errors.js';
9
9
  import { removeHookGroup } from './hook-config.js';
10
- import { findDependents, findInstalledAsset, findOrphanedDependencies, readLockfile, removeAssetFromLockfile, withLockfileLock, writeLockfile, } from './lockfile.js';
10
+ import { findDependents, findInstalledAsset, findOrphanedDependencies, identityKey, readLockfile, removeAssetFromLockfile, withLockfileLock, writeLockfile, } from './lockfile.js';
11
+ import { pathsOwnedByOthers } from './owned-paths.js';
11
12
  import { writeTextFile } from './write-file.js';
12
13
  export class UninstallerError extends GuidedError {
13
14
  name = 'UninstallerError';
@@ -38,7 +39,7 @@ export async function executeBundleUninstall(plan, options) {
38
39
  for (const asset of plan.assetsToRemove) {
39
40
  try {
40
41
  onProgress?.(`Removing ${asset.name}...`);
41
- await removeAssetForAdapters(asset, adapters, projectDir, onProgress);
42
+ await removeAssetForAdapters(asset, adapters, projectDir, lockfile, onProgress);
42
43
  const dropped = dropOrExcludeEntry(lockfile, asset, adapters, toolScope);
43
44
  lockfile = dropped.lockfile;
44
45
  if (dropped.remainingTools.length > 0) {
@@ -49,7 +50,7 @@ export async function executeBundleUninstall(plan, options) {
49
50
  catch (err) {
50
51
  errors.push({
51
52
  asset: asset.name,
52
- error: err instanceof Error ? err.message : String(err),
53
+ error: errorMessage(err),
53
54
  });
54
55
  }
55
56
  }
@@ -57,7 +58,7 @@ export async function executeBundleUninstall(plan, options) {
57
58
  for (const orphan of plan.orphansToRemove) {
58
59
  try {
59
60
  onProgress?.(`Removing orphaned dependency ${orphan.name}...`);
60
- await removeAssetForAdapters(orphan, adapters, projectDir, onProgress);
61
+ await removeAssetForAdapters(orphan, adapters, projectDir, lockfile, onProgress);
61
62
  const dropped = dropOrExcludeEntry(lockfile, orphan, adapters, toolScope);
62
63
  lockfile = dropped.lockfile;
63
64
  if (dropped.remainingTools.length > 0) {
@@ -68,7 +69,7 @@ export async function executeBundleUninstall(plan, options) {
68
69
  catch (err) {
69
70
  errors.push({
70
71
  asset: orphan.name,
71
- error: err instanceof Error ? err.message : String(err),
72
+ error: errorMessage(err),
72
73
  });
73
74
  }
74
75
  }
@@ -88,9 +89,9 @@ export async function executeBundleUninstall(plan, options) {
88
89
  * Compute a bundle uninstall plan.
89
90
  * Identifies which bundle assets can be removed, which must be skipped (because
90
91
  * non-bundle assets depend on them), and which transitive dependencies would
91
- * become orphaned.
92
+ * become orphaned. `removingTools` works as in {@link planUninstall}.
92
93
  */
93
- export function planBundleUninstall(lockfile, bundleName, bundleVersion, bundleOrg) {
94
+ export function planBundleUninstall(lockfile, bundleName, bundleVersion, bundleOrg, removingTools = []) {
94
95
  const emptyPlan = {
95
96
  assetsToRemove: [],
96
97
  assetsToSkip: [],
@@ -107,14 +108,14 @@ export function planBundleUninstall(lockfile, bundleName, bundleVersion, bundleO
107
108
  if (bundleAssets.length === 0) {
108
109
  return emptyPlan;
109
110
  }
110
- const bundleAssetNames = new Set(bundleAssets.map((a) => a.name));
111
+ const bundleAssetKeys = new Set(bundleAssets.map(identityKey));
111
112
  const assetsToRemove = [];
112
113
  const assetsToSkip = [];
113
114
  // Determine which assets can be removed and which must be skipped
114
115
  for (const asset of bundleAssets) {
115
116
  const dependents = findDependents(lockfile, asset.name, asset.type, asset.org);
116
117
  // A non-bundle dependent is one with a different bundleOrigin or no bundleOrigin at all
117
- const nonBundleDependents = dependents.filter((d) => !isThisBundle(d.bundleOrigin));
118
+ const nonBundleDependents = dependents.filter((d) => !isThisBundle(d.bundleOrigin) && !isExcludedForTools(d, removingTools));
118
119
  if (nonBundleDependents.length > 0) {
119
120
  const dependentNames = nonBundleDependents.map((d) => d.name);
120
121
  assetsToSkip.push({
@@ -129,14 +130,14 @@ export function planBundleUninstall(lockfile, bundleName, bundleVersion, bundleO
129
130
  // Order removable assets so dependents are removed before their dependencies
130
131
  const ordered = topologicalSortForRemoval(assetsToRemove);
131
132
  // Compute orphaned transitive dependencies
132
- const namesBeingRemoved = new Set(ordered.map((a) => a.name));
133
133
  const orphanSet = new Map();
134
134
  for (const asset of ordered) {
135
- const orphans = findOrphanedDependencies(lockfile, asset, [...namesBeingRemoved, ...orphanSet.keys()]);
135
+ const orphans = findOrphanedDependencies(lockfile, asset, [...ordered, ...orphanSet.values()], removingTools);
136
136
  for (const orphan of orphans) {
137
137
  // Only include orphans that are NOT themselves bundle assets
138
- if (!bundleAssetNames.has(orphan.name) && !orphanSet.has(orphan.name)) {
139
- orphanSet.set(orphan.name, orphan);
138
+ const key = identityKey(orphan);
139
+ if (!bundleAssetKeys.has(key) && !orphanSet.has(key)) {
140
+ orphanSet.set(key, orphan);
140
141
  }
141
142
  }
142
143
  }
@@ -153,27 +154,27 @@ export function planBundleUninstall(lockfile, bundleName, bundleVersion, bundleO
153
154
  * Compute the uninstall plan before removing anything.
154
155
  * Identifies dependents (for warnings) and orphaned dependencies (for cascade removal).
155
156
  * Handles transitive orphans via BFS.
157
+ *
158
+ * A tool-scoped uninstall passes the tools it removes for as `removingTools`, so that assets
159
+ * already uninstalled for all of them are not counted as dependents.
156
160
  */
157
- export function planUninstall(lockfile, assetName, org) {
158
- const primary = findInstalledAsset(lockfile, assetName, undefined, org);
161
+ export function planUninstall(lockfile, assetName, org, type, removingTools = []) {
162
+ const primary = findInstalledAsset(lockfile, assetName, type, org);
159
163
  if (!primary) {
160
164
  throw new UninstallerError(`Asset "${assetName}" is not installed.`);
161
165
  }
162
- const dependents = findDependents(lockfile, assetName, primary.type, org);
166
+ const dependents = findDependents(lockfile, assetName, primary.type, org).filter((d) => !isExcludedForTools(d, removingTools));
163
167
  // Collect orphaned dependencies using BFS for transitive orphans
164
168
  const allOrphans = [];
165
- const visited = new Set();
169
+ const visited = new Set([identityKey(primary)]);
166
170
  const queue = [primary];
167
- const allBeingRemoved = [assetName];
168
- visited.add(primary.name);
169
171
  while (queue.length > 0) {
170
172
  const current = queue.shift();
171
- const orphans = findOrphanedDependencies(lockfile, current, allBeingRemoved);
173
+ const orphans = findOrphanedDependencies(lockfile, current, [primary, ...allOrphans], removingTools);
172
174
  for (const orphan of orphans) {
173
- if (!visited.has(orphan.name)) {
174
- visited.add(orphan.name);
175
+ if (!visited.has(identityKey(orphan))) {
176
+ visited.add(identityKey(orphan));
175
177
  allOrphans.push(orphan);
176
- allBeingRemoved.push(orphan.name);
177
178
  queue.push(orphan);
178
179
  }
179
180
  }
@@ -190,15 +191,21 @@ export function planUninstall(lockfile, assetName, org) {
190
191
  *
191
192
  * Uses the adapter to dynamically resolve installed file paths and config entries
192
193
  * from the asset's source paths, rather than reading pre-computed paths from the lockfile.
194
+ * A file that another entry of `lockfile` also places for the tool is kept.
193
195
  */
194
- export async function removeSingleAsset(installed, adapter, projectDir, onProgress) {
196
+ export async function removeSingleAsset(installed, adapter, projectDir, { lockfile, onProgress }) {
195
197
  onProgress?.(`Removing files for ${installed.name}...`);
196
198
  // Dynamically resolve installed paths and config entries via the adapter
197
199
  const resolved = resolveInstalledPaths(installed, adapter, projectDir);
200
+ const ownedByOthers = pathsOwnedByOthers(lockfile, installed, adapter, projectDir);
198
201
  // Delete placed files (resolve relative paths to absolute)
199
202
  const filesRemoved = [];
200
203
  for (const file of resolved.files) {
201
204
  const absolutePath = join(projectDir, file.installedPath);
205
+ if (ownedByOthers.has(absolutePath)) {
206
+ onProgress?.(`Keeping ${absolutePath}: another installed asset also owns it`);
207
+ continue;
208
+ }
202
209
  if (existsSync(absolutePath)) {
203
210
  await unlink(absolutePath);
204
211
  filesRemoved.push(absolutePath);
@@ -247,15 +254,17 @@ export async function removeSingleAsset(installed, adapter, projectDir, onProgre
247
254
  * Uninstall a single asset by name, with optional cascade removal of orphaned dependencies.
248
255
  */
249
256
  export async function uninstallAsset(assetName, options) {
250
- const { adapter, additionalAdapters = [], cascade = true, keepLockfileEntry = false, lockfile: precomputedLockfile, onProgress, org, plan: precomputedPlan, projectDir, toolScope, } = options;
257
+ const { adapter, additionalAdapters = [], cascade = true, keepLockfileEntry = false, lockfile: precomputedLockfile, managedFrom, onProgress, org, plan: precomputedPlan, projectDir, toolScope, type, } = options;
251
258
  const adapters = [adapter, ...additionalAdapters];
252
259
  onProgress?.(`Reading lockfile...`);
253
260
  let lockfile = precomputedLockfile ?? (await readLockfile(projectDir));
254
261
  // Compute the plan before removing anything
255
- const plan = precomputedPlan ?? planUninstall(lockfile, assetName, org);
262
+ // Outside a tool scope the entries are dropped for every tool, so every dependent counts.
263
+ const removingTools = toolScope ? adapters.map((a) => a.tool) : [];
264
+ const plan = precomputedPlan ?? planUninstall(lockfile, assetName, org, type, removingTools);
256
265
  // Remove primary asset. Key the lockfile removal on the entry the plan resolved,
257
266
  // not the caller-supplied org — the lookup may have fallen back to a global entry.
258
- const primaryRemoval = await removeAssetForAdapters(plan.primary, adapters, projectDir, onProgress);
267
+ const primaryRemoval = await removeAssetForAdapters(plan.primary, adapters, projectDir, managedFrom ?? lockfile, onProgress);
259
268
  let primaryRemainingTools = [];
260
269
  if (!keepLockfileEntry) {
261
270
  const dropped = dropOrExcludeEntry(lockfile, plan.primary, adapters, toolScope);
@@ -276,7 +285,7 @@ export async function uninstallAsset(assetName, options) {
276
285
  if (cascade && plan.orphanedDependencies.length > 0) {
277
286
  for (const orphan of plan.orphanedDependencies) {
278
287
  onProgress?.(`Removing orphaned dependency ${orphan.name}...`);
279
- const orphanRemoval = await removeAssetForAdapters(orphan, adapters, projectDir, onProgress);
288
+ const orphanRemoval = await removeAssetForAdapters(orphan, adapters, projectDir, lockfile, onProgress);
280
289
  const dropped = dropOrExcludeEntry(lockfile, orphan, adapters, toolScope);
281
290
  lockfile = dropped.lockfile;
282
291
  results.push({
@@ -319,7 +328,7 @@ async function cleanupEmptyDirectories(dirPath, onProgress) {
319
328
  }
320
329
  catch (error) {
321
330
  // Directory doesn't exist or can't be read — log for debugging
322
- onProgress?.(`Warning: Failed to clean up directory ${dirPath} — ${error instanceof Error ? error.message : String(error)}`);
331
+ onProgress?.(`Warning: Failed to clean up directory ${dirPath} — ${errorMessage(error)}`);
323
332
  }
324
333
  }
325
334
  /**
@@ -350,11 +359,11 @@ function keptEntryFields(remainingTools) {
350
359
  * Remove a single asset from disk for every given adapter, merging the per-tool results.
351
360
  * Each adapter only cleans the files and config entries of its own tool.
352
361
  */
353
- async function removeAssetForAdapters(installed, adapters, projectDir, onProgress) {
362
+ async function removeAssetForAdapters(installed, adapters, projectDir, lockfile, onProgress) {
354
363
  const configEntriesCleaned = [];
355
364
  const filesRemoved = [];
356
365
  for (const adapter of adapters) {
357
- const removal = await removeSingleAsset(installed, adapter, projectDir, onProgress);
366
+ const removal = await removeSingleAsset(installed, adapter, projectDir, { lockfile, onProgress });
358
367
  configEntriesCleaned.push(...removal.configEntriesCleaned);
359
368
  filesRemoved.push(...removal.filesRemoved);
360
369
  }
@@ -412,7 +421,7 @@ async function removeConfigEntry(configFilePath, configKeyPath, assetName, comma
412
421
  }
413
422
  catch (error) {
414
423
  // Non-fatal — log but don't fail the uninstall
415
- onProgress?.(`Warning: Failed to remove config entry from ${configFilePath} — ${error instanceof Error ? error.message : String(error)}`);
424
+ onProgress?.(`Warning: Failed to remove config entry from ${configFilePath} — ${errorMessage(error)}`);
416
425
  return false;
417
426
  }
418
427
  }
@@ -453,7 +462,7 @@ async function removeFromEnabledList(enabledListFilePath, enabledListKey, names,
453
462
  }
454
463
  catch (error) {
455
464
  // Non-fatal — log but don't fail the uninstall
456
- onProgress?.(`Warning: Failed to update enabled list ${enabledListFilePath} — ${error instanceof Error ? error.message : String(error)}`);
465
+ onProgress?.(`Warning: Failed to update enabled list ${enabledListFilePath} — ${errorMessage(error)}`);
457
466
  return false;
458
467
  }
459
468
  }
@@ -488,7 +497,7 @@ async function removeMemoryTemplateSection(filePath, assetName, onProgress) {
488
497
  return true;
489
498
  }
490
499
  catch (error) {
491
- onProgress?.(`Warning: Failed to remove memory-template section from ${filePath} — ${error instanceof Error ? error.message : String(error)}`);
500
+ onProgress?.(`Warning: Failed to remove memory-template section from ${filePath} — ${errorMessage(error)}`);
492
501
  return false;
493
502
  }
494
503
  }