@nirnex/cli 4.2.0 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +25 -13
- package/dist/commands/index.js.map +1 -1
- package/dist/utils/debug-log.d.ts +44 -0
- package/dist/utils/debug-log.d.ts.map +1 -0
- package/dist/utils/debug-log.js +183 -0
- package/dist/utils/debug-log.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export interface IndexResult {
|
|
|
3
3
|
failed: number;
|
|
4
4
|
failedFiles: string[];
|
|
5
5
|
durationMs: number;
|
|
6
|
+
debugLogPath?: string;
|
|
6
7
|
}
|
|
7
|
-
export declare function indexCommand(args: string[]): IndexResult;
|
|
8
|
+
export declare function indexCommand(args: string[], commandLabel?: string): IndexResult;
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,WAAW,CA6G/E"}
|
package/dist/commands/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { openDb, insertParsedModule, setMetaCommitHash, computeGraphEdges } from '@nirnex/core/dist/db.js';
|
|
2
|
-
import {
|
|
2
|
+
import { parseFileWithDiagnostics } from '@nirnex/parser/dist/index.js';
|
|
3
|
+
import { appendDebugLog } from '../utils/debug-log.js';
|
|
3
4
|
import fs from 'node:fs';
|
|
4
5
|
import path from 'node:path';
|
|
5
6
|
import { execSync } from 'node:child_process';
|
|
@@ -39,9 +40,10 @@ function detectModule(fullPath, rootDir) {
|
|
|
39
40
|
return parts[0] + '/' + parts[1];
|
|
40
41
|
return parts[0];
|
|
41
42
|
}
|
|
42
|
-
export function indexCommand(args) {
|
|
43
|
+
export function indexCommand(args, commandLabel) {
|
|
43
44
|
const isRebuild = args.includes('--rebuild');
|
|
44
45
|
const targetDir = process.cwd();
|
|
46
|
+
const label = commandLabel ?? (isRebuild ? 'index --rebuild' : 'index');
|
|
45
47
|
const dbPath = path.join(targetDir, '.aidos.db');
|
|
46
48
|
console.log('[nirnex index] Starting ' + (isRebuild ? 'full rebuild' : 'incremental update') + ' on ' + targetDir);
|
|
47
49
|
const t0 = performance.now();
|
|
@@ -66,13 +68,23 @@ export function indexCommand(args) {
|
|
|
66
68
|
let succeeded = 0;
|
|
67
69
|
let failed = 0;
|
|
68
70
|
const failedFiles = [];
|
|
71
|
+
let debugLogPath;
|
|
69
72
|
for (const file of filesToProcess) {
|
|
70
|
-
const
|
|
71
|
-
if (!
|
|
73
|
+
const result = parseFileWithDiagnostics(file);
|
|
74
|
+
if (!result.ok) {
|
|
72
75
|
failed++;
|
|
73
76
|
failedFiles.push(file);
|
|
77
|
+
// Write structured debug record — first failure prints the log path
|
|
78
|
+
const logPath = appendDebugLog(targetDir, result.diagnostics, label);
|
|
79
|
+
if (failed === 1) {
|
|
80
|
+
debugLogPath = logPath;
|
|
81
|
+
process.stderr.write(`[nirnex index] suspected cause: ${result.diagnostics.stage} stage failure` +
|
|
82
|
+
` (${result.diagnostics.extension} / ${result.diagnostics.selected_language ?? 'unknown grammar'})\n` +
|
|
83
|
+
`[nirnex index] debug details → ${path.relative(targetDir, logPath)}\n`);
|
|
84
|
+
}
|
|
74
85
|
continue;
|
|
75
86
|
}
|
|
87
|
+
const parsed = result.module;
|
|
76
88
|
const myModule = detectModule(file, targetDir);
|
|
77
89
|
const enrichedImports = parsed.imports.map((imp) => {
|
|
78
90
|
const resolved = resolveImport(imp.source, file);
|
|
@@ -85,13 +97,10 @@ export function indexCommand(args) {
|
|
|
85
97
|
...imp,
|
|
86
98
|
resolved: resolved.resolved,
|
|
87
99
|
is_local: resolved.is_local,
|
|
88
|
-
is_cross_module
|
|
100
|
+
is_cross_module,
|
|
89
101
|
};
|
|
90
102
|
});
|
|
91
|
-
insertParsedModule(db, {
|
|
92
|
-
...parsed,
|
|
93
|
-
imports: enrichedImports
|
|
94
|
-
});
|
|
103
|
+
insertParsedModule(db, { ...parsed, imports: enrichedImports });
|
|
95
104
|
succeeded++;
|
|
96
105
|
}
|
|
97
106
|
computeGraphEdges(db);
|
|
@@ -109,12 +118,15 @@ export function indexCommand(args) {
|
|
|
109
118
|
console.log(`[nirnex index] Finished: ${succeeded}/${filesToProcess.length} file(s) indexed in ${durationMs.toFixed(2)}ms`);
|
|
110
119
|
}
|
|
111
120
|
else {
|
|
112
|
-
|
|
113
|
-
`${failed} failed in ${durationMs.toFixed(2)}ms`);
|
|
121
|
+
process.stderr.write(`[nirnex index] Finished with degraded coverage: ${succeeded}/${filesToProcess.length} indexed, ` +
|
|
122
|
+
`${failed} failed in ${durationMs.toFixed(2)}ms\n`);
|
|
114
123
|
for (const f of failedFiles) {
|
|
115
|
-
|
|
124
|
+
process.stderr.write(`[nirnex index] ✖ ${path.relative(targetDir, f)}\n`);
|
|
125
|
+
}
|
|
126
|
+
if (failed > 1 && debugLogPath) {
|
|
127
|
+
process.stderr.write(`[nirnex index] ${failed} parser failures recorded → ${path.relative(targetDir, debugLogPath)}\n`);
|
|
116
128
|
}
|
|
117
129
|
}
|
|
118
|
-
return { succeeded, failed, failedFiles, durationMs };
|
|
130
|
+
return { succeeded, failed, failedFiles, durationMs, debugLogPath };
|
|
119
131
|
}
|
|
120
132
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC3G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured JSONL debug logger for nirnex parser failures.
|
|
3
|
+
*
|
|
4
|
+
* Writes to .ai-index/nirnex-debug.log (append-only, rotated at 10 MB).
|
|
5
|
+
* Never throws — debug logging must never interrupt indexing.
|
|
6
|
+
*/
|
|
7
|
+
import type { ParseFileDiagnostics } from '@nirnex/parser/dist/index.js';
|
|
8
|
+
export interface DebugLogEntry {
|
|
9
|
+
timestamp: string;
|
|
10
|
+
level: 'error' | 'warn' | 'info';
|
|
11
|
+
event: 'parser_failure';
|
|
12
|
+
command: string;
|
|
13
|
+
node_version: string;
|
|
14
|
+
platform: string;
|
|
15
|
+
nirnex_cli_version?: string;
|
|
16
|
+
nirnex_parser_version?: string;
|
|
17
|
+
tree_sitter_version?: string;
|
|
18
|
+
grammar_package: string;
|
|
19
|
+
grammar_variant?: string;
|
|
20
|
+
file: string;
|
|
21
|
+
extension: string;
|
|
22
|
+
size_bytes: number;
|
|
23
|
+
content_sha256?: string;
|
|
24
|
+
char_length?: number;
|
|
25
|
+
has_bom?: boolean;
|
|
26
|
+
has_null_bytes?: boolean;
|
|
27
|
+
newline_style?: string;
|
|
28
|
+
selected_language?: string;
|
|
29
|
+
language_set?: boolean;
|
|
30
|
+
input_type?: string;
|
|
31
|
+
stage: string;
|
|
32
|
+
error_name: string;
|
|
33
|
+
error_message: string;
|
|
34
|
+
stack?: string;
|
|
35
|
+
suspected_cause: string;
|
|
36
|
+
recommended_actions: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Appends a structured JSONL record to `.ai-index/nirnex-debug.log`.
|
|
40
|
+
* Returns the absolute path to the log file.
|
|
41
|
+
* Never throws.
|
|
42
|
+
*/
|
|
43
|
+
export declare function appendDebugLog(cwd: string, diag: ParseFileDiagnostics, command: string): string;
|
|
44
|
+
//# sourceMappingURL=debug-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-log.d.ts","sourceRoot":"","sources":["../../src/utils/debug-log.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAwIzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAEhB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,MAAM,GACd,MAAM,CAyDR"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured JSONL debug logger for nirnex parser failures.
|
|
3
|
+
*
|
|
4
|
+
* Writes to .ai-index/nirnex-debug.log (append-only, rotated at 10 MB).
|
|
5
|
+
* Never throws — debug logging must never interrupt indexing.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
const _require = createRequire(import.meta.url);
|
|
11
|
+
const MAX_LOG_BYTES = 10 * 1024 * 1024; // 10 MB
|
|
12
|
+
// ─── Version helpers ─────────────────────────────────────────────────────────
|
|
13
|
+
function pkgVersion(name) {
|
|
14
|
+
try {
|
|
15
|
+
return _require(`${name}/package.json`).version;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function classify(diag) {
|
|
22
|
+
// Grammar set failed — ABI / binding problem
|
|
23
|
+
if (diag.stage === 'set_language') {
|
|
24
|
+
return {
|
|
25
|
+
suspected_cause: 'grammar_binding_problem',
|
|
26
|
+
recommended_actions: [
|
|
27
|
+
'The tree-sitter language could not be set — likely a native ABI or version mismatch',
|
|
28
|
+
'Run: npm ls tree-sitter tree-sitter-typescript',
|
|
29
|
+
'Reinstall: npm install -g @nirnex/cli',
|
|
30
|
+
'Check Node.js version compatibility with the tree-sitter native module',
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// TSX file got TypeScript grammar — should never happen, but detectable
|
|
35
|
+
if (diag.extension === '.tsx' && diag.selected_language === 'typescript') {
|
|
36
|
+
return {
|
|
37
|
+
suspected_cause: 'wrong_grammar_selected',
|
|
38
|
+
recommended_actions: [
|
|
39
|
+
'A .tsx file was routed to the TypeScript grammar instead of the TSX grammar',
|
|
40
|
+
'This is a Nirnex parser bug — please file a report',
|
|
41
|
+
'Workaround: rename the file to .ts temporarily if it contains no JSX',
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Null bytes — binary or incorrectly encoded file
|
|
46
|
+
if (diag.has_null_bytes) {
|
|
47
|
+
return {
|
|
48
|
+
suspected_cause: 'invalid_file_encoding',
|
|
49
|
+
recommended_actions: [
|
|
50
|
+
'File contains null (0x00) bytes — it may be binary output, compiled JS, or mis-encoded',
|
|
51
|
+
'Re-save the file as UTF-8 without BOM using your editor',
|
|
52
|
+
'Check whether this file should be excluded via .gitignore or nirnex config',
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Non-string passed to parse() — Nirnex bug
|
|
57
|
+
if (diag.input_type !== undefined && diag.input_type !== 'string') {
|
|
58
|
+
return {
|
|
59
|
+
suspected_cause: 'invalid_parse_input_type',
|
|
60
|
+
recommended_actions: [
|
|
61
|
+
`Parser received type "${diag.input_type}" instead of a string — this is a Nirnex bug`,
|
|
62
|
+
'Please file a bug report with this log entry attached',
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// File could not be read or decoded
|
|
67
|
+
if (diag.stage === 'read_file' || diag.stage === 'decode_file') {
|
|
68
|
+
return {
|
|
69
|
+
suspected_cause: 'file_access_or_encoding_error',
|
|
70
|
+
recommended_actions: [
|
|
71
|
+
`Check file permissions: ls -la "${diag.file}"`,
|
|
72
|
+
'Ensure the file is valid UTF-8 (not UTF-16, Latin-1, or binary)',
|
|
73
|
+
'Check whether the file is a dangling symlink',
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Parse stage failure for .tsx — grammar or syntax issue
|
|
78
|
+
if (diag.stage === 'parse' && diag.extension === '.tsx') {
|
|
79
|
+
return {
|
|
80
|
+
suspected_cause: 'unsupported_syntax_or_parser_binding_issue',
|
|
81
|
+
recommended_actions: [
|
|
82
|
+
'The TSX grammar (tree-sitter-typescript) could not parse this file',
|
|
83
|
+
'Possible causes: very new JSX/TS syntax, very large file, or ABI mismatch in native bindings',
|
|
84
|
+
'Run: npm ls tree-sitter tree-sitter-typescript — look for version mismatches',
|
|
85
|
+
'Try reproducing with a minimal .tsx snippet to isolate the syntax involved',
|
|
86
|
+
'If other .tsx files parse successfully, the issue is specific to this file\'s syntax',
|
|
87
|
+
'File a bug report with this log entry if the problem persists',
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// Parse stage failure for .ts
|
|
92
|
+
if (diag.stage === 'parse' && diag.extension === '.ts') {
|
|
93
|
+
return {
|
|
94
|
+
suspected_cause: 'unsupported_syntax_or_parser_binding_issue',
|
|
95
|
+
recommended_actions: [
|
|
96
|
+
'The TypeScript grammar (tree-sitter-typescript) could not parse this file',
|
|
97
|
+
'Run: npm ls tree-sitter tree-sitter-typescript — look for version mismatches',
|
|
98
|
+
'Try reproducing with a minimal .ts snippet',
|
|
99
|
+
'File a bug report with this log entry if the problem persists',
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// AST traversal bug — Nirnex bug, not user file
|
|
104
|
+
if (diag.stage === 'postprocess_ast') {
|
|
105
|
+
return {
|
|
106
|
+
suspected_cause: 'nirnex_ast_traversal_bug',
|
|
107
|
+
recommended_actions: [
|
|
108
|
+
'Parsing succeeded but Nirnex failed while reading the syntax tree — this is a Nirnex bug',
|
|
109
|
+
'Please file a bug report with this log entry',
|
|
110
|
+
'Workaround: the file will be skipped from the index until the bug is fixed',
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
suspected_cause: 'unknown',
|
|
116
|
+
recommended_actions: [
|
|
117
|
+
'Review the stack trace in this log entry for clues',
|
|
118
|
+
'Run: nirnex index --rebuild to retry',
|
|
119
|
+
'File a bug report with this log entry attached',
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// ─── Main export ─────────────────────────────────────────────────────────────
|
|
124
|
+
/**
|
|
125
|
+
* Appends a structured JSONL record to `.ai-index/nirnex-debug.log`.
|
|
126
|
+
* Returns the absolute path to the log file.
|
|
127
|
+
* Never throws.
|
|
128
|
+
*/
|
|
129
|
+
export function appendDebugLog(cwd, diag, command) {
|
|
130
|
+
const logDir = path.join(cwd, '.ai-index');
|
|
131
|
+
const logPath = path.join(logDir, 'nirnex-debug.log');
|
|
132
|
+
try {
|
|
133
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
134
|
+
// Rotate if log exceeds size limit
|
|
135
|
+
try {
|
|
136
|
+
const stat = fs.statSync(logPath);
|
|
137
|
+
if (stat.size > MAX_LOG_BYTES) {
|
|
138
|
+
const rotated = `${logPath}.${Date.now()}.old`;
|
|
139
|
+
fs.renameSync(logPath, rotated);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Log may not exist yet — that's fine
|
|
144
|
+
}
|
|
145
|
+
const { suspected_cause, recommended_actions } = classify(diag);
|
|
146
|
+
const entry = {
|
|
147
|
+
timestamp: new Date().toISOString(),
|
|
148
|
+
level: 'error',
|
|
149
|
+
event: 'parser_failure',
|
|
150
|
+
command,
|
|
151
|
+
node_version: process.version,
|
|
152
|
+
platform: `${process.platform}-${process.arch}`,
|
|
153
|
+
nirnex_cli_version: pkgVersion('@nirnex/cli'),
|
|
154
|
+
nirnex_parser_version: pkgVersion('@nirnex/parser'),
|
|
155
|
+
tree_sitter_version: pkgVersion('tree-sitter'),
|
|
156
|
+
grammar_package: 'tree-sitter-typescript',
|
|
157
|
+
grammar_variant: diag.grammar_variant,
|
|
158
|
+
file: diag.file,
|
|
159
|
+
extension: diag.extension,
|
|
160
|
+
size_bytes: diag.size_bytes,
|
|
161
|
+
content_sha256: diag.content_sha256,
|
|
162
|
+
char_length: diag.char_length,
|
|
163
|
+
has_bom: diag.has_bom,
|
|
164
|
+
has_null_bytes: diag.has_null_bytes,
|
|
165
|
+
newline_style: diag.newline_style,
|
|
166
|
+
selected_language: diag.selected_language,
|
|
167
|
+
language_set: diag.language_set,
|
|
168
|
+
input_type: diag.input_type,
|
|
169
|
+
stage: diag.stage,
|
|
170
|
+
error_name: diag.error_name,
|
|
171
|
+
error_message: diag.error_message,
|
|
172
|
+
stack: diag.stack,
|
|
173
|
+
suspected_cause,
|
|
174
|
+
recommended_actions,
|
|
175
|
+
};
|
|
176
|
+
fs.appendFileSync(logPath, JSON.stringify(entry) + '\n', 'utf8');
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Never propagate — debug logging must not break indexing
|
|
180
|
+
}
|
|
181
|
+
return logPath;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=debug-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-log.js","sourceRoot":"","sources":["../../src/utils/debug-log.ts"],"names":[],"mappings":"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"}
|