check-my-toolkit 0.1.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/README.md +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +116 -0
- package/dist/cli.js.map +1 -0
- package/dist/code/audit.d.ts +14 -0
- package/dist/code/audit.d.ts.map +1 -0
- package/dist/code/audit.js +130 -0
- package/dist/code/audit.js.map +1 -0
- package/dist/code/index.d.ts +13 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +49 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code/linting.d.ts +10 -0
- package/dist/code/linting.d.ts.map +1 -0
- package/dist/code/linting.js +233 -0
- package/dist/code/linting.js.map +1 -0
- package/dist/code/tools/base.d.ts +52 -0
- package/dist/code/tools/base.d.ts.map +1 -0
- package/dist/code/tools/base.js +83 -0
- package/dist/code/tools/base.js.map +1 -0
- package/dist/code/tools/eslint.d.ts +15 -0
- package/dist/code/tools/eslint.d.ts.map +1 -0
- package/dist/code/tools/eslint.js +79 -0
- package/dist/code/tools/eslint.js.map +1 -0
- package/dist/code/tools/index.d.ts +5 -0
- package/dist/code/tools/index.d.ts.map +1 -0
- package/dist/code/tools/index.js +5 -0
- package/dist/code/tools/index.js.map +1 -0
- package/dist/code/tools/ruff.d.ts +26 -0
- package/dist/code/tools/ruff.d.ts.map +1 -0
- package/dist/code/tools/ruff.js +149 -0
- package/dist/code/tools/ruff.js.map +1 -0
- package/dist/code/tools/tsc.d.ts +20 -0
- package/dist/code/tools/tsc.d.ts.map +1 -0
- package/dist/code/tools/tsc.js +90 -0
- package/dist/code/tools/tsc.js.map +1 -0
- package/dist/code/types.d.ts +6 -0
- package/dist/code/types.d.ts.map +1 -0
- package/dist/code/types.js +132 -0
- package/dist/code/types.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +118 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +1217 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +190 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/output/index.d.ts +15 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +98 -0
- package/dist/output/index.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +116 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/code/index.d.ts +13 -0
- package/dist/src/code/index.d.ts.map +1 -0
- package/dist/src/code/index.js +53 -0
- package/dist/src/code/index.js.map +1 -0
- package/dist/src/code/tools/base.d.ts +52 -0
- package/dist/src/code/tools/base.d.ts.map +1 -0
- package/dist/src/code/tools/base.js +83 -0
- package/dist/src/code/tools/base.js.map +1 -0
- package/dist/src/code/tools/eslint.d.ts +15 -0
- package/dist/src/code/tools/eslint.d.ts.map +1 -0
- package/dist/src/code/tools/eslint.js +79 -0
- package/dist/src/code/tools/eslint.js.map +1 -0
- package/dist/src/code/tools/index.d.ts +5 -0
- package/dist/src/code/tools/index.d.ts.map +1 -0
- package/dist/src/code/tools/index.js +5 -0
- package/dist/src/code/tools/index.js.map +1 -0
- package/dist/src/code/tools/ruff.d.ts +26 -0
- package/dist/src/code/tools/ruff.d.ts.map +1 -0
- package/dist/src/code/tools/ruff.js +149 -0
- package/dist/src/code/tools/ruff.js.map +1 -0
- package/dist/src/code/tools/tsc.d.ts +21 -0
- package/dist/src/code/tools/tsc.d.ts.map +1 -0
- package/dist/src/code/tools/tsc.js +94 -0
- package/dist/src/code/tools/tsc.js.map +1 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +3 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/loader.d.ts +22 -0
- package/dist/src/config/loader.d.ts.map +1 -0
- package/dist/src/config/loader.js +124 -0
- package/dist/src/config/loader.js.map +1 -0
- package/dist/src/config/schema.d.ts +503 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +190 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/output/index.d.ts +15 -0
- package/dist/src/output/index.d.ts.map +1 -0
- package/dist/src/output/index.js +96 -0
- package/dist/src/output/index.js.map +1 -0
- package/dist/src/types/index.d.ts +96 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +89 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/tests/e2e/e2e.test.d.ts +2 -0
- package/dist/tests/e2e/e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/e2e.test.js +398 -0
- package/dist/tests/e2e/e2e.test.js.map +1 -0
- package/dist/types/index.d.ts +96 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +89 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
const testCases = [
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Linting: Violations expected
|
|
6
|
+
// ============================================================
|
|
7
|
+
{
|
|
8
|
+
name: "default project with ESLint and Ruff violations",
|
|
9
|
+
config: "tests/e2e/projects/default/check.toml",
|
|
10
|
+
command: "check",
|
|
11
|
+
expectedExitCode: 1,
|
|
12
|
+
expectedPatterns: ["✗ ESLint:", "✗ Ruff:", "violation(s) found"],
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "typescript/default with ESLint violation",
|
|
16
|
+
config: "tests/e2e/projects/typescript/default/check.toml",
|
|
17
|
+
command: "check",
|
|
18
|
+
expectedExitCode: 1,
|
|
19
|
+
expectedPatterns: ["✗ ESLint:", "no-var"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "typescript/multi-violations with multiple ESLint errors",
|
|
23
|
+
config: "tests/e2e/projects/typescript/multi-violations/check.toml",
|
|
24
|
+
command: "check",
|
|
25
|
+
expectedExitCode: 1,
|
|
26
|
+
expectedPatterns: ["✗ ESLint: 9 violation(s)", "no-var", "prefer-const", "eqeqeq"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "typescript/nested-dirs finds violations in subdirectories",
|
|
30
|
+
config: "tests/e2e/projects/typescript/nested-dirs/check.toml",
|
|
31
|
+
command: "check",
|
|
32
|
+
expectedExitCode: 1,
|
|
33
|
+
expectedPatterns: ["✗ ESLint: 2 violation(s)", "lib/legacy.ts", "src/utils/helpers.ts"],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "typescript/special-chars handles special filenames",
|
|
37
|
+
config: "tests/e2e/projects/typescript/special-chars/check.toml",
|
|
38
|
+
command: "check",
|
|
39
|
+
expectedExitCode: 1,
|
|
40
|
+
expectedPatterns: ["file-with-dashes.ts", "file.multiple.dots.ts", "file_with_underscores.ts"],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "python/default with Ruff violations",
|
|
44
|
+
config: "tests/e2e/projects/python/default/check.toml",
|
|
45
|
+
command: "check",
|
|
46
|
+
expectedExitCode: 1,
|
|
47
|
+
expectedPatterns: ["✗ Ruff:", "F401", "imported but unused"],
|
|
48
|
+
},
|
|
49
|
+
// ============================================================
|
|
50
|
+
// Linting: Should pass
|
|
51
|
+
// ============================================================
|
|
52
|
+
{
|
|
53
|
+
name: "typescript/clean-project passes all checks",
|
|
54
|
+
config: "tests/e2e/projects/typescript/clean-project/check.toml",
|
|
55
|
+
command: "check",
|
|
56
|
+
expectedExitCode: 0,
|
|
57
|
+
expectedPatterns: ["✓ ESLint: passed", "✓ All checks passed"],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "typescript/without-tsc passes when tsc disabled",
|
|
61
|
+
config: "tests/e2e/projects/typescript/without-tsc/check.toml",
|
|
62
|
+
command: "check",
|
|
63
|
+
expectedExitCode: 0,
|
|
64
|
+
expectedPatterns: ["✓ ESLint: passed"],
|
|
65
|
+
notExpectedPatterns: ["TypeScript"],
|
|
66
|
+
},
|
|
67
|
+
// ============================================================
|
|
68
|
+
// Tools disabled
|
|
69
|
+
// ============================================================
|
|
70
|
+
{
|
|
71
|
+
name: "typescript/with-tools-disabled skips ESLint when disabled",
|
|
72
|
+
config: "tests/e2e/projects/typescript/with-tools-disabled/check.toml",
|
|
73
|
+
command: "check",
|
|
74
|
+
expectedExitCode: 0,
|
|
75
|
+
expectedPatterns: ["○ CODE", "✓ All checks passed"],
|
|
76
|
+
notExpectedPatterns: ["ESLint"],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "python/with-tools-disabled skips Ruff when disabled",
|
|
80
|
+
config: "tests/e2e/projects/python/with-tools-disabled/check.toml",
|
|
81
|
+
command: "check",
|
|
82
|
+
expectedExitCode: 0,
|
|
83
|
+
expectedPatterns: ["○ CODE", "✓ All checks passed"],
|
|
84
|
+
notExpectedPatterns: ["Ruff"],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: "mixed-extensions with both linters disabled",
|
|
88
|
+
config: "tests/e2e/projects/mixed-extensions/check.toml",
|
|
89
|
+
command: "check",
|
|
90
|
+
expectedExitCode: 0,
|
|
91
|
+
expectedPatterns: ["○ CODE"],
|
|
92
|
+
},
|
|
93
|
+
// ============================================================
|
|
94
|
+
// TypeScript type checking
|
|
95
|
+
// ============================================================
|
|
96
|
+
{
|
|
97
|
+
name: "typescript/with-tsc-enabled catches type errors",
|
|
98
|
+
config: "tests/e2e/projects/typescript/with-tsc-enabled/check.toml",
|
|
99
|
+
command: "check",
|
|
100
|
+
expectedExitCode: 1,
|
|
101
|
+
expectedPatterns: ["✗ TypeScript:", "TS2345"],
|
|
102
|
+
},
|
|
103
|
+
// ============================================================
|
|
104
|
+
// Empty/missing configs
|
|
105
|
+
// ============================================================
|
|
106
|
+
{
|
|
107
|
+
name: "typescript/empty-project skips when no ESLint config",
|
|
108
|
+
config: "tests/e2e/projects/typescript/empty-project/check.toml",
|
|
109
|
+
command: "check",
|
|
110
|
+
expectedExitCode: 0,
|
|
111
|
+
expectedPatterns: ["skipped - No ESLint config found"],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "config-errors/missing-name handles missing project name",
|
|
115
|
+
config: "tests/e2e/projects/config-errors/missing-name/check.toml",
|
|
116
|
+
command: "check",
|
|
117
|
+
expectedExitCode: 0,
|
|
118
|
+
expectedPatterns: ["✓ All checks passed"],
|
|
119
|
+
},
|
|
120
|
+
// ============================================================
|
|
121
|
+
// Config errors
|
|
122
|
+
// ============================================================
|
|
123
|
+
{
|
|
124
|
+
name: "config-errors/invalid-toml rejects invalid TOML",
|
|
125
|
+
config: "tests/e2e/projects/config-errors/invalid-toml/check.toml",
|
|
126
|
+
command: "validate",
|
|
127
|
+
expectedExitCode: 2,
|
|
128
|
+
expectedPatterns: ["✗ Invalid:", "Failed to parse"],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "config-errors/broken-eslint reports ESLint config error",
|
|
132
|
+
config: "tests/e2e/projects/config-errors/broken-eslint/check.toml",
|
|
133
|
+
command: "check",
|
|
134
|
+
expectedExitCode: 1,
|
|
135
|
+
expectedPatterns: ["ESLint error"],
|
|
136
|
+
},
|
|
137
|
+
// ============================================================
|
|
138
|
+
// Audit command
|
|
139
|
+
// ============================================================
|
|
140
|
+
{
|
|
141
|
+
name: "audit finds missing Ruff config",
|
|
142
|
+
config: "tests/e2e/projects/typescript/default/check.toml",
|
|
143
|
+
command: "audit",
|
|
144
|
+
expectedExitCode: 1,
|
|
145
|
+
expectedPatterns: ["✗ Ruff Config:", "Ruff config not found"],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: "audit passes when ESLint config exists",
|
|
149
|
+
config: "tests/e2e/projects/audit-warnings/eslint-mismatch/check.toml",
|
|
150
|
+
command: "audit",
|
|
151
|
+
expectedExitCode: 0,
|
|
152
|
+
expectedPatterns: ["✓ ESLint Config: passed"],
|
|
153
|
+
},
|
|
154
|
+
// ============================================================
|
|
155
|
+
// Validate command
|
|
156
|
+
// ============================================================
|
|
157
|
+
{
|
|
158
|
+
name: "validate accepts valid config",
|
|
159
|
+
config: "tests/e2e/projects/typescript/clean-project/check.toml",
|
|
160
|
+
command: "validate",
|
|
161
|
+
expectedExitCode: 0,
|
|
162
|
+
expectedPatterns: ["✓ Valid:"],
|
|
163
|
+
},
|
|
164
|
+
// ============================================================
|
|
165
|
+
// Complexity limits (not implemented yet - should skip)
|
|
166
|
+
// ============================================================
|
|
167
|
+
{
|
|
168
|
+
name: "limits-file-lines skips (not implemented)",
|
|
169
|
+
config: "tests/e2e/projects/limits-file-lines/check.toml",
|
|
170
|
+
command: "check",
|
|
171
|
+
expectedExitCode: 0,
|
|
172
|
+
expectedPatterns: ["○ CODE"],
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "limits-function-lines skips (not implemented)",
|
|
176
|
+
config: "tests/e2e/projects/limits-function-lines/check.toml",
|
|
177
|
+
command: "check",
|
|
178
|
+
expectedExitCode: 0,
|
|
179
|
+
expectedPatterns: ["○ CODE"],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: "limits-nesting skips (not implemented)",
|
|
183
|
+
config: "tests/e2e/projects/limits-nesting/check.toml",
|
|
184
|
+
command: "check",
|
|
185
|
+
expectedExitCode: 0,
|
|
186
|
+
expectedPatterns: ["○ CODE"],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: "limits-parameters skips (not implemented)",
|
|
190
|
+
config: "tests/e2e/projects/limits-parameters/check.toml",
|
|
191
|
+
command: "check",
|
|
192
|
+
expectedExitCode: 0,
|
|
193
|
+
expectedPatterns: ["○ CODE"],
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: "limits-pass skips (not implemented)",
|
|
197
|
+
config: "tests/e2e/projects/limits-pass/check.toml",
|
|
198
|
+
command: "check",
|
|
199
|
+
expectedExitCode: 0,
|
|
200
|
+
expectedPatterns: ["○ CODE"],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
name: "limits-skip skips (not implemented)",
|
|
204
|
+
config: "tests/e2e/projects/limits-skip/check.toml",
|
|
205
|
+
command: "check",
|
|
206
|
+
expectedExitCode: 0,
|
|
207
|
+
expectedPatterns: ["○ CODE"],
|
|
208
|
+
},
|
|
209
|
+
// ============================================================
|
|
210
|
+
// Requirements (files check not implemented yet)
|
|
211
|
+
// ============================================================
|
|
212
|
+
{
|
|
213
|
+
name: "requirements-skip with no linters",
|
|
214
|
+
config: "tests/e2e/projects/requirements-skip/check.toml",
|
|
215
|
+
command: "check",
|
|
216
|
+
expectedExitCode: 0,
|
|
217
|
+
expectedPatterns: ["○ CODE"],
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "requirements-missing-files with no linters",
|
|
221
|
+
config: "tests/e2e/projects/requirements-missing-files/check.toml",
|
|
222
|
+
command: "check",
|
|
223
|
+
expectedExitCode: 0,
|
|
224
|
+
expectedPatterns: ["○ CODE"],
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: "requirements-pass with no linters",
|
|
228
|
+
config: "tests/e2e/projects/requirements-pass/check.toml",
|
|
229
|
+
command: "check",
|
|
230
|
+
expectedExitCode: 0,
|
|
231
|
+
expectedPatterns: ["○ CODE"],
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
name: "requirements-missing-tools with no linters",
|
|
235
|
+
config: "tests/e2e/projects/requirements-missing-tools/check.toml",
|
|
236
|
+
command: "check",
|
|
237
|
+
expectedExitCode: 0,
|
|
238
|
+
expectedPatterns: ["○ CODE"],
|
|
239
|
+
},
|
|
240
|
+
// ============================================================
|
|
241
|
+
// Additional edge cases
|
|
242
|
+
// ============================================================
|
|
243
|
+
{
|
|
244
|
+
name: "typescript/symlinks handles symlinks",
|
|
245
|
+
config: "tests/e2e/projects/typescript/symlinks/check.toml",
|
|
246
|
+
command: "check",
|
|
247
|
+
expectedExitCode: 1,
|
|
248
|
+
expectedPatterns: ["✗ ESLint:", "actual.ts"],
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
name: "typescript/with-ignored-dirs finds violations",
|
|
252
|
+
config: "tests/e2e/projects/typescript/with-ignored-dirs/check.toml",
|
|
253
|
+
command: "check",
|
|
254
|
+
expectedExitCode: 1,
|
|
255
|
+
expectedPatterns: ["✗ ESLint:"],
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
name: "typescript/with-files-config runs ESLint",
|
|
259
|
+
config: "tests/e2e/projects/typescript/with-files-config/check.toml",
|
|
260
|
+
command: "check",
|
|
261
|
+
expectedExitCode: 1,
|
|
262
|
+
expectedPatterns: ["✗ ESLint:"],
|
|
263
|
+
},
|
|
264
|
+
// ============================================================
|
|
265
|
+
// JSON output format
|
|
266
|
+
// ============================================================
|
|
267
|
+
{
|
|
268
|
+
name: "check with JSON output format",
|
|
269
|
+
config: "tests/e2e/projects/typescript/default/check.toml",
|
|
270
|
+
command: "check",
|
|
271
|
+
format: "json",
|
|
272
|
+
expectedExitCode: 1,
|
|
273
|
+
expectedPatterns: ['"version":', '"domains":', '"code":', '"violations":'],
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
name: "validate with JSON output format - valid",
|
|
277
|
+
config: "tests/e2e/projects/typescript/clean-project/check.toml",
|
|
278
|
+
command: "validate",
|
|
279
|
+
format: "json",
|
|
280
|
+
expectedExitCode: 0,
|
|
281
|
+
expectedPatterns: ['"valid": true', '"configPath":'],
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
name: "validate with JSON output format - invalid",
|
|
285
|
+
config: "tests/e2e/projects/config-errors/invalid-toml/check.toml",
|
|
286
|
+
command: "validate",
|
|
287
|
+
format: "json",
|
|
288
|
+
expectedExitCode: 2,
|
|
289
|
+
expectedPatterns: ['"valid": false', '"error":'],
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: "audit with JSON output format",
|
|
293
|
+
config: "tests/e2e/projects/typescript/clean-project/check.toml",
|
|
294
|
+
command: "audit",
|
|
295
|
+
format: "json",
|
|
296
|
+
expectedExitCode: 0,
|
|
297
|
+
expectedPatterns: ['"version":', '"domains":', '"summary":'],
|
|
298
|
+
},
|
|
299
|
+
// ============================================================
|
|
300
|
+
// Python clean project
|
|
301
|
+
// ============================================================
|
|
302
|
+
{
|
|
303
|
+
name: "python/clean-project passes Ruff checks",
|
|
304
|
+
config: "tests/e2e/projects/python/clean-project/check.toml",
|
|
305
|
+
command: "check",
|
|
306
|
+
expectedExitCode: 0,
|
|
307
|
+
expectedPatterns: ["✓ Ruff: passed", "✓ All checks passed"],
|
|
308
|
+
},
|
|
309
|
+
// ============================================================
|
|
310
|
+
// Mixed TypeScript + Python project
|
|
311
|
+
// ============================================================
|
|
312
|
+
{
|
|
313
|
+
name: "mixed-ts-python catches violations in both languages",
|
|
314
|
+
config: "tests/e2e/projects/mixed-ts-python/check.toml",
|
|
315
|
+
command: "check",
|
|
316
|
+
expectedExitCode: 1,
|
|
317
|
+
expectedPatterns: ["✗ ESLint:", "✗ Ruff:", "no-var", "F401"],
|
|
318
|
+
},
|
|
319
|
+
// ============================================================
|
|
320
|
+
// TypeScript type checking - clean
|
|
321
|
+
// ============================================================
|
|
322
|
+
{
|
|
323
|
+
name: "typescript/tsc-clean passes type checking",
|
|
324
|
+
config: "tests/e2e/projects/typescript/tsc-clean/check.toml",
|
|
325
|
+
command: "check",
|
|
326
|
+
expectedExitCode: 0,
|
|
327
|
+
expectedPatterns: ["✓ TypeScript: passed"],
|
|
328
|
+
},
|
|
329
|
+
// ============================================================
|
|
330
|
+
// Custom ESLint rules
|
|
331
|
+
// ============================================================
|
|
332
|
+
{
|
|
333
|
+
name: "typescript/with-custom-rules catches custom rule violations",
|
|
334
|
+
config: "tests/e2e/projects/typescript/with-custom-rules/check.toml",
|
|
335
|
+
command: "check",
|
|
336
|
+
expectedExitCode: 1,
|
|
337
|
+
expectedPatterns: ["✗ ESLint:", "no-console", "eqeqeq"],
|
|
338
|
+
},
|
|
339
|
+
// ============================================================
|
|
340
|
+
// Ruff with select/ignore
|
|
341
|
+
// ============================================================
|
|
342
|
+
{
|
|
343
|
+
name: "python/with-select-ignore uses select and ignore",
|
|
344
|
+
config: "tests/e2e/projects/python/with-select-ignore/check.toml",
|
|
345
|
+
command: "check",
|
|
346
|
+
expectedExitCode: 1,
|
|
347
|
+
expectedPatterns: ["✗ Ruff:", "F401"],
|
|
348
|
+
notExpectedPatterns: ["E501"],
|
|
349
|
+
},
|
|
350
|
+
// ============================================================
|
|
351
|
+
// Missing config file
|
|
352
|
+
// ============================================================
|
|
353
|
+
{
|
|
354
|
+
name: "config-errors/no-config returns error for missing config",
|
|
355
|
+
config: "tests/e2e/projects/config-errors/no-config/nonexistent.toml",
|
|
356
|
+
command: "check",
|
|
357
|
+
expectedExitCode: 2,
|
|
358
|
+
expectedPatterns: ["Config error:", "not found"],
|
|
359
|
+
},
|
|
360
|
+
];
|
|
361
|
+
function runCli(command, config, format = "text") {
|
|
362
|
+
const formatArg = format !== "text" ? ` -f ${format}` : "";
|
|
363
|
+
const cmd = command === "validate"
|
|
364
|
+
? `node dist/cli.js validate -c "${config}"${formatArg}`
|
|
365
|
+
: `node dist/cli.js code ${command} -c "${config}"${formatArg}`;
|
|
366
|
+
try {
|
|
367
|
+
const stdout = execSync(cmd, {
|
|
368
|
+
encoding: "utf-8",
|
|
369
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
370
|
+
});
|
|
371
|
+
return { stdout, exitCode: 0 };
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
const execError = error;
|
|
375
|
+
const stdout = (execError.stdout || "") + (execError.stderr || "");
|
|
376
|
+
return { stdout, exitCode: execError.status ?? 1 };
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
describe("E2E Tests", () => {
|
|
380
|
+
for (const tc of testCases) {
|
|
381
|
+
it.concurrent(tc.name, async () => {
|
|
382
|
+
const { stdout, exitCode } = runCli(tc.command, tc.config, tc.format);
|
|
383
|
+
// Check exit code
|
|
384
|
+
expect(exitCode, `Expected exit code ${tc.expectedExitCode}, got ${exitCode}\nOutput:\n${stdout}`).toBe(tc.expectedExitCode);
|
|
385
|
+
// Check expected patterns
|
|
386
|
+
for (const pattern of tc.expectedPatterns) {
|
|
387
|
+
expect(stdout, `Expected output to contain "${pattern}"\nOutput:\n${stdout}`).toContain(pattern);
|
|
388
|
+
}
|
|
389
|
+
// Check patterns that should NOT be present
|
|
390
|
+
if (tc.notExpectedPatterns) {
|
|
391
|
+
for (const pattern of tc.notExpectedPatterns) {
|
|
392
|
+
expect(stdout, `Expected output to NOT contain "${pattern}"\nOutput:\n${stdout}`).not.toContain(pattern);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
//# sourceMappingURL=e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.test.js","sourceRoot":"","sources":["../../../tests/e2e/e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for check-my-toolkit
|
|
3
|
+
*/
|
|
4
|
+
/** Severity levels for violations */
|
|
5
|
+
export type Severity = "error" | "warning";
|
|
6
|
+
/** Status for domain results */
|
|
7
|
+
export type DomainStatus = "pass" | "fail" | "skip";
|
|
8
|
+
/** A single violation found by a check */
|
|
9
|
+
export interface Violation {
|
|
10
|
+
rule: string;
|
|
11
|
+
tool: string;
|
|
12
|
+
file?: string;
|
|
13
|
+
line?: number;
|
|
14
|
+
column?: number;
|
|
15
|
+
message: string;
|
|
16
|
+
code?: string;
|
|
17
|
+
severity: Severity;
|
|
18
|
+
}
|
|
19
|
+
/** Result of running a single check */
|
|
20
|
+
export interface CheckResult {
|
|
21
|
+
name: string;
|
|
22
|
+
rule: string;
|
|
23
|
+
passed: boolean;
|
|
24
|
+
violations: Violation[];
|
|
25
|
+
skipped: boolean;
|
|
26
|
+
skipReason?: string;
|
|
27
|
+
duration?: number;
|
|
28
|
+
}
|
|
29
|
+
/** Result of running all checks in a domain */
|
|
30
|
+
export interface DomainResult {
|
|
31
|
+
domain: string;
|
|
32
|
+
status: DomainStatus;
|
|
33
|
+
checks: CheckResult[];
|
|
34
|
+
violationCount: number;
|
|
35
|
+
}
|
|
36
|
+
/** Full result of cm check or cm audit */
|
|
37
|
+
export interface FullResult {
|
|
38
|
+
version: string;
|
|
39
|
+
configPath: string;
|
|
40
|
+
domains: Record<string, DomainResult>;
|
|
41
|
+
summary: {
|
|
42
|
+
totalViolations: number;
|
|
43
|
+
exitCode: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Interface for tool runners (ESLint, Ruff, tsc, etc.) */
|
|
47
|
+
export interface IToolRunner {
|
|
48
|
+
/** Display name of the tool */
|
|
49
|
+
readonly name: string;
|
|
50
|
+
/** Rule category (e.g., "code.linting") */
|
|
51
|
+
readonly rule: string;
|
|
52
|
+
/** Tool identifier for violations */
|
|
53
|
+
readonly toolId: string;
|
|
54
|
+
/** Config file patterns to look for */
|
|
55
|
+
readonly configFiles: string[];
|
|
56
|
+
/** Run the tool and return check results */
|
|
57
|
+
run(projectRoot: string): Promise<CheckResult>;
|
|
58
|
+
/** Audit that config exists without running the tool */
|
|
59
|
+
audit(projectRoot: string): Promise<CheckResult>;
|
|
60
|
+
}
|
|
61
|
+
/** Options for creating a violation */
|
|
62
|
+
export interface ViolationOptions {
|
|
63
|
+
rule: string;
|
|
64
|
+
tool: string;
|
|
65
|
+
message: string;
|
|
66
|
+
severity: Severity;
|
|
67
|
+
file?: string;
|
|
68
|
+
line?: number;
|
|
69
|
+
column?: number;
|
|
70
|
+
code?: string;
|
|
71
|
+
}
|
|
72
|
+
/** Builder for creating Violation objects */
|
|
73
|
+
export declare const Violation: {
|
|
74
|
+
create(options: ViolationOptions): Violation;
|
|
75
|
+
error(rule: string, tool: string, message: string, code?: string): Violation;
|
|
76
|
+
warning(rule: string, tool: string, message: string, code?: string): Violation;
|
|
77
|
+
};
|
|
78
|
+
/** Builder for creating CheckResult objects */
|
|
79
|
+
export declare const CheckResult: {
|
|
80
|
+
pass(name: string, rule: string, duration?: number): CheckResult;
|
|
81
|
+
fail(name: string, rule: string, violations: Violation[], duration?: number): CheckResult;
|
|
82
|
+
skip(name: string, rule: string, reason: string, duration?: number): CheckResult;
|
|
83
|
+
fromViolations(name: string, rule: string, violations: Violation[], duration?: number): CheckResult;
|
|
84
|
+
};
|
|
85
|
+
/** Builder for creating DomainResult objects */
|
|
86
|
+
export declare const DomainResult: {
|
|
87
|
+
fromChecks(domain: string, checks: CheckResult[]): DomainResult;
|
|
88
|
+
};
|
|
89
|
+
export declare const ExitCode: {
|
|
90
|
+
readonly SUCCESS: 0;
|
|
91
|
+
readonly VIOLATIONS_FOUND: 1;
|
|
92
|
+
readonly CONFIG_ERROR: 2;
|
|
93
|
+
readonly RUNTIME_ERROR: 3;
|
|
94
|
+
};
|
|
95
|
+
export type ExitCodeType = (typeof ExitCode)[keyof typeof ExitCode];
|
|
96
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for check-my-toolkit
|
|
3
|
+
*/
|
|
4
|
+
/** Builder for creating Violation objects */
|
|
5
|
+
export const Violation = {
|
|
6
|
+
create(options) {
|
|
7
|
+
return {
|
|
8
|
+
rule: options.rule,
|
|
9
|
+
tool: options.tool,
|
|
10
|
+
message: options.message,
|
|
11
|
+
severity: options.severity,
|
|
12
|
+
...(options.file && { file: options.file }),
|
|
13
|
+
...(options.line && { line: options.line }),
|
|
14
|
+
...(options.column && { column: options.column }),
|
|
15
|
+
...(options.code && { code: options.code }),
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
error(rule, tool, message, code) {
|
|
19
|
+
return { rule, tool, message, severity: "error", code };
|
|
20
|
+
},
|
|
21
|
+
warning(rule, tool, message, code) {
|
|
22
|
+
return { rule, tool, message, severity: "warning", code };
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/** Builder for creating CheckResult objects */
|
|
26
|
+
export const CheckResult = {
|
|
27
|
+
pass(name, rule, duration) {
|
|
28
|
+
return {
|
|
29
|
+
name,
|
|
30
|
+
rule,
|
|
31
|
+
passed: true,
|
|
32
|
+
violations: [],
|
|
33
|
+
skipped: false,
|
|
34
|
+
duration,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
fail(name, rule, violations, duration) {
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
rule,
|
|
41
|
+
passed: false,
|
|
42
|
+
violations,
|
|
43
|
+
skipped: false,
|
|
44
|
+
duration,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
skip(name, rule, reason, duration) {
|
|
48
|
+
return {
|
|
49
|
+
name,
|
|
50
|
+
rule,
|
|
51
|
+
passed: true,
|
|
52
|
+
violations: [],
|
|
53
|
+
skipped: true,
|
|
54
|
+
skipReason: reason,
|
|
55
|
+
duration,
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
fromViolations(name, rule, violations, duration) {
|
|
59
|
+
return violations.length === 0
|
|
60
|
+
? CheckResult.pass(name, rule, duration)
|
|
61
|
+
: CheckResult.fail(name, rule, violations, duration);
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
/** Builder for creating DomainResult objects */
|
|
65
|
+
export const DomainResult = {
|
|
66
|
+
fromChecks(domain, checks) {
|
|
67
|
+
const violationCount = checks.reduce((sum, check) => sum + check.violations.length, 0);
|
|
68
|
+
const allPassed = checks.every((check) => check.passed || check.skipped);
|
|
69
|
+
const allSkipped = checks.length === 0 || checks.every((check) => check.skipped);
|
|
70
|
+
let status = "fail";
|
|
71
|
+
if (allSkipped) {
|
|
72
|
+
status = "skip";
|
|
73
|
+
}
|
|
74
|
+
else if (allPassed) {
|
|
75
|
+
status = "pass";
|
|
76
|
+
}
|
|
77
|
+
return { domain, status, checks, violationCount };
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
// =============================================================================
|
|
81
|
+
// Exit Codes
|
|
82
|
+
// =============================================================================
|
|
83
|
+
export const ExitCode = {
|
|
84
|
+
SUCCESS: 0,
|
|
85
|
+
VIOLATIONS_FOUND: 1,
|
|
86
|
+
CONFIG_ERROR: 2,
|
|
87
|
+
RUNTIME_ERROR: 3,
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "check-my-toolkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Unified project health checks - code, process, and stack",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cm": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsc --watch",
|
|
23
|
+
"start": "node dist/cli.js",
|
|
24
|
+
"test": "vitest",
|
|
25
|
+
"test:coverage": "vitest run --coverage",
|
|
26
|
+
"lint": "eslint .",
|
|
27
|
+
"lint:fix": "eslint . --fix",
|
|
28
|
+
"knip": "knip"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"linting",
|
|
32
|
+
"code-quality",
|
|
33
|
+
"process",
|
|
34
|
+
"ci",
|
|
35
|
+
"cli"
|
|
36
|
+
],
|
|
37
|
+
"author": "",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@eslint/js": "^9.39.2",
|
|
41
|
+
"@types/node": "^22.10.2",
|
|
42
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
43
|
+
"eslint": "^9.39.2",
|
|
44
|
+
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
45
|
+
"globals": "^16.5.0",
|
|
46
|
+
"knip": "^5.76.3",
|
|
47
|
+
"typescript": "^5.7.2",
|
|
48
|
+
"typescript-eslint": "^8.50.0",
|
|
49
|
+
"vitest": "^2.1.8"
|
|
50
|
+
},
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@iarna/toml": "^2.2.5",
|
|
53
|
+
"commander": "^13.0.0",
|
|
54
|
+
"execa": "^9.6.1",
|
|
55
|
+
"zod": "^3.24.1"
|
|
56
|
+
}
|
|
57
|
+
}
|