@detergent-software/atk 8.9.0-dev.9 → 8.9.1-dev.1
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 +262 -0
- package/README.md +22 -12
- package/build/cli.js +18 -6
- package/build/cli.js.map +1 -1
- package/build/command-manifest.json +1507 -0
- package/build/commands/_app.d.ts.map +1 -1
- package/build/commands/_app.js +8 -4
- package/build/commands/_app.js.map +1 -1
- package/build/commands/audit.d.ts.map +1 -1
- package/build/commands/audit.js +1 -1
- package/build/commands/audit.js.map +1 -1
- package/build/commands/browse.js +2 -2
- package/build/commands/browse.js.map +1 -1
- package/build/commands/cache.d.ts +1 -1
- package/build/commands/cache.d.ts.map +1 -1
- package/build/commands/cache.js +1 -16
- package/build/commands/cache.js.map +1 -1
- package/build/commands/config.d.ts.map +1 -1
- package/build/commands/config.js +1 -1
- package/build/commands/config.js.map +1 -1
- package/build/commands/diff.d.ts.map +1 -1
- package/build/commands/diff.js +4 -0
- package/build/commands/diff.js.map +1 -1
- package/build/commands/drift.d.ts.map +1 -1
- package/build/commands/drift.js +4 -0
- package/build/commands/drift.js.map +1 -1
- package/build/commands/index.d.ts.map +1 -1
- package/build/commands/index.js +5 -40
- package/build/commands/index.js.map +1 -1
- package/build/commands/info.d.ts.map +1 -1
- package/build/commands/info.js +50 -33
- package/build/commands/info.js.map +1 -1
- package/build/commands/init.d.ts.map +1 -1
- package/build/commands/init.js +4 -2
- package/build/commands/init.js.map +1 -1
- package/build/commands/install.d.ts.map +1 -1
- package/build/commands/install.js +28 -7
- package/build/commands/install.js.map +1 -1
- package/build/commands/list.js +2 -2
- package/build/commands/list.js.map +1 -1
- package/build/commands/login.d.ts.map +1 -1
- package/build/commands/login.js +12 -2
- package/build/commands/login.js.map +1 -1
- package/build/commands/logout.d.ts.map +1 -1
- package/build/commands/logout.js +9 -1
- package/build/commands/logout.js.map +1 -1
- package/build/commands/outdated.js +1 -1
- package/build/commands/outdated.js.map +1 -1
- package/build/commands/prune.d.ts.map +1 -1
- package/build/commands/prune.js +4 -2
- package/build/commands/prune.js.map +1 -1
- package/build/commands/publish.d.ts +1 -1
- package/build/commands/publish.d.ts.map +1 -1
- package/build/commands/publish.js +14 -14
- package/build/commands/publish.js.map +1 -1
- package/build/commands/release-notes.d.ts.map +1 -1
- package/build/commands/release-notes.js +4 -0
- package/build/commands/release-notes.js.map +1 -1
- package/build/commands/schema.d.ts +3 -3
- package/build/commands/search.js +1 -1
- package/build/commands/search.js.map +1 -1
- package/build/commands/sync.d.ts +1 -1
- package/build/commands/sync.d.ts.map +1 -1
- package/build/commands/sync.js +27 -12
- package/build/commands/sync.js.map +1 -1
- package/build/commands/update.d.ts.map +1 -1
- package/build/commands/update.js +58 -9
- package/build/commands/update.js.map +1 -1
- package/build/commands/whoami.d.ts.map +1 -1
- package/build/commands/whoami.js +16 -4
- package/build/commands/whoami.js.map +1 -1
- package/build/commands/why.js +3 -4
- package/build/commands/why.js.map +1 -1
- package/build/components/Header.d.ts +2 -3
- package/build/components/Header.d.ts.map +1 -1
- package/build/components/Header.js +2 -9
- package/build/components/Header.js.map +1 -1
- package/build/components/LocalEditsHint.d.ts +16 -0
- package/build/components/LocalEditsHint.d.ts.map +1 -0
- package/build/components/LocalEditsHint.js +18 -0
- package/build/components/LocalEditsHint.js.map +1 -0
- package/build/components/SyncAllInSync.d.ts +5 -1
- package/build/components/SyncAllInSync.d.ts.map +1 -1
- package/build/components/SyncAllInSync.js +2 -2
- package/build/components/SyncAllInSync.js.map +1 -1
- package/build/components/header-art.d.ts +7 -0
- package/build/components/header-art.d.ts.map +1 -0
- package/build/components/header-art.js +14 -0
- package/build/components/header-art.js.map +1 -0
- package/build/components/index.d.ts +1 -0
- package/build/components/index.d.ts.map +1 -1
- package/build/components/index.js +1 -0
- package/build/components/index.js.map +1 -1
- package/build/hooks/useListActions.d.ts.map +1 -1
- package/build/hooks/useListActions.js +4 -0
- package/build/hooks/useListActions.js.map +1 -1
- package/build/hooks/usePruneState.d.ts +1 -7
- package/build/hooks/usePruneState.d.ts.map +1 -1
- package/build/hooks/usePruneState.js +18 -62
- package/build/hooks/usePruneState.js.map +1 -1
- package/build/lib/adapter.d.ts +10 -1
- package/build/lib/adapter.d.ts.map +1 -1
- package/build/lib/adapter.js +23 -0
- package/build/lib/adapter.js.map +1 -1
- package/build/lib/api-client.d.ts +9 -5
- package/build/lib/api-client.d.ts.map +1 -1
- package/build/lib/api-client.js +35 -8
- package/build/lib/api-client.js.map +1 -1
- package/build/lib/auth.d.ts +12 -2
- package/build/lib/auth.d.ts.map +1 -1
- package/build/lib/auth.js +38 -3
- package/build/lib/auth.js.map +1 -1
- package/build/lib/checksum.d.ts +10 -0
- package/build/lib/checksum.d.ts.map +1 -1
- package/build/lib/checksum.js +17 -0
- package/build/lib/checksum.js.map +1 -1
- package/build/lib/config.d.ts +4 -4
- package/build/lib/config.d.ts.map +1 -1
- package/build/lib/config.js +31 -8
- package/build/lib/config.js.map +1 -1
- package/build/lib/diagnostics.d.ts.map +1 -1
- package/build/lib/diagnostics.js +10 -7
- package/build/lib/diagnostics.js.map +1 -1
- package/build/lib/diff-command.js +1 -1
- package/build/lib/diff-command.js.map +1 -1
- package/build/lib/errors.d.ts +4 -1
- package/build/lib/errors.d.ts.map +1 -1
- package/build/lib/errors.js.map +1 -1
- package/build/lib/format-age.d.ts +3 -0
- package/build/lib/format-age.d.ts.map +1 -0
- package/build/lib/format-age.js +18 -0
- package/build/lib/format-age.js.map +1 -0
- package/build/lib/installer.d.ts +6 -4
- package/build/lib/installer.d.ts.map +1 -1
- package/build/lib/installer.js +53 -23
- package/build/lib/installer.js.map +1 -1
- package/build/lib/local-edits.d.ts +72 -0
- package/build/lib/local-edits.d.ts.map +1 -0
- package/build/lib/local-edits.js +145 -0
- package/build/lib/local-edits.js.map +1 -0
- package/build/lib/lockfile.d.ts +2 -2
- package/build/lib/lockfile.d.ts.map +1 -1
- package/build/lib/lockfile.js +28 -19
- package/build/lib/lockfile.js.map +1 -1
- package/build/lib/mover.d.ts.map +1 -1
- package/build/lib/mover.js +11 -12
- package/build/lib/mover.js.map +1 -1
- package/build/lib/multi-tool-install.d.ts +4 -2
- package/build/lib/multi-tool-install.d.ts.map +1 -1
- package/build/lib/multi-tool-install.js +12 -2
- package/build/lib/multi-tool-install.js.map +1 -1
- package/build/lib/offline.d.ts +19 -0
- package/build/lib/offline.d.ts.map +1 -0
- package/build/lib/offline.js +26 -0
- package/build/lib/offline.js.map +1 -0
- package/build/lib/owned-paths.d.ts +3 -2
- package/build/lib/owned-paths.d.ts.map +1 -1
- package/build/lib/owned-paths.js +4 -2
- package/build/lib/owned-paths.js.map +1 -1
- package/build/lib/parse-json.d.ts +12 -0
- package/build/lib/parse-json.d.ts.map +1 -1
- package/build/lib/parse-json.js +15 -2
- package/build/lib/parse-json.js.map +1 -1
- package/build/lib/pastel/commander-specs.d.ts +7 -0
- package/build/lib/pastel/commander-specs.d.ts.map +1 -0
- package/build/lib/pastel/commander-specs.js +50 -0
- package/build/lib/pastel/commander-specs.js.map +1 -0
- package/build/lib/pastel/generate-arguments.d.ts +3 -3
- package/build/lib/pastel/generate-arguments.d.ts.map +1 -1
- package/build/lib/pastel/generate-arguments.js +25 -22
- package/build/lib/pastel/generate-arguments.js.map +1 -1
- package/build/lib/pastel/generate-command.d.ts +7 -5
- package/build/lib/pastel/generate-command.d.ts.map +1 -1
- package/build/lib/pastel/generate-command.js +32 -67
- package/build/lib/pastel/generate-command.js.map +1 -1
- package/build/lib/pastel/generate-commands.d.ts +3 -5
- package/build/lib/pastel/generate-commands.d.ts.map +1 -1
- package/build/lib/pastel/generate-commands.js +6 -10
- package/build/lib/pastel/generate-commands.js.map +1 -1
- package/build/lib/pastel/generate-options.d.ts +3 -3
- package/build/lib/pastel/generate-options.d.ts.map +1 -1
- package/build/lib/pastel/generate-options.js +16 -13
- package/build/lib/pastel/generate-options.js.map +1 -1
- package/build/lib/pastel/index.d.ts +26 -4
- package/build/lib/pastel/index.d.ts.map +1 -1
- package/build/lib/pastel/index.js +104 -18
- package/build/lib/pastel/index.js.map +1 -1
- package/build/lib/pastel/internal-types.d.ts +39 -8
- package/build/lib/pastel/internal-types.d.ts.map +1 -1
- package/build/lib/pastel/manifest.d.ts +8 -0
- package/build/lib/pastel/manifest.d.ts.map +1 -0
- package/build/lib/pastel/manifest.js +7 -0
- package/build/lib/pastel/manifest.js.map +1 -0
- package/build/lib/pastel/read-commands.d.ts +7 -2
- package/build/lib/pastel/read-commands.d.ts.map +1 -1
- package/build/lib/pastel/read-commands.js +51 -30
- package/build/lib/pastel/read-commands.js.map +1 -1
- package/build/lib/pastel/render-command.d.ts +13 -0
- package/build/lib/pastel/render-command.d.ts.map +1 -0
- package/build/lib/pastel/render-command.js +56 -0
- package/build/lib/pastel/render-command.js.map +1 -0
- package/build/lib/process-alive.d.ts +11 -0
- package/build/lib/process-alive.d.ts.map +1 -0
- package/build/lib/process-alive.js +22 -0
- package/build/lib/process-alive.js.map +1 -0
- package/build/lib/pruner.d.ts +26 -0
- package/build/lib/pruner.d.ts.map +1 -0
- package/build/lib/pruner.js +42 -0
- package/build/lib/pruner.js.map +1 -0
- package/build/lib/publish-flow.d.ts +3 -6
- package/build/lib/publish-flow.d.ts.map +1 -1
- package/build/lib/publish-flow.js +199 -246
- package/build/lib/publish-flow.js.map +1 -1
- package/build/lib/publish-run.d.ts +2 -2
- package/build/lib/publish-run.js +11 -6
- package/build/lib/publish-run.js.map +1 -1
- package/build/lib/publisher.d.ts +23 -16
- package/build/lib/publisher.d.ts.map +1 -1
- package/build/lib/publisher.js +34 -35
- package/build/lib/publisher.js.map +1 -1
- package/build/lib/registrar.d.ts.map +1 -1
- package/build/lib/registrar.js +2 -2
- package/build/lib/registrar.js.map +1 -1
- package/build/lib/registry.d.ts +18 -7
- package/build/lib/registry.d.ts.map +1 -1
- package/build/lib/registry.js +113 -32
- package/build/lib/registry.js.map +1 -1
- package/build/lib/schemas/config.d.ts +3 -1
- package/build/lib/schemas/config.d.ts.map +1 -1
- package/build/lib/schemas/config.js +1 -1
- package/build/lib/schemas/config.js.map +1 -1
- 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/sync.d.ts +22 -6
- package/build/lib/sync.d.ts.map +1 -1
- package/build/lib/sync.js +31 -7
- package/build/lib/sync.js.map +1 -1
- package/build/lib/uninstaller.d.ts.map +1 -1
- package/build/lib/uninstaller.js +6 -3
- package/build/lib/uninstaller.js.map +1 -1
- package/build/lib/update-check.d.ts +4 -0
- package/build/lib/update-check.d.ts.map +1 -1
- package/build/lib/update-check.js +55 -56
- package/build/lib/update-check.js.map +1 -1
- package/build/lib/updater.d.ts +31 -1
- package/build/lib/updater.d.ts.map +1 -1
- package/build/lib/updater.js +143 -4
- package/build/lib/updater.js.map +1 -1
- package/build/lib/usage-error.d.ts +20 -0
- package/build/lib/usage-error.d.ts.map +1 -0
- package/build/lib/usage-error.js +41 -0
- package/build/lib/usage-error.js.map +1 -0
- 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/build/lib/write-file.d.ts.map +1 -1
- package/build/lib/write-file.js +63 -11
- package/build/lib/write-file.js.map +1 -1
- package/package.json +3 -3
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/lib/write-file.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-file.d.ts","sourceRoot":"","sources":["../../src/lib/write-file.ts"],"names":[],"mappings":"AAoBA,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9G;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhH;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
package/build/lib/write-file.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { randomBytes } from 'node:crypto';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
import {
|
|
4
|
-
import { dirname } from 'node:path';
|
|
3
|
+
import { mkdir, open, readdir, readFile, realpath, rename, stat, unlink, writeFile, } from 'node:fs/promises';
|
|
4
|
+
import { basename, dirname, join } from 'node:path';
|
|
5
5
|
import { setTimeout as sleep } from 'node:timers/promises';
|
|
6
6
|
import { stringify as stringifyToml } from 'smol-toml';
|
|
7
|
+
import { isProcessAlive } from './process-alive.js';
|
|
7
8
|
/**
|
|
8
9
|
* Default indentation for brand-new JSON files that ATK creates (no existing
|
|
9
10
|
* file to match). Two spaces matches the JSON ecosystem norm (npm lockfiles,
|
|
@@ -123,24 +124,71 @@ async function readIfExists(filePath) {
|
|
|
123
124
|
return undefined;
|
|
124
125
|
return readFile(filePath, 'utf-8');
|
|
125
126
|
}
|
|
127
|
+
/** A temp file this old is no write in progress, whoever now has its pid (a reboot reuses them). */
|
|
128
|
+
const STALE_TEMP_MS = 60 * 60 * 1000;
|
|
126
129
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
130
|
+
* Remove the temp files {@link writeFileAtomic} left next to `target` when a writer was killed
|
|
131
|
+
* between its write and its rename: `<name>.tmp.<pid>.<hex>` whose process has exited, or that is
|
|
132
|
+
* older than {@link STALE_TEMP_MS}. A live writer's are left alone. Nothing here fails the write.
|
|
133
|
+
*/
|
|
134
|
+
async function removeStaleTempFiles(target) {
|
|
135
|
+
try {
|
|
136
|
+
const dir = dirname(target);
|
|
137
|
+
const prefix = `${basename(target)}.tmp.`;
|
|
138
|
+
for (const entry of await readdir(dir)) {
|
|
139
|
+
if (!entry.startsWith(prefix))
|
|
140
|
+
continue;
|
|
141
|
+
const match = /^(\d+)\.[0-9a-f]{8}$/.exec(entry.slice(prefix.length));
|
|
142
|
+
if (!match)
|
|
143
|
+
continue;
|
|
144
|
+
const pid = Number(match[1]);
|
|
145
|
+
const tempPath = join(dir, entry);
|
|
146
|
+
const exited = pid !== process.pid && !isProcessAlive(pid);
|
|
147
|
+
if (!exited && Date.now() - (await stat(tempPath)).mtimeMs <= STALE_TEMP_MS)
|
|
148
|
+
continue;
|
|
149
|
+
await unlink(tempPath).catch(() => undefined);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// An unreadable or missing directory has nothing to sweep.
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Sync a file's data to disk, skipping a filesystem that can't (some network and FUSE mounts). */
|
|
157
|
+
async function syncUnlessUnsupported(handle) {
|
|
158
|
+
try {
|
|
159
|
+
await handle.sync();
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const code = error.code;
|
|
163
|
+
if (code !== 'EINVAL' && code !== 'ENOTSUP')
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Write `content` to a temp file next to `target` (a symlink already resolved, so it is written
|
|
169
|
+
* through) and rename it over the file. The file keeps its mode (a `.claude.json` kept at 0600
|
|
129
170
|
* because it holds MCP secrets stays 0600); a new file gets 0600, or the default mode when it is
|
|
130
|
-
* `shared`.
|
|
171
|
+
* `shared`. The temp file is synced before the rename, so a power loss can't persist the rename
|
|
172
|
+
* ahead of the data and leave an empty file. Windows refuses a rename while another process (an
|
|
131
173
|
* antivirus scan, the tool reading it) has the file open, so a refused rename is retried briefly.
|
|
132
174
|
* The temp file is removed when the write fails.
|
|
133
175
|
*/
|
|
134
|
-
async function writeFileAtomic(
|
|
135
|
-
const target = existsSync(filePath) ? await realpath(filePath) : filePath;
|
|
176
|
+
async function writeFileAtomic(target, content, shared) {
|
|
136
177
|
// A new file is private to its owner unless it is shared: what a tool rewrites while it runs can
|
|
137
178
|
// hold secrets.
|
|
138
179
|
const mode = existsSync(target) ? (await stat(target)).mode & 0o777 : shared ? undefined : 0o600;
|
|
139
180
|
const tempPath = `${target}.tmp.${process.pid}.${randomBytes(4).toString('hex')}`;
|
|
140
181
|
try {
|
|
141
|
-
await
|
|
142
|
-
|
|
143
|
-
await
|
|
182
|
+
const handle = await open(tempPath, 'w', mode);
|
|
183
|
+
try {
|
|
184
|
+
await handle.writeFile(content, 'utf-8');
|
|
185
|
+
if (mode !== undefined)
|
|
186
|
+
await handle.chmod(mode);
|
|
187
|
+
await syncUnlessUnsupported(handle);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await handle.close();
|
|
191
|
+
}
|
|
144
192
|
await renameWithRetry(tempPath, target);
|
|
145
193
|
}
|
|
146
194
|
catch (error) {
|
|
@@ -153,6 +201,10 @@ async function writeFileAtomic(filePath, content, shared) {
|
|
|
153
201
|
* the parent directory as needed. A no-op when the content already matches.
|
|
154
202
|
*/
|
|
155
203
|
async function writeFileIfChanged(filePath, content, existing, { atomic = false, shared = false } = {}) {
|
|
204
|
+
const target = atomic && existsSync(filePath) ? await realpath(filePath) : filePath;
|
|
205
|
+
// Swept on an unchanged write too: the next run after a killed one often changes nothing.
|
|
206
|
+
if (atomic)
|
|
207
|
+
await removeStaleTempFiles(target);
|
|
156
208
|
if (existing === content)
|
|
157
209
|
return;
|
|
158
210
|
const dir = dirname(filePath);
|
|
@@ -163,7 +215,7 @@ async function writeFileIfChanged(filePath, content, existing, { atomic = false,
|
|
|
163
215
|
await writeFile(filePath, content, 'utf-8');
|
|
164
216
|
return;
|
|
165
217
|
}
|
|
166
|
-
await writeFileAtomic(
|
|
218
|
+
await writeFileAtomic(target, content, shared);
|
|
167
219
|
}
|
|
168
220
|
/** How often, and how far apart, a rename Windows refused is tried again. */
|
|
169
221
|
const RENAME_RETRIES = 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/lib/write-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"write-file.js","sourceRoot":"","sources":["../../src/lib/write-file.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": "8.9.
|
|
3
|
+
"version": "8.9.1-dev.1",
|
|
4
4
|
"description": "Agentic Tool Kit — CLI for managing AI coding tool assets.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,7 +27,6 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@azure/msal-node": "^6.0.0",
|
|
30
|
-
"@inkjs/ui": "^2.0.0",
|
|
31
30
|
"chalk": "^5.4.0",
|
|
32
31
|
"commander": "^14.0.1",
|
|
33
32
|
"decamelize": "^6.0.1",
|
|
@@ -67,7 +66,7 @@
|
|
|
67
66
|
"@atk/tsconfig": "0.0.0"
|
|
68
67
|
},
|
|
69
68
|
"scripts": {
|
|
70
|
-
"build": "tsc",
|
|
69
|
+
"build": "pnpm manifest && tsc",
|
|
71
70
|
"check:packed": "node scripts/check-packed-help.mjs",
|
|
72
71
|
"dev": "tsc --watch",
|
|
73
72
|
"export-schemas": "tsx scripts/export-schemas.ts",
|
|
@@ -75,6 +74,7 @@
|
|
|
75
74
|
"format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
|
|
76
75
|
"lint": "eslint src/",
|
|
77
76
|
"lint:fix": "eslint src/ --fix --cache",
|
|
77
|
+
"manifest": "tsx scripts/write-command-manifest.ts",
|
|
78
78
|
"test": "vitest run",
|
|
79
79
|
"test:watch": "vitest",
|
|
80
80
|
"typecheck": "tsc --noEmit"
|