@detergent-software/atk 9.0.0-dev.2 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/build/command-manifest.json +10 -0
- package/build/commands/doctor.d.ts +3 -1
- package/build/commands/doctor.d.ts.map +1 -1
- package/build/commands/doctor.js +121 -4
- package/build/commands/doctor.js.map +1 -1
- package/build/components/DiagnosticList.d.ts +4 -0
- package/build/components/DiagnosticList.d.ts.map +1 -1
- package/build/components/DiagnosticList.js +1 -1
- package/build/components/DiagnosticList.js.map +1 -1
- package/build/lib/diagnostics.d.ts +34 -0
- package/build/lib/diagnostics.d.ts.map +1 -1
- package/build/lib/diagnostics.js +433 -50
- package/build/lib/diagnostics.js.map +1 -1
- package/build/lib/doctor-fix.d.ts +33 -0
- package/build/lib/doctor-fix.d.ts.map +1 -0
- package/build/lib/doctor-fix.js +153 -0
- package/build/lib/doctor-fix.js.map +1 -0
- package/build/lib/registry.d.ts +5 -0
- package/build/lib/registry.d.ts.map +1 -1
- package/build/lib/registry.js +11 -0
- package/build/lib/registry.js.map +1 -1
- package/build/lib/update-check.d.ts +17 -0
- package/build/lib/update-check.d.ts.map +1 -1
- package/build/lib/update-check.js +36 -4
- package/build/lib/update-check.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,77 @@
|
|
|
1
|
+
## [9.0.0](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/branchCompare?baseVersion=GTv8.9.1&targetVersion=GTv9.0.0) (2026-10-21)
|
|
2
|
+
|
|
3
|
+
### ⚠ BREAKING CHANGES
|
|
4
|
+
|
|
5
|
+
* **cli:** short flags that meant two things are gone or moved.
|
|
6
|
+
- publish, unpublish, promote, deprecate: --dry-run is -n. The old -d
|
|
7
|
+
is an unknown option on all four.
|
|
8
|
+
- init, register, drift: --name has no short flag (was -n).
|
|
9
|
+
- init, register: --author has no short flag (was -a).
|
|
10
|
+
- deprecate: --reason has no short flag (was -m).
|
|
11
|
+
- info: --full and --verbose have no short flags (were -f and -v);
|
|
12
|
+
`atk info <asset> -v` prints the CLI version.
|
|
13
|
+
- release-notes: --prerelease has no short flag (was -p).
|
|
14
|
+
- move gains -n (--dry-run) and setup gains -j (--json).
|
|
15
|
+
|
|
16
|
+
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* **cli:** atk doctor runs real checks and offers --fix (ATK-617) ([1d026a9](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/1d026a982365f4457d13617ae88f114dd327a06d))
|
|
21
|
+
* **cli:** report bundle members kept outside it, and adopt them (ATK-674) ([bf3b656](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/bf3b6568e3738df1af8c9eb7b67b423e36fedf9a))
|
|
22
|
+
|
|
23
|
+
### Bug Fixes
|
|
24
|
+
|
|
25
|
+
* **api-client:** name each failing field in unexpected_response (ATK-657) ([6018774](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/6018774b41ca6858d89f72066b277c865b45de6c))
|
|
26
|
+
* **cli:** adopt an installed bundle's members in the lockfile alone (ATK-674) ([9ee62fb](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/9ee62fb000ce891fc5bf4d6d7c7ba7be2296d498))
|
|
27
|
+
* **cli:** ask a raw publish's tags once (ATK-656) ([e02f29f](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/e02f29f5c1b3de2b2a096a964fcaa7227901cc93))
|
|
28
|
+
* **cli:** check symlinked paths before any write, and only what a delete follows (ATK-665) ([5c6e17d](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/5c6e17d7bed21e627916d228a9a8c20d56fe6c08))
|
|
29
|
+
* **cli:** confirm doctor's sign-in repair and skip undeclared hooks (ATK-617) ([c665d71](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/c665d717ea2052c6fd2d6c4795355a9e6807b14c))
|
|
30
|
+
* **cli:** drop only the version flag the command declares (ATK-645) ([88ef766](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/88ef7660496b080bcc5a66e991b71910b7ec0684))
|
|
31
|
+
* **cli:** fall back to the cache at once when the API is unreachable ([536eb93](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/536eb93b162824879ac3040300b1855bf79ae4c5))
|
|
32
|
+
* **cli:** give each short flag one meaning across commands (ATK-596) ([aa421fb](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/aa421fbadfb182e98cc6a1cbed17bce8e0e734de))
|
|
33
|
+
* **cli:** harden the raw manifest reads from review (ATK-639) ([3741b8f](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/3741b8f2d440936d9674b19f4f2185ad06ac09e7))
|
|
34
|
+
* **cli:** keep an edited copy of a hook sync would remove (ATK-641) ([0005598](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/000559824b69ad2077b14a5657c5cfe0fad4ea4c))
|
|
35
|
+
* **cli:** keep doctor --fix from signing out a working session (ATK-617) ([9f0513b](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/9f0513b4037141681634c4a5b28fee5803203e21))
|
|
36
|
+
* **cli:** keep prune's lockfile in step when a second tool's removal fails (ATK-661) ([d359507](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/d359507cecfdf0f3030ab189cd0dec41f07e8b57))
|
|
37
|
+
* **cli:** keep the run's flags on the org spec install names (ATK-647) ([af1f5ca](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/af1f5cad7f822005defeec7834330cecd33a40eb))
|
|
38
|
+
* **cli:** keep unknown manifest fields for install and the publish diff (ATK-639) ([e54dce4](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/e54dce4c300324587beac69e24e34d6ebb182d1f))
|
|
39
|
+
* **cli:** let a command's own -v and --version reach it (ATK-645) ([86a71df](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/86a71df57ebf7a189c3a96c12df58ad37933d336))
|
|
40
|
+
* **cli:** let the unreachable-API memo expire, and classify more connect failures ([93f6bb3](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/93f6bb353aa75638638b01a2ab4db77f7da79a69))
|
|
41
|
+
* **cli:** name the org spec for a bare name with only an org asset (ATK-647) ([440084d](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/440084d025c2fa7084448058836f55fe367d4c2b))
|
|
42
|
+
* **cli:** name the resolved asset in the --update README hint (ATK-678) ([2995d86](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/2995d868246cd978073bd48f6cb7d5f1f34bd68d))
|
|
43
|
+
* **cli:** plan a publish once, not again before the submit ([167736d](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/167736d482a9bd274917b145bd6fb7377549388c))
|
|
44
|
+
* **cli:** point publish --update at atk checkout for a placeholder README (ATK-678) ([69f71fd](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/69f71fd79d683ee19ffdad22b48e1bb6bcdd5889))
|
|
45
|
+
* **cli:** quote publish paths a shell would change in the --yes command (ATK-583) ([af82487](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/af824871ae822ef94c3778395feecfaa4122896f))
|
|
46
|
+
* **cli:** refuse placed and config files that a symlink leads outside the project (ATK-665) ([5cd4421](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/5cd4421fdabc38caff802cf43437d51ed0ecf0ba))
|
|
47
|
+
* **cli:** report only the bundle members the run's tools place (ATK-674) ([9c8b957](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/9c8b957dbd9e988321bc054686cef919482fb432))
|
|
48
|
+
* **cli:** require --yes for registry writes that can't prompt (ATK-583) ([d92e10c](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/d92e10ca09736955ab3181204e5768681ab3046d))
|
|
49
|
+
* **cli:** show a publish error's hint once (ATK-653) ([00b79cb](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/00b79cbc7a13bf1244389587873d3a02d2d16386))
|
|
50
|
+
* **cli:** show the root's validation on publish's confirm screen (ATK-654) ([e4717cd](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/e4717cd4f61592bda2626a8be308fa0f8fd27647))
|
|
51
|
+
* **cli:** skip tools an orphan is excluded for when pruning (ATK-661) ([d67957d](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/d67957d0a60d5bece1d675abcb90ee531ed3384d))
|
|
52
|
+
|
|
53
|
+
### Performance
|
|
54
|
+
|
|
55
|
+
* **cli:** cap a plan's file downloads at 8 at once (ATK-660) ([769bf16](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/769bf166ec3b305e2b0481de52b32f1cf6e4a669))
|
|
56
|
+
* **cli:** download a multi-tool update's and sync's assets once (ATK-659) ([c9f6bbb](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/c9f6bbb417f92cb86b38e6a40d457c0d92dba5e7))
|
|
57
|
+
* **cli:** share downloads only across tools, and keep partial ones (ATK-659) ([286433e](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/286433ed78fc11561a6df1408fb4007724919f16))
|
|
58
|
+
* **cli:** skip an asset's queued file downloads once one fails (ATK-660) ([e1f9007](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/e1f9007f77fc8de4d6f29beee384522a36d41203))
|
|
59
|
+
|
|
60
|
+
### Refactoring
|
|
61
|
+
|
|
62
|
+
* **cli:** inline sync's edited-copy check for undeclared hooks (ATK-641) ([73896a3](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/73896a338ed510145aa520c83e2cb3d8f09fa6ca))
|
|
63
|
+
|
|
64
|
+
## [9.0.0-dev.3](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/branchCompare?baseVersion=GTv9.0.0-dev.2&targetVersion=GTv9.0.0-dev.3) (2026-10-21)
|
|
65
|
+
|
|
66
|
+
### Features
|
|
67
|
+
|
|
68
|
+
* **cli:** atk doctor runs real checks and offers --fix (ATK-617) ([1d026a9](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/1d026a982365f4457d13617ae88f114dd327a06d))
|
|
69
|
+
|
|
70
|
+
### Bug Fixes
|
|
71
|
+
|
|
72
|
+
* **cli:** confirm doctor's sign-in repair and skip undeclared hooks (ATK-617) ([c665d71](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/c665d717ea2052c6fd2d6c4795355a9e6807b14c))
|
|
73
|
+
* **cli:** keep doctor --fix from signing out a working session (ATK-617) ([9f0513b](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/commit/9f0513b4037141681634c4a5b28fee5803203e21))
|
|
74
|
+
|
|
1
75
|
## [9.0.0-dev.2](https://emergentcode.visualstudio.com/Emergent%20Software/_git/Emergent.AgenticToolkit/branchCompare?baseVersion=GTv9.0.0-dev.1&targetVersion=GTv9.0.0-dev.2) (2026-10-20)
|
|
2
76
|
|
|
3
77
|
### Bug Fixes
|
|
@@ -272,6 +272,11 @@
|
|
|
272
272
|
"description": "Check environment health and diagnose issues",
|
|
273
273
|
"file": "doctor.js",
|
|
274
274
|
"options": [
|
|
275
|
+
{
|
|
276
|
+
"flags": "--fix",
|
|
277
|
+
"description": "Repair what it can (a corrupt cache, missing files, an expired sign-in), asking first",
|
|
278
|
+
"defaultValue": false
|
|
279
|
+
},
|
|
275
280
|
{
|
|
276
281
|
"flags": "-j, --json",
|
|
277
282
|
"description": "Output raw JSON (for scripting and CI)",
|
|
@@ -285,6 +290,11 @@
|
|
|
285
290
|
"flags": "--user",
|
|
286
291
|
"description": "Use the user scope (the user root, ~ by default) instead of the project",
|
|
287
292
|
"defaultValue": false
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"flags": "-y, --yes",
|
|
296
|
+
"description": "With --fix, repair without asking",
|
|
297
|
+
"defaultValue": false
|
|
288
298
|
}
|
|
289
299
|
]
|
|
290
300
|
},
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const description = "Check environment health and diagnose issues";
|
|
3
3
|
export declare const options: z.ZodObject<{
|
|
4
|
+
fix: z.ZodDefault<z.ZodBoolean>;
|
|
4
5
|
json: z.ZodDefault<z.ZodBoolean>;
|
|
5
6
|
projectRoot: z.ZodOptional<z.ZodString>;
|
|
6
7
|
user: z.ZodOptional<z.ZodBoolean>;
|
|
8
|
+
yes: z.ZodDefault<z.ZodBoolean>;
|
|
7
9
|
}, z.core.$strip>;
|
|
8
10
|
type Props = {
|
|
9
11
|
options: z.infer<typeof options>;
|
|
10
12
|
};
|
|
11
|
-
export default function Doctor({ options: { json, projectRoot, user } }: Props): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export default function Doctor({ options: { fix, json, projectRoot, user, yes } }: Props): import("react/jsx-runtime").JSX.Element;
|
|
12
14
|
export {};
|
|
13
15
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,eAAO,MAAM,WAAW,iDAAiD,CAAC;AAE1E,eAAO,MAAM,OAAO;;;;;;iBA4ClB,CAAC;AA+BH,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,2CAmJvF"}
|
package/build/commands/doctor.js
CHANGED
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box, Text } from 'ink';
|
|
2
|
+
import { Box, Text, useApp } from 'ink';
|
|
3
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
import { DiagnosticList, ErrorView, Link, Spinner } from '../components/index.js';
|
|
5
6
|
import { useCommand } from '../hooks/useCommand.js';
|
|
7
|
+
import { useConfirmation } from '../hooks/useConfirmation.js';
|
|
8
|
+
import { CONFIRMATION_REQUIRED_CODE } from '../lib/confirmation-required.js';
|
|
6
9
|
import { runDiagnostics } from '../lib/diagnostics.js';
|
|
10
|
+
import { applyFix, planFixes } from '../lib/doctor-fix.js';
|
|
11
|
+
import { errorMessage } from '../lib/errors.js';
|
|
7
12
|
import { renderJson, useNonInteractive } from '../lib/output.js';
|
|
8
13
|
import { option } from '../lib/pastel/index.js';
|
|
9
14
|
import { buildGettingStartedWebUrl } from '../lib/web-app.js';
|
|
10
15
|
export const description = 'Check environment health and diagnose issues';
|
|
11
16
|
export const options = z.object({
|
|
17
|
+
fix: z
|
|
18
|
+
.boolean()
|
|
19
|
+
.default(false)
|
|
20
|
+
.describe(option({
|
|
21
|
+
description: 'Repair what it can (a corrupt cache, missing files, an expired sign-in), asking first',
|
|
22
|
+
})),
|
|
12
23
|
json: z
|
|
13
24
|
.boolean()
|
|
14
25
|
.default(false)
|
|
@@ -29,12 +40,66 @@ export const options = z.object({
|
|
|
29
40
|
.describe(option({
|
|
30
41
|
description: 'Use the user scope (the user root, ~ by default) instead of the project',
|
|
31
42
|
})),
|
|
43
|
+
yes: z
|
|
44
|
+
.boolean()
|
|
45
|
+
.default(false)
|
|
46
|
+
.describe(option({
|
|
47
|
+
alias: 'y',
|
|
48
|
+
description: 'With --fix, repair without asking',
|
|
49
|
+
})),
|
|
32
50
|
});
|
|
33
|
-
|
|
51
|
+
/** The registry writes' message names `--dry-run`, which doctor doesn't have: the plan is in `fixes`. */
|
|
52
|
+
const FIX_CONFIRMATION_MESSAGE = "Confirmation required: this run can't prompt (--json, or no TTY on stdin). Use --yes (-y) to apply the repairs in fixes.";
|
|
53
|
+
export default function Doctor({ options: { fix, json, projectRoot, user, yes } }) {
|
|
54
|
+
const { exit } = useApp();
|
|
34
55
|
const { json: effectiveJson } = useNonInteractive(json);
|
|
35
56
|
const state = useCommand(async (progress) => {
|
|
36
57
|
return runDiagnostics(progress, { projectRoot, user });
|
|
37
58
|
}, [projectRoot, user], 'Running diagnostics...');
|
|
59
|
+
const fixes = useMemo(() => (fix && state.status === 'done' ? planFixes(state.data) : []), [fix, state]);
|
|
60
|
+
// Without --yes, a run that can't prompt (--json, or no TTY) repairs nothing.
|
|
61
|
+
const needsConfirmation = fixes.length > 0 && !yes;
|
|
62
|
+
const confirmation = useConfirmation(needsConfirmation && !effectiveJson);
|
|
63
|
+
const go = fixes.length > 0 && (yes || confirmation.isConfirmed);
|
|
64
|
+
const [fixState, setFixState] = useState({ phase: 'idle' });
|
|
65
|
+
const started = useRef(false);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!go || started.current)
|
|
68
|
+
return;
|
|
69
|
+
started.current = true;
|
|
70
|
+
const progress = (message) => setFixState({ message, phase: 'fixing' });
|
|
71
|
+
void (async () => {
|
|
72
|
+
try {
|
|
73
|
+
const results = [];
|
|
74
|
+
for (const planned of fixes) {
|
|
75
|
+
results.push(await applyFix(planned, {
|
|
76
|
+
interactive: !effectiveJson,
|
|
77
|
+
onDeviceCode: (prompt) => setFixState({ message: 'Waiting for you to sign in', phase: 'fixing', prompt }),
|
|
78
|
+
progress,
|
|
79
|
+
projectRoot,
|
|
80
|
+
user,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
const checks = await runDiagnostics(progress, { projectRoot, user });
|
|
84
|
+
setFixState({ checks, phase: 'done', results });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
setFixState({ error: errorMessage(err), phase: 'error' });
|
|
88
|
+
}
|
|
89
|
+
})();
|
|
90
|
+
}, [go, fixes, effectiveJson, projectRoot, user]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (confirmation.isCancelled)
|
|
93
|
+
setFixState({ phase: 'cancelled' });
|
|
94
|
+
}, [confirmation.isCancelled]);
|
|
95
|
+
// The prompt holds stdin, so leave once --fix has nothing more to do.
|
|
96
|
+
const finished = fixState.phase === 'done' || fixState.phase === 'cancelled' || fixState.phase === 'error';
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
if (!finished)
|
|
99
|
+
return;
|
|
100
|
+
const timer = setTimeout(() => exit(), 100);
|
|
101
|
+
return () => clearTimeout(timer);
|
|
102
|
+
}, [finished, exit]);
|
|
38
103
|
if (state.status === 'loading') {
|
|
39
104
|
return _jsx(Spinner, { message: state.message });
|
|
40
105
|
}
|
|
@@ -50,21 +115,54 @@ export default function Doctor({ options: { json, projectRoot, user } }) {
|
|
|
50
115
|
}
|
|
51
116
|
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(ErrorView, { command: state.command, hint: state.hint, message: state.message }), _jsx(TroubleshootingVideo, {})] }));
|
|
52
117
|
}
|
|
118
|
+
if (fixState.phase === 'error') {
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
return effectiveJson ? (renderJson({ message: fixState.error, outcome: 'error' })) : (_jsx(ErrorView, { message: fixState.error }));
|
|
121
|
+
}
|
|
122
|
+
if (fixState.phase === 'fixing') {
|
|
123
|
+
return _jsx(Fixing, { message: fixState.message, prompt: fixState.prompt });
|
|
124
|
+
}
|
|
125
|
+
if (fixState.phase === 'done') {
|
|
126
|
+
const output = buildJsonOutput(fixState.checks);
|
|
127
|
+
// Set both ways: the first diagnosis's fail, behind the y/n prompt, already set it to 1.
|
|
128
|
+
process.exitCode = output.summary.fail > 0 || fixState.results.some((r) => r.status === 'failed') ? 1 : 0;
|
|
129
|
+
if (effectiveJson) {
|
|
130
|
+
return renderJson({ ...output, fixes: fixState.results });
|
|
131
|
+
}
|
|
132
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(FixResults, { results: fixState.results }), _jsx(DiagnosticList, { checks: fixState.checks, title: 'Environment diagnostics after --fix' }), _jsx(TroubleshootingVideo, {})] }));
|
|
133
|
+
}
|
|
53
134
|
const output = buildJsonOutput(state.data);
|
|
135
|
+
if (go) {
|
|
136
|
+
// The repairs start on the next effect.
|
|
137
|
+
return _jsx(Fixing, { message: 'Starting repairs...' });
|
|
138
|
+
}
|
|
139
|
+
if (needsConfirmation && effectiveJson) {
|
|
140
|
+
process.exitCode = 1;
|
|
141
|
+
return renderJson({
|
|
142
|
+
code: CONFIRMATION_REQUIRED_CODE,
|
|
143
|
+
command: confirmCommand(projectRoot, user),
|
|
144
|
+
...output,
|
|
145
|
+
fixes,
|
|
146
|
+
message: FIX_CONFIRMATION_MESSAGE,
|
|
147
|
+
outcome: 'error',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
54
150
|
if (output.summary.fail > 0) {
|
|
55
151
|
process.exitCode = 1;
|
|
56
152
|
}
|
|
57
153
|
if (effectiveJson) {
|
|
58
|
-
return renderJson(output);
|
|
154
|
+
return renderJson(fix ? { ...output, fixes: [] } : output);
|
|
59
155
|
}
|
|
60
|
-
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(DiagnosticList, { checks: state.data, title: 'Environment diagnostics' }), _jsx(TroubleshootingVideo, {})] }));
|
|
156
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(DiagnosticList, { checks: state.data, title: 'Environment diagnostics' }), fix && fixes.length === 0 && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Nothing for --fix to repair." }) })), needsConfirmation && _jsx(FixPrompt, { cancelled: fixState.phase === 'cancelled', fixes: fixes }), _jsx(TroubleshootingVideo, {})] }));
|
|
61
157
|
}
|
|
62
158
|
function buildJsonOutput(checks) {
|
|
63
159
|
const summary = { fail: 0, pass: 0, warn: 0 };
|
|
64
160
|
const diagnostics = checks.map((check) => {
|
|
65
161
|
summary[check.status] += 1;
|
|
66
162
|
return {
|
|
163
|
+
...(check.command !== undefined ? { command: check.command } : {}),
|
|
67
164
|
...(check.detail !== undefined ? { detail: check.detail } : {}),
|
|
165
|
+
id: check.id,
|
|
68
166
|
message: check.message,
|
|
69
167
|
name: check.name,
|
|
70
168
|
status: check.status,
|
|
@@ -76,6 +174,25 @@ function buildJsonOutput(checks) {
|
|
|
76
174
|
summary,
|
|
77
175
|
};
|
|
78
176
|
}
|
|
177
|
+
/** `atk doctor --fix --yes` in the scope this run checked. */
|
|
178
|
+
function confirmCommand(projectRoot, user) {
|
|
179
|
+
const scope = user ? ' --user' : projectRoot ? ` -P ${JSON.stringify(projectRoot)}` : '';
|
|
180
|
+
return `atk doctor --fix --yes${scope}`;
|
|
181
|
+
}
|
|
182
|
+
function Fixing({ message, prompt }) {
|
|
183
|
+
if (!prompt) {
|
|
184
|
+
return _jsx(Spinner, { message: message });
|
|
185
|
+
}
|
|
186
|
+
return (_jsxs(Box, { flexDirection: 'column', gap: 1, children: [_jsxs(Text, { children: ["To sign in, open ", _jsx(Link, { url: prompt.verificationUri, children: prompt.verificationUri }), " and enter the code", ' ', _jsx(Text, { bold: true, color: 'cyan', children: prompt.userCode })] }), _jsx(Spinner, { message: message })] }));
|
|
187
|
+
}
|
|
188
|
+
/** The planned repairs and the y/n question, or that the run was cancelled. */
|
|
189
|
+
function FixPrompt({ cancelled, fixes }) {
|
|
190
|
+
return (_jsxs(Box, { flexDirection: 'column', marginTop: 1, children: [_jsx(Text, { bold: true, children: "--fix would:" }), fixes.map((f) => (_jsxs(Text, { children: [' ', "\u2022 ", f.description, " (", _jsx(Text, { dimColor: true, children: f.command }), ")"] }, f.kind))), cancelled ? _jsx(Text, { color: 'yellow', children: "Cancelled; nothing changed." }) : _jsx(Text, { children: "Apply these repairs? (y/n)" })] }));
|
|
191
|
+
}
|
|
192
|
+
function FixResults({ results }) {
|
|
193
|
+
const color = { applied: 'green', failed: 'red', skipped: 'yellow' };
|
|
194
|
+
return (_jsxs(Box, { flexDirection: 'column', marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Repairs" }), results.map((r) => (_jsxs(Text, { children: [' ', _jsx(Text, { color: color[r.status], children: r.status }), " ", r.description, ": ", r.message] }, r.kind)))] }));
|
|
195
|
+
}
|
|
79
196
|
/** Human output only: the getting-started chapter on atk doctor and what to do next. */
|
|
80
197
|
function TroubleshootingVideo() {
|
|
81
198
|
const video = buildGettingStartedWebUrl('troubleshoot');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
export interface DiagnosticCheck {
|
|
2
|
+
/** The command that fixes the check, for `--json`; the human `detail` says it in words. */
|
|
3
|
+
command?: string;
|
|
2
4
|
detail?: string;
|
|
5
|
+
/** A stable, machine-readable name for the check (`api`, `cache`, `user-lockfile`). */
|
|
6
|
+
id: string;
|
|
3
7
|
message: string;
|
|
4
8
|
name: string;
|
|
5
9
|
status: 'fail' | 'pass' | 'warn';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticList.d.ts","sourceRoot":"","sources":["../../src/components/DiagnosticList.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,UAAU,mBAAmB;IAC3B,4CAA4C;IAC5C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,mBAAmB,2CAuB5E"}
|
|
1
|
+
{"version":3,"file":"DiagnosticList.d.ts","sourceRoot":"","sources":["../../src/components/DiagnosticList.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,UAAU,mBAAmB;IAC3B,4CAA4C;IAC5C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,mBAAmB,2CAuB5E"}
|
|
@@ -9,7 +9,7 @@ export default function DiagnosticList({ checks, title }) {
|
|
|
9
9
|
const passCount = checks.filter((c) => c.status === 'pass').length;
|
|
10
10
|
const warnCount = checks.filter((c) => c.status === 'warn').length;
|
|
11
11
|
const failCount = checks.filter((c) => c.status === 'fail').length;
|
|
12
|
-
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { children: " " }), checks.map((check) => (_jsxs(Box, { flexDirection: 'column', children: [_jsxs(Text, { children: [_jsx(CheckIcon, { status: check.status }), " ", _jsx(Text, { bold: true, children: check.name }), ' — ', check.message] }), check.detail && _jsxs(Text, { dimColor: true, children: [" ", check.detail] })] }, check.
|
|
12
|
+
return (_jsxs(Box, { flexDirection: 'column', children: [_jsx(Text, { bold: true, children: title }), _jsx(Text, { children: " " }), checks.map((check) => (_jsxs(Box, { flexDirection: 'column', children: [_jsxs(Text, { children: [_jsx(CheckIcon, { status: check.status }), " ", _jsx(Text, { bold: true, children: check.name }), ' — ', check.message] }), check.detail && _jsxs(Text, { dimColor: true, children: [" ", check.detail] })] }, check.id))), _jsx(Text, { children: " " }), _jsx(DiagnosticSummary, { failCount: failCount, passCount: passCount, warnCount: warnCount })] }));
|
|
13
13
|
}
|
|
14
14
|
function DiagnosticSummary({ failCount, passCount, warnCount, }) {
|
|
15
15
|
return (_jsxs(Box, { flexDirection: 'column', children: [_jsxs(Text, { children: [_jsxs(Text, { color: 'green', children: [passCount, " passed"] }), warnCount > 0 && (_jsxs(Text, { children: [",", ' ', _jsxs(Text, { color: 'yellow', children: [warnCount, " ", warnCount === 1 ? 'warning' : 'warnings'] })] })), failCount > 0 && (_jsxs(Text, { children: [", ", _jsxs(Text, { color: 'red', children: [failCount, " failed"] })] }))] }), failCount > 0 && _jsx(Text, { dimColor: true, children: "Fix the failed checks above to ensure atk works correctly." })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticList.js","sourceRoot":"","sources":["../../src/components/DiagnosticList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"DiagnosticList.js","sourceRoot":"","sources":["../../src/components/DiagnosticList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAoB7C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAuB;IAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAEnE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,GAAQ,EACzB,KAAC,IAAI,oBAAS,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,eACH,KAAC,SAAS,IAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAI,OAAC,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,CAAC,IAAI,GAAQ,EACjE,KAAK,EACL,KAAK,CAAC,OAAO,IACT,EACN,KAAK,CAAC,MAAM,IAAI,MAAC,IAAI,IAAC,QAAQ,wBAAG,KAAK,CAAC,MAAM,IAAQ,KANvB,KAAK,CAAC,EAAE,CAOnC,CACP,CAAC,EACF,KAAC,IAAI,oBAAS,EACd,KAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAI,IACnF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,SAAS,EACT,SAAS,GAKV;IACC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,SAAS,eAAe,EAC5C,SAAS,GAAG,CAAC,IAAI,CAChB,MAAC,IAAI,oBACD,GAAG,EACL,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aACjB,SAAS,OAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,IAChD,IACF,CACR,EACA,SAAS,GAAG,CAAC,IAAI,CAChB,MAAC,IAAI,qBACD,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,aAAE,SAAS,eAAe,IACxC,CACR,IACI,EACN,SAAS,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,QAAQ,iFAAkE,IAC9F,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -3,6 +3,15 @@ import type { ProjectConfig } from './schemas/config.js';
|
|
|
3
3
|
import type { Registry } from './schemas/index.js';
|
|
4
4
|
import type { InstalledAsset } from './schemas/lockfile.js';
|
|
5
5
|
import { type Scope } from './scope.js';
|
|
6
|
+
import { type VersionStatus } from './update-check.js';
|
|
7
|
+
/** How long the `/health` probe waits for the ATK API before it fails the check. */
|
|
8
|
+
export declare const HEALTH_TIMEOUT_MS = 5000;
|
|
9
|
+
/**
|
|
10
|
+
* Call the ATK API's anonymous `GET /health` once, with no bearer and no retries, so a down API
|
|
11
|
+
* fails the check in {@link HEALTH_TIMEOUT_MS} at most. It doesn't go through the process-wide
|
|
12
|
+
* client, whose connection-failure latch would then fail the registry check too.
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkApiHealth(apiUrl: string, source?: string): Promise<DiagnosticCheck>;
|
|
6
15
|
/**
|
|
7
16
|
* Check for assets installed both in the project and at the user scope, with the version at each and
|
|
8
17
|
* which copy each tool that has both uses. A copy uninstalled for every tool of its scope doesn't
|
|
@@ -16,6 +25,17 @@ export declare function checkBothScopes(project: {
|
|
|
16
25
|
root: string;
|
|
17
26
|
tools: string[];
|
|
18
27
|
}): Promise<DiagnosticCheck | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Compare this CLI with its release channel on npm: `dev` for a prerelease, `latest` otherwise.
|
|
30
|
+
* A CLI ahead of npm (a local build) passes. `offline` (`--offline`): npm isn't asked, so only
|
|
31
|
+
* a cached version is compared.
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkCliVersion(status: VersionStatus, offline?: boolean): DiagnosticCheck;
|
|
34
|
+
/**
|
|
35
|
+
* Check for installed assets the registry deprecates, with each one's reason and replacement.
|
|
36
|
+
* Returns undefined when there are none.
|
|
37
|
+
*/
|
|
38
|
+
export declare function checkDeprecated(registry: Registry, assets: InstalledAsset[]): DiagnosticCheck | undefined;
|
|
19
39
|
/**
|
|
20
40
|
* Check that the hook scripts a configured tool runs directly are executable. Returns
|
|
21
41
|
* undefined when there is nothing to check: on Windows, which has no exec bit, or when
|
|
@@ -29,6 +49,14 @@ export declare function checkHookScripts(projectDir: string, tools: string[], as
|
|
|
29
49
|
* undefined when there are none. The sync command it suggests runs in `scope`.
|
|
30
50
|
*/
|
|
31
51
|
export declare function checkLiftedHooks(projectConfig: ProjectConfig, assets: InstalledAsset[], registry: Registry, scope?: Scope): DiagnosticCheck | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Check that each installed asset's placed files are on disk for every configured tool, as the
|
|
54
|
+
* scope's adapter places them. Frozen assets, those uninstalled for a tool and hooks whose locked
|
|
55
|
+
* version doesn't declare the tool (with `registry`) are left out, as `atk audit` and `atk sync`
|
|
56
|
+
* leave them. Only presence is checked; `atk audit` verifies content. Returns undefined when there
|
|
57
|
+
* is nothing to check. The sync command it suggests runs in `scope`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function checkMissingFiles(root: string, tools: string[], assets: InstalledAsset[], projectConfig: null | ProjectConfig, scope?: Scope, registry?: Registry): Promise<DiagnosticCheck | undefined>;
|
|
32
60
|
/**
|
|
33
61
|
* Check whether the given Node.js version string meets the project requirements.
|
|
34
62
|
*
|
|
@@ -36,6 +64,12 @@ export declare function checkLiftedHooks(projectConfig: ProjectConfig, assets: I
|
|
|
36
64
|
* @returns a `DiagnosticCheck` with status pass / warn / fail
|
|
37
65
|
*/
|
|
38
66
|
export declare function checkNodeVersion(version: string): DiagnosticCheck;
|
|
67
|
+
/**
|
|
68
|
+
* Check the registry cache file: its age against the TTL, and whether it parses. An expired cache
|
|
69
|
+
* passes (the next read refreshes it); one that doesn't parse fails, with `atk cache clear` to
|
|
70
|
+
* remove it. Run after the registry check, which replaces an unreadable cache when it can fetch.
|
|
71
|
+
*/
|
|
72
|
+
export declare function checkRegistryCache(): Promise<DiagnosticCheck>;
|
|
39
73
|
/**
|
|
40
74
|
* Run all environment diagnostic checks and return the results.
|
|
41
75
|
* Extracted from the `doctor` command so it can be tested independently.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/lib/diagnostics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/lib/diagnostics.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAyB5D,OAAO,EAAkD,KAAK,KAAK,EAAiB,MAAM,YAAY,CAAC;AACvG,OAAO,EAAoB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzE,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AAQvC;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4C9F;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,EACtD,IAAI,EAAE;IAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0BtC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,UAAQ,GAAG,eAAe,CAoCvF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,eAAe,GAAG,SAAS,CAmBzG;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,cAAc,EAAE,EACxB,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,KAAK,CAAC,EAAE,KAAK,GACZ,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA8CtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,cAAc,EAAE,EACxB,QAAQ,EAAE,QAAQ,EAClB,KAAK,CAAC,EAAE,KAAK,GACZ,eAAe,GAAG,SAAS,CAsB7B;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,cAAc,EAAE,EACxB,aAAa,EAAE,IAAI,GAAG,aAAa,EACnC,KAAK,CAAC,EAAE,KAAK,EACb,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAgDtC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAwBjE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CA6BnE;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACnC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GACnE,OAAO,CAAC,eAAe,EAAE,CAAC,CA8P5B"}
|