@aiready/cli 0.3.8 → 0.4.1
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/.github/FUNDING.yml +5 -0
- package/.turbo/turbo-build.log +10 -10
- package/dist/chunk-VOB7SA3E.mjs +71 -0
- package/dist/cli.js +116 -5
- package/dist/cli.mjs +97 -3
- package/dist/index.d.mts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +18 -1
- package/dist/index.mjs +1 -1
- package/package.json +5 -4
- package/src/cli.ts +112 -3
- package/src/index.ts +23 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/cli@0.
|
|
3
|
+
> @aiready/cli@0.4.1 build /Users/pengcao/projects/aiready/packages/cli
|
|
4
4
|
> tsup src/index.ts src/cli.ts --format cjs,esm --dts
|
|
5
5
|
|
|
6
6
|
[34mCLI[39m Building entry: src/cli.ts, src/index.ts
|
|
@@ -9,16 +9,16 @@
|
|
|
9
9
|
[34mCLI[39m Target: es2020
|
|
10
10
|
[34mCJS[39m Build start
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[32mCJS[39m [1mdist/
|
|
13
|
-
[32mCJS[39m [1mdist/
|
|
14
|
-
[32mCJS[39m ⚡️ Build success in
|
|
12
|
+
[32mCJS[39m [1mdist/cli.js [22m[32m15.94 KB[39m
|
|
13
|
+
[32mCJS[39m [1mdist/index.js [22m[32m3.15 KB[39m
|
|
14
|
+
[32mCJS[39m ⚡️ Build success in 48ms
|
|
15
|
+
[32mESM[39m [1mdist/chunk-VOB7SA3E.mjs [22m[32m2.02 KB[39m
|
|
15
16
|
[32mESM[39m [1mdist/index.mjs [22m[32m138.00 B[39m
|
|
16
|
-
[32mESM[39m [1mdist/cli.mjs [22m[
|
|
17
|
-
[32mESM[39m
|
|
18
|
-
[32mESM[39m ⚡️ Build success in 54ms
|
|
17
|
+
[32mESM[39m [1mdist/cli.mjs [22m[32m12.36 KB[39m
|
|
18
|
+
[32mESM[39m ⚡️ Build success in 49ms
|
|
19
19
|
DTS Build start
|
|
20
|
-
DTS ⚡️ Build success in
|
|
20
|
+
DTS ⚡️ Build success in 554ms
|
|
21
21
|
DTS dist/cli.d.ts 20.00 B
|
|
22
|
-
DTS dist/index.d.ts
|
|
22
|
+
DTS dist/index.d.ts 991.00 B
|
|
23
23
|
DTS dist/cli.d.mts 20.00 B
|
|
24
|
-
DTS dist/index.d.mts
|
|
24
|
+
DTS dist/index.d.mts 991.00 B
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { analyzePatterns } from "@aiready/pattern-detect";
|
|
3
|
+
import { analyzeContext } from "@aiready/context-analyzer";
|
|
4
|
+
import { analyzeConsistency } from "@aiready/consistency";
|
|
5
|
+
async function analyzeUnified(options) {
|
|
6
|
+
const startTime = Date.now();
|
|
7
|
+
const tools = options.tools || ["patterns", "context", "consistency"];
|
|
8
|
+
const result = {
|
|
9
|
+
summary: {
|
|
10
|
+
totalIssues: 0,
|
|
11
|
+
toolsRun: tools,
|
|
12
|
+
executionTime: 0
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
if (tools.includes("patterns")) {
|
|
16
|
+
const patternResult = await analyzePatterns(options);
|
|
17
|
+
result.patterns = patternResult.results;
|
|
18
|
+
result.summary.totalIssues += patternResult.results.length;
|
|
19
|
+
}
|
|
20
|
+
if (tools.includes("context")) {
|
|
21
|
+
result.context = await analyzeContext(options);
|
|
22
|
+
result.summary.totalIssues += result.context?.length || 0;
|
|
23
|
+
}
|
|
24
|
+
if (tools.includes("consistency")) {
|
|
25
|
+
const report = await analyzeConsistency({
|
|
26
|
+
rootDir: options.rootDir,
|
|
27
|
+
include: options.include,
|
|
28
|
+
exclude: options.exclude,
|
|
29
|
+
checkNaming: true,
|
|
30
|
+
checkPatterns: true,
|
|
31
|
+
minSeverity: "info"
|
|
32
|
+
});
|
|
33
|
+
result.consistency = report;
|
|
34
|
+
result.summary.totalIssues += report.summary.totalIssues;
|
|
35
|
+
}
|
|
36
|
+
result.summary.executionTime = Date.now() - startTime;
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
function generateUnifiedSummary(result) {
|
|
40
|
+
const { summary } = result;
|
|
41
|
+
let output = `\u{1F680} AIReady Analysis Complete
|
|
42
|
+
|
|
43
|
+
`;
|
|
44
|
+
output += `\u{1F4CA} Summary:
|
|
45
|
+
`;
|
|
46
|
+
output += ` Tools run: ${summary.toolsRun.join(", ")}
|
|
47
|
+
`;
|
|
48
|
+
output += ` Total issues found: ${summary.totalIssues}
|
|
49
|
+
`;
|
|
50
|
+
output += ` Execution time: ${(summary.executionTime / 1e3).toFixed(2)}s
|
|
51
|
+
|
|
52
|
+
`;
|
|
53
|
+
if (result.patterns?.length) {
|
|
54
|
+
output += `\u{1F50D} Pattern Analysis: ${result.patterns.length} issues
|
|
55
|
+
`;
|
|
56
|
+
}
|
|
57
|
+
if (result.context?.length) {
|
|
58
|
+
output += `\u{1F9E0} Context Analysis: ${result.context.length} issues
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
if (result.consistency) {
|
|
62
|
+
output += `\u{1F3F7}\uFE0F Consistency Analysis: ${result.consistency.summary.totalIssues} issues
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
return output;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
analyzeUnified,
|
|
70
|
+
generateUnifiedSummary
|
|
71
|
+
};
|
package/dist/cli.js
CHANGED
|
@@ -29,9 +29,10 @@ var import_commander = require("commander");
|
|
|
29
29
|
// src/index.ts
|
|
30
30
|
var import_pattern_detect = require("@aiready/pattern-detect");
|
|
31
31
|
var import_context_analyzer = require("@aiready/context-analyzer");
|
|
32
|
+
var import_consistency = require("@aiready/consistency");
|
|
32
33
|
async function analyzeUnified(options) {
|
|
33
34
|
const startTime = Date.now();
|
|
34
|
-
const tools = options.tools || ["patterns", "context"];
|
|
35
|
+
const tools = options.tools || ["patterns", "context", "consistency"];
|
|
35
36
|
const result = {
|
|
36
37
|
summary: {
|
|
37
38
|
totalIssues: 0,
|
|
@@ -48,6 +49,18 @@ async function analyzeUnified(options) {
|
|
|
48
49
|
result.context = await (0, import_context_analyzer.analyzeContext)(options);
|
|
49
50
|
result.summary.totalIssues += result.context?.length || 0;
|
|
50
51
|
}
|
|
52
|
+
if (tools.includes("consistency")) {
|
|
53
|
+
const report = await (0, import_consistency.analyzeConsistency)({
|
|
54
|
+
rootDir: options.rootDir,
|
|
55
|
+
include: options.include,
|
|
56
|
+
exclude: options.exclude,
|
|
57
|
+
checkNaming: true,
|
|
58
|
+
checkPatterns: true,
|
|
59
|
+
minSeverity: "info"
|
|
60
|
+
});
|
|
61
|
+
result.consistency = report;
|
|
62
|
+
result.summary.totalIssues += report.summary.totalIssues;
|
|
63
|
+
}
|
|
51
64
|
result.summary.executionTime = Date.now() - startTime;
|
|
52
65
|
return result;
|
|
53
66
|
}
|
|
@@ -71,6 +84,10 @@ function generateUnifiedSummary(result) {
|
|
|
71
84
|
}
|
|
72
85
|
if (result.context?.length) {
|
|
73
86
|
output += `\u{1F9E0} Context Analysis: ${result.context.length} issues
|
|
87
|
+
`;
|
|
88
|
+
}
|
|
89
|
+
if (result.consistency) {
|
|
90
|
+
output += `\u{1F3F7}\uFE0F Consistency Analysis: ${result.consistency.summary.totalIssues} issues
|
|
74
91
|
`;
|
|
75
92
|
}
|
|
76
93
|
return output;
|
|
@@ -78,18 +95,19 @@ function generateUnifiedSummary(result) {
|
|
|
78
95
|
|
|
79
96
|
// src/cli.ts
|
|
80
97
|
var import_chalk = __toESM(require("chalk"));
|
|
98
|
+
var import_fs = require("fs");
|
|
81
99
|
var import_path = require("path");
|
|
82
100
|
var import_core = require("@aiready/core");
|
|
83
|
-
var
|
|
84
|
-
var packageJson = JSON.parse((0,
|
|
101
|
+
var import_fs2 = require("fs");
|
|
102
|
+
var packageJson = JSON.parse((0, import_fs2.readFileSync)((0, import_path.join)(__dirname, "../package.json"), "utf8"));
|
|
85
103
|
var program = new import_commander.Command();
|
|
86
104
|
program.name("aiready").description("AIReady - Unified AI-readiness analysis tools").version(packageJson.version).addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings");
|
|
87
|
-
program.command("scan").description("Run unified analysis on a codebase").argument("<directory>", "Directory to analyze").option("-t, --tools <tools>", "Tools to run (comma-separated: patterns,context)", "patterns,context").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json", "console").option("--output-file <path>", "Output file path (for json)").action(async (directory, options) => {
|
|
105
|
+
program.command("scan").description("Run unified analysis on a codebase").argument("<directory>", "Directory to analyze").option("-t, --tools <tools>", "Tools to run (comma-separated: patterns,context,consistency)", "patterns,context,consistency").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json", "console").option("--output-file <path>", "Output file path (for json)").action(async (directory, options) => {
|
|
88
106
|
console.log(import_chalk.default.blue("\u{1F680} Starting AIReady unified analysis...\n"));
|
|
89
107
|
const startTime = Date.now();
|
|
90
108
|
try {
|
|
91
109
|
const defaults = {
|
|
92
|
-
tools: ["patterns", "context"],
|
|
110
|
+
tools: ["patterns", "context", "consistency"],
|
|
93
111
|
include: void 0,
|
|
94
112
|
exclude: void 0,
|
|
95
113
|
output: {
|
|
@@ -235,4 +253,97 @@ program.command("context").description("Run context window cost analysis").argum
|
|
|
235
253
|
(0, import_core.handleCLIError)(error, "Context analysis");
|
|
236
254
|
}
|
|
237
255
|
});
|
|
256
|
+
program.command("consistency").description("Check naming, patterns, and architecture consistency").argument("<directory>", "Directory to analyze").option("--naming", "Check naming conventions (default: true)").option("--no-naming", "Skip naming analysis").option("--patterns", "Check code patterns (default: true)").option("--no-patterns", "Skip pattern analysis").option("--min-severity <level>", "Minimum severity: info|minor|major|critical", "info").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json, markdown", "console").option("--output-file <path>", "Output file path (for json/markdown)").action(async (directory, options) => {
|
|
257
|
+
console.log(import_chalk.default.blue("\u{1F50D} Analyzing consistency...\n"));
|
|
258
|
+
const startTime = Date.now();
|
|
259
|
+
try {
|
|
260
|
+
const defaults = {
|
|
261
|
+
checkNaming: true,
|
|
262
|
+
checkPatterns: true,
|
|
263
|
+
minSeverity: "info",
|
|
264
|
+
include: void 0,
|
|
265
|
+
exclude: void 0,
|
|
266
|
+
output: {
|
|
267
|
+
format: "console",
|
|
268
|
+
file: void 0
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
const finalOptions = (0, import_core.loadMergedConfig)(directory, defaults, {
|
|
272
|
+
checkNaming: options.naming !== false,
|
|
273
|
+
checkPatterns: options.patterns !== false,
|
|
274
|
+
minSeverity: options.minSeverity,
|
|
275
|
+
include: options.include?.split(","),
|
|
276
|
+
exclude: options.exclude?.split(",")
|
|
277
|
+
});
|
|
278
|
+
const { analyzeConsistency: analyzeConsistency2 } = await import("@aiready/consistency");
|
|
279
|
+
const report = await analyzeConsistency2(finalOptions);
|
|
280
|
+
const elapsedTime = (0, import_core.getElapsedTime)(startTime);
|
|
281
|
+
const outputFormat = options.output || finalOptions.output?.format || "console";
|
|
282
|
+
const outputFile = options.outputFile || finalOptions.output?.file;
|
|
283
|
+
if (outputFormat === "json") {
|
|
284
|
+
const outputData = {
|
|
285
|
+
...report,
|
|
286
|
+
summary: {
|
|
287
|
+
...report.summary,
|
|
288
|
+
executionTime: parseFloat(elapsedTime)
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
(0, import_core.handleJSONOutput)(outputData, outputFile, `\u2705 Results saved to ${outputFile}`);
|
|
292
|
+
} else if (outputFormat === "markdown") {
|
|
293
|
+
const markdown = generateMarkdownReport(report, elapsedTime);
|
|
294
|
+
if (outputFile) {
|
|
295
|
+
(0, import_fs.writeFileSync)(outputFile, markdown);
|
|
296
|
+
console.log(import_chalk.default.green(`\u2705 Report saved to ${outputFile}`));
|
|
297
|
+
} else {
|
|
298
|
+
console.log(markdown);
|
|
299
|
+
}
|
|
300
|
+
} else {
|
|
301
|
+
console.log(`Consistency Analysis Complete (${elapsedTime}s)`);
|
|
302
|
+
console.log(`Files analyzed: ${report.summary.filesAnalyzed}`);
|
|
303
|
+
console.log(`Total issues: ${report.summary.totalIssues}`);
|
|
304
|
+
console.log(` Naming: ${report.summary.namingIssues}`);
|
|
305
|
+
console.log(` Patterns: ${report.summary.patternIssues}`);
|
|
306
|
+
if (report.recommendations.length > 0) {
|
|
307
|
+
console.log(import_chalk.default.bold("\n\u{1F4A1} Recommendations:"));
|
|
308
|
+
report.recommendations.forEach((rec, i) => {
|
|
309
|
+
console.log(`${i + 1}. ${rec}`);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
} catch (error) {
|
|
314
|
+
(0, import_core.handleCLIError)(error, "Consistency analysis");
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
function generateMarkdownReport(report, elapsedTime) {
|
|
318
|
+
let markdown = `# Consistency Analysis Report
|
|
319
|
+
|
|
320
|
+
`;
|
|
321
|
+
markdown += `**Generated:** ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
322
|
+
`;
|
|
323
|
+
markdown += `**Analysis Time:** ${elapsedTime}s
|
|
324
|
+
|
|
325
|
+
`;
|
|
326
|
+
markdown += `## Summary
|
|
327
|
+
|
|
328
|
+
`;
|
|
329
|
+
markdown += `- **Files Analyzed:** ${report.summary.filesAnalyzed}
|
|
330
|
+
`;
|
|
331
|
+
markdown += `- **Total Issues:** ${report.summary.totalIssues}
|
|
332
|
+
`;
|
|
333
|
+
markdown += ` - Naming: ${report.summary.namingIssues}
|
|
334
|
+
`;
|
|
335
|
+
markdown += ` - Patterns: ${report.summary.patternIssues}
|
|
336
|
+
|
|
337
|
+
`;
|
|
338
|
+
if (report.recommendations.length > 0) {
|
|
339
|
+
markdown += `## Recommendations
|
|
340
|
+
|
|
341
|
+
`;
|
|
342
|
+
report.recommendations.forEach((rec, i) => {
|
|
343
|
+
markdown += `${i + 1}. ${rec}
|
|
344
|
+
`;
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
return markdown;
|
|
348
|
+
}
|
|
238
349
|
program.parse();
|
package/dist/cli.mjs
CHANGED
|
@@ -2,23 +2,24 @@
|
|
|
2
2
|
import {
|
|
3
3
|
analyzeUnified,
|
|
4
4
|
generateUnifiedSummary
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VOB7SA3E.mjs";
|
|
6
6
|
|
|
7
7
|
// src/cli.ts
|
|
8
8
|
import { Command } from "commander";
|
|
9
9
|
import chalk from "chalk";
|
|
10
|
+
import { writeFileSync } from "fs";
|
|
10
11
|
import { join } from "path";
|
|
11
12
|
import { loadMergedConfig, handleJSONOutput, handleCLIError, getElapsedTime } from "@aiready/core";
|
|
12
13
|
import { readFileSync } from "fs";
|
|
13
14
|
var packageJson = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf8"));
|
|
14
15
|
var program = new Command();
|
|
15
16
|
program.name("aiready").description("AIReady - Unified AI-readiness analysis tools").version(packageJson.version).addHelpText("after", "\nCONFIGURATION:\n Supports config files: aiready.json, aiready.config.json, .aiready.json, .aireadyrc.json, aiready.config.js, .aireadyrc.js\n CLI options override config file settings");
|
|
16
|
-
program.command("scan").description("Run unified analysis on a codebase").argument("<directory>", "Directory to analyze").option("-t, --tools <tools>", "Tools to run (comma-separated: patterns,context)", "patterns,context").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json", "console").option("--output-file <path>", "Output file path (for json)").action(async (directory, options) => {
|
|
17
|
+
program.command("scan").description("Run unified analysis on a codebase").argument("<directory>", "Directory to analyze").option("-t, --tools <tools>", "Tools to run (comma-separated: patterns,context,consistency)", "patterns,context,consistency").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json", "console").option("--output-file <path>", "Output file path (for json)").action(async (directory, options) => {
|
|
17
18
|
console.log(chalk.blue("\u{1F680} Starting AIReady unified analysis...\n"));
|
|
18
19
|
const startTime = Date.now();
|
|
19
20
|
try {
|
|
20
21
|
const defaults = {
|
|
21
|
-
tools: ["patterns", "context"],
|
|
22
|
+
tools: ["patterns", "context", "consistency"],
|
|
22
23
|
include: void 0,
|
|
23
24
|
exclude: void 0,
|
|
24
25
|
output: {
|
|
@@ -164,4 +165,97 @@ program.command("context").description("Run context window cost analysis").argum
|
|
|
164
165
|
handleCLIError(error, "Context analysis");
|
|
165
166
|
}
|
|
166
167
|
});
|
|
168
|
+
program.command("consistency").description("Check naming, patterns, and architecture consistency").argument("<directory>", "Directory to analyze").option("--naming", "Check naming conventions (default: true)").option("--no-naming", "Skip naming analysis").option("--patterns", "Check code patterns (default: true)").option("--no-patterns", "Skip pattern analysis").option("--min-severity <level>", "Minimum severity: info|minor|major|critical", "info").option("--include <patterns>", "File patterns to include (comma-separated)").option("--exclude <patterns>", "File patterns to exclude (comma-separated)").option("-o, --output <format>", "Output format: console, json, markdown", "console").option("--output-file <path>", "Output file path (for json/markdown)").action(async (directory, options) => {
|
|
169
|
+
console.log(chalk.blue("\u{1F50D} Analyzing consistency...\n"));
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
try {
|
|
172
|
+
const defaults = {
|
|
173
|
+
checkNaming: true,
|
|
174
|
+
checkPatterns: true,
|
|
175
|
+
minSeverity: "info",
|
|
176
|
+
include: void 0,
|
|
177
|
+
exclude: void 0,
|
|
178
|
+
output: {
|
|
179
|
+
format: "console",
|
|
180
|
+
file: void 0
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const finalOptions = loadMergedConfig(directory, defaults, {
|
|
184
|
+
checkNaming: options.naming !== false,
|
|
185
|
+
checkPatterns: options.patterns !== false,
|
|
186
|
+
minSeverity: options.minSeverity,
|
|
187
|
+
include: options.include?.split(","),
|
|
188
|
+
exclude: options.exclude?.split(",")
|
|
189
|
+
});
|
|
190
|
+
const { analyzeConsistency } = await import("@aiready/consistency");
|
|
191
|
+
const report = await analyzeConsistency(finalOptions);
|
|
192
|
+
const elapsedTime = getElapsedTime(startTime);
|
|
193
|
+
const outputFormat = options.output || finalOptions.output?.format || "console";
|
|
194
|
+
const outputFile = options.outputFile || finalOptions.output?.file;
|
|
195
|
+
if (outputFormat === "json") {
|
|
196
|
+
const outputData = {
|
|
197
|
+
...report,
|
|
198
|
+
summary: {
|
|
199
|
+
...report.summary,
|
|
200
|
+
executionTime: parseFloat(elapsedTime)
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
handleJSONOutput(outputData, outputFile, `\u2705 Results saved to ${outputFile}`);
|
|
204
|
+
} else if (outputFormat === "markdown") {
|
|
205
|
+
const markdown = generateMarkdownReport(report, elapsedTime);
|
|
206
|
+
if (outputFile) {
|
|
207
|
+
writeFileSync(outputFile, markdown);
|
|
208
|
+
console.log(chalk.green(`\u2705 Report saved to ${outputFile}`));
|
|
209
|
+
} else {
|
|
210
|
+
console.log(markdown);
|
|
211
|
+
}
|
|
212
|
+
} else {
|
|
213
|
+
console.log(`Consistency Analysis Complete (${elapsedTime}s)`);
|
|
214
|
+
console.log(`Files analyzed: ${report.summary.filesAnalyzed}`);
|
|
215
|
+
console.log(`Total issues: ${report.summary.totalIssues}`);
|
|
216
|
+
console.log(` Naming: ${report.summary.namingIssues}`);
|
|
217
|
+
console.log(` Patterns: ${report.summary.patternIssues}`);
|
|
218
|
+
if (report.recommendations.length > 0) {
|
|
219
|
+
console.log(chalk.bold("\n\u{1F4A1} Recommendations:"));
|
|
220
|
+
report.recommendations.forEach((rec, i) => {
|
|
221
|
+
console.log(`${i + 1}. ${rec}`);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
} catch (error) {
|
|
226
|
+
handleCLIError(error, "Consistency analysis");
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
function generateMarkdownReport(report, elapsedTime) {
|
|
230
|
+
let markdown = `# Consistency Analysis Report
|
|
231
|
+
|
|
232
|
+
`;
|
|
233
|
+
markdown += `**Generated:** ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
234
|
+
`;
|
|
235
|
+
markdown += `**Analysis Time:** ${elapsedTime}s
|
|
236
|
+
|
|
237
|
+
`;
|
|
238
|
+
markdown += `## Summary
|
|
239
|
+
|
|
240
|
+
`;
|
|
241
|
+
markdown += `- **Files Analyzed:** ${report.summary.filesAnalyzed}
|
|
242
|
+
`;
|
|
243
|
+
markdown += `- **Total Issues:** ${report.summary.totalIssues}
|
|
244
|
+
`;
|
|
245
|
+
markdown += ` - Naming: ${report.summary.namingIssues}
|
|
246
|
+
`;
|
|
247
|
+
markdown += ` - Patterns: ${report.summary.patternIssues}
|
|
248
|
+
|
|
249
|
+
`;
|
|
250
|
+
if (report.recommendations.length > 0) {
|
|
251
|
+
markdown += `## Recommendations
|
|
252
|
+
|
|
253
|
+
`;
|
|
254
|
+
report.recommendations.forEach((rec, i) => {
|
|
255
|
+
markdown += `${i + 1}. ${rec}
|
|
256
|
+
`;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return markdown;
|
|
260
|
+
}
|
|
167
261
|
program.parse();
|
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ScanOptions, AnalysisResult } from '@aiready/core';
|
|
2
2
|
import { ContextAnalysisResult } from '@aiready/context-analyzer';
|
|
3
|
+
import { ConsistencyReport } from '@aiready/consistency';
|
|
3
4
|
|
|
4
5
|
interface UnifiedAnalysisOptions extends ScanOptions {
|
|
5
|
-
tools?: ('patterns' | 'context')[];
|
|
6
|
+
tools?: ('patterns' | 'context' | 'consistency')[];
|
|
6
7
|
minSimilarity?: number;
|
|
7
8
|
minLines?: number;
|
|
8
9
|
maxCandidatesPerBlock?: number;
|
|
@@ -12,6 +13,7 @@ interface UnifiedAnalysisOptions extends ScanOptions {
|
|
|
12
13
|
interface UnifiedAnalysisResult {
|
|
13
14
|
patterns?: AnalysisResult[];
|
|
14
15
|
context?: ContextAnalysisResult[];
|
|
16
|
+
consistency?: ConsistencyReport;
|
|
15
17
|
summary: {
|
|
16
18
|
totalIssues: number;
|
|
17
19
|
toolsRun: string[];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ScanOptions, AnalysisResult } from '@aiready/core';
|
|
2
2
|
import { ContextAnalysisResult } from '@aiready/context-analyzer';
|
|
3
|
+
import { ConsistencyReport } from '@aiready/consistency';
|
|
3
4
|
|
|
4
5
|
interface UnifiedAnalysisOptions extends ScanOptions {
|
|
5
|
-
tools?: ('patterns' | 'context')[];
|
|
6
|
+
tools?: ('patterns' | 'context' | 'consistency')[];
|
|
6
7
|
minSimilarity?: number;
|
|
7
8
|
minLines?: number;
|
|
8
9
|
maxCandidatesPerBlock?: number;
|
|
@@ -12,6 +13,7 @@ interface UnifiedAnalysisOptions extends ScanOptions {
|
|
|
12
13
|
interface UnifiedAnalysisResult {
|
|
13
14
|
patterns?: AnalysisResult[];
|
|
14
15
|
context?: ContextAnalysisResult[];
|
|
16
|
+
consistency?: ConsistencyReport;
|
|
15
17
|
summary: {
|
|
16
18
|
totalIssues: number;
|
|
17
19
|
toolsRun: string[];
|
package/dist/index.js
CHANGED
|
@@ -26,9 +26,10 @@ __export(index_exports, {
|
|
|
26
26
|
module.exports = __toCommonJS(index_exports);
|
|
27
27
|
var import_pattern_detect = require("@aiready/pattern-detect");
|
|
28
28
|
var import_context_analyzer = require("@aiready/context-analyzer");
|
|
29
|
+
var import_consistency = require("@aiready/consistency");
|
|
29
30
|
async function analyzeUnified(options) {
|
|
30
31
|
const startTime = Date.now();
|
|
31
|
-
const tools = options.tools || ["patterns", "context"];
|
|
32
|
+
const tools = options.tools || ["patterns", "context", "consistency"];
|
|
32
33
|
const result = {
|
|
33
34
|
summary: {
|
|
34
35
|
totalIssues: 0,
|
|
@@ -45,6 +46,18 @@ async function analyzeUnified(options) {
|
|
|
45
46
|
result.context = await (0, import_context_analyzer.analyzeContext)(options);
|
|
46
47
|
result.summary.totalIssues += result.context?.length || 0;
|
|
47
48
|
}
|
|
49
|
+
if (tools.includes("consistency")) {
|
|
50
|
+
const report = await (0, import_consistency.analyzeConsistency)({
|
|
51
|
+
rootDir: options.rootDir,
|
|
52
|
+
include: options.include,
|
|
53
|
+
exclude: options.exclude,
|
|
54
|
+
checkNaming: true,
|
|
55
|
+
checkPatterns: true,
|
|
56
|
+
minSeverity: "info"
|
|
57
|
+
});
|
|
58
|
+
result.consistency = report;
|
|
59
|
+
result.summary.totalIssues += report.summary.totalIssues;
|
|
60
|
+
}
|
|
48
61
|
result.summary.executionTime = Date.now() - startTime;
|
|
49
62
|
return result;
|
|
50
63
|
}
|
|
@@ -68,6 +81,10 @@ function generateUnifiedSummary(result) {
|
|
|
68
81
|
}
|
|
69
82
|
if (result.context?.length) {
|
|
70
83
|
output += `\u{1F9E0} Context Analysis: ${result.context.length} issues
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
if (result.consistency) {
|
|
87
|
+
output += `\u{1F3F7}\uFE0F Consistency Analysis: ${result.consistency.summary.totalIssues} issues
|
|
71
88
|
`;
|
|
72
89
|
}
|
|
73
90
|
return output;
|
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Unified CLI for AIReady analysis tools",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"commander": "^12.1.0",
|
|
13
13
|
"chalk": "^5.3.0",
|
|
14
|
-
"@aiready/core": "0.
|
|
15
|
-
"@aiready/
|
|
16
|
-
"@aiready/
|
|
14
|
+
"@aiready/core": "0.5.1",
|
|
15
|
+
"@aiready/context-analyzer": "0.4.1",
|
|
16
|
+
"@aiready/pattern-detect": "0.8.1",
|
|
17
|
+
"@aiready/consistency": "0.2.1"
|
|
17
18
|
},
|
|
18
19
|
"devDependencies": {
|
|
19
20
|
"tsup": "^8.3.5",
|
package/src/cli.ts
CHANGED
|
@@ -22,7 +22,7 @@ program
|
|
|
22
22
|
.command('scan')
|
|
23
23
|
.description('Run unified analysis on a codebase')
|
|
24
24
|
.argument('<directory>', 'Directory to analyze')
|
|
25
|
-
.option('-t, --tools <tools>', 'Tools to run (comma-separated: patterns,context)', 'patterns,context')
|
|
25
|
+
.option('-t, --tools <tools>', 'Tools to run (comma-separated: patterns,context,consistency)', 'patterns,context,consistency')
|
|
26
26
|
.option('--include <patterns>', 'File patterns to include (comma-separated)')
|
|
27
27
|
.option('--exclude <patterns>', 'File patterns to exclude (comma-separated)')
|
|
28
28
|
.option('-o, --output <format>', 'Output format: console, json', 'console')
|
|
@@ -35,7 +35,7 @@ program
|
|
|
35
35
|
try {
|
|
36
36
|
// Define defaults
|
|
37
37
|
const defaults = {
|
|
38
|
-
tools: ['patterns', 'context'],
|
|
38
|
+
tools: ['patterns', 'context', 'consistency'],
|
|
39
39
|
include: undefined,
|
|
40
40
|
exclude: undefined,
|
|
41
41
|
output: {
|
|
@@ -46,7 +46,7 @@ program
|
|
|
46
46
|
|
|
47
47
|
// Load and merge config with CLI options
|
|
48
48
|
const baseOptions = loadMergedConfig(directory, defaults, {
|
|
49
|
-
tools: options.tools ? options.tools.split(',').map((t: string) => t.trim()) as ('patterns' | 'context')[] : undefined,
|
|
49
|
+
tools: options.tools ? options.tools.split(',').map((t: string) => t.trim()) as ('patterns' | 'context' | 'consistency')[] : undefined,
|
|
50
50
|
include: options.include?.split(','),
|
|
51
51
|
exclude: options.exclude?.split(','),
|
|
52
52
|
}) as any;
|
|
@@ -251,4 +251,113 @@ program
|
|
|
251
251
|
}
|
|
252
252
|
});
|
|
253
253
|
|
|
254
|
+
program
|
|
255
|
+
.command('consistency')
|
|
256
|
+
.description('Check naming, patterns, and architecture consistency')
|
|
257
|
+
.argument('<directory>', 'Directory to analyze')
|
|
258
|
+
.option('--naming', 'Check naming conventions (default: true)')
|
|
259
|
+
.option('--no-naming', 'Skip naming analysis')
|
|
260
|
+
.option('--patterns', 'Check code patterns (default: true)')
|
|
261
|
+
.option('--no-patterns', 'Skip pattern analysis')
|
|
262
|
+
.option('--min-severity <level>', 'Minimum severity: info|minor|major|critical', 'info')
|
|
263
|
+
.option('--include <patterns>', 'File patterns to include (comma-separated)')
|
|
264
|
+
.option('--exclude <patterns>', 'File patterns to exclude (comma-separated)')
|
|
265
|
+
.option('-o, --output <format>', 'Output format: console, json, markdown', 'console')
|
|
266
|
+
.option('--output-file <path>', 'Output file path (for json/markdown)')
|
|
267
|
+
.action(async (directory, options) => {
|
|
268
|
+
console.log(chalk.blue('🔍 Analyzing consistency...\n'));
|
|
269
|
+
|
|
270
|
+
const startTime = Date.now();
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
// Define defaults
|
|
274
|
+
const defaults = {
|
|
275
|
+
checkNaming: true,
|
|
276
|
+
checkPatterns: true,
|
|
277
|
+
minSeverity: 'info' as const,
|
|
278
|
+
include: undefined,
|
|
279
|
+
exclude: undefined,
|
|
280
|
+
output: {
|
|
281
|
+
format: 'console',
|
|
282
|
+
file: undefined,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// Load and merge config with CLI options
|
|
287
|
+
const finalOptions = loadMergedConfig(directory, defaults, {
|
|
288
|
+
checkNaming: options.naming !== false,
|
|
289
|
+
checkPatterns: options.patterns !== false,
|
|
290
|
+
minSeverity: options.minSeverity,
|
|
291
|
+
include: options.include?.split(','),
|
|
292
|
+
exclude: options.exclude?.split(','),
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
const { analyzeConsistency } = await import('@aiready/consistency');
|
|
296
|
+
|
|
297
|
+
const report = await analyzeConsistency(finalOptions);
|
|
298
|
+
|
|
299
|
+
const elapsedTime = getElapsedTime(startTime);
|
|
300
|
+
|
|
301
|
+
const outputFormat = options.output || finalOptions.output?.format || 'console';
|
|
302
|
+
const outputFile = options.outputFile || finalOptions.output?.file;
|
|
303
|
+
|
|
304
|
+
if (outputFormat === 'json') {
|
|
305
|
+
const outputData = {
|
|
306
|
+
...report,
|
|
307
|
+
summary: {
|
|
308
|
+
...report.summary,
|
|
309
|
+
executionTime: parseFloat(elapsedTime),
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
handleJSONOutput(outputData, outputFile, `✅ Results saved to ${outputFile}`);
|
|
314
|
+
} else if (outputFormat === 'markdown') {
|
|
315
|
+
// Markdown output
|
|
316
|
+
const markdown = generateMarkdownReport(report, elapsedTime);
|
|
317
|
+
if (outputFile) {
|
|
318
|
+
writeFileSync(outputFile, markdown);
|
|
319
|
+
console.log(chalk.green(`✅ Report saved to ${outputFile}`));
|
|
320
|
+
} else {
|
|
321
|
+
console.log(markdown);
|
|
322
|
+
}
|
|
323
|
+
} else {
|
|
324
|
+
console.log(`Consistency Analysis Complete (${elapsedTime}s)`);
|
|
325
|
+
console.log(`Files analyzed: ${report.summary.filesAnalyzed}`);
|
|
326
|
+
console.log(`Total issues: ${report.summary.totalIssues}`);
|
|
327
|
+
console.log(` Naming: ${report.summary.namingIssues}`);
|
|
328
|
+
console.log(` Patterns: ${report.summary.patternIssues}`);
|
|
329
|
+
|
|
330
|
+
if (report.recommendations.length > 0) {
|
|
331
|
+
console.log(chalk.bold('\n💡 Recommendations:'));
|
|
332
|
+
report.recommendations.forEach((rec, i) => {
|
|
333
|
+
console.log(`${i + 1}. ${rec}`);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
} catch (error) {
|
|
338
|
+
handleCLIError(error, 'Consistency analysis');
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
function generateMarkdownReport(report: any, elapsedTime: string): string {
|
|
343
|
+
let markdown = `# Consistency Analysis Report\n\n`;
|
|
344
|
+
markdown += `**Generated:** ${new Date().toISOString()}\n`;
|
|
345
|
+
markdown += `**Analysis Time:** ${elapsedTime}s\n\n`;
|
|
346
|
+
|
|
347
|
+
markdown += `## Summary\n\n`;
|
|
348
|
+
markdown += `- **Files Analyzed:** ${report.summary.filesAnalyzed}\n`;
|
|
349
|
+
markdown += `- **Total Issues:** ${report.summary.totalIssues}\n`;
|
|
350
|
+
markdown += ` - Naming: ${report.summary.namingIssues}\n`;
|
|
351
|
+
markdown += ` - Patterns: ${report.summary.patternIssues}\n\n`;
|
|
352
|
+
|
|
353
|
+
if (report.recommendations.length > 0) {
|
|
354
|
+
markdown += `## Recommendations\n\n`;
|
|
355
|
+
report.recommendations.forEach((rec: string, i: number) => {
|
|
356
|
+
markdown += `${i + 1}. ${rec}\n`;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return markdown;
|
|
361
|
+
}
|
|
362
|
+
|
|
254
363
|
program.parse();
|
package/src/index.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { analyzePatterns } from '@aiready/pattern-detect';
|
|
2
2
|
import { analyzeContext } from '@aiready/context-analyzer';
|
|
3
|
+
import { analyzeConsistency } from '@aiready/consistency';
|
|
3
4
|
import type { AnalysisResult, ScanOptions } from '@aiready/core';
|
|
4
5
|
import type { ContextAnalysisResult } from '@aiready/context-analyzer';
|
|
5
6
|
import type { PatternDetectOptions } from '@aiready/pattern-detect';
|
|
7
|
+
import type { ConsistencyReport } from '@aiready/consistency';
|
|
6
8
|
|
|
7
9
|
export interface UnifiedAnalysisOptions extends ScanOptions {
|
|
8
|
-
tools?: ('patterns' | 'context')[];
|
|
10
|
+
tools?: ('patterns' | 'context' | 'consistency')[];
|
|
9
11
|
minSimilarity?: number;
|
|
10
12
|
minLines?: number;
|
|
11
13
|
maxCandidatesPerBlock?: number;
|
|
@@ -16,6 +18,7 @@ export interface UnifiedAnalysisOptions extends ScanOptions {
|
|
|
16
18
|
export interface UnifiedAnalysisResult {
|
|
17
19
|
patterns?: AnalysisResult[];
|
|
18
20
|
context?: ContextAnalysisResult[];
|
|
21
|
+
consistency?: ConsistencyReport;
|
|
19
22
|
summary: {
|
|
20
23
|
totalIssues: number;
|
|
21
24
|
toolsRun: string[];
|
|
@@ -27,7 +30,7 @@ export async function analyzeUnified(
|
|
|
27
30
|
options: UnifiedAnalysisOptions
|
|
28
31
|
): Promise<UnifiedAnalysisResult> {
|
|
29
32
|
const startTime = Date.now();
|
|
30
|
-
const tools = options.tools || ['patterns', 'context'];
|
|
33
|
+
const tools = options.tools || ['patterns', 'context', 'consistency'];
|
|
31
34
|
const result: UnifiedAnalysisResult = {
|
|
32
35
|
summary: {
|
|
33
36
|
totalIssues: 0,
|
|
@@ -49,6 +52,20 @@ export async function analyzeUnified(
|
|
|
49
52
|
result.summary.totalIssues += result.context?.length || 0;
|
|
50
53
|
}
|
|
51
54
|
|
|
55
|
+
// Run consistency analysis
|
|
56
|
+
if (tools.includes('consistency')) {
|
|
57
|
+
const report = await analyzeConsistency({
|
|
58
|
+
rootDir: options.rootDir,
|
|
59
|
+
include: options.include,
|
|
60
|
+
exclude: options.exclude,
|
|
61
|
+
checkNaming: true,
|
|
62
|
+
checkPatterns: true,
|
|
63
|
+
minSeverity: 'info',
|
|
64
|
+
});
|
|
65
|
+
result.consistency = report;
|
|
66
|
+
result.summary.totalIssues += report.summary.totalIssues;
|
|
67
|
+
}
|
|
68
|
+
|
|
52
69
|
result.summary.executionTime = Date.now() - startTime;
|
|
53
70
|
return result;
|
|
54
71
|
}
|
|
@@ -69,5 +86,9 @@ export function generateUnifiedSummary(result: UnifiedAnalysisResult): string {
|
|
|
69
86
|
output += `🧠 Context Analysis: ${result.context.length} issues\n`;
|
|
70
87
|
}
|
|
71
88
|
|
|
89
|
+
if (result.consistency) {
|
|
90
|
+
output += `🏷️ Consistency Analysis: ${result.consistency.summary.totalIssues} issues\n`;
|
|
91
|
+
}
|
|
92
|
+
|
|
72
93
|
return output;
|
|
73
94
|
}
|