@symplek/cli 0.0.0-stage → 0.2.0-beta.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.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/bin/symplek.js +5 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +44 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +36 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +467 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/generate.d.ts +26 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +491 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +46 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +350 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +41 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +518 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/validate.d.ts +252 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +515 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +24 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +39 -0
- package/dist/models.js.map +1 -0
- package/dist/naming.d.ts +20 -0
- package/dist/naming.d.ts.map +1 -0
- package/dist/naming.js +48 -0
- package/dist/naming.js.map +1 -0
- package/dist/templates/agent/agent.ts.template +41 -0
- package/dist/templates/agent/general.yaml.template +34 -0
- package/dist/templates/agent/researcher.yaml.template +42 -0
- package/dist/templates/agent/reviewer.yaml.template +51 -0
- package/dist/templates/project/full/.github/workflows/ci.yml.template +34 -0
- package/dist/templates/project/full/.gitignore.template +6 -0
- package/dist/templates/project/full/Dockerfile.template +43 -0
- package/dist/templates/project/full/README.md.template +77 -0
- package/dist/templates/project/full/agents/example.yaml.template +16 -0
- package/dist/templates/project/full/package.json.template +30 -0
- package/dist/templates/project/full/src/index.ts.template +43 -0
- package/dist/templates/project/full/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/full/src/tools/index.ts.template +73 -0
- package/dist/templates/project/full/tests/example.test.ts.template +49 -0
- package/dist/templates/project/full/tsconfig.json.template +18 -0
- package/dist/templates/project/minimal/.gitignore.template +6 -0
- package/dist/templates/project/minimal/agents/example.yaml.template +16 -0
- package/dist/templates/project/minimal/package.json.template +27 -0
- package/dist/templates/project/minimal/src/index.ts.template +43 -0
- package/dist/templates/project/minimal/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/minimal/tsconfig.json.template +18 -0
- package/dist/templates/project/standard/.gitignore.template +6 -0
- package/dist/templates/project/standard/README.md.template +77 -0
- package/dist/templates/project/standard/agents/example.yaml.template +16 -0
- package/dist/templates/project/standard/package.json.template +30 -0
- package/dist/templates/project/standard/src/index.ts.template +43 -0
- package/dist/templates/project/standard/src/symplek.config.ts.template +20 -0
- package/dist/templates/project/standard/src/tools/index.ts.template +73 -0
- package/dist/templates/project/standard/tests/example.test.ts.template +49 -0
- package/dist/templates/project/standard/tsconfig.json.template +18 -0
- package/dist/utils/templates.d.ts +41 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +133 -0
- package/dist/utils/templates.js.map +1 -0
- package/package.json +60 -3
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `symplek migrate` command - scans codebase for zero-trust migration issues
|
|
4
|
+
* Detects patterns affected by the zero-trust breaking change and provides
|
|
5
|
+
* auto-fix for safe patterns.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.detectMigrationIssues = detectMigrationIssues;
|
|
45
|
+
exports.autoFixIssues = autoFixIssues;
|
|
46
|
+
exports.generateMigrationReport = generateMigrationReport;
|
|
47
|
+
exports.migrateCommand = migrateCommand;
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
51
|
+
const commander_1 = require("commander");
|
|
52
|
+
const ora_1 = __importDefault(require("ora"));
|
|
53
|
+
// =============================================================================
|
|
54
|
+
// Detection Patterns (from 01.06 TrustModeMigrator)
|
|
55
|
+
// =============================================================================
|
|
56
|
+
const DETECTION_PATTERNS = [
|
|
57
|
+
{
|
|
58
|
+
id: "direct-property-then",
|
|
59
|
+
pattern: /\.run\([^)]*\)\.then\(\s*\(?(\w+)\)?\s*=>\s*\1\.(?!value)(\w+)/g,
|
|
60
|
+
autoFixable: true,
|
|
61
|
+
description: "Direct property access in .then() callback",
|
|
62
|
+
getSuggestion: (match) => {
|
|
63
|
+
const varName = match[1];
|
|
64
|
+
const propName = match[2];
|
|
65
|
+
return `Change '.then(${varName} => ${varName}.${propName})' to '.then(${varName} => ${varName}.value.${propName})'`;
|
|
66
|
+
},
|
|
67
|
+
transform: (match) => {
|
|
68
|
+
const varName = match[1];
|
|
69
|
+
const propName = match[2];
|
|
70
|
+
// Reconstruct the pattern with .value inserted
|
|
71
|
+
return `.run(${match[0].match(/\.run\(([^)]*)\)/)?.[1] || ""}).then(${varName} => ${varName}.value.${propName}`;
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "direct-property-access",
|
|
76
|
+
pattern: /\.run\([^)]*\)\.then\(\s*\(?r\)?\s*=>\s*r\.(?!value)(\w+)/g,
|
|
77
|
+
autoFixable: true,
|
|
78
|
+
description: "Direct property access on run() result using 'r'",
|
|
79
|
+
getSuggestion: (match) => {
|
|
80
|
+
const propName = match[1];
|
|
81
|
+
return `Change 'r.${propName}' to 'r.value.${propName}' - run() now returns TrackedResult`;
|
|
82
|
+
},
|
|
83
|
+
transform: (match) => {
|
|
84
|
+
const propName = match[1];
|
|
85
|
+
const runArgs = match[0].match(/\.run\(([^)]*)\)/)?.[1] || "";
|
|
86
|
+
return `.run(${runArgs}).then(r => r.value.${propName}`;
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "stored-result-access",
|
|
91
|
+
pattern: /const\s+(\w+)\s*=\s*await[^;]*\.run\([^)]*\);\s*(?:[^}]*?\n)*?.*?\1\.(?!value)(?!confidence)(?!source)(\w+)/,
|
|
92
|
+
autoFixable: false,
|
|
93
|
+
description: "Property access on stored result variable",
|
|
94
|
+
getSuggestion: (match) => {
|
|
95
|
+
const varName = match[1];
|
|
96
|
+
const propName = match[2];
|
|
97
|
+
return `Variable '${varName}' is now TrackedResult. Access via '${varName}.value.${propName}'`;
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "type-assertion-non-tracked",
|
|
102
|
+
pattern: /\.run\([^)]*\)\s+as\s+(?!TrackedResult)(?!Promise)(\w+)/g,
|
|
103
|
+
autoFixable: true,
|
|
104
|
+
description: "Type assertion that doesn't account for TrackedResult",
|
|
105
|
+
getSuggestion: (match) => {
|
|
106
|
+
const typeName = match[1];
|
|
107
|
+
return `Change 'as ${typeName}' to 'as TrackedResult<${typeName}>' - run() returns TrackedResult wrapper`;
|
|
108
|
+
},
|
|
109
|
+
transform: (match) => {
|
|
110
|
+
const typeName = match[1];
|
|
111
|
+
return `.run(${match[0].match(/\.run\(([^)]*)\)/)?.[1] || ""}) as TrackedResult<${typeName}>`;
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: "destructure-without-value",
|
|
116
|
+
pattern: /const\s*\{\s*(?!value)(\w+)(?:\s*,\s*(?!value)\w+)*\s*\}\s*=\s*await[^;]*\.run\([^)]*\)/g,
|
|
117
|
+
autoFixable: false,
|
|
118
|
+
description: "Destructuring properties directly from run() result",
|
|
119
|
+
getSuggestion: (match) => {
|
|
120
|
+
const propName = match[1];
|
|
121
|
+
return `Use 'const { value } = await ...run(ctx)' then destructure from value, or 'const { ${propName} } = (await ...run(ctx)).value'`;
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "optional-chain-without-value",
|
|
126
|
+
pattern: /\.run\([^)]*\)\s*\?\.\s*(?!value)(\w+)/g,
|
|
127
|
+
autoFixable: true,
|
|
128
|
+
description: "Optional chaining without .value",
|
|
129
|
+
getSuggestion: (match) => {
|
|
130
|
+
const propName = match[1];
|
|
131
|
+
return `Change '?.${propName}' to '?.value?.${propName}' - run() returns TrackedResult`;
|
|
132
|
+
},
|
|
133
|
+
transform: (match) => {
|
|
134
|
+
const propName = match[1];
|
|
135
|
+
return `.run(${match[0].match(/\.run\(([^)]*)\)/)?.[1] || ""})?.value?.${propName}`;
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
// =============================================================================
|
|
140
|
+
// File System Utilities
|
|
141
|
+
// =============================================================================
|
|
142
|
+
const DEFAULT_EXCLUDES = [
|
|
143
|
+
"node_modules",
|
|
144
|
+
"dist",
|
|
145
|
+
".git",
|
|
146
|
+
"_generated",
|
|
147
|
+
"build",
|
|
148
|
+
];
|
|
149
|
+
/** Recursively finds TypeScript files in a directory */
|
|
150
|
+
async function findTypeScriptFiles(dir, exclude = DEFAULT_EXCLUDES) {
|
|
151
|
+
const files = [];
|
|
152
|
+
async function walk(currentDir) {
|
|
153
|
+
let entries;
|
|
154
|
+
try {
|
|
155
|
+
entries = await fs.promises.readdir(currentDir, { withFileTypes: true });
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
162
|
+
if (exclude.some((ex) => entry.name === ex || fullPath.includes(ex))) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (entry.isDirectory()) {
|
|
166
|
+
await walk(fullPath);
|
|
167
|
+
}
|
|
168
|
+
else if (entry.isFile() &&
|
|
169
|
+
(entry.name.endsWith(".ts") || entry.name.endsWith(".tsx"))) {
|
|
170
|
+
files.push(fullPath);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
await walk(dir);
|
|
175
|
+
return files;
|
|
176
|
+
}
|
|
177
|
+
/** Check if position is inside a comment */
|
|
178
|
+
function isInsideComment(content, position) {
|
|
179
|
+
const beforePosition = content.substring(0, position);
|
|
180
|
+
const lastNewline = beforePosition.lastIndexOf("\n");
|
|
181
|
+
const lineStart = lastNewline === -1 ? 0 : lastNewline + 1;
|
|
182
|
+
const lineBeforeMatch = content.substring(lineStart, position);
|
|
183
|
+
if (lineBeforeMatch.indexOf("//") !== -1) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
let inMultilineComment = false;
|
|
187
|
+
let i = 0;
|
|
188
|
+
while (i < position) {
|
|
189
|
+
if (content[i] === "/" && content[i + 1] === "*") {
|
|
190
|
+
inMultilineComment = true;
|
|
191
|
+
i += 2;
|
|
192
|
+
}
|
|
193
|
+
else if (content[i] === "*" && content[i + 1] === "/") {
|
|
194
|
+
inMultilineComment = false;
|
|
195
|
+
i += 2;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
i++;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return inMultilineComment;
|
|
202
|
+
}
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// Detection Logic
|
|
205
|
+
// =============================================================================
|
|
206
|
+
/** Scan a single file for migration issues */
|
|
207
|
+
function scanFileForIssues(filePath, content, lines) {
|
|
208
|
+
const issues = [];
|
|
209
|
+
for (const patternDef of DETECTION_PATTERNS) {
|
|
210
|
+
patternDef.pattern.lastIndex = 0;
|
|
211
|
+
let match = patternDef.pattern.exec(content);
|
|
212
|
+
while (match !== null) {
|
|
213
|
+
if (isInsideComment(content, match.index)) {
|
|
214
|
+
match = patternDef.pattern.exec(content);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const beforeMatch = content.substring(0, match.index);
|
|
218
|
+
const lineNumber = beforeMatch.split("\n").length;
|
|
219
|
+
const lineContent = lines[lineNumber - 1] || "";
|
|
220
|
+
if (lineContent.includes(".value.")) {
|
|
221
|
+
match = patternDef.pattern.exec(content);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
issues.push({
|
|
225
|
+
file: filePath,
|
|
226
|
+
line: lineNumber,
|
|
227
|
+
code: lineContent.trim(),
|
|
228
|
+
suggestion: patternDef.getSuggestion(match, lineContent),
|
|
229
|
+
autoFixable: patternDef.autoFixable,
|
|
230
|
+
patternId: patternDef.id,
|
|
231
|
+
matchStart: match.index,
|
|
232
|
+
matchEnd: match.index + match[0].length,
|
|
233
|
+
});
|
|
234
|
+
if (!patternDef.pattern.global) {
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
match = patternDef.pattern.exec(content);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Deduplicate
|
|
241
|
+
const seen = new Set();
|
|
242
|
+
return issues.filter((issue) => {
|
|
243
|
+
const key = `${issue.file}:${issue.line}:${issue.patternId}`;
|
|
244
|
+
if (seen.has(key))
|
|
245
|
+
return false;
|
|
246
|
+
seen.add(key);
|
|
247
|
+
return true;
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
/** Detect migration issues in a project */
|
|
251
|
+
async function detectMigrationIssues(projectPath) {
|
|
252
|
+
const files = await findTypeScriptFiles(projectPath);
|
|
253
|
+
const allIssues = [];
|
|
254
|
+
for (const file of files) {
|
|
255
|
+
try {
|
|
256
|
+
const content = await fs.promises.readFile(file, "utf-8");
|
|
257
|
+
if (!content.includes(".run(")) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const lines = content.split("\n");
|
|
261
|
+
const fileIssues = scanFileForIssues(file, content, lines);
|
|
262
|
+
allIssues.push(...fileIssues);
|
|
263
|
+
}
|
|
264
|
+
catch { }
|
|
265
|
+
}
|
|
266
|
+
return allIssues.sort((a, b) => {
|
|
267
|
+
const fileCompare = a.file.localeCompare(b.file);
|
|
268
|
+
if (fileCompare !== 0)
|
|
269
|
+
return fileCompare;
|
|
270
|
+
return a.line - b.line;
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/** Apply auto-fixes to a single file */
|
|
274
|
+
async function applyAutoFixes(filePath, issues) {
|
|
275
|
+
const autoFixableIssues = issues.filter((i) => i.autoFixable);
|
|
276
|
+
if (autoFixableIssues.length === 0)
|
|
277
|
+
return null;
|
|
278
|
+
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
279
|
+
let newContent = content;
|
|
280
|
+
let fixesApplied = 0;
|
|
281
|
+
// Sort issues by position descending to avoid offset issues
|
|
282
|
+
const sortedIssues = [...autoFixableIssues].sort((a, b) => (b.matchStart || 0) - (a.matchStart || 0));
|
|
283
|
+
for (const issue of sortedIssues) {
|
|
284
|
+
const pattern = DETECTION_PATTERNS.find((p) => p.id === issue.patternId);
|
|
285
|
+
if (!pattern?.transform)
|
|
286
|
+
continue;
|
|
287
|
+
// Re-run pattern on current content to get fresh match
|
|
288
|
+
pattern.pattern.lastIndex = 0;
|
|
289
|
+
let match = pattern.pattern.exec(newContent);
|
|
290
|
+
while (match !== null) {
|
|
291
|
+
// Check if this match is on the same line as the issue
|
|
292
|
+
const beforeMatch = newContent.substring(0, match.index);
|
|
293
|
+
const lineNumber = beforeMatch.split("\n").length;
|
|
294
|
+
if (lineNumber === issue.line) {
|
|
295
|
+
const replacement = pattern.transform(match);
|
|
296
|
+
newContent =
|
|
297
|
+
newContent.substring(0, match.index) +
|
|
298
|
+
replacement +
|
|
299
|
+
newContent.substring(match.index + match[0].length);
|
|
300
|
+
fixesApplied++;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
match = pattern.pattern.exec(newContent);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (fixesApplied === 0)
|
|
307
|
+
return null;
|
|
308
|
+
return {
|
|
309
|
+
file: filePath,
|
|
310
|
+
fixesApplied,
|
|
311
|
+
originalContent: content,
|
|
312
|
+
newContent,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/** Apply auto-fixes to all files */
|
|
316
|
+
async function autoFixIssues(issues) {
|
|
317
|
+
const groupedByFile = issues.reduce((acc, issue) => {
|
|
318
|
+
if (!acc[issue.file])
|
|
319
|
+
acc[issue.file] = [];
|
|
320
|
+
acc[issue.file].push(issue);
|
|
321
|
+
return acc;
|
|
322
|
+
}, {});
|
|
323
|
+
let filesModified = 0;
|
|
324
|
+
let fixesApplied = 0;
|
|
325
|
+
for (const [filePath, fileIssues] of Object.entries(groupedByFile)) {
|
|
326
|
+
const result = await applyAutoFixes(filePath, fileIssues);
|
|
327
|
+
if (result) {
|
|
328
|
+
await fs.promises.writeFile(filePath, result.newContent, "utf-8");
|
|
329
|
+
filesModified++;
|
|
330
|
+
fixesApplied += result.fixesApplied;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return { filesModified, fixesApplied };
|
|
334
|
+
}
|
|
335
|
+
// =============================================================================
|
|
336
|
+
// Report Generation
|
|
337
|
+
// =============================================================================
|
|
338
|
+
/** Generate markdown migration report */
|
|
339
|
+
function generateMigrationReport(issues) {
|
|
340
|
+
const autoFixable = issues.filter((i) => i.autoFixable);
|
|
341
|
+
const manualReview = issues.filter((i) => !i.autoFixable);
|
|
342
|
+
const lines = [
|
|
343
|
+
"# Zero-Trust Migration Report",
|
|
344
|
+
"",
|
|
345
|
+
`Generated: ${new Date().toISOString()}`,
|
|
346
|
+
"",
|
|
347
|
+
"## Summary",
|
|
348
|
+
"",
|
|
349
|
+
`- **Total issues**: ${issues.length}`,
|
|
350
|
+
`- **Auto-fixable**: ${autoFixable.length}`,
|
|
351
|
+
`- **Manual review**: ${manualReview.length}`,
|
|
352
|
+
"",
|
|
353
|
+
];
|
|
354
|
+
if (issues.length === 0) {
|
|
355
|
+
lines.push("✅ **No migration issues found!** Your codebase is ready for zero-trust mode.", "");
|
|
356
|
+
return lines.join("\n");
|
|
357
|
+
}
|
|
358
|
+
if (autoFixable.length > 0) {
|
|
359
|
+
lines.push("## Auto-Fixable Issues", "");
|
|
360
|
+
lines.push("Run with `--auto-fix` to apply these automatically:", "");
|
|
361
|
+
const grouped = groupByFile(autoFixable);
|
|
362
|
+
for (const [file, fileIssues] of Object.entries(grouped)) {
|
|
363
|
+
lines.push(`### \`${file}\``, "");
|
|
364
|
+
for (const issue of fileIssues) {
|
|
365
|
+
lines.push(`**Line ${issue.line}**: ${issue.description || issue.patternId}`);
|
|
366
|
+
lines.push("```typescript");
|
|
367
|
+
lines.push(issue.code);
|
|
368
|
+
lines.push("```");
|
|
369
|
+
lines.push(`> 💡 ${issue.suggestion}`, "");
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
if (manualReview.length > 0) {
|
|
374
|
+
lines.push("## Manual Review Required", "");
|
|
375
|
+
lines.push("These patterns require manual review:", "");
|
|
376
|
+
const grouped = groupByFile(manualReview);
|
|
377
|
+
for (const [file, fileIssues] of Object.entries(grouped)) {
|
|
378
|
+
lines.push(`### \`${file}\``, "");
|
|
379
|
+
for (const issue of fileIssues) {
|
|
380
|
+
lines.push(`**Line ${issue.line}**: ${issue.description || issue.patternId}`);
|
|
381
|
+
lines.push("```typescript");
|
|
382
|
+
lines.push(issue.code);
|
|
383
|
+
lines.push("```");
|
|
384
|
+
lines.push(`> ⚠️ ${issue.suggestion}`, "");
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
lines.push("## Quick Migration Guide", "");
|
|
389
|
+
lines.push("If you need to migrate incrementally, use `trustMode: 'legacy'` temporarily:", "");
|
|
390
|
+
lines.push("```typescript");
|
|
391
|
+
lines.push("// Temporary: returns raw value (legacy behavior)");
|
|
392
|
+
lines.push("const result = await agent.run(ctx, { trustMode: 'legacy' });");
|
|
393
|
+
lines.push("");
|
|
394
|
+
lines.push("// Target: returns TrackedResult (zero-trust default)");
|
|
395
|
+
lines.push("const tracked = await agent.run(ctx);");
|
|
396
|
+
lines.push("const value = tracked.value; // Access via .value");
|
|
397
|
+
lines.push("```");
|
|
398
|
+
lines.push("");
|
|
399
|
+
return lines.join("\n");
|
|
400
|
+
}
|
|
401
|
+
function groupByFile(issues) {
|
|
402
|
+
return issues.reduce((acc, issue) => {
|
|
403
|
+
if (!acc[issue.file])
|
|
404
|
+
acc[issue.file] = [];
|
|
405
|
+
acc[issue.file].push(issue);
|
|
406
|
+
return acc;
|
|
407
|
+
}, {});
|
|
408
|
+
}
|
|
409
|
+
// =============================================================================
|
|
410
|
+
// Console Output Formatting
|
|
411
|
+
// =============================================================================
|
|
412
|
+
/** Format console output for migration analysis */
|
|
413
|
+
function formatConsoleOutput(issues) {
|
|
414
|
+
const autoFixable = issues.filter((i) => i.autoFixable);
|
|
415
|
+
const manualReview = issues.filter((i) => !i.autoFixable);
|
|
416
|
+
console.log();
|
|
417
|
+
console.log(chalk_1.default.bold.cyan("Zero-Trust Migration Analysis"));
|
|
418
|
+
console.log();
|
|
419
|
+
if (issues.length === 0) {
|
|
420
|
+
console.log(chalk_1.default.green("✓ No migration issues found!"));
|
|
421
|
+
console.log(chalk_1.default.dim("Your codebase is ready for zero-trust mode."));
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
console.log(`Found ${chalk_1.default.bold(issues.length)} issues ` +
|
|
425
|
+
`(${chalk_1.default.green(autoFixable.length)} auto-fixable, ` +
|
|
426
|
+
`${chalk_1.default.yellow(manualReview.length)} manual)`);
|
|
427
|
+
console.log();
|
|
428
|
+
if (autoFixable.length > 0) {
|
|
429
|
+
console.log(chalk_1.default.green.bold("Auto-Fixable:"));
|
|
430
|
+
for (const issue of autoFixable) {
|
|
431
|
+
const relativePath = path.relative(process.cwd(), issue.file);
|
|
432
|
+
console.log(chalk_1.default.dim(" ") +
|
|
433
|
+
chalk_1.default.white(`${relativePath}:${issue.line}`) +
|
|
434
|
+
chalk_1.default.dim(` - ${issue.description || issue.patternId}`));
|
|
435
|
+
}
|
|
436
|
+
console.log();
|
|
437
|
+
}
|
|
438
|
+
if (manualReview.length > 0) {
|
|
439
|
+
console.log(chalk_1.default.yellow.bold("Manual Review Required:"));
|
|
440
|
+
for (const issue of manualReview) {
|
|
441
|
+
const relativePath = path.relative(process.cwd(), issue.file);
|
|
442
|
+
console.log(chalk_1.default.dim(" ") +
|
|
443
|
+
chalk_1.default.white(`${relativePath}:${issue.line}`) +
|
|
444
|
+
chalk_1.default.dim(` - ${issue.description || issue.patternId}`));
|
|
445
|
+
console.log(chalk_1.default.cyan(` → ${issue.suggestion}`));
|
|
446
|
+
}
|
|
447
|
+
console.log();
|
|
448
|
+
}
|
|
449
|
+
if (autoFixable.length > 0) {
|
|
450
|
+
console.log(chalk_1.default.dim("Run with --auto-fix to apply safe fixes."));
|
|
451
|
+
}
|
|
452
|
+
console.log(chalk_1.default.dim("Run with --report to generate detailed report."));
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Create the migrate command
|
|
456
|
+
*/
|
|
457
|
+
function migrateCommand() {
|
|
458
|
+
const cmd = new commander_1.Command("migrate")
|
|
459
|
+
.description("Scan codebase for zero-trust migration issues")
|
|
460
|
+
.argument("[path]", "Path to scan (default: current directory)", ".")
|
|
461
|
+
.option("--report", "Generate migration-report.md file")
|
|
462
|
+
.option("--auto-fix", "Apply safe automatic fixes")
|
|
463
|
+
.action(async (targetPath, options) => {
|
|
464
|
+
const resolvedPath = path.resolve(process.cwd(), targetPath);
|
|
465
|
+
// Verify path exists
|
|
466
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
467
|
+
console.error(chalk_1.default.red(`Error: Path does not exist: ${resolvedPath}`));
|
|
468
|
+
process.exit(1);
|
|
469
|
+
}
|
|
470
|
+
const spinner = (0, ora_1.default)("Scanning for migration issues...").start();
|
|
471
|
+
try {
|
|
472
|
+
const issues = await detectMigrationIssues(resolvedPath);
|
|
473
|
+
spinner.stop();
|
|
474
|
+
// Handle auto-fix mode
|
|
475
|
+
if (options.autoFix) {
|
|
476
|
+
const autoFixable = issues.filter((i) => i.autoFixable);
|
|
477
|
+
if (autoFixable.length === 0) {
|
|
478
|
+
console.log(chalk_1.default.yellow("No auto-fixable issues found."));
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
const fixSpinner = (0, ora_1.default)("Applying auto-fixes...").start();
|
|
482
|
+
const { filesModified, fixesApplied } = await autoFixIssues(issues);
|
|
483
|
+
fixSpinner.succeed(chalk_1.default.green(`Applied ${fixesApplied} fixes across ${filesModified} files`));
|
|
484
|
+
// Re-scan to show remaining issues
|
|
485
|
+
const remainingIssues = await detectMigrationIssues(resolvedPath);
|
|
486
|
+
if (remainingIssues.length > 0) {
|
|
487
|
+
console.log();
|
|
488
|
+
console.log(chalk_1.default.yellow(`${remainingIssues.length} issues remain (manual review required)`));
|
|
489
|
+
formatConsoleOutput(remainingIssues);
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
console.log(chalk_1.default.green("✓ All issues resolved! Ready for zero-trust mode."));
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
// Handle report mode
|
|
498
|
+
if (options.report) {
|
|
499
|
+
const report = generateMigrationReport(issues);
|
|
500
|
+
const reportPath = path.join(process.cwd(), "migration-report.md");
|
|
501
|
+
await fs.promises.writeFile(reportPath, report, "utf-8");
|
|
502
|
+
console.log(chalk_1.default.green(`✓ Report generated: ${reportPath}`));
|
|
503
|
+
console.log();
|
|
504
|
+
formatConsoleOutput(issues);
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
// Default: console output only
|
|
508
|
+
formatConsoleOutput(issues);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
spinner.fail(chalk_1.default.red("Failed to scan codebase"));
|
|
512
|
+
console.error(chalk_1.default.red(error instanceof Error ? error.message : String(error)));
|
|
513
|
+
process.exit(1);
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
return cmd;
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|