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.
Files changed (122) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +116 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/code/audit.d.ts +14 -0
  7. package/dist/code/audit.d.ts.map +1 -0
  8. package/dist/code/audit.js +130 -0
  9. package/dist/code/audit.js.map +1 -0
  10. package/dist/code/index.d.ts +13 -0
  11. package/dist/code/index.d.ts.map +1 -0
  12. package/dist/code/index.js +49 -0
  13. package/dist/code/index.js.map +1 -0
  14. package/dist/code/linting.d.ts +10 -0
  15. package/dist/code/linting.d.ts.map +1 -0
  16. package/dist/code/linting.js +233 -0
  17. package/dist/code/linting.js.map +1 -0
  18. package/dist/code/tools/base.d.ts +52 -0
  19. package/dist/code/tools/base.d.ts.map +1 -0
  20. package/dist/code/tools/base.js +83 -0
  21. package/dist/code/tools/base.js.map +1 -0
  22. package/dist/code/tools/eslint.d.ts +15 -0
  23. package/dist/code/tools/eslint.d.ts.map +1 -0
  24. package/dist/code/tools/eslint.js +79 -0
  25. package/dist/code/tools/eslint.js.map +1 -0
  26. package/dist/code/tools/index.d.ts +5 -0
  27. package/dist/code/tools/index.d.ts.map +1 -0
  28. package/dist/code/tools/index.js +5 -0
  29. package/dist/code/tools/index.js.map +1 -0
  30. package/dist/code/tools/ruff.d.ts +26 -0
  31. package/dist/code/tools/ruff.d.ts.map +1 -0
  32. package/dist/code/tools/ruff.js +149 -0
  33. package/dist/code/tools/ruff.js.map +1 -0
  34. package/dist/code/tools/tsc.d.ts +20 -0
  35. package/dist/code/tools/tsc.d.ts.map +1 -0
  36. package/dist/code/tools/tsc.js +90 -0
  37. package/dist/code/tools/tsc.js.map +1 -0
  38. package/dist/code/types.d.ts +6 -0
  39. package/dist/code/types.d.ts.map +1 -0
  40. package/dist/code/types.js +132 -0
  41. package/dist/code/types.js.map +1 -0
  42. package/dist/config/index.d.ts +3 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +3 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/loader.d.ts +21 -0
  47. package/dist/config/loader.d.ts.map +1 -0
  48. package/dist/config/loader.js +118 -0
  49. package/dist/config/loader.js.map +1 -0
  50. package/dist/config/schema.d.ts +1217 -0
  51. package/dist/config/schema.d.ts.map +1 -0
  52. package/dist/config/schema.js +190 -0
  53. package/dist/config/schema.js.map +1 -0
  54. package/dist/index.d.ts +8 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +16 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/output/index.d.ts +15 -0
  59. package/dist/output/index.d.ts.map +1 -0
  60. package/dist/output/index.js +98 -0
  61. package/dist/output/index.js.map +1 -0
  62. package/dist/src/cli.d.ts +3 -0
  63. package/dist/src/cli.d.ts.map +1 -0
  64. package/dist/src/cli.js +116 -0
  65. package/dist/src/cli.js.map +1 -0
  66. package/dist/src/code/index.d.ts +13 -0
  67. package/dist/src/code/index.d.ts.map +1 -0
  68. package/dist/src/code/index.js +53 -0
  69. package/dist/src/code/index.js.map +1 -0
  70. package/dist/src/code/tools/base.d.ts +52 -0
  71. package/dist/src/code/tools/base.d.ts.map +1 -0
  72. package/dist/src/code/tools/base.js +83 -0
  73. package/dist/src/code/tools/base.js.map +1 -0
  74. package/dist/src/code/tools/eslint.d.ts +15 -0
  75. package/dist/src/code/tools/eslint.d.ts.map +1 -0
  76. package/dist/src/code/tools/eslint.js +79 -0
  77. package/dist/src/code/tools/eslint.js.map +1 -0
  78. package/dist/src/code/tools/index.d.ts +5 -0
  79. package/dist/src/code/tools/index.d.ts.map +1 -0
  80. package/dist/src/code/tools/index.js +5 -0
  81. package/dist/src/code/tools/index.js.map +1 -0
  82. package/dist/src/code/tools/ruff.d.ts +26 -0
  83. package/dist/src/code/tools/ruff.d.ts.map +1 -0
  84. package/dist/src/code/tools/ruff.js +149 -0
  85. package/dist/src/code/tools/ruff.js.map +1 -0
  86. package/dist/src/code/tools/tsc.d.ts +21 -0
  87. package/dist/src/code/tools/tsc.d.ts.map +1 -0
  88. package/dist/src/code/tools/tsc.js +94 -0
  89. package/dist/src/code/tools/tsc.js.map +1 -0
  90. package/dist/src/config/index.d.ts +3 -0
  91. package/dist/src/config/index.d.ts.map +1 -0
  92. package/dist/src/config/index.js +3 -0
  93. package/dist/src/config/index.js.map +1 -0
  94. package/dist/src/config/loader.d.ts +22 -0
  95. package/dist/src/config/loader.d.ts.map +1 -0
  96. package/dist/src/config/loader.js +124 -0
  97. package/dist/src/config/loader.js.map +1 -0
  98. package/dist/src/config/schema.d.ts +503 -0
  99. package/dist/src/config/schema.d.ts.map +1 -0
  100. package/dist/src/config/schema.js +190 -0
  101. package/dist/src/config/schema.js.map +1 -0
  102. package/dist/src/index.d.ts +8 -0
  103. package/dist/src/index.d.ts.map +1 -0
  104. package/dist/src/index.js +16 -0
  105. package/dist/src/index.js.map +1 -0
  106. package/dist/src/output/index.d.ts +15 -0
  107. package/dist/src/output/index.d.ts.map +1 -0
  108. package/dist/src/output/index.js +96 -0
  109. package/dist/src/output/index.js.map +1 -0
  110. package/dist/src/types/index.d.ts +96 -0
  111. package/dist/src/types/index.d.ts.map +1 -0
  112. package/dist/src/types/index.js +89 -0
  113. package/dist/src/types/index.js.map +1 -0
  114. package/dist/tests/e2e/e2e.test.d.ts +2 -0
  115. package/dist/tests/e2e/e2e.test.d.ts.map +1 -0
  116. package/dist/tests/e2e/e2e.test.js +398 -0
  117. package/dist/tests/e2e/e2e.test.js.map +1 -0
  118. package/dist/types/index.d.ts +96 -0
  119. package/dist/types/index.d.ts.map +1 -0
  120. package/dist/types/index.js +89 -0
  121. package/dist/types/index.js.map +1 -0
  122. package/package.json +57 -0
package/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # check-my-toolkit
2
+ Monorepo, home of check-my-code, check-my-process and check-my-stack.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { auditCodeConfig, runCodeChecks } from "./code/index.js";
4
+ import { ConfigError, getProjectRoot, loadConfig } from "./config/index.js";
5
+ import { formatOutput } from "./output/index.js";
6
+ import { ExitCode } from "./types/index.js";
7
+ const VERSION = "0.1.0";
8
+ const program = new Command();
9
+ program
10
+ .name("cm")
11
+ .description("Unified project health checks - code, process, and stack")
12
+ .version(VERSION);
13
+ // Code subcommand
14
+ const codeCommand = new Command("code").description("Code quality checks");
15
+ // cm code check
16
+ codeCommand
17
+ .command("check")
18
+ .description("Run linting and type checking tools")
19
+ .option("-c, --config <path>", "Path to check.toml config file")
20
+ .option("-f, --format <format>", "Output format: text or json", "text")
21
+ .action(async (options) => {
22
+ try {
23
+ const { config, configPath } = loadConfig(options.config);
24
+ const projectRoot = getProjectRoot(configPath);
25
+ const domainResult = await runCodeChecks(projectRoot, config);
26
+ const result = {
27
+ version: VERSION,
28
+ configPath,
29
+ domains: {
30
+ code: domainResult,
31
+ },
32
+ summary: {
33
+ totalViolations: domainResult.violationCount,
34
+ exitCode: domainResult.violationCount > 0 ? ExitCode.VIOLATIONS_FOUND : ExitCode.SUCCESS,
35
+ },
36
+ };
37
+ process.stdout.write(`${formatOutput(result, options.format)}\n`);
38
+ process.exit(result.summary.exitCode);
39
+ }
40
+ catch (error) {
41
+ if (error instanceof ConfigError) {
42
+ console.error(`Config error: ${error.message}`);
43
+ process.exit(ExitCode.CONFIG_ERROR);
44
+ }
45
+ console.error(`Error: ${error instanceof Error ? error.message : "Unknown error"}`);
46
+ process.exit(ExitCode.RUNTIME_ERROR);
47
+ }
48
+ });
49
+ // cm code audit
50
+ codeCommand
51
+ .command("audit")
52
+ .description("Verify linting and type checking configs exist")
53
+ .option("-c, --config <path>", "Path to check.toml config file")
54
+ .option("-f, --format <format>", "Output format: text or json", "text")
55
+ .action(async (options) => {
56
+ try {
57
+ const { config, configPath } = loadConfig(options.config);
58
+ const projectRoot = getProjectRoot(configPath);
59
+ const domainResult = await auditCodeConfig(projectRoot, config);
60
+ const result = {
61
+ version: VERSION,
62
+ configPath,
63
+ domains: {
64
+ code: domainResult,
65
+ },
66
+ summary: {
67
+ totalViolations: domainResult.violationCount,
68
+ exitCode: domainResult.violationCount > 0 ? ExitCode.VIOLATIONS_FOUND : ExitCode.SUCCESS,
69
+ },
70
+ };
71
+ process.stdout.write(`${formatOutput(result, options.format)}\n`);
72
+ process.exit(result.summary.exitCode);
73
+ }
74
+ catch (error) {
75
+ if (error instanceof ConfigError) {
76
+ console.error(`Config error: ${error.message}`);
77
+ process.exit(ExitCode.CONFIG_ERROR);
78
+ }
79
+ console.error(`Error: ${error instanceof Error ? error.message : "Unknown error"}`);
80
+ process.exit(ExitCode.RUNTIME_ERROR);
81
+ }
82
+ });
83
+ program.addCommand(codeCommand);
84
+ // cm validate - top-level command to validate check.toml
85
+ program
86
+ .command("validate")
87
+ .description("Validate check.toml configuration file")
88
+ .option("-c, --config <path>", "Path to check.toml config file")
89
+ .option("-f, --format <format>", "Output format: text or json", "text")
90
+ .action((options) => {
91
+ try {
92
+ const { configPath } = loadConfig(options.config);
93
+ if (options.format === "json") {
94
+ process.stdout.write(`${JSON.stringify({ valid: true, configPath }, null, 2)}\n`);
95
+ }
96
+ else {
97
+ process.stdout.write(`✓ Valid: ${configPath}\n`);
98
+ }
99
+ process.exit(ExitCode.SUCCESS);
100
+ }
101
+ catch (error) {
102
+ if (error instanceof ConfigError) {
103
+ if (options.format === "json") {
104
+ process.stdout.write(`${JSON.stringify({ valid: false, error: error.message }, null, 2)}\n`);
105
+ }
106
+ else {
107
+ console.error(`✗ Invalid: ${error.message}`);
108
+ }
109
+ process.exit(ExitCode.CONFIG_ERROR);
110
+ }
111
+ console.error(`Error: ${error instanceof Error ? error.message : "Unknown error"}`);
112
+ process.exit(ExitCode.RUNTIME_ERROR);
113
+ }
114
+ });
115
+ program.parse();
116
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type CheckResult } from "../types/index.js";
2
+ /**
3
+ * Audit ESLint configuration (check that config exists)
4
+ */
5
+ export declare function auditESLint(projectRoot: string): Promise<CheckResult>;
6
+ /**
7
+ * Audit Ruff configuration (check that config exists or pyproject.toml has ruff section)
8
+ */
9
+ export declare function auditRuff(projectRoot: string): Promise<CheckResult>;
10
+ /**
11
+ * Audit TypeScript configuration (check that tsconfig.json exists)
12
+ */
13
+ export declare function auditTsc(projectRoot: string): Promise<CheckResult>;
14
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/code/audit.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C3E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DzE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BxE"}
@@ -0,0 +1,130 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ /**
4
+ * Audit ESLint configuration (check that config exists)
5
+ */
6
+ export async function auditESLint(projectRoot) {
7
+ const startTime = Date.now();
8
+ const eslintConfigs = [
9
+ "eslint.config.js",
10
+ "eslint.config.mjs",
11
+ "eslint.config.cjs",
12
+ ".eslintrc.js",
13
+ ".eslintrc.json",
14
+ ".eslintrc.yml",
15
+ ".eslintrc.yaml",
16
+ ];
17
+ const foundConfig = eslintConfigs.find((config) => fs.existsSync(path.join(projectRoot, config)));
18
+ if (foundConfig) {
19
+ return {
20
+ name: "ESLint Config",
21
+ rule: "code.linting",
22
+ passed: true,
23
+ violations: [],
24
+ skipped: false,
25
+ duration: Date.now() - startTime,
26
+ };
27
+ }
28
+ return {
29
+ name: "ESLint Config",
30
+ rule: "code.linting",
31
+ passed: false,
32
+ violations: [
33
+ {
34
+ rule: "code.linting.eslint",
35
+ tool: "audit",
36
+ message: `ESLint config not found. Expected one of: ${eslintConfigs.join(", ")}`,
37
+ severity: "error",
38
+ },
39
+ ],
40
+ skipped: false,
41
+ duration: Date.now() - startTime,
42
+ };
43
+ }
44
+ /**
45
+ * Audit Ruff configuration (check that config exists or pyproject.toml has ruff section)
46
+ */
47
+ export async function auditRuff(projectRoot) {
48
+ const startTime = Date.now();
49
+ const ruffConfigs = ["ruff.toml", ".ruff.toml"];
50
+ // Check for dedicated ruff config files
51
+ const foundConfig = ruffConfigs.find((config) => fs.existsSync(path.join(projectRoot, config)));
52
+ if (foundConfig) {
53
+ return {
54
+ name: "Ruff Config",
55
+ rule: "code.linting",
56
+ passed: true,
57
+ violations: [],
58
+ skipped: false,
59
+ duration: Date.now() - startTime,
60
+ };
61
+ }
62
+ // Check for ruff section in pyproject.toml
63
+ const pyprojectPath = path.join(projectRoot, "pyproject.toml");
64
+ if (fs.existsSync(pyprojectPath)) {
65
+ try {
66
+ const content = fs.readFileSync(pyprojectPath, "utf-8");
67
+ if (content.includes("[tool.ruff]")) {
68
+ return {
69
+ name: "Ruff Config",
70
+ rule: "code.linting",
71
+ passed: true,
72
+ violations: [],
73
+ skipped: false,
74
+ duration: Date.now() - startTime,
75
+ };
76
+ }
77
+ }
78
+ catch {
79
+ // Continue to failure case
80
+ }
81
+ }
82
+ return {
83
+ name: "Ruff Config",
84
+ rule: "code.linting",
85
+ passed: false,
86
+ violations: [
87
+ {
88
+ rule: "code.linting.ruff",
89
+ tool: "audit",
90
+ message: `Ruff config not found. Expected one of: ${ruffConfigs.join(", ")} or [tool.ruff] section in pyproject.toml`,
91
+ severity: "error",
92
+ },
93
+ ],
94
+ skipped: false,
95
+ duration: Date.now() - startTime,
96
+ };
97
+ }
98
+ /**
99
+ * Audit TypeScript configuration (check that tsconfig.json exists)
100
+ */
101
+ export async function auditTsc(projectRoot) {
102
+ const startTime = Date.now();
103
+ const tsconfigPath = path.join(projectRoot, "tsconfig.json");
104
+ if (fs.existsSync(tsconfigPath)) {
105
+ return {
106
+ name: "TypeScript Config",
107
+ rule: "code.types",
108
+ passed: true,
109
+ violations: [],
110
+ skipped: false,
111
+ duration: Date.now() - startTime,
112
+ };
113
+ }
114
+ return {
115
+ name: "TypeScript Config",
116
+ rule: "code.types",
117
+ passed: false,
118
+ violations: [
119
+ {
120
+ rule: "code.types.tsc",
121
+ tool: "audit",
122
+ message: "TypeScript config not found. Expected: tsconfig.json",
123
+ severity: "error",
124
+ },
125
+ ],
126
+ skipped: false,
127
+ duration: Date.now() - startTime,
128
+ };
129
+ }
130
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/code/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type Config } from "../config/index.js";
2
+ import { DomainResult } from "../types/index.js";
3
+ export { ESLintRunner, RuffRunner, TscRunner } from "./tools/index.js";
4
+ export { BaseToolRunner } from "./tools/index.js";
5
+ /**
6
+ * Run all code checks based on configuration
7
+ */
8
+ export declare function runCodeChecks(projectRoot: string, config: Config): Promise<DomainResult>;
9
+ /**
10
+ * Audit code configuration (check that configs exist without running tools)
11
+ */
12
+ export declare function auditCodeConfig(projectRoot: string, config: Config): Promise<DomainResult>;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/code/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAEL,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAqBlD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAIvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAIvB"}
@@ -0,0 +1,49 @@
1
+ import { DomainResult, } from "../types/index.js";
2
+ import { ESLintRunner, RuffRunner, TscRunner } from "./tools/index.js";
3
+ // Tool runner instances
4
+ const eslint = new ESLintRunner();
5
+ const ruff = new RuffRunner();
6
+ const tsc = new TscRunner();
7
+ // Export tool runners for direct access
8
+ export { ESLintRunner, RuffRunner, TscRunner } from "./tools/index.js";
9
+ export { BaseToolRunner } from "./tools/index.js";
10
+ /**
11
+ * Get enabled tools based on configuration
12
+ */
13
+ function getEnabledTools(config) {
14
+ const tools = [];
15
+ if (config.code?.linting?.eslint?.enabled) {
16
+ tools.push(eslint);
17
+ }
18
+ if (config.code?.linting?.ruff?.enabled) {
19
+ tools.push(ruff);
20
+ }
21
+ if (config.code?.types?.tsc?.enabled) {
22
+ tools.push(tsc);
23
+ }
24
+ return tools;
25
+ }
26
+ /**
27
+ * Run all code checks based on configuration
28
+ */
29
+ export async function runCodeChecks(projectRoot, config) {
30
+ const tools = getEnabledTools(config);
31
+ const checks = await runTools(tools, projectRoot, "run");
32
+ return DomainResult.fromChecks("code", checks);
33
+ }
34
+ /**
35
+ * Audit code configuration (check that configs exist without running tools)
36
+ */
37
+ export async function auditCodeConfig(projectRoot, config) {
38
+ const tools = getEnabledTools(config);
39
+ const checks = await runTools(tools, projectRoot, "audit");
40
+ return DomainResult.fromChecks("code", checks);
41
+ }
42
+ /**
43
+ * Run tools in parallel
44
+ */
45
+ async function runTools(tools, projectRoot, mode) {
46
+ const promises = tools.map((tool) => mode === "run" ? tool.run(projectRoot) : tool.audit(projectRoot));
47
+ return Promise.all(promises);
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/code/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvE,wBAAwB;AACxB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,MAAM,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;AAC9B,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;AAE5B,wCAAwC;AACxC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,MAAc;IAEd,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,MAAc;IAEd,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CACrB,KAAoB,EACpB,WAAmB,EACnB,IAAqB;IAErB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CACjE,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type CheckResult } from "../types/index.js";
2
+ /**
3
+ * Run ESLint and return violations
4
+ */
5
+ export declare function runESLint(projectRoot: string): Promise<CheckResult>;
6
+ /**
7
+ * Run Ruff and return violations
8
+ */
9
+ export declare function runRuff(projectRoot: string): Promise<CheckResult>;
10
+ //# sourceMappingURL=linting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linting.d.ts","sourceRoot":"","sources":["../../src/code/linting.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAerE;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsHzE;AAYD;;GAEG;AACH,wBAAsB,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmHvE"}
@@ -0,0 +1,233 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { execa } from "execa";
4
+ /**
5
+ * Run ESLint and return violations
6
+ */
7
+ export async function runESLint(projectRoot) {
8
+ const startTime = Date.now();
9
+ const violations = [];
10
+ // Check if ESLint config exists
11
+ const eslintConfigs = [
12
+ "eslint.config.js",
13
+ "eslint.config.mjs",
14
+ "eslint.config.cjs",
15
+ ".eslintrc.js",
16
+ ".eslintrc.json",
17
+ ".eslintrc.yml",
18
+ ".eslintrc.yaml",
19
+ ];
20
+ const hasConfig = eslintConfigs.some((config) => fs.existsSync(path.join(projectRoot, config)));
21
+ if (!hasConfig) {
22
+ return {
23
+ name: "ESLint",
24
+ rule: "code.linting",
25
+ passed: true,
26
+ violations: [],
27
+ skipped: true,
28
+ skipReason: "No ESLint config found",
29
+ duration: Date.now() - startTime,
30
+ };
31
+ }
32
+ try {
33
+ // Run ESLint with JSON output
34
+ const result = await execa("npx", ["eslint", ".", "--format", "json"], {
35
+ cwd: projectRoot,
36
+ reject: false,
37
+ timeout: 5 * 60 * 1000, // 5 minutes
38
+ });
39
+ // Parse JSON output
40
+ let eslintResults = [];
41
+ try {
42
+ eslintResults = JSON.parse(result.stdout);
43
+ }
44
+ catch {
45
+ // If we can't parse JSON, ESLint might have crashed
46
+ if (result.exitCode !== 0 && result.stderr) {
47
+ return {
48
+ name: "ESLint",
49
+ rule: "code.linting",
50
+ passed: false,
51
+ violations: [
52
+ {
53
+ rule: "code.linting.eslint",
54
+ tool: "eslint",
55
+ message: `ESLint error: ${result.stderr}`,
56
+ severity: "error",
57
+ },
58
+ ],
59
+ skipped: false,
60
+ duration: Date.now() - startTime,
61
+ };
62
+ }
63
+ }
64
+ // Convert to violations
65
+ for (const fileResult of eslintResults) {
66
+ for (const msg of fileResult.messages) {
67
+ violations.push({
68
+ rule: "code.linting.eslint",
69
+ tool: "eslint",
70
+ file: path.relative(projectRoot, fileResult.filePath),
71
+ line: msg.line,
72
+ column: msg.column,
73
+ message: msg.message,
74
+ code: msg.ruleId ?? undefined,
75
+ severity: msg.severity === 2 ? "error" : "warning",
76
+ });
77
+ }
78
+ }
79
+ return {
80
+ name: "ESLint",
81
+ rule: "code.linting",
82
+ passed: violations.length === 0,
83
+ violations,
84
+ skipped: false,
85
+ duration: Date.now() - startTime,
86
+ };
87
+ }
88
+ catch (error) {
89
+ // ESLint not installed or other error
90
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
91
+ if (errorMessage.includes("ENOENT") || errorMessage.includes("not found")) {
92
+ return {
93
+ name: "ESLint",
94
+ rule: "code.linting",
95
+ passed: true,
96
+ violations: [],
97
+ skipped: true,
98
+ skipReason: "ESLint not installed",
99
+ duration: Date.now() - startTime,
100
+ };
101
+ }
102
+ return {
103
+ name: "ESLint",
104
+ rule: "code.linting",
105
+ passed: false,
106
+ violations: [
107
+ {
108
+ rule: "code.linting.eslint",
109
+ tool: "eslint",
110
+ message: `ESLint error: ${errorMessage}`,
111
+ severity: "error",
112
+ },
113
+ ],
114
+ skipped: false,
115
+ duration: Date.now() - startTime,
116
+ };
117
+ }
118
+ }
119
+ /**
120
+ * Run Ruff and return violations
121
+ */
122
+ export async function runRuff(projectRoot) {
123
+ const startTime = Date.now();
124
+ const violations = [];
125
+ // Check if there are any Python files
126
+ try {
127
+ const result = await execa("find", [".", "-name", "*.py", "-type", "f"], {
128
+ cwd: projectRoot,
129
+ reject: false,
130
+ });
131
+ if (!result.stdout.trim()) {
132
+ return {
133
+ name: "Ruff",
134
+ rule: "code.linting",
135
+ passed: true,
136
+ violations: [],
137
+ skipped: true,
138
+ skipReason: "No Python files found",
139
+ duration: Date.now() - startTime,
140
+ };
141
+ }
142
+ }
143
+ catch {
144
+ // Continue anyway
145
+ }
146
+ try {
147
+ // Run Ruff with JSON output
148
+ const result = await execa("ruff", ["check", ".", "--output-format", "json"], {
149
+ cwd: projectRoot,
150
+ reject: false,
151
+ timeout: 5 * 60 * 1000, // 5 minutes
152
+ });
153
+ // Parse JSON output
154
+ let ruffResults = [];
155
+ try {
156
+ if (result.stdout.trim()) {
157
+ ruffResults = JSON.parse(result.stdout);
158
+ }
159
+ }
160
+ catch {
161
+ // If we can't parse JSON, Ruff might have crashed
162
+ if (result.exitCode !== 0 && result.stderr) {
163
+ return {
164
+ name: "Ruff",
165
+ rule: "code.linting",
166
+ passed: false,
167
+ violations: [
168
+ {
169
+ rule: "code.linting.ruff",
170
+ tool: "ruff",
171
+ message: `Ruff error: ${result.stderr}`,
172
+ severity: "error",
173
+ },
174
+ ],
175
+ skipped: false,
176
+ duration: Date.now() - startTime,
177
+ };
178
+ }
179
+ }
180
+ // Convert to violations
181
+ for (const msg of ruffResults) {
182
+ violations.push({
183
+ rule: "code.linting.ruff",
184
+ tool: "ruff",
185
+ file: path.relative(projectRoot, msg.filename),
186
+ line: msg.location.row,
187
+ column: msg.location.column,
188
+ message: msg.message,
189
+ code: msg.code,
190
+ severity: "error",
191
+ });
192
+ }
193
+ return {
194
+ name: "Ruff",
195
+ rule: "code.linting",
196
+ passed: violations.length === 0,
197
+ violations,
198
+ skipped: false,
199
+ duration: Date.now() - startTime,
200
+ };
201
+ }
202
+ catch (error) {
203
+ // Ruff not installed or other error
204
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
205
+ if (errorMessage.includes("ENOENT") || errorMessage.includes("not found")) {
206
+ return {
207
+ name: "Ruff",
208
+ rule: "code.linting",
209
+ passed: true,
210
+ violations: [],
211
+ skipped: true,
212
+ skipReason: "Ruff not installed",
213
+ duration: Date.now() - startTime,
214
+ };
215
+ }
216
+ return {
217
+ name: "Ruff",
218
+ rule: "code.linting",
219
+ passed: false,
220
+ violations: [
221
+ {
222
+ rule: "code.linting.ruff",
223
+ tool: "ruff",
224
+ message: `Ruff error: ${errorMessage}`,
225
+ severity: "error",
226
+ },
227
+ ],
228
+ skipped: false,
229
+ duration: Date.now() - startTime,
230
+ };
231
+ }
232
+ }
233
+ //# sourceMappingURL=linting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linting.js","sourceRoot":"","sources":["../../src/code/linting.ts"],"names":[],"mappings":"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"}