@indy2kro/agentenv 1.1.1 → 1.1.3
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/dist/adapters/base.d.ts +1 -1
- package/dist/adapters/claude.d.ts +0 -4
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +5 -36
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +3 -8
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot.d.ts.map +1 -1
- package/dist/adapters/copilot.js +3 -8
- package/dist/adapters/copilot.js.map +1 -1
- package/dist/adapters/detect.d.ts +8 -0
- package/dist/adapters/detect.d.ts.map +1 -1
- package/dist/adapters/detect.js +26 -7
- package/dist/adapters/detect.js.map +1 -1
- package/dist/adapters/opencode.d.ts.map +1 -1
- package/dist/adapters/opencode.js +3 -8
- package/dist/adapters/opencode.js.map +1 -1
- package/dist/adapters/rtk-delegation.d.ts +5 -2
- package/dist/adapters/rtk-delegation.d.ts.map +1 -1
- package/dist/adapters/rtk-delegation.js +48 -8
- package/dist/adapters/rtk-delegation.js.map +1 -1
- package/dist/adapters/vibe.d.ts.map +1 -1
- package/dist/adapters/vibe.js +2 -1
- package/dist/adapters/vibe.js.map +1 -1
- package/dist/adapters/windsurf.d.ts.map +1 -1
- package/dist/adapters/windsurf.js +2 -1
- package/dist/adapters/windsurf.js.map +1 -1
- package/dist/cli/json.d.ts +22 -0
- package/dist/cli/json.d.ts.map +1 -0
- package/dist/cli/json.js +17 -0
- package/dist/cli/json.js.map +1 -0
- package/dist/commands/apply.d.ts +5 -0
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +52 -15
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/completion.d.ts +4 -0
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +46 -5
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/config-edit.d.ts +0 -6
- package/dist/commands/config-edit.d.ts.map +1 -1
- package/dist/commands/config-edit.js +15 -9
- package/dist/commands/config-edit.js.map +1 -1
- package/dist/commands/setup.d.ts +15 -2
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +90 -31
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +36 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/uninstall.d.ts +7 -2
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +38 -13
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +5 -4
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wizard.d.ts +2 -0
- package/dist/commands/wizard.d.ts.map +1 -1
- package/dist/commands/wizard.js +14 -2
- package/dist/commands/wizard.js.map +1 -1
- package/dist/config/schema.d.ts +3 -2
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +21 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/config/scopes.d.ts +6 -0
- package/dist/config/scopes.d.ts.map +1 -1
- package/dist/config/scopes.js +8 -0
- package/dist/config/scopes.js.map +1 -1
- package/dist/generate/agentsmd.d.ts +9 -3
- package/dist/generate/agentsmd.d.ts.map +1 -1
- package/dist/generate/agentsmd.js +59 -15
- package/dist/generate/agentsmd.js.map +1 -1
- package/dist/integrations/superpowers.d.ts.map +1 -1
- package/dist/integrations/superpowers.js +15 -3
- package/dist/integrations/superpowers.js.map +1 -1
- package/dist/shell/detector.d.ts.map +1 -1
- package/dist/shell/detector.js +9 -0
- package/dist/shell/detector.js.map +1 -1
- package/dist/shell/shell-fix-state.d.ts +1 -1
- package/dist/shell/shell-fix-state.d.ts.map +1 -1
- package/dist/shell/shell-fix-state.js +3 -2
- package/dist/shell/shell-fix-state.js.map +1 -1
- package/dist/toolchain/mise.d.ts +15 -0
- package/dist/toolchain/mise.d.ts.map +1 -1
- package/dist/toolchain/mise.js +56 -4
- package/dist/toolchain/mise.js.map +1 -1
- package/dist/toolchain/rtk.d.ts.map +1 -1
- package/dist/toolchain/rtk.js +2 -0
- package/dist/toolchain/rtk.js.map +1 -1
- package/dist/ui/report.d.ts +13 -2
- package/dist/ui/report.d.ts.map +1 -1
- package/dist/ui/report.js +24 -4
- package/dist/ui/report.js.map +1 -1
- package/dist/utils/fs-retry.d.ts +11 -1
- package/dist/utils/fs-retry.d.ts.map +1 -1
- package/dist/utils/fs-retry.js +43 -4
- package/dist/utils/fs-retry.js.map +1 -1
- package/package.json +9 -8
package/dist/ui/report.d.ts
CHANGED
|
@@ -16,8 +16,19 @@ export declare function printValidation(report: ValidationReportView): void;
|
|
|
16
16
|
* given "not applying" line and return false. Callers set the exit code.
|
|
17
17
|
*/
|
|
18
18
|
export declare function reportValidation(report: ValidationReportView, notApplying: string): boolean;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
export interface TimelineEntry {
|
|
20
|
+
kind: 'message' | 'error';
|
|
21
|
+
text: string;
|
|
22
|
+
}
|
|
23
|
+
/** An error line that stays distinguishable without color (NO_COLOR, screen readers). */
|
|
24
|
+
export declare function formatErrorLine(error: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Apply/setup result tail: colorized messages and themed errors. With a
|
|
27
|
+
* `timeline` they are printed in the order the steps produced them, so a
|
|
28
|
+
* failure appears next to the step it belongs to; without one, messages come
|
|
29
|
+
* first and errors last. Errors always carry a glyph, not just red.
|
|
30
|
+
*/
|
|
31
|
+
export declare function printMessages(messages: string[], errors: string[], timeline?: TimelineEntry[]): void;
|
|
21
32
|
/**
|
|
22
33
|
* Human duration for the end-of-run line: sub-second in whole milliseconds,
|
|
23
34
|
* otherwise seconds to one decimal (or `Xm Ys` past a minute). Non-finite and
|
package/dist/ui/report.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAGlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAO3F;AAED,
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAGlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAO3F;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,CAAC,EAAE,aAAa,EAAE,GACzB,IAAI,CAWN;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAKN"}
|
package/dist/ui/report.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { colorizeLine, theme } from './theme.js';
|
|
1
|
+
import { colorizeLine, failGlyph, theme } from './theme.js';
|
|
2
2
|
import { resolveResultLine } from './output.js';
|
|
3
3
|
/** The one config-path line every mutating command prints after resolving its file. */
|
|
4
4
|
export function printConfigPath(configPath) {
|
|
@@ -23,12 +23,32 @@ export function reportValidation(report, notApplying) {
|
|
|
23
23
|
}
|
|
24
24
|
return true;
|
|
25
25
|
}
|
|
26
|
-
/**
|
|
27
|
-
export function
|
|
26
|
+
/** An error line that stays distinguishable without color (NO_COLOR, screen readers). */
|
|
27
|
+
export function formatErrorLine(error) {
|
|
28
|
+
const glyph = failGlyph();
|
|
29
|
+
return error.trimStart().startsWith(glyph) ? error : `${glyph} ${error}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Apply/setup result tail: colorized messages and themed errors. With a
|
|
33
|
+
* `timeline` they are printed in the order the steps produced them, so a
|
|
34
|
+
* failure appears next to the step it belongs to; without one, messages come
|
|
35
|
+
* first and errors last. Errors always carry a glyph, not just red.
|
|
36
|
+
*/
|
|
37
|
+
export function printMessages(messages, errors, timeline) {
|
|
38
|
+
const printError = (error) => console.error(theme.fail(formatErrorLine(error)));
|
|
39
|
+
if (timeline && timeline.length > 0) {
|
|
40
|
+
for (const entry of timeline) {
|
|
41
|
+
if (entry.kind === 'error')
|
|
42
|
+
printError(entry.text);
|
|
43
|
+
else
|
|
44
|
+
console.log(colorizeLine(entry.text));
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
28
48
|
for (const message of messages)
|
|
29
49
|
console.log(colorizeLine(message));
|
|
30
50
|
for (const error of errors)
|
|
31
|
-
|
|
51
|
+
printError(error);
|
|
32
52
|
}
|
|
33
53
|
/**
|
|
34
54
|
* Human duration for the end-of-run line: sub-second in whole milliseconds,
|
package/dist/ui/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/fs-retry.d.ts
CHANGED
|
@@ -17,6 +17,12 @@ export interface RetryFs {
|
|
|
17
17
|
writeFileSync: (filePath: string, content: string) => void;
|
|
18
18
|
statSize: (filePath: string) => number | null;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Write to a sibling temp file, then rename over the target, so an interrupted
|
|
22
|
+
* write can never leave a truncated file. Writes through a symlink (dotfile
|
|
23
|
+
* managers) to its real target and keeps the existing file's mode.
|
|
24
|
+
*/
|
|
25
|
+
export declare function atomicWriteFileSync(filePath: string, content: string): void;
|
|
20
26
|
export declare const defaultRetryFs: RetryFs;
|
|
21
27
|
export interface WriteRetryOptions {
|
|
22
28
|
/** Max write attempts (default 5). */
|
|
@@ -47,8 +53,12 @@ export declare function writeFileWithRetry(filePath: string, content: string, op
|
|
|
47
53
|
* `filePath` doesn't exist yet (nothing to back up: this is a fresh file
|
|
48
54
|
* agentenv is creating, not modifying). Backing up is advisory: a failure
|
|
49
55
|
* here (e.g. a locked filesystem) must never block the real write.
|
|
56
|
+
* Returns the backup path when one was just created (so callers can tell the
|
|
57
|
+
* user), otherwise null.
|
|
50
58
|
*/
|
|
51
|
-
export declare function backupBeforeFirstEdit(filePath: string):
|
|
59
|
+
export declare function backupBeforeFirstEdit(filePath: string): string | null;
|
|
60
|
+
/** Where backupBeforeFirstEdit() keeps the pre-agentenv copy of `filePath`. */
|
|
61
|
+
export declare function backupPathFor(filePath: string): string;
|
|
52
62
|
export interface WriteVerifyResult {
|
|
53
63
|
success: boolean;
|
|
54
64
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-retry.d.ts","sourceRoot":"","sources":["../../src/utils/fs-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"fs-retry.d.ts","sourceRoot":"","sources":["../../src/utils/fs-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,WAAW,OAAO;IACtB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAwB3E;AAED,eAAO,MAAM,cAAc,EAAE,OAS5B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAKD,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAK3D;AAOD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,iBAAsB,EAC5B,MAAM,GAAE,OAAwB,GAC/B,IAAI,CAcN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,iBAAsB,EAC5B,MAAM,GAAE,OAAwB,GAC/B,iBAAiB,CAwBnB"}
|
package/dist/utils/fs-retry.js
CHANGED
|
@@ -14,8 +14,39 @@
|
|
|
14
14
|
* real filesystem.
|
|
15
15
|
*/
|
|
16
16
|
import * as fs from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
/**
|
|
19
|
+
* Write to a sibling temp file, then rename over the target, so an interrupted
|
|
20
|
+
* write can never leave a truncated file. Writes through a symlink (dotfile
|
|
21
|
+
* managers) to its real target and keeps the existing file's mode.
|
|
22
|
+
*/
|
|
23
|
+
export function atomicWriteFileSync(filePath, content) {
|
|
24
|
+
let target = filePath;
|
|
25
|
+
let mode;
|
|
26
|
+
try {
|
|
27
|
+
target = fs.realpathSync(filePath);
|
|
28
|
+
mode = fs.statSync(target).mode & 0o777;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Target doesn't exist yet: write it fresh.
|
|
32
|
+
}
|
|
33
|
+
const tmp = path.join(path.dirname(target), `.${path.basename(target)}.agentenv-${process.pid}-${Date.now()}.tmp`);
|
|
34
|
+
try {
|
|
35
|
+
fs.writeFileSync(tmp, content, mode === undefined ? undefined : { mode });
|
|
36
|
+
fs.renameSync(tmp, target);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
try {
|
|
40
|
+
fs.rmSync(tmp, { force: true });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// best effort
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
17
48
|
export const defaultRetryFs = {
|
|
18
|
-
writeFileSync:
|
|
49
|
+
writeFileSync: atomicWriteFileSync,
|
|
19
50
|
statSize: (filePath) => {
|
|
20
51
|
try {
|
|
21
52
|
return fs.statSync(filePath).size;
|
|
@@ -75,20 +106,28 @@ export function writeFileWithRetry(filePath, content, opts = {}, fsImpl = defaul
|
|
|
75
106
|
* `filePath` doesn't exist yet (nothing to back up: this is a fresh file
|
|
76
107
|
* agentenv is creating, not modifying). Backing up is advisory: a failure
|
|
77
108
|
* here (e.g. a locked filesystem) must never block the real write.
|
|
109
|
+
* Returns the backup path when one was just created (so callers can tell the
|
|
110
|
+
* user), otherwise null.
|
|
78
111
|
*/
|
|
79
112
|
export function backupBeforeFirstEdit(filePath) {
|
|
80
113
|
try {
|
|
81
114
|
if (!fs.existsSync(filePath))
|
|
82
|
-
return;
|
|
83
|
-
const backupPath =
|
|
115
|
+
return null;
|
|
116
|
+
const backupPath = backupPathFor(filePath);
|
|
84
117
|
if (fs.existsSync(backupPath))
|
|
85
|
-
return;
|
|
118
|
+
return null;
|
|
86
119
|
fs.copyFileSync(filePath, backupPath);
|
|
120
|
+
return backupPath;
|
|
87
121
|
}
|
|
88
122
|
catch {
|
|
89
123
|
// Advisory only — never block the real write on a failed backup.
|
|
124
|
+
return null;
|
|
90
125
|
}
|
|
91
126
|
}
|
|
127
|
+
/** Where backupBeforeFirstEdit() keeps the pre-agentenv copy of `filePath`. */
|
|
128
|
+
export function backupPathFor(filePath) {
|
|
129
|
+
return `${filePath}.agentenv-backup`;
|
|
130
|
+
}
|
|
92
131
|
/**
|
|
93
132
|
* Write `content` and confirm it persisted: the file must exist after the
|
|
94
133
|
* write, and, for non-empty content, be non-empty. Any mismatch is reported as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-retry.js","sourceRoot":"","sources":["../../src/utils/fs-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"fs-retry.js","sourceRoot":"","sources":["../../src/utils/fs-retry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@indy2kro/agentenv",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "CLI for configuring a consistent, capable shell environment for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"dev": "ts-node-dev src/index.ts",
|
|
29
29
|
"test": "npm run build && cd dist && node --test",
|
|
30
30
|
"test:coverage": "npm run build && cd dist && node --experimental-test-coverage --test-coverage-lines=80 --test-coverage-branches=75 --test-coverage-functions=80 --test",
|
|
31
|
+
"test:coverage:files": "npm run build && node scripts/check-coverage.mjs",
|
|
31
32
|
"smoke": "npm run build && node scripts/smoke.mjs",
|
|
32
33
|
"smoke:real": "npm run build && node scripts/smoke.mjs --real",
|
|
33
34
|
"lint": "eslint src --max-warnings 0",
|
|
@@ -51,25 +52,25 @@
|
|
|
51
52
|
"author": "Cristian Radu <indy2kro@gmail.com>",
|
|
52
53
|
"license": "MIT",
|
|
53
54
|
"dependencies": {
|
|
54
|
-
"@inquirer/prompts": "^8.7.
|
|
55
|
-
"chalk": "^6.0.
|
|
55
|
+
"@inquirer/prompts": "^8.7.3",
|
|
56
|
+
"chalk": "^6.0.1",
|
|
56
57
|
"commander": "^15.0.0",
|
|
57
58
|
"ora": "^9.4.1",
|
|
58
59
|
"toml": "^5.0.0"
|
|
59
60
|
},
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@eslint/js": "^10.0.1",
|
|
62
|
-
"@types/node": "^26.6.
|
|
63
|
-
"eslint": "^10.
|
|
63
|
+
"@types/node": "^26.6.4",
|
|
64
|
+
"eslint": "^10.12.0",
|
|
64
65
|
"eslint-config-prettier": "^10.1.8",
|
|
65
|
-
"globals": "^17.
|
|
66
|
+
"globals": "^17.13.0",
|
|
66
67
|
"husky": "^9.1.7",
|
|
67
|
-
"lint-staged": "^17.
|
|
68
|
+
"lint-staged": "^17.6.0",
|
|
68
69
|
"prettier": "^3.9.9",
|
|
69
70
|
"ts-node": "^10.9.0",
|
|
70
71
|
"ts-node-dev": "^2.0.0",
|
|
71
72
|
"typescript": "^5.0.0",
|
|
72
|
-
"typescript-eslint": "^8.
|
|
73
|
+
"typescript-eslint": "^8.71.1"
|
|
73
74
|
},
|
|
74
75
|
"engines": {
|
|
75
76
|
"node": ">=22.13.0"
|