claudecode-linter 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.
Files changed (73) hide show
  1. package/.claudecode-lint.defaults.yaml +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +181 -0
  4. package/dist/config.d.ts +3 -0
  5. package/dist/config.js +66 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/discovery.d.ts +8 -0
  8. package/dist/discovery.js +219 -0
  9. package/dist/discovery.js.map +1 -0
  10. package/dist/fixers/claude-md.d.ts +2 -0
  11. package/dist/fixers/claude-md.js +24 -0
  12. package/dist/fixers/claude-md.js.map +1 -0
  13. package/dist/fixers/frontmatter.d.ts +2 -0
  14. package/dist/fixers/frontmatter.js +85 -0
  15. package/dist/fixers/frontmatter.js.map +1 -0
  16. package/dist/fixers/hooks-json.d.ts +2 -0
  17. package/dist/fixers/hooks-json.js +23 -0
  18. package/dist/fixers/hooks-json.js.map +1 -0
  19. package/dist/fixers/mcp-json.d.ts +2 -0
  20. package/dist/fixers/mcp-json.js +47 -0
  21. package/dist/fixers/mcp-json.js.map +1 -0
  22. package/dist/fixers/plugin-json.d.ts +2 -0
  23. package/dist/fixers/plugin-json.js +34 -0
  24. package/dist/fixers/plugin-json.js.map +1 -0
  25. package/dist/fixers/settings-json.d.ts +2 -0
  26. package/dist/fixers/settings-json.js +47 -0
  27. package/dist/fixers/settings-json.js.map +1 -0
  28. package/dist/formatters/human.d.ts +2 -0
  29. package/dist/formatters/human.js +47 -0
  30. package/dist/formatters/human.js.map +1 -0
  31. package/dist/formatters/json.d.ts +2 -0
  32. package/dist/formatters/json.js +10 -0
  33. package/dist/formatters/json.js.map +1 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.js +246 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/linters/agent-md.d.ts +8 -0
  38. package/dist/linters/agent-md.js +92 -0
  39. package/dist/linters/agent-md.js.map +1 -0
  40. package/dist/linters/claude-md.d.ts +8 -0
  41. package/dist/linters/claude-md.js +109 -0
  42. package/dist/linters/claude-md.js.map +1 -0
  43. package/dist/linters/command-md.d.ts +8 -0
  44. package/dist/linters/command-md.js +61 -0
  45. package/dist/linters/command-md.js.map +1 -0
  46. package/dist/linters/hooks-json.d.ts +8 -0
  47. package/dist/linters/hooks-json.js +123 -0
  48. package/dist/linters/hooks-json.js.map +1 -0
  49. package/dist/linters/mcp-json.d.ts +8 -0
  50. package/dist/linters/mcp-json.js +160 -0
  51. package/dist/linters/mcp-json.js.map +1 -0
  52. package/dist/linters/plugin-json.d.ts +8 -0
  53. package/dist/linters/plugin-json.js +166 -0
  54. package/dist/linters/plugin-json.js.map +1 -0
  55. package/dist/linters/settings-json.d.ts +8 -0
  56. package/dist/linters/settings-json.js +187 -0
  57. package/dist/linters/settings-json.js.map +1 -0
  58. package/dist/linters/skill-md.d.ts +8 -0
  59. package/dist/linters/skill-md.js +97 -0
  60. package/dist/linters/skill-md.js.map +1 -0
  61. package/dist/types.d.ts +39 -0
  62. package/dist/types.js +15 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/utils/frontmatter.d.ts +9 -0
  65. package/dist/utils/frontmatter.js +65 -0
  66. package/dist/utils/frontmatter.js.map +1 -0
  67. package/dist/utils/kebab-case.d.ts +2 -0
  68. package/dist/utils/kebab-case.js +14 -0
  69. package/dist/utils/kebab-case.js.map +1 -0
  70. package/dist/utils/prettier.d.ts +2 -0
  71. package/dist/utils/prettier.js +17 -0
  72. package/dist/utils/prettier.js.map +1 -0
  73. package/package.json +53 -0
@@ -0,0 +1,85 @@
1
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
2
+ import { toKebabCase, isKebabCase } from "../utils/kebab-case.js";
3
+ import { formatMarkdown } from "../utils/prettier.js";
4
+ /**
5
+ * Pre-parse fixer: fix common YAML syntax errors in raw frontmatter lines
6
+ * before attempting to parse. This allows fixing files that would otherwise
7
+ * be unparseable.
8
+ */
9
+ function preParseFixFrontmatter(fmLines) {
10
+ return fmLines.map((line) => {
11
+ // Match "key: value" lines where the value is unquoted and contains
12
+ // problematic YAML characters (colons followed by space, or starts
13
+ // with special chars like {, [, >, |, *, &, !, %, @, `)
14
+ const kvMatch = line.match(/^(\s*[\w-]+):\s+(.+)$/);
15
+ if (!kvMatch)
16
+ return line;
17
+ const [, key, value] = kvMatch;
18
+ // Already quoted
19
+ if (/^["'].*["']$/.test(value))
20
+ return line;
21
+ // Multi-line scalar indicators
22
+ if (/^[|>]/.test(value))
23
+ return line;
24
+ // Needs quoting if value contains: colon-space, or starts with special YAML chars
25
+ const needsQuoting = /: /.test(value) || // colon-space (nested mapping ambiguity)
26
+ /^[{[*&!%@`]/.test(value) || // YAML special characters at start
27
+ /^['"]/.test(value) || // starts with quote but doesn't end with one (mismatched)
28
+ /#/.test(value); // contains comment character
29
+ if (needsQuoting) {
30
+ // Escape existing double quotes in value, wrap in double quotes
31
+ const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
32
+ return `${key}: "${escaped}"`;
33
+ }
34
+ return line;
35
+ });
36
+ }
37
+ export const frontmatterFixer = {
38
+ artifactType: "skill-md",
39
+ async fix(_filePath, content, _config) {
40
+ let result = content;
41
+ // Fix trailing whitespace on each line
42
+ result = result.replace(/[ \t]+$/gm, "");
43
+ // Ensure trailing newline
44
+ if (!result.endsWith("\n")) {
45
+ result += "\n";
46
+ }
47
+ // Parse and reformat frontmatter
48
+ const lines = result.split("\n");
49
+ if (lines[0]?.trim() !== "---")
50
+ return result;
51
+ let closingIndex = -1;
52
+ for (let i = 1; i < lines.length; i++) {
53
+ if (lines[i]?.trim() === "---") {
54
+ closingIndex = i;
55
+ break;
56
+ }
57
+ }
58
+ if (closingIndex === -1)
59
+ return result;
60
+ const fmRaw = lines.slice(1, closingIndex);
61
+ const body = lines.slice(closingIndex + 1).join("\n");
62
+ // Pre-parse fix: quote values with problematic YAML characters
63
+ const fixedFmLines = preParseFixFrontmatter(fmRaw);
64
+ const fixedFmRaw = fixedFmLines.join("\n");
65
+ let data;
66
+ try {
67
+ data = parseYaml(fixedFmRaw);
68
+ if (typeof data !== "object" || data === null || Array.isArray(data))
69
+ return result;
70
+ }
71
+ catch {
72
+ return result; // still can't parse even after pre-fix
73
+ }
74
+ // Normalize name to kebab-case
75
+ if (typeof data.name === "string" && !isKebabCase(data.name)) {
76
+ data.name = toKebabCase(data.name);
77
+ }
78
+ // Re-serialize frontmatter
79
+ const newFm = stringifyYaml(data, { lineWidth: 0, defaultStringType: "PLAIN" }).trimEnd();
80
+ // Format the body with prettier markdown
81
+ const formattedBody = body.trim() ? await formatMarkdown(body) : body;
82
+ return `---\n${newFm}\n---\n${formattedBody}`;
83
+ },
84
+ };
85
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/fixers/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Fixer } from "../types.js";
2
+ export declare const hooksJsonFixer: Fixer;
@@ -0,0 +1,23 @@
1
+ import { formatJson } from "../utils/prettier.js";
2
+ export const hooksJsonFixer = {
3
+ artifactType: "hooks-json",
4
+ async fix(_filePath, content, _config) {
5
+ let parsed;
6
+ try {
7
+ parsed = JSON.parse(content);
8
+ }
9
+ catch {
10
+ return content;
11
+ }
12
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
13
+ return content;
14
+ }
15
+ // Sort hooks object keys (event names) alphabetically
16
+ const ordered = {};
17
+ for (const key of Object.keys(parsed).sort()) {
18
+ ordered[key] = parsed[key];
19
+ }
20
+ return formatJson(JSON.stringify(ordered));
21
+ },
22
+ };
23
+ //# sourceMappingURL=hooks-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-json.js","sourceRoot":"","sources":["../../src/fixers/hooks-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,cAAc,GAAU;IACnC,YAAY,EAAE,YAAY;IAE1B,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAqB;QACjE,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,sDAAsD;QACtD,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Fixer } from "../types.js";
2
+ export declare const mcpJsonFixer: Fixer;
@@ -0,0 +1,47 @@
1
+ import { formatJson } from "../utils/prettier.js";
2
+ const SERVER_FIELD_ORDER = ["type", "command", "url", "args", "env"];
3
+ export const mcpJsonFixer = {
4
+ artifactType: "mcp-json",
5
+ async fix(_filePath, content, _config) {
6
+ let parsed;
7
+ try {
8
+ parsed = JSON.parse(content);
9
+ }
10
+ catch {
11
+ return content;
12
+ }
13
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
14
+ return content;
15
+ }
16
+ const result = { ...parsed };
17
+ const mcpServers = parsed["mcpServers"];
18
+ if (typeof mcpServers === "object" && mcpServers !== null && !Array.isArray(mcpServers)) {
19
+ const servers = mcpServers;
20
+ const sortedServers = {};
21
+ for (const serverName of Object.keys(servers).sort()) {
22
+ const server = servers[serverName];
23
+ if (typeof server === "object" && server !== null && !Array.isArray(server)) {
24
+ const serverObj = server;
25
+ const orderedServer = {};
26
+ for (const field of SERVER_FIELD_ORDER) {
27
+ if (field in serverObj) {
28
+ orderedServer[field] = serverObj[field];
29
+ }
30
+ }
31
+ for (const field of Object.keys(serverObj).sort()) {
32
+ if (!(field in orderedServer)) {
33
+ orderedServer[field] = serverObj[field];
34
+ }
35
+ }
36
+ sortedServers[serverName] = orderedServer;
37
+ }
38
+ else {
39
+ sortedServers[serverName] = server;
40
+ }
41
+ }
42
+ result["mcpServers"] = sortedServers;
43
+ }
44
+ return formatJson(JSON.stringify(result));
45
+ },
46
+ };
47
+ //# sourceMappingURL=mcp-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-json.js","sourceRoot":"","sources":["../../src/fixers/mcp-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,YAAY,GAAU;IACjC,YAAY,EAAE,UAAU;IAExB,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAqB;QACjE,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;QAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACxF,MAAM,OAAO,GAAG,UAAqC,CAAC;YACtD,MAAM,aAAa,GAA4B,EAAE,CAAC;YAElD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5E,MAAM,SAAS,GAAG,MAAiC,CAAC;oBACpD,MAAM,aAAa,GAA4B,EAAE,CAAC;oBAClD,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;wBACvC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;4BACvB,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC1C,CAAC;oBACH,CAAC;oBACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;wBAClD,IAAI,CAAC,CAAC,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC;4BAC9B,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC1C,CAAC;oBACH,CAAC;oBACD,aAAa,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,MAAM,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC;QACvC,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Fixer } from "../types.js";
2
+ export declare const pluginJsonFixer: Fixer;
@@ -0,0 +1,34 @@
1
+ import { formatJson } from "../utils/prettier.js";
2
+ const CANONICAL_KEY_ORDER = [
3
+ "name", "version", "description", "author",
4
+ "repository", "homepage", "license", "keywords",
5
+ ];
6
+ export const pluginJsonFixer = {
7
+ artifactType: "plugin-json",
8
+ async fix(_filePath, content, _config) {
9
+ let parsed;
10
+ try {
11
+ parsed = JSON.parse(content);
12
+ }
13
+ catch {
14
+ return content; // can't fix invalid JSON
15
+ }
16
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
17
+ return content;
18
+ }
19
+ // Sort keys in canonical order, then remaining keys alphabetically
20
+ const ordered = {};
21
+ for (const key of CANONICAL_KEY_ORDER) {
22
+ if (key in parsed) {
23
+ ordered[key] = parsed[key];
24
+ }
25
+ }
26
+ for (const key of Object.keys(parsed).sort()) {
27
+ if (!(key in ordered)) {
28
+ ordered[key] = parsed[key];
29
+ }
30
+ }
31
+ return formatJson(JSON.stringify(ordered), true);
32
+ },
33
+ };
34
+ //# sourceMappingURL=plugin-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-json.js","sourceRoot":"","sources":["../../src/fixers/plugin-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ;IAC1C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU;CAChD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAU;IACpC,YAAY,EAAE,aAAa;IAE3B,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAqB;QACjE,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,CAAC,yBAAyB;QAC3C,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,mEAAmE;QACnE,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Fixer } from "../types.js";
2
+ export declare const settingsJsonFixer: Fixer;
@@ -0,0 +1,47 @@
1
+ import { formatJson } from "../utils/prettier.js";
2
+ const TOP_LEVEL_KEY_ORDER = [
3
+ "permissions",
4
+ "env",
5
+ "plugins",
6
+ "skipDangerousModePermissionPrompt",
7
+ ];
8
+ export const settingsJsonFixer = {
9
+ artifactType: "settings-json",
10
+ async fix(_filePath, content, _config) {
11
+ let parsed;
12
+ try {
13
+ parsed = JSON.parse(content);
14
+ }
15
+ catch {
16
+ return content;
17
+ }
18
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
19
+ return content;
20
+ }
21
+ // Sort top-level keys in canonical order, then remaining alphabetically
22
+ const ordered = {};
23
+ for (const key of TOP_LEVEL_KEY_ORDER) {
24
+ if (key in parsed) {
25
+ ordered[key] = parsed[key];
26
+ }
27
+ }
28
+ for (const key of Object.keys(parsed).sort()) {
29
+ if (!(key in ordered)) {
30
+ ordered[key] = parsed[key];
31
+ }
32
+ }
33
+ // Sort permissions.allow and permissions.deny alphabetically
34
+ const permissions = ordered["permissions"];
35
+ if (typeof permissions === "object" && permissions !== null && !Array.isArray(permissions)) {
36
+ const perms = permissions;
37
+ if (Array.isArray(perms["allow"])) {
38
+ perms["allow"] = [...perms["allow"]].sort();
39
+ }
40
+ if (Array.isArray(perms["deny"])) {
41
+ perms["deny"] = [...perms["deny"]].sort();
42
+ }
43
+ }
44
+ return formatJson(JSON.stringify(ordered));
45
+ },
46
+ };
47
+ //# sourceMappingURL=settings-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-json.js","sourceRoot":"","sources":["../../src/fixers/settings-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,mBAAmB,GAAG;IAC1B,aAAa;IACb,KAAK;IACL,SAAS;IACT,mCAAmC;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,YAAY,EAAE,eAAe;IAE7B,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAqB;QACjE,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,wEAAwE;QACxE,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3F,MAAM,KAAK,GAAG,WAAsC,CAAC;YACrD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAI,KAAK,CAAC,OAAO,CAAc,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAI,KAAK,CAAC,MAAM,CAAc,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { LintResult } from "../types.js";
2
+ export declare function formatHuman(results: LintResult[], quiet: boolean): string;
@@ -0,0 +1,47 @@
1
+ import chalk from "chalk";
2
+ const SEVERITY_ICONS = {
3
+ error: chalk.red("error"),
4
+ warning: chalk.yellow("warn "),
5
+ info: chalk.blue("info "),
6
+ };
7
+ export function formatHuman(results, quiet) {
8
+ const lines = [];
9
+ let errorCount = 0;
10
+ let warningCount = 0;
11
+ let infoCount = 0;
12
+ for (const result of results) {
13
+ const filtered = quiet
14
+ ? result.diagnostics.filter((d) => d.severity === "error")
15
+ : result.diagnostics;
16
+ if (filtered.length === 0)
17
+ continue;
18
+ lines.push("");
19
+ lines.push(chalk.underline(result.file));
20
+ for (const d of filtered) {
21
+ const loc = d.line ? chalk.dim(`:${d.line}${d.column ? `:${d.column}` : ""}`) : "";
22
+ lines.push(` ${SEVERITY_ICONS[d.severity]} ${d.message} ${chalk.dim(d.rule)}${loc}`);
23
+ if (d.severity === "error")
24
+ errorCount++;
25
+ else if (d.severity === "warning")
26
+ warningCount++;
27
+ else
28
+ infoCount++;
29
+ }
30
+ }
31
+ if (errorCount === 0 && warningCount === 0 && infoCount === 0) {
32
+ lines.push(chalk.green("No issues found."));
33
+ }
34
+ else {
35
+ lines.push("");
36
+ const parts = [];
37
+ if (errorCount > 0)
38
+ parts.push(chalk.red(`${errorCount} error${errorCount !== 1 ? "s" : ""}`));
39
+ if (warningCount > 0)
40
+ parts.push(chalk.yellow(`${warningCount} warning${warningCount !== 1 ? "s" : ""}`));
41
+ if (!quiet && infoCount > 0)
42
+ parts.push(chalk.blue(`${infoCount} info`));
43
+ lines.push(parts.join(", "));
44
+ }
45
+ return lines.join("\n");
46
+ }
47
+ //# sourceMappingURL=human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human.js","sourceRoot":"","sources":["../../src/formatters/human.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { LintResult } from "../types.js";
2
+ export declare function formatJson(results: LintResult[], quiet: boolean): string;
@@ -0,0 +1,10 @@
1
+ export function formatJson(results, quiet) {
2
+ const filtered = quiet
3
+ ? results.map((r) => ({
4
+ ...r,
5
+ diagnostics: r.diagnostics.filter((d) => d.severity === "error"),
6
+ }))
7
+ : results;
8
+ return JSON.stringify(filtered, null, 2);
9
+ }
10
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/formatters/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,OAAqB,EAAE,KAAc;IAC9D,MAAM,QAAQ,GAAG,KAAK;QACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClB,GAAG,CAAC;YACJ,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC;SACjE,CAAC,CAAC;QACL,CAAC,CAAC,OAAO,CAAC;IAEZ,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,246 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync, writeFileSync, copyFileSync, existsSync } from "node:fs";
3
+ import { resolve, relative, dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Command } from "commander";
6
+ import { loadConfig, mergeCliRules } from "./config.js";
7
+ import { discoverArtifacts } from "./discovery.js";
8
+ import { formatHuman } from "./formatters/human.js";
9
+ import { formatJson } from "./formatters/json.js";
10
+ import { pluginJsonLinter } from "./linters/plugin-json.js";
11
+ import { skillMdLinter } from "./linters/skill-md.js";
12
+ import { agentMdLinter } from "./linters/agent-md.js";
13
+ import { commandMdLinter } from "./linters/command-md.js";
14
+ import { hooksJsonLinter } from "./linters/hooks-json.js";
15
+ import { settingsJsonLinter } from "./linters/settings-json.js";
16
+ import { mcpJsonLinter } from "./linters/mcp-json.js";
17
+ import { claudeMdLinter } from "./linters/claude-md.js";
18
+ import { pluginJsonFixer } from "./fixers/plugin-json.js";
19
+ import { frontmatterFixer } from "./fixers/frontmatter.js";
20
+ import { hooksJsonFixer } from "./fixers/hooks-json.js";
21
+ import { mcpJsonFixer } from "./fixers/mcp-json.js";
22
+ import { settingsJsonFixer } from "./fixers/settings-json.js";
23
+ import { claudeMdFixer } from "./fixers/claude-md.js";
24
+ import { PLUGIN_JSON_RULES } from "./linters/plugin-json.js";
25
+ import { SKILL_MD_RULES } from "./linters/skill-md.js";
26
+ import { AGENT_MD_RULES } from "./linters/agent-md.js";
27
+ import { COMMAND_MD_RULES } from "./linters/command-md.js";
28
+ import { HOOKS_JSON_RULES } from "./linters/hooks-json.js";
29
+ import { SETTINGS_JSON_RULES } from "./linters/settings-json.js";
30
+ import { MCP_JSON_RULES } from "./linters/mcp-json.js";
31
+ import { CLAUDE_MD_RULES } from "./linters/claude-md.js";
32
+ const LINTERS = {
33
+ "plugin-json": pluginJsonLinter,
34
+ "skill-md": skillMdLinter,
35
+ "agent-md": agentMdLinter,
36
+ "command-md": commandMdLinter,
37
+ "hooks-json": hooksJsonLinter,
38
+ "settings-json": settingsJsonLinter,
39
+ "mcp-json": mcpJsonLinter,
40
+ "claude-md": claudeMdLinter,
41
+ };
42
+ const FIXERS = {
43
+ "plugin-json": pluginJsonFixer,
44
+ "skill-md": frontmatterFixer,
45
+ "agent-md": { ...frontmatterFixer, artifactType: "agent-md" },
46
+ "command-md": { ...frontmatterFixer, artifactType: "command-md" },
47
+ "hooks-json": hooksJsonFixer,
48
+ "mcp-json": mcpJsonFixer,
49
+ "settings-json": settingsJsonFixer,
50
+ "claude-md": claudeMdFixer,
51
+ };
52
+ const ALL_RULES = [
53
+ ...PLUGIN_JSON_RULES,
54
+ ...SKILL_MD_RULES,
55
+ ...AGENT_MD_RULES,
56
+ ...COMMAND_MD_RULES,
57
+ ...HOOKS_JSON_RULES,
58
+ ...SETTINGS_JSON_RULES,
59
+ ...MCP_JSON_RULES,
60
+ ...CLAUDE_MD_RULES,
61
+ ];
62
+ function simpleDiff(oldContent, newContent, filePath) {
63
+ if (oldContent === newContent)
64
+ return "";
65
+ const oldLines = oldContent.split("\n");
66
+ const newLines = newContent.split("\n");
67
+ const lines = [];
68
+ lines.push(`--- ${filePath}`);
69
+ lines.push(`+++ ${filePath} (fixed)`);
70
+ let i = 0;
71
+ let j = 0;
72
+ while (i < oldLines.length || j < newLines.length) {
73
+ const oldLine = i < oldLines.length ? oldLines[i] : undefined;
74
+ const newLine = j < newLines.length ? newLines[j] : undefined;
75
+ if (oldLine === newLine) {
76
+ lines.push(` ${oldLine}`);
77
+ i++;
78
+ j++;
79
+ }
80
+ else if (oldLine !== undefined && newLine !== undefined) {
81
+ lines.push(`-${oldLine}`);
82
+ lines.push(`+${newLine}`);
83
+ i++;
84
+ j++;
85
+ }
86
+ else if (oldLine !== undefined) {
87
+ lines.push(`-${oldLine}`);
88
+ i++;
89
+ }
90
+ else {
91
+ lines.push(`+${newLine}`);
92
+ j++;
93
+ }
94
+ }
95
+ return lines.join("\n");
96
+ }
97
+ const program = new Command();
98
+ program
99
+ .name("claudecode-linter")
100
+ .description("Linter for Claude Code plugin artifacts")
101
+ .version("0.1.0")
102
+ .argument("[paths...]", "Plugin directories or individual files", ["."])
103
+ .option("--lint", "Lint artifacts and report issues (default)")
104
+ .option("--fix", "Auto-fix lint violations, then report remaining issues")
105
+ .option("--format", "Format all artifacts for consistent style (no lint output)")
106
+ .option("--output <type>", "Output format: human | json", "human")
107
+ .option("--config <path>", "Config file path")
108
+ .option("--scope <scope>", "Filter by scope: user | project | subdirectory")
109
+ .option("--ignore <patterns>", "Comma-separated glob patterns to ignore")
110
+ .option("--quiet", "Only show errors")
111
+ .option("--enable <rules>", "Comma-separated rule IDs to enable")
112
+ .option("--disable <rules>", "Comma-separated rule IDs to disable")
113
+ .option("--rule <rule>", "Run only this single rule ID")
114
+ .option("--list-rules", "Print all rules with their default severity and exit")
115
+ .option("--fix-dry-run", "Run fixers but print diff instead of writing")
116
+ .option("--init [path]", "Copy default config to path (default: current directory)")
117
+ .action(async (paths, opts) => {
118
+ try {
119
+ if (opts.init !== undefined) {
120
+ const __filename = fileURLToPath(import.meta.url);
121
+ const pkgDir = dirname(dirname(__filename));
122
+ const defaultsFile = join(pkgDir, ".claudecode-lint.defaults.yaml");
123
+ const targetDir = typeof opts.init === "string" ? resolve(opts.init) : process.cwd();
124
+ const targetFile = join(targetDir, ".claudecode-lint.yaml");
125
+ if (existsSync(targetFile)) {
126
+ process.stderr.write(`${targetFile} already exists\n`);
127
+ process.exit(1);
128
+ }
129
+ copyFileSync(defaultsFile, targetFile);
130
+ process.stdout.write(`Created ${targetFile}\n`);
131
+ process.exit(0);
132
+ }
133
+ if (opts.listRules) {
134
+ for (const rule of ALL_RULES) {
135
+ process.stdout.write(`${rule.id}\t${rule.defaultSeverity}\n`);
136
+ }
137
+ process.exit(0);
138
+ }
139
+ const enableList = opts.enable
140
+ ? opts.enable
141
+ .split(",")
142
+ .map((s) => s.trim())
143
+ .filter(Boolean)
144
+ : [];
145
+ const disableList = opts.disable
146
+ ? opts.disable
147
+ .split(",")
148
+ .map((s) => s.trim())
149
+ .filter(Boolean)
150
+ : [];
151
+ const config = mergeCliRules(loadConfig(opts.config), enableList, disableList);
152
+ const results = [];
153
+ const formatted = [];
154
+ const scopeFilter = opts.scope;
155
+ const ignorePatterns = opts.ignore
156
+ ? opts.ignore
157
+ .split(",")
158
+ .map((p) => p.trim())
159
+ .filter(Boolean)
160
+ : [];
161
+ for (const targetPath of paths) {
162
+ const artifacts = discoverArtifacts(targetPath, {
163
+ scope: scopeFilter,
164
+ ignore: ignorePatterns,
165
+ });
166
+ if (artifacts.length === 0) {
167
+ process.stderr.write(`No plugin artifacts found in ${targetPath}\n`);
168
+ continue;
169
+ }
170
+ for (const artifact of artifacts) {
171
+ let content = readFileSync(artifact.filePath, "utf-8");
172
+ const relPath = relative(process.cwd(), artifact.filePath);
173
+ if (opts.format) {
174
+ const fixer = FIXERS[artifact.artifactType];
175
+ if (fixer) {
176
+ const fixedContent = await fixer.fix(artifact.filePath, content, config);
177
+ if (fixedContent !== content) {
178
+ writeFileSync(artifact.filePath, fixedContent);
179
+ formatted.push(relPath);
180
+ }
181
+ }
182
+ continue;
183
+ }
184
+ const linter = LINTERS[artifact.artifactType];
185
+ let fixed = 0;
186
+ if (opts.fix) {
187
+ const fixer = FIXERS[artifact.artifactType];
188
+ if (fixer) {
189
+ const fixedContent = await fixer.fix(artifact.filePath, content, config);
190
+ if (fixedContent !== content) {
191
+ writeFileSync(artifact.filePath, fixedContent);
192
+ content = fixedContent;
193
+ fixed = 1;
194
+ }
195
+ }
196
+ }
197
+ else if (opts.fixDryRun) {
198
+ const fixer = FIXERS[artifact.artifactType];
199
+ if (fixer) {
200
+ const fixedContent = await fixer.fix(artifact.filePath, content, config);
201
+ if (fixedContent !== content) {
202
+ const diff = simpleDiff(content, fixedContent, artifact.filePath);
203
+ process.stdout.write(diff + "\n");
204
+ }
205
+ }
206
+ }
207
+ let diagnostics = linter.lint(artifact.filePath, content, config, artifact.scope);
208
+ if (opts.rule) {
209
+ diagnostics = diagnostics.filter((d) => d.rule === opts.rule);
210
+ }
211
+ results.push({
212
+ file: relPath,
213
+ artifact: artifact.artifactType,
214
+ diagnostics,
215
+ fixed: opts.fix ? fixed : undefined,
216
+ });
217
+ }
218
+ }
219
+ if (opts.format) {
220
+ if (formatted.length === 0) {
221
+ process.stdout.write("All files already formatted.\n");
222
+ }
223
+ else {
224
+ for (const f of formatted) {
225
+ process.stdout.write(`formatted ${f}\n`);
226
+ }
227
+ process.stdout.write(`\n${formatted.length} file${formatted.length === 1 ? "" : "s"} formatted.\n`);
228
+ }
229
+ process.exit(0);
230
+ }
231
+ if (!opts.fixDryRun) {
232
+ const output = opts.output === "json"
233
+ ? formatJson(results, !!opts.quiet)
234
+ : formatHuman(results, !!opts.quiet);
235
+ process.stdout.write(output + "\n");
236
+ }
237
+ const hasErrors = results.some((r) => r.diagnostics.some((d) => d.severity === "error"));
238
+ process.exit(hasErrors ? 1 : 0);
239
+ }
240
+ catch (err) {
241
+ process.stderr.write(`Fatal error: ${err.message}\n`);
242
+ process.exit(2);
243
+ }
244
+ });
245
+ program.parse();
246
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Linter, Severity } from "../types.js";
2
+ interface RuleDef {
3
+ id: string;
4
+ defaultSeverity: Severity;
5
+ }
6
+ declare const RULES: RuleDef[];
7
+ export declare const agentMdLinter: Linter;
8
+ export { RULES as AGENT_MD_RULES };