@pyreon/cli 0.5.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.
@@ -0,0 +1,441 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { detectReactPatterns, hasReactPatterns, migrateReactCode } from "@pyreon/compiler";
5
+
6
+ //#region src/context.ts
7
+ /**
8
+ * pyreon context — generates .pyreon/context.json for AI tool consumption
9
+ *
10
+ * Scans the project to extract:
11
+ * - Route definitions (paths, params, loaders, guards)
12
+ * - Component inventory (file, props, signals)
13
+ * - Island declarations (name, hydration strategy)
14
+ * - Framework version
15
+ */
16
+ async function generateContext(options) {
17
+ const version = readVersion(options.cwd);
18
+ const sourceFiles = collectTsxFiles(options.cwd);
19
+ const routes = extractRoutes(sourceFiles, options.cwd);
20
+ const components = extractComponents(sourceFiles, options.cwd);
21
+ const islands = extractIslands(sourceFiles, options.cwd);
22
+ const context = {
23
+ framework: "pyreon",
24
+ version,
25
+ generatedAt: (/* @__PURE__ */new Date()).toISOString(),
26
+ routes,
27
+ components,
28
+ islands
29
+ };
30
+ const outDir = options.outPath ? path.dirname(options.outPath) : path.join(options.cwd, ".pyreon");
31
+ const outFile = options.outPath ?? path.join(outDir, "context.json");
32
+ if (!fs.existsSync(outDir)) fs.mkdirSync(outDir, {
33
+ recursive: true
34
+ });
35
+ fs.writeFileSync(outFile, JSON.stringify(context, null, 2), "utf-8");
36
+ ensureGitignore(options.cwd);
37
+ const relOut = path.relative(options.cwd, outFile);
38
+ console.log(` ✓ Generated ${relOut} (${components.length} components, ${routes.length} routes, ${islands.length} islands)`);
39
+ return context;
40
+ }
41
+ function parseRouteFromBlock(block, routeMatch) {
42
+ const routePath = routeMatch[1] ?? "";
43
+ const params = extractParams(routePath);
44
+ const surroundingStart = Math.max(0, routeMatch.index - 50);
45
+ const surroundingEnd = Math.min(block.length, routeMatch.index + 200);
46
+ const surrounding = block.slice(surroundingStart, surroundingEnd);
47
+ const hasLoader = /loader\s*:/.test(surrounding);
48
+ const hasGuard = /beforeEnter\s*:|beforeLeave\s*:/.test(surrounding);
49
+ return {
50
+ path: routePath,
51
+ name: surrounding.match(/name\s*:\s*["']([^"']+)["']/)?.[1],
52
+ hasLoader,
53
+ hasGuard,
54
+ params
55
+ };
56
+ }
57
+ function extractRoutesFromBlock(block) {
58
+ const routes = [];
59
+ const routeObjRe = /path\s*:\s*["']([^"']+)["']/g;
60
+ let routeMatch;
61
+ while (true) {
62
+ routeMatch = routeObjRe.exec(block);
63
+ if (!routeMatch) break;
64
+ routes.push(parseRouteFromBlock(block, routeMatch));
65
+ }
66
+ return routes;
67
+ }
68
+ function extractRoutes(files, _cwd) {
69
+ const routes = [];
70
+ for (const file of files) {
71
+ let code;
72
+ try {
73
+ code = fs.readFileSync(file, "utf-8");
74
+ } catch {
75
+ continue;
76
+ }
77
+ const routeArrayRe = /(?:createRouter\s*\(\s*\[|(?:const|let)\s+routes\s*(?::\s*RouteRecord\[\])?\s*=\s*\[)([\s\S]*?)\]/g;
78
+ let match;
79
+ while (true) {
80
+ match = routeArrayRe.exec(code);
81
+ if (!match) break;
82
+ const block = match[1] ?? "";
83
+ for (const route of extractRoutesFromBlock(block)) routes.push(route);
84
+ }
85
+ }
86
+ return routes;
87
+ }
88
+ function parseProps(propsStr) {
89
+ return propsStr.split(",").map(p => p.trim().split(":")[0]?.split("=")[0]?.trim() ?? "").filter(p => p && p !== "props");
90
+ }
91
+ function collectSignalNames(body) {
92
+ const signalNames = [];
93
+ const signalRe = /(?:const|let)\s+(\w+)\s*=\s*signal\s*[<(]/g;
94
+ let sigMatch;
95
+ while (true) {
96
+ sigMatch = signalRe.exec(body);
97
+ if (!sigMatch) break;
98
+ if (sigMatch[1]) signalNames.push(sigMatch[1]);
99
+ }
100
+ return signalNames;
101
+ }
102
+ function extractComponentsFromCode(code, relFile) {
103
+ const components = [];
104
+ const componentRe = /(?:export\s+)?(?:const|function)\s+([A-Z]\w*)\s*(?::\s*ComponentFn<[^>]+>\s*)?=?\s*\(?(?:\s*\{?\s*([^)]*?)\s*\}?\s*)?\)?\s*(?:=>|{)/g;
105
+ let match;
106
+ while (true) {
107
+ match = componentRe.exec(code);
108
+ if (!match) break;
109
+ const name = match[1] ?? "Unknown";
110
+ const props = parseProps(match[2] ?? "");
111
+ const bodyStart = match.index + match[0].length;
112
+ const signalNames = collectSignalNames(code.slice(bodyStart, Math.min(code.length, bodyStart + 2e3)));
113
+ components.push({
114
+ name,
115
+ file: relFile,
116
+ hasSignals: signalNames.length > 0,
117
+ signalNames,
118
+ props
119
+ });
120
+ }
121
+ return components;
122
+ }
123
+ function extractComponents(files, _cwd) {
124
+ const components = [];
125
+ for (const file of files) {
126
+ let code;
127
+ try {
128
+ code = fs.readFileSync(file, "utf-8");
129
+ } catch {
130
+ continue;
131
+ }
132
+ const relFile = path.relative(_cwd, file);
133
+ for (const comp of extractComponentsFromCode(code, relFile)) components.push(comp);
134
+ }
135
+ return components;
136
+ }
137
+ function extractIslands(files, cwd) {
138
+ const islands = [];
139
+ for (const file of files) {
140
+ let code;
141
+ try {
142
+ code = fs.readFileSync(file, "utf-8");
143
+ } catch {
144
+ continue;
145
+ }
146
+ const islandRe = /island\s*\(\s*\(\)\s*=>\s*import\(.+?\)\s*,\s*\{[^}]*name\s*:\s*["']([^"']+)["'][^}]*?(?:hydrate\s*:\s*["']([^"']+)["'])?[^}]*\}/g;
147
+ let match;
148
+ while (true) {
149
+ match = islandRe.exec(code);
150
+ if (!match) break;
151
+ if (match[1]) islands.push({
152
+ name: match[1],
153
+ file: path.relative(cwd, file),
154
+ hydrate: match[2] ?? "load"
155
+ });
156
+ }
157
+ }
158
+ return islands;
159
+ }
160
+ function extractParams(routePath) {
161
+ const params = [];
162
+ const paramRe = /:(\w+)\??/g;
163
+ let match;
164
+ while (true) {
165
+ match = paramRe.exec(routePath);
166
+ if (!match) break;
167
+ if (match[1]) params.push(match[1]);
168
+ }
169
+ return params;
170
+ }
171
+ function readVersion(cwd) {
172
+ try {
173
+ const pkg = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf-8"));
174
+ const deps = {
175
+ ...pkg.dependencies,
176
+ ...pkg.devDependencies
177
+ };
178
+ for (const [name, version] of Object.entries(deps)) if (name.startsWith("@pyreon/") && typeof version === "string") return version.replace(/^[\^~]/, "");
179
+ return pkg.version || "unknown";
180
+ } catch {
181
+ return "unknown";
182
+ }
183
+ }
184
+ function shouldSkipEntry(entry) {
185
+ if (!entry.isDirectory()) return false;
186
+ return entry.name.startsWith(".") || tsxIgnoreDirs.has(entry.name);
187
+ }
188
+ function walkTsxFiles(dir, results) {
189
+ let entries;
190
+ try {
191
+ entries = fs.readdirSync(dir, {
192
+ withFileTypes: true
193
+ });
194
+ } catch {
195
+ return;
196
+ }
197
+ for (const entry of entries) {
198
+ if (shouldSkipEntry(entry)) continue;
199
+ const fullPath = path.join(dir, entry.name);
200
+ if (entry.isDirectory()) walkTsxFiles(fullPath, results);else if (entry.isFile() && tsxExtensions.has(path.extname(entry.name))) results.push(fullPath);
201
+ }
202
+ }
203
+ function collectTsxFiles(cwd) {
204
+ const results = [];
205
+ walkTsxFiles(cwd, results);
206
+ return results;
207
+ }
208
+ function ensureGitignore(cwd) {
209
+ const gitignorePath = path.join(cwd, ".gitignore");
210
+ try {
211
+ const content = fs.existsSync(gitignorePath) ? fs.readFileSync(gitignorePath, "utf-8") : "";
212
+ if (!content.includes(".pyreon/") && !content.includes(".pyreon\n")) {
213
+ const addition = content.endsWith("\n") ? ".pyreon/\n" : "\n.pyreon/\n";
214
+ fs.appendFileSync(gitignorePath, addition);
215
+ }
216
+ } catch {}
217
+ }
218
+
219
+ //#endregion
220
+ //#region src/doctor.ts
221
+ /**
222
+ * pyreon doctor — project-wide health check for AI-friendly development
223
+ *
224
+ * Runs a pipeline of checks:
225
+ * 1. React pattern detection (imports, hooks, JSX attributes)
226
+ * 2. Import source validation (@pyreon/* vs react/vue)
227
+ * 3. Common Pyreon mistakes (signal without call, key vs by, etc.)
228
+ *
229
+ * Output modes:
230
+ * - Human-readable (default): colored terminal output
231
+ * - JSON (--json): structured output for AI agent consumption
232
+ * - CI (--ci): exits with code 1 on any error
233
+ *
234
+ * Fix mode (--fix): auto-applies safe transforms via migrateReactCode
235
+ */
236
+ async function doctor(options) {
237
+ const startTime = performance.now();
238
+ const result = runChecks(collectSourceFiles(options.cwd), options);
239
+ const elapsed = Math.round(performance.now() - startTime);
240
+ if (options.json) printJson(result);else printHuman(result, elapsed);
241
+ return result.summary.totalErrors;
242
+ }
243
+ function shouldSkipDirEntry(entry) {
244
+ if (!entry.isDirectory()) return false;
245
+ return entry.name.startsWith(".") || sourceIgnoreDirs.has(entry.name);
246
+ }
247
+ function walkSourceFiles(dir, results) {
248
+ let entries;
249
+ try {
250
+ entries = fs.readdirSync(dir, {
251
+ withFileTypes: true
252
+ });
253
+ } catch {
254
+ return;
255
+ }
256
+ for (const entry of entries) {
257
+ if (shouldSkipDirEntry(entry)) continue;
258
+ const fullPath = path.join(dir, entry.name);
259
+ if (entry.isDirectory()) walkSourceFiles(fullPath, results);else if (entry.isFile() && sourceExtensions.has(path.extname(entry.name))) results.push(fullPath);
260
+ }
261
+ }
262
+ function collectSourceFiles(cwd) {
263
+ const results = [];
264
+ walkSourceFiles(cwd, results);
265
+ return results;
266
+ }
267
+ function checkFileWithFix(file, relPath) {
268
+ let code;
269
+ try {
270
+ code = fs.readFileSync(file, "utf-8");
271
+ } catch {
272
+ return {
273
+ result: null,
274
+ fixCount: 0
275
+ };
276
+ }
277
+ if (!hasReactPatterns(code)) return {
278
+ result: null,
279
+ fixCount: 0
280
+ };
281
+ const migrated = migrateReactCode(code, relPath);
282
+ if (migrated.changes.length > 0) fs.writeFileSync(file, migrated.code, "utf-8");
283
+ const remaining = detectReactPatterns(migrated.code, relPath);
284
+ if (remaining.length > 0 || migrated.changes.length > 0) return {
285
+ result: {
286
+ file: relPath,
287
+ diagnostics: remaining,
288
+ fixed: migrated.changes.length > 0
289
+ },
290
+ fixCount: migrated.changes.length
291
+ };
292
+ return {
293
+ result: null,
294
+ fixCount: 0
295
+ };
296
+ }
297
+ function checkFileDetectOnly(file, relPath) {
298
+ let code;
299
+ try {
300
+ code = fs.readFileSync(file, "utf-8");
301
+ } catch {
302
+ return null;
303
+ }
304
+ if (!hasReactPatterns(code)) return null;
305
+ const diagnostics = detectReactPatterns(code, relPath);
306
+ if (diagnostics.length > 0) return {
307
+ file: relPath,
308
+ diagnostics,
309
+ fixed: false
310
+ };
311
+ return null;
312
+ }
313
+ function runChecks(files, options) {
314
+ const fileResults = [];
315
+ let totalFixed = 0;
316
+ for (const file of files) {
317
+ const relPath = path.relative(options.cwd, file);
318
+ if (options.fix) {
319
+ const {
320
+ result,
321
+ fixCount
322
+ } = checkFileWithFix(file, relPath);
323
+ totalFixed += fixCount;
324
+ if (result) fileResults.push(result);
325
+ } else {
326
+ const result = checkFileDetectOnly(file, relPath);
327
+ if (result) fileResults.push(result);
328
+ }
329
+ }
330
+ const totalErrors = fileResults.reduce((sum, f) => sum + f.diagnostics.length, 0);
331
+ const totalFixable = fileResults.reduce((sum, f) => sum + f.diagnostics.filter(d => d.fixable).length, 0);
332
+ return {
333
+ passed: totalErrors === 0,
334
+ files: fileResults,
335
+ summary: {
336
+ filesScanned: files.length,
337
+ filesWithIssues: fileResults.length,
338
+ totalErrors,
339
+ totalFixable,
340
+ totalFixed
341
+ }
342
+ };
343
+ }
344
+ function printJson(result) {
345
+ console.log(JSON.stringify(result, null, 2));
346
+ }
347
+ function printFileResult(fileResult) {
348
+ if (fileResult.diagnostics.length === 0) return;
349
+ console.log(` ${fileResult.file}${fileResult.fixed ? " (partially fixed)" : ""}`);
350
+ for (const diag of fileResult.diagnostics) {
351
+ const fixTag = diag.fixable ? " [fixable]" : "";
352
+ console.log(` ${diag.line}:${diag.column} — ${diag.message}${fixTag}`);
353
+ console.log(` Current: ${diag.current}`);
354
+ console.log(` Suggested: ${diag.suggested}`);
355
+ console.log("");
356
+ }
357
+ }
358
+ function printSummary(summary) {
359
+ console.log(` ${summary.totalErrors} issue${summary.totalErrors === 1 ? "" : "s"} in ${summary.filesWithIssues} file${summary.filesWithIssues === 1 ? "" : "s"}`);
360
+ if (summary.totalFixable > 0) console.log(` ${summary.totalFixable} auto-fixable — run 'pyreon doctor --fix' to apply`);
361
+ console.log("");
362
+ }
363
+ function printHuman(result, elapsed) {
364
+ const {
365
+ summary
366
+ } = result;
367
+ console.log("");
368
+ console.log(` Pyreon Doctor — scanned ${summary.filesScanned} files in ${elapsed}ms`);
369
+ console.log("");
370
+ if (result.passed && summary.totalFixed === 0) {
371
+ console.log(" ✓ No issues found. Your code is Pyreon-native!");
372
+ console.log("");
373
+ return;
374
+ }
375
+ if (summary.totalFixed > 0) {
376
+ console.log(` ✓ Auto-fixed ${summary.totalFixed} issue${summary.totalFixed === 1 ? "" : "s"}`);
377
+ console.log("");
378
+ }
379
+ for (const fileResult of result.files) printFileResult(fileResult);
380
+ printSummary(summary);
381
+ }
382
+
383
+ //#endregion
384
+ //#region src/index.ts
385
+ /**
386
+ * @pyreon/cli — Developer tools for Pyreon
387
+ *
388
+ * Commands:
389
+ * pyreon doctor [--fix] [--json] — Scan project for React patterns, bad imports, etc.
390
+ * pyreon context — Generate .pyreon/context.json for AI tools
391
+ */
392
+
393
+ function printUsage() {
394
+ console.log(`
395
+ pyreon <command> [options]
396
+
397
+ Commands:
398
+ doctor [--fix] [--json] [--ci] Scan for React patterns, bad imports, and common mistakes
399
+ context [--out <path>] Generate .pyreon/context.json for AI tools
400
+
401
+ Options:
402
+ --help Show this help message
403
+ --version Show version
404
+ `);
405
+ }
406
+ async function main() {
407
+ if (!command || command === "--help" || command === "-h") {
408
+ printUsage();
409
+ return;
410
+ }
411
+ if (command === "--version" || command === "-v") {
412
+ console.log("0.4.0");
413
+ return;
414
+ }
415
+ if (command === "doctor") {
416
+ const options = {
417
+ fix: args.includes("--fix"),
418
+ json: args.includes("--json"),
419
+ ci: args.includes("--ci"),
420
+ cwd: process.cwd()
421
+ };
422
+ const exitCode = await doctor(options);
423
+ if (options.ci && exitCode > 0) process.exit(1);
424
+ return;
425
+ }
426
+ if (command === "context") {
427
+ const outIdx = args.indexOf("--out");
428
+ const outPath = outIdx >= 0 ? args[outIdx + 1] : void 0;
429
+ await generateContext({
430
+ cwd: process.cwd(),
431
+ outPath
432
+ });
433
+ return;
434
+ }
435
+ console.error(`Unknown command: ${command}`);
436
+ printUsage();
437
+ process.exit(1);
438
+ }
439
+ //#endregion
440
+ export { doctor, generateContext };
441
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/context.ts","../../src/doctor.ts","../../src/index.ts"],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ //#region src/context.d.ts
2
+ /**
3
+ * pyreon context — generates .pyreon/context.json for AI tool consumption
4
+ *
5
+ * Scans the project to extract:
6
+ * - Route definitions (paths, params, loaders, guards)
7
+ * - Component inventory (file, props, signals)
8
+ * - Island declarations (name, hydration strategy)
9
+ * - Framework version
10
+ */
11
+ interface ContextOptions {
12
+ cwd: string;
13
+ outPath?: string | undefined;
14
+ }
15
+ interface RouteInfo {
16
+ path: string;
17
+ name?: string | undefined;
18
+ component?: string | undefined;
19
+ hasLoader: boolean;
20
+ hasGuard: boolean;
21
+ params: string[];
22
+ children?: RouteInfo[] | undefined;
23
+ }
24
+ interface ComponentInfo {
25
+ name: string;
26
+ file: string;
27
+ hasSignals: boolean;
28
+ signalNames: string[];
29
+ props: string[];
30
+ }
31
+ interface IslandInfo {
32
+ name: string;
33
+ file: string;
34
+ hydrate: string;
35
+ }
36
+ interface ProjectContext {
37
+ framework: "pyreon";
38
+ version: string;
39
+ generatedAt: string;
40
+ routes: RouteInfo[];
41
+ components: ComponentInfo[];
42
+ islands: IslandInfo[];
43
+ }
44
+ declare function generateContext(options: ContextOptions): Promise<ProjectContext>;
45
+ //#endregion
46
+ //#region src/doctor.d.ts
47
+ /**
48
+ * pyreon doctor — project-wide health check for AI-friendly development
49
+ *
50
+ * Runs a pipeline of checks:
51
+ * 1. React pattern detection (imports, hooks, JSX attributes)
52
+ * 2. Import source validation (@pyreon/* vs react/vue)
53
+ * 3. Common Pyreon mistakes (signal without call, key vs by, etc.)
54
+ *
55
+ * Output modes:
56
+ * - Human-readable (default): colored terminal output
57
+ * - JSON (--json): structured output for AI agent consumption
58
+ * - CI (--ci): exits with code 1 on any error
59
+ *
60
+ * Fix mode (--fix): auto-applies safe transforms via migrateReactCode
61
+ */
62
+ interface DoctorOptions {
63
+ fix: boolean;
64
+ json: boolean;
65
+ ci: boolean;
66
+ cwd: string;
67
+ }
68
+ declare function doctor(options: DoctorOptions): Promise<number>;
69
+ //#endregion
70
+ export { type ContextOptions, type DoctorOptions, type ProjectContext, doctor, generateContext };
71
+ //# sourceMappingURL=index2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/context.ts","../../src/doctor.ts"],"mappings":";;AAaA;;;;;AAKA;;;UALiB,cAAA;EACf,GAAA;EACA,OAAA;AAAA;AAAA,UAGe,SAAA;EACf,IAAA;EACA,IAAA;EACA,SAAA;EACA,SAAA;EACA,QAAA;EACA,MAAA;EACA,QAAA,GAAW,SAAA;AAAA;AAAA,UAGI,aAAA;EACf,IAAA;EACA,IAAA;EACA,UAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,UAGe,UAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,UAGe,cAAA;EACf,SAAA;EACA,OAAA;EACA,WAAA;EACA,MAAA,EAAQ,SAAA;EACR,UAAA,EAAY,aAAA;EACZ,OAAA,EAAS,UAAA;AAAA;AAAA,iBAGW,eAAA,CAAgB,OAAA,EAAS,cAAA,GAAiB,OAAA,CAAQ,cAAA;;;;AAtCxE;;;;;AAKA;;;;;;;;;UCOiB,aAAA;EACf,GAAA;EACA,IAAA;EACA,EAAA;EACA,GAAA;AAAA;AAAA,iBAqBoB,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@pyreon/cli",
3
+ "version": "0.5.0",
4
+ "description": "CLI tools for Pyreon — doctor, generate, context",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/pyreon/pyreon.git",
9
+ "directory": "packages/cli"
10
+ },
11
+ "homepage": "https://github.com/pyreon/pyreon/tree/main/packages/cli#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/pyreon/pyreon/issues"
14
+ },
15
+ "files": [
16
+ "lib",
17
+ "src",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "sideEffects": false,
22
+ "type": "module",
23
+ "main": "./lib/index.js",
24
+ "module": "./lib/index.js",
25
+ "types": "./lib/types/index.d.ts",
26
+ "bin": {
27
+ "pyreon": "./lib/index.js"
28
+ },
29
+ "exports": {
30
+ ".": {
31
+ "bun": "./src/index.ts",
32
+ "import": "./lib/index.js",
33
+ "types": "./lib/types/index.d.ts"
34
+ }
35
+ },
36
+ "scripts": {
37
+ "build": "vl_rolldown_build",
38
+ "dev": "vl_rolldown_build-watch",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit",
41
+ "lint": "biome check .",
42
+ "prepublishOnly": "bun run build"
43
+ },
44
+ "dependencies": {
45
+ "@pyreon/compiler": "workspace:*"
46
+ },
47
+ "peerDependencies": {
48
+ "typescript": ">=5.0.0"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public"
52
+ }
53
+ }