@grafema/cli 0.3.8-beta → 0.3.10-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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeAction.d.ts","sourceRoot":"","sources":["../../src/commands/analyzeAction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"analyzeAction.d.ts","sourceRoot":"","sources":["../../src/commands/analyzeAction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,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;AAgHD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+JrQ"}
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* the correct args, streams output, and prints a summary.
|
|
8
8
|
*/
|
|
9
9
|
import { resolve, join } from 'path';
|
|
10
|
-
import { existsSync, mkdirSync } from 'fs';
|
|
10
|
+
import { existsSync, mkdirSync, readFileSync } from 'fs';
|
|
11
11
|
import { spawn } from 'child_process';
|
|
12
|
-
import { RFDBServerBackend, createLogger, findOrchestratorBinary, getBinaryNotFoundMessage, findAnalyzerBinary, ensureBinary, } from '@grafema/util';
|
|
12
|
+
import { RFDBServerBackend, createLogger, findOrchestratorBinary, getBinaryNotFoundMessage, findAnalyzerBinary, findInGrafemaBin, ensureBinary, } from '@grafema/util';
|
|
13
13
|
export async function fetchNodeEdgeCounts(backend) {
|
|
14
14
|
const [nodeCount, edgeCount] = await Promise.all([backend.nodeCount(), backend.edgeCount()]);
|
|
15
15
|
return { nodeCount, edgeCount };
|
|
@@ -56,6 +56,72 @@ function findConfigFile(projectPath) {
|
|
|
56
56
|
}
|
|
57
57
|
return null;
|
|
58
58
|
}
|
|
59
|
+
/** Map of file extensions to required analyzer binaries. */
|
|
60
|
+
const EXT_TO_BINARIES = {
|
|
61
|
+
// JS/TS — always needed (core)
|
|
62
|
+
js: ['grafema-analyzer', 'grafema-resolve'],
|
|
63
|
+
ts: ['grafema-analyzer', 'grafema-resolve'],
|
|
64
|
+
jsx: ['grafema-analyzer', 'grafema-resolve'],
|
|
65
|
+
tsx: ['grafema-analyzer', 'grafema-resolve'],
|
|
66
|
+
mjs: ['grafema-analyzer', 'grafema-resolve'],
|
|
67
|
+
cjs: ['grafema-analyzer', 'grafema-resolve'],
|
|
68
|
+
// Python
|
|
69
|
+
py: ['grafema-python-analyzer', 'python-resolve'],
|
|
70
|
+
pyi: ['grafema-python-analyzer', 'python-resolve'],
|
|
71
|
+
// Haskell
|
|
72
|
+
hs: ['haskell-analyzer', 'haskell-resolve'],
|
|
73
|
+
// Rust
|
|
74
|
+
rs: ['grafema-rust-analyzer', 'grafema-rust-resolve'],
|
|
75
|
+
// Java
|
|
76
|
+
java: ['grafema-java-analyzer', 'java-resolve', 'java-parser'],
|
|
77
|
+
// Kotlin
|
|
78
|
+
kt: ['grafema-kotlin-analyzer', 'kotlin-resolve', 'kotlin-parser'],
|
|
79
|
+
kts: ['grafema-kotlin-analyzer', 'kotlin-resolve', 'kotlin-parser'],
|
|
80
|
+
// Go
|
|
81
|
+
go: ['grafema-go-analyzer', 'go-resolve', 'go-parser'],
|
|
82
|
+
// C/C++
|
|
83
|
+
c: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
84
|
+
cpp: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
85
|
+
h: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
86
|
+
hpp: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
87
|
+
// Swift
|
|
88
|
+
swift: ['grafema-swift-analyzer', 'swift-resolve', 'swift-parser'],
|
|
89
|
+
// Obj-C
|
|
90
|
+
m: ['grafema-objc-analyzer', 'objc-parser'],
|
|
91
|
+
mm: ['grafema-objc-analyzer', 'objc-parser'],
|
|
92
|
+
// BEAM (Elixir/Erlang)
|
|
93
|
+
ex: ['beam-analyzer', 'beam-resolve'],
|
|
94
|
+
exs: ['beam-analyzer', 'beam-resolve'],
|
|
95
|
+
erl: ['beam-analyzer', 'beam-resolve'],
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Detect languages from config include patterns and ensure their analyzer binaries exist.
|
|
99
|
+
* Reads the config file as text, extracts file extensions from include globs,
|
|
100
|
+
* and pre-downloads missing binaries before the orchestrator needs them.
|
|
101
|
+
*/
|
|
102
|
+
async function ensureLanguageBinaries(configPath, log) {
|
|
103
|
+
const configText = readFileSync(configPath, 'utf-8');
|
|
104
|
+
// Extract extensions from include patterns like "**/*.py", '**/*.ts', etc.
|
|
105
|
+
const neededBinaries = new Set();
|
|
106
|
+
for (const match of configText.matchAll(/\*\.(\w+)/g)) {
|
|
107
|
+
const ext = match[1];
|
|
108
|
+
const bins = EXT_TO_BINARIES[ext];
|
|
109
|
+
if (bins)
|
|
110
|
+
bins.forEach(b => neededBinaries.add(b));
|
|
111
|
+
}
|
|
112
|
+
// Always ensure JS/TS binaries (most common, default language)
|
|
113
|
+
for (const b of ['grafema-analyzer', 'grafema-resolve']) {
|
|
114
|
+
neededBinaries.add(b);
|
|
115
|
+
}
|
|
116
|
+
for (const binName of neededBinaries) {
|
|
117
|
+
if (findAnalyzerBinary(binName) || findInGrafemaBin(binName))
|
|
118
|
+
continue;
|
|
119
|
+
const downloaded = await ensureBinary(binName, null, log);
|
|
120
|
+
if (downloaded) {
|
|
121
|
+
log(`Downloaded ${binName} → ${downloaded}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
59
125
|
export async function analyzeAction(path, options) {
|
|
60
126
|
const projectPath = resolve(path);
|
|
61
127
|
const grafemaDir = join(projectPath, '.grafema');
|
|
@@ -91,16 +157,6 @@ export async function analyzeAction(path, options) {
|
|
|
91
157
|
process.exit(1);
|
|
92
158
|
}
|
|
93
159
|
debug(`Using orchestrator: ${orchestratorBinary}`);
|
|
94
|
-
// Ensure JS/TS analyzer binaries exist (lazy download if missing)
|
|
95
|
-
for (const binName of ['grafema-analyzer', 'grafema-resolve']) {
|
|
96
|
-
const existing = findAnalyzerBinary(binName);
|
|
97
|
-
if (!existing) {
|
|
98
|
-
const downloaded = await ensureBinary(binName, null, info);
|
|
99
|
-
if (downloaded) {
|
|
100
|
-
debug(`Downloaded ${binName} → ${downloaded}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
160
|
// Find config file for the orchestrator
|
|
105
161
|
const configPath = findConfigFile(projectPath);
|
|
106
162
|
if (!configPath) {
|
|
@@ -119,6 +175,8 @@ export async function analyzeAction(path, options) {
|
|
|
119
175
|
process.exit(1);
|
|
120
176
|
}
|
|
121
177
|
debug(`Using config: ${configPath}`);
|
|
178
|
+
// Ensure analyzer binaries exist for detected languages (lazy download if missing)
|
|
179
|
+
await ensureLanguageBinaries(configPath, debug);
|
|
122
180
|
// Connect to RFDB server — auto-start by default (zero-config UX)
|
|
123
181
|
const backend = new RFDBServerBackend({
|
|
124
182
|
dbPath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzeAction.js","sourceRoot":"","sources":["../../src/commands/analyzeAction.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzeAction.js","sourceRoot":"","sources":["../../src/commands/analyzeAction.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafema/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.10-beta",
|
|
4
4
|
"description": "CLI for Grafema code analysis toolkit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cli.js",
|
|
@@ -35,9 +35,9 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"commander": "^13.0.0",
|
|
37
37
|
"yaml": "^2.8.2",
|
|
38
|
-
"@grafema/
|
|
39
|
-
"@grafema/
|
|
40
|
-
"@grafema/
|
|
38
|
+
"@grafema/api": "0.3.10-beta",
|
|
39
|
+
"@grafema/util": "0.3.10-beta",
|
|
40
|
+
"@grafema/types": "0.3.10-beta"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^25.0.8",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { resolve, join } from 'path';
|
|
11
|
-
import { existsSync, mkdirSync } from 'fs';
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync } from 'fs';
|
|
12
12
|
import { spawn } from 'child_process';
|
|
13
13
|
import {
|
|
14
14
|
RFDBServerBackend,
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
findOrchestratorBinary,
|
|
17
17
|
getBinaryNotFoundMessage,
|
|
18
18
|
findAnalyzerBinary,
|
|
19
|
+
findInGrafemaBin,
|
|
19
20
|
ensureBinary,
|
|
20
21
|
} from '@grafema/util';
|
|
21
22
|
import type { LogLevel } from '@grafema/util';
|
|
@@ -75,6 +76,75 @@ function findConfigFile(projectPath: string): string | null {
|
|
|
75
76
|
return null;
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
/** Map of file extensions to required analyzer binaries. */
|
|
80
|
+
const EXT_TO_BINARIES: Record<string, string[]> = {
|
|
81
|
+
// JS/TS — always needed (core)
|
|
82
|
+
js: ['grafema-analyzer', 'grafema-resolve'],
|
|
83
|
+
ts: ['grafema-analyzer', 'grafema-resolve'],
|
|
84
|
+
jsx: ['grafema-analyzer', 'grafema-resolve'],
|
|
85
|
+
tsx: ['grafema-analyzer', 'grafema-resolve'],
|
|
86
|
+
mjs: ['grafema-analyzer', 'grafema-resolve'],
|
|
87
|
+
cjs: ['grafema-analyzer', 'grafema-resolve'],
|
|
88
|
+
// Python
|
|
89
|
+
py: ['grafema-python-analyzer', 'python-resolve'],
|
|
90
|
+
pyi: ['grafema-python-analyzer', 'python-resolve'],
|
|
91
|
+
// Haskell
|
|
92
|
+
hs: ['haskell-analyzer', 'haskell-resolve'],
|
|
93
|
+
// Rust
|
|
94
|
+
rs: ['grafema-rust-analyzer', 'grafema-rust-resolve'],
|
|
95
|
+
// Java
|
|
96
|
+
java: ['grafema-java-analyzer', 'java-resolve', 'java-parser'],
|
|
97
|
+
// Kotlin
|
|
98
|
+
kt: ['grafema-kotlin-analyzer', 'kotlin-resolve', 'kotlin-parser'],
|
|
99
|
+
kts: ['grafema-kotlin-analyzer', 'kotlin-resolve', 'kotlin-parser'],
|
|
100
|
+
// Go
|
|
101
|
+
go: ['grafema-go-analyzer', 'go-resolve', 'go-parser'],
|
|
102
|
+
// C/C++
|
|
103
|
+
c: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
104
|
+
cpp: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
105
|
+
h: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
106
|
+
hpp: ['grafema-cpp-analyzer', 'cpp-resolve'],
|
|
107
|
+
// Swift
|
|
108
|
+
swift: ['grafema-swift-analyzer', 'swift-resolve', 'swift-parser'],
|
|
109
|
+
// Obj-C
|
|
110
|
+
m: ['grafema-objc-analyzer', 'objc-parser'],
|
|
111
|
+
mm: ['grafema-objc-analyzer', 'objc-parser'],
|
|
112
|
+
// BEAM (Elixir/Erlang)
|
|
113
|
+
ex: ['beam-analyzer', 'beam-resolve'],
|
|
114
|
+
exs: ['beam-analyzer', 'beam-resolve'],
|
|
115
|
+
erl: ['beam-analyzer', 'beam-resolve'],
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Detect languages from config include patterns and ensure their analyzer binaries exist.
|
|
120
|
+
* Reads the config file as text, extracts file extensions from include globs,
|
|
121
|
+
* and pre-downloads missing binaries before the orchestrator needs them.
|
|
122
|
+
*/
|
|
123
|
+
async function ensureLanguageBinaries(configPath: string, log: (...args: unknown[]) => void): Promise<void> {
|
|
124
|
+
const configText = readFileSync(configPath, 'utf-8');
|
|
125
|
+
|
|
126
|
+
// Extract extensions from include patterns like "**/*.py", '**/*.ts', etc.
|
|
127
|
+
const neededBinaries = new Set<string>();
|
|
128
|
+
for (const match of configText.matchAll(/\*\.(\w+)/g)) {
|
|
129
|
+
const ext = match[1];
|
|
130
|
+
const bins = EXT_TO_BINARIES[ext];
|
|
131
|
+
if (bins) bins.forEach(b => neededBinaries.add(b));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Always ensure JS/TS binaries (most common, default language)
|
|
135
|
+
for (const b of ['grafema-analyzer', 'grafema-resolve']) {
|
|
136
|
+
neededBinaries.add(b);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for (const binName of neededBinaries) {
|
|
140
|
+
if (findAnalyzerBinary(binName) || findInGrafemaBin(binName)) continue;
|
|
141
|
+
const downloaded = await ensureBinary(binName, null, log);
|
|
142
|
+
if (downloaded) {
|
|
143
|
+
log(`Downloaded ${binName} → ${downloaded}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
78
148
|
export async function analyzeAction(path: string, options: { service?: string; entrypoint?: string; clear?: boolean; quiet?: boolean; verbose?: boolean; debug?: boolean; logLevel?: string; logFile?: string; strict?: boolean; autoStart?: boolean }): Promise<void> {
|
|
79
149
|
const projectPath = resolve(path);
|
|
80
150
|
const grafemaDir = join(projectPath, '.grafema');
|
|
@@ -117,17 +187,6 @@ export async function analyzeAction(path: string, options: { service?: string; e
|
|
|
117
187
|
|
|
118
188
|
debug(`Using orchestrator: ${orchestratorBinary}`);
|
|
119
189
|
|
|
120
|
-
// Ensure JS/TS analyzer binaries exist (lazy download if missing)
|
|
121
|
-
for (const binName of ['grafema-analyzer', 'grafema-resolve']) {
|
|
122
|
-
const existing = findAnalyzerBinary(binName);
|
|
123
|
-
if (!existing) {
|
|
124
|
-
const downloaded = await ensureBinary(binName, null, info);
|
|
125
|
-
if (downloaded) {
|
|
126
|
-
debug(`Downloaded ${binName} → ${downloaded}`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
190
|
// Find config file for the orchestrator
|
|
132
191
|
const configPath = findConfigFile(projectPath);
|
|
133
192
|
if (!configPath) {
|
|
@@ -148,6 +207,9 @@ export async function analyzeAction(path: string, options: { service?: string; e
|
|
|
148
207
|
|
|
149
208
|
debug(`Using config: ${configPath}`);
|
|
150
209
|
|
|
210
|
+
// Ensure analyzer binaries exist for detected languages (lazy download if missing)
|
|
211
|
+
await ensureLanguageBinaries(configPath, debug);
|
|
212
|
+
|
|
151
213
|
// Connect to RFDB server — auto-start by default (zero-config UX)
|
|
152
214
|
const backend = new RFDBServerBackend({
|
|
153
215
|
dbPath,
|