claude-rules-doctor 0.1.1 → 0.2.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 +9 -1
- package/dist/checker.d.ts.map +1 -1
- package/dist/checker.js +51 -18
- package/dist/checker.js.map +1 -1
- package/dist/cli.js +3 -2
- package/dist/cli.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +12 -5
- package/dist/parser.js.map +1 -1
- package/dist/reporter.d.ts +1 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +3 -2
- package/dist/reporter.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -59,9 +59,17 @@ rules-doctor check --root /path/to/project
|
|
|
59
59
|
## Output
|
|
60
60
|
|
|
61
61
|
- ✅ **OK** — Rule is global (no paths) or paths match files
|
|
62
|
-
- ⚠️ **WARNING** —
|
|
62
|
+
- ⚠️ **WARNING** — Rule misconfigured: invalid YAML frontmatter, empty paths array, invalid types in paths, or invalid glob patterns
|
|
63
63
|
- ❌ **DEAD** — Paths specified, but 0 files match
|
|
64
64
|
|
|
65
|
+
### WARNING triggers
|
|
66
|
+
|
|
67
|
+
A rule gets WARNING status when:
|
|
68
|
+
- Invalid YAML in frontmatter
|
|
69
|
+
- Empty paths array (`paths: []`)
|
|
70
|
+
- Non-string values in paths (numbers, booleans, null)
|
|
71
|
+
- Invalid glob patterns
|
|
72
|
+
|
|
65
73
|
## Example output (test-suite/6-mixed)
|
|
66
74
|
|
|
67
75
|
```bash
|
package/dist/checker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAGxE,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAGxE,wBAAsB,SAAS,CAC7B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAuH1B;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAE5B"}
|
package/dist/checker.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { glob } from 'glob';
|
|
2
2
|
import { RuleStatus as Status } from './types.js';
|
|
3
3
|
export async function checkRule(rule, rootDir) {
|
|
4
|
+
// Check for parse errors first
|
|
5
|
+
if (rule.parseError) {
|
|
6
|
+
return {
|
|
7
|
+
rule,
|
|
8
|
+
status: Status.WARNING,
|
|
9
|
+
matchedFiles: [],
|
|
10
|
+
message: rule.parseError,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
4
13
|
// Global rule (no paths specified)
|
|
5
14
|
if (!rule.frontmatter || !rule.frontmatter.paths) {
|
|
6
15
|
return {
|
|
@@ -10,13 +19,26 @@ export async function checkRule(rule, rootDir) {
|
|
|
10
19
|
message: 'Global rule (no paths specified)',
|
|
11
20
|
};
|
|
12
21
|
}
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
let paths = rule.frontmatter.paths;
|
|
23
|
+
// Handle paths as string - convert to array
|
|
24
|
+
if (typeof paths === 'string') {
|
|
25
|
+
paths = [paths];
|
|
26
|
+
}
|
|
27
|
+
// Check if paths is empty array
|
|
28
|
+
if (!Array.isArray(paths)) {
|
|
15
29
|
return {
|
|
16
30
|
rule,
|
|
17
|
-
status: Status.
|
|
31
|
+
status: Status.WARNING,
|
|
18
32
|
matchedFiles: [],
|
|
19
|
-
message: '
|
|
33
|
+
message: 'Invalid paths type (must be string or array)',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (paths.length === 0) {
|
|
37
|
+
return {
|
|
38
|
+
rule,
|
|
39
|
+
status: Status.WARNING,
|
|
40
|
+
matchedFiles: [],
|
|
41
|
+
message: 'Empty paths array',
|
|
20
42
|
};
|
|
21
43
|
}
|
|
22
44
|
// Filter out non-string values and warn about them
|
|
@@ -30,20 +52,9 @@ export async function checkRule(rule, rootDir) {
|
|
|
30
52
|
invalidPaths.push(path);
|
|
31
53
|
}
|
|
32
54
|
}
|
|
33
|
-
// If there are non-string values, return WARNING
|
|
34
|
-
if (invalidPaths.length > 0) {
|
|
35
|
-
const invalidTypes = invalidPaths
|
|
36
|
-
.map(p => (p === null ? 'null' : typeof p))
|
|
37
|
-
.join(', ');
|
|
38
|
-
return {
|
|
39
|
-
rule,
|
|
40
|
-
status: Status.WARNING,
|
|
41
|
-
matchedFiles: [],
|
|
42
|
-
message: `Invalid types in paths array: ${invalidTypes}. Only strings are allowed.`,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
55
|
// Check each glob pattern
|
|
46
56
|
const allMatches = new Set();
|
|
57
|
+
const globErrors = [];
|
|
47
58
|
for (const pattern of validPaths) {
|
|
48
59
|
try {
|
|
49
60
|
const matches = await glob(pattern, {
|
|
@@ -54,11 +65,33 @@ export async function checkRule(rule, rootDir) {
|
|
|
54
65
|
matches.forEach(file => allMatches.add(file));
|
|
55
66
|
}
|
|
56
67
|
catch (error) {
|
|
57
|
-
// Invalid glob pattern -
|
|
58
|
-
|
|
68
|
+
// Invalid glob pattern - collect error
|
|
69
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
70
|
+
globErrors.push(`"${pattern}": ${errorMsg}`);
|
|
59
71
|
}
|
|
60
72
|
}
|
|
73
|
+
// If all patterns failed, return WARNING with collected errors
|
|
74
|
+
if (globErrors.length > 0 && allMatches.size === 0) {
|
|
75
|
+
return {
|
|
76
|
+
rule,
|
|
77
|
+
status: Status.WARNING,
|
|
78
|
+
matchedFiles: [],
|
|
79
|
+
message: `Invalid glob pattern(s): ${globErrors.join('; ')}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
61
82
|
const matchedFiles = Array.from(allMatches).sort();
|
|
83
|
+
// If there are non-string values, return WARNING (but with matched files if any)
|
|
84
|
+
if (invalidPaths.length > 0) {
|
|
85
|
+
const invalidTypes = invalidPaths
|
|
86
|
+
.map(p => (p === null ? 'null' : typeof p))
|
|
87
|
+
.join(', ');
|
|
88
|
+
return {
|
|
89
|
+
rule,
|
|
90
|
+
status: Status.WARNING,
|
|
91
|
+
matchedFiles,
|
|
92
|
+
message: `Invalid types in paths array: ${invalidTypes}. Only strings are allowed.`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
62
95
|
if (matchedFiles.length === 0) {
|
|
63
96
|
return {
|
|
64
97
|
rule,
|
package/dist/checker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAc,EACd,OAAe;IAEf,mCAAmC;IACnC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,EAAE;YACjB,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,kCAAkC;SAC5C,CAAC;IACJ,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -5,11 +5,12 @@ import { existsSync } from 'fs';
|
|
|
5
5
|
import { parseAllRules } from './parser.js';
|
|
6
6
|
import { checkAllRules } from './checker.js';
|
|
7
7
|
import { generateReport, printConsoleReport, printJsonReport } from './reporter.js';
|
|
8
|
+
import pkg from '../package.json' with { type: 'json' };
|
|
8
9
|
const program = new Command();
|
|
9
10
|
program
|
|
10
11
|
.name('rules-doctor')
|
|
11
12
|
.description('CLI for checking .claude/rules/*.md files')
|
|
12
|
-
.version(
|
|
13
|
+
.version(pkg.version);
|
|
13
14
|
program
|
|
14
15
|
.command('check')
|
|
15
16
|
.description('Check all rules in .claude/rules/')
|
|
@@ -41,7 +42,7 @@ program
|
|
|
41
42
|
printJsonReport(report);
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
44
|
-
printConsoleReport(report, options.verbose);
|
|
45
|
+
printConsoleReport(report, options.verbose, rootDir);
|
|
45
46
|
}
|
|
46
47
|
// CI mode: exit 1 if dead rules found
|
|
47
48
|
if (options.ci && report.deadCount > 0) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,2CAA2C,CAAC;KACxD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,yBAAyB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACjE,MAAM,CAAC,MAAM,EAAE,sCAAsC,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,QAAQ,EAAE,wBAAwB,EAAE,KAAK,CAAC;KACjD,MAAM,CAAC,WAAW,EAAE,kCAAkC,EAAE,KAAK,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnD,2CAA2C;QAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAE3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,kBAAkB;QAClB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpD,kBAAkB;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAEvC,SAAS;QACT,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAED,sCAAsC;QACtC,IAAI,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAI5D,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAItE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAI5D,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAItE;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CASvE;AA0BD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMxE"}
|
package/dist/parser.js
CHANGED
|
@@ -9,23 +9,30 @@ export async function findRuleFiles(rootDir) {
|
|
|
9
9
|
}
|
|
10
10
|
export async function parseRuleFile(filePath) {
|
|
11
11
|
const content = await readFile(filePath, 'utf-8');
|
|
12
|
-
const
|
|
12
|
+
const result = extractFrontmatter(content);
|
|
13
13
|
return {
|
|
14
14
|
filePath,
|
|
15
|
-
frontmatter,
|
|
15
|
+
frontmatter: result.frontmatter,
|
|
16
|
+
parseError: result.parseError,
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
19
|
function extractFrontmatter(content) {
|
|
19
20
|
const match = content.match(FRONTMATTER_REGEX);
|
|
20
21
|
if (!match) {
|
|
21
|
-
|
|
22
|
+
// No frontmatter found - this is a normal global rule
|
|
23
|
+
return { frontmatter: null };
|
|
22
24
|
}
|
|
23
25
|
try {
|
|
24
26
|
const parsed = parseYaml(match[1]);
|
|
25
|
-
return parsed;
|
|
27
|
+
return { frontmatter: parsed };
|
|
26
28
|
}
|
|
27
29
|
catch (error) {
|
|
28
|
-
|
|
30
|
+
// Frontmatter found but YAML parsing failed
|
|
31
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
32
|
+
return {
|
|
33
|
+
frontmatter: null,
|
|
34
|
+
parseError: `YAML parse error: ${errorMessage}`
|
|
35
|
+
};
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
38
|
export async function parseAllRules(rootDir) {
|
package/dist/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,GAAG,OAAO,wBAAwB,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,GAAG,OAAO,wBAAwB,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE3C,OAAO;QACL,QAAQ;QACR,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IAIzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,sDAAsD;QACtD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,EAAE,WAAW,EAAE,MAAyB,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4CAA4C;QAC5C,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,qBAAqB,YAAY,EAAE;SAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CACnD,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/reporter.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RuleCheckResult, CheckReport } from './types.js';
|
|
2
2
|
export declare function generateReport(results: RuleCheckResult[]): CheckReport;
|
|
3
|
-
export declare function printConsoleReport(report: CheckReport, verbose: boolean): void;
|
|
3
|
+
export declare function printConsoleReport(report: CheckReport, verbose: boolean, rootDir: string): void;
|
|
4
4
|
export declare function printJsonReport(report: CheckReport): void;
|
|
5
5
|
//# sourceMappingURL=reporter.d.ts.map
|
package/dist/reporter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG/D,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,WAAW,CAwBtE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAwC/F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEzD"}
|
package/dist/reporter.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
import { RuleStatus } from './types.js';
|
|
3
4
|
export function generateReport(results) {
|
|
4
5
|
const report = {
|
|
@@ -23,12 +24,12 @@ export function generateReport(results) {
|
|
|
23
24
|
}
|
|
24
25
|
return report;
|
|
25
26
|
}
|
|
26
|
-
export function printConsoleReport(report, verbose) {
|
|
27
|
+
export function printConsoleReport(report, verbose, rootDir) {
|
|
27
28
|
console.log(chalk.bold('\n🔍 Rules Doctor - Check Results\n'));
|
|
28
29
|
for (const result of report.results) {
|
|
29
30
|
const statusIcon = getStatusIcon(result.status);
|
|
30
31
|
const statusColor = getStatusColor(result.status);
|
|
31
|
-
const relativePath = result.rule.filePath;
|
|
32
|
+
const relativePath = path.relative(rootDir, result.rule.filePath);
|
|
32
33
|
console.log(`${statusIcon} ${statusColor(result.status.padEnd(7))} ${chalk.gray(relativePath)}`);
|
|
33
34
|
console.log(` ${chalk.dim(result.message)}`);
|
|
34
35
|
if (verbose && result.matchedFiles.length > 0) {
|
package/dist/reporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oBAAY,UAAU;IACpB,EAAE,OAAO;IACT,OAAO,YAAY;IACnB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAWA,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,uBAAS,CAAA;IACT,iCAAmB,CAAA;IACnB,2BAAa,CAAA;AACf,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-rules-doctor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Your Claude Code rules silently fail. We catch them.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "tsc",
|
|
20
20
|
"dev": "tsc --watch",
|
|
21
|
-
"prepublishOnly": "npm run build"
|
|
21
|
+
"prepublishOnly": "npm run build",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest"
|
|
22
24
|
},
|
|
23
25
|
"keywords": [
|
|
24
26
|
"claude-code",
|
|
@@ -45,7 +47,8 @@
|
|
|
45
47
|
},
|
|
46
48
|
"devDependencies": {
|
|
47
49
|
"@types/node": "^20.11.0",
|
|
48
|
-
"typescript": "^5.3.3"
|
|
50
|
+
"typescript": "^5.3.3",
|
|
51
|
+
"vitest": "^2.0.0"
|
|
49
52
|
},
|
|
50
53
|
"engines": {
|
|
51
54
|
"node": ">=18.0.0"
|