codingbuddy 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +73 -0
  2. package/dist/src/analyzer/analyzer.module.js +3 -2
  3. package/dist/src/analyzer/analyzer.module.js.map +1 -1
  4. package/dist/src/analyzer/config.analyzer.js +11 -3
  5. package/dist/src/analyzer/config.analyzer.js.map +1 -1
  6. package/dist/src/analyzer/conventions.analyzer.d.ts +20 -0
  7. package/dist/src/analyzer/conventions.analyzer.js +395 -0
  8. package/dist/src/analyzer/conventions.analyzer.js.map +1 -0
  9. package/dist/src/analyzer/conventions.schemas.d.ts +76 -0
  10. package/dist/src/analyzer/conventions.schemas.js +71 -0
  11. package/dist/src/analyzer/conventions.schemas.js.map +1 -0
  12. package/dist/src/analyzer/conventions.types.d.ts +81 -0
  13. package/dist/src/analyzer/conventions.types.js +33 -0
  14. package/dist/src/analyzer/conventions.types.js.map +1 -0
  15. package/dist/src/checklist/checklist.types.d.ts +1 -1
  16. package/dist/src/checklist/checklist.types.js +1 -0
  17. package/dist/src/checklist/checklist.types.js.map +1 -1
  18. package/dist/src/cli/cli.js +2 -2
  19. package/dist/src/cli/cli.js.map +1 -1
  20. package/dist/src/config/config.loader.d.ts +2 -0
  21. package/dist/src/config/config.loader.js +35 -4
  22. package/dist/src/config/config.loader.js.map +1 -1
  23. package/dist/src/keyword/auto-executor.d.ts +2 -2
  24. package/dist/src/keyword/auto-executor.js +15 -30
  25. package/dist/src/keyword/auto-executor.js.map +1 -1
  26. package/dist/src/keyword/auto-prompt-builder.d.ts +6 -0
  27. package/dist/src/keyword/auto-prompt-builder.js +47 -0
  28. package/dist/src/keyword/auto-prompt-builder.js.map +1 -0
  29. package/dist/src/keyword/keyword.module.js +11 -1
  30. package/dist/src/keyword/keyword.module.js.map +1 -1
  31. package/dist/src/keyword/keyword.service.d.ts +9 -2
  32. package/dist/src/keyword/keyword.service.js +98 -51
  33. package/dist/src/keyword/keyword.service.js.map +1 -1
  34. package/dist/src/keyword/keyword.types.d.ts +0 -3
  35. package/dist/src/keyword/keyword.types.js +1 -4
  36. package/dist/src/keyword/keyword.types.js.map +1 -1
  37. package/dist/src/keyword/primary-agent-resolver.js +4 -4
  38. package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
  39. package/dist/src/main.js +12 -4
  40. package/dist/src/main.js.map +1 -1
  41. package/dist/src/mcp/handlers/abstract-handler.d.ts +8 -0
  42. package/dist/src/mcp/handlers/abstract-handler.js +19 -0
  43. package/dist/src/mcp/handlers/abstract-handler.js.map +1 -0
  44. package/dist/src/mcp/handlers/agent.handler.d.ts +6 -4
  45. package/dist/src/mcp/handlers/agent.handler.js +8 -15
  46. package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
  47. package/dist/src/mcp/handlers/checklist-context.handler.d.ts +6 -4
  48. package/dist/src/mcp/handlers/checklist-context.handler.js +8 -12
  49. package/dist/src/mcp/handlers/checklist-context.handler.js.map +1 -1
  50. package/dist/src/mcp/handlers/config.handler.d.ts +6 -4
  51. package/dist/src/mcp/handlers/config.handler.js +12 -20
  52. package/dist/src/mcp/handlers/config.handler.js.map +1 -1
  53. package/dist/src/mcp/handlers/conventions.handler.d.ts +12 -0
  54. package/dist/src/mcp/handlers/conventions.handler.js +73 -0
  55. package/dist/src/mcp/handlers/conventions.handler.js.map +1 -0
  56. package/dist/src/mcp/handlers/index.d.ts +1 -0
  57. package/dist/src/mcp/handlers/index.js +3 -1
  58. package/dist/src/mcp/handlers/index.js.map +1 -1
  59. package/dist/src/mcp/handlers/mode.handler.d.ts +6 -5
  60. package/dist/src/mcp/handlers/mode.handler.js +6 -13
  61. package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
  62. package/dist/src/mcp/handlers/rules.handler.d.ts +6 -4
  63. package/dist/src/mcp/handlers/rules.handler.js +8 -12
  64. package/dist/src/mcp/handlers/rules.handler.js.map +1 -1
  65. package/dist/src/mcp/handlers/skill.handler.d.ts +6 -4
  66. package/dist/src/mcp/handlers/skill.handler.js +8 -12
  67. package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
  68. package/dist/src/mcp/mcp-serverless.js +2 -1
  69. package/dist/src/mcp/mcp-serverless.js.map +1 -1
  70. package/dist/src/mcp/mcp.module.js +1 -0
  71. package/dist/src/mcp/mcp.module.js.map +1 -1
  72. package/dist/src/mcp/mcp.service.d.ts +0 -1
  73. package/dist/src/mcp/mcp.service.js +4 -6
  74. package/dist/src/mcp/mcp.service.js.map +1 -1
  75. package/dist/src/shared/async.utils.d.ts +8 -0
  76. package/dist/src/shared/async.utils.js +18 -0
  77. package/dist/src/shared/async.utils.js.map +1 -0
  78. package/dist/src/shared/file.utils.d.ts +38 -2
  79. package/dist/src/shared/file.utils.js +104 -3
  80. package/dist/src/shared/file.utils.js.map +1 -1
  81. package/dist/src/shared/format.utils.d.ts +1 -0
  82. package/dist/src/shared/format.utils.js +19 -0
  83. package/dist/src/shared/format.utils.js.map +1 -0
  84. package/dist/src/shared/lru-cache.d.ts +21 -0
  85. package/dist/src/shared/lru-cache.js +70 -0
  86. package/dist/src/shared/lru-cache.js.map +1 -0
  87. package/dist/src/shared/validation.constants.d.ts +31 -0
  88. package/dist/src/shared/validation.constants.js +82 -8
  89. package/dist/src/shared/validation.constants.js.map +1 -1
  90. package/dist/src/shared/version.utils.d.ts +2 -0
  91. package/dist/src/shared/version.utils.js +22 -0
  92. package/dist/src/shared/version.utils.js.map +1 -0
  93. package/dist/tsconfig.build.tsbuildinfo +1 -1
  94. 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,76 @@ 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
+ ## Cache Behavior
189
+
190
+ The MCP server caches configuration to improve performance. Cache TTL varies by environment:
191
+
192
+ | Environment | Cache TTL | Use Case |
193
+ |-------------|-----------|----------|
194
+ | Development | 5 minutes | Frequent config changes during development |
195
+ | Production | 1 hour | Stable configs, reduced file system access |
196
+
197
+ **Note**: To force a config reload in development, restart the MCP server or wait for cache expiration.
198
+
199
+ ## 🆕 Code Conventions Usage
200
+
201
+ The `get_code_conventions` MCP tool automatically parses your project's config files and enforces conventions.
202
+
203
+ ### Supported Config Files
204
+
205
+ | File | Conventions Extracted |
206
+ |------|----------------------|
207
+ | `tsconfig.json` | TypeScript strict mode, compiler options, path aliases |
208
+ | `eslint.config.js` / `.eslintrc.json` | ESLint flat/legacy config, rules, parser options |
209
+ | `.prettierrc` | Quote style, semicolons, trailing commas, indentation |
210
+ | `.editorconfig` | Indent style/size, line endings, charset |
211
+ | `.markdownlint.json` | Markdown linting rules (MD001, MD003, etc.) |
212
+
213
+ ### Example Usage in ACT Mode
214
+
215
+ ```typescript
216
+ // AI calls this tool before implementing
217
+ const conventions = await get_code_conventions();
218
+
219
+ // TypeScript conventions
220
+ if (conventions.typescript.strict) {
221
+ // ✅ Use strict mode - no implicit any
222
+ }
223
+
224
+ // Prettier conventions
225
+ const quote = conventions.prettier.singleQuote ? "'" : '"';
226
+ const semi = conventions.prettier.semi ? ';' : '';
227
+
228
+ // EditorConfig conventions
229
+ const indent = ' '.repeat(conventions.editorconfig.indent_size || 2);
230
+ ```
231
+
232
+ ### Checklist Domain: `conventions`
233
+
234
+ The conventions checklist includes 26 validation items across 5 categories:
235
+
236
+ 1. **TypeScript** (4 items): strict mode, noImplicitAny, strictNullChecks, path aliases
237
+ 2. **ESLint** (3 items): flat config usage, rules compliance, no errors
238
+ 3. **Prettier** (5 items): quotes, semicolons, trailing commas, indentation, arrow parens
239
+ 4. **EditorConfig** (6 items): indent style/size, line endings, charset, whitespace, final newline
240
+ 5. **Markdown** (3 items): heading style, list style, markdownlint rules
241
+
242
+ ### EVAL Mode Integration
243
+
244
+ ```typescript
245
+ // AI automatically includes conventions in code review
246
+ const checklist = await generate_checklist({
247
+ files: ['src/auth/login.ts'],
248
+ domains: ['security', 'conventions'] // conventions added automatically
249
+ });
250
+
251
+ // Checklist items include:
252
+ // - "TypeScript strict mode is enabled"
253
+ // - "Code uses consistent quote style per .prettierrc"
254
+ // - "Indentation style matches .editorconfig"
255
+ // ... and 23 more convention checks
256
+ ```
257
+
185
258
  ## Project Configuration
186
259
 
187
260
  ### Initialize Configuration
@@ -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;AAe9C,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAJ1B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,kCAAe,CAAC;QAC5B,OAAO,EAAE,CAAC,kCAAe,CAAC;KAC3B,CAAC;GACW,cAAc,CAAG"}
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 ALL_CONFIG_PATTERNS) {
97
- if (pattern.includes('*')) {
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":"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"}
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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"}