@rcrsr/rill-cli 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/check/config.d.ts +20 -0
- package/dist/check/config.d.ts.map +1 -0
- package/dist/check/config.js +151 -0
- package/dist/check/config.js.map +1 -0
- package/dist/check/fixer.d.ts +39 -0
- package/dist/check/fixer.d.ts.map +1 -0
- package/dist/check/fixer.js +119 -0
- package/dist/check/fixer.js.map +1 -0
- package/dist/check/index.d.ts +10 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +21 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/rules/anti-patterns.d.ts +65 -0
- package/dist/check/rules/anti-patterns.d.ts.map +1 -0
- package/dist/check/rules/anti-patterns.js +481 -0
- package/dist/check/rules/anti-patterns.js.map +1 -0
- package/dist/check/rules/closures.d.ts +66 -0
- package/dist/check/rules/closures.d.ts.map +1 -0
- package/dist/check/rules/closures.js +370 -0
- package/dist/check/rules/closures.js.map +1 -0
- package/dist/check/rules/collections.d.ts +90 -0
- package/dist/check/rules/collections.d.ts.map +1 -0
- package/dist/check/rules/collections.js +373 -0
- package/dist/check/rules/collections.js.map +1 -0
- package/dist/check/rules/conditionals.d.ts +41 -0
- package/dist/check/rules/conditionals.d.ts.map +1 -0
- package/dist/check/rules/conditionals.js +134 -0
- package/dist/check/rules/conditionals.js.map +1 -0
- package/dist/check/rules/flow.d.ts +46 -0
- package/dist/check/rules/flow.d.ts.map +1 -0
- package/dist/check/rules/flow.js +206 -0
- package/dist/check/rules/flow.js.map +1 -0
- package/dist/check/rules/formatting.d.ts +143 -0
- package/dist/check/rules/formatting.d.ts.map +1 -0
- package/dist/check/rules/formatting.js +656 -0
- package/dist/check/rules/formatting.js.map +1 -0
- package/dist/check/rules/helpers.d.ts +26 -0
- package/dist/check/rules/helpers.d.ts.map +1 -0
- package/dist/check/rules/helpers.js +66 -0
- package/dist/check/rules/helpers.js.map +1 -0
- package/dist/check/rules/index.d.ts +21 -0
- package/dist/check/rules/index.d.ts.map +1 -0
- package/dist/check/rules/index.js +78 -0
- package/dist/check/rules/index.js.map +1 -0
- package/dist/check/rules/loops.d.ts +77 -0
- package/dist/check/rules/loops.d.ts.map +1 -0
- package/dist/check/rules/loops.js +310 -0
- package/dist/check/rules/loops.js.map +1 -0
- package/dist/check/rules/naming.d.ts +21 -0
- package/dist/check/rules/naming.d.ts.map +1 -0
- package/dist/check/rules/naming.js +174 -0
- package/dist/check/rules/naming.js.map +1 -0
- package/dist/check/rules/strings.d.ts +28 -0
- package/dist/check/rules/strings.d.ts.map +1 -0
- package/dist/check/rules/strings.js +79 -0
- package/dist/check/rules/strings.js.map +1 -0
- package/dist/check/rules/types.d.ts +41 -0
- package/dist/check/rules/types.d.ts.map +1 -0
- package/dist/check/rules/types.js +167 -0
- package/dist/check/rules/types.js.map +1 -0
- package/dist/check/types.d.ts +112 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +6 -0
- package/dist/check/types.js.map +1 -0
- package/dist/check/validator.d.ts +18 -0
- package/dist/check/validator.d.ts.map +1 -0
- package/dist/check/validator.js +110 -0
- package/dist/check/validator.js.map +1 -0
- package/dist/check/visitor.d.ts +33 -0
- package/dist/check/visitor.d.ts.map +1 -0
- package/dist/check/visitor.js +259 -0
- package/dist/check/visitor.js.map +1 -0
- package/dist/cli-check.d.ts +43 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-check.js +366 -0
- package/dist/cli-check.js.map +1 -0
- package/dist/cli-error-enrichment.d.ts +73 -0
- package/dist/cli-error-enrichment.d.ts.map +1 -0
- package/dist/cli-error-enrichment.js +205 -0
- package/dist/cli-error-enrichment.js.map +1 -0
- package/dist/cli-error-formatter.d.ts +45 -0
- package/dist/cli-error-formatter.d.ts.map +1 -0
- package/dist/cli-error-formatter.js +218 -0
- package/dist/cli-error-formatter.js.map +1 -0
- package/dist/cli-eval.d.ts +15 -0
- package/dist/cli-eval.d.ts.map +1 -0
- package/dist/cli-eval.js +116 -0
- package/dist/cli-eval.js.map +1 -0
- package/dist/cli-exec.d.ts +58 -0
- package/dist/cli-exec.d.ts.map +1 -0
- package/dist/cli-exec.js +326 -0
- package/dist/cli-exec.js.map +1 -0
- package/dist/cli-explain.d.ts +24 -0
- package/dist/cli-explain.d.ts.map +1 -0
- package/dist/cli-explain.js +68 -0
- package/dist/cli-explain.js.map +1 -0
- package/dist/cli-lsp-diagnostic.d.ts +35 -0
- package/dist/cli-lsp-diagnostic.d.ts.map +1 -0
- package/dist/cli-lsp-diagnostic.js +98 -0
- package/dist/cli-lsp-diagnostic.js.map +1 -0
- package/dist/cli-module-loader.d.ts +19 -0
- package/dist/cli-module-loader.d.ts.map +1 -0
- package/dist/cli-module-loader.js +83 -0
- package/dist/cli-module-loader.js.map +1 -0
- package/dist/cli-shared.d.ts +62 -0
- package/dist/cli-shared.d.ts.map +1 -0
- package/dist/cli-shared.js +158 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +62 -0
- package/dist/cli.js.map +1 -0
- package/dist/test-internal-import.d.ts +2 -0
- package/dist/test-internal-import.d.ts.map +1 -0
- package/dist/test-internal-import.js +7 -0
- package/dist/test-internal-import.js.map +1 -0
- package/package.json +24 -0
- package/src/check/config.ts +202 -0
- package/src/check/fixer.ts +174 -0
- package/src/check/index.ts +39 -0
- package/src/check/rules/anti-patterns.ts +585 -0
- package/src/check/rules/closures.ts +445 -0
- package/src/check/rules/collections.ts +437 -0
- package/src/check/rules/conditionals.ts +155 -0
- package/src/check/rules/flow.ts +262 -0
- package/src/check/rules/formatting.ts +811 -0
- package/src/check/rules/helpers.ts +89 -0
- package/src/check/rules/index.ts +140 -0
- package/src/check/rules/loops.ts +372 -0
- package/src/check/rules/naming.ts +242 -0
- package/src/check/rules/strings.ts +104 -0
- package/src/check/rules/types.ts +214 -0
- package/src/check/types.ts +163 -0
- package/src/check/validator.ts +136 -0
- package/src/check/visitor.ts +338 -0
- package/src/cli-check.ts +456 -0
- package/src/cli-error-enrichment.ts +274 -0
- package/src/cli-error-formatter.ts +313 -0
- package/src/cli-eval.ts +145 -0
- package/src/cli-exec.ts +408 -0
- package/src/cli-explain.ts +76 -0
- package/src/cli-lsp-diagnostic.ts +132 -0
- package/src/cli-module-loader.ts +101 -0
- package/src/cli-shared.ts +187 -0
- package/tests/check/cli-check.test.ts +189 -0
- package/tests/check/config.test.ts +350 -0
- package/tests/check/fixer.test.ts +373 -0
- package/tests/check/format-diagnostics.test.ts +327 -0
- package/tests/check/rules/anti-patterns.test.ts +467 -0
- package/tests/check/rules/closures.test.ts +192 -0
- package/tests/check/rules/collections.test.ts +380 -0
- package/tests/check/rules/conditionals.test.ts +185 -0
- package/tests/check/rules/flow.test.ts +250 -0
- package/tests/check/rules/formatting.test.ts +755 -0
- package/tests/check/rules/loops.test.ts +334 -0
- package/tests/check/rules/naming.test.ts +336 -0
- package/tests/check/rules/strings.test.ts +129 -0
- package/tests/check/rules/types.test.ts +257 -0
- package/tests/check/validator.test.ts +444 -0
- package/tests/check/visitor.test.ts +171 -0
- package/tests/cli/check.test.ts +801 -0
- package/tests/cli/error-enrichment.test.ts +510 -0
- package/tests/cli/error-formatter.test.ts +631 -0
- package/tests/cli/eval.test.ts +85 -0
- package/tests/cli/exec.test.ts +537 -0
- package/tests/cli-explain.test.ts +249 -0
- package/tests/cli-lsp-diagnostic.test.ts +202 -0
- package/tests/cli-shared.test.ts +439 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Andre Bremer
|
|
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,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader for rill-check
|
|
3
|
+
* Loads and validates .rill-check.json configuration files.
|
|
4
|
+
*/
|
|
5
|
+
import type { CheckConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create default configuration with all rules enabled.
|
|
8
|
+
* Returns configuration where all known rules are set to 'on'.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createDefaultConfig(): CheckConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Load configuration from .rill-check.json in the specified directory.
|
|
13
|
+
*
|
|
14
|
+
* @param cwd - Directory to search for configuration file
|
|
15
|
+
* @returns CheckConfig object, or null if file not found
|
|
16
|
+
* @throws Error with "Invalid configuration: {reason}" if JSON is invalid [EC-3]
|
|
17
|
+
* @throws Error with "Invalid configuration: unknown rule {code}" if unknown rule [EC-4]
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadConfig(cwd: string): CheckConfig | null;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/check/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,YAAY,CAAC;AAcnE;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAUjD;AA6GD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiD1D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader for rill-check
|
|
3
|
+
* Loads and validates .rill-check.json configuration files.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { VALIDATION_RULES } from './rules/index.js';
|
|
8
|
+
// ============================================================
|
|
9
|
+
// CONSTANTS
|
|
10
|
+
// ============================================================
|
|
11
|
+
/** Configuration file name */
|
|
12
|
+
const CONFIG_FILE_NAME = '.rill-check.json';
|
|
13
|
+
// ============================================================
|
|
14
|
+
// DEFAULT CONFIGURATION
|
|
15
|
+
// ============================================================
|
|
16
|
+
/**
|
|
17
|
+
* Create default configuration with all rules enabled.
|
|
18
|
+
* Returns configuration where all known rules are set to 'on'.
|
|
19
|
+
*/
|
|
20
|
+
export function createDefaultConfig() {
|
|
21
|
+
const rules = {};
|
|
22
|
+
const severity = {};
|
|
23
|
+
for (const rule of VALIDATION_RULES) {
|
|
24
|
+
rules[rule.code] = 'on';
|
|
25
|
+
severity[rule.code] = rule.severity;
|
|
26
|
+
}
|
|
27
|
+
return { rules, severity };
|
|
28
|
+
}
|
|
29
|
+
// ============================================================
|
|
30
|
+
// VALIDATION
|
|
31
|
+
// ============================================================
|
|
32
|
+
/**
|
|
33
|
+
* Validate that a value is a valid RuleState.
|
|
34
|
+
*/
|
|
35
|
+
function isRuleState(value) {
|
|
36
|
+
return value === 'on' || value === 'off' || value === 'warn';
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate that a value is a valid Severity.
|
|
40
|
+
*/
|
|
41
|
+
function isSeverity(value) {
|
|
42
|
+
return value === 'error' || value === 'warning' || value === 'info';
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate configuration structure and values.
|
|
46
|
+
* Throws Error if configuration is invalid.
|
|
47
|
+
*/
|
|
48
|
+
function validateConfig(data) {
|
|
49
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data)) {
|
|
50
|
+
throw new Error('[RILL-C003] Invalid configuration: must be an object');
|
|
51
|
+
}
|
|
52
|
+
const config = data;
|
|
53
|
+
// Validate rules field if present
|
|
54
|
+
if ('rules' in config) {
|
|
55
|
+
if (typeof config['rules'] !== 'object' ||
|
|
56
|
+
config['rules'] === null ||
|
|
57
|
+
Array.isArray(config['rules'])) {
|
|
58
|
+
throw new Error('[RILL-C003] Invalid configuration: rules must be an object');
|
|
59
|
+
}
|
|
60
|
+
const rules = config['rules'];
|
|
61
|
+
for (const [code, state] of Object.entries(rules)) {
|
|
62
|
+
if (!isRuleState(state)) {
|
|
63
|
+
throw new Error(`[RILL-C003] Invalid configuration: rule ${code} has invalid state "${state}" (must be 'on', 'off', or 'warn')`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Validate severity field if present
|
|
68
|
+
if ('severity' in config) {
|
|
69
|
+
if (typeof config['severity'] !== 'object' ||
|
|
70
|
+
config['severity'] === null ||
|
|
71
|
+
Array.isArray(config['severity'])) {
|
|
72
|
+
throw new Error('[RILL-C003] Invalid configuration: severity must be an object');
|
|
73
|
+
}
|
|
74
|
+
const severity = config['severity'];
|
|
75
|
+
for (const [code, sev] of Object.entries(severity)) {
|
|
76
|
+
if (!isSeverity(sev)) {
|
|
77
|
+
throw new Error(`[RILL-C003] Invalid configuration: rule ${code} has invalid severity "${sev}" (must be 'error', 'warning', or 'info')`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Validate that all rule codes in config are known rules.
|
|
84
|
+
* Throws Error if unknown rule code found.
|
|
85
|
+
*/
|
|
86
|
+
function validateRuleCodes(config) {
|
|
87
|
+
const knownRules = new Set(VALIDATION_RULES.map((r) => r.code));
|
|
88
|
+
// Check rules field
|
|
89
|
+
for (const code of Object.keys(config.rules)) {
|
|
90
|
+
if (!knownRules.has(code)) {
|
|
91
|
+
throw new Error(`[RILL-C003] Invalid configuration: unknown rule ${code}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Check severity field
|
|
95
|
+
for (const code of Object.keys(config.severity)) {
|
|
96
|
+
if (!knownRules.has(code)) {
|
|
97
|
+
throw new Error(`[RILL-C003] Invalid configuration: unknown rule ${code}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ============================================================
|
|
102
|
+
// CONFIGURATION LOADING
|
|
103
|
+
// ============================================================
|
|
104
|
+
/**
|
|
105
|
+
* Load configuration from .rill-check.json in the specified directory.
|
|
106
|
+
*
|
|
107
|
+
* @param cwd - Directory to search for configuration file
|
|
108
|
+
* @returns CheckConfig object, or null if file not found
|
|
109
|
+
* @throws Error with "Invalid configuration: {reason}" if JSON is invalid [EC-3]
|
|
110
|
+
* @throws Error with "Invalid configuration: unknown rule {code}" if unknown rule [EC-4]
|
|
111
|
+
*/
|
|
112
|
+
export function loadConfig(cwd) {
|
|
113
|
+
const configPath = join(cwd, CONFIG_FILE_NAME);
|
|
114
|
+
// Return null if file not found (not an error)
|
|
115
|
+
if (!existsSync(configPath)) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
let fileContent;
|
|
119
|
+
try {
|
|
120
|
+
fileContent = readFileSync(configPath, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
throw new Error(`[RILL-C003] Invalid configuration: failed to read file (${err instanceof Error ? err.message : String(err)})`);
|
|
124
|
+
}
|
|
125
|
+
// Parse JSON
|
|
126
|
+
let parsedData;
|
|
127
|
+
try {
|
|
128
|
+
parsedData = JSON.parse(fileContent);
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
throw new Error(`[RILL-C003] Invalid configuration: invalid JSON (${err instanceof Error ? err.message : String(err)})`);
|
|
132
|
+
}
|
|
133
|
+
// Validate structure
|
|
134
|
+
validateConfig(parsedData);
|
|
135
|
+
// Get defaults
|
|
136
|
+
const defaults = createDefaultConfig();
|
|
137
|
+
// Merge with defaults (parsedData is validated, so we can safely cast)
|
|
138
|
+
const rules = {
|
|
139
|
+
...defaults.rules,
|
|
140
|
+
...parsedData.rules,
|
|
141
|
+
};
|
|
142
|
+
const severity = {
|
|
143
|
+
...defaults.severity,
|
|
144
|
+
...parsedData.severity,
|
|
145
|
+
};
|
|
146
|
+
const config = { rules, severity };
|
|
147
|
+
// Validate rule codes
|
|
148
|
+
validateRuleCodes(config);
|
|
149
|
+
return config;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/check/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Applier
|
|
3
|
+
* Apply automatic fixes to source code with collision detection.
|
|
4
|
+
*/
|
|
5
|
+
import type { Diagnostic, ValidationContext } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Result of applying fixes to source code.
|
|
8
|
+
*/
|
|
9
|
+
export interface ApplyResult {
|
|
10
|
+
/** Modified source code with fixes applied */
|
|
11
|
+
readonly modified: string;
|
|
12
|
+
/** Number of fixes successfully applied */
|
|
13
|
+
readonly applied: number;
|
|
14
|
+
/** Number of fixes skipped */
|
|
15
|
+
readonly skipped: number;
|
|
16
|
+
/** Reasons for skipped fixes */
|
|
17
|
+
readonly skippedReasons: Array<{
|
|
18
|
+
code: string;
|
|
19
|
+
reason: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Apply automatic fixes to source code.
|
|
24
|
+
*
|
|
25
|
+
* Constraints:
|
|
26
|
+
* - Applies fixes in reverse position order (end to start) to avoid offset shifts
|
|
27
|
+
* - Skips fixes where applicable === false
|
|
28
|
+
* - Detects collisions (overlapping ranges) and skips with reason
|
|
29
|
+
* - Verifies modified source parses successfully
|
|
30
|
+
* - Throws if any applied fix creates invalid syntax
|
|
31
|
+
*
|
|
32
|
+
* @param source - Original source code
|
|
33
|
+
* @param diagnostics - Diagnostics with potential fixes
|
|
34
|
+
* @param context - Validation context (unused but required by spec)
|
|
35
|
+
* @returns ApplyResult with modified source and counts
|
|
36
|
+
* @throws Error if applied fixes create invalid syntax [EC-6]
|
|
37
|
+
*/
|
|
38
|
+
export declare function applyFixes(source: string, diagnostics: Diagnostic[], _context: ValidationContext): ApplyResult;
|
|
39
|
+
//# sourceMappingURL=fixer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixer.d.ts","sourceRoot":"","sources":["../../src/check/fixer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMhE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAgBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,EAAE,iBAAiB,GAC1B,WAAW,CAuDb"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Applier
|
|
3
|
+
* Apply automatic fixes to source code with collision detection.
|
|
4
|
+
*/
|
|
5
|
+
import { parse } from '@rcrsr/rill';
|
|
6
|
+
// ============================================================
|
|
7
|
+
// FIX APPLICATION
|
|
8
|
+
// ============================================================
|
|
9
|
+
/**
|
|
10
|
+
* Apply automatic fixes to source code.
|
|
11
|
+
*
|
|
12
|
+
* Constraints:
|
|
13
|
+
* - Applies fixes in reverse position order (end to start) to avoid offset shifts
|
|
14
|
+
* - Skips fixes where applicable === false
|
|
15
|
+
* - Detects collisions (overlapping ranges) and skips with reason
|
|
16
|
+
* - Verifies modified source parses successfully
|
|
17
|
+
* - Throws if any applied fix creates invalid syntax
|
|
18
|
+
*
|
|
19
|
+
* @param source - Original source code
|
|
20
|
+
* @param diagnostics - Diagnostics with potential fixes
|
|
21
|
+
* @param context - Validation context (unused but required by spec)
|
|
22
|
+
* @returns ApplyResult with modified source and counts
|
|
23
|
+
* @throws Error if applied fixes create invalid syntax [EC-6]
|
|
24
|
+
*/
|
|
25
|
+
export function applyFixes(source, diagnostics, _context) {
|
|
26
|
+
// Filter to diagnostics with fixes
|
|
27
|
+
const fixableDiagnostics = diagnostics.filter((d) => d.fix !== null && d.fix.applicable);
|
|
28
|
+
// If no applicable fixes, return original
|
|
29
|
+
if (fixableDiagnostics.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
modified: source,
|
|
32
|
+
applied: 0,
|
|
33
|
+
skipped: 0,
|
|
34
|
+
skippedReasons: [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Convert to ApplicableFix with positions
|
|
38
|
+
const fixes = fixableDiagnostics.map((d) => ({
|
|
39
|
+
code: d.code,
|
|
40
|
+
start: d.fix.range.start.offset,
|
|
41
|
+
end: d.fix.range.end.offset,
|
|
42
|
+
replacement: d.fix.replacement,
|
|
43
|
+
}));
|
|
44
|
+
// Sort fixes by end position (descending) to apply from end to start
|
|
45
|
+
// This avoids offset shifts when applying multiple fixes
|
|
46
|
+
const sortedFixes = fixes.slice().sort((a, b) => b.end - a.end);
|
|
47
|
+
// Detect collisions and filter to non-overlapping fixes
|
|
48
|
+
const { validFixes, skippedReasons } = filterCollisions(sortedFixes);
|
|
49
|
+
// Apply fixes to source
|
|
50
|
+
let modified = source;
|
|
51
|
+
for (const fix of validFixes) {
|
|
52
|
+
const before = modified.slice(0, fix.start);
|
|
53
|
+
const after = modified.slice(fix.end);
|
|
54
|
+
modified = before + fix.replacement + after;
|
|
55
|
+
}
|
|
56
|
+
// Verify modified source parses successfully [EC-6]
|
|
57
|
+
try {
|
|
58
|
+
parse(modified);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
throw new Error('Fix would create invalid syntax');
|
|
62
|
+
}
|
|
63
|
+
const applied = validFixes.length;
|
|
64
|
+
const skipped = sortedFixes.length - applied;
|
|
65
|
+
return {
|
|
66
|
+
modified,
|
|
67
|
+
applied,
|
|
68
|
+
skipped,
|
|
69
|
+
skippedReasons,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ============================================================
|
|
73
|
+
// COLLISION DETECTION
|
|
74
|
+
// ============================================================
|
|
75
|
+
/**
|
|
76
|
+
* Filter fixes to remove overlapping ranges.
|
|
77
|
+
* Detects collisions where fix ranges overlap [EC-5].
|
|
78
|
+
*
|
|
79
|
+
* Strategy: Keep first fix in sorted order (end to start),
|
|
80
|
+
* skip subsequent fixes that overlap with any kept fix.
|
|
81
|
+
*
|
|
82
|
+
* @param sortedFixes - Fixes sorted by end position (descending)
|
|
83
|
+
* @returns Valid fixes and reasons for skipped fixes
|
|
84
|
+
*/
|
|
85
|
+
function filterCollisions(sortedFixes) {
|
|
86
|
+
const validFixes = [];
|
|
87
|
+
const skippedReasons = [];
|
|
88
|
+
for (const fix of sortedFixes) {
|
|
89
|
+
// Check if this fix overlaps with any already-kept fix
|
|
90
|
+
const hasCollision = validFixes.some((kept) => rangesOverlap(fix, kept));
|
|
91
|
+
if (hasCollision) {
|
|
92
|
+
// Skip this fix due to collision [EC-5]
|
|
93
|
+
skippedReasons.push({
|
|
94
|
+
code: fix.code,
|
|
95
|
+
reason: 'Fix range overlaps with another fix',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// No collision, keep this fix
|
|
100
|
+
validFixes.push(fix);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { validFixes, skippedReasons };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if two fix ranges overlap.
|
|
107
|
+
*
|
|
108
|
+
* Ranges overlap if:
|
|
109
|
+
* - One starts before the other ends, AND
|
|
110
|
+
* - One ends after the other starts
|
|
111
|
+
*
|
|
112
|
+
* @param a - First fix range
|
|
113
|
+
* @param b - Second fix range
|
|
114
|
+
* @returns true if ranges overlap
|
|
115
|
+
*/
|
|
116
|
+
function rangesOverlap(a, b) {
|
|
117
|
+
return a.start < b.end && a.end > b.start;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=fixer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixer.js","sourceRoot":"","sources":["../../src/check/fixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check Module - Static Analysis for rill
|
|
3
|
+
* Public API for rill-check tool.
|
|
4
|
+
*/
|
|
5
|
+
export type { ValidationRule, RuleCategory, Severity, RuleState, Diagnostic, Fix, CheckConfig, ValidationContext, FixContext, } from './types.js';
|
|
6
|
+
export { VALIDATION_RULES } from './rules/index.js';
|
|
7
|
+
export { loadConfig, createDefaultConfig } from './config.js';
|
|
8
|
+
export { validateScript } from './validator.js';
|
|
9
|
+
export { applyFixes, type ApplyResult } from './fixer.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/check/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,YAAY,EACV,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,GAAG,EACH,WAAW,EACX,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKpD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAK9D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKhD,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check Module - Static Analysis for rill
|
|
3
|
+
* Public API for rill-check tool.
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================
|
|
6
|
+
// RULE REGISTRY
|
|
7
|
+
// ============================================================
|
|
8
|
+
export { VALIDATION_RULES } from './rules/index.js';
|
|
9
|
+
// ============================================================
|
|
10
|
+
// CONFIGURATION
|
|
11
|
+
// ============================================================
|
|
12
|
+
export { loadConfig, createDefaultConfig } from './config.js';
|
|
13
|
+
// ============================================================
|
|
14
|
+
// VALIDATION
|
|
15
|
+
// ============================================================
|
|
16
|
+
export { validateScript } from './validator.js';
|
|
17
|
+
// ============================================================
|
|
18
|
+
// FIX APPLICATION
|
|
19
|
+
// ============================================================
|
|
20
|
+
export { applyFixes } from './fixer.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/check/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9D,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anti-Pattern Rules
|
|
3
|
+
* Enforces best practices from docs/guide-conventions.md:411-462.
|
|
4
|
+
*/
|
|
5
|
+
import type { ValidationRule } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Warns on variable reassignment patterns.
|
|
8
|
+
* Variables lock to their first type, and reassignment suggests confusing
|
|
9
|
+
* flow control. Prefer functional style or new variables.
|
|
10
|
+
*
|
|
11
|
+
* Detection:
|
|
12
|
+
* - Capture node (=> $var) where $var already exists in validation context
|
|
13
|
+
* - Tracks variables seen during validation pass
|
|
14
|
+
*
|
|
15
|
+
* Valid alternatives:
|
|
16
|
+
* - Use new variable: $result1, $result2
|
|
17
|
+
* - Functional chains: value -> op1 -> op2
|
|
18
|
+
*
|
|
19
|
+
* References:
|
|
20
|
+
* - docs/guide-conventions.md:413-424
|
|
21
|
+
*/
|
|
22
|
+
export declare const AVOID_REASSIGNMENT: ValidationRule;
|
|
23
|
+
/**
|
|
24
|
+
* Warns on complex nested boolean conditions.
|
|
25
|
+
* Complex conditions with multiple nested operators are hard to read.
|
|
26
|
+
* Extract to named variables for clarity.
|
|
27
|
+
*
|
|
28
|
+
* Detection:
|
|
29
|
+
* - Conditional nodes with conditions containing 3+ boolean operators (&&, ||)
|
|
30
|
+
* - Nesting depth > 2 for boolean expressions
|
|
31
|
+
*
|
|
32
|
+
* Valid alternatives:
|
|
33
|
+
* - Extract sub-conditions to named variables
|
|
34
|
+
* - Split complex checks into multiple smaller checks
|
|
35
|
+
*
|
|
36
|
+
* References:
|
|
37
|
+
* - docs/guide-conventions.md:451-461
|
|
38
|
+
*/
|
|
39
|
+
export declare const COMPLEX_CONDITION: ValidationRule;
|
|
40
|
+
/**
|
|
41
|
+
* Detects attempts to modify outer-scope variables from inside loops.
|
|
42
|
+
* This is a common LLM-generated anti-pattern that never works in Rill.
|
|
43
|
+
*
|
|
44
|
+
* Rill's scoping rules mean that captures inside loop bodies create LOCAL
|
|
45
|
+
* variables that don't affect outer scope. This is a fundamental language
|
|
46
|
+
* constraint, not a style preference.
|
|
47
|
+
*
|
|
48
|
+
* WRONG - this pattern NEVER works:
|
|
49
|
+
* 0 => $count
|
|
50
|
+
* [1, 2, 3] -> each { $count + 1 => $count } # creates LOCAL $count
|
|
51
|
+
* $count # still 0!
|
|
52
|
+
*
|
|
53
|
+
* RIGHT - use accumulators:
|
|
54
|
+
* [1, 2, 3] -> fold(0) { $@ + 1 } # returns 3
|
|
55
|
+
* [1, 2, 3] -> each(0) { $@ + 1 } # returns [1, 2, 3]
|
|
56
|
+
*
|
|
57
|
+
* This rule catches captures inside loop/collection bodies where the
|
|
58
|
+
* variable name matches an outer-scope variable.
|
|
59
|
+
*
|
|
60
|
+
* References:
|
|
61
|
+
* - docs/ref-llm.txt (LOOP STATE PATTERNS)
|
|
62
|
+
* - docs/topic-variables.md (Scope Rules)
|
|
63
|
+
*/
|
|
64
|
+
export declare const LOOP_OUTER_CAPTURE: ValidationRule;
|
|
65
|
+
//# sourceMappingURL=anti-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anti-patterns.d.ts","sourceRoot":"","sources":["../../../src/check/rules/anti-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,aAAa,CAAC;AAuBrB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,EAAE,cAgDhC,CAAC;AAMF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,EAAE,cA6C/B,CAAC;AAmIF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,kBAAkB,EAAE,cAwFhC,CAAC"}
|