@detergent-software/atk 8.9.0-dev.29 → 8.9.0-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.
- package/CHANGELOG.md +7 -0
- package/build/lib/setup.d.ts.map +1 -1
- package/build/lib/setup.js +53 -48
- package/build/lib/setup.js.map +1 -1
- package/build/lib/user-setup.d.ts.map +1 -1
- package/build/lib/user-setup.js +62 -59
- package/build/lib/user-setup.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [8.9.0-dev.30](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/branchCompare?baseVersion=GTv8.9.0-dev.29&targetVersion=GTv8.9.0-dev.30) (2026-10-19)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **cli:** hold the lock over setup's .atkrc.json write too ([8ae955a](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/8ae955a2e9575f53e71d002a02cb9e3f1142c5c6))
|
|
6
|
+
* **cli:** take the lockfile lock in atk setup and setup --user ([557ec69](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/557ec695efa1a6d42e67e3495d3cbf54236a3469))
|
|
7
|
+
|
|
1
8
|
## [8.9.0-dev.29](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/branchCompare?baseVersion=GTv8.9.0-dev.28&targetVersion=GTv8.9.0-dev.29) (2026-10-19)
|
|
2
9
|
|
|
3
10
|
### Bug Fixes
|
package/build/lib/setup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAaA,OAAO,EAAc,KAAK,aAAa,EAAgB,MAAM,YAAY,CAAC;AAM1E;;;GAGG;AACH,eAAO,MAAM,WAAW,QAA4B,CAAC;AAMrD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa1D;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAaA,OAAO,EAAc,KAAK,aAAa,EAAgB,MAAM,YAAY,CAAC;AAM1E;;;GAGG;AACH,eAAO,MAAM,WAAW,QAA4B,CAAC;AAMrD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAa1D;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkHtG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAWxF;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,WAAW,EACX,IAAY,GACb,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAOzB"}
|
package/build/lib/setup.js
CHANGED
|
@@ -5,7 +5,7 @@ import { loadAdapter } from './adapter.js';
|
|
|
5
5
|
import { loadProjectConfig, saveProjectConfig } from './config.js';
|
|
6
6
|
import { errorMessage } from './errors.js';
|
|
7
7
|
import { ensureGitignoreEntries, ensureGitignorePatterns } from './gitignore.js';
|
|
8
|
-
import { getLockfilePath, readLockfile, writeLockfile } from './lockfile.js';
|
|
8
|
+
import { getLockfilePath, readLockfile, withLockfileErrorHandling, writeLockfile } from './lockfile.js';
|
|
9
9
|
import { resolveSetupRoot } from './paths.js';
|
|
10
10
|
import { isUserRoot, resolveScope } from './scope.js';
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
@@ -48,56 +48,61 @@ export async function performSetupCreation(options) {
|
|
|
48
48
|
const actions = [];
|
|
49
49
|
const warnings = [];
|
|
50
50
|
const resolvedOrg = resolveSetupOrg(orgValue, orgLocked);
|
|
51
|
-
// 1
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
tools
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
actions.push({
|
|
63
|
-
detail: `tools: ${selectedTools.join(', ')}${listChanged ? ` — replaced: ${previousTools.join(', ')}` : ''}`,
|
|
64
|
-
label: 'Wrote .atkrc.json',
|
|
65
|
-
});
|
|
66
|
-
const removedTools = previousTools.filter((t) => !selectedTools.includes(t));
|
|
67
|
-
if (removedTools.length > 0) {
|
|
68
|
-
actions.push({
|
|
69
|
-
detail: `${removedTools.join(', ')} — installed files and config directories were left in place`,
|
|
70
|
-
label: 'Removed from tools list',
|
|
51
|
+
// Steps 1 and 2 run under the lockfile lock, so a concurrent install's or move's write isn't
|
|
52
|
+
// lost, and a lock that stays held fails setup before it changes anything.
|
|
53
|
+
await withLockfileErrorHandling(projectDir, async () => {
|
|
54
|
+
// 1. Write .atkrc.json with { tools: [...] }. Setup replaces the tools list, so say which
|
|
55
|
+
// list it replaced and which tools dropped out of it.
|
|
56
|
+
// Frozen assets are not setup's to change, so they carry over.
|
|
57
|
+
const previousConfig = await loadPreviousConfig(projectDir);
|
|
58
|
+
const previousTools = previousConfig?.tools ?? [];
|
|
59
|
+
await saveProjectConfig(projectDir, {
|
|
60
|
+
...(previousConfig?.frozenAssets?.length ? { frozenAssets: previousConfig.frozenAssets } : {}),
|
|
61
|
+
tools: selectedTools,
|
|
71
62
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const lockfilePath = getLockfilePath(projectDir);
|
|
75
|
-
if (existsSync(lockfilePath)) {
|
|
76
|
-
// Preserve existing assets and org
|
|
77
|
-
const existing = await readLockfile(projectDir);
|
|
78
|
-
// Only update org if it's not already set and we have a new one
|
|
79
|
-
const updatedLockfile = {
|
|
80
|
-
...existing,
|
|
81
|
-
lockVersion: 1,
|
|
82
|
-
...(resolvedOrg !== undefined && !existing.org ? { org: resolvedOrg } : {}),
|
|
83
|
-
};
|
|
84
|
-
await writeLockfile(projectDir, updatedLockfile);
|
|
63
|
+
const listChanged = previousTools.length > 0 &&
|
|
64
|
+
(previousTools.length !== selectedTools.length || previousTools.some((t, i) => t !== selectedTools[i]));
|
|
85
65
|
actions.push({
|
|
86
|
-
detail:
|
|
87
|
-
label: '
|
|
66
|
+
detail: `tools: ${selectedTools.join(', ')}${listChanged ? ` — replaced: ${previousTools.join(', ')}` : ''}`,
|
|
67
|
+
label: 'Wrote .atkrc.json',
|
|
88
68
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
69
|
+
const removedTools = previousTools.filter((t) => !selectedTools.includes(t));
|
|
70
|
+
if (removedTools.length > 0) {
|
|
71
|
+
actions.push({
|
|
72
|
+
detail: `${removedTools.join(', ')} — installed files and config directories were left in place`,
|
|
73
|
+
label: 'Removed from tools list',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// 2. Write/update .atk-lock.json. The existence check is under the lock too: an install
|
|
77
|
+
// may create the lockfile meanwhile.
|
|
78
|
+
const lockfilePath = getLockfilePath(projectDir);
|
|
79
|
+
if (existsSync(lockfilePath)) {
|
|
80
|
+
// Preserve existing assets and org
|
|
81
|
+
const existing = await readLockfile(projectDir);
|
|
82
|
+
// Only update org if it's not already set and we have a new one
|
|
83
|
+
const updatedLockfile = {
|
|
84
|
+
...existing,
|
|
85
|
+
lockVersion: 1,
|
|
86
|
+
...(resolvedOrg !== undefined && !existing.org ? { org: resolvedOrg } : {}),
|
|
87
|
+
};
|
|
88
|
+
await writeLockfile(projectDir, updatedLockfile);
|
|
89
|
+
actions.push({
|
|
90
|
+
detail: `${(existing.assets ?? []).length} existing asset(s) preserved`,
|
|
91
|
+
label: 'Updated .atk-lock.json',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
await writeLockfile(projectDir, {
|
|
96
|
+
assets: [],
|
|
97
|
+
lockVersion: 1,
|
|
98
|
+
...(resolvedOrg !== undefined ? { org: resolvedOrg } : {}),
|
|
99
|
+
});
|
|
100
|
+
actions.push({
|
|
101
|
+
detail: resolvedOrg ? `org: ${resolvedOrg}` : 'no org',
|
|
102
|
+
label: 'Created .atk-lock.json',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
});
|
|
101
106
|
// 3. Ensure each selected tool's marker directory exists and .atkrc.json is
|
|
102
107
|
// in .gitignore via the adapters' gitignore entries
|
|
103
108
|
const allAdded = [];
|
package/build/lib/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/lib/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAsB,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1E,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAuBrD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAA6B;IACtE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEzD,6FAA6F;IAC7F,2EAA2E;IAC3E,MAAM,yBAAyB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QACrD,0FAA0F;QAC1F,yDAAyD;QACzD,kEAAkE;QAClE,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,iBAAiB,CAAC,UAAU,EAAE;YAClC,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,KAAK,EAAE,aAAa;SACrB,CAAC,CAAC;QAEH,MAAM,WAAW,GACf,aAAa,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,gBAAgB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5G,KAAK,EAAE,mBAAmB;SAC3B,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,8DAA8D;gBAChG,KAAK,EAAE,yBAAyB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,wFAAwF;QACxF,wCAAwC;QACxC,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;YAChD,gEAAgE;YAChE,MAAM,eAAe,GAAG;gBACtB,GAAG,QAAQ;gBACX,WAAW,EAAE,CAAU;gBACvB,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;YACF,MAAM,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,8BAA8B;gBACvE,KAAK,EAAE,wBAAwB;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,MAAM,EAAE,EAAE;gBACV,WAAW,EAAE,CAAC;gBACd,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3D,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ;gBACtD,KAAK,EAAE,wBAAwB;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,uDAAuD;IACvD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,gBAAgB,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrE,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,mBAAmB,EAAE,KAAK,EAAE,WAAW,aAAa,EAAE,EAAE,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,qEAAqE;gBACrE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,0CAA0C,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,4EAA4E;YAC5E,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gFAAgF;QAChF,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAuB,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC,CAAC;YACpG,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,sBAAsB;QACtB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAkB;IAClE,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAE/E,qCAAqC;IACrC,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,gBAAgB,WAAW,2EAA2E,CACvG,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,WAAW,EACX,IAAI,GAAG,KAAK,GAIb;IACC,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AACxE,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,OAAgB;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACjH,IAAI,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAErC,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1F,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAClD,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-setup.d.ts","sourceRoot":"","sources":["../../src/lib/user-setup.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AASrE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,4FAA4F;IAC5F,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"user-setup.d.ts","sourceRoot":"","sources":["../../src/lib/user-setup.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,YAAY,CAAC;AASrE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,4FAA4F;IAC5F,OAAO,EAAE,OAAO,CAAC;CAClB;AAKD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqF1F"}
|
package/build/lib/user-setup.js
CHANGED
|
@@ -4,7 +4,7 @@ import { homedir } from 'node:os';
|
|
|
4
4
|
import { join, resolve } from 'node:path';
|
|
5
5
|
import { getConfigPath, hasUserScopeSection, loadUserScopeConfig, writeUserScopeSection } from './config.js';
|
|
6
6
|
import { hasAtkGitignoreBlock } from './gitignore.js';
|
|
7
|
-
import { getLockfilePath, readLockfile, writeLockfile } from './lockfile.js';
|
|
7
|
+
import { getLockfilePath, readLockfile, withLockfileErrorHandling, writeLockfile } from './lockfile.js';
|
|
8
8
|
import { formatOrgName } from './org.js';
|
|
9
9
|
import { isSamePath } from './same-path.js';
|
|
10
10
|
import { resolveSetupOrg } from './setup.js';
|
|
@@ -25,68 +25,71 @@ export async function performUserSetup(options) {
|
|
|
25
25
|
const actions = [];
|
|
26
26
|
const warnings = [];
|
|
27
27
|
const org = resolveSetupOrg(orgValue, orgLocked);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
28
|
+
// The lockfile is read and written under its lock, so a concurrent user-scope install's write isn't lost.
|
|
29
|
+
return withLockfileErrorHandling(userRoot, async () => {
|
|
30
|
+
const lockfilePath = getLockfilePath(userRoot);
|
|
31
|
+
const configPath = getConfigPath();
|
|
32
|
+
const before = await Promise.all([readIfExists(lockfilePath), readIfExists(configPath)]);
|
|
33
|
+
const lockfileExisted = before[0] !== undefined;
|
|
34
|
+
const adopting = lockfileExisted && !(await hasUserScopeSection());
|
|
35
|
+
// Read both files before writing either, so a config that doesn't load fails before any change.
|
|
36
|
+
const lockfile = await readLockfile(userRoot);
|
|
37
|
+
const assets = lockfile.assets ?? [];
|
|
38
|
+
const previous = await loadUserScopeConfig(userRoot);
|
|
39
|
+
const previousTools = previous?.tools ?? [];
|
|
40
|
+
// 1. The user lockfile. An existing one keeps its assets, and its org once set.
|
|
41
|
+
if (!lockfileExisted) {
|
|
42
|
+
await writeLockfile(userRoot, { assets: [], lockVersion: 1, ...(org !== undefined ? { org } : {}) });
|
|
43
|
+
actions.push({ detail: org ? `org: ${org}` : 'no org', label: 'Created .atk-lock.json' });
|
|
44
|
+
}
|
|
45
|
+
else if (org && !lockfile.org) {
|
|
46
|
+
await writeLockfile(userRoot, { ...lockfile, org });
|
|
47
|
+
actions.push({ detail: `org: ${org}`, label: 'Set the org in .atk-lock.json' });
|
|
48
|
+
}
|
|
49
|
+
// 2. The `user` section. Frozen assets aren't setup's to change, so they carry over, from the
|
|
50
|
+
// legacy top-level keys when the home directory still holds them.
|
|
51
|
+
const { droppedLegacy } = await writeUserScopeSection({ ...(previous?.frozenAssets?.length ? { frozenAssets: previous.frozenAssets } : {}), tools: selectedTools }, { dropLegacy: isSamePath(resolve(userRoot), resolve(homedir())) });
|
|
52
|
+
if ((await readIfExists(configPath)) !== before[1]) {
|
|
53
|
+
const replaced = previousTools.length > 0 && previousTools.join(',') !== selectedTools.join(',');
|
|
54
|
+
actions.push({
|
|
55
|
+
detail: `tools: ${selectedTools.join(', ')}${replaced ? ` — replaced: ${previousTools.join(', ')}` : ''}`,
|
|
56
|
+
label: `Wrote the user section of ${configPath}`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const removedTools = previousTools.filter((tool) => !selectedTools.includes(tool));
|
|
60
|
+
if (removedTools.length > 0) {
|
|
61
|
+
actions.push({
|
|
62
|
+
detail: `${removedTools.join(', ')} — installed files and config directories were left in place`,
|
|
63
|
+
label: 'Removed from tools list',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (droppedLegacy) {
|
|
67
|
+
actions.push({
|
|
68
|
+
detail: 'tools and frozen assets of the home directory setup',
|
|
69
|
+
label: `Moved the top-level keys of ${configPath} into its user section`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (!adopting) {
|
|
73
|
+
return { actions, changed: await changedSince(before, [lockfilePath, configPath]), warnings };
|
|
74
|
+
}
|
|
52
75
|
actions.push({
|
|
53
|
-
detail:
|
|
54
|
-
label:
|
|
76
|
+
detail: `${assets.length} existing asset(s) kept${lockfile.org ? `, org: ${lockfile.org}` : ''}`,
|
|
77
|
+
label: 'Adopted .atk-lock.json',
|
|
55
78
|
});
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
if (!adopting) {
|
|
79
|
+
// 3. Reports. Nothing here is changed: the assets need a sync, and the .gitignore may be a dotfiles repo's.
|
|
80
|
+
const placedDifferently = assets.filter((asset) => PLACED_DIFFERENTLY_TYPES.has(asset.type));
|
|
81
|
+
if (placedDifferently.length > 0) {
|
|
82
|
+
const names = placedDifferently.map((asset) => `${formatOrgName(asset.org, asset.name)} (${asset.type})`);
|
|
83
|
+
const [verb, pronoun] = placedDifferently.length === 1 ? ['was', 'it'] : ['were', 'them'];
|
|
84
|
+
warnings.push(`${names.join(', ')} ${verb} placed with project-scope rules, which user scope places differently. ` +
|
|
85
|
+
`Run \`atk sync --user\` to place ${pronoun} for the user scope.`);
|
|
86
|
+
}
|
|
87
|
+
if (await hasAtkGitignoreBlock(userRoot)) {
|
|
88
|
+
warnings.push(`${join(userRoot, '.gitignore')} still has the "# ATK managed assets" block from a project setup there. ` +
|
|
89
|
+
'User scope does not use it, and ATK leaves it in place in case a dotfiles repo needs it.');
|
|
90
|
+
}
|
|
71
91
|
return { actions, changed: await changedSince(before, [lockfilePath, configPath]), warnings };
|
|
72
|
-
}
|
|
73
|
-
actions.push({
|
|
74
|
-
detail: `${assets.length} existing asset(s) kept${lockfile.org ? `, org: ${lockfile.org}` : ''}`,
|
|
75
|
-
label: 'Adopted .atk-lock.json',
|
|
76
92
|
});
|
|
77
|
-
// 3. Reports. Nothing here is changed: the assets need a sync, and the .gitignore may be a dotfiles repo's.
|
|
78
|
-
const placedDifferently = assets.filter((asset) => PLACED_DIFFERENTLY_TYPES.has(asset.type));
|
|
79
|
-
if (placedDifferently.length > 0) {
|
|
80
|
-
const names = placedDifferently.map((asset) => `${formatOrgName(asset.org, asset.name)} (${asset.type})`);
|
|
81
|
-
const [verb, pronoun] = placedDifferently.length === 1 ? ['was', 'it'] : ['were', 'them'];
|
|
82
|
-
warnings.push(`${names.join(', ')} ${verb} placed with project-scope rules, which user scope places differently. ` +
|
|
83
|
-
`Run \`atk sync --user\` to place ${pronoun} for the user scope.`);
|
|
84
|
-
}
|
|
85
|
-
if (await hasAtkGitignoreBlock(userRoot)) {
|
|
86
|
-
warnings.push(`${join(userRoot, '.gitignore')} still has the "# ATK managed assets" block from a project setup there. ` +
|
|
87
|
-
'User scope does not use it, and ATK leaves it in place in case a dotfiles repo needs it.');
|
|
88
|
-
}
|
|
89
|
-
return { actions, changed: await changedSince(before, [lockfilePath, configPath]), warnings };
|
|
90
93
|
}
|
|
91
94
|
/** Whether any of `paths` differs from its content in `before` (undefined: it didn't exist). */
|
|
92
95
|
async function changedSince(before, paths) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-setup.js","sourceRoot":"","sources":["../../src/lib/user-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI1C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"user-setup.js","sourceRoot":"","sources":["../../src/lib/user-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI1C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAc7C,mFAAmF;AACnF,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAEtF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAyB;IAC9D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjE,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEjD,0GAA0G;IAC1G,OAAO,yBAAyB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QAChD,MAAM,QAAQ,GAAG,eAAe,IAAI,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC;QAEnE,gGAAgG;QAChG,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;QAE5C,gFAAgF;QAChF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC5F,CAAC;aAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,aAAa,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,8FAA8F;QAC9F,qEAAqE;QACrE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,qBAAqB,CACnD,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAC5G,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAClE,CAAC;QAEF,IAAI,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjG,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,UAAU,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBACzG,KAAK,EAAE,6BAA6B,UAAU,EAAE;aACjD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,8DAA8D;gBAChG,KAAK,EAAE,yBAAyB;aACjC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,qDAAqD;gBAC7D,KAAK,EAAE,+BAA+B,UAAU,wBAAwB;aACzE,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAChG,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,0BAA0B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAChG,KAAK,EAAE,wBAAwB;SAChC,CAAC,CAAC;QAEH,4GAA4G;QAC5G,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7F,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;YAC1G,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1F,QAAQ,CAAC,IAAI,CACX,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,yEAAyE;gBAClG,oCAAoC,OAAO,sBAAsB,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,0EAA0E;gBACvG,0FAA0F,CAC7F,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,YAAY,CAAC,MAAiC,EAAE,KAAe;IAC5E,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC"}
|