@grafema/cli 0.2.4-beta → 0.2.5-beta

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.
Files changed (84) hide show
  1. package/README.md +73 -0
  2. package/dist/cli.js +1 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/analyze.d.ts +9 -0
  5. package/dist/commands/analyze.d.ts.map +1 -1
  6. package/dist/commands/analyze.js +136 -52
  7. package/dist/commands/analyze.js.map +1 -0
  8. package/dist/commands/check.d.ts +2 -6
  9. package/dist/commands/check.d.ts.map +1 -1
  10. package/dist/commands/check.js +32 -46
  11. package/dist/commands/check.js.map +1 -0
  12. package/dist/commands/coverage.js +1 -0
  13. package/dist/commands/coverage.js.map +1 -0
  14. package/dist/commands/doctor/checks.d.ts.map +1 -1
  15. package/dist/commands/doctor/checks.js +9 -5
  16. package/dist/commands/doctor/checks.js.map +1 -0
  17. package/dist/commands/doctor/output.js +1 -0
  18. package/dist/commands/doctor/output.js.map +1 -0
  19. package/dist/commands/doctor/types.js +1 -0
  20. package/dist/commands/doctor/types.js.map +1 -0
  21. package/dist/commands/doctor.js +1 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/explain.js +1 -0
  24. package/dist/commands/explain.js.map +1 -0
  25. package/dist/commands/explore.d.ts.map +1 -1
  26. package/dist/commands/explore.js +9 -4
  27. package/dist/commands/explore.js.map +1 -0
  28. package/dist/commands/get.d.ts.map +1 -1
  29. package/dist/commands/get.js +7 -0
  30. package/dist/commands/get.js.map +1 -0
  31. package/dist/commands/impact.js +1 -0
  32. package/dist/commands/impact.js.map +1 -0
  33. package/dist/commands/init.d.ts.map +1 -1
  34. package/dist/commands/init.js +7 -1
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/ls.d.ts.map +1 -1
  37. package/dist/commands/ls.js +7 -0
  38. package/dist/commands/ls.js.map +1 -0
  39. package/dist/commands/overview.d.ts.map +1 -1
  40. package/dist/commands/overview.js +1 -0
  41. package/dist/commands/overview.js.map +1 -0
  42. package/dist/commands/query.d.ts.map +1 -1
  43. package/dist/commands/query.js +68 -1
  44. package/dist/commands/query.js.map +1 -0
  45. package/dist/commands/schema.js +1 -0
  46. package/dist/commands/schema.js.map +1 -0
  47. package/dist/commands/server.d.ts +2 -1
  48. package/dist/commands/server.d.ts.map +1 -1
  49. package/dist/commands/server.js +128 -15
  50. package/dist/commands/server.js.map +1 -0
  51. package/dist/commands/stats.js +1 -0
  52. package/dist/commands/stats.js.map +1 -0
  53. package/dist/commands/trace.js +1 -0
  54. package/dist/commands/trace.js.map +1 -0
  55. package/dist/commands/types.js +1 -0
  56. package/dist/commands/types.js.map +1 -0
  57. package/dist/utils/codePreview.js +1 -0
  58. package/dist/utils/codePreview.js.map +1 -0
  59. package/dist/utils/errorFormatter.js +1 -0
  60. package/dist/utils/errorFormatter.js.map +1 -0
  61. package/dist/utils/formatNode.js +1 -0
  62. package/dist/utils/formatNode.js.map +1 -0
  63. package/dist/utils/progressRenderer.d.ts +119 -0
  64. package/dist/utils/progressRenderer.d.ts.map +1 -0
  65. package/dist/utils/progressRenderer.js +245 -0
  66. package/dist/utils/progressRenderer.js.map +1 -0
  67. package/dist/utils/spinner.d.ts +39 -0
  68. package/dist/utils/spinner.d.ts.map +1 -0
  69. package/dist/utils/spinner.js +84 -0
  70. package/dist/utils/spinner.js.map +1 -0
  71. package/package.json +5 -4
  72. package/src/commands/analyze.ts +150 -55
  73. package/src/commands/check.ts +36 -68
  74. package/src/commands/doctor/checks.ts +8 -5
  75. package/src/commands/explore.tsx +8 -4
  76. package/src/commands/get.ts +8 -0
  77. package/src/commands/impact.ts +1 -1
  78. package/src/commands/init.ts +6 -2
  79. package/src/commands/ls.ts +8 -0
  80. package/src/commands/overview.ts +0 -4
  81. package/src/commands/query.ts +77 -1
  82. package/src/commands/server.ts +142 -16
  83. package/src/utils/progressRenderer.ts +288 -0
  84. package/src/utils/spinner.ts +94 -0
package/README.md ADDED
@@ -0,0 +1,73 @@
1
+ # @grafema/cli
2
+
3
+ > Grafema command-line interface for building and querying the code graph.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npx @grafema/cli init
9
+ npx @grafema/cli analyze
10
+ npx @grafema/cli overview
11
+ ```
12
+
13
+ ## Commands
14
+
15
+ ### Project setup
16
+
17
+ ```bash
18
+ npx @grafema/cli init # Create .grafema/config.yaml
19
+ npx @grafema/cli analyze # Build the graph
20
+ npx @grafema/cli overview # Summary of nodes/edges found
21
+ npx @grafema/cli schema # List node and edge types
22
+ npx @grafema/cli types # List available node types
23
+ ```
24
+
25
+ ### Querying the graph
26
+
27
+ ```bash
28
+ npx @grafema/cli query "auth" # Name search (partial match)
29
+ npx @grafema/cli query "function login" # Type + name
30
+ npx @grafema/cli query "route /api" # Route search
31
+ npx @grafema/cli query "token in authenticate" # Scope filtering
32
+ npx @grafema/cli query --type http:request "/api" # Exact type
33
+ npx @grafema/cli query --raw 'type(X, "FUNCTION")'
34
+ ```
35
+
36
+ ### Data flow tracing
37
+
38
+ ```bash
39
+ npx @grafema/cli trace "userId" # Trace variable sources/sinks
40
+ npx @grafema/cli trace "userId from authenticate" # Scoped trace
41
+ npx @grafema/cli trace --to "addNode#0.type" # Sink-based trace
42
+ npx @grafema/cli trace --from-route "GET /status" # Route response trace
43
+ ```
44
+
45
+ ### Navigation helpers
46
+
47
+ ```bash
48
+ npx @grafema/cli ls --type FUNCTION # List nodes by type
49
+ npx @grafema/cli get <semantic-id> # Get a single node by ID
50
+ npx @grafema/cli explain <node-id> # Explain a node (summary)
51
+ ```
52
+
53
+ ### Checks & diagnostics
54
+
55
+ ```bash
56
+ npx @grafema/cli check # Run all guarantees
57
+ npx @grafema/cli check dataflow # Run a diagnostic category
58
+ npx @grafema/cli check --list-categories
59
+ npx @grafema/cli doctor # Validate local setup
60
+ ```
61
+
62
+ ### Misc
63
+
64
+ ```bash
65
+ npx @grafema/cli coverage # Coverage stats
66
+ npx @grafema/cli impact # Impact analysis
67
+ npx @grafema/cli explore # Interactive explorer (TUI)
68
+ ```
69
+
70
+ ## Notes
71
+
72
+ - All commands accept `--project <path>` to point at a specific repo.
73
+ - `npx @grafema/cli` works without global install and is preferred for docs/examples.
package/dist/cli.js CHANGED
@@ -50,3 +50,4 @@ program.addCommand(doctorCommand);
50
50
  program.addCommand(schemaCommand);
51
51
  program.addCommand(explainCommand);
52
52
  program.parse();
53
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,14 @@
2
2
  * Analyze command - Run project analysis via Orchestrator
3
3
  */
4
4
  import { Command } from 'commander';
5
+ export interface NodeEdgeCountBackend {
6
+ nodeCount: () => Promise<number>;
7
+ edgeCount: () => Promise<number>;
8
+ }
9
+ export declare function fetchNodeEdgeCounts(backend: NodeEdgeCountBackend): Promise<{
10
+ nodeCount: number;
11
+ edgeCount: number;
12
+ }>;
13
+ export declare function exitWithCode(code: number, exitFn?: (code: number) => void): void;
5
14
  export declare const analyzeCommand: Command;
6
15
  //# sourceMappingURL=analyze.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgLpC,eAAO,MAAM,cAAc,SAgMvB,CAAC"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAG1H;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAmB,GAAG,IAAI,CAE9F;AAyID,eAAO,MAAM,cAAc,SA+PvB,CAAC"}
@@ -5,7 +5,7 @@ import { Command } from 'commander';
5
5
  import { resolve, join } from 'path';
6
6
  import { existsSync, mkdirSync, readdirSync } from 'fs';
7
7
  import { pathToFileURL } from 'url';
8
- import { Orchestrator, RFDBServerBackend, DiagnosticReporter, DiagnosticWriter, createLogger, loadConfig,
8
+ import { Orchestrator, RFDBServerBackend, DiagnosticReporter, DiagnosticWriter, createLogger, loadConfig, StrictModeFailure,
9
9
  // Discovery
10
10
  SimpleProjectDiscovery, MonorepoServiceDiscovery, WorkspaceDiscovery,
11
11
  // Indexing
@@ -13,9 +13,17 @@ JSModuleIndexer, RustModuleIndexer,
13
13
  // Analysis
14
14
  JSASTAnalyzer, ExpressRouteAnalyzer, ExpressResponseAnalyzer, SocketIOAnalyzer, DatabaseAnalyzer, FetchAnalyzer, ServiceLayerAnalyzer, ReactAnalyzer, RustAnalyzer,
15
15
  // Enrichment
16
- MethodCallResolver, ArgumentParameterLinker, AliasTracker, ValueDomainAnalyzer, MountPointResolver, PrefixEvaluator, InstanceOfResolver, ImportExportLinker, FunctionCallResolver, HTTPConnectionEnricher, RustFFIEnricher,
16
+ MethodCallResolver, ArgumentParameterLinker, AliasTracker, ValueDomainAnalyzer, MountPointResolver, ExpressHandlerLinker, PrefixEvaluator, InstanceOfResolver, ImportExportLinker, FunctionCallResolver, HTTPConnectionEnricher, RustFFIEnricher, RejectionPropagationEnricher,
17
17
  // Validation
18
18
  CallResolverValidator, EvalBanValidator, SQLInjectionValidator, ShadowingDetector, GraphConnectivityValidator, DataFlowValidator, TypeScriptDeadCodeValidator, BrokenImportValidator, } from '@grafema/core';
19
+ import { ProgressRenderer } from '../utils/progressRenderer.js';
20
+ export async function fetchNodeEdgeCounts(backend) {
21
+ const [nodeCount, edgeCount] = await Promise.all([backend.nodeCount(), backend.edgeCount()]);
22
+ return { nodeCount, edgeCount };
23
+ }
24
+ export function exitWithCode(code, exitFn = process.exit) {
25
+ exitFn(code);
26
+ }
19
27
  const BUILTIN_PLUGINS = {
20
28
  // Discovery
21
29
  SimpleProjectDiscovery: () => new SimpleProjectDiscovery(),
@@ -40,12 +48,14 @@ const BUILTIN_PLUGINS = {
40
48
  AliasTracker: () => new AliasTracker(),
41
49
  ValueDomainAnalyzer: () => new ValueDomainAnalyzer(),
42
50
  MountPointResolver: () => new MountPointResolver(),
51
+ ExpressHandlerLinker: () => new ExpressHandlerLinker(),
43
52
  PrefixEvaluator: () => new PrefixEvaluator(),
44
53
  InstanceOfResolver: () => new InstanceOfResolver(),
45
54
  ImportExportLinker: () => new ImportExportLinker(),
46
55
  FunctionCallResolver: () => new FunctionCallResolver(),
47
56
  HTTPConnectionEnricher: () => new HTTPConnectionEnricher(),
48
57
  RustFFIEnricher: () => new RustFFIEnricher(),
58
+ RejectionPropagationEnricher: () => new RejectionPropagationEnricher(),
49
59
  // Validation
50
60
  CallResolverValidator: () => new CallResolverValidator(),
51
61
  EvalBanValidator: () => new EvalBanValidator(),
@@ -66,30 +76,36 @@ async function loadCustomPlugins(projectPath, log) {
66
76
  }
67
77
  const customPlugins = {};
68
78
  try {
69
- const files = readdirSync(pluginsDir).filter((f) => f.endsWith('.js') || f.endsWith('.mjs'));
79
+ const files = readdirSync(pluginsDir).filter((f) => f.endsWith('.js') || f.endsWith('.mjs') || f.endsWith('.cjs'));
70
80
  for (const file of files) {
71
81
  try {
72
82
  const pluginPath = join(pluginsDir, file);
73
83
  const pluginUrl = pathToFileURL(pluginPath).href;
74
84
  const module = await import(pluginUrl);
75
- const PluginClass = module.default || module[file.replace(/\.(m?js)$/, '')];
85
+ const PluginClass = module.default || module[file.replace(/\.[cm]?js$/, '')];
76
86
  if (PluginClass && typeof PluginClass === 'function') {
77
- const pluginName = PluginClass.name || file.replace(/\.(m?js)$/, '');
78
- customPlugins[pluginName] = () => new PluginClass();
87
+ const pluginName = PluginClass.name || file.replace(/\.[cm]?js$/, '');
88
+ customPlugins[pluginName] = () => {
89
+ const instance = new PluginClass();
90
+ instance.config.sourceFile = pluginPath;
91
+ return instance;
92
+ };
79
93
  log(`Loaded custom plugin: ${pluginName}`);
80
94
  }
81
95
  }
82
96
  catch (err) {
83
- console.warn(`Failed to load plugin ${file}: ${err.message}`);
97
+ const message = err instanceof Error ? err.message : String(err);
98
+ console.warn(`Failed to load plugin ${file}: ${message}`);
84
99
  }
85
100
  }
86
101
  }
87
102
  catch (err) {
88
- console.warn(`Error loading custom plugins: ${err.message}`);
103
+ const message = err instanceof Error ? err.message : String(err);
104
+ console.warn(`Error loading custom plugins: ${message}`);
89
105
  }
90
106
  return customPlugins;
91
107
  }
92
- function createPlugins(config, customPlugins = {}) {
108
+ function createPlugins(config, customPlugins = {}, verbose = false) {
93
109
  const plugins = [];
94
110
  const phases = ['discovery', 'indexing', 'analysis', 'enrichment', 'validation'];
95
111
  for (const phase of phases) {
@@ -100,8 +116,9 @@ function createPlugins(config, customPlugins = {}) {
100
116
  if (factory) {
101
117
  plugins.push(factory());
102
118
  }
103
- else {
104
- console.warn(`Unknown plugin: ${name}`);
119
+ else if (verbose) {
120
+ // Only show plugin warning in verbose mode
121
+ console.warn(`Plugin not found: ${name} (skipping). Check .grafema/config.yaml or add to .grafema/plugins/`);
105
122
  }
106
123
  }
107
124
  }
@@ -109,7 +126,10 @@ function createPlugins(config, customPlugins = {}) {
109
126
  }
110
127
  /**
111
128
  * Determine log level from CLI options.
112
- * Priority: --log-level > --quiet > --verbose > default ('info')
129
+ * Priority: --log-level > --quiet > --verbose > default ('silent')
130
+ *
131
+ * By default, logs are silent to allow clean progress UI.
132
+ * Use --verbose to see detailed logs (disables interactive progress).
113
133
  */
114
134
  function getLogLevel(options) {
115
135
  if (options.logLevel) {
@@ -121,8 +141,8 @@ function getLogLevel(options) {
121
141
  if (options.quiet)
122
142
  return 'silent';
123
143
  if (options.verbose)
124
- return 'debug';
125
- return 'info';
144
+ return 'info'; // --verbose shows logs instead of progress UI
145
+ return 'silent'; // Default: silent logs, clean progress UI
126
146
  }
127
147
  export const analyzeCommand = new Command('analyze')
128
148
  .description('Run project analysis')
@@ -134,6 +154,7 @@ export const analyzeCommand = new Command('analyze')
134
154
  .option('-v, --verbose', 'Show verbose logging')
135
155
  .option('--debug', 'Enable debug mode (writes diagnostics.log)')
136
156
  .option('--log-level <level>', 'Set log level (silent, errors, warnings, info, debug)')
157
+ .option('--log-file <path>', 'Write all log output to a file')
137
158
  .option('--strict', 'Enable strict mode (fail on unresolved references)')
138
159
  .option('--auto-start', 'Auto-start RFDB server if not running')
139
160
  .addHelpText('after', `
@@ -144,6 +165,7 @@ Examples:
144
165
  grafema analyze -s api Analyze only "api" service (monorepo)
145
166
  grafema analyze -v Verbose output with progress details
146
167
  grafema analyze --debug Write diagnostics.log for debugging
168
+ grafema analyze --log-file out.log Write all logs to a file
147
169
  grafema analyze --strict Fail on unresolved references (debugging)
148
170
  grafema analyze --auto-start Auto-start server (useful for CI)
149
171
 
@@ -156,17 +178,27 @@ Note: Start the server first with: grafema server start
156
178
  if (!existsSync(grafemaDir)) {
157
179
  mkdirSync(grafemaDir, { recursive: true });
158
180
  }
159
- const log = options.quiet ? () => { } : console.log;
181
+ // Two log levels for CLI output:
182
+ // - info: important results (shows unless --quiet)
183
+ // - debug: verbose details (shows only with --verbose)
184
+ const info = options.quiet ? () => { } : console.log;
185
+ const debug = options.verbose ? console.log : () => { };
160
186
  // Create logger based on CLI flags
161
187
  const logLevel = getLogLevel(options);
162
- const logger = createLogger(logLevel);
163
- log(`Analyzing project: ${projectPath}`);
188
+ const logFile = options.logFile ? resolve(options.logFile) : undefined;
189
+ const logger = createLogger(logLevel, logFile ? { logFile } : undefined);
190
+ if (logFile) {
191
+ debug(`Log file: ${logFile}`);
192
+ }
193
+ debug(`Analyzing project: ${projectPath}`);
164
194
  // Connect to RFDB server
165
195
  // Default: require explicit `grafema server start`
166
196
  // Use --auto-start for CI or backwards compatibility
197
+ // In normal mode (not verbose), suppress backend logs for clean progress UI
167
198
  const backend = new RFDBServerBackend({
168
199
  dbPath,
169
- autoStart: options.autoStart ?? false
200
+ autoStart: options.autoStart ?? false,
201
+ silent: !options.verbose // Silent in normal mode (show progress), verbose shows logs
170
202
  });
171
203
  try {
172
204
  await backend.connect();
@@ -187,28 +219,51 @@ Note: Start the server first with: grafema server start
187
219
  throw err;
188
220
  }
189
221
  if (options.clear) {
190
- log('Clearing existing database...');
222
+ debug('Clearing existing database...');
191
223
  await backend.clear();
192
224
  }
193
225
  const config = loadConfig(projectPath, logger);
194
226
  // Extract services from config (REG-174)
195
227
  if (config.services.length > 0) {
196
- log(`Loaded ${config.services.length} service(s) from config`);
228
+ debug(`Loaded ${config.services.length} service(s) from config`);
197
229
  for (const svc of config.services) {
198
230
  const entry = svc.entryPoint ? ` (entry: ${svc.entryPoint})` : '';
199
- log(` - ${svc.name}: ${svc.path}${entry}`);
231
+ debug(` - ${svc.name}: ${svc.path}${entry}`);
200
232
  }
201
233
  }
202
234
  // Load custom plugins from .grafema/plugins/
203
- const customPlugins = await loadCustomPlugins(projectPath, log);
204
- const plugins = createPlugins(config.plugins, customPlugins);
205
- log(`Loaded ${plugins.length} plugins`);
235
+ const customPlugins = await loadCustomPlugins(projectPath, debug);
236
+ const plugins = createPlugins(config.plugins, customPlugins, options.verbose);
237
+ debug(`Loaded ${plugins.length} plugins`);
206
238
  // Resolve strict mode: CLI flag overrides config
207
239
  const strictMode = options.strict ?? config.strict ?? false;
208
240
  if (strictMode) {
209
- log('Strict mode enabled - analysis will fail on unresolved references');
241
+ debug('Strict mode enabled - analysis will fail on unresolved references');
210
242
  }
211
243
  const startTime = Date.now();
244
+ // Create progress renderer for CLI output
245
+ // In quiet mode, use a no-op renderer (skip rendering)
246
+ // In verbose mode, use non-interactive (newlines per update)
247
+ // In normal mode, use interactive (spinner with line overwrite)
248
+ const renderer = options.quiet
249
+ ? null
250
+ : new ProgressRenderer({
251
+ isInteractive: !options.verbose && process.stdout.isTTY,
252
+ });
253
+ // Poll graph stats periodically to show node/edge counts in progress
254
+ let statsInterval = null;
255
+ if (renderer && !options.quiet) {
256
+ statsInterval = setInterval(async () => {
257
+ try {
258
+ const stats = await fetchNodeEdgeCounts(backend);
259
+ renderer.setStats(stats.nodeCount, stats.edgeCount);
260
+ }
261
+ catch {
262
+ // Ignore stats errors during analysis
263
+ }
264
+ }, 500); // Poll every 500ms
265
+ statsInterval.unref?.();
266
+ }
212
267
  const orchestrator = new Orchestrator({
213
268
  graph: backend,
214
269
  plugins,
@@ -219,39 +274,41 @@ Note: Start the server first with: grafema server start
219
274
  services: config.services.length > 0 ? config.services : undefined, // Pass config services (REG-174)
220
275
  strictMode, // REG-330: Pass strict mode flag
221
276
  onProgress: (progress) => {
222
- if (options.verbose) {
223
- log(`[${progress.phase}] ${progress.message}`);
224
- }
277
+ renderer?.update(progress);
225
278
  },
226
279
  });
227
280
  let exitCode = 0;
228
281
  try {
229
282
  await orchestrator.run(projectPath);
230
283
  await backend.flush();
231
- const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
232
- const stats = await backend.getStats();
233
- log('');
234
- log(`Analysis complete in ${elapsed}s`);
235
- log(` Nodes: ${stats.nodeCount}`);
236
- log(` Edges: ${stats.edgeCount}`);
284
+ const elapsedSeconds = (Date.now() - startTime) / 1000;
285
+ const stats = await fetchNodeEdgeCounts(backend);
286
+ // Clear progress line in interactive mode, then show results
287
+ if (renderer && process.stdout.isTTY) {
288
+ process.stdout.write('\r\x1b[K'); // Clear line
289
+ }
290
+ info('');
291
+ info(renderer ? renderer.finish(elapsedSeconds) : `Analysis complete in ${elapsedSeconds.toFixed(2)}s`);
292
+ info(` Nodes: ${stats.nodeCount}`);
293
+ info(` Edges: ${stats.edgeCount}`);
237
294
  // Get diagnostics and report summary
238
295
  const diagnostics = orchestrator.getDiagnostics();
239
296
  const reporter = new DiagnosticReporter(diagnostics);
240
297
  // Print summary if there are any issues
241
298
  if (diagnostics.count() > 0) {
242
- log('');
243
- log(reporter.categorizedSummary());
299
+ info('');
300
+ info(reporter.categorizedSummary());
244
301
  // In verbose mode, print full report
245
302
  if (options.verbose) {
246
- log('');
247
- log(reporter.report({ format: 'text', includeSummary: false }));
303
+ debug('');
304
+ debug(reporter.report({ format: 'text', includeSummary: false }));
248
305
  }
249
306
  }
250
307
  // Always write diagnostics.log (required for `grafema check` command)
251
308
  const writer = new DiagnosticWriter();
252
309
  await writer.write(diagnostics, grafemaDir);
253
310
  if (options.debug) {
254
- log(`Diagnostics written to ${writer.getLogPath(grafemaDir)}`);
311
+ debug(`Diagnostics written to ${writer.getLogPath(grafemaDir)}`);
255
312
  }
256
313
  // Determine exit code based on severity
257
314
  if (diagnostics.hasFatal()) {
@@ -265,17 +322,36 @@ Note: Start the server first with: grafema server start
265
322
  }
266
323
  }
267
324
  catch (e) {
268
- // Orchestrator threw (fatal error stopped analysis)
269
- const error = e instanceof Error ? e : new Error(String(e));
270
325
  const diagnostics = orchestrator.getDiagnostics();
271
326
  const reporter = new DiagnosticReporter(diagnostics);
272
- console.error('');
273
- console.error(`✗ Analysis failed: ${error.message}`);
274
- console.error('');
275
- console.error('→ Run with --debug for detailed diagnostics');
276
- if (diagnostics.count() > 0) {
327
+ // Clear progress line in interactive mode
328
+ if (renderer && process.stdout.isTTY) {
329
+ process.stdout.write('\r\x1b[K');
330
+ }
331
+ // Check if this is a strict mode failure (REG-332: structured output)
332
+ if (e instanceof StrictModeFailure) {
333
+ // Format ONLY from diagnostics, not from error.message
334
+ console.error('');
335
+ console.error(`✗ Strict mode: ${e.count} unresolved reference(s) found during ENRICHMENT.`);
336
+ console.error('');
337
+ console.error(reporter.formatStrict(e.diagnostics, {
338
+ verbose: options.verbose,
339
+ suppressedCount: e.suppressedCount, // REG-332
340
+ }));
341
+ console.error('');
342
+ console.error('Run without --strict for graceful degradation, or fix the underlying issues.');
343
+ }
344
+ else {
345
+ // Generic error handling (non-strict)
346
+ const error = e instanceof Error ? e : new Error(String(e));
347
+ console.error('');
348
+ console.error(`✗ Analysis failed: ${error.message}`);
277
349
  console.error('');
278
- console.error(reporter.report({ format: 'text', includeSummary: true }));
350
+ console.error('→ Run with --debug for detailed diagnostics');
351
+ if (diagnostics.count() > 0) {
352
+ console.error('');
353
+ console.error(reporter.report({ format: 'text', includeSummary: true }));
354
+ }
279
355
  }
280
356
  // Write diagnostics.log in debug mode even on failure
281
357
  if (options.debug) {
@@ -285,10 +361,18 @@ Note: Start the server first with: grafema server start
285
361
  }
286
362
  exitCode = 1;
287
363
  }
288
- await backend.close();
289
- // Exit with appropriate code
290
- // 0 = success, 1 = fatal, 2 = errors
291
- if (exitCode !== 0) {
292
- process.exit(exitCode);
364
+ finally {
365
+ // Stop stats polling
366
+ if (statsInterval) {
367
+ clearInterval(statsInterval);
368
+ statsInterval = null;
369
+ }
370
+ if (backend.connected) {
371
+ await backend.close();
372
+ }
373
+ // Exit with appropriate code
374
+ // 0 = success, 1 = fatal, 2 = errors
375
+ exitWithCode(exitCode);
293
376
  }
294
377
  });
378
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,7 @@
6
6
  * 2. Built-in validators: --guarantee=<name> (e.g., --guarantee=node-creation)
7
7
  */
8
8
  import { Command } from 'commander';
9
- export interface DiagnosticCheckCategory {
10
- name: string;
11
- description: string;
12
- codes: string[];
13
- }
14
- export declare const CHECK_CATEGORIES: Record<string, DiagnosticCheckCategory>;
9
+ import { DIAGNOSTIC_CATEGORIES } from '@grafema/core';
10
+ export { DIAGNOSTIC_CATEGORIES as CHECK_CATEGORIES };
15
11
  export declare const checkCommand: Command;
16
12
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiCpC,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAGD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAqBpE,CAAC;AAEF,eAAO,MAAM,YAAY,SA2OtB,CAAC"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAKL,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAiBvB,OAAO,EAAE,qBAAqB,IAAI,gBAAgB,EAAE,CAAC;AAErD,eAAO,MAAM,YAAY,SA2OtB,CAAC"}