@aiready/cli 0.12.23 → 0.13.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/.turbo/turbo-build.log +8 -8
- package/.turbo/turbo-test.log +17 -17
- package/CONTRIBUTING.md +1 -1
- package/README.md +7 -1
- package/dist/cli.js +10 -1
- package/dist/cli.mjs +12 -2
- package/docs/SPOKE_GUIDE.md +184 -0
- package/package.json +12 -12
- package/src/.aiready/aiready-report-20260310-153526.json +34441 -0
- package/src/.aiready/aiready-report-20260310-155555.json +34441 -0
- package/src/.aiready/aiready-report-20260310-162403.json +34441 -0
- package/src/.aiready/aiready-report-20260310-183821.json +34448 -0
- package/src/.aiready/aiready-report-20260311-010454.json +34448 -0
- package/src/.aiready/aiready-report-20260311-193858.json +34448 -0
- package/src/commands/__tests__/scan.test.ts +4 -0
- package/src/commands/scan.ts +12 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/cli@0.
|
|
3
|
+
> @aiready/cli@0.13.1 build /Users/pengcao/projects/aiready/packages/cli
|
|
4
4
|
> tsup src/index.ts src/cli.ts --format cjs,esm
|
|
5
5
|
|
|
6
6
|
[34mCLI[39m Building entry: src/cli.ts, src/index.ts
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
[34mCJS[39m Build start
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
|
|
13
|
-
[
|
|
13
|
+
[43m[30m WARN [39m[49m [33m▲ [43;33m[[43;30mWARNING[43;33m][0m [1m"import.meta" is not available with the "cjs" output format and will be empty[0m [empty-import-meta] [90m7:38:32 pm[39m
|
|
14
14
|
|
|
15
15
|
src/cli.ts:32:31:
|
|
16
16
|
[37m 32 │ return dirname(fileURLToPath([32mimport.meta[37m.url));
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
[
|
|
24
|
-
[32mESM[39m [1mdist/chunk-VOKP7FGM.mjs [22m[32m9.52 KB[39m
|
|
25
|
-
[32mESM[39m [1mdist/cli.mjs [22m[32m66.64 KB[39m
|
|
26
|
-
[32mESM[39m ⚡️ Build success in 28ms
|
|
23
|
+
[32mCJS[39m [1mdist/cli.js [22m[32m80.29 KB[39m
|
|
27
24
|
[32mCJS[39m [1mdist/index.js [22m[32m10.62 KB[39m
|
|
28
|
-
[32mCJS[39m
|
|
29
|
-
[
|
|
25
|
+
[32mCJS[39m ⚡️ Build success in 77ms
|
|
26
|
+
[32mESM[39m [1mdist/cli.mjs [22m[32m66.94 KB[39m
|
|
27
|
+
[32mESM[39m [1mdist/chunk-VOKP7FGM.mjs [22m[32m9.52 KB[39m
|
|
28
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m170.00 B[39m
|
|
29
|
+
[32mESM[39m ⚡️ Build success in 77ms
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @aiready/cli@0.
|
|
3
|
+
> @aiready/cli@0.13.0 test /Users/pengcao/projects/aiready/packages/cli
|
|
4
4
|
> vitest run
|
|
5
5
|
|
|
6
6
|
[?25l
|
|
7
7
|
[1m[46m RUN [49m[22m [36mv4.0.18 [39m[90m/Users/pengcao/projects/aiready/packages/cli[39m
|
|
8
8
|
|
|
9
|
-
[32m✓[39m src/
|
|
10
|
-
[32m✓[39m src/commands/__tests__/ai-signal-clarity.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 8[2mms[22m[39m
|
|
11
|
-
[32m✓[39m src/commands/__tests__/deps-health.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
12
|
-
[32m✓[39m src/commands/__tests__/doc-drift.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
9
|
+
[32m✓[39m src/utils/__tests__/helpers.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
13
10
|
[90mstdout[2m | src/commands/__tests__/visualize.test.ts[2m > [22m[2mVisualize CLI Action[2m > [22m[2mshould generate HTML from specified report
|
|
14
11
|
[22m[39mBuilding graph from report...
|
|
15
12
|
|
|
16
|
-
[32m✓[39m src/commands/__tests__/
|
|
13
|
+
[32m✓[39m src/commands/__tests__/testability.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 14[2mms[22m[39m
|
|
14
|
+
[32m✓[39m src/commands/__tests__/ai-signal-clarity.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 13[2mms[22m[39m
|
|
15
|
+
[32m✓[39m src/commands/__tests__/deps-health.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 12[2mms[22m[39m
|
|
16
|
+
[32m✓[39m src/commands/__tests__/doc-drift.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
17
|
+
[32m✓[39m src/commands/__tests__/agent-grounding.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 25[2mms[22m[39m
|
|
17
18
|
[90mstdout[2m | src/commands/__tests__/visualize.test.ts[2m > [22m[2mVisualize CLI Action[2m > [22m[2mshould generate HTML from specified report
|
|
18
19
|
[22m[39mGenerating HTML...
|
|
19
20
|
✅ Visualization written to: /Users/pengcao/projects/aiready/packages/cli/visualization.html
|
|
@@ -41,8 +42,7 @@ Or specify a custom report:
|
|
|
41
42
|
[22m[39mGenerating HTML...
|
|
42
43
|
✅ Visualization written to: /Users/pengcao/projects/aiready/packages/cli/visualization.html
|
|
43
44
|
|
|
44
|
-
[32m✓[39m src/commands/__tests__/visualize.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
45
|
-
[32m✓[39m src/utils/__tests__/helpers.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
45
|
+
[32m✓[39m src/commands/__tests__/visualize.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 34[2mms[22m[39m
|
|
46
46
|
[90mstdout[2m | src/commands/__tests__/upload.test.ts[2m > [22m[2mUpload CLI Action[2m > [22m[2mshould fail if API key is missing
|
|
47
47
|
[22m[39m Set AIREADY_API_KEY environment variable or use --api-key flag.
|
|
48
48
|
Get an API key from https://platform.getaiready.dev/dashboard
|
|
@@ -59,17 +59,17 @@ Or specify a custom report:
|
|
|
59
59
|
|
|
60
60
|
[32m✓[39m src/commands/__tests__/upload.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
61
61
|
[32m✓[39m src/commands/__tests__/consistency.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 4[2mms[22m[39m
|
|
62
|
-
[32m✓[39m src/commands/__tests__/scan.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m
|
|
63
|
-
[32m✓[39m src/__tests__/unified.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m
|
|
64
|
-
[32m✓[39m src/commands/__tests__/extra-commands.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m
|
|
65
|
-
[32m✓[39m src/__tests__/cli.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m
|
|
66
|
-
[33m[2m✓[22m[39m should run unified analysis with both tools [33m
|
|
67
|
-
[32m✓[39m src/__tests__/config-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m
|
|
68
|
-
[33m[2m✓[22m[39m should generate a strictly portable AIReadyConfig in summary [33m
|
|
62
|
+
[32m✓[39m src/commands/__tests__/scan.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 77[2mms[22m[39m
|
|
63
|
+
[32m✓[39m src/__tests__/unified.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
64
|
+
[32m✓[39m src/commands/__tests__/extra-commands.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 93[2mms[22m[39m
|
|
65
|
+
[32m✓[39m src/__tests__/cli.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m 3317[2mms[22m[39m
|
|
66
|
+
[33m[2m✓[22m[39m should run unified analysis with both tools [33m 3316[2mms[22m[39m
|
|
67
|
+
[32m✓[39m src/__tests__/config-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m 3318[2mms[22m[39m
|
|
68
|
+
[33m[2m✓[22m[39m should generate a strictly portable AIReadyConfig in summary [33m 3316[2mms[22m[39m
|
|
69
69
|
|
|
70
70
|
[2m Test Files [22m [1m[32m14 passed[39m[22m[90m (14)[39m
|
|
71
71
|
[2m Tests [22m [1m[32m43 passed[39m[22m[90m (43)[39m
|
|
72
|
-
[2m Start at [22m
|
|
73
|
-
[2m Duration [22m
|
|
72
|
+
[2m Start at [22m 00:58:55
|
|
73
|
+
[2m Duration [22m 4.20s[2m (transform 1.99s, setup 0ms, import 4.11s, tests 6.94s, environment 1ms)[22m
|
|
74
74
|
|
|
75
75
|
[?25h
|
package/CONTRIBUTING.md
CHANGED
|
@@ -196,7 +196,7 @@ src/
|
|
|
196
196
|
Great places to start:
|
|
197
197
|
|
|
198
198
|
- **New commands**: Add new CLI commands
|
|
199
|
-
- **Tool integration**: Integrate new analysis tools
|
|
199
|
+
- **Tool integration**: Integrate new analysis tools. Follow the [Spoke Development Guide](./docs/SPOKE_GUIDE.md) for more details.
|
|
200
200
|
- **Output formats**: Add new output options (XML, CSV, HTML)
|
|
201
201
|
- **Configuration**: Improve config file handling
|
|
202
202
|
- **Performance**: Optimize for large codebases
|
package/README.md
CHANGED
|
@@ -50,10 +50,15 @@ aiready scan .
|
|
|
50
50
|
|
|
51
51
|
# Run a specific tool
|
|
52
52
|
aiready patterns . --similarity 0.6
|
|
53
|
-
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 🛠️ Building Your Own Tool (Spokes)
|
|
56
|
+
|
|
57
|
+
Want to build your own analysis tool that integrates with the AIReady ecosystem? Check out our [Spoke Development Guide](./docs/SPOKE_GUIDE.md).
|
|
54
58
|
|
|
55
59
|
## 🌐 Platform Integration
|
|
56
60
|
|
|
61
|
+
|
|
57
62
|
Connect your local scans to the [AIReady Dashboard](https://platform.getaiready.dev/dashboard).
|
|
58
63
|
|
|
59
64
|
### Automatic Upload
|
|
@@ -85,3 +90,4 @@ MIT
|
|
|
85
90
|
```
|
|
86
91
|
|
|
87
92
|
```
|
|
93
|
+
````
|
package/dist/cli.js
CHANGED
|
@@ -805,11 +805,20 @@ async function scanAction(directory, options) {
|
|
|
805
805
|
const failOnLevel = options.failOn || "critical";
|
|
806
806
|
let shouldFail = false;
|
|
807
807
|
let failReason = "";
|
|
808
|
+
const report = mapToUnifiedReport(results, scoringResult);
|
|
809
|
+
if (report.results && report.results.length > 0) {
|
|
810
|
+
console.log(
|
|
811
|
+
import_chalk3.default.cyan(
|
|
812
|
+
`
|
|
813
|
+
\u{1F4DD} Emitting GitHub Action annotations for ${report.results.length} issues...`
|
|
814
|
+
)
|
|
815
|
+
);
|
|
816
|
+
(0, import_core3.emitIssuesAsAnnotations)(report.results);
|
|
817
|
+
}
|
|
808
818
|
if (threshold && scoringResult.overall < threshold) {
|
|
809
819
|
shouldFail = true;
|
|
810
820
|
failReason = `Score ${scoringResult.overall} < threshold ${threshold}`;
|
|
811
821
|
}
|
|
812
|
-
const report = mapToUnifiedReport(results, scoringResult);
|
|
813
822
|
if (failOnLevel !== "none") {
|
|
814
823
|
if (failOnLevel === "critical" && report.summary.criticalIssues > 0) {
|
|
815
824
|
shouldFail = true;
|
package/dist/cli.mjs
CHANGED
|
@@ -25,7 +25,8 @@ import {
|
|
|
25
25
|
getRating,
|
|
26
26
|
getRepoMetadata,
|
|
27
27
|
Severity,
|
|
28
|
-
ToolName
|
|
28
|
+
ToolName,
|
|
29
|
+
emitIssuesAsAnnotations
|
|
29
30
|
} from "@aiready/core";
|
|
30
31
|
|
|
31
32
|
// src/utils/helpers.ts
|
|
@@ -543,11 +544,20 @@ async function scanAction(directory, options) {
|
|
|
543
544
|
const failOnLevel = options.failOn || "critical";
|
|
544
545
|
let shouldFail = false;
|
|
545
546
|
let failReason = "";
|
|
547
|
+
const report = mapToUnifiedReport(results, scoringResult);
|
|
548
|
+
if (report.results && report.results.length > 0) {
|
|
549
|
+
console.log(
|
|
550
|
+
chalk3.cyan(
|
|
551
|
+
`
|
|
552
|
+
\u{1F4DD} Emitting GitHub Action annotations for ${report.results.length} issues...`
|
|
553
|
+
)
|
|
554
|
+
);
|
|
555
|
+
emitIssuesAsAnnotations(report.results);
|
|
556
|
+
}
|
|
546
557
|
if (threshold && scoringResult.overall < threshold) {
|
|
547
558
|
shouldFail = true;
|
|
548
559
|
failReason = `Score ${scoringResult.overall} < threshold ${threshold}`;
|
|
549
560
|
}
|
|
550
|
-
const report = mapToUnifiedReport(results, scoringResult);
|
|
551
561
|
if (failOnLevel !== "none") {
|
|
552
562
|
if (failOnLevel === "critical" && report.summary.criticalIssues > 0) {
|
|
553
563
|
shouldFail = true;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Building a New AIReady Spoke
|
|
2
|
+
|
|
3
|
+
This guide explains how to build a new analysis tool ("spoke") and integrate it into the AIReady ecosystem. AIReady uses a hub-and-spoke architecture where independent tools are coordinated by a central CLI and Hub (@aiready/core).
|
|
4
|
+
|
|
5
|
+
## 🚀 Getting Started
|
|
6
|
+
|
|
7
|
+
### 1. Create Package Structure
|
|
8
|
+
|
|
9
|
+
If you are contributing to the monorepo:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
mkdir -p packages/your-tool/src
|
|
13
|
+
cd packages/your-tool
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### 2. Create `package.json`
|
|
17
|
+
|
|
18
|
+
Your tool should depend on `@aiready/core` for shared types and utilities.
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"name": "@aiready/your-tool",
|
|
23
|
+
"version": "0.1.0",
|
|
24
|
+
"description": "Brief description of what this tool does",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"module": "./dist/index.mjs",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"bin": {
|
|
29
|
+
"aiready-yourtool": "./dist/cli.js"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup src/index.ts src/cli.ts --format cjs,esm --dts",
|
|
33
|
+
"dev": "tsup src/index.ts src/cli.ts --format cjs,esm --dts --watch",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"lint": "eslint src",
|
|
36
|
+
"clean": "rm -rf dist"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@aiready/core": "workspace:*",
|
|
40
|
+
"commander": "^12.1.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"tsup": "^8.3.5"
|
|
44
|
+
},
|
|
45
|
+
"keywords": ["aiready", "your-keywords"],
|
|
46
|
+
"license": "MIT"
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 3. Implement the Analysis Logic
|
|
51
|
+
|
|
52
|
+
Create `src/analyzer.ts` to contain your core logic.
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { scanFiles, readFileContent } from '@aiready/core';
|
|
56
|
+
import type {
|
|
57
|
+
AnalysisResult,
|
|
58
|
+
Issue,
|
|
59
|
+
ScanOptions,
|
|
60
|
+
SpokeOutput,
|
|
61
|
+
} from '@aiready/core';
|
|
62
|
+
|
|
63
|
+
export async function analyzeYourTool(
|
|
64
|
+
options: ScanOptions
|
|
65
|
+
): Promise<SpokeOutput> {
|
|
66
|
+
const files = await scanFiles(options);
|
|
67
|
+
const results: AnalysisResult[] = [];
|
|
68
|
+
|
|
69
|
+
// Your analysis logic here
|
|
70
|
+
// 1. Iterate through files
|
|
71
|
+
// 2. Detect issues
|
|
72
|
+
// 3. Return standardized AnalysisResult[]
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
results,
|
|
76
|
+
summary: {
|
|
77
|
+
totalFiles: files.length,
|
|
78
|
+
totalIssues: results.reduce((acc, r) => acc + r.issues.length, 0),
|
|
79
|
+
// ... other summary stats
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4. Implement ToolProvider and Register
|
|
86
|
+
|
|
87
|
+
Every spoke must implement the `ToolProvider` interface and register with the global `ToolRegistry` so that it is automatically discovered by the unified CLI.
|
|
88
|
+
|
|
89
|
+
1. **Create `src/provider.ts`**:
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import {
|
|
93
|
+
ToolProvider,
|
|
94
|
+
ToolName,
|
|
95
|
+
SpokeOutput,
|
|
96
|
+
ScanOptions,
|
|
97
|
+
ToolScoringOutput,
|
|
98
|
+
} from '@aiready/core';
|
|
99
|
+
import { analyzeYourTool } from './analyzer';
|
|
100
|
+
|
|
101
|
+
export const YourToolProvider: ToolProvider = {
|
|
102
|
+
id: ToolName.YourToolID, // Use an existing ToolName or request a new one
|
|
103
|
+
alias: ['your-alias'],
|
|
104
|
+
|
|
105
|
+
async analyze(options: ScanOptions): Promise<SpokeOutput> {
|
|
106
|
+
const output = await analyzeYourTool(options);
|
|
107
|
+
return {
|
|
108
|
+
...output,
|
|
109
|
+
metadata: { toolName: ToolName.YourToolID, version: '0.1.0' },
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
score(output: SpokeOutput, options: ScanOptions): ToolScoringOutput {
|
|
114
|
+
// Implement scoring logic (0-100)
|
|
115
|
+
return {
|
|
116
|
+
score: 100, // Example
|
|
117
|
+
metrics: output.summary,
|
|
118
|
+
};
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
defaultWeight: 10,
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
2. **Register in `src/index.ts`**:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
import { ToolRegistry } from '@aiready/core';
|
|
129
|
+
import { YourToolProvider } from './provider';
|
|
130
|
+
|
|
131
|
+
// Register with global registry for automatic CLI discovery
|
|
132
|
+
ToolRegistry.register(YourToolProvider);
|
|
133
|
+
|
|
134
|
+
export { YourToolProvider };
|
|
135
|
+
export * from './analyzer';
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 5. Create Standalone CLI (`src/cli.ts`)
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
#!/usr/bin/env node
|
|
142
|
+
import { Command } from 'commander';
|
|
143
|
+
import { analyzeYourTool } from './analyzer';
|
|
144
|
+
import chalk from 'chalk';
|
|
145
|
+
|
|
146
|
+
const program = new Command();
|
|
147
|
+
|
|
148
|
+
program
|
|
149
|
+
.name('aiready-yourtool')
|
|
150
|
+
.description('Description of your tool')
|
|
151
|
+
.version('0.1.0')
|
|
152
|
+
.argument('<directory>', 'Directory to analyze')
|
|
153
|
+
.action(async (directory, options) => {
|
|
154
|
+
console.log(chalk.blue('🔍 Analyzing...\n'));
|
|
155
|
+
const output = await analyzeYourTool({ rootDir: directory });
|
|
156
|
+
console.log(JSON.stringify(output, null, 2));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
program.parse();
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 📋 Standard Specs to Follow
|
|
163
|
+
|
|
164
|
+
To ensure your tool integrates perfectly with the AIReady ecosystem, it must follow these rules:
|
|
165
|
+
|
|
166
|
+
1. **Standard Options**: Support `--include`, `--exclude`, and `--output` (standardized via `ScanOptions`).
|
|
167
|
+
2. **No Direct Dependencies**: Spokes should never depend on other spokes. Only depend on `@aiready/core`.
|
|
168
|
+
3. **Standard Issue Types**: Use `IssueType` from `@aiready/core` whenever possible.
|
|
169
|
+
4. **Severity Levels**: Use `critical`, `major`, `minor`, and `info`.
|
|
170
|
+
5. **Non-Blocking**: The `analyze` function should be asynchronous and handle large codebases efficiently.
|
|
171
|
+
|
|
172
|
+
## 🧪 Testing
|
|
173
|
+
|
|
174
|
+
Use `vitest` for unit and integration tests. Ensure you test your `ToolProvider` implementation using the `validateSpokeOutput` utility from `@aiready/core`.
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
import { validateSpokeOutput } from '@aiready/core/types/contract';
|
|
178
|
+
|
|
179
|
+
test('output matches AIReady contract', async () => {
|
|
180
|
+
const output = await analyzeYourTool({ rootDir: './test' });
|
|
181
|
+
const validation = validateSpokeOutput('your-tool', output);
|
|
182
|
+
expect(validation.valid).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "Unified CLI for AIReady analysis tools",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -11,18 +11,18 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"chalk": "^5.3.0",
|
|
13
13
|
"commander": "^14.0.0",
|
|
14
|
-
"@aiready/agent-grounding": "0.
|
|
14
|
+
"@aiready/agent-grounding": "0.12.0",
|
|
15
|
+
"@aiready/context-analyzer": "0.20.0",
|
|
16
|
+
"@aiready/core": "0.22.0",
|
|
17
|
+
"@aiready/deps": "0.12.0",
|
|
18
|
+
"@aiready/consistency": "0.19.0",
|
|
15
19
|
"@aiready/clawmart": "0.1.2",
|
|
16
|
-
"@aiready/
|
|
17
|
-
"@aiready/
|
|
18
|
-
"@aiready/
|
|
19
|
-
"@aiready/
|
|
20
|
-
"@aiready/ai-signal-clarity": "0.
|
|
21
|
-
"@aiready/
|
|
22
|
-
"@aiready/change-amplification": "0.11.21",
|
|
23
|
-
"@aiready/visualizer": "0.4.22",
|
|
24
|
-
"@aiready/deps": "0.11.21",
|
|
25
|
-
"@aiready/testability": "0.4.21"
|
|
20
|
+
"@aiready/doc-drift": "0.12.0",
|
|
21
|
+
"@aiready/change-amplification": "0.12.0",
|
|
22
|
+
"@aiready/testability": "0.5.0",
|
|
23
|
+
"@aiready/pattern-detect": "0.15.0",
|
|
24
|
+
"@aiready/ai-signal-clarity": "0.12.0",
|
|
25
|
+
"@aiready/visualizer": "0.5.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^24.0.0",
|