@rangerchaz/aimem 0.1.4 → 0.2.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/README.md +589 -432
- package/dist/cli/commands/guardrails.d.ts +3 -0
- package/dist/cli/commands/guardrails.d.ts.map +1 -0
- package/dist/cli/commands/guardrails.js +340 -0
- package/dist/cli/commands/guardrails.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +7 -0
- package/dist/cli/commands/reindex.d.ts.map +1 -0
- package/dist/cli/commands/reindex.js +117 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/db/index.d.ts +30 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +192 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema.d.ts +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +54 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/guardrails/analyzer.d.ts +20 -0
- package/dist/guardrails/analyzer.d.ts.map +1 -0
- package/dist/guardrails/analyzer.js +329 -0
- package/dist/guardrails/analyzer.js.map +1 -0
- package/dist/guardrails/calculator.d.ts +46 -0
- package/dist/guardrails/calculator.d.ts.map +1 -0
- package/dist/guardrails/calculator.js +97 -0
- package/dist/guardrails/calculator.js.map +1 -0
- package/dist/guardrails/enforcer.d.ts +28 -0
- package/dist/guardrails/enforcer.d.ts.map +1 -0
- package/dist/guardrails/enforcer.js +153 -0
- package/dist/guardrails/enforcer.js.map +1 -0
- package/dist/guardrails/index.d.ts +12 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +17 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/linter-import.d.ts +31 -0
- package/dist/guardrails/linter-import.d.ts.map +1 -0
- package/dist/guardrails/linter-import.js +547 -0
- package/dist/guardrails/linter-import.js.map +1 -0
- package/dist/guardrails/responder.d.ts +28 -0
- package/dist/guardrails/responder.d.ts.map +1 -0
- package/dist/guardrails/responder.js +98 -0
- package/dist/guardrails/responder.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +409 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/proxy/interceptor-mockttp.d.ts +4 -0
- package/dist/proxy/interceptor-mockttp.d.ts.map +1 -1
- package/dist/proxy/interceptor-mockttp.js +59 -5
- package/dist/proxy/interceptor-mockttp.js.map +1 -1
- package/dist/types/index.d.ts +58 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +56 -56
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linter Import
|
|
3
|
+
*
|
|
4
|
+
* Imports rules from existing linter configurations and converts them to guardrails.
|
|
5
|
+
* Supports: ESLint, RuboCop, Ruff/Black/isort (pyproject.toml), Prettier
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, existsSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { insertGuardrail, incrementDikCounter } from '../db/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Scan project for linter configs and import rules.
|
|
12
|
+
*/
|
|
13
|
+
export function importLinterRules(projectId, projectPath, options = {}) {
|
|
14
|
+
const configs = [];
|
|
15
|
+
// ESLint
|
|
16
|
+
const eslintConfig = findAndParseEslint(projectPath);
|
|
17
|
+
if (eslintConfig)
|
|
18
|
+
configs.push(eslintConfig);
|
|
19
|
+
// RuboCop
|
|
20
|
+
const rubocopConfig = findAndParseRubocop(projectPath);
|
|
21
|
+
if (rubocopConfig)
|
|
22
|
+
configs.push(rubocopConfig);
|
|
23
|
+
// Python (pyproject.toml)
|
|
24
|
+
const pythonConfig = findAndParsePyproject(projectPath);
|
|
25
|
+
if (pythonConfig)
|
|
26
|
+
configs.push(pythonConfig);
|
|
27
|
+
// Prettier
|
|
28
|
+
const prettierConfig = findAndParsePrettier(projectPath);
|
|
29
|
+
if (prettierConfig)
|
|
30
|
+
configs.push(prettierConfig);
|
|
31
|
+
// TSConfig
|
|
32
|
+
const tsConfig = findAndParseTsconfig(projectPath);
|
|
33
|
+
if (tsConfig)
|
|
34
|
+
configs.push(tsConfig);
|
|
35
|
+
const totalRules = configs.reduce((sum, c) => sum + c.rules.length, 0);
|
|
36
|
+
const saved = [];
|
|
37
|
+
if (!options.dryRun) {
|
|
38
|
+
for (const config of configs) {
|
|
39
|
+
for (const rule of config.rules) {
|
|
40
|
+
const guardrail = insertGuardrail(projectId, rule.category, rule.rule, rule.rationale, 'warn', 'imported', rule.source);
|
|
41
|
+
saved.push(guardrail);
|
|
42
|
+
incrementDikCounter(projectId, 'rules_inferred');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { configs, totalRules, saved };
|
|
47
|
+
}
|
|
48
|
+
// ============ ESLint ============
|
|
49
|
+
function findAndParseEslint(projectPath) {
|
|
50
|
+
const files = [
|
|
51
|
+
'.eslintrc.json',
|
|
52
|
+
'.eslintrc.js',
|
|
53
|
+
'.eslintrc.cjs',
|
|
54
|
+
'.eslintrc.yml',
|
|
55
|
+
'.eslintrc.yaml',
|
|
56
|
+
'.eslintrc',
|
|
57
|
+
'eslint.config.js',
|
|
58
|
+
'eslint.config.mjs',
|
|
59
|
+
];
|
|
60
|
+
for (const file of files) {
|
|
61
|
+
const filePath = join(projectPath, file);
|
|
62
|
+
if (existsSync(filePath)) {
|
|
63
|
+
try {
|
|
64
|
+
const rules = parseEslintConfig(filePath, file);
|
|
65
|
+
if (rules.length > 0) {
|
|
66
|
+
return { type: 'eslint', path: filePath, rules };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Skip unparseable configs
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check package.json for eslintConfig
|
|
75
|
+
const packagePath = join(projectPath, 'package.json');
|
|
76
|
+
if (existsSync(packagePath)) {
|
|
77
|
+
try {
|
|
78
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
79
|
+
if (pkg.eslintConfig) {
|
|
80
|
+
const rules = extractEslintRules(pkg.eslintConfig, packagePath);
|
|
81
|
+
if (rules.length > 0) {
|
|
82
|
+
return { type: 'eslint', path: packagePath, rules };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Skip
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function parseEslintConfig(filePath, fileName) {
|
|
93
|
+
if (fileName.endsWith('.json') || fileName === '.eslintrc') {
|
|
94
|
+
try {
|
|
95
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
96
|
+
const config = JSON.parse(content);
|
|
97
|
+
return extractEslintRules(config, filePath);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (fileName.endsWith('.yml') || fileName.endsWith('.yaml')) {
|
|
104
|
+
// Basic YAML parsing for simple configs
|
|
105
|
+
try {
|
|
106
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
107
|
+
const config = parseSimpleYaml(content);
|
|
108
|
+
return extractEslintRules(config, filePath);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// For JS configs, we can't easily parse them, but we note their existence
|
|
115
|
+
return [{
|
|
116
|
+
category: 'design',
|
|
117
|
+
rule: 'Follow ESLint configuration',
|
|
118
|
+
rationale: `ESLint config exists at ${fileName}`,
|
|
119
|
+
source: filePath,
|
|
120
|
+
}];
|
|
121
|
+
}
|
|
122
|
+
function extractEslintRules(config, source) {
|
|
123
|
+
const rules = [];
|
|
124
|
+
const eslintRules = config.rules;
|
|
125
|
+
if (!eslintRules) {
|
|
126
|
+
// Just note that ESLint is configured
|
|
127
|
+
if (config.extends || config.plugins) {
|
|
128
|
+
rules.push({
|
|
129
|
+
category: 'design',
|
|
130
|
+
rule: 'Follow ESLint configuration',
|
|
131
|
+
rationale: `Extends: ${JSON.stringify(config.extends || config.plugins)}`,
|
|
132
|
+
source,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return rules;
|
|
136
|
+
}
|
|
137
|
+
// Map important ESLint rules to guardrails
|
|
138
|
+
const ruleMapping = {
|
|
139
|
+
'no-console': { category: 'design', description: 'Avoid console.log in production code' },
|
|
140
|
+
'no-debugger': { category: 'design', description: 'No debugger statements' },
|
|
141
|
+
'no-unused-vars': { category: 'design', description: 'No unused variables' },
|
|
142
|
+
'no-var': { category: 'design', description: 'Use const/let instead of var' },
|
|
143
|
+
'prefer-const': { category: 'design', description: 'Use const when variable is not reassigned' },
|
|
144
|
+
'eqeqeq': { category: 'design', description: 'Use === and !== instead of == and !=' },
|
|
145
|
+
'curly': { category: 'design', description: 'Use curly braces for all control statements' },
|
|
146
|
+
'no-eval': { category: 'security', description: 'Never use eval()' },
|
|
147
|
+
'no-implied-eval': { category: 'security', description: 'No implied eval via setTimeout/setInterval strings' },
|
|
148
|
+
'no-new-func': { category: 'security', description: 'No Function constructor' },
|
|
149
|
+
'camelcase': { category: 'naming', description: 'Use camelCase for identifiers' },
|
|
150
|
+
'new-cap': { category: 'naming', description: 'Constructors must start with capital letter' },
|
|
151
|
+
'@typescript-eslint/naming-convention': { category: 'naming', description: 'Follow TypeScript naming conventions' },
|
|
152
|
+
'@typescript-eslint/no-explicit-any': { category: 'design', description: 'Avoid using `any` type' },
|
|
153
|
+
'@typescript-eslint/explicit-function-return-type': { category: 'design', description: 'Functions must have explicit return types' },
|
|
154
|
+
};
|
|
155
|
+
for (const [ruleName, ruleValue] of Object.entries(eslintRules)) {
|
|
156
|
+
// Check if rule is enabled (not 'off' or 0)
|
|
157
|
+
const isEnabled = Array.isArray(ruleValue)
|
|
158
|
+
? ruleValue[0] !== 'off' && ruleValue[0] !== 0
|
|
159
|
+
: ruleValue !== 'off' && ruleValue !== 0;
|
|
160
|
+
if (isEnabled && ruleMapping[ruleName]) {
|
|
161
|
+
const mapping = ruleMapping[ruleName];
|
|
162
|
+
rules.push({
|
|
163
|
+
category: mapping.category,
|
|
164
|
+
rule: mapping.description,
|
|
165
|
+
rationale: `ESLint rule: ${ruleName}`,
|
|
166
|
+
source,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return rules;
|
|
171
|
+
}
|
|
172
|
+
// ============ RuboCop ============
|
|
173
|
+
function findAndParseRubocop(projectPath) {
|
|
174
|
+
const filePath = join(projectPath, '.rubocop.yml');
|
|
175
|
+
if (!existsSync(filePath))
|
|
176
|
+
return null;
|
|
177
|
+
try {
|
|
178
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
179
|
+
const rules = parseRubocopConfig(content, filePath);
|
|
180
|
+
if (rules.length > 0) {
|
|
181
|
+
return { type: 'rubocop', path: filePath, rules };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Skip
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
function parseRubocopConfig(content, source) {
|
|
190
|
+
const rules = [];
|
|
191
|
+
// Parse key cops from RuboCop config
|
|
192
|
+
const copMapping = {
|
|
193
|
+
'Style/StringLiterals': { category: 'design', description: 'Use consistent string quote style' },
|
|
194
|
+
'Style/FrozenStringLiteralComment': { category: 'design', description: 'Include frozen_string_literal comment' },
|
|
195
|
+
'Style/Documentation': { category: 'design', description: 'Document classes and modules' },
|
|
196
|
+
'Naming/MethodName': { category: 'naming', description: 'Follow Ruby method naming conventions' },
|
|
197
|
+
'Naming/VariableName': { category: 'naming', description: 'Follow Ruby variable naming conventions' },
|
|
198
|
+
'Naming/ClassAndModuleCamelCase': { category: 'naming', description: 'Use CamelCase for classes and modules' },
|
|
199
|
+
'Security/Eval': { category: 'security', description: 'Never use eval' },
|
|
200
|
+
'Security/Open': { category: 'security', description: 'Be careful with Kernel#open' },
|
|
201
|
+
'Security/YAMLLoad': { category: 'security', description: 'Use YAML.safe_load instead of YAML.load' },
|
|
202
|
+
'Metrics/MethodLength': { category: 'design', description: 'Keep methods short' },
|
|
203
|
+
'Metrics/ClassLength': { category: 'architecture', description: 'Keep classes focused and small' },
|
|
204
|
+
};
|
|
205
|
+
for (const [cop, mapping] of Object.entries(copMapping)) {
|
|
206
|
+
// Check if cop is mentioned and enabled
|
|
207
|
+
const copPattern = new RegExp(`^${cop.replace('/', '/')}:`, 'm');
|
|
208
|
+
if (copPattern.test(content)) {
|
|
209
|
+
// Check if it's not disabled
|
|
210
|
+
const disabledPattern = new RegExp(`${cop.replace('/', '/')}:[\\s\\S]*?Enabled:\\s*false`, 'm');
|
|
211
|
+
if (!disabledPattern.test(content)) {
|
|
212
|
+
rules.push({
|
|
213
|
+
category: mapping.category,
|
|
214
|
+
rule: mapping.description,
|
|
215
|
+
rationale: `RuboCop cop: ${cop}`,
|
|
216
|
+
source,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// If no specific cops found but file exists, add general rule
|
|
222
|
+
if (rules.length === 0) {
|
|
223
|
+
rules.push({
|
|
224
|
+
category: 'design',
|
|
225
|
+
rule: 'Follow RuboCop configuration',
|
|
226
|
+
rationale: 'RuboCop config exists',
|
|
227
|
+
source,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return rules;
|
|
231
|
+
}
|
|
232
|
+
// ============ Python (pyproject.toml) ============
|
|
233
|
+
function findAndParsePyproject(projectPath) {
|
|
234
|
+
const filePath = join(projectPath, 'pyproject.toml');
|
|
235
|
+
if (!existsSync(filePath))
|
|
236
|
+
return null;
|
|
237
|
+
try {
|
|
238
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
239
|
+
const rules = parsePyprojectConfig(content, filePath);
|
|
240
|
+
if (rules.length > 0) {
|
|
241
|
+
return { type: 'python', path: filePath, rules };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Skip
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
function parsePyprojectConfig(content, source) {
|
|
250
|
+
const rules = [];
|
|
251
|
+
// Check for ruff
|
|
252
|
+
if (content.includes('[tool.ruff]')) {
|
|
253
|
+
rules.push({
|
|
254
|
+
category: 'design',
|
|
255
|
+
rule: 'Follow Ruff linting rules',
|
|
256
|
+
rationale: 'Ruff configured in pyproject.toml',
|
|
257
|
+
source,
|
|
258
|
+
});
|
|
259
|
+
// Check for specific ruff rules
|
|
260
|
+
if (content.includes('select') && content.includes('"E"')) {
|
|
261
|
+
rules.push({
|
|
262
|
+
category: 'design',
|
|
263
|
+
rule: 'Fix pycodestyle errors',
|
|
264
|
+
rationale: 'Ruff E rules enabled',
|
|
265
|
+
source,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (content.includes('"F"')) {
|
|
269
|
+
rules.push({
|
|
270
|
+
category: 'design',
|
|
271
|
+
rule: 'Fix Pyflakes errors',
|
|
272
|
+
rationale: 'Ruff F rules enabled',
|
|
273
|
+
source,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
if (content.includes('"S"')) {
|
|
277
|
+
rules.push({
|
|
278
|
+
category: 'security',
|
|
279
|
+
rule: 'Follow Bandit security rules',
|
|
280
|
+
rationale: 'Ruff S (security) rules enabled',
|
|
281
|
+
source,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
if (content.includes('"N"')) {
|
|
285
|
+
rules.push({
|
|
286
|
+
category: 'naming',
|
|
287
|
+
rule: 'Follow PEP8 naming conventions',
|
|
288
|
+
rationale: 'Ruff N (naming) rules enabled',
|
|
289
|
+
source,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Check for black
|
|
294
|
+
if (content.includes('[tool.black]')) {
|
|
295
|
+
rules.push({
|
|
296
|
+
category: 'design',
|
|
297
|
+
rule: 'Format code with Black',
|
|
298
|
+
rationale: 'Black configured in pyproject.toml',
|
|
299
|
+
source,
|
|
300
|
+
});
|
|
301
|
+
// Extract line length if specified
|
|
302
|
+
const lineLengthMatch = content.match(/line-length\s*=\s*(\d+)/);
|
|
303
|
+
if (lineLengthMatch) {
|
|
304
|
+
rules.push({
|
|
305
|
+
category: 'design',
|
|
306
|
+
rule: `Maximum line length is ${lineLengthMatch[1]} characters`,
|
|
307
|
+
rationale: 'Black line-length setting',
|
|
308
|
+
source,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Check for isort
|
|
313
|
+
if (content.includes('[tool.isort]')) {
|
|
314
|
+
rules.push({
|
|
315
|
+
category: 'design',
|
|
316
|
+
rule: 'Sort imports with isort',
|
|
317
|
+
rationale: 'isort configured in pyproject.toml',
|
|
318
|
+
source,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// Check for mypy
|
|
322
|
+
if (content.includes('[tool.mypy]')) {
|
|
323
|
+
rules.push({
|
|
324
|
+
category: 'design',
|
|
325
|
+
rule: 'Code must pass mypy type checking',
|
|
326
|
+
rationale: 'mypy configured in pyproject.toml',
|
|
327
|
+
source,
|
|
328
|
+
});
|
|
329
|
+
if (content.includes('strict = true') || content.includes('strict=true')) {
|
|
330
|
+
rules.push({
|
|
331
|
+
category: 'design',
|
|
332
|
+
rule: 'Use strict type annotations',
|
|
333
|
+
rationale: 'mypy strict mode enabled',
|
|
334
|
+
source,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return rules;
|
|
339
|
+
}
|
|
340
|
+
// ============ Prettier ============
|
|
341
|
+
function findAndParsePrettier(projectPath) {
|
|
342
|
+
const files = [
|
|
343
|
+
'.prettierrc',
|
|
344
|
+
'.prettierrc.json',
|
|
345
|
+
'.prettierrc.js',
|
|
346
|
+
'.prettierrc.cjs',
|
|
347
|
+
'.prettierrc.yml',
|
|
348
|
+
'.prettierrc.yaml',
|
|
349
|
+
'prettier.config.js',
|
|
350
|
+
'prettier.config.cjs',
|
|
351
|
+
];
|
|
352
|
+
for (const file of files) {
|
|
353
|
+
const filePath = join(projectPath, file);
|
|
354
|
+
if (existsSync(filePath)) {
|
|
355
|
+
try {
|
|
356
|
+
const rules = parsePrettierConfig(filePath, file);
|
|
357
|
+
if (rules.length > 0) {
|
|
358
|
+
return { type: 'prettier', path: filePath, rules };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
// Skip
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Check package.json for prettier config
|
|
367
|
+
const packagePath = join(projectPath, 'package.json');
|
|
368
|
+
if (existsSync(packagePath)) {
|
|
369
|
+
try {
|
|
370
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
371
|
+
if (pkg.prettier) {
|
|
372
|
+
const rules = extractPrettierRules(pkg.prettier, packagePath);
|
|
373
|
+
if (rules.length > 0) {
|
|
374
|
+
return { type: 'prettier', path: packagePath, rules };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Skip
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
function parsePrettierConfig(filePath, fileName) {
|
|
385
|
+
if (fileName.endsWith('.json') || fileName === '.prettierrc') {
|
|
386
|
+
try {
|
|
387
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
388
|
+
const config = JSON.parse(content);
|
|
389
|
+
return extractPrettierRules(config, filePath);
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// For JS/YML configs, just note existence
|
|
396
|
+
return [{
|
|
397
|
+
category: 'design',
|
|
398
|
+
rule: 'Format code with Prettier',
|
|
399
|
+
rationale: `Prettier config exists at ${fileName}`,
|
|
400
|
+
source: filePath,
|
|
401
|
+
}];
|
|
402
|
+
}
|
|
403
|
+
function extractPrettierRules(config, source) {
|
|
404
|
+
const rules = [];
|
|
405
|
+
rules.push({
|
|
406
|
+
category: 'design',
|
|
407
|
+
rule: 'Format code with Prettier',
|
|
408
|
+
rationale: 'Prettier is configured',
|
|
409
|
+
source,
|
|
410
|
+
});
|
|
411
|
+
if (config.semi === false) {
|
|
412
|
+
rules.push({
|
|
413
|
+
category: 'design',
|
|
414
|
+
rule: 'No semicolons',
|
|
415
|
+
rationale: 'Prettier semi: false',
|
|
416
|
+
source,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
if (config.singleQuote === true) {
|
|
420
|
+
rules.push({
|
|
421
|
+
category: 'design',
|
|
422
|
+
rule: 'Use single quotes for strings',
|
|
423
|
+
rationale: 'Prettier singleQuote: true',
|
|
424
|
+
source,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
if (typeof config.printWidth === 'number') {
|
|
428
|
+
rules.push({
|
|
429
|
+
category: 'design',
|
|
430
|
+
rule: `Maximum line length is ${config.printWidth} characters`,
|
|
431
|
+
rationale: `Prettier printWidth: ${config.printWidth}`,
|
|
432
|
+
source,
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
if (typeof config.tabWidth === 'number') {
|
|
436
|
+
rules.push({
|
|
437
|
+
category: 'design',
|
|
438
|
+
rule: `Use ${config.tabWidth}-space indentation`,
|
|
439
|
+
rationale: `Prettier tabWidth: ${config.tabWidth}`,
|
|
440
|
+
source,
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
return rules;
|
|
444
|
+
}
|
|
445
|
+
// ============ TypeScript ============
|
|
446
|
+
function findAndParseTsconfig(projectPath) {
|
|
447
|
+
const filePath = join(projectPath, 'tsconfig.json');
|
|
448
|
+
if (!existsSync(filePath))
|
|
449
|
+
return null;
|
|
450
|
+
try {
|
|
451
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
452
|
+
// Remove comments for JSON parsing
|
|
453
|
+
const cleanContent = content.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, '');
|
|
454
|
+
const config = JSON.parse(cleanContent);
|
|
455
|
+
const rules = extractTsconfigRules(config, filePath);
|
|
456
|
+
if (rules.length > 0) {
|
|
457
|
+
return { type: 'typescript', path: filePath, rules };
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
catch {
|
|
461
|
+
// Skip
|
|
462
|
+
}
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
function extractTsconfigRules(config, source) {
|
|
466
|
+
const rules = [];
|
|
467
|
+
const compilerOptions = config.compilerOptions;
|
|
468
|
+
if (!compilerOptions)
|
|
469
|
+
return rules;
|
|
470
|
+
if (compilerOptions.strict === true) {
|
|
471
|
+
rules.push({
|
|
472
|
+
category: 'design',
|
|
473
|
+
rule: 'TypeScript strict mode is enabled',
|
|
474
|
+
rationale: 'tsconfig strict: true',
|
|
475
|
+
source,
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
if (compilerOptions.noImplicitAny === true) {
|
|
479
|
+
rules.push({
|
|
480
|
+
category: 'design',
|
|
481
|
+
rule: 'No implicit any types',
|
|
482
|
+
rationale: 'tsconfig noImplicitAny: true',
|
|
483
|
+
source,
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
if (compilerOptions.strictNullChecks === true) {
|
|
487
|
+
rules.push({
|
|
488
|
+
category: 'design',
|
|
489
|
+
rule: 'Handle null and undefined explicitly',
|
|
490
|
+
rationale: 'tsconfig strictNullChecks: true',
|
|
491
|
+
source,
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
if (compilerOptions.noUnusedLocals === true) {
|
|
495
|
+
rules.push({
|
|
496
|
+
category: 'design',
|
|
497
|
+
rule: 'No unused local variables',
|
|
498
|
+
rationale: 'tsconfig noUnusedLocals: true',
|
|
499
|
+
source,
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
if (compilerOptions.noUnusedParameters === true) {
|
|
503
|
+
rules.push({
|
|
504
|
+
category: 'design',
|
|
505
|
+
rule: 'No unused function parameters',
|
|
506
|
+
rationale: 'tsconfig noUnusedParameters: true',
|
|
507
|
+
source,
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
return rules;
|
|
511
|
+
}
|
|
512
|
+
// ============ Helpers ============
|
|
513
|
+
/**
|
|
514
|
+
* Very basic YAML parser for simple key-value configs.
|
|
515
|
+
* Only handles flat structures and simple nested objects.
|
|
516
|
+
*/
|
|
517
|
+
function parseSimpleYaml(content) {
|
|
518
|
+
const result = {};
|
|
519
|
+
const lines = content.split('\n');
|
|
520
|
+
let currentKey = '';
|
|
521
|
+
let currentObject = result;
|
|
522
|
+
for (const line of lines) {
|
|
523
|
+
// Skip comments and empty lines
|
|
524
|
+
if (line.trim().startsWith('#') || line.trim() === '')
|
|
525
|
+
continue;
|
|
526
|
+
const indent = line.match(/^(\s*)/)?.[1].length || 0;
|
|
527
|
+
if (indent === 0 && line.includes(':')) {
|
|
528
|
+
const [key, ...valueParts] = line.split(':');
|
|
529
|
+
const value = valueParts.join(':').trim();
|
|
530
|
+
currentKey = key.trim();
|
|
531
|
+
if (value) {
|
|
532
|
+
result[currentKey] = value;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
result[currentKey] = {};
|
|
536
|
+
currentObject = result[currentKey];
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
else if (indent > 0 && line.includes(':')) {
|
|
540
|
+
const [key, ...valueParts] = line.trim().split(':');
|
|
541
|
+
const value = valueParts.join(':').trim();
|
|
542
|
+
currentObject[key.trim()] = value || true;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
return result;
|
|
546
|
+
}
|
|
547
|
+
//# sourceMappingURL=linter-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linter-import.js","sourceRoot":"","sources":["../../src/guardrails/linter-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates DIK-adjusted pushback messages.
|
|
5
|
+
* Single personality: Senior dev who's been on the project too long.
|
|
6
|
+
*/
|
|
7
|
+
import type { GuardrailViolation } from '../types/index.js';
|
|
8
|
+
interface ResponseHistory {
|
|
9
|
+
previousOverrides: number;
|
|
10
|
+
wasVindicated: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate a pushback response for a violation.
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateResponse(violation: GuardrailViolation, dikLevel: number, history?: ResponseHistory): string;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a combined response for multiple violations.
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateCombinedResponse(violations: Array<{
|
|
20
|
+
violation: GuardrailViolation;
|
|
21
|
+
history: ResponseHistory;
|
|
22
|
+
}>, dikLevel: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Format severity as a prefix.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatSeverityPrefix(severity: 'info' | 'warn' | 'block'): string;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=responder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responder.d.ts","sourceRoot":"","sources":["../../src/guardrails/responder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,UAAU,eAAe;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB;AAkCD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,eAAgE,GACxE,MAAM,CAuBR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC,EAC9E,QAAQ,EAAE,MAAM,GACf,MAAM,CA6BR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAShF"}
|