@detergent-software/atk 9.2.0-dev.6 → 9.2.0-dev.7

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.
@@ -0,0 +1,146 @@
1
+ import { placesAsset } from './asset-tools.js';
2
+ import { isInstalledForTool } from './installed-for-tool.js';
3
+ import { findInstalledAsset, identityKey, readLockfile, upgradeToDirectInstall, writeLockfile } from './lockfile.js';
4
+ import { executeInstallPlanForTools } from './multi-tool-install.js';
5
+ import { findAsset, findBundleMember, isLatestAlias } from './registry.js';
6
+ import { resolveTargetsInstallPlan } from './resolver.js';
7
+ /**
8
+ * The members of the bundle that one of `tools` places, as the registry has them. A member none of
9
+ * them places is left out, since this run can't adopt it, and so is a ref the registry can't find,
10
+ * which the install reports.
11
+ */
12
+ export function bundleMembers(registry, bundle, tools) {
13
+ return (bundle.assets ?? []).flatMap((ref) => {
14
+ const found = findBundleMember(registry, bundle, ref);
15
+ if (!found || !tools.some((t) => placesAsset(t.adapter, found.asset.type, found.versionData.tools)))
16
+ return [];
17
+ const { name, org, type } = found.asset;
18
+ return [{ name, ...(org ? { org } : {}), type }];
19
+ });
20
+ }
21
+ /**
22
+ * Install what {@link planTargetsInstall} planned: one install across tools when the plan has
23
+ * entries, with its rollback, then the upgrades to direct. They come after the install, so a failed
24
+ * one leaves even the install reasons as they were.
25
+ */
26
+ export async function installPlannedTargets({ plan, upgrades }, tools, options) {
27
+ const toolResults = plan.entries.length > 0 ? await executeInstallPlanForTools(plan, tools, options) : [];
28
+ if (upgrades.length > 0) {
29
+ let lockfile = await readLockfile(options.projectDir);
30
+ for (const { name, org, type } of upgrades)
31
+ lockfile = upgradeToDirectInstall(lockfile, name, type, org);
32
+ await writeLockfile(options.projectDir, lockfile);
33
+ }
34
+ return toolResults;
35
+ }
36
+ /**
37
+ * Whether every member of the bundle is in place for every tool that takes it (with
38
+ * `requiredBundleVersion`, recorded as this bundle at that version). False when no tool takes any
39
+ * member, so the installer says why.
40
+ */
41
+ export function isBundleInPlace(registry, bundle, lockfile, { members, projectDir, requiredBundleVersion, tools, }) {
42
+ const bundleAssets = bundle.assets ?? [];
43
+ return tools.every(({ adapter: toolAdapter }) => members.length > 0 &&
44
+ bundleAssets.every((ref) => {
45
+ const found = findBundleMember(registry, bundle, ref);
46
+ if (!found)
47
+ return false;
48
+ // A tool that doesn't take this member (its type, or a hook for other tools) has
49
+ // nothing to check.
50
+ if (!placesAsset(toolAdapter, found.asset.type, found.versionData.tools))
51
+ return true;
52
+ const installed = findInstalledAsset(lockfile, ref.name, ref.type, found.asset.org);
53
+ if (!installed)
54
+ return false;
55
+ if (requiredBundleVersion && !isFromBundleVersion(installed, bundle, requiredBundleVersion)) {
56
+ return false;
57
+ }
58
+ return isInstalledForTool(installed, toolAdapter, projectDir);
59
+ }));
60
+ }
61
+ /**
62
+ * The targets resolved together (shared dependencies once, one version per asset) into one plan,
63
+ * as `atk install a b my-bundle` and `atk browse`'s marked rows install them. A target every
64
+ * targeted tool already has in place is left out of the plan, as it is for one name: an asset (at
65
+ * the requested version, when one is), or a bundle checked whole. An asset in place only as a
66
+ * dependency comes back in `upgrades`. Bundle members get the bundle's origin unless they are
67
+ * named themselves ({@link resolveTargetsInstallPlan}).
68
+ */
69
+ export function planTargetsInstall(registry, targets, lockfile, tools, { force, projectDir }) {
70
+ const inPlace = [];
71
+ const bundlesInPlace = [];
72
+ const upgrades = [];
73
+ const toInstall = [];
74
+ for (const request of targets) {
75
+ if (request.kind === 'bundle') {
76
+ const { bundle, version } = request;
77
+ const members = bundleMembers(registry, bundle, tools);
78
+ const requiredBundleVersion = version && !isLatestAlias(version) ? bundle.version : undefined;
79
+ if (force ||
80
+ !isBundleInPlace(registry, bundle, lockfile, { members, projectDir, requiredBundleVersion, tools })) {
81
+ toInstall.push(request);
82
+ }
83
+ else {
84
+ bundlesInPlace.push(request);
85
+ }
86
+ continue;
87
+ }
88
+ const match = findAsset(registry, request.name, request.type, request.version, request.org);
89
+ const existing = match ? findInstalledAsset(lockfile, request.name, match.asset.type, match.asset.org) : undefined;
90
+ const supportingTools = existing && match ? tools.filter((t) => placesAsset(t.adapter, existing.type, match.versionData.tools)) : [];
91
+ const isInPlace = !force &&
92
+ existing !== undefined &&
93
+ supportingTools.length > 0 &&
94
+ supportingTools.every((t) => isInstalledForTool(existing, t.adapter, projectDir)) &&
95
+ (!request.version || request.version === existing.version);
96
+ if (!isInPlace) {
97
+ toInstall.push(request);
98
+ continue;
99
+ }
100
+ if (inPlace.some((a) => identityKey(a) === identityKey(existing)))
101
+ continue;
102
+ const dependency = (existing.installReason ?? 'direct') === 'dependency';
103
+ if (dependency)
104
+ upgrades.push(existing);
105
+ inPlace.push({
106
+ name: existing.name,
107
+ ...(existing.org ? { org: existing.org } : {}),
108
+ outcome: dependency ? 'upgraded-to-direct' : 'already-installed',
109
+ type: existing.type,
110
+ version: existing.version,
111
+ });
112
+ }
113
+ const plan = resolveTargetsInstallPlan(registry, toInstall.map((request) => request.kind === 'bundle'
114
+ ? { bundle: request.bundle, kind: 'bundle' }
115
+ : {
116
+ ...(request.fromOrg ? { fromOrg: true } : {}),
117
+ kind: 'asset',
118
+ name: request.name,
119
+ ...(request.org ? { org: request.org } : {}),
120
+ ...(request.type ? { type: request.type } : {}),
121
+ ...(request.version ? { version: request.version } : {}),
122
+ }));
123
+ // The named and the org's assets the plan installs, in plan order.
124
+ const requested = new Set(toInstall.flatMap((request) => {
125
+ if (request.kind === 'bundle')
126
+ return [];
127
+ const match = findAsset(registry, request.name, request.type, request.version, request.org);
128
+ return match ? [identityKey(match.asset)] : [];
129
+ }));
130
+ const installed = plan.entries
131
+ .filter((entry) => entry.reason === 'direct' && requested.has(identityKey(entry.asset)))
132
+ .map((entry) => ({
133
+ name: entry.asset.name,
134
+ ...(entry.asset.org ? { org: entry.asset.org } : {}),
135
+ outcome: 'installed',
136
+ type: entry.asset.type,
137
+ version: entry.version,
138
+ }));
139
+ return { assets: [...installed, ...inPlace], bundlesInPlace, plan, toInstall, upgrades };
140
+ }
141
+ /** Whether a lockfile asset was installed as part of this bundle (name, org) at this version. */
142
+ function isFromBundleVersion(installed, bundle, version) {
143
+ const origin = installed.bundleOrigin;
144
+ return origin?.name === bundle.name && origin.org === bundle.org && origin.version === version;
145
+ }
146
+ //# sourceMappingURL=install-targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-targets.js","sourceRoot":"","sources":["../../src/lib/install-targets.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@detergent-software/atk",
3
- "version": "9.2.0-dev.6",
3
+ "version": "9.2.0-dev.7",
4
4
  "description": "Agentic Tool Kit — CLI for managing AI coding tool assets.",
5
5
  "type": "module",
6
6
  "bin": {