@thynameisjayvee/alpha-cli 0.1.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/LICENSE +21 -0
- package/README.md +143 -0
- package/bin/alpha.js +15 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +125 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/alpha.d.ts +64 -0
- package/dist/core/alpha.d.ts.map +1 -0
- package/dist/core/alpha.js +94 -0
- package/dist/core/alpha.js.map +1 -0
- package/dist/core/generator/index.d.ts +16 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +231 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/implementation/index.d.ts +22 -0
- package/dist/core/implementation/index.d.ts.map +1 -0
- package/dist/core/implementation/index.js +398 -0
- package/dist/core/implementation/index.js.map +1 -0
- package/dist/core/init/catalog.d.ts +23 -0
- package/dist/core/init/catalog.d.ts.map +1 -0
- package/dist/core/init/catalog.js +87 -0
- package/dist/core/init/catalog.js.map +1 -0
- package/dist/core/init/index.d.ts +10 -0
- package/dist/core/init/index.d.ts.map +1 -0
- package/dist/core/init/index.js +214 -0
- package/dist/core/init/index.js.map +1 -0
- package/dist/core/requirements/index.d.ts +10 -0
- package/dist/core/requirements/index.d.ts.map +1 -0
- package/dist/core/requirements/index.js +232 -0
- package/dist/core/requirements/index.js.map +1 -0
- package/dist/core/reviewer/index.d.ts +29 -0
- package/dist/core/reviewer/index.d.ts.map +1 -0
- package/dist/core/reviewer/index.js +419 -0
- package/dist/core/reviewer/index.js.map +1 -0
- package/dist/core/stack/index.d.ts +10 -0
- package/dist/core/stack/index.d.ts.map +1 -0
- package/dist/core/stack/index.js +243 -0
- package/dist/core/stack/index.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +128 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.d.ts +105 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +99 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file-system.d.ts +17 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +48 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/input.d.ts +18 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +50 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +109 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +26 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +51 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +79 -0
- package/scripts/postinstall.js +110 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader with zod validation
|
|
3
|
+
*
|
|
4
|
+
* Loads and validates .alpha/config.json with type-safe defaults
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { readFile, fileExists, writeJsonFile } from './file-system.js';
|
|
8
|
+
import { getAlphaDir } from './paths.js';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Configuration schema with defaults
|
|
12
|
+
*/
|
|
13
|
+
const ConfigSchema = z.object({
|
|
14
|
+
version: z.string().default('0.1.0'),
|
|
15
|
+
output: z.object({
|
|
16
|
+
alphaDir: z.string().default('.alpha'),
|
|
17
|
+
specsDir: z.string().default('.alpha/specs'),
|
|
18
|
+
reportsDir: z.string().default('.alpha/reports'),
|
|
19
|
+
}).default({}),
|
|
20
|
+
review: z.object({
|
|
21
|
+
defaultChecks: z.array(z.string()).default(['quality', 'security', 'performance']),
|
|
22
|
+
autoSelectRecommended: z.boolean().default(true),
|
|
23
|
+
maxFiles: z.number().default(1000),
|
|
24
|
+
timeout: z.number().default(300000), // 5 minutes
|
|
25
|
+
}).default({}),
|
|
26
|
+
implementation: z.object({
|
|
27
|
+
autoVerify: z.boolean().default(false),
|
|
28
|
+
cleanupOnVerify: z.boolean().default(false),
|
|
29
|
+
}).default({}),
|
|
30
|
+
}).default({});
|
|
31
|
+
/**
|
|
32
|
+
* Get the config file path
|
|
33
|
+
*/
|
|
34
|
+
function getConfigPath() {
|
|
35
|
+
return path.join(getAlphaDir(), 'config.json');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Load configuration from .alpha/config.json
|
|
39
|
+
* Falls back to defaults if file doesn't exist
|
|
40
|
+
*/
|
|
41
|
+
export async function loadConfig() {
|
|
42
|
+
const configPath = getConfigPath();
|
|
43
|
+
// If config file doesn't exist, return defaults
|
|
44
|
+
if (!await fileExists(configPath)) {
|
|
45
|
+
return ConfigSchema.parse({});
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const content = await readFile(configPath);
|
|
49
|
+
const data = JSON.parse(content);
|
|
50
|
+
return ConfigSchema.parse(data);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error instanceof z.ZodError) {
|
|
54
|
+
// Configuration validation failed
|
|
55
|
+
const messages = error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join('\n');
|
|
56
|
+
throw new Error(`Invalid configuration in ${configPath}:\n${messages}`);
|
|
57
|
+
}
|
|
58
|
+
if (error instanceof SyntaxError) {
|
|
59
|
+
throw new Error(`Invalid JSON in ${configPath}: ${error.message}`);
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Save configuration to .alpha/config.json
|
|
66
|
+
*/
|
|
67
|
+
export async function saveConfig(config) {
|
|
68
|
+
const configPath = getConfigPath();
|
|
69
|
+
const validated = ConfigSchema.parse(config);
|
|
70
|
+
await writeJsonFile(configPath, validated);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get configuration with overrides
|
|
74
|
+
*/
|
|
75
|
+
export async function getConfigWithOverrides(overrides) {
|
|
76
|
+
const baseConfig = await loadConfig();
|
|
77
|
+
if (!overrides) {
|
|
78
|
+
return baseConfig;
|
|
79
|
+
}
|
|
80
|
+
// Merge and validate
|
|
81
|
+
const merged = ConfigSchema.parse({
|
|
82
|
+
...baseConfig,
|
|
83
|
+
...overrides,
|
|
84
|
+
});
|
|
85
|
+
return merged;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Initialize default configuration file
|
|
89
|
+
*/
|
|
90
|
+
export async function initializeConfig() {
|
|
91
|
+
const configPath = getConfigPath();
|
|
92
|
+
if (await fileExists(configPath)) {
|
|
93
|
+
return loadConfig();
|
|
94
|
+
}
|
|
95
|
+
const defaultConfig = ConfigSchema.parse({});
|
|
96
|
+
await writeJsonFile(configPath, defaultConfig);
|
|
97
|
+
return defaultConfig;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getAlphaDir, getSpecsDir, getReportsDir } from './paths.js';
|
|
2
|
+
export declare function ensureDir(dirPath: string): Promise<void>;
|
|
3
|
+
export declare function writeFile(filePath: string, content: string): Promise<void>;
|
|
4
|
+
export declare function readFile(filePath: string): Promise<string>;
|
|
5
|
+
export declare function fileExists(filePath: string): Promise<boolean>;
|
|
6
|
+
export declare function deleteFile(filePath: string): Promise<void>;
|
|
7
|
+
export declare function readJsonFile<T>(filePath: string): Promise<T>;
|
|
8
|
+
export declare function writeJsonFile<T>(filePath: string, data: T, pretty?: boolean): Promise<void>;
|
|
9
|
+
export declare function listDirectory(dirPath: string): Promise<string[]>;
|
|
10
|
+
export { getProjectRoot, getAlphaDir, getSpecsDir, getReportsDir, ensureAlphaDir, getConfigPath } from './paths.js';
|
|
11
|
+
/** @deprecated Use getAlphaDir() instead */
|
|
12
|
+
export declare const CONTEXT_DIR: typeof getAlphaDir;
|
|
13
|
+
/** @deprecated Use getSpecsDir() instead */
|
|
14
|
+
export declare const SPECS_DIR: typeof getSpecsDir;
|
|
15
|
+
/** @deprecated Use getReportsDir() instead */
|
|
16
|
+
export declare const REPORTS_DIR: typeof getReportsDir;
|
|
17
|
+
//# sourceMappingURL=file-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAGlE;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,MAAM,UAAO,GACZ,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEtE;AAID,OAAO,EACL,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAIpB,4CAA4C;AAC5C,eAAO,MAAM,WAAW,oBAAc,CAAC;AAEvC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,oBAAc,CAAC;AAErC,8CAA8C;AAC9C,eAAO,MAAM,WAAW,sBAAgB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { getAlphaDir, getSpecsDir, getReportsDir } from './paths.js';
|
|
4
|
+
export async function ensureDir(dirPath) {
|
|
5
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
export async function writeFile(filePath, content) {
|
|
8
|
+
await ensureDir(path.dirname(filePath));
|
|
9
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
export async function readFile(filePath) {
|
|
12
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
13
|
+
}
|
|
14
|
+
export async function fileExists(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
await fs.access(filePath);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function deleteFile(filePath) {
|
|
24
|
+
await fs.unlink(filePath);
|
|
25
|
+
}
|
|
26
|
+
export async function readJsonFile(filePath) {
|
|
27
|
+
const content = await readFile(filePath);
|
|
28
|
+
return JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
export async function writeJsonFile(filePath, data, pretty = true) {
|
|
31
|
+
const content = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
32
|
+
await writeFile(filePath, content);
|
|
33
|
+
}
|
|
34
|
+
export async function listDirectory(dirPath) {
|
|
35
|
+
return await fs.readdir(dirPath);
|
|
36
|
+
}
|
|
37
|
+
// Re-export functions from paths.ts for backward compatibility
|
|
38
|
+
// New code should import directly from paths.ts
|
|
39
|
+
export { getProjectRoot, getAlphaDir, getSpecsDir, getReportsDir, ensureAlphaDir, getConfigPath } from './paths.js';
|
|
40
|
+
// Legacy exports - kept for backward compatibility during migration
|
|
41
|
+
// Use as functions: CONTEXT_DIR() instead of CONTEXT_DIR
|
|
42
|
+
/** @deprecated Use getAlphaDir() instead */
|
|
43
|
+
export const CONTEXT_DIR = getAlphaDir;
|
|
44
|
+
/** @deprecated Use getSpecsDir() instead */
|
|
45
|
+
export const SPECS_DIR = getSpecsDir;
|
|
46
|
+
/** @deprecated Use getReportsDir() instead */
|
|
47
|
+
export const REPORTS_DIR = getReportsDir;
|
|
48
|
+
//# sourceMappingURL=file-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAe;IAEf,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB;IACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,IAAO,EACP,MAAM,GAAG,IAAI;IAEb,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,OAAO,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,+DAA+D;AAC/D,gDAAgD;AAChD,OAAO,EACL,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,oEAAoE;AACpE,yDAAyD;AACzD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEvC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AAErC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read piped stdin (returns empty string when attached to a TTY).
|
|
3
|
+
*/
|
|
4
|
+
export declare function readStdin(): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Read raw input from `--input <file>`. The special value `-` reads stdin.
|
|
7
|
+
* Returns null when no input source was requested.
|
|
8
|
+
*
|
|
9
|
+
* Stdin is only consumed on explicit request (`--input -`) so that a default
|
|
10
|
+
* invocation never blocks on an inherited/open stdin.
|
|
11
|
+
*/
|
|
12
|
+
export declare function readInputRaw(inputPath?: string): Promise<string | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Read and parse JSON input from `--input <file>` (or `--input -` for stdin).
|
|
15
|
+
* Returns null when no input source was requested; throws on invalid JSON.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readInputJson<T = unknown>(inputPath?: string): Promise<T | null>;
|
|
18
|
+
//# sourceMappingURL=input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAUjD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,OAAO,EAC7C,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAgBnB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Read piped stdin (returns empty string when attached to a TTY).
|
|
4
|
+
*/
|
|
5
|
+
export async function readStdin() {
|
|
6
|
+
if (process.stdin.isTTY) {
|
|
7
|
+
return '';
|
|
8
|
+
}
|
|
9
|
+
const chunks = [];
|
|
10
|
+
for await (const chunk of process.stdin) {
|
|
11
|
+
chunks.push(Buffer.from(chunk));
|
|
12
|
+
}
|
|
13
|
+
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read raw input from `--input <file>`. The special value `-` reads stdin.
|
|
17
|
+
* Returns null when no input source was requested.
|
|
18
|
+
*
|
|
19
|
+
* Stdin is only consumed on explicit request (`--input -`) so that a default
|
|
20
|
+
* invocation never blocks on an inherited/open stdin.
|
|
21
|
+
*/
|
|
22
|
+
export async function readInputRaw(inputPath) {
|
|
23
|
+
if (!inputPath) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (inputPath === '-') {
|
|
27
|
+
const stdin = await readStdin();
|
|
28
|
+
return stdin.length > 0 ? stdin : null;
|
|
29
|
+
}
|
|
30
|
+
const content = await fs.readFile(inputPath, 'utf-8');
|
|
31
|
+
return content.trim();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read and parse JSON input from `--input <file>` (or `--input -` for stdin).
|
|
35
|
+
* Returns null when no input source was requested; throws on invalid JSON.
|
|
36
|
+
*/
|
|
37
|
+
export async function readInputJson(inputPath) {
|
|
38
|
+
const raw = await readInputRaw(inputPath);
|
|
39
|
+
if (raw === null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(raw);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const where = inputPath === '-' ? 'stdin' : inputPath;
|
|
47
|
+
throw new Error(`Invalid JSON from ${where}: ${error instanceof Error ? error.message : 'parse error'}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/utils/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAkB;IACnD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,qBAAqB,KAAK,KACxB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAC3C,EAAE,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Ora } from 'ora';
|
|
2
|
+
/**
|
|
3
|
+
* All human-facing log output goes to stderr so that stdout is reserved
|
|
4
|
+
* exclusively for machine-consumable payloads emitted via `emit()`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const logger: {
|
|
7
|
+
info(message: string): void;
|
|
8
|
+
success(message: string): void;
|
|
9
|
+
error(message: string): void;
|
|
10
|
+
warn(message: string): void;
|
|
11
|
+
debug(message: string): void;
|
|
12
|
+
spinner(message: string): Ora;
|
|
13
|
+
section(title: string): void;
|
|
14
|
+
subSection(title: string): void;
|
|
15
|
+
};
|
|
16
|
+
export declare function createProgressSpinner(message: string, steps: string[]): {
|
|
17
|
+
spinner: Ora;
|
|
18
|
+
updateStep: (stepIndex: number, customMessage?: string) => void;
|
|
19
|
+
complete: (successMessage?: string) => void;
|
|
20
|
+
};
|
|
21
|
+
export declare function setJsonMode(value: boolean): void;
|
|
22
|
+
export declare function isJsonMode(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Emit a successful structured payload to stdout.
|
|
25
|
+
*
|
|
26
|
+
* @param command - the command name (used in the JSON envelope)
|
|
27
|
+
* @param data - machine-consumable payload
|
|
28
|
+
* @param humanText - optional markdown/plain text to print when not in JSON mode.
|
|
29
|
+
* Falls back to pretty-printed JSON of `data` when omitted.
|
|
30
|
+
*/
|
|
31
|
+
export declare function emit(command: string, data: unknown, humanText?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Emit a failure envelope to stdout (JSON mode only). Human-readable errors
|
|
34
|
+
* should still be surfaced via `logger.error()` to stderr.
|
|
35
|
+
*/
|
|
36
|
+
export declare function emitError(command: string, message: string): void;
|
|
37
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;;GAGG;AACH,eAAO,MAAM,MAAM;kBACH,MAAM,GAAG,IAAI;qBAIV,MAAM,GAAG,IAAI;mBAIf,MAAM,GAAG,IAAI;kBAId,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;qBAMX,MAAM,GAAG,GAAG;mBASd,MAAM,GAAG,IAAI;sBAMV,MAAM,GAAG,IAAI;CAKhC,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,GACd;IACD,OAAO,EAAE,GAAG,CAAC;IACb,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,CAwBA;AAWD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAc7E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMhE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
/**
|
|
4
|
+
* All human-facing log output goes to stderr so that stdout is reserved
|
|
5
|
+
* exclusively for machine-consumable payloads emitted via `emit()`.
|
|
6
|
+
*/
|
|
7
|
+
export const logger = {
|
|
8
|
+
info(message) {
|
|
9
|
+
console.error(chalk.blue('›') + ' ' + message);
|
|
10
|
+
},
|
|
11
|
+
success(message) {
|
|
12
|
+
console.error(chalk.green('✓') + ' ' + message);
|
|
13
|
+
},
|
|
14
|
+
error(message) {
|
|
15
|
+
console.error(chalk.red('✗') + ' ' + message);
|
|
16
|
+
},
|
|
17
|
+
warn(message) {
|
|
18
|
+
console.error(chalk.yellow('⚠') + ' ' + message);
|
|
19
|
+
},
|
|
20
|
+
debug(message) {
|
|
21
|
+
if (process.env.DEBUG === 'alpha') {
|
|
22
|
+
console.error(chalk.gray('[DEBUG]') + ' ' + message);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
spinner(message) {
|
|
26
|
+
return ora({
|
|
27
|
+
text: message,
|
|
28
|
+
color: 'blue',
|
|
29
|
+
spinner: 'dots',
|
|
30
|
+
stream: process.stderr,
|
|
31
|
+
}).start();
|
|
32
|
+
},
|
|
33
|
+
section(title) {
|
|
34
|
+
console.error('\n' + chalk.bold.cyan('═'.repeat(50)));
|
|
35
|
+
console.error(chalk.bold.cyan(title));
|
|
36
|
+
console.error(chalk.bold.cyan('═'.repeat(50)) + '\n');
|
|
37
|
+
},
|
|
38
|
+
subSection(title) {
|
|
39
|
+
console.error('\n' + chalk.bold.white('─'.repeat(30)));
|
|
40
|
+
console.error(chalk.bold.white(title));
|
|
41
|
+
console.error(chalk.bold.white('─'.repeat(30)) + '\n');
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export function createProgressSpinner(message, steps) {
|
|
45
|
+
const spinner = ora({
|
|
46
|
+
text: message,
|
|
47
|
+
color: 'blue',
|
|
48
|
+
spinner: 'dots',
|
|
49
|
+
stream: process.stderr,
|
|
50
|
+
}).start();
|
|
51
|
+
const updateStep = (stepIndex, customMessage) => {
|
|
52
|
+
if (stepIndex < steps.length) {
|
|
53
|
+
const stepText = customMessage || steps[stepIndex];
|
|
54
|
+
spinner.text = `${stepText} (${stepIndex + 1}/${steps.length})`;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const complete = (successMessage) => {
|
|
58
|
+
if (successMessage) {
|
|
59
|
+
spinner.succeed(successMessage);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
spinner.stop();
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return { spinner, updateStep, complete };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Structured output channel.
|
|
69
|
+
*
|
|
70
|
+
* Alpha is a harness driven by an LLM, so commands must produce predictable,
|
|
71
|
+
* parseable output on stdout. When JSON mode is enabled every command emits a
|
|
72
|
+
* `{ ok, command, data }` envelope; otherwise it prints the human/markdown form.
|
|
73
|
+
*/
|
|
74
|
+
let jsonMode = false;
|
|
75
|
+
export function setJsonMode(value) {
|
|
76
|
+
jsonMode = value;
|
|
77
|
+
}
|
|
78
|
+
export function isJsonMode() {
|
|
79
|
+
return jsonMode;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Emit a successful structured payload to stdout.
|
|
83
|
+
*
|
|
84
|
+
* @param command - the command name (used in the JSON envelope)
|
|
85
|
+
* @param data - machine-consumable payload
|
|
86
|
+
* @param humanText - optional markdown/plain text to print when not in JSON mode.
|
|
87
|
+
* Falls back to pretty-printed JSON of `data` when omitted.
|
|
88
|
+
*/
|
|
89
|
+
export function emit(command, data, humanText) {
|
|
90
|
+
if (jsonMode) {
|
|
91
|
+
process.stdout.write(JSON.stringify({ ok: true, command, data }, null, 2) + '\n');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (humanText !== undefined) {
|
|
95
|
+
process.stdout.write(humanText.endsWith('\n') ? humanText : humanText + '\n');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
process.stdout.write(JSON.stringify(data, null, 2) + '\n');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Emit a failure envelope to stdout (JSON mode only). Human-readable errors
|
|
102
|
+
* should still be surfaced via `logger.error()` to stderr.
|
|
103
|
+
*/
|
|
104
|
+
export function emitError(command, message) {
|
|
105
|
+
if (jsonMode) {
|
|
106
|
+
process.stdout.write(JSON.stringify({ ok: false, command, error: message }, null, 2) + '\n');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the project root directory by looking for package.json
|
|
3
|
+
* This finds the USER'S project root, not alpha's package root
|
|
4
|
+
*/
|
|
5
|
+
export declare function getProjectRoot(): string;
|
|
6
|
+
/**
|
|
7
|
+
* Get the .alpha directory path
|
|
8
|
+
*/
|
|
9
|
+
export declare function getAlphaDir(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Ensure .alpha directory exists
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureAlphaDir(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get path to alpha config file
|
|
16
|
+
*/
|
|
17
|
+
export declare function getConfigPath(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get path to specs directory (configurable, default: .alpha/specs)
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSpecsDir(): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get path to reports directory (configurable, default: .alpha/reports)
|
|
24
|
+
*/
|
|
25
|
+
export declare function getReportsDir(): string;
|
|
26
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAWvC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { findUpSync } from 'find-up';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
/**
|
|
5
|
+
* Find the project root directory by looking for package.json
|
|
6
|
+
* This finds the USER'S project root, not alpha's package root
|
|
7
|
+
*/
|
|
8
|
+
export function getProjectRoot() {
|
|
9
|
+
const pkgPath = findUpSync('package.json', {
|
|
10
|
+
cwd: process.cwd(),
|
|
11
|
+
stopAt: path.parse(process.cwd()).root,
|
|
12
|
+
});
|
|
13
|
+
if (!pkgPath) {
|
|
14
|
+
throw new Error('Not inside a Node.js project (no package.json found)');
|
|
15
|
+
}
|
|
16
|
+
return path.dirname(pkgPath);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the .alpha directory path
|
|
20
|
+
*/
|
|
21
|
+
export function getAlphaDir() {
|
|
22
|
+
return path.join(getProjectRoot(), '.alpha');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Ensure .alpha directory exists
|
|
26
|
+
*/
|
|
27
|
+
export function ensureAlphaDir() {
|
|
28
|
+
const alphaDir = getAlphaDir();
|
|
29
|
+
if (!fs.existsSync(alphaDir)) {
|
|
30
|
+
fs.mkdirSync(alphaDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get path to alpha config file
|
|
35
|
+
*/
|
|
36
|
+
export function getConfigPath() {
|
|
37
|
+
return path.join(getAlphaDir(), 'config.json');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get path to specs directory (configurable, default: .alpha/specs)
|
|
41
|
+
*/
|
|
42
|
+
export function getSpecsDir() {
|
|
43
|
+
return path.join(getAlphaDir(), 'specs');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get path to reports directory (configurable, default: .alpha/reports)
|
|
47
|
+
*/
|
|
48
|
+
export function getReportsDir() {
|
|
49
|
+
return path.join(getAlphaDir(), 'reports');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,EAAE;QACzC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI;KACvC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@thynameisjayvee/alpha-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-driven development scaffold with programmatic API and CLI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"alpha": "./bin/alpha.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"bin",
|
|
20
|
+
"scripts"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"prepublishOnly": "npm run build",
|
|
25
|
+
"postinstall": "node scripts/postinstall.js",
|
|
26
|
+
"dev": "tsx src/cli.ts",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:ui": "vitest --ui",
|
|
30
|
+
"test:coverage": "vitest run --coverage",
|
|
31
|
+
"alpha": "tsx src/cli.ts",
|
|
32
|
+
"gather-requirements": "tsx src/core/requirements/index.ts",
|
|
33
|
+
"advise-stack": "tsx src/core/stack/index.ts",
|
|
34
|
+
"generate-spec": "tsx src/core/generator/index.ts",
|
|
35
|
+
"review": "tsx src/core/reviewer/index.ts",
|
|
36
|
+
"implement": "tsx src/core/implementation/index.ts"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"ai",
|
|
40
|
+
"llm",
|
|
41
|
+
"agent",
|
|
42
|
+
"development",
|
|
43
|
+
"cursor",
|
|
44
|
+
"specification",
|
|
45
|
+
"review",
|
|
46
|
+
"cli",
|
|
47
|
+
"scaffold"
|
|
48
|
+
],
|
|
49
|
+
"author": "thynameisjayvee",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"chalk": "^5.3.0",
|
|
56
|
+
"commander": "^12.1.0",
|
|
57
|
+
"find-up": "^7.0.0",
|
|
58
|
+
"glob": "^13.0.6",
|
|
59
|
+
"inquirer": "^9.2.12",
|
|
60
|
+
"marked": "^18.0.5",
|
|
61
|
+
"ora": "^8.0.1",
|
|
62
|
+
"uuid": "^9.0.1",
|
|
63
|
+
"zod": "^3.22.4"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/glob": "^8.1.0",
|
|
67
|
+
"@types/inquirer": "^9.0.7",
|
|
68
|
+
"@types/marked": "^5.0.2",
|
|
69
|
+
"@types/node": "^20.10.0",
|
|
70
|
+
"@types/uuid": "^9.0.7",
|
|
71
|
+
"@vitest/ui": "^4.1.8",
|
|
72
|
+
"tsx": "^4.6.2",
|
|
73
|
+
"typescript": "^5.9.3",
|
|
74
|
+
"vitest": "^4.1.8"
|
|
75
|
+
},
|
|
76
|
+
"engines": {
|
|
77
|
+
"node": ">=18.0.0"
|
|
78
|
+
}
|
|
79
|
+
}
|