codingbuddy 2.1.0 → 2.2.1
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 +62 -0
- package/dist/src/agent/agent-prompt.builder.js +6 -0
- package/dist/src/agent/agent-prompt.builder.js.map +1 -1
- package/dist/src/analyzer/analyzer.module.js +3 -2
- package/dist/src/analyzer/analyzer.module.js.map +1 -1
- package/dist/src/analyzer/config.analyzer.js +11 -3
- package/dist/src/analyzer/config.analyzer.js.map +1 -1
- package/dist/src/analyzer/conventions.analyzer.d.ts +20 -0
- package/dist/src/analyzer/conventions.analyzer.js +395 -0
- package/dist/src/analyzer/conventions.analyzer.js.map +1 -0
- package/dist/src/analyzer/conventions.schemas.d.ts +76 -0
- package/dist/src/analyzer/conventions.schemas.js +71 -0
- package/dist/src/analyzer/conventions.schemas.js.map +1 -0
- package/dist/src/analyzer/conventions.types.d.ts +81 -0
- package/dist/src/analyzer/conventions.types.js +33 -0
- package/dist/src/analyzer/conventions.types.js.map +1 -0
- package/dist/src/checklist/checklist.types.d.ts +1 -1
- package/dist/src/checklist/checklist.types.js +1 -0
- package/dist/src/checklist/checklist.types.js.map +1 -1
- package/dist/src/cli/cli.js +5 -0
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/cli.types.d.ts +1 -0
- package/dist/src/cli/init/init.command.js +29 -52
- package/dist/src/cli/init/init.command.js.map +1 -1
- package/dist/src/cli/init/init.wizard.d.ts +22 -0
- package/dist/src/cli/init/init.wizard.js +277 -0
- package/dist/src/cli/init/init.wizard.js.map +1 -0
- package/dist/src/cli/init/prompts/architecture-prompt.d.ts +16 -0
- package/dist/src/cli/init/prompts/architecture-prompt.js +66 -0
- package/dist/src/cli/init/prompts/architecture-prompt.js.map +1 -0
- package/dist/src/cli/init/prompts/basic-prompt.d.ts +13 -0
- package/dist/src/cli/init/prompts/basic-prompt.js +53 -0
- package/dist/src/cli/init/prompts/basic-prompt.js.map +1 -0
- package/dist/src/cli/init/prompts/conventions-prompt.d.ts +19 -0
- package/dist/src/cli/init/prompts/conventions-prompt.js +74 -0
- package/dist/src/cli/init/prompts/conventions-prompt.js.map +1 -0
- package/dist/src/cli/init/prompts/index.d.ts +10 -0
- package/dist/src/cli/init/prompts/index.js +27 -1
- package/dist/src/cli/init/prompts/index.js.map +1 -1
- package/dist/src/cli/init/prompts/language-prompt.d.ts +1 -1
- package/dist/src/cli/init/prompts/model-prompt.js +2 -2
- package/dist/src/cli/init/prompts/model-prompt.js.map +1 -1
- package/dist/src/cli/init/prompts/tech-stack-prompt.d.ts +22 -0
- package/dist/src/cli/init/prompts/tech-stack-prompt.js +68 -0
- package/dist/src/cli/init/prompts/tech-stack-prompt.js.map +1 -0
- package/dist/src/cli/init/prompts/test-strategy-prompt.d.ts +19 -0
- package/dist/src/cli/init/prompts/test-strategy-prompt.js +75 -0
- package/dist/src/cli/init/prompts/test-strategy-prompt.js.map +1 -0
- package/dist/src/cli/init/summary/index.d.ts +2 -0
- package/dist/src/cli/init/summary/index.js +9 -0
- package/dist/src/cli/init/summary/index.js.map +1 -0
- package/dist/src/cli/init/summary/summary.prompt.d.ts +7 -0
- package/dist/src/cli/init/summary/summary.prompt.js +22 -0
- package/dist/src/cli/init/summary/summary.prompt.js.map +1 -0
- package/dist/src/cli/init/summary/summary.renderer.d.ts +32 -0
- package/dist/src/cli/init/summary/summary.renderer.js +41 -0
- package/dist/src/cli/init/summary/summary.renderer.js.map +1 -0
- package/dist/src/cli/init/templates/config-renderer.d.ts +42 -0
- package/dist/src/cli/init/templates/config-renderer.js +247 -0
- package/dist/src/cli/init/templates/config-renderer.js.map +1 -0
- package/dist/src/cli/init/templates/index.d.ts +1 -0
- package/dist/src/cli/init/templates/index.js +5 -1
- package/dist/src/cli/init/templates/index.js.map +1 -1
- package/dist/src/cli/utils/console.js +26 -7
- package/dist/src/cli/utils/console.js.map +1 -1
- package/dist/src/config/config.loader.d.ts +3 -0
- package/dist/src/config/config.loader.js +54 -0
- package/dist/src/config/config.loader.js.map +1 -1
- package/dist/src/config/config.schema.d.ts +7 -0
- package/dist/src/config/config.schema.js +5 -1
- package/dist/src/config/config.schema.js.map +1 -1
- package/dist/src/config/config.service.d.ts +1 -0
- package/dist/src/config/config.service.js +26 -1
- package/dist/src/config/config.service.js.map +1 -1
- package/dist/src/keyword/auto-executor.d.ts +17 -0
- package/dist/src/keyword/auto-executor.js +80 -0
- package/dist/src/keyword/auto-executor.js.map +1 -0
- package/dist/src/keyword/auto-executor.types.d.ts +44 -0
- package/dist/src/keyword/auto-executor.types.js +7 -0
- package/dist/src/keyword/auto-executor.types.js.map +1 -0
- package/dist/src/keyword/auto-formatter.d.ts +8 -0
- package/dist/src/keyword/auto-formatter.js +79 -0
- package/dist/src/keyword/auto-formatter.js.map +1 -0
- package/dist/src/keyword/auto-prompt-builder.d.ts +6 -0
- package/dist/src/keyword/auto-prompt-builder.js +47 -0
- package/dist/src/keyword/auto-prompt-builder.js.map +1 -0
- package/dist/src/keyword/index.d.ts +9 -0
- package/dist/src/keyword/index.js +28 -0
- package/dist/src/keyword/index.js.map +1 -0
- package/dist/src/keyword/keyword.module.js +11 -1
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.d.ts +9 -2
- package/dist/src/keyword/keyword.service.js +108 -44
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/keyword/keyword.types.d.ts +11 -8
- package/dist/src/keyword/keyword.types.js +22 -12
- package/dist/src/keyword/keyword.types.js.map +1 -1
- package/dist/src/keyword/primary-agent-resolver.js +4 -4
- package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
- package/dist/src/keyword/rule-filter.js +1 -0
- package/dist/src/keyword/rule-filter.js.map +1 -1
- package/dist/src/main.js +12 -4
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp/handlers/abstract-handler.d.ts +8 -0
- package/dist/src/mcp/handlers/abstract-handler.js +19 -0
- package/dist/src/mcp/handlers/abstract-handler.js.map +1 -0
- package/dist/src/mcp/handlers/agent.handler.d.ts +6 -4
- package/dist/src/mcp/handlers/agent.handler.js +8 -15
- package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
- package/dist/src/mcp/handlers/checklist-context.handler.d.ts +6 -4
- package/dist/src/mcp/handlers/checklist-context.handler.js +8 -12
- package/dist/src/mcp/handlers/checklist-context.handler.js.map +1 -1
- package/dist/src/mcp/handlers/config.handler.d.ts +6 -4
- package/dist/src/mcp/handlers/config.handler.js +12 -20
- package/dist/src/mcp/handlers/config.handler.js.map +1 -1
- package/dist/src/mcp/handlers/conventions.handler.d.ts +12 -0
- package/dist/src/mcp/handlers/conventions.handler.js +73 -0
- package/dist/src/mcp/handlers/conventions.handler.js.map +1 -0
- package/dist/src/mcp/handlers/index.d.ts +1 -0
- package/dist/src/mcp/handlers/index.js +3 -1
- package/dist/src/mcp/handlers/index.js.map +1 -1
- package/dist/src/mcp/handlers/mode.handler.d.ts +6 -5
- package/dist/src/mcp/handlers/mode.handler.js +6 -13
- package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
- package/dist/src/mcp/handlers/rules.handler.d.ts +6 -4
- package/dist/src/mcp/handlers/rules.handler.js +8 -12
- package/dist/src/mcp/handlers/rules.handler.js.map +1 -1
- package/dist/src/mcp/handlers/skill.handler.d.ts +6 -4
- package/dist/src/mcp/handlers/skill.handler.js +8 -12
- package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
- package/dist/src/mcp/mcp-serverless.js +5 -0
- package/dist/src/mcp/mcp-serverless.js.map +1 -1
- package/dist/src/mcp/mcp.module.js +1 -0
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/mcp/mcp.service.d.ts +0 -1
- package/dist/src/mcp/mcp.service.js +2 -5
- package/dist/src/mcp/mcp.service.js.map +1 -1
- package/dist/src/model/model.constants.js.map +1 -1
- package/dist/src/model/model.resolver.js +8 -0
- package/dist/src/model/model.resolver.js.map +1 -1
- package/dist/src/shared/async.utils.d.ts +8 -0
- package/dist/src/shared/async.utils.js +18 -0
- package/dist/src/shared/async.utils.js.map +1 -0
- package/dist/src/shared/file.utils.d.ts +38 -2
- package/dist/src/shared/file.utils.js +104 -3
- package/dist/src/shared/file.utils.js.map +1 -1
- package/dist/src/shared/format.utils.d.ts +1 -0
- package/dist/src/shared/format.utils.js +19 -0
- package/dist/src/shared/format.utils.js.map +1 -0
- package/dist/src/shared/lru-cache.d.ts +21 -0
- package/dist/src/shared/lru-cache.js +70 -0
- package/dist/src/shared/lru-cache.js.map +1 -0
- package/dist/src/shared/validation.constants.d.ts +31 -0
- package/dist/src/shared/validation.constants.js +82 -8
- package/dist/src/shared/validation.constants.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -42,6 +42,9 @@ npx codingbuddy init
|
|
|
42
42
|
| `get_agent_details` | Get detailed profile of a specialist agent |
|
|
43
43
|
| `parse_mode` | Parse PLAN/ACT/EVAL workflow mode (includes language setting) |
|
|
44
44
|
| `recommend_skills` | Recommend skills based on user prompt with multi-language support |
|
|
45
|
+
| `get_code_conventions` | **🆕** Get project code conventions from config files (tsconfig, eslint, prettier, editorconfig, markdownlint) |
|
|
46
|
+
| `generate_checklist` | Generate contextual checklists including conventions domain |
|
|
47
|
+
| `analyze_task` | Comprehensive task analysis with risk assessment |
|
|
45
48
|
|
|
46
49
|
### MCP Prompts
|
|
47
50
|
|
|
@@ -182,6 +185,65 @@ curl -X POST https://your-project.vercel.app/api/mcp \
|
|
|
182
185
|
| `CODINGBUDDY_PROJECT_ROOT` | Project root for config loading | Current directory |
|
|
183
186
|
| `ANTHROPIC_API_KEY` | API key for `codingbuddy init` | Required for init |
|
|
184
187
|
|
|
188
|
+
## 🆕 Code Conventions Usage
|
|
189
|
+
|
|
190
|
+
The `get_code_conventions` MCP tool automatically parses your project's config files and enforces conventions.
|
|
191
|
+
|
|
192
|
+
### Supported Config Files
|
|
193
|
+
|
|
194
|
+
| File | Conventions Extracted |
|
|
195
|
+
|------|----------------------|
|
|
196
|
+
| `tsconfig.json` | TypeScript strict mode, compiler options, path aliases |
|
|
197
|
+
| `eslint.config.js` / `.eslintrc.json` | ESLint flat/legacy config, rules, parser options |
|
|
198
|
+
| `.prettierrc` | Quote style, semicolons, trailing commas, indentation |
|
|
199
|
+
| `.editorconfig` | Indent style/size, line endings, charset |
|
|
200
|
+
| `.markdownlint.json` | Markdown linting rules (MD001, MD003, etc.) |
|
|
201
|
+
|
|
202
|
+
### Example Usage in ACT Mode
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// AI calls this tool before implementing
|
|
206
|
+
const conventions = await get_code_conventions();
|
|
207
|
+
|
|
208
|
+
// TypeScript conventions
|
|
209
|
+
if (conventions.typescript.strict) {
|
|
210
|
+
// ✅ Use strict mode - no implicit any
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Prettier conventions
|
|
214
|
+
const quote = conventions.prettier.singleQuote ? "'" : '"';
|
|
215
|
+
const semi = conventions.prettier.semi ? ';' : '';
|
|
216
|
+
|
|
217
|
+
// EditorConfig conventions
|
|
218
|
+
const indent = ' '.repeat(conventions.editorconfig.indent_size || 2);
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Checklist Domain: `conventions`
|
|
222
|
+
|
|
223
|
+
The conventions checklist includes 26 validation items across 5 categories:
|
|
224
|
+
|
|
225
|
+
1. **TypeScript** (4 items): strict mode, noImplicitAny, strictNullChecks, path aliases
|
|
226
|
+
2. **ESLint** (3 items): flat config usage, rules compliance, no errors
|
|
227
|
+
3. **Prettier** (5 items): quotes, semicolons, trailing commas, indentation, arrow parens
|
|
228
|
+
4. **EditorConfig** (6 items): indent style/size, line endings, charset, whitespace, final newline
|
|
229
|
+
5. **Markdown** (3 items): heading style, list style, markdownlint rules
|
|
230
|
+
|
|
231
|
+
### EVAL Mode Integration
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// AI automatically includes conventions in code review
|
|
235
|
+
const checklist = await generate_checklist({
|
|
236
|
+
files: ['src/auth/login.ts'],
|
|
237
|
+
domains: ['security', 'conventions'] // conventions added automatically
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
// Checklist items include:
|
|
241
|
+
// - "TypeScript strict mode is enabled"
|
|
242
|
+
// - "Code uses consistent quote style per .prettierrc"
|
|
243
|
+
// - "Indentation style matches .editorconfig"
|
|
244
|
+
// ... and 23 more convention checks
|
|
245
|
+
```
|
|
246
|
+
|
|
185
247
|
## Project Configuration
|
|
186
248
|
|
|
187
249
|
### Initialize Configuration
|
|
@@ -19,11 +19,17 @@ const MODE_INSTRUCTIONS = {
|
|
|
19
19
|
- Review code for potential issues and improvements
|
|
20
20
|
- Provide objective, evidence-based feedback
|
|
21
21
|
- Identify areas for improvement with specific recommendations`,
|
|
22
|
+
AUTO: `You are in AUTO mode. Your task is to:
|
|
23
|
+
- Execute an autonomous PLAN → ACT → EVAL cycle
|
|
24
|
+
- Iterate until quality standards are met or max iterations reached
|
|
25
|
+
- Self-correct based on EVAL feedback in subsequent iterations
|
|
26
|
+
- Provide a final summary with all changes and remaining issues`,
|
|
22
27
|
};
|
|
23
28
|
const MODE_TASK_PREFIXES = {
|
|
24
29
|
PLAN: 'planning',
|
|
25
30
|
ACT: 'verification',
|
|
26
31
|
EVAL: 'review',
|
|
32
|
+
AUTO: 'autonomous execution',
|
|
27
33
|
};
|
|
28
34
|
function buildAgentSystemPrompt(agentProfile, context) {
|
|
29
35
|
const sections = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-prompt.builder.js","sourceRoot":"","sources":["../../../src/agent/agent-prompt.builder.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"agent-prompt.builder.js","sourceRoot":"","sources":["../../../src/agent/agent-prompt.builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.AnalyzerModule = void 0;
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const analyzer_service_1 = require("./analyzer.service");
|
|
12
|
+
const conventions_analyzer_1 = require("./conventions.analyzer");
|
|
12
13
|
let AnalyzerModule = class AnalyzerModule {
|
|
13
14
|
};
|
|
14
15
|
exports.AnalyzerModule = AnalyzerModule;
|
|
15
16
|
exports.AnalyzerModule = AnalyzerModule = __decorate([
|
|
16
17
|
(0, common_1.Module)({
|
|
17
|
-
providers: [analyzer_service_1.AnalyzerService],
|
|
18
|
-
exports: [analyzer_service_1.AnalyzerService],
|
|
18
|
+
providers: [analyzer_service_1.AnalyzerService, conventions_analyzer_1.ConventionsAnalyzer],
|
|
19
|
+
exports: [analyzer_service_1.AnalyzerService, conventions_analyzer_1.ConventionsAnalyzer],
|
|
19
20
|
})
|
|
20
21
|
], AnalyzerModule);
|
|
21
22
|
//# sourceMappingURL=analyzer.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.module.js","sourceRoot":"","sources":["../../../src/analyzer/analyzer.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAAqD;
|
|
1
|
+
{"version":3,"file":"analyzer.module.js","sourceRoot":"","sources":["../../../src/analyzer/analyzer.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yDAAqD;AACrD,iEAA6D;AAgBtD,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAJ1B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,EAAE,0CAAmB,CAAC;QACjD,OAAO,EAAE,CAAC,kCAAe,EAAE,0CAAmB,CAAC;KAChD,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -45,6 +45,15 @@ exports.CONFIG_FILE_PATTERNS = {
|
|
|
45
45
|
vitest: ['vitest.config.ts', 'vitest.config.js', 'vitest.config.mts'],
|
|
46
46
|
};
|
|
47
47
|
const ALL_CONFIG_PATTERNS = Object.values(exports.CONFIG_FILE_PATTERNS).flat();
|
|
48
|
+
const COMPILED_PATTERNS = ALL_CONFIG_PATTERNS.map(pattern => {
|
|
49
|
+
if (pattern.includes('*')) {
|
|
50
|
+
return {
|
|
51
|
+
pattern,
|
|
52
|
+
regex: new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$'),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { pattern };
|
|
56
|
+
});
|
|
48
57
|
function parseTsConfig(content, filePath) {
|
|
49
58
|
try {
|
|
50
59
|
const config = JSON.parse(content);
|
|
@@ -93,9 +102,8 @@ function parsePrettierConfig(content, filePath) {
|
|
|
93
102
|
}
|
|
94
103
|
function matchesConfigPattern(fileName) {
|
|
95
104
|
const baseName = path.basename(fileName);
|
|
96
|
-
for (const pattern of
|
|
97
|
-
if (
|
|
98
|
-
const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
|
|
105
|
+
for (const { pattern, regex } of COMPILED_PATTERNS) {
|
|
106
|
+
if (regex) {
|
|
99
107
|
if (regex.test(baseName)) {
|
|
100
108
|
return true;
|
|
101
109
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/config.analyzer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/config.analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ProjectConventions, EditorConfigConventions, TypeScriptConventions, ESLintConventions, PrettierConventions, MarkdownLintConventions } from './conventions.types';
|
|
2
|
+
export declare class ConventionsAnalyzer {
|
|
3
|
+
private readonly logger;
|
|
4
|
+
private readonly conventionsCache;
|
|
5
|
+
private readonly sizeViolations;
|
|
6
|
+
private readonly VIOLATION_THRESHOLD;
|
|
7
|
+
private readonly VIOLATION_WINDOW;
|
|
8
|
+
private getConfigMtimes;
|
|
9
|
+
private trackSizeViolation;
|
|
10
|
+
private parseConfigWithDefaults;
|
|
11
|
+
private parseIniContent;
|
|
12
|
+
private parseEditorConfigKeyValue;
|
|
13
|
+
parseEditorConfig(filePath: string): Promise<EditorConfigConventions>;
|
|
14
|
+
parseMarkdownLint(filePath: string): Promise<MarkdownLintConventions>;
|
|
15
|
+
parseTypeScriptConfig(filePath: string): Promise<TypeScriptConventions>;
|
|
16
|
+
parseESLintConfig(filePath: string): Promise<ESLintConventions>;
|
|
17
|
+
parsePrettierConfig(filePath: string): Promise<PrettierConventions>;
|
|
18
|
+
private findConfigFile;
|
|
19
|
+
analyzeProjectConventions(projectRoot: string): Promise<ProjectConventions>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var ConventionsAnalyzer_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ConventionsAnalyzer = void 0;
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const path = require("path");
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const validation_constants_1 = require("../shared/validation.constants");
|
|
15
|
+
const security_utils_1 = require("../shared/security.utils");
|
|
16
|
+
const lru_cache_1 = require("../shared/lru-cache");
|
|
17
|
+
const conventions_schemas_1 = require("./conventions.schemas");
|
|
18
|
+
const conventions_types_1 = require("./conventions.types");
|
|
19
|
+
const config_analyzer_1 = require("./config.analyzer");
|
|
20
|
+
let ConventionsAnalyzer = ConventionsAnalyzer_1 = class ConventionsAnalyzer {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.logger = new common_1.Logger(ConventionsAnalyzer_1.name);
|
|
23
|
+
this.conventionsCache = new lru_cache_1.LRUCache({
|
|
24
|
+
maxSize: 10,
|
|
25
|
+
ttl: 5 * 60 * 1000,
|
|
26
|
+
});
|
|
27
|
+
this.sizeViolations = new Map();
|
|
28
|
+
this.VIOLATION_THRESHOLD = 3;
|
|
29
|
+
this.VIOLATION_WINDOW = 60 * 1000;
|
|
30
|
+
}
|
|
31
|
+
async getConfigMtimes(projectRoot) {
|
|
32
|
+
const mtimes = new Map();
|
|
33
|
+
const configFiles = [
|
|
34
|
+
'tsconfig.json',
|
|
35
|
+
'eslint.config.js',
|
|
36
|
+
'.eslintrc.json',
|
|
37
|
+
'.eslintrc',
|
|
38
|
+
'.prettierrc',
|
|
39
|
+
'.prettierrc.json',
|
|
40
|
+
'.editorconfig',
|
|
41
|
+
'.markdownlint.json',
|
|
42
|
+
];
|
|
43
|
+
for (const file of configFiles) {
|
|
44
|
+
const filePath = path.join(projectRoot, file);
|
|
45
|
+
try {
|
|
46
|
+
const stats = await fs_1.promises.stat(filePath);
|
|
47
|
+
mtimes.set(filePath, stats.mtimeMs);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return mtimes;
|
|
53
|
+
}
|
|
54
|
+
trackSizeViolation(filePath, actualSize, maxSize) {
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const violations = this.sizeViolations.get(filePath) || [];
|
|
57
|
+
const recentViolations = violations.filter(timestamp => now - timestamp < this.VIOLATION_WINDOW);
|
|
58
|
+
recentViolations.push(now);
|
|
59
|
+
this.sizeViolations.set(filePath, recentViolations);
|
|
60
|
+
if (recentViolations.length >= this.VIOLATION_THRESHOLD) {
|
|
61
|
+
this.logger.warn('Potential DoS attack or misconfiguration detected: Frequent file size violations', {
|
|
62
|
+
filePath,
|
|
63
|
+
violationCount: recentViolations.length,
|
|
64
|
+
timeWindow: `${this.VIOLATION_WINDOW / 1000}s`,
|
|
65
|
+
actualSize,
|
|
66
|
+
maxSize,
|
|
67
|
+
recommendation: 'Review file sizes or increase limit if legitimate use case',
|
|
68
|
+
});
|
|
69
|
+
this.sizeViolations.delete(filePath);
|
|
70
|
+
}
|
|
71
|
+
if (this.sizeViolations.size > 100) {
|
|
72
|
+
for (const [path, timestamps] of this.sizeViolations.entries()) {
|
|
73
|
+
const recent = timestamps.filter(t => now - t < this.VIOLATION_WINDOW);
|
|
74
|
+
if (recent.length === 0) {
|
|
75
|
+
this.sizeViolations.delete(path);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async parseConfigWithDefaults(filePath, parser, defaultConfig, configType) {
|
|
81
|
+
try {
|
|
82
|
+
const stats = await fs_1.promises.stat(filePath);
|
|
83
|
+
if (stats.size > validation_constants_1.MAX_CONFIG_FILE_SIZE) {
|
|
84
|
+
this.logger.warn('Config file exceeds size limit', {
|
|
85
|
+
configType,
|
|
86
|
+
filePath,
|
|
87
|
+
size: stats.size,
|
|
88
|
+
maxSize: validation_constants_1.MAX_CONFIG_FILE_SIZE,
|
|
89
|
+
});
|
|
90
|
+
this.trackSizeViolation(filePath, stats.size, validation_constants_1.MAX_CONFIG_FILE_SIZE);
|
|
91
|
+
return defaultConfig;
|
|
92
|
+
}
|
|
93
|
+
const content = await fs_1.promises.readFile(filePath, 'utf-8');
|
|
94
|
+
const parsed = await parser(content, filePath);
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
99
|
+
const errorCode = error?.code;
|
|
100
|
+
if (errorCode !== 'ENOENT') {
|
|
101
|
+
this.logger.warn('Failed to parse config file', {
|
|
102
|
+
configType,
|
|
103
|
+
filePath,
|
|
104
|
+
errorCode,
|
|
105
|
+
errorMessage,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.logger.debug(`Config file not found, using defaults: ${filePath}`, {
|
|
110
|
+
configType,
|
|
111
|
+
filePath,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return defaultConfig;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
parseIniContent(content) {
|
|
118
|
+
const result = {};
|
|
119
|
+
const lines = content.split('\n');
|
|
120
|
+
let inSection = false;
|
|
121
|
+
for (const line of lines) {
|
|
122
|
+
const trimmed = line.trim();
|
|
123
|
+
if (trimmed.startsWith('#') || trimmed.startsWith(';') || !trimmed) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (trimmed === '[*]') {
|
|
127
|
+
inSection = true;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
|
|
131
|
+
inSection = false;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (inSection && trimmed.includes('=')) {
|
|
135
|
+
const [key, value] = trimmed.split('=').map(s => s.trim());
|
|
136
|
+
result[key] = value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
parseEditorConfigKeyValue(config, key, value) {
|
|
142
|
+
switch (key) {
|
|
143
|
+
case 'indent_style':
|
|
144
|
+
if ((0, validation_constants_1.isIndentStyle)(value)) {
|
|
145
|
+
config.indent_style = value;
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'indent_size': {
|
|
149
|
+
const parsed = (0, validation_constants_1.parseIndentSize)(value);
|
|
150
|
+
if (parsed.success && parsed.value !== undefined) {
|
|
151
|
+
config.indent_size = parsed.value;
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case 'tab_width': {
|
|
156
|
+
const parsed = (0, validation_constants_1.parseTabWidth)(value);
|
|
157
|
+
if (parsed.success && parsed.value !== undefined) {
|
|
158
|
+
config.tab_width = parsed.value;
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case 'end_of_line':
|
|
163
|
+
if ((0, validation_constants_1.isEndOfLine)(value)) {
|
|
164
|
+
config.end_of_line = value;
|
|
165
|
+
}
|
|
166
|
+
break;
|
|
167
|
+
case 'charset':
|
|
168
|
+
if ((0, validation_constants_1.isCharset)(value)) {
|
|
169
|
+
config.charset = value;
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
case 'trim_trailing_whitespace':
|
|
173
|
+
config.trim_trailing_whitespace = value === 'true';
|
|
174
|
+
break;
|
|
175
|
+
case 'insert_final_newline':
|
|
176
|
+
config.insert_final_newline = value === 'true';
|
|
177
|
+
break;
|
|
178
|
+
case 'max_line_length': {
|
|
179
|
+
const parsed = (0, validation_constants_1.parseMaxLineLength)(value);
|
|
180
|
+
if (parsed.success && parsed.value !== undefined) {
|
|
181
|
+
config.max_line_length = parsed.value;
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
async parseEditorConfig(filePath) {
|
|
188
|
+
return this.parseConfigWithDefaults(filePath, content => {
|
|
189
|
+
const config = {};
|
|
190
|
+
const keyValuePairs = this.parseIniContent(content);
|
|
191
|
+
for (const [key, value] of Object.entries(keyValuePairs)) {
|
|
192
|
+
this.parseEditorConfigKeyValue(config, key, value);
|
|
193
|
+
}
|
|
194
|
+
return { ...conventions_types_1.DEFAULT_EDITOR_CONFIG, ...config };
|
|
195
|
+
}, conventions_types_1.DEFAULT_EDITOR_CONFIG, 'editorconfig');
|
|
196
|
+
}
|
|
197
|
+
async parseMarkdownLint(filePath) {
|
|
198
|
+
return this.parseConfigWithDefaults(filePath, content => {
|
|
199
|
+
const parsed = JSON.parse(content);
|
|
200
|
+
const dangerousPath = (0, security_utils_1.containsDangerousKeys)(parsed);
|
|
201
|
+
if (dangerousPath) {
|
|
202
|
+
this.logger.warn('Dangerous key detected in MarkdownLint config', {
|
|
203
|
+
filePath,
|
|
204
|
+
dangerousPath,
|
|
205
|
+
});
|
|
206
|
+
return conventions_types_1.DEFAULT_MARKDOWNLINT_CONFIG;
|
|
207
|
+
}
|
|
208
|
+
const validationResult = conventions_schemas_1.MarkdownLintConfigSchema.safeParse(parsed);
|
|
209
|
+
if (!validationResult.success) {
|
|
210
|
+
this.logger.warn('MarkdownLint config validation failed', {
|
|
211
|
+
filePath,
|
|
212
|
+
errors: validationResult.error.issues,
|
|
213
|
+
});
|
|
214
|
+
return conventions_types_1.DEFAULT_MARKDOWNLINT_CONFIG;
|
|
215
|
+
}
|
|
216
|
+
const config = validationResult.data;
|
|
217
|
+
return { ...conventions_types_1.DEFAULT_MARKDOWNLINT_CONFIG, ...config };
|
|
218
|
+
}, conventions_types_1.DEFAULT_MARKDOWNLINT_CONFIG, 'markdownlint');
|
|
219
|
+
}
|
|
220
|
+
async parseTypeScriptConfig(filePath) {
|
|
221
|
+
return this.parseConfigWithDefaults(filePath, (content, filePath) => {
|
|
222
|
+
const summary = (0, config_analyzer_1.parseTsConfig)(content, filePath);
|
|
223
|
+
if (!summary) {
|
|
224
|
+
return conventions_types_1.DEFAULT_TYPESCRIPT_CONFIG;
|
|
225
|
+
}
|
|
226
|
+
const parsed = JSON.parse(content);
|
|
227
|
+
const dangerousPath = (0, security_utils_1.containsDangerousKeys)(parsed);
|
|
228
|
+
if (dangerousPath) {
|
|
229
|
+
this.logger.warn('Dangerous key detected in TypeScript config', {
|
|
230
|
+
filePath,
|
|
231
|
+
dangerousPath,
|
|
232
|
+
});
|
|
233
|
+
return conventions_types_1.DEFAULT_TYPESCRIPT_CONFIG;
|
|
234
|
+
}
|
|
235
|
+
const validationResult = conventions_schemas_1.TypeScriptConfigSchema.safeParse(parsed);
|
|
236
|
+
if (!validationResult.success) {
|
|
237
|
+
this.logger.warn('TypeScript config validation failed', {
|
|
238
|
+
filePath,
|
|
239
|
+
errors: validationResult.error.issues,
|
|
240
|
+
});
|
|
241
|
+
return conventions_types_1.DEFAULT_TYPESCRIPT_CONFIG;
|
|
242
|
+
}
|
|
243
|
+
const config = validationResult.data;
|
|
244
|
+
const compilerOptions = config.compilerOptions ?? {};
|
|
245
|
+
return {
|
|
246
|
+
strict: compilerOptions.strict,
|
|
247
|
+
noImplicitAny: compilerOptions.noImplicitAny,
|
|
248
|
+
strictNullChecks: compilerOptions.strictNullChecks,
|
|
249
|
+
strictFunctionTypes: compilerOptions.strictFunctionTypes,
|
|
250
|
+
strictBindCallApply: compilerOptions.strictBindCallApply,
|
|
251
|
+
noImplicitThis: compilerOptions.noImplicitThis,
|
|
252
|
+
alwaysStrict: compilerOptions.alwaysStrict,
|
|
253
|
+
target: compilerOptions.target,
|
|
254
|
+
module: compilerOptions.module,
|
|
255
|
+
moduleResolution: compilerOptions.moduleResolution,
|
|
256
|
+
esModuleInterop: compilerOptions.esModuleInterop,
|
|
257
|
+
paths: compilerOptions.paths,
|
|
258
|
+
};
|
|
259
|
+
}, conventions_types_1.DEFAULT_TYPESCRIPT_CONFIG, 'typescript');
|
|
260
|
+
}
|
|
261
|
+
async parseESLintConfig(filePath) {
|
|
262
|
+
return this.parseConfigWithDefaults(filePath, (content, filePath) => {
|
|
263
|
+
const configType = filePath.includes('eslint.config.')
|
|
264
|
+
? 'flat'
|
|
265
|
+
: 'legacy';
|
|
266
|
+
if (filePath.endsWith('.json') ||
|
|
267
|
+
filePath === '.eslintrc' ||
|
|
268
|
+
!filePath.includes('.')) {
|
|
269
|
+
const parsed = JSON.parse(content);
|
|
270
|
+
const dangerousPath = (0, security_utils_1.containsDangerousKeys)(parsed);
|
|
271
|
+
if (dangerousPath) {
|
|
272
|
+
this.logger.warn('Dangerous key detected in ESLint config', {
|
|
273
|
+
filePath,
|
|
274
|
+
dangerousPath,
|
|
275
|
+
});
|
|
276
|
+
return {
|
|
277
|
+
configType,
|
|
278
|
+
parser: 'unknown (dangerous keys detected)',
|
|
279
|
+
rules: {},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const validationResult = conventions_schemas_1.ESLintConfigSchema.safeParse(parsed);
|
|
283
|
+
if (!validationResult.success) {
|
|
284
|
+
this.logger.warn('ESLint config validation failed', {
|
|
285
|
+
filePath,
|
|
286
|
+
errors: validationResult.error.issues,
|
|
287
|
+
});
|
|
288
|
+
return {
|
|
289
|
+
configType,
|
|
290
|
+
parser: 'unknown (validation failed)',
|
|
291
|
+
rules: {},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const config = validationResult.data;
|
|
295
|
+
return {
|
|
296
|
+
configType,
|
|
297
|
+
parser: config.parser,
|
|
298
|
+
parserOptions: config.parserOptions,
|
|
299
|
+
rules: config.rules,
|
|
300
|
+
extends: config.extends,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
configType,
|
|
305
|
+
parser: 'unknown (JS config)',
|
|
306
|
+
rules: {},
|
|
307
|
+
};
|
|
308
|
+
}, conventions_types_1.DEFAULT_ESLINT_CONFIG, 'eslint');
|
|
309
|
+
}
|
|
310
|
+
async parsePrettierConfig(filePath) {
|
|
311
|
+
return this.parseConfigWithDefaults(filePath, content => {
|
|
312
|
+
const parsed = JSON.parse(content);
|
|
313
|
+
const dangerousPath = (0, security_utils_1.containsDangerousKeys)(parsed);
|
|
314
|
+
if (dangerousPath) {
|
|
315
|
+
this.logger.warn('Dangerous key detected in Prettier config', {
|
|
316
|
+
filePath,
|
|
317
|
+
dangerousPath,
|
|
318
|
+
});
|
|
319
|
+
return conventions_types_1.DEFAULT_PRETTIER_CONFIG;
|
|
320
|
+
}
|
|
321
|
+
const validationResult = conventions_schemas_1.PrettierConfigSchema.safeParse(parsed);
|
|
322
|
+
if (!validationResult.success) {
|
|
323
|
+
this.logger.warn('Prettier config validation failed', {
|
|
324
|
+
filePath,
|
|
325
|
+
errors: validationResult.error.issues,
|
|
326
|
+
});
|
|
327
|
+
return conventions_types_1.DEFAULT_PRETTIER_CONFIG;
|
|
328
|
+
}
|
|
329
|
+
const config = validationResult.data;
|
|
330
|
+
return { ...conventions_types_1.DEFAULT_PRETTIER_CONFIG, ...config };
|
|
331
|
+
}, conventions_types_1.DEFAULT_PRETTIER_CONFIG, 'prettier');
|
|
332
|
+
}
|
|
333
|
+
async findConfigFile(projectRoot, patterns) {
|
|
334
|
+
for (const pattern of patterns) {
|
|
335
|
+
const filePath = path.join(projectRoot, pattern);
|
|
336
|
+
try {
|
|
337
|
+
await fs_1.promises.access(filePath);
|
|
338
|
+
return filePath;
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
async analyzeProjectConventions(projectRoot) {
|
|
346
|
+
try {
|
|
347
|
+
await fs_1.promises.access(projectRoot);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
throw new Error(`Project root does not exist: ${projectRoot}`);
|
|
351
|
+
}
|
|
352
|
+
const mtimes = await this.getConfigMtimes(projectRoot);
|
|
353
|
+
const cached = this.conventionsCache.get(projectRoot, mtimes);
|
|
354
|
+
if (cached) {
|
|
355
|
+
this.logger.debug('Returning cached conventions', { projectRoot });
|
|
356
|
+
return cached;
|
|
357
|
+
}
|
|
358
|
+
const [typescript, eslint, prettier, editorconfig, markdownlint] = await Promise.all([
|
|
359
|
+
this.findConfigFile(projectRoot, ['tsconfig.json'])
|
|
360
|
+
.then(tsConfigPath => tsConfigPath || path.join(projectRoot, 'tsconfig.json'))
|
|
361
|
+
.then(tsConfigPath => this.parseTypeScriptConfig(tsConfigPath)),
|
|
362
|
+
this.findConfigFile(projectRoot, [
|
|
363
|
+
'eslint.config.js',
|
|
364
|
+
'.eslintrc.json',
|
|
365
|
+
'.eslintrc',
|
|
366
|
+
])
|
|
367
|
+
.then(eslintConfigPath => eslintConfigPath || path.join(projectRoot, 'eslint.config.js'))
|
|
368
|
+
.then(eslintConfigPath => this.parseESLintConfig(eslintConfigPath)),
|
|
369
|
+
this.findConfigFile(projectRoot, ['.prettierrc', '.prettierrc.json'])
|
|
370
|
+
.then(prettierConfigPath => prettierConfigPath || path.join(projectRoot, '.prettierrc'))
|
|
371
|
+
.then(prettierConfigPath => this.parsePrettierConfig(prettierConfigPath)),
|
|
372
|
+
this.parseEditorConfig(path.join(projectRoot, '.editorconfig')),
|
|
373
|
+
this.parseMarkdownLint(path.join(projectRoot, '.markdownlint.json')),
|
|
374
|
+
]);
|
|
375
|
+
const result = {
|
|
376
|
+
projectRoot,
|
|
377
|
+
typescript,
|
|
378
|
+
eslint,
|
|
379
|
+
prettier,
|
|
380
|
+
editorconfig,
|
|
381
|
+
markdownlint,
|
|
382
|
+
};
|
|
383
|
+
this.conventionsCache.set(projectRoot, result, mtimes);
|
|
384
|
+
this.logger.debug('Cached conventions', {
|
|
385
|
+
projectRoot,
|
|
386
|
+
mtimes: mtimes.size,
|
|
387
|
+
});
|
|
388
|
+
return result;
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
exports.ConventionsAnalyzer = ConventionsAnalyzer;
|
|
392
|
+
exports.ConventionsAnalyzer = ConventionsAnalyzer = ConventionsAnalyzer_1 = __decorate([
|
|
393
|
+
(0, common_1.Injectable)()
|
|
394
|
+
], ConventionsAnalyzer);
|
|
395
|
+
//# sourceMappingURL=conventions.analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conventions.analyzer.js","sourceRoot":"","sources":["../../../src/analyzer/conventions.analyzer.ts"],"names":[],"mappings":"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"}
|