@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.
- package/README.md +73 -0
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/analyze.d.ts +9 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +136 -52
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/check.d.ts +2 -6
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +32 -46
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/coverage.js +1 -0
- package/dist/commands/coverage.js.map +1 -0
- package/dist/commands/doctor/checks.d.ts.map +1 -1
- package/dist/commands/doctor/checks.js +9 -5
- package/dist/commands/doctor/checks.js.map +1 -0
- package/dist/commands/doctor/output.js +1 -0
- package/dist/commands/doctor/output.js.map +1 -0
- package/dist/commands/doctor/types.js +1 -0
- package/dist/commands/doctor/types.js.map +1 -0
- package/dist/commands/doctor.js +1 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.js +1 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/explore.d.ts.map +1 -1
- package/dist/commands/explore.js +9 -4
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +7 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/impact.js +1 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +7 -1
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/ls.d.ts.map +1 -1
- package/dist/commands/ls.js +7 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/overview.d.ts.map +1 -1
- package/dist/commands/overview.js +1 -0
- package/dist/commands/overview.js.map +1 -0
- package/dist/commands/query.d.ts.map +1 -1
- package/dist/commands/query.js +68 -1
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/schema.js +1 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/server.d.ts +2 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +128 -15
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/stats.js +1 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/trace.js +1 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/types.js +1 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/utils/codePreview.js +1 -0
- package/dist/utils/codePreview.js.map +1 -0
- package/dist/utils/errorFormatter.js +1 -0
- package/dist/utils/errorFormatter.js.map +1 -0
- package/dist/utils/formatNode.js +1 -0
- package/dist/utils/formatNode.js.map +1 -0
- package/dist/utils/progressRenderer.d.ts +119 -0
- package/dist/utils/progressRenderer.d.ts.map +1 -0
- package/dist/utils/progressRenderer.js +245 -0
- package/dist/utils/progressRenderer.js.map +1 -0
- package/dist/utils/spinner.d.ts +39 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +84 -0
- package/dist/utils/spinner.js.map +1 -0
- package/package.json +5 -4
- package/src/commands/analyze.ts +150 -55
- package/src/commands/check.ts +36 -68
- package/src/commands/doctor/checks.ts +8 -5
- package/src/commands/explore.tsx +8 -4
- package/src/commands/get.ts +8 -0
- package/src/commands/impact.ts +1 -1
- package/src/commands/init.ts +6 -2
- package/src/commands/ls.ts +8 -0
- package/src/commands/overview.ts +0 -4
- package/src/commands/query.ts +77 -1
- package/src/commands/server.ts +142 -16
- package/src/utils/progressRenderer.ts +288 -0
- 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
package/dist/cli.js.map
ADDED
|
@@ -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;
|
|
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"}
|
package/dist/commands/analyze.js
CHANGED
|
@@ -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(/\.
|
|
85
|
+
const PluginClass = module.default || module[file.replace(/\.[cm]?js$/, '')];
|
|
76
86
|
if (PluginClass && typeof PluginClass === 'function') {
|
|
77
|
-
const pluginName = PluginClass.name || file.replace(/\.
|
|
78
|
-
customPlugins[pluginName] = () =>
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ('
|
|
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 '
|
|
125
|
-
return '
|
|
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
|
-
|
|
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
|
|
163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
204
|
-
const plugins = createPlugins(config.plugins, customPlugins);
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
232
|
-
const stats = await backend
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
243
|
-
|
|
299
|
+
info('');
|
|
300
|
+
info(reporter.categorizedSummary());
|
|
244
301
|
// In verbose mode, print full report
|
|
245
302
|
if (options.verbose) {
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
if (
|
|
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(
|
|
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
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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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"}
|
package/dist/commands/check.d.ts
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
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;
|
|
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"}
|