guidemode 0.2.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 +85 -0
- package/dist/cjs/auth.d.ts +4 -0
- package/dist/cjs/auth.d.ts.map +1 -0
- package/dist/cjs/auth.js +191 -0
- package/dist/cjs/auth.js.map +1 -0
- package/dist/cjs/config.d.ts +24 -0
- package/dist/cjs/config.d.ts.map +1 -0
- package/dist/cjs/config.js +55 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/deploy.d.ts +18 -0
- package/dist/cjs/deploy.d.ts.map +1 -0
- package/dist/cjs/deploy.js +89 -0
- package/dist/cjs/deploy.js.map +1 -0
- package/dist/cjs/issue.d.ts +18 -0
- package/dist/cjs/issue.d.ts.map +1 -0
- package/dist/cjs/issue.js +79 -0
- package/dist/cjs/issue.js.map +1 -0
- package/dist/cjs/logs.d.ts +7 -0
- package/dist/cjs/logs.d.ts.map +1 -0
- package/dist/cjs/logs.js +75 -0
- package/dist/cjs/logs.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/setup.d.ts +8 -0
- package/dist/cjs/setup.d.ts.map +1 -0
- package/dist/cjs/setup.js +110 -0
- package/dist/cjs/setup.js.map +1 -0
- package/dist/cjs/status.d.ts +6 -0
- package/dist/cjs/status.d.ts.map +1 -0
- package/dist/cjs/status.js +171 -0
- package/dist/cjs/status.js.map +1 -0
- package/dist/cjs/sync.d.ts +8 -0
- package/dist/cjs/sync.d.ts.map +1 -0
- package/dist/cjs/sync.js +201 -0
- package/dist/cjs/sync.js.map +1 -0
- package/dist/cjs/utils/brand.d.ts +5 -0
- package/dist/cjs/utils/brand.d.ts.map +1 -0
- package/dist/cjs/utils/brand.js +8 -0
- package/dist/cjs/utils/brand.js.map +1 -0
- package/dist/cjs/utils/git.d.ts +11 -0
- package/dist/cjs/utils/git.d.ts.map +1 -0
- package/dist/cjs/utils/git.js +92 -0
- package/dist/cjs/utils/git.js.map +1 -0
- package/dist/cjs/utils/logger.d.ts +2 -0
- package/dist/cjs/utils/logger.d.ts.map +1 -0
- package/dist/cjs/utils/logger.js +26 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/cjs/validate.d.ts +22 -0
- package/dist/cjs/validate.d.ts.map +1 -0
- package/dist/cjs/validate.js +169 -0
- package/dist/cjs/validate.js.map +1 -0
- package/dist/esm/auth.d.ts +4 -0
- package/dist/esm/auth.d.ts.map +1 -0
- package/dist/esm/auth.js +191 -0
- package/dist/esm/auth.js.map +1 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +348 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/config.d.ts +24 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +55 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/deploy.d.ts +18 -0
- package/dist/esm/deploy.d.ts.map +1 -0
- package/dist/esm/deploy.js +89 -0
- package/dist/esm/deploy.js.map +1 -0
- package/dist/esm/issue.d.ts +18 -0
- package/dist/esm/issue.d.ts.map +1 -0
- package/dist/esm/issue.js +79 -0
- package/dist/esm/issue.js.map +1 -0
- package/dist/esm/logs.d.ts +7 -0
- package/dist/esm/logs.d.ts.map +1 -0
- package/dist/esm/logs.js +75 -0
- package/dist/esm/logs.js.map +1 -0
- package/dist/esm/setup.d.ts +8 -0
- package/dist/esm/setup.d.ts.map +1 -0
- package/dist/esm/setup.js +110 -0
- package/dist/esm/setup.js.map +1 -0
- package/dist/esm/status.d.ts +6 -0
- package/dist/esm/status.d.ts.map +1 -0
- package/dist/esm/status.js +171 -0
- package/dist/esm/status.js.map +1 -0
- package/dist/esm/sync.d.ts +8 -0
- package/dist/esm/sync.d.ts.map +1 -0
- package/dist/esm/sync.js +201 -0
- package/dist/esm/sync.js.map +1 -0
- package/dist/esm/utils/brand.d.ts +5 -0
- package/dist/esm/utils/brand.d.ts.map +1 -0
- package/dist/esm/utils/brand.js +8 -0
- package/dist/esm/utils/brand.js.map +1 -0
- package/dist/esm/utils/git.d.ts +11 -0
- package/dist/esm/utils/git.d.ts.map +1 -0
- package/dist/esm/utils/git.js +92 -0
- package/dist/esm/utils/git.js.map +1 -0
- package/dist/esm/utils/logger.d.ts +2 -0
- package/dist/esm/utils/logger.d.ts.map +1 -0
- package/dist/esm/utils/logger.js +26 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/validate.d.ts +22 -0
- package/dist/esm/validate.d.ts.map +1 -0
- package/dist/esm/validate.js +169 -0
- package/dist/esm/validate.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../../src/utils/brand.ts"],"names":[],"mappings":"AAEA,0CAA0C;AAC1C,eAAO,MAAM,MAAM,QAA6D,CAAA;AAEhF,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/** Colored >> prefix: orange > green > */
|
|
3
|
+
export const PREFIX = `${chalk.hex('#FF8C00')('>')}${chalk.hex('#22C55E')('>')}`;
|
|
4
|
+
/** Prefix a title string with the branded >> */
|
|
5
|
+
export function brandTitle(text) {
|
|
6
|
+
return `${PREFIX} ${text}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../../../src/utils/brand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,0CAA0C;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;AAEhF,gDAAgD;AAChD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,CAAA;AAC5B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface GitMetadata {
|
|
2
|
+
remoteUrl: string | null;
|
|
3
|
+
branch: string | null;
|
|
4
|
+
commitHash: string | null;
|
|
5
|
+
repoName: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function normalizeGitUrl(url: string): string;
|
|
8
|
+
export declare function extractRepoName(url: string): string;
|
|
9
|
+
export declare function detectProjectType(cwd: string): Promise<string>;
|
|
10
|
+
export declare function getGitMetadata(cwd: string): Promise<GitMetadata>;
|
|
11
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/utils/git.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBpE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+CtE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { execFile as execFileCb } from 'node:child_process';
|
|
2
|
+
import { access } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
const execFile = promisify(execFileCb);
|
|
6
|
+
const GIT_TIMEOUT = 5000;
|
|
7
|
+
async function gitCommand(args, cwd) {
|
|
8
|
+
const { stdout } = await execFile('git', args, { cwd, timeout: GIT_TIMEOUT });
|
|
9
|
+
return stdout.trim();
|
|
10
|
+
}
|
|
11
|
+
export function normalizeGitUrl(url) {
|
|
12
|
+
if (url.startsWith('git@github.com:')) {
|
|
13
|
+
return `https://github.com/${url.slice('git@github.com:'.length)}`;
|
|
14
|
+
}
|
|
15
|
+
if (url.startsWith('ssh://git@github.com/')) {
|
|
16
|
+
return `https://github.com/${url.slice('ssh://git@github.com/'.length)}`;
|
|
17
|
+
}
|
|
18
|
+
return url;
|
|
19
|
+
}
|
|
20
|
+
export function extractRepoName(url) {
|
|
21
|
+
const match = url.match(/[:/]([^/]+\/[^/.]+?)(?:\.git)?$/);
|
|
22
|
+
return match ? match[1] : '';
|
|
23
|
+
}
|
|
24
|
+
export async function detectProjectType(cwd) {
|
|
25
|
+
const checks = [
|
|
26
|
+
['package.json', 'nodejs'],
|
|
27
|
+
['Cargo.toml', 'rust'],
|
|
28
|
+
['go.mod', 'go'],
|
|
29
|
+
['requirements.txt', 'python'],
|
|
30
|
+
['pyproject.toml', 'python'],
|
|
31
|
+
['setup.py', 'python'],
|
|
32
|
+
];
|
|
33
|
+
for (const [file, type] of checks) {
|
|
34
|
+
try {
|
|
35
|
+
await access(join(cwd, file));
|
|
36
|
+
return type;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// File doesn't exist, continue
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return 'generic';
|
|
43
|
+
}
|
|
44
|
+
export async function getGitMetadata(cwd) {
|
|
45
|
+
const fallback = {
|
|
46
|
+
remoteUrl: null,
|
|
47
|
+
branch: null,
|
|
48
|
+
commitHash: null,
|
|
49
|
+
repoName: 'unknown',
|
|
50
|
+
};
|
|
51
|
+
if (!cwd)
|
|
52
|
+
return fallback;
|
|
53
|
+
try {
|
|
54
|
+
let remoteUrl = null;
|
|
55
|
+
try {
|
|
56
|
+
const raw = await gitCommand(['remote', 'get-url', 'origin'], cwd);
|
|
57
|
+
remoteUrl = normalizeGitUrl(raw);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// No git remote
|
|
61
|
+
}
|
|
62
|
+
let branch = null;
|
|
63
|
+
try {
|
|
64
|
+
branch = await gitCommand(['rev-parse', '--abbrev-ref', 'HEAD'], cwd);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Not in a git repo
|
|
68
|
+
}
|
|
69
|
+
let commitHash = null;
|
|
70
|
+
try {
|
|
71
|
+
commitHash = await gitCommand(['rev-parse', 'HEAD'], cwd);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Not in a git repo
|
|
75
|
+
}
|
|
76
|
+
let repoName = 'unknown';
|
|
77
|
+
if (remoteUrl) {
|
|
78
|
+
const extracted = extractRepoName(remoteUrl);
|
|
79
|
+
if (extracted)
|
|
80
|
+
repoName = extracted;
|
|
81
|
+
}
|
|
82
|
+
if (repoName === 'unknown' && cwd) {
|
|
83
|
+
const { basename } = await import('node:path');
|
|
84
|
+
repoName = basename(cwd);
|
|
85
|
+
}
|
|
86
|
+
return { remoteUrl, branch, commitHash, repoName };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return fallback;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/utils/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAeA,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7E"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { appendFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { LOG_DIR, LOG_FILE } from '../config.js';
|
|
3
|
+
let logDirEnsured = false;
|
|
4
|
+
async function ensureLogDir() {
|
|
5
|
+
if (logDirEnsured)
|
|
6
|
+
return;
|
|
7
|
+
try {
|
|
8
|
+
await mkdir(LOG_DIR, { recursive: true, mode: 0o700 });
|
|
9
|
+
logDirEnsured = true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
// Ignore - best effort
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function logToFile(level, message) {
|
|
16
|
+
try {
|
|
17
|
+
await ensureLogDir();
|
|
18
|
+
const timestamp = new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
19
|
+
const line = `[${timestamp}] ${level}: ${message}\n`;
|
|
20
|
+
await appendFile(LOG_FILE, line, { mode: 0o600 });
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Never throw - logging must be silent
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEhD,IAAI,aAAa,GAAG,KAAK,CAAA;AAEzB,KAAK,UAAU,YAAY;IACzB,IAAI,aAAa;QAAE,OAAM;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACtD,aAAa,GAAG,IAAI,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe;IAC5D,IAAI,CAAC;QACH,MAAM,YAAY,EAAE,CAAA;QACpB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACpE,MAAM,IAAI,GAAG,IAAI,SAAS,KAAK,KAAK,KAAK,OAAO,IAAI,CAAA;QACpD,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
*
|
|
4
|
+
* Validates canonical JSONL files for correctness.
|
|
5
|
+
*/
|
|
6
|
+
interface ValidateOptions {
|
|
7
|
+
strict?: boolean;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
watch?: boolean;
|
|
11
|
+
provider?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Validate command implementation
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateCommand(path: string, options: ValidateOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Watch mode implementation
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateWatch(_path: string, _options: ValidateOptions): Promise<void>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AA+DD;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+H3F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAa3F"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate Command
|
|
3
|
+
*
|
|
4
|
+
* Validates canonical JSONL files for correctness.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, readdirSync, statSync } from 'node:fs';
|
|
7
|
+
import { extname, join } from 'node:path';
|
|
8
|
+
import { generateValidationReport, validateJSONL, } from '@guidemode/session-processing/validation';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
/**
|
|
11
|
+
* Find all JSONL files in a directory
|
|
12
|
+
*/
|
|
13
|
+
function findJSONLFiles(path) {
|
|
14
|
+
const files = [];
|
|
15
|
+
try {
|
|
16
|
+
const stat = statSync(path);
|
|
17
|
+
if (stat.isFile()) {
|
|
18
|
+
if (extname(path) === '.jsonl') {
|
|
19
|
+
files.push(path);
|
|
20
|
+
}
|
|
21
|
+
return files;
|
|
22
|
+
}
|
|
23
|
+
if (stat.isDirectory()) {
|
|
24
|
+
const entries = readdirSync(path);
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const fullPath = join(path, entry);
|
|
27
|
+
files.push(...findJSONLFiles(fullPath));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(chalk.red('Error reading path:'), error instanceof Error ? error.message : String(error));
|
|
33
|
+
}
|
|
34
|
+
return files;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate a single JSONL file
|
|
38
|
+
*/
|
|
39
|
+
function validateFile(filePath, options) {
|
|
40
|
+
if (!options.json) {
|
|
41
|
+
console.log(chalk.cyan(`\nValidating: ${filePath}`));
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
// Read file content
|
|
45
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
46
|
+
// Validate JSONL content
|
|
47
|
+
const result = validateJSONL(content, {
|
|
48
|
+
skipInvalidJSON: !options.strict,
|
|
49
|
+
includeWarnings: true,
|
|
50
|
+
});
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error(chalk.red('Validation error:'), error instanceof Error ? error.message : String(error));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Validate command implementation
|
|
60
|
+
*/
|
|
61
|
+
export async function validateCommand(path, options) {
|
|
62
|
+
// Only show headers if not in JSON mode
|
|
63
|
+
if (!options.json) {
|
|
64
|
+
console.log(chalk.bold('GuideMode Canonical JSONL Validator'));
|
|
65
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
66
|
+
}
|
|
67
|
+
// Find all JSONL files
|
|
68
|
+
const files = findJSONLFiles(path);
|
|
69
|
+
if (files.length === 0) {
|
|
70
|
+
if (!options.json) {
|
|
71
|
+
console.log(chalk.yellow('No JSONL files found'));
|
|
72
|
+
}
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!options.json) {
|
|
76
|
+
console.log(chalk.cyan(`Found ${files.length} JSONL file(s)`));
|
|
77
|
+
}
|
|
78
|
+
// Filter by provider if specified
|
|
79
|
+
const filesToValidate = options.provider
|
|
80
|
+
? files.filter(f => f.includes(`/${options.provider}/`))
|
|
81
|
+
: files;
|
|
82
|
+
if (filesToValidate.length === 0) {
|
|
83
|
+
if (!options.json) {
|
|
84
|
+
console.log(chalk.yellow(`No files found for provider: ${options.provider}`));
|
|
85
|
+
}
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (options.provider && !options.json) {
|
|
89
|
+
console.log(chalk.cyan(`Filtering for provider "${options.provider}": ${filesToValidate.length} file(s)`));
|
|
90
|
+
}
|
|
91
|
+
// Validate each file
|
|
92
|
+
const results = [];
|
|
93
|
+
for (const file of filesToValidate) {
|
|
94
|
+
const result = validateFile(file, options);
|
|
95
|
+
results.push({ file, result });
|
|
96
|
+
}
|
|
97
|
+
// Generate reports
|
|
98
|
+
if (options.json) {
|
|
99
|
+
// JSON output
|
|
100
|
+
const jsonOutput = results.map(r => ({
|
|
101
|
+
file: r.file,
|
|
102
|
+
valid: r.result.valid,
|
|
103
|
+
totalLines: r.result.totalLines,
|
|
104
|
+
validMessages: r.result.validMessages,
|
|
105
|
+
errors: r.result.errors,
|
|
106
|
+
warnings: r.result.sessionResult?.warnings || [],
|
|
107
|
+
sessionId: r.result.sessionResult?.sessionId,
|
|
108
|
+
provider: r.result.sessionResult?.provider,
|
|
109
|
+
}));
|
|
110
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Human-readable output
|
|
114
|
+
for (const { file, result } of results) {
|
|
115
|
+
console.log(chalk.gray(`\n${'─'.repeat(50)}`));
|
|
116
|
+
console.log(chalk.bold(`File: ${file}`));
|
|
117
|
+
console.log(generateValidationReport(result, {
|
|
118
|
+
verbose: options.verbose,
|
|
119
|
+
colorize: true,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
// Summary
|
|
123
|
+
console.log(chalk.gray(`\n${'='.repeat(50)}`));
|
|
124
|
+
console.log(chalk.bold('Summary'));
|
|
125
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
126
|
+
const totalFiles = results.length;
|
|
127
|
+
const validFiles = results.filter(r => r.result.valid).length;
|
|
128
|
+
const invalidFiles = totalFiles - validFiles;
|
|
129
|
+
const totalMessages = results.reduce((sum, r) => sum + r.result.parsedLines, 0);
|
|
130
|
+
const validMessages = results.reduce((sum, r) => sum + r.result.validMessages, 0);
|
|
131
|
+
const totalErrors = results.reduce((sum, r) => sum + r.result.errors.length, 0);
|
|
132
|
+
const totalWarnings = results.reduce((sum, r) => sum + (r.result.sessionResult?.warnings.length || 0), 0);
|
|
133
|
+
console.log(`Total Files: ${totalFiles}`);
|
|
134
|
+
console.log(`Valid Files: ${chalk.green(validFiles)} / Invalid: ${invalidFiles > 0 ? chalk.red(invalidFiles) : invalidFiles}`);
|
|
135
|
+
console.log(`Total Messages: ${totalMessages} / Valid: ${chalk.green(validMessages)}`);
|
|
136
|
+
console.log(`Total Errors: ${totalErrors > 0 ? chalk.red(totalErrors) : totalErrors}`);
|
|
137
|
+
console.log(`Total Warnings: ${totalWarnings > 0 ? chalk.yellow(totalWarnings) : totalWarnings}`);
|
|
138
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
139
|
+
if (invalidFiles === 0 && totalErrors === 0) {
|
|
140
|
+
console.log(chalk.green(chalk.bold('\n✓ All validations passed!')));
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log(chalk.red(chalk.bold(`\n✗ Validation failed with ${totalErrors} error(s) across ${invalidFiles} file(s)`)));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Exit code
|
|
147
|
+
const hasErrors = results.some(r => !r.result.valid);
|
|
148
|
+
const hasWarnings = results.some(r => r.result.sessionResult && r.result.sessionResult.warnings.length > 0);
|
|
149
|
+
if (hasErrors || (options.strict && hasWarnings)) {
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Watch mode implementation
|
|
155
|
+
*/
|
|
156
|
+
export async function validateWatch(_path, _options) {
|
|
157
|
+
console.log(chalk.cyan('Watch mode not yet implemented'));
|
|
158
|
+
console.log(chalk.gray('Use --help for available options'));
|
|
159
|
+
process.exit(1);
|
|
160
|
+
// TODO: Implement watch mode with chokidar
|
|
161
|
+
// import { watch } from 'chokidar'
|
|
162
|
+
// const watcher = watch(path, { ignoreInitial: false })
|
|
163
|
+
// watcher.on('change', async (filePath) => {
|
|
164
|
+
// if (extname(filePath) === '.jsonl') {
|
|
165
|
+
// await validateFile(filePath, options)
|
|
166
|
+
// }
|
|
167
|
+
// })
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAUA,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhE;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAUhD;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB5C"}
|
package/dist/esm/auth.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { URL } from 'node:url';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import open from 'open';
|
|
5
|
+
import { clearConfig, loadConfig, updateConfig } from './config.js';
|
|
6
|
+
import { PREFIX } from './utils/brand.js';
|
|
7
|
+
const PORT_RANGE_START = 8765;
|
|
8
|
+
const PORT_RANGE_END = 8770;
|
|
9
|
+
export async function loginFlow(serverUrl) {
|
|
10
|
+
console.log(`${PREFIX} Starting authentication flow...`);
|
|
11
|
+
const _config = await loadConfig();
|
|
12
|
+
// Start local callback server (tries ports 8765-8770)
|
|
13
|
+
const { server, callbackUrl } = await startCallbackServer();
|
|
14
|
+
try {
|
|
15
|
+
// Open browser to auth endpoint
|
|
16
|
+
const authUrl = `${serverUrl}/auth/desktop?redirect_uri=${encodeURIComponent(callbackUrl)}`;
|
|
17
|
+
console.log(chalk.gray(`Opening browser to: ${authUrl}`));
|
|
18
|
+
await open(authUrl);
|
|
19
|
+
console.log(chalk.yellow(`${PREFIX} Waiting for authentication in browser...`));
|
|
20
|
+
// Wait for callback with API key and tenant info
|
|
21
|
+
const callbackData = await waitForCallback(server);
|
|
22
|
+
if (!callbackData.apiKey) {
|
|
23
|
+
throw new Error('No API key received from callback');
|
|
24
|
+
}
|
|
25
|
+
// Get user info to store username
|
|
26
|
+
const userInfo = await getUserInfo(serverUrl, callbackData.apiKey);
|
|
27
|
+
// Save config with tenant information
|
|
28
|
+
await updateConfig({
|
|
29
|
+
apiKey: callbackData.apiKey,
|
|
30
|
+
serverUrl,
|
|
31
|
+
username: userInfo.username,
|
|
32
|
+
name: userInfo.name,
|
|
33
|
+
avatarUrl: userInfo.avatarUrl,
|
|
34
|
+
tenantId: callbackData.tenantId,
|
|
35
|
+
tenantName: callbackData.tenantName,
|
|
36
|
+
});
|
|
37
|
+
console.log(`${PREFIX} ${chalk.green('✓ Authentication successful!')}`);
|
|
38
|
+
console.log(chalk.gray(`Logged in as: ${userInfo.username}`));
|
|
39
|
+
if (callbackData.tenantName) {
|
|
40
|
+
console.log(chalk.gray(`Tenant: ${callbackData.tenantName}`));
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.gray(`Server: ${serverUrl}`));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error(chalk.red('✗ Authentication failed:'), error instanceof Error ? error.message : 'Unknown error');
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
server.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function logoutFlow() {
|
|
53
|
+
const config = await loadConfig();
|
|
54
|
+
if (!config.apiKey) {
|
|
55
|
+
console.log(chalk.yellow(`${PREFIX} Not currently logged in`));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
await clearConfig();
|
|
59
|
+
console.log(`${PREFIX} ${chalk.green('✓ Logged out successfully')}`);
|
|
60
|
+
}
|
|
61
|
+
export async function whoAmI() {
|
|
62
|
+
const config = await loadConfig();
|
|
63
|
+
if (!config.apiKey || !config.username) {
|
|
64
|
+
console.log(chalk.yellow(`${PREFIX} Not currently logged in`));
|
|
65
|
+
console.log(chalk.gray('Run "guidemode login" to authenticate'));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
if (!config.serverUrl) {
|
|
70
|
+
console.log(chalk.red(`${PREFIX} ✗ No server URL configured`));
|
|
71
|
+
console.log(chalk.gray('Run "guidemode login" to authenticate'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const userInfo = await getUserInfo(config.serverUrl, config.apiKey);
|
|
75
|
+
console.log(`${PREFIX} ${chalk.green(`Logged in as: ${userInfo.username}`)}`);
|
|
76
|
+
console.log(chalk.gray(`Server: ${config.serverUrl}`));
|
|
77
|
+
console.log(chalk.gray(`API Key: ${config.apiKey.substring(0, 12)}...`));
|
|
78
|
+
}
|
|
79
|
+
catch (_error) {
|
|
80
|
+
console.log(chalk.red('✗ Invalid credentials'));
|
|
81
|
+
console.log(chalk.gray('Run "guidemode login" to re-authenticate'));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function findAvailablePort() {
|
|
85
|
+
for (let port = PORT_RANGE_START; port <= PORT_RANGE_END; port++) {
|
|
86
|
+
const available = await new Promise(resolve => {
|
|
87
|
+
const testServer = createServer();
|
|
88
|
+
testServer.once('error', () => resolve(false));
|
|
89
|
+
testServer.listen(port, '127.0.0.1', () => {
|
|
90
|
+
testServer.close(() => resolve(true));
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
if (available)
|
|
94
|
+
return port;
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`No available port in range ${PORT_RANGE_START}-${PORT_RANGE_END}`);
|
|
97
|
+
}
|
|
98
|
+
async function startCallbackServer() {
|
|
99
|
+
const port = await findAvailablePort();
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const server = createServer((req, res) => {
|
|
102
|
+
if (!req.url) {
|
|
103
|
+
res.writeHead(400);
|
|
104
|
+
res.end('Bad Request');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const url = new URL(req.url, `http://127.0.0.1:${port}`);
|
|
108
|
+
if (url.pathname === '/callback') {
|
|
109
|
+
const apiKey = url.searchParams.get('key');
|
|
110
|
+
const tenantId = url.searchParams.get('tenant_id');
|
|
111
|
+
const tenantName = url.searchParams.get('tenant_name');
|
|
112
|
+
const error = url.searchParams.get('error');
|
|
113
|
+
if (error) {
|
|
114
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
115
|
+
res.end(`
|
|
116
|
+
<html>
|
|
117
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
118
|
+
<h1 style="color: #dc2626;">Authentication Failed</h1>
|
|
119
|
+
<p>Error: ${error}</p>
|
|
120
|
+
<p>You can close this browser window and try again.</p>
|
|
121
|
+
</body>
|
|
122
|
+
</html>
|
|
123
|
+
`);
|
|
124
|
+
server.emit('auth-error', error);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (apiKey) {
|
|
128
|
+
const tenantInfo = tenantName ? ` for ${tenantName}` : '';
|
|
129
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
130
|
+
res.end(`
|
|
131
|
+
<html>
|
|
132
|
+
<body style="font-family: system-ui; padding: 40px; text-align: center;">
|
|
133
|
+
<h1 style="color: #059669;">Authentication Successful!</h1>
|
|
134
|
+
<p>You have been authenticated with the GuideMode CLI${tenantInfo}.</p>
|
|
135
|
+
<p style="color: #6b7280;">You can close this browser window and return to your terminal.</p>
|
|
136
|
+
</body>
|
|
137
|
+
</html>
|
|
138
|
+
`);
|
|
139
|
+
server.emit('auth-success', { apiKey, tenantId, tenantName });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
144
|
+
res.end('Not found');
|
|
145
|
+
});
|
|
146
|
+
server.listen(port, '127.0.0.1', () => {
|
|
147
|
+
resolve({
|
|
148
|
+
server,
|
|
149
|
+
callbackUrl: `http://127.0.0.1:${port}/callback`,
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
server.on('error', (err) => {
|
|
153
|
+
reject(err);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async function waitForCallback(server) {
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
const timeout = setTimeout(() => {
|
|
160
|
+
reject(new Error('Authentication timeout (5 minutes)'));
|
|
161
|
+
}, 5 * 60 * 1000); // 5 minutes
|
|
162
|
+
server.once('auth-success', (data) => {
|
|
163
|
+
clearTimeout(timeout);
|
|
164
|
+
resolve(data);
|
|
165
|
+
});
|
|
166
|
+
server.once('auth-error', (error) => {
|
|
167
|
+
clearTimeout(timeout);
|
|
168
|
+
reject(new Error(error));
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
async function getUserInfo(serverUrl, apiKey) {
|
|
173
|
+
const response = await fetch(`${serverUrl}/auth/session`, {
|
|
174
|
+
headers: {
|
|
175
|
+
Authorization: `Bearer ${apiKey}`,
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
throw new Error(`Failed to get user info: ${response.status} ${response.statusText}`);
|
|
180
|
+
}
|
|
181
|
+
const data = (await response.json());
|
|
182
|
+
if (!data.authenticated || !data.user) {
|
|
183
|
+
throw new Error('Invalid API key or user not found');
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
username: data.user.username,
|
|
187
|
+
name: data.user.name || '',
|
|
188
|
+
avatarUrl: data.user.avatarUrl || '',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,kCAAkC,CAAC,CAAA;IAExD,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAA;IAElC,sDAAsD;IACtD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAA;IAE3D,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,OAAO,GAAG,GAAG,SAAS,8BAA8B,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAA;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAA;QAEzD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAA;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,2CAA2C,CAAC,CAAC,CAAA;QAE/E,iDAAiD;QACjD,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,CAAA;QAElD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACtD,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;QAElE,sCAAsC;QACtC,MAAM,YAAY,CAAC;YACjB,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,SAAS;YACT,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,UAAU,EAAE,YAAY,CAAC,UAAU;SACpC,CAAC,CAAA;QAEF,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC/D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EACrC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CACzD,CAAA;QACD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,0BAA0B,CAAC,CAAC,CAAA;QAC9D,OAAM;IACR,CAAC;IAED,MAAM,WAAW,EAAE,CAAA;IACnB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,0BAA0B,CAAC,CAAC,CAAA;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAA;QAChE,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,6BAA6B,CAAC,CAAC,CAAA;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAA;YAChE,OAAM;QACR,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1E,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAA;IACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,KAAK,IAAI,IAAI,GAAG,gBAAgB,EAAE,IAAI,IAAI,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;YACrD,MAAM,UAAU,GAAG,YAAY,EAAE,CAAA;YACjC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;YAC9C,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBACxC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,IAAI,SAAS;YAAE,OAAO,IAAI,CAAA;IAC5B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,gBAAgB,IAAI,cAAc,EAAE,CAAC,CAAA;AACrF,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAA;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;gBAClB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;gBACtB,OAAM;YACR,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAA;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;gBACtD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAE3C,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAA;oBACnD,GAAG,CAAC,GAAG,CAAC;;;;4BAIU,KAAK;;;;WAItB,CAAC,CAAA;oBACF,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;oBAChC,OAAM;gBACR,CAAC;gBAED,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;oBACzD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAA;oBACnD,GAAG,CAAC,GAAG,CAAC;;;;uEAIqD,UAAU;;;;WAItE,CAAC,CAAA;oBACF,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;oBAC7D,OAAM;gBACR,CAAC;YACH,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAA;YACpD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,OAAO,CAAC;gBACN,MAAM;gBACN,WAAW,EAAE,oBAAoB,IAAI,WAAW;aACjD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAChD,MAAM,CAAC,GAAG,CAAC,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAc;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE;YACH,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAA;QACzD,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAA,CAAC,YAAY;QAEd,MAAM,CAAC,IAAI,CACT,cAAc,EACd,CAAC,IAAgE,EAAE,EAAE;YACnE,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,CACF,CAAA;QAED,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1C,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,eAAe,EAAE;QACxD,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAA;IAED,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;QAC1B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE;KACrC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|