qualety 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 (70) hide show
  1. package/LICENSE +21 -0
  2. package/dist/biome.d.ts +18 -0
  3. package/dist/biome.d.ts.map +1 -0
  4. package/dist/biome.js +312 -0
  5. package/dist/biome.js.map +1 -0
  6. package/dist/cli.d.ts +7 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +149 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/companion-closure.d.ts +2 -0
  11. package/dist/companion-closure.d.ts.map +1 -0
  12. package/dist/companion-closure.js +29 -0
  13. package/dist/companion-closure.js.map +1 -0
  14. package/dist/config.d.ts +51 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +222 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/default-providers.d.ts +5 -0
  19. package/dist/default-providers.d.ts.map +1 -0
  20. package/dist/default-providers.js +5 -0
  21. package/dist/default-providers.js.map +1 -0
  22. package/dist/define-rule.d.ts +9 -0
  23. package/dist/define-rule.d.ts.map +1 -0
  24. package/dist/define-rule.js +5 -0
  25. package/dist/define-rule.js.map +1 -0
  26. package/dist/define-rule.types.d.ts +2 -0
  27. package/dist/define-rule.types.d.ts.map +1 -0
  28. package/dist/define-rule.types.js +33 -0
  29. package/dist/define-rule.types.js.map +1 -0
  30. package/dist/engine.d.ts +10 -0
  31. package/dist/engine.d.ts.map +1 -0
  32. package/dist/engine.js +447 -0
  33. package/dist/engine.js.map +1 -0
  34. package/dist/git-seed.d.ts +2 -0
  35. package/dist/git-seed.d.ts.map +1 -0
  36. package/dist/git-seed.js +52 -0
  37. package/dist/git-seed.js.map +1 -0
  38. package/dist/index.d.ts +138 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +13 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/record.d.ts +2 -0
  43. package/dist/record.d.ts.map +1 -0
  44. package/dist/record.js +4 -0
  45. package/dist/record.js.map +1 -0
  46. package/dist/ruff.d.ts +17 -0
  47. package/dist/ruff.d.ts.map +1 -0
  48. package/dist/ruff.js +303 -0
  49. package/dist/ruff.js.map +1 -0
  50. package/dist/rule-options.d.ts +3 -0
  51. package/dist/rule-options.d.ts.map +1 -0
  52. package/dist/rule-options.js +78 -0
  53. package/dist/rule-options.js.map +1 -0
  54. package/dist/run-command.d.ts +13 -0
  55. package/dist/run-command.d.ts.map +1 -0
  56. package/dist/run-command.js +60 -0
  57. package/dist/run-command.js.map +1 -0
  58. package/dist/schemas.d.ts +125 -0
  59. package/dist/schemas.d.ts.map +1 -0
  60. package/dist/schemas.js +79 -0
  61. package/dist/schemas.js.map +1 -0
  62. package/dist/standalone-wasm.d.ts +7 -0
  63. package/dist/standalone-wasm.d.ts.map +1 -0
  64. package/dist/standalone-wasm.js +31 -0
  65. package/dist/standalone-wasm.js.map +1 -0
  66. package/dist/typescript-frontend.d.ts +4 -0
  67. package/dist/typescript-frontend.d.ts.map +1 -0
  68. package/dist/typescript-frontend.js +105 -0
  69. package/dist/typescript-frontend.js.map +1 -0
  70. package/package.json +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NavehBrenner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,18 @@
1
+ import type { Plugin, UserConfig, Violation } from "./index.ts";
2
+ export declare const GENERATED_BIOME_PATH = ".qualety/biome.json";
3
+ export type BiomeRuleSetting = "off" | "warn" | "error" | ["off" | "warn" | "error", Record<string, unknown>];
4
+ export declare function biomeEnabled(config: UserConfig): boolean;
5
+ export declare function resolveBiomeBinary(): string;
6
+ export declare function mergeBiomeRules(plugins: readonly Plugin[], userRules: Record<string, BiomeRuleSetting> | undefined): Record<string, BiomeRuleSetting>;
7
+ export declare function nestBiomeRules(flat: Record<string, BiomeRuleSetting>): Record<string, unknown>;
8
+ export declare function writeGeneratedBiomeConfig(cwd: string, plugins: readonly Plugin[], userBiome: UserConfig["biome"]): Promise<string>;
9
+ export declare function runBiomePhase(input: {
10
+ cwd: string;
11
+ files: readonly string[];
12
+ plugins: readonly Plugin[];
13
+ biome: UserConfig["biome"];
14
+ bin?: string;
15
+ timeoutMs?: number;
16
+ }): Promise<Violation[]>;
17
+ export declare function readBiomeVersion(bin: string, cwd: string): Promise<string>;
18
+ //# sourceMappingURL=biome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome.d.ts","sourceRoot":"","sources":["../src/biome.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAS,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvE,eAAO,MAAM,oBAAoB,wBAAgC,CAAC;AAiBlE,MAAM,MAAM,gBAAgB,GACxB,KAAK,GACL,MAAM,GACN,OAAO,GACP,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAExD,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAExD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAWD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,GACtD,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAmBlC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAe9F;AAED,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAqED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAuBvB;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAahF"}
package/dist/biome.js ADDED
@@ -0,0 +1,312 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, extname, join } from "node:path";
4
+ import { ConfigError, isStandalone } from "./config.js";
5
+ import { isRecord } from "./record.js";
6
+ import { runTimedCommand } from "./run-command.js";
7
+ const SCAN_TIMEOUT_MS = 60_000;
8
+ const GENERATED_DIR = ".qualety";
9
+ export const GENERATED_BIOME_PATH = `${GENERATED_DIR}/biome.json`;
10
+ const DEFAULT_SUGGESTION = "Apply the Biome finding or override the rule in biome.rules.";
11
+ const BIOME_EXTENSIONS = new Set([
12
+ ".js",
13
+ ".jsx",
14
+ ".ts",
15
+ ".tsx",
16
+ ".mjs",
17
+ ".cjs",
18
+ ".mts",
19
+ ".cts",
20
+ ".json",
21
+ ]);
22
+ const BASELINE_RULES = {
23
+ "suspicious/noConfusingVoidType": "off",
24
+ };
25
+ export function biomeEnabled(config) {
26
+ return config.biome !== false;
27
+ }
28
+ export function resolveBiomeBinary() {
29
+ const require = createRequire(import.meta.url);
30
+ try {
31
+ const pkg = require.resolve("@biomejs/biome/package.json");
32
+ return join(dirname(pkg), "bin/biome");
33
+ }
34
+ catch (e) {
35
+ throw new ConfigError(`Biome is not resolvable: ${e instanceof Error ? e.message : String(e)}`);
36
+ }
37
+ }
38
+ function assertBiomeRuleId(id, owner) {
39
+ const parts = id.split("/");
40
+ if (parts.length !== 2 || parts[0] === "" || parts[1] === "") {
41
+ throw new ConfigError(`Invalid Biome rule id ${JSON.stringify(id)} (${owner}); expected group/name.`);
42
+ }
43
+ }
44
+ export function mergeBiomeRules(plugins, userRules) {
45
+ const merged = { ...BASELINE_RULES };
46
+ for (const plugin of plugins) {
47
+ const rules = plugin.biome?.rules;
48
+ if (rules === undefined) {
49
+ continue;
50
+ }
51
+ for (const [id, setting] of Object.entries(rules)) {
52
+ assertBiomeRuleId(id, `plugin ${plugin.name}`);
53
+ merged[id] = setting;
54
+ }
55
+ }
56
+ if (userRules !== undefined) {
57
+ for (const [id, setting] of Object.entries(userRules)) {
58
+ assertBiomeRuleId(id, "config.biome.rules");
59
+ merged[id] = setting;
60
+ }
61
+ }
62
+ return merged;
63
+ }
64
+ export function nestBiomeRules(flat) {
65
+ const rules = { preset: "recommended" };
66
+ for (const [id, setting] of Object.entries(flat)) {
67
+ const slash = id.indexOf("/");
68
+ const group = id.slice(0, slash);
69
+ const name = id.slice(slash + 1);
70
+ const existing = rules[group];
71
+ const groupRules = isRecord(existing) ? existing : {};
72
+ if (!isRecord(existing)) {
73
+ rules[group] = groupRules;
74
+ }
75
+ groupRules[name] =
76
+ typeof setting === "string" ? setting : { level: setting[0], options: setting[1] };
77
+ }
78
+ return rules;
79
+ }
80
+ export async function writeGeneratedBiomeConfig(cwd, plugins, userBiome) {
81
+ const document = biomeConfigDocument(plugins, userBiome);
82
+ await mkdir(join(cwd, GENERATED_DIR), { recursive: true });
83
+ await writeFile(join(cwd, GENERATED_BIOME_PATH), `${JSON.stringify(document, null, 2)}\n`);
84
+ return GENERATED_BIOME_PATH;
85
+ }
86
+ function biomeConfigDocument(plugins, userBiome) {
87
+ const userRules = userBiome === false || userBiome === undefined ? undefined : userBiome.rules;
88
+ return {
89
+ vcs: { enabled: false },
90
+ linter: {
91
+ enabled: true,
92
+ rules: nestBiomeRules(mergeBiomeRules(plugins, userRules)),
93
+ },
94
+ };
95
+ }
96
+ // The literal specifier is load-bearing: it is what lets bun --compile embed the
97
+ // wasm build. Do not collapse it into a computed import.
98
+ async function runBiomeWasmPhase(cwd, paths, plugins, userBiome) {
99
+ const { loadStandaloneBiome } = await import("./standalone-wasm.js");
100
+ const Biome = await loadStandaloneBiome();
101
+ const biome = new Biome();
102
+ const { projectKey } = biome.openProject(cwd);
103
+ // Rules are composed from plugin contributions at runtime, so the document cannot
104
+ // match Configuration's static rule map. Biome validates it when the workspace opens.
105
+ // biome-ignore lint/nursery/noUnsafeTypeAssertion: dynamic rule map, validated on open
106
+ biome.applyConfiguration(projectKey, biomeConfigDocument(plugins, userBiome));
107
+ const format = userBiome !== false && userBiome?.format === true;
108
+ const violations = [];
109
+ for (const file of paths) {
110
+ const source = await readFile(join(cwd, file), "utf8");
111
+ for (const raw of biome.lintContent(projectKey, source, { filePath: file }).diagnostics) {
112
+ // wasm reports location.path as { file } and leaves sourceCode null; locationOf
113
+ // wants a string path plus the source to turn a span into line/column.
114
+ const mapped = mapDiagnostic({
115
+ ...raw,
116
+ location: { ...raw.location, path: file, sourceCode: source },
117
+ });
118
+ if (mapped !== undefined) {
119
+ violations.push(mapped);
120
+ }
121
+ }
122
+ if (format) {
123
+ const formatted = biome.formatContent(projectKey, source, { filePath: file });
124
+ if (formatted.content !== source) {
125
+ violations.push(unformattedViolation(file));
126
+ }
127
+ }
128
+ }
129
+ return violations;
130
+ }
131
+ function unformattedViolation(file) {
132
+ const origin = { line: 1, column: 1 };
133
+ return {
134
+ ruleId: "format",
135
+ severity: "error",
136
+ file,
137
+ range: { start: origin, end: origin },
138
+ message: "File is not formatted.",
139
+ suggestion: "Run `biome format --write` or apply the formatter in your editor.",
140
+ };
141
+ }
142
+ export async function runBiomePhase(input) {
143
+ const paths = input.files.filter((file) => BIOME_EXTENSIONS.has(extname(file)));
144
+ if (paths.length === 0) {
145
+ return [];
146
+ }
147
+ if (isStandalone()) {
148
+ return runBiomeWasmPhase(input.cwd, paths, input.plugins, input.biome);
149
+ }
150
+ await writeGeneratedBiomeConfig(input.cwd, input.plugins, input.biome);
151
+ const bin = input.bin ?? resolveBiomeBinary();
152
+ const format = input.biome !== false && input.biome?.format === true;
153
+ const args = [
154
+ format ? "check" : "lint",
155
+ "--config-path",
156
+ GENERATED_BIOME_PATH,
157
+ "--reporter=json",
158
+ "--max-diagnostics=none",
159
+ "--files-ignore-unknown=true",
160
+ ...paths,
161
+ ];
162
+ const timeoutMs = input.timeoutMs ?? SCAN_TIMEOUT_MS;
163
+ const result = await runTimedCommand(bin, args, input.cwd, timeoutMs);
164
+ return mapBiomeStdout(result, timeoutMs);
165
+ }
166
+ export async function readBiomeVersion(bin, cwd) {
167
+ const result = await runTimedCommand(bin, ["--version"], cwd, 10_000);
168
+ if (result.timedOut) {
169
+ throw new ConfigError("Biome timed out while reading version.");
170
+ }
171
+ if (result.error !== undefined) {
172
+ throw new ConfigError(`Biome is not runnable: ${result.error}`);
173
+ }
174
+ const text = result.stdout.trim() || result.stderr.trim();
175
+ if (result.code !== 0 || text.length === 0) {
176
+ throw new ConfigError(`Biome is not runnable: ${text || `exit ${result.code}`}`);
177
+ }
178
+ return text.replace(/^Version:\s*/i, "");
179
+ }
180
+ function mapBiomeStdout(result, timeoutMs) {
181
+ const { timedOut, error, code, stdout, stderr } = result;
182
+ if (timedOut) {
183
+ throw new ConfigError(`Biome timed out after ${timeoutMs / 1000}s.`);
184
+ }
185
+ if (error !== undefined) {
186
+ throw new ConfigError(`Biome is not runnable: ${error}`);
187
+ }
188
+ if (code !== 0 && code !== 1) {
189
+ const detail = stderr.trim() || stdout.trim() || `exit ${code}`;
190
+ throw new ConfigError(`Biome failed: ${detail}`);
191
+ }
192
+ const text = stdout.trim();
193
+ if (text.length === 0) {
194
+ if (code === 0) {
195
+ return [];
196
+ }
197
+ throw new ConfigError("Biome produced no JSON diagnostics.");
198
+ }
199
+ let parsed;
200
+ try {
201
+ parsed = JSON.parse(text);
202
+ }
203
+ catch (e) {
204
+ throw new ConfigError(`Biome produced invalid JSON: ${e instanceof Error ? e.message : String(e)}`);
205
+ }
206
+ const items = Array.isArray(parsed)
207
+ ? parsed
208
+ : isRecord(parsed) && Array.isArray(parsed.diagnostics)
209
+ ? parsed.diagnostics
210
+ : [];
211
+ return items.flatMap((item) => {
212
+ const mapped = mapDiagnostic(item);
213
+ return mapped === undefined ? [] : [mapped];
214
+ });
215
+ }
216
+ function mapDiagnostic(raw) {
217
+ if (!isRecord(raw)) {
218
+ return undefined;
219
+ }
220
+ const category = typeof raw.category === "string" ? raw.category : undefined;
221
+ if (category === undefined) {
222
+ return undefined;
223
+ }
224
+ const loc = locationOf(raw);
225
+ return {
226
+ ruleId: category,
227
+ severity: raw.severity === "warning" || raw.severity === "warn" ? "warn" : "error",
228
+ file: loc.file,
229
+ range: loc.range,
230
+ message: messageOf(raw),
231
+ suggestion: suggestionOf(raw),
232
+ };
233
+ }
234
+ function messageOf(raw) {
235
+ if (typeof raw.description === "string" && raw.description.length > 0) {
236
+ return raw.description;
237
+ }
238
+ if (typeof raw.message === "string" && raw.message.length > 0) {
239
+ return raw.message;
240
+ }
241
+ if (Array.isArray(raw.message)) {
242
+ const text = raw.message
243
+ .map((piece) => (isRecord(piece) && typeof piece.content === "string" ? piece.content : ""))
244
+ .join("");
245
+ if (text.length > 0) {
246
+ return text;
247
+ }
248
+ }
249
+ return "Biome diagnostic";
250
+ }
251
+ function suggestionOf(raw) {
252
+ const advices = raw.advices;
253
+ if (!isRecord(advices) || !Array.isArray(advices.advices)) {
254
+ return DEFAULT_SUGGESTION;
255
+ }
256
+ for (const item of advices.advices) {
257
+ if (!isRecord(item) || !Array.isArray(item.log)) {
258
+ continue;
259
+ }
260
+ const text = item.log.find((piece) => typeof piece === "string" && piece !== "info");
261
+ if (typeof text === "string" && text.length > 0 && !text.includes("\n")) {
262
+ return text;
263
+ }
264
+ }
265
+ return DEFAULT_SUGGESTION;
266
+ }
267
+ function locationOf(raw) {
268
+ const loc = raw.location;
269
+ const origin = { line: 1, column: 1 };
270
+ if (!isRecord(loc)) {
271
+ return { file: ".", range: { start: origin, end: origin } };
272
+ }
273
+ const file = typeof loc.path === "string" && loc.path.length > 0 ? loc.path : ".";
274
+ if (isRecord(loc.start) && typeof loc.start.line === "number") {
275
+ const start = coords(loc.start);
276
+ const end = isRecord(loc.end) ? coords(loc.end) : start;
277
+ return { file, range: { start, end } };
278
+ }
279
+ if (Array.isArray(loc.span) && typeof loc.sourceCode === "string") {
280
+ const startOffset = typeof loc.span[0] === "number" ? loc.span[0] : 0;
281
+ const endOffset = typeof loc.span[1] === "number" ? loc.span[1] : startOffset;
282
+ return {
283
+ file,
284
+ range: {
285
+ start: offsetToCoords(loc.sourceCode, startOffset),
286
+ end: offsetToCoords(loc.sourceCode, endOffset),
287
+ },
288
+ };
289
+ }
290
+ return { file, range: { start: origin, end: origin } };
291
+ }
292
+ function coords(value) {
293
+ const line = typeof value.line === "number" ? value.line : 1;
294
+ const column = typeof value.column === "number" ? value.column : 1;
295
+ return { line: line < 1 ? 1 : line, column: column < 1 ? 1 : column };
296
+ }
297
+ function offsetToCoords(source, offset) {
298
+ let line = 1;
299
+ let column = 1;
300
+ const end = Math.min(Math.max(offset, 0), source.length);
301
+ for (let i = 0; i < end; i += 1) {
302
+ if (source[i] === "\n") {
303
+ line += 1;
304
+ column = 1;
305
+ }
306
+ else {
307
+ column += 1;
308
+ }
309
+ }
310
+ return { line, column };
311
+ }
312
+ //# sourceMappingURL=biome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biome.js","sourceRoot":"","sources":["../src/biome.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Returns the process exit code. Kept pure (no `process.exit`) so it is
4
+ * testable without spawning a subprocess.
5
+ */
6
+ export declare function run(argv: string[], out?: (...data: any[]) => void, err?: (...data: any[]) => void, cwd?: string): Promise<number>;
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoCA;;;GAGG;AACH,wBAAsB,GAAG,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,2BAAc,EACjB,GAAG,2BAAgB,EACnB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
package/dist/cli.js ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { biomeEnabled, GENERATED_BIOME_PATH, readBiomeVersion, resolveBiomeBinary, writeGeneratedBiomeConfig, } from "./biome.js";
4
+ import { isStandalone, loadConfig } from "./config.js";
5
+ import { check, loadPluginsFromConfig } from "./engine.js";
6
+ import { GENERATED_RUFF_PATH, readRuffVersion, resolveRuffModule, ruffEnabled, writeGeneratedRuffConfig, } from "./ruff.js";
7
+ const USAGE = `qualety — executable code invariants
8
+
9
+ Usage:
10
+ qualety check [options]
11
+ qualety init
12
+ qualety doctor
13
+
14
+ Options:
15
+ -h, --help Show this help
16
+ --plugin <name> Keep rules from this plugin (repeatable)
17
+ --exclude-plugin <name> Drop rules from this plugin (repeatable)
18
+ --rule <id> Keep this rule id (repeatable)
19
+ --diff Changed files vs merge-base…HEAD, plus dependency closure
20
+ --diff-worktree Dirty/untracked files vs HEAD, plus dependency closure
21
+
22
+ Exit codes: 0 clean, 1 violations found, 2 usage or internal error.`;
23
+ /**
24
+ * Returns the process exit code. Kept pure (no `process.exit`) so it is
25
+ * testable without spawning a subprocess.
26
+ */
27
+ export async function run(argv, out = console.log, err = console.error, cwd = process.cwd()) {
28
+ let positionals;
29
+ let values;
30
+ try {
31
+ ({ positionals, values } = parseArgs({
32
+ args: argv,
33
+ options: {
34
+ help: { type: "boolean", short: "h" },
35
+ plugin: { type: "string", multiple: true },
36
+ "exclude-plugin": { type: "string", multiple: true },
37
+ rule: { type: "string", multiple: true },
38
+ diff: { type: "boolean" },
39
+ "diff-worktree": { type: "boolean" },
40
+ },
41
+ allowPositionals: true,
42
+ }));
43
+ }
44
+ catch (e) {
45
+ err(`${e instanceof Error ? e.message : String(e)}\n\n${USAGE}`);
46
+ return 2;
47
+ }
48
+ if (values.help || positionals.length === 0) {
49
+ out(USAGE);
50
+ return values.help ? 0 : 2;
51
+ }
52
+ return dispatch(positionals, values, out, err, cwd);
53
+ }
54
+ async function dispatch(positionals, values, out, err, cwd) {
55
+ const [command, ...rest] = positionals;
56
+ if (command === "init" || command === "doctor") {
57
+ return runMeta(command, rest, positionals, out, err, cwd);
58
+ }
59
+ if (command !== "check" || rest.length > 0) {
60
+ err(`Unknown command: ${positionals.join(" ")}\n\n${USAGE}`);
61
+ return 2;
62
+ }
63
+ const filters = filtersFromValues(values);
64
+ if (filters === undefined) {
65
+ err(`--diff and --diff-worktree cannot be used together.\n\n${USAGE}`);
66
+ return 2;
67
+ }
68
+ return check(cwd, out, err, filters);
69
+ }
70
+ async function runMeta(command, rest, positionals, out, err, cwd) {
71
+ if (rest.length > 0) {
72
+ err(`Unknown command: ${positionals.join(" ")}\n\n${USAGE}`);
73
+ return 2;
74
+ }
75
+ try {
76
+ if (command !== "init") {
77
+ return await runDoctor(cwd, out);
78
+ }
79
+ const loaded = await loadConfig(cwd);
80
+ if (loaded === undefined) {
81
+ throw new Error("No qualety config found.");
82
+ }
83
+ const plugins = await loadPluginsFromConfig(loaded.config, loaded.path);
84
+ const paths = [await writeGeneratedBiomeConfig(cwd, plugins, loaded.config.biome)];
85
+ if (ruffEnabled(loaded.config)) {
86
+ paths.push(await writeGeneratedRuffConfig(cwd, plugins, loaded.config.ruff));
87
+ }
88
+ out(paths.join("\n"));
89
+ return 0;
90
+ }
91
+ catch (e) {
92
+ err(e instanceof Error ? e.message : String(e));
93
+ return 2;
94
+ }
95
+ }
96
+ async function runDoctor(cwd, out) {
97
+ const loaded = await loadConfig(cwd);
98
+ if (loaded === undefined) {
99
+ out("biome: off (no qualety config)");
100
+ out("ruff: off (no qualety config)");
101
+ return 0;
102
+ }
103
+ if (!biomeEnabled(loaded.config)) {
104
+ out("biome: off (biome: false)");
105
+ }
106
+ else if (isStandalone()) {
107
+ // the embedded wasm build exposes no version accessor, so report the backend only
108
+ out("biome: on\nbackend: embedded wasm");
109
+ }
110
+ else {
111
+ const bin = resolveBiomeBinary();
112
+ const version = await readBiomeVersion(bin, cwd);
113
+ out(`biome: on\nversion: ${version}\nbinary: ${bin}\nconfig: ${GENERATED_BIOME_PATH}`);
114
+ }
115
+ if (!ruffEnabled(loaded.config)) {
116
+ out("ruff: off (ruff: false)");
117
+ }
118
+ else if (isStandalone()) {
119
+ out(`ruff: on\nversion: ${await readRuffVersion()}\nbackend: embedded wasm`);
120
+ }
121
+ else {
122
+ const bin = resolveRuffModule();
123
+ const version = await readRuffVersion(bin);
124
+ out(`ruff: on\nversion: ${version}\nbinary: ${bin}\nconfig: ${GENERATED_RUFF_PATH}`);
125
+ }
126
+ return 0;
127
+ }
128
+ function filtersFromValues(values) {
129
+ if (values.diff === true && values["diff-worktree"] === true) {
130
+ return undefined;
131
+ }
132
+ let diff = "off";
133
+ if (values["diff-worktree"] === true) {
134
+ diff = "worktree";
135
+ }
136
+ else if (values.diff === true) {
137
+ diff = "upstream";
138
+ }
139
+ return {
140
+ plugins: values.plugin ?? [],
141
+ excludePlugins: values["exclude-plugin"] ?? [],
142
+ rules: values.rule ?? [],
143
+ diff,
144
+ };
145
+ }
146
+ if (isStandalone() || (process.argv[1] && import.meta.filename === process.argv[1])) {
147
+ process.exitCode = await run(process.argv.slice(2));
148
+ }
149
+ //# 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,2 @@
1
+ export declare function expandCompanions(cwd: string, workspaceFiles: readonly string[], closedFiles: readonly string[]): string[];
2
+ //# sourceMappingURL=companion-closure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion-closure.d.ts","sourceRoot":"","sources":["../src/companion-closure.ts"],"names":[],"mappings":"AAYA,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,EAAE,CAiBV"}
@@ -0,0 +1,29 @@
1
+ import { resolve } from "node:path";
2
+ const COMPANION_PAIRS = [
3
+ ["docs/rulesets/typescript.md", "packages/typescript/src/index.ts"],
4
+ ["docs/rulesets/react.md", "packages/react/src/index.ts"],
5
+ ["docs/rulesets/dry.md", "packages/dry/src/index.ts"],
6
+ ["docs/rulesets/python.md", "packages/python/src/index.ts"],
7
+ ["docs/rulesets/dev.md", "packages/dev/src/index.ts"],
8
+ ["docs/rulesets/plugin-kit.md", "packages/plugin-kit/src/index.ts"],
9
+ ["docs/api.md", "packages/qualety/src/index.ts"],
10
+ ];
11
+ export function expandCompanions(cwd, workspaceFiles, closedFiles) {
12
+ const workspace = new Set(workspaceFiles.map((file) => resolve(cwd, file)));
13
+ const closed = new Set(closedFiles.map((file) => resolve(cwd, file)));
14
+ for (const [doc, code] of COMPANION_PAIRS) {
15
+ const docAbs = resolve(cwd, doc);
16
+ const codeAbs = resolve(cwd, code);
17
+ if (!closed.has(docAbs) && !closed.has(codeAbs)) {
18
+ continue;
19
+ }
20
+ if (workspace.has(docAbs)) {
21
+ closed.add(docAbs);
22
+ }
23
+ if (workspace.has(codeAbs)) {
24
+ closed.add(codeAbs);
25
+ }
26
+ }
27
+ return [...closed].sort();
28
+ }
29
+ //# sourceMappingURL=companion-closure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion-closure.js","sourceRoot":"","sources":["../src/companion-closure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,eAAe,GAAG;IACtB,CAAC,6BAA6B,EAAE,kCAAkC,CAAC;IACnE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;IACzD,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;IACrD,CAAC,yBAAyB,EAAE,8BAA8B,CAAC;IAC3D,CAAC,sBAAsB,EAAE,2BAA2B,CAAC;IACrD,CAAC,6BAA6B,EAAE,kCAAkC,CAAC;IACnE,CAAC,aAAa,EAAE,+BAA+B,CAAC;CACxC,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,cAAiC,EACjC,WAA8B;IAE9B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ export declare const userConfigSchema: z.ZodObject<{
3
+ plugins: z.ZodArray<z.ZodString>;
4
+ rules: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodEnum<{
5
+ error: "error";
6
+ off: "off";
7
+ warn: "warn";
8
+ }>, z.ZodTuple<[z.ZodEnum<{
9
+ error: "error";
10
+ warn: "warn";
11
+ }>, z.ZodRecord<z.ZodString, z.ZodUnknown>], null>]>>>;
12
+ include: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ exclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ biome: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
15
+ rules: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodEnum<{
16
+ error: "error";
17
+ off: "off";
18
+ warn: "warn";
19
+ }>, z.ZodTuple<[z.ZodEnum<{
20
+ error: "error";
21
+ off: "off";
22
+ warn: "warn";
23
+ }>, z.ZodRecord<z.ZodString, z.ZodUnknown>], null>]>>>;
24
+ format: z.ZodOptional<z.ZodBoolean>;
25
+ }, z.core.$strict>]>>;
26
+ ruff: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodObject<{
27
+ rules: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodEnum<{
28
+ error: "error";
29
+ off: "off";
30
+ warn: "warn";
31
+ }>, z.ZodTuple<[z.ZodEnum<{
32
+ error: "error";
33
+ off: "off";
34
+ warn: "warn";
35
+ }>, z.ZodRecord<z.ZodString, z.ZodUnknown>], null>]>>>;
36
+ format: z.ZodOptional<z.ZodBoolean>;
37
+ }, z.core.$strict>]>>;
38
+ }, z.core.$strict>;
39
+ export type UserConfig = z.infer<typeof userConfigSchema>;
40
+ export declare function isStandalone(): boolean;
41
+ export declare const CONFIG_FILENAMES: readonly ["qualety.config.ts", "qualety.config.mts", "qualety.config.js", "qualety.config.mjs", "qualety.config.json"];
42
+ export declare class ConfigError extends Error {
43
+ constructor(message: string);
44
+ }
45
+ export declare function validateConfig(raw: unknown): UserConfig;
46
+ export declare function loadConfig(cwd: string): Promise<{
47
+ path: string;
48
+ config: UserConfig;
49
+ } | undefined>;
50
+ export declare function readConfigFile(path: string): Promise<UserConfig>;
51
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBASlB,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAO1D,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,eAAO,MAAM,gBAAgB,YAC3B,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,CACb,CAAC;AAEX,qBAAa,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAMvD;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,SAAS,CAAC,CAkB3D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BtE"}