@shivaedev/quality 0.21.1 → 0.22.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 (118) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +24 -8
  3. package/dist/biome/exceptionConfig.d.ts +7 -0
  4. package/dist/biome/exceptionConfig.d.ts.map +1 -0
  5. package/dist/biome/exceptionConfig.js +54 -0
  6. package/dist/biome/exceptionConfig.js.map +1 -0
  7. package/dist/biome/report.d.ts +2 -1
  8. package/dist/biome/report.d.ts.map +1 -1
  9. package/dist/biome/report.js +5 -5
  10. package/dist/biome/report.js.map +1 -1
  11. package/dist/biome/run.d.ts +2 -1
  12. package/dist/biome/run.d.ts.map +1 -1
  13. package/dist/biome/run.js +5 -4
  14. package/dist/biome/run.js.map +1 -1
  15. package/dist/cli/args.d.ts +5 -1
  16. package/dist/cli/args.d.ts.map +1 -1
  17. package/dist/cli/args.js +6 -27
  18. package/dist/cli/args.js.map +1 -1
  19. package/dist/cli/fix.d.ts.map +1 -1
  20. package/dist/cli/fix.js +9 -9
  21. package/dist/cli/fix.js.map +1 -1
  22. package/dist/cli/lint.d.ts.map +1 -1
  23. package/dist/cli/lint.js +2 -1
  24. package/dist/cli/lint.js.map +1 -1
  25. package/dist/cli/messages.d.ts +3 -0
  26. package/dist/cli/messages.d.ts.map +1 -0
  27. package/dist/cli/messages.js +30 -0
  28. package/dist/cli/messages.js.map +1 -0
  29. package/dist/cli/migrateExceptions.d.ts +4 -0
  30. package/dist/cli/migrateExceptions.d.ts.map +1 -0
  31. package/dist/cli/migrateExceptions.js +78 -0
  32. package/dist/cli/migrateExceptions.js.map +1 -0
  33. package/dist/cli.js +3 -0
  34. package/dist/cli.js.map +1 -1
  35. package/dist/config/decode.d.ts +6 -0
  36. package/dist/config/decode.d.ts.map +1 -1
  37. package/dist/config/decode.js +2 -0
  38. package/dist/config/decode.js.map +1 -1
  39. package/dist/config/load.d.ts +4 -0
  40. package/dist/config/load.d.ts.map +1 -1
  41. package/dist/config/load.js +10 -1
  42. package/dist/config/load.js.map +1 -1
  43. package/dist/config/resolve.d.ts.map +1 -1
  44. package/dist/config/resolve.js +11 -1
  45. package/dist/config/resolve.js.map +1 -1
  46. package/dist/config.d.ts +2 -0
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js.map +1 -1
  49. package/dist/engine/run-rules.d.ts +1 -0
  50. package/dist/engine/run-rules.d.ts.map +1 -1
  51. package/dist/engine/run-rules.js +19 -4
  52. package/dist/engine/run-rules.js.map +1 -1
  53. package/dist/engine/session.d.ts.map +1 -1
  54. package/dist/engine/session.js +11 -3
  55. package/dist/engine/session.js.map +1 -1
  56. package/dist/exceptions/biomeFindings.d.ts +4 -0
  57. package/dist/exceptions/biomeFindings.d.ts.map +1 -0
  58. package/dist/exceptions/biomeFindings.js +14 -0
  59. package/dist/exceptions/biomeFindings.js.map +1 -0
  60. package/dist/exceptions/declaration.d.ts +11 -0
  61. package/dist/exceptions/declaration.d.ts.map +1 -0
  62. package/dist/exceptions/declaration.js +24 -0
  63. package/dist/exceptions/declaration.js.map +1 -0
  64. package/dist/exceptions/migrateBiome.d.ts +3 -0
  65. package/dist/exceptions/migrateBiome.d.ts.map +1 -0
  66. package/dist/exceptions/migrateBiome.js +62 -0
  67. package/dist/exceptions/migrateBiome.js.map +1 -0
  68. package/dist/exceptions/migrateConfig.d.ts +3 -0
  69. package/dist/exceptions/migrateConfig.d.ts.map +1 -0
  70. package/dist/exceptions/migrateConfig.js +57 -0
  71. package/dist/exceptions/migrateConfig.js.map +1 -0
  72. package/dist/exceptions/registryEntries.d.ts +4 -0
  73. package/dist/exceptions/registryEntries.d.ts.map +1 -0
  74. package/dist/exceptions/registryEntries.js +6 -0
  75. package/dist/exceptions/registryEntries.js.map +1 -0
  76. package/dist/rule.d.ts +3 -0
  77. package/dist/rule.d.ts.map +1 -1
  78. package/dist/rule.js.map +1 -1
  79. package/dist/rules/biome.js +2 -2
  80. package/dist/rules/biome.js.map +1 -1
  81. package/dist/rules/suppressions/biome/ConsumerDeclaration.d.ts +7 -0
  82. package/dist/rules/suppressions/biome/ConsumerDeclaration.d.ts.map +1 -0
  83. package/dist/rules/suppressions/biome/ConsumerDeclaration.js +15 -0
  84. package/dist/rules/suppressions/biome/ConsumerDeclaration.js.map +1 -0
  85. package/dist/rules/suppressions/biome-overrides.d.ts.map +1 -1
  86. package/dist/rules/suppressions/biome-overrides.js +7 -16
  87. package/dist/rules/suppressions/biome-overrides.js.map +1 -1
  88. package/docs/debt-and-hooks.md +31 -11
  89. package/docs/modules.md +2 -0
  90. package/docs/north-star.md +4 -4
  91. package/docs/roadmap.md +1 -1
  92. package/docs/rules.md +12 -33
  93. package/docs/tooling.md +2 -2
  94. package/package.json +1 -1
  95. package/src/biome/exceptionConfig.ts +70 -0
  96. package/src/biome/report.ts +11 -5
  97. package/src/biome/run.ts +17 -10
  98. package/src/cli/args.ts +7 -29
  99. package/src/cli/fix.ts +14 -9
  100. package/src/cli/lint.ts +3 -1
  101. package/src/cli/messages.ts +31 -0
  102. package/src/cli/migrateExceptions.ts +87 -0
  103. package/src/cli.ts +3 -0
  104. package/src/config/decode.ts +2 -0
  105. package/src/config/load.ts +15 -1
  106. package/src/config/resolve.ts +12 -1
  107. package/src/config.ts +2 -0
  108. package/src/engine/run-rules.ts +21 -4
  109. package/src/engine/session.ts +11 -3
  110. package/src/exceptions/biomeFindings.ts +20 -0
  111. package/src/exceptions/declaration.ts +38 -0
  112. package/src/exceptions/migrateBiome.ts +78 -0
  113. package/src/exceptions/migrateConfig.ts +64 -0
  114. package/src/exceptions/registryEntries.ts +10 -0
  115. package/src/rule.ts +3 -0
  116. package/src/rules/biome.ts +2 -2
  117. package/src/rules/suppressions/biome/ConsumerDeclaration.ts +24 -0
  118. package/src/rules/suppressions/biome-overrides.ts +7 -26
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateBiome.js","sourceRoot":"","sources":["../../src/exceptions/migrateBiome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ExceptionDeclaration } from "./declaration.ts";
2
+ export declare function migrateConfig(text: string | undefined, file: string, exceptions: readonly ExceptionDeclaration[], hasDeclarations: boolean): string;
3
+ //# sourceMappingURL=migrateConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateConfig.d.ts","sourceRoot":"","sources":["../../src/exceptions/migrateConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AA4B7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,oBAAoB,EAAE,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,CAkCnJ"}
@@ -0,0 +1,57 @@
1
+ import ts from "typescript";
2
+ function objectOf(expression) {
3
+ if (ts.isObjectLiteralExpression(expression)) {
4
+ return expression;
5
+ }
6
+ if (ts.isCallExpression(expression) && expression.arguments[0] !== undefined) {
7
+ return objectOf(expression.arguments[0]);
8
+ }
9
+ return ts.isSatisfiesExpression(expression) || ts.isAsExpression(expression) || ts.isParenthesizedExpression(expression)
10
+ ? objectOf(expression.expression)
11
+ : undefined;
12
+ }
13
+ function nameOf(property) {
14
+ const name = property.name;
15
+ if (name === undefined) {
16
+ return undefined;
17
+ }
18
+ if (ts.isComputedPropertyName(name)) {
19
+ if (ts.isStringLiteral(name.expression) || ts.isNoSubstitutionTemplateLiteral(name.expression) || ts.isNumericLiteral(name.expression)) {
20
+ return name.expression.text;
21
+ }
22
+ throw new Error("Cannot migrate a computed property automatically. Use literal property keys, then run quality exceptions migrate again.");
23
+ }
24
+ return ts.isStringLiteral(name) || ts.isIdentifier(name) || ts.isNumericLiteral(name) ? name.text : undefined;
25
+ }
26
+ export function migrateConfig(text, file, exceptions, hasDeclarations) {
27
+ if (text === undefined) {
28
+ return `export default { exceptions: ${JSON.stringify(exceptions, null, "\t")} };\n`;
29
+ }
30
+ const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
31
+ const exported = source.statements.find(ts.isExportAssignment);
32
+ const object = exported === undefined ? undefined : objectOf(exported.expression);
33
+ if (object === undefined || object.properties.some(ts.isSpreadAssignment)) {
34
+ throw new Error(`Cannot migrate ${file} automatically. Export an object or defineConfig({ ... }) without spreads, then run quality exceptions migrate again.`);
35
+ }
36
+ const properties = object.properties.flatMap((property) => {
37
+ const name = nameOf(property);
38
+ if (name === "registry" || name === "exceptions") {
39
+ return [];
40
+ }
41
+ if (name !== "rules" || !hasDeclarations) {
42
+ return [{ name: name ?? "", text: property.getFullText(source).trim() }];
43
+ }
44
+ if (!(ts.isPropertyAssignment(property) && ts.isObjectLiteralExpression(property.initializer))
45
+ || property.initializer.properties.some(ts.isSpreadAssignment)) {
46
+ throw new Error(`Inline the rules object in ${file}, then run quality exceptions migrate again.`);
47
+ }
48
+ const rules = property.initializer.properties.filter((rule) => nameOf(rule) !== "suppressions/biome-overrides");
49
+ return rules.length === 0 ? [] : [{ name: "rules", text: `rules: {\n${rules.map((rule) => rule.getFullText(source).trim()).join(",\n")}\n}` }];
50
+ });
51
+ const next = properties.map((property) => property.text);
52
+ const index = properties.findIndex((property) => property.name > "exceptions");
53
+ next.splice(index < 0 ? next.length : index, 0, `exceptions: ${JSON.stringify(exceptions, null, "\t")}`);
54
+ const replacement = `{\n${next.join(",\n")}\n}`;
55
+ return text.slice(0, object.getStart(source)) + replacement + text.slice(object.end);
56
+ }
57
+ //# sourceMappingURL=migrateConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateConfig.js","sourceRoot":"","sources":["../../src/exceptions/migrateConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ExceptionDeclaration } from "./declaration.ts";
2
+ import type { RegistryEntry } from "./registry.ts";
3
+ export declare function registryEntries(declarations: readonly ExceptionDeclaration[]): readonly RegistryEntry[];
4
+ //# sourceMappingURL=registryEntries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registryEntries.d.ts","sourceRoot":"","sources":["../../src/exceptions/registryEntries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,eAAe,CAAC,YAAY,EAAE,SAAS,oBAAoB,EAAE,GAAG,SAAS,aAAa,EAAE,CAMvG"}
@@ -0,0 +1,6 @@
1
+ export function registryEntries(declarations) {
2
+ return declarations.flatMap(({ files, reason, rules, subject }) => rules
3
+ .filter((rule) => !rule.startsWith("biome/"))
4
+ .flatMap((rule) => files.map((file) => ({ file, reason, rule, ...(subject === undefined ? {} : { subject }) }))));
5
+ }
6
+ //# sourceMappingURL=registryEntries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registryEntries.js","sourceRoot":"","sources":["../../src/exceptions/registryEntries.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,YAA6C;IAC5E,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CACjE,KAAK;SACH,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;SAC5C,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CACjH,CAAC;AACH,CAAC"}
package/dist/rule.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Bivariant } from "@shivaedev/types/bivariant.ts";
2
+ import type { ExceptionDeclaration } from "#exceptions/declaration.ts";
2
3
  import { type StandardSchemaV1 } from "./standard-schema.ts";
3
4
  export interface Finding {
4
5
  readonly count?: number | undefined;
@@ -15,6 +16,8 @@ export interface SourceFile {
15
16
  readonly text: string;
16
17
  }
17
18
  export interface RuleInputs {
19
+ readonly configFile?: string;
20
+ readonly exceptions?: readonly ExceptionDeclaration[];
18
21
  readonly files: readonly string[];
19
22
  readonly readText: (path: string) => Promise<string | undefined>;
20
23
  readonly root: string;
@@ -1 +1 @@
1
- {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
package/dist/rule.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AA0D5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;AAC3H,CAAC"}
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AA4D5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;AAC3H,CAAC"}
@@ -30,8 +30,8 @@ async function presetFinding(readText) {
30
30
  return extendsPreset ? [] : [{ file: path, message: `Extend "${PRESET}" from the root Biome config.`, subject: "preset" }];
31
31
  }
32
32
  const bridge = defineRule({
33
- check: async ({ readText, root }) => {
34
- const [preset, report] = await Promise.all([presetFinding(readText), biomeReport(root, ["check"])]);
33
+ check: async ({ exceptions, readText, root }) => {
34
+ const [preset, report] = await Promise.all([presetFinding(readText), biomeReport(root, ["check"], exceptions)]);
35
35
  return [...preset, ...report.diagnostics.filter((diagnostic) => FAILING.has(diagnostic.severity)).map(findingOf)];
36
36
  },
37
37
  description: "Biome's lint, format and assist findings under the shared preset. `quality fix` applies Biome's lint fixes, unsafe ones included, its assist actions and formatting.",
@@ -1 +1 @@
1
- {"version":3,"file":"biome.js","sourceRoot":"","sources":["../../src/rules/biome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"biome.js","sourceRoot":"","sources":["../../src/rules/biome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Schema } from "effect";
2
+ export declare const ConsumerDeclaration: Schema.Struct<{
3
+ readonly includes: Schema.NonEmptyArray<Schema.NonEmptyString>;
4
+ readonly reason: Schema.String;
5
+ readonly rule: Schema.NonEmptyString;
6
+ }>;
7
+ //# sourceMappingURL=ConsumerDeclaration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsumerDeclaration.d.ts","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/ConsumerDeclaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,eAAO,MAAM,mBAAmB;;;;EAW/B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Schema } from "effect";
2
+ import { Declaration } from "./declarations.js";
3
+ const GLOB = /[*!?[\]{}]/u;
4
+ const DIRECTORY = /^\.?[^./\\*!?[\]{}]+$/u;
5
+ const INDIVIDUAL = /^(?:lint|assist)\/(?!domains\/)[a-zA-Z]+\/[a-zA-Z]+$/u;
6
+ function namedExclusion(pattern) {
7
+ const segments = pattern.slice(pattern.startsWith("!**/") ? 4 : 1).split("/");
8
+ return pattern.startsWith("!") && DIRECTORY.test(segments.at(-1) ?? "") && segments.every((segment) => segment === "*" || DIRECTORY.test(segment));
9
+ }
10
+ export const ConsumerDeclaration = Declaration.check(Schema.makeFilter(({ includes, rule }) => rule === "files/includes"
11
+ ? includes.includes("**") && includes.length > 1 && includes.every((pattern) => pattern === "**" || namedExclusion(pattern))
12
+ : INDIVIDUAL.test(rule) && includes.every((path) => !GLOB.test(path) && /[^/]+\.[^/]+$/u.test(path)), {
13
+ message: "Declare one lint rule or assist action for explicit files, or files/includes with ** and named directory exclusions. Whole checks, groups and blanket scopes cannot be weakened.",
14
+ }));
15
+ //# sourceMappingURL=ConsumerDeclaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsumerDeclaration.js","sourceRoot":"","sources":["../../../../src/rules/suppressions/biome/ConsumerDeclaration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,IAAI,GAAG,aAAa,CAAC;AAC3B,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAC3C,MAAM,UAAU,GAAG,uDAAuD,CAAC;AAE3E,SAAS,cAAc,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9E,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACpJ,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CACnD,MAAM,CAAC,UAAU,CAChB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CACtB,IAAI,KAAK,gBAAgB;IACxB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5H,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EACtG;IACC,OAAO,EACN,kLAAkL;CACnL,CACD,CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"biome-overrides.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"AA8EA,eAAO,MAAM,cAAc;;;;;;EAkBzB,CAAC"}
1
+ {"version":3,"file":"biome-overrides.d.ts","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"AA0DA,eAAO,MAAM,cAAc;;;;;;EAmBzB,CAAC"}
@@ -1,31 +1,21 @@
1
1
  import { Effect, Schema } from "effect";
2
+ import { biomeExceptionHint, missingBiomeFiles } from "#exceptions/biomeFindings.ts";
2
3
  import { defineRule } from "#rule.ts";
4
+ import { ConsumerDeclaration } from "#rules/suppressions/biome/ConsumerDeclaration.ts";
3
5
  import { biomeConfigs } from "#rules/suppressions/biome/configs.ts";
4
- import { Declaration, matches, scoped, scopeText } from "#rules/suppressions/biome/declarations.ts";
6
+ import { matches, scoped, scopeText } from "#rules/suppressions/biome/declarations.ts";
5
7
  import { weakeningsOf } from "#rules/suppressions/biome/weakenings.ts";
6
- const GLOB = /[*!?[\]{}]/u;
7
- const DIRECTORY = /^\.?[^./\\*!?[\]{}]+$/u;
8
- const INDIVIDUAL = /^(?:lint|assist)\/(?!domains\/)[a-zA-Z]+\/[a-zA-Z]+$/u;
9
- function namedExclusion(pattern) {
10
- const segments = pattern.slice(pattern.startsWith("!**/") ? 4 : 1).split("/");
11
- return pattern.startsWith("!") && DIRECTORY.test(segments.at(-1) ?? "") && segments.every((segment) => segment === "*" || DIRECTORY.test(segment));
12
- }
13
- const ConsumerDeclaration = Declaration.check(Schema.makeFilter(({ includes, rule }) => rule === "files/includes"
14
- ? includes.includes("**") && includes.length > 1 && includes.every((pattern) => pattern === "**" || namedExclusion(pattern))
15
- : INDIVIDUAL.test(rule) && includes.every((path) => !GLOB.test(path) && /[^/]+\.[^/]+$/u.test(path)), {
16
- message: "Declare one lint rule or assist action for explicit files, or files/includes with ** and named directory exclusions. Whole checks, groups and blanket scopes cannot be weakened.",
17
- }));
18
8
  const BiomeOverridesOptions = Schema.Struct({
19
9
  declared: Schema.Array(ConsumerDeclaration).pipe(Schema.withDecodingDefaultKey(Effect.succeed([]))),
20
10
  });
21
11
  const shippedBy = ({ base, layers }) => layers.flatMap(({ preset }) => preset === undefined
22
12
  ? []
23
13
  : preset.declared.map(({ includes, rule }) => ({ includes: includes.map((glob) => scoped(base, glob)), rule, specifier: preset.specifier })));
24
- const undeclared = ({ includes, layer, line, rule }) => layer.preset === undefined
14
+ const undeclared = ({ includes, layer, line, rule }, configFile) => layer.preset === undefined
25
15
  ? {
26
16
  file: layer.path,
27
17
  line,
28
- message: `Weakens "${rule}" for ${scopeText(includes)} without a declaration. Repair the code and remove the weakening setting.`,
18
+ message: `Weakens "${rule}" for ${scopeText(includes)} without a declaration. Repair the code and remove the weakening setting.${Schema.is(ConsumerDeclaration)({ includes, reason: "Permanent exception.", rule }) ? biomeExceptionHint(includes, rule, configFile) : ""}`,
29
19
  subject: rule,
30
20
  }
31
21
  : {
@@ -60,7 +50,8 @@ export const biomeOverrides = defineRule({
60
50
  const covered = (weakening) => [...declared, ...shipped].some((declaration) => matches(declaration, weakening));
61
51
  return [
62
52
  ...problems,
63
- ...weakenings.filter((weakening) => !covered(weakening)).map(undeclared),
53
+ ...(await missingBiomeFiles(inputs)),
54
+ ...weakenings.filter((weakening) => !covered(weakening)).map((weakening) => undeclared(weakening, inputs.configFile ?? "quality.config.ts")),
64
55
  ...declared.flatMap(staleOrRepeated(root, weakenings, shipped)),
65
56
  ];
66
57
  },
@@ -1 +1 @@
1
- {"version":3,"file":"biome-overrides.js","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"biome-overrides.js","sourceRoot":"","sources":["../../../src/rules/suppressions/biome-overrides.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ quality lint
33
33
 
34
34
  ### Baseline growth
35
35
 
36
- An error-level finding that neither the registry nor the baseline covers fails `quality lint`; that is how new debt gets noticed. The baseline itself may grow: a reviewer sees each new or raised entry in the diff and judges it. When the failing findings are debt the baseline should keep, such as the debt of a file that moved or was renamed, record the rule again with `quality baseline write --rule <id>`. The report ends with that command for the rules that failed. Then call out the baseline growth in the pull request description.
36
+ An error-level finding that neither the config exceptions nor the baseline covers fails `quality lint`; that is how new debt gets noticed. The baseline itself may grow: a reviewer sees each new or raised entry in the diff and judges it. When the failing findings are debt the baseline should keep, such as the debt of a file that moved or was renamed, record the rule again with `quality baseline write --rule <id>`. The report ends with that command for the rules that failed. Then call out the baseline growth in the pull request description.
37
37
 
38
38
  When an upgrade adds a shared check, keep its default error level, inspect its findings and record retained debt with `quality baseline write --rule <id>`. Review any new counts in the commit.
39
39
 
@@ -41,19 +41,39 @@ When an upgrade adds a shared check, keep its default error level, inspect its f
41
41
 
42
42
  A count depends on the rule's limit, so a Quality policy change that adjusts a limit shifts every count of that rule. The public API also exposes numeric overrides; that does not make tuning thresholds an adoption step. Prefer the shared defaults. A looser limit leaves entries that allow more than is left: they pass, and `tighten` and `prune` lower them. A stricter limit can make an error-level rule's files fail `quality lint`, since each is now further over the limit. Inspect the findings under the new policy before recording retained debt again with `quality baseline write --rule <id>`. Commit the counts with the policy upgrade. The raised entries show in the diff, and the pull request calls them out.
43
43
 
44
- ## Registry
44
+ ## Exceptions
45
45
 
46
- ```json
47
- [
48
- {
49
- "rule": "structure/max-lines",
50
- "file": "src/generated/client.ts",
51
- "reason": "Generated from the OpenAPI document; splitting it would mean forking the generator."
52
- }
53
- ]
46
+ Declare permanent exceptions in `quality.config.ts`, in `exceptions`. One entry names `files`, `rules` and one `reason`; it can cover both Quality and Biome rules on the same file:
47
+
48
+ ```ts
49
+ export default defineConfig({
50
+ exceptions: [
51
+ {
52
+ files: ["src/parse.ts"],
53
+ reason: "This parser documents and returns the external format unchanged.",
54
+ rules: ["comments/no-jsdoc", "biome/lint/suspicious/noExplicitAny"],
55
+ },
56
+ ],
57
+ });
58
+ ```
59
+
60
+ Paths are explicit, relative to the config folder. A Quality exception can add `subject` to cover only that finding's subject. Rules that refuse exceptions still refuse them. Quality exceptions apply before the baseline and must cover a current finding; unknown rules, refused rules and stale entries fail the gate. Biome declarations permit individual lint rules and assist actions on explicit files, without a subject. A Biome declaration naming a missing file fails too.
61
+
62
+ Quality merges the native Biome overrides into a temporary config beside the root config, preserving the repository's settings, preset and plugins, and removes the temporary file after the command. Both `quality lint` and `quality fix` use it. Keep `biome.json` free of consumer exception settings; a manual weakening is still reported. Direct editor or Biome commands use the checked-in config; run Quality to apply its exceptions.
63
+
64
+ For a generated directory exclusion, use `rules: ["biome/files/includes"]` and `files: ["**", "!**/test-support/generated"]`. The [rule reference](./rules.md#declared-biome-overrides) describes the narrow directory pattern policy.
65
+
66
+ ### Upgrade existing exceptions
67
+
68
+ ```sh
69
+ quality exceptions migrate
70
+ quality fix
71
+ quality lint
54
72
  ```
55
73
 
56
- An entry covers a rule's violations in one file, for good, and must say why. With a `subject`, it covers only the violations with that subject. The registry applies before the baseline. An entry that covers nothing, or names a rule that is off, unknown or takes no exceptions, fails the gate until it is removed.
74
+ The command reads the legacy registry (the configured `registry` path, or `quality/registry.json`) and `suppressions/biome-overrides.options.declared`. It moves them into `exceptions`, merges declarations with the same files, reason and subject, deletes the old registry and removes the old rule setting and matching root Biome settings. It keeps other config properties. `--from <registry>` selects another legacy registry and `--config <file>` selects a config. Without a config it creates one.
75
+
76
+ Export an object or `defineConfig({ ... })` without spreads for automatic editing; inline the `rules` object when it contains old Biome declarations. Literal computed keys such as `["exceptions"]` are supported; replace dynamic computed keys with literal keys before migrating. Unsupported shapes fail before any writes. Review the diff and remove unused declaration imports and files. For declarations of settings in nested or extended local Biome configs, remove those settings too; automatic removal covers the root `biome.json` and `biome.jsonc`. Legacy readers keep existing consumers running during upgrades; new exceptions go in `exceptions`.
57
77
 
58
78
  ## Pre-commit hook
59
79
 
package/docs/modules.md CHANGED
@@ -69,6 +69,8 @@ A module link opens its source. Type and value declarations with the same name a
69
69
 
70
70
  | Module | Exported names |
71
71
  | --- | --- |
72
+ | [exceptions/declaration.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/declaration.ts) | `ExceptionDeclaration`, `decodeExceptions` |
73
+ | [exceptions/registryEntries.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/registryEntries.ts) | `registryEntries` |
72
74
  | [exceptions/registry.ts](https://github.com/ShivaeDev/platform/blob/main/packages/quality/src/exceptions/registry.ts) | `RegistryEntry`, `decodeRegistry`, `StaleRegistryEntry`, `RegistryCheck`, `applyRegistry` |
73
75
 
74
76
  ## git
@@ -12,7 +12,7 @@ A consuming repository gets the whole policy. It does not select a preset of sta
12
12
 
13
13
  The repository supplies facts Quality cannot infer: where the source and generated files live, which architectural boundaries its imports must respect, and which additional commands a commit must run. Shared Biome and TypeScript configuration and Vitest helpers carry the package's conventions into those tools. The usual setup should stay small, with defaults that make sense together.
14
14
 
15
- Adopting the whole policy does not require fixing all old debt in one change. The baseline records existing findings by rule and file while the checks stay strict. An uncovered finding asks for a repair. Fixing debt passes immediately, and lowering tools reduce its recorded counts. A permitted permanent exception lives in a registry with a reason. When that exception no longer applies, the gate asks for its removal.
15
+ Adopting the whole policy does not require fixing all old debt in one change. The baseline records existing findings by rule and file while the checks stay strict. An uncovered finding asks for a repair. Fixing debt passes immediately, and lowering tools reduce its recorded counts. A permitted permanent exception lives in the config with a reason, once for both Quality and Biome. When that exception no longer applies, the gate asks for its removal.
16
16
 
17
17
  Every finding should tell an agent that has never used the package what to change. It names the rule and identifies the file and line when available. Invalid input, an unreadable policy or an import boundary with contradictory examples must stop the run rather than make a check silently narrower.
18
18
 
@@ -21,7 +21,7 @@ Every finding should tell an agent that has never used the package what to chang
21
21
  - Adoption is a small setup task. A repository uses the shared defaults instead of maintaining its own catalogue of rules and levels.
22
22
  - Quality's rules, tool configuration and internal exceptions express one policy. A new shared convention belongs here, with a reason and accepted and rejected examples.
23
23
  - Repository-specific inputs describe code and architecture. A generated path or import fence does not become permission to choose a weaker standard.
24
- - The config, inventory, rule evaluation, registry, baseline and report form one path. Checks use that path instead of inventing their own debt handling.
24
+ - The config, inventory, rule evaluation, exceptions, baseline and report form one path. Checks use that path instead of inventing their own debt handling.
25
25
  - A rule defines exactly what it checks. CLI and git promises have real-command tests; package promises have installed-consumer tests. Messages never imply stronger guarantees than those tests prove.
26
26
  - Debt diffs are reviewable. Lowering one entry preserves unrelated lines, and a tracked move can carry the debt it already had.
27
27
  - The author retains choices the checker cannot make, including symbol names, semantic code order and whether a newly recorded finding is acceptable debt.
@@ -36,7 +36,7 @@ The public configuration surface and its gaps are recorded in the [roadmap](./ro
36
36
 
37
37
  ### Strictness and adoption
38
38
 
39
- Adopt the policy as a whole; record old debt instead of weakening it. The baseline exposes uncovered findings without demanding an immediate clean-up of every file. It is a record to review, not proof that retained debt is harmless. Explicit recording can raise counts, and a reviewer owns whether that growth is justified. A registry entry is for an enduring, explained exception a rule permits, not a substitute for following that rule.
39
+ Adopt the policy as a whole; record old debt instead of weakening it. The baseline exposes uncovered findings without demanding an immediate clean-up of every file. It is a record to review, not proof that retained debt is harmless. Explicit recording can raise counts, and a reviewer owns whether that growth is justified. A config exception is for an enduring, explained exception a rule permits, not a substitute for following that rule.
40
40
 
41
41
  ### Automation and judgement
42
42
 
@@ -56,6 +56,6 @@ A rule can require a test's name or report a fixture-writing call. It cannot est
56
56
  - A requirement for every repository to build its own rules or copy a complicated config before it can use Quality.
57
57
  - Application services, persistence, transactions, request identity, client state and other runtime framework jobs. Their owning packages implement them.
58
58
  - A replacement for TypeScript, Biome, Vitest or git.
59
- - Automatic approval of baseline growth or a registry reason. Review owns whether retained debt is justified.
59
+ - Automatic approval of baseline growth or a exception reason. Review owns whether retained debt is justified.
60
60
  - A promise that static imports reproduce every runtime loader or that syntax rules prove business behavior.
61
61
  - Renaming public symbols or changing APIs to satisfy a rule whose maintainer decision remains open.
package/docs/roadmap.md CHANGED
@@ -7,7 +7,7 @@ This page owns Quality's shared policy, tooling, CLI and hook implementation sta
7
7
  - [x] Optional typed and runtime-validated config with config-free defaults; built-in and local rules enforced at `error`; local-rule and Standard Schema option APIs; one checked inventory and one report grouped by rule.
8
8
  - [x] The public config rejects `warn`, `off`, raised thresholds, inventory exclusions and custom test-file patterns. Vitest projects reject suite exclusions. Reasoned Biome declarations cover individual rules on explicit files and named directory exclusions.
9
9
  - [x] A JSON Lines baseline with counted debt, explicit named-rule recording, lowering and pruning, tracked-move handling and preservation of unrelated lines.
10
- - [x] A registry of reasoned exceptions with optional subjects, detection of stale entries and rules that refuse exceptions.
10
+ - [x] One reasoned config exception list for Quality and Biome, generated native Biome settings at lint and fix time, legacy migration, optional Quality subjects, stale entries and rules that refuse exceptions.
11
11
  - [x] File-size and comment rules; inline-suppression, double-cast, deprecation-setting and declared-Biome-override checks.
12
12
  - [x] A shared Biome preset and bridge whose error findings use the gate's baseline; enforcement of the installed Biome's recommended rules; bounded fix rounds and selected fixes left to the author.
13
13
  - [x] Static import resolution, rejection of production imports of test code, runtime-cycle checks, same-folder relative imports and direct, transitive and vocabulary fences with validated examples.
package/docs/rules.md CHANGED
@@ -49,7 +49,7 @@ A repository with existing comments adopts the rules through the baseline, for e
49
49
 
50
50
  ### Suppressions
51
51
 
52
- A check that is silenced at one site hides the problem instead of fixing it. Five rules close the escape hatches, and none of them takes registry exceptions: a registry entry that names one fails the gate as stale. A repository with existing suppressions adopts the rules through the baseline.
52
+ A check that is silenced at one site hides the problem instead of fixing it. Five rules close the escape hatches, and none of them takes exceptions: an exception that names one fails the gate as stale. A repository with existing suppressions adopts the rules through the baseline.
53
53
 
54
54
  | Rule | Reports | Options |
55
55
  | --- | --- | --- |
@@ -79,7 +79,9 @@ A type test proves that an API rejects what its types forbid, and TypeScript ass
79
79
 
80
80
  #### Declared Biome overrides
81
81
 
82
- Consumer declarations cover one lint rule or assist action on explicit file paths, with a reason. Globs, whole checks and rule groups cannot be declared. A `files/includes` declaration must retain `**` and add only negative patterns naming a concrete directory, such as `!**/test-support/generated`. These patterns may start with `**/` and use `*` for an intermediate directory, as in `!**/test-support/*/generated`. Every other segment names a directory without dots except an optional leading dot; the final segment must be a name. File patterns, nested `**` and wildcard suffixes are rejected. Shipped preset declarations describe Quality's internal policy and are not subject to the consumer scope restriction.
82
+ Consumer exceptions belong in `quality.config.ts`'s `exceptions` list, as `{ files, rules, reason, subject? }`. A single entry covers Quality rules and individual `biome/lint/<group>/<rule>` or `biome/assist/<group>/<action>` rules on explicit file paths. Quality applies the native Biome settings at lint and fix time; do not mirror them in `biome.json`. See [exceptions and upgrades](./debt-and-hooks.md#exceptions).
83
+
84
+ Globs, whole checks and rule groups cannot be excepted. A `biome/files/includes` entry must retain `**` and add only negative patterns naming a concrete directory, such as `!**/test-support/generated`. These patterns may start with `**/` and use `*` for an intermediate directory, as in `!**/test-support/*/generated`. Every other segment names a directory without dots except an optional leading dot; the final segment must be a name. File patterns, nested `**` and wildcard suffixes are rejected. Shipped preset declarations describe Quality's internal policy and are not subject to the consumer scope restriction.
83
85
 
84
86
  Quality ships reasons for its own internal Biome exceptions. Extend the shared configuration and use the baseline for debt. `suppressions/biome-overrides` reads `biome.json` or `biome.jsonc` at the root, every nested `biome.json` and `biome.jsonc` among the checked files, and the configs each of them `extends`, resolved the way Biome resolves them (see [Shared presets](#shared-presets)). These settings count as overrides, at the top level and in every `overrides` entry:
85
87
 
@@ -99,30 +101,7 @@ Quality ships reasons for its own internal Biome exceptions. Extend the shared c
99
101
 
100
102
  Biome runs assist actions, key sorting among them, as part of `biome check` and reports what they would change, so turning one off is an override. Formatter options such as `indentStyle` or `lineWidth` choose a style, not an exception, and are not overrides. Settings that raise a rule or enable it are not overrides either. Rule options are not read, so an option that loosens a rule, such as a higher complexity limit, is left to review.
101
103
 
102
- ```ts
103
- export default defineConfig({
104
- rules: {
105
- "suppressions/biome-overrides": {
106
- options: {
107
- declared: [
108
- {
109
- rule: "lint/style/noDefaultExport",
110
- includes: ["scripts/tool.config.ts"],
111
- reason: "Tools load their config files through the default export.",
112
- },
113
- {
114
- rule: "lint/suspicious/noConsole",
115
- includes: ["scripts/report.ts"],
116
- reason: "Scripts report to the terminal they run in.",
117
- },
118
- ],
119
- },
120
- },
121
- },
122
- });
123
- ```
124
-
125
- A declaration covers a setting when its `rule` and its `includes` match the setting's exactly, in any order. An `includes` list that keeps files out is declared as the whole list, so every pattern added to it needs the declaration to change too. A setting at the top level of the root config has the scope `["**"]`, and an `overrides` entry has its own `includes` (`["**"]` when it has none). Paths in a nested config are relative to its folder, so a rule scoped to `"src/a.ts"` in `packages/web/biome.json` is declared as `"packages/web/src/a.ts"`. Top-level and globbed rule scopes cannot be declared by consumers. A setting without a declaration is reported at its line in the Biome config; a declaration that no setting matches is reported against the root config, so the list cannot outlive the overrides it explains.
104
+ A manual setting without a legacy declaration is reported at its line in the Biome config. The compatibility reader matches the old `{ rule, includes, reason }` declarations to settings with the same rule and exact scope, in any order, and reports stale or repeated declarations. Run `quality exceptions migrate` to replace both with the single config entry. A generated override never makes a checked-in manual override declared.
126
105
 
127
106
  #### Shared presets
128
107
 
@@ -134,7 +113,7 @@ A config `extends` its entries the way Biome does:
134
113
  - Lists are appended, not replaced: `overrides`, `plugins` and every `includes` list, `files.includes` among them. A repository's `files.includes` adds to the preset's, so each list is declared by whoever wrote it.
135
114
  - Patterns in an extended config resolve against the repository root, or against the folder of a nested config that extends it, as patterns in the config itself do.
136
115
 
137
- A package that ships a preset declares the weakenings the preset makes in a `declarations.json` beside the preset file, as an array of the same `{ rule, includes, reason }` entries the `declared` option takes. Its `includes` are written relative to the repository that extends the preset. Those weakenings count as declared, so the repository adds nothing for them:
116
+ A package that ships a preset declares the weakenings the preset makes in a `declarations.json` beside the preset file, as an array of `{ rule, includes, reason }` entries. Its `includes` are written relative to the repository that extends the preset. Those weakenings count as declared, so the repository adds nothing for them:
138
117
 
139
118
  ```json
140
119
  [
@@ -146,7 +125,7 @@ A package that ships a preset declares the weakenings the preset makes in a `dec
146
125
  ]
147
126
  ```
148
127
 
149
- A weakening the preset makes without such a declaration is reported at the line of the repository's `extends` entry, and the repository's own declaration covers it. A weakening the repository adds beyond the preset needs its own declaration, and a repository declaration that repeats one the preset ships is reported until it is removed. A preset entry that cannot be resolved or read, or whose `declarations.json` is invalid, is reported at the `extends` entry as well.
128
+ A weakening the preset makes without such a declaration is reported at the line of the repository's `extends` entry, and the repository must repair the preset or replace that setting with a config exception. A weakening the repository adds beyond the preset needs its own declaration, and a repository declaration that repeats one the preset ships is reported until it is removed. A preset entry that cannot be resolved or read, or whose `declarations.json` is invalid, is reported at the `extends` entry as well.
150
129
 
151
130
  #### Recommended Biome rules
152
131
 
@@ -181,7 +160,7 @@ export default defineConfig({
181
160
  });
182
161
  ```
183
162
 
184
- `imports/cycles` reports each group of modules that import each other at run time once, at the alphabetically first of them, with one loop through the group. Its count is the number of modules in the group. `import type`, `export type`, type references and imports in declaration files are left out; `import { type X }` stays a runtime import. Dynamic `import()` and `require()` count; `require.resolve()` does not. It takes no registry exceptions. Each finding of `imports/resolvable` has the import as its subject.
163
+ `imports/cycles` reports each group of modules that import each other at run time once, at the alphabetically first of them, with one loop through the group. Its count is the number of modules in the group. `import type`, `export type`, type references and imports in declaration files are left out; `import { type X }` stays a runtime import. Dynamic `import()` and `require()` count; `require.resolve()` does not. It takes no exceptions. Each finding of `imports/resolvable` has the import as its subject.
185
164
 
186
165
  When the sources hold no module at all, the graph-building rules stop the run instead of passing on an empty graph. Point `sources` at the code; do not disable the checks to conceal an empty inventory. `imports/aliased` does not require a graph, and `imports/fences` does nothing when no fences are declared.
187
166
 
@@ -254,13 +233,13 @@ The DSL does not compile without `demonstratedBy`, and the rule checks the examp
254
233
 
255
234
  Fences guard shipped code, and [test code](./naming.md#test-code) ships nowhere, so a fence never holds it: a test file or a file under `test-support/` may import across every fence. There is no option to check them.
256
235
 
257
- A finding has its fence's name as its subject, so a registry entry with that subject excuses one file from one fence.
236
+ A finding has its fence's name as its subject, so a config exception with that subject excuses one file from one fence.
258
237
 
259
- `imports/no-test-code` checks every file edge from a production module to a test file or a file under `test-support/`, including type imports, re-exports and test assets. It rejects missing relative paths under `test-support/` too. Test importers may still import production code and other test code. Move shared code into a production module and import it from both production and tests. The rule takes no registry exceptions.
238
+ `imports/no-test-code` checks every file edge from a production module to a test file or a file under `test-support/`, including type imports, re-exports and test assets. It rejects missing relative paths under `test-support/` too. Test importers may still import production code and other test code. Move shared code into a production module and import it from both production and tests. The rule takes no exceptions.
260
239
 
261
240
  ### Manifests
262
241
 
263
- `manifests/sorted` keeps every `package.json` in the repository in the key order of [sort-package-json](https://github.com/keithamus/sort-package-json), a dependency of this package. It walks the whole repository, not only the sources, and skips untracked files ignored by git and `node_modules`. A manifest that is not valid JSON is reported too. `quality fix` sorts the manifests, and the rule takes no registry exceptions.
242
+ `manifests/sorted` keeps every `package.json` in the repository in the key order of [sort-package-json](https://github.com/keithamus/sort-package-json), a dependency of this package. It walks the whole repository, not only the sources, and skips untracked files ignored by git and `node_modules`. A manifest that is not valid JSON is reported too. `quality fix` sorts the manifests, and the rule takes no exceptions.
264
243
 
265
244
  ## Local-rule API
266
245
 
@@ -307,4 +286,4 @@ export const limited = defineRule({
307
286
  });
308
287
  ```
309
288
 
310
- This is the option-bearing rule the package tests. It defaults to two files and validates a configured `max` before the asynchronous check runs. A rule without an options schema refuses options. Set `registrable: false` when a rule must never be excused by a registry entry.
289
+ This is the option-bearing rule the package tests. It defaults to two files and validates a configured `max` before the asynchronous check runs. A rule without an options schema refuses options. Set `registrable: false` when a rule must never be excused by a config exception.
package/docs/tooling.md CHANGED
@@ -26,7 +26,7 @@ The preset turns off `noUnusedVariables` and `noUnusedFunctionParameters`, becau
26
26
 
27
27
  The preset reports `useSortedClasses` at `error` with its fix enabled for class attributes and calls to `cn`, `clsx` and `cva`. Tailwind output does not depend on the order of classes in an attribute, so sorting is safe.
28
28
 
29
- The preset sets `noDelete` to `off` because its fix changed behavior or did not finish on real code. `noUndeclaredClasses` is off because its class resolution does not cover aliases and Tailwind utilities; `noInlineStyles` is off because computed values need inline styles. Quality owns these choices and ships their reasons in `declarations.json`. They do not require consumer declarations. The exposed consumer-declaration API is described under [declared Biome overrides](./rules.md#declared-biome-overrides); use the shared defaults for adoption.
29
+ The preset sets `noDelete` to `off` because its fix changed behavior or did not finish on real code. `noUndeclaredClasses` is off because its class resolution does not cover aliases and Tailwind utilities; `noInlineStyles` is off because computed values need inline styles. Quality owns these choices and ships their reasons in `declarations.json`. They do not require consumer declarations. The config exception API is described under [declared Biome overrides](./rules.md#declared-biome-overrides); use the shared defaults for adoption.
30
30
 
31
31
  The preset keeps the following rules at `error` with their fixes off so the author decides the repair: `noAccessKey`, `noAriaHiddenOnFocusable`, `noAutofocus`, `noInteractiveElementToNoninteractiveRole`, `noNoninteractiveElementToInteractiveRole`, `noNoninteractiveTabindex`, `noRedundantRoles`, `useValidAriaProps`, `useValidAriaRole`, `noImportantStyles`, `noConstAssign`, `noProcessGlobal`, `useJsonImportAttributes`, `noUnusedPrivateClassMembers`, `useExhaustiveDependencies`, `noFloatingPromises`, `noMisusedPromises`, `useExhaustiveSwitchCases`, `noEqualsToNull`, `useConsistentArrayType`, `useConsistentCurlyBraces`, `useConsistentTestIt`, `useRegexpTest`, `useUnicodeRegex`, `noNonNullAssertion`, `useAtIndex`, `noParametersOnlyUsedInRecursion`, `noSkippedTests` and `useNamingConvention`. The fix command also skips `noDuplicateObjectKeys` and `useSortedKeys`. Import `process` from `node:process` in Node code or use the application's Effect service. Write JSON imports with `with { type: "json" }` for Node 24; the fixer leaves both choices to the author.
32
32
 
@@ -38,7 +38,7 @@ The preset keeps the following rules at `error` with their fixes off so the auth
38
38
 
39
39
  `noSkippedTests` has no automatic fix because enabling a skipped test can change which setup and bodies run; the author must repair the test or remove a claim it cannot prove.
40
40
 
41
- The `biome` rule runs `biome check` with the repository's config and reports each finding as `biome/<category>`, such as `biome/lint/style/useBlockStatements`, `biome/assist/source/useSortedKeys`, `biome/format` or `biome/plugin`, so Biome's findings go through the baseline like any other rule's. `quality baseline write --rule biome` takes in every Biome category at once. A finding below `error` is not reported; a consumer exception for an individual rule therefore needs an explicit file scope and a reason. Whole-check, group and blanket-scope declarations are rejected; see [configuration limits](../README.md#configuration-limits). The rule also asks for a root `biome.json` or `biome.jsonc` that extends the preset, and it takes no registry exceptions. A Biome config that Biome cannot load stops the run with Biome's message.
41
+ The `biome` rule runs `biome check` with the repository's config and reports each finding as `biome/<category>`, such as `biome/lint/style/useBlockStatements`, `biome/assist/source/useSortedKeys`, `biome/format` or `biome/plugin`, so Biome's findings go through the baseline like any other rule's. `quality baseline write --rule biome` takes in every Biome category at once. A finding below `error` is not reported; a consumer exception for an individual rule therefore lives in the config exceptions list with explicit files and a reason. Quality applies its Biome settings during lint and fix. Whole-check, group and blanket-scope declarations are rejected; see [configuration limits](../README.md#configuration-limits). The rule also asks for a root `biome.json` or `biome.jsonc` that extends the preset, and it refuses legacy registry exceptions. A Biome config that Biome cannot load stops the run with Biome's message.
42
42
 
43
43
  `quality fix` sorts the discovered manifests, then runs `biome check --write --unsafe`, with the two skipped fixes above. It then runs Biome's formatter, because a lint fix can leave code unformatted. One fix can make room for another, so it repeats both passes until a round rewrites nothing, at most five rounds. When files still change in the fifth round, it names the changed text files it can discover and exits 2; when those files are outside its inventory, the error gives a verbose Biome command to name them. An unsafe fix can change behavior, such as `==` becoming `===`, so review what it changed.
44
44
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/quality",
3
- "version": "0.21.1",
3
+ "version": "0.22.0",
4
4
  "description": "Repository quality gate with typed rules, a baseline of existing debt and a registry of reasoned exceptions",
5
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/quality#readme",
6
6
  "bugs": {