codingbuddy 0.0.0-canary.20251218065434.a74dc71 → 0.0.0-canary.20251218090747.c1e8699
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/dist/src/config/config.loader.d.ts +22 -0
- package/dist/src/config/config.loader.js +105 -0
- package/dist/src/config/config.loader.js.map +1 -0
- package/dist/src/config/config.loader.spec.d.ts +1 -0
- package/dist/src/config/config.loader.spec.js +86 -0
- package/dist/src/config/config.loader.spec.js.map +1 -0
- package/dist/src/config/config.module.d.ts +2 -0
- package/dist/src/config/config.module.js +21 -0
- package/dist/src/config/config.module.js.map +1 -0
- package/dist/src/config/config.schema.d.ts +546 -0
- package/dist/src/config/config.schema.js +124 -0
- package/dist/src/config/config.schema.js.map +1 -0
- package/dist/src/config/config.schema.spec.d.ts +1 -0
- package/dist/src/config/config.schema.spec.js +235 -0
- package/dist/src/config/config.schema.spec.js.map +1 -0
- package/dist/src/config/config.service.d.ts +33 -0
- package/dist/src/config/config.service.js +126 -0
- package/dist/src/config/config.service.js.map +1 -0
- package/dist/src/config/config.types.d.ts +2 -0
- package/dist/src/config/config.types.js +6 -0
- package/dist/src/config/config.types.js.map +1 -0
- package/dist/src/config/context.loader.d.ts +24 -0
- package/dist/src/config/context.loader.js +153 -0
- package/dist/src/config/context.loader.js.map +1 -0
- package/dist/src/config/context.loader.spec.d.ts +1 -0
- package/dist/src/config/context.loader.spec.js +123 -0
- package/dist/src/config/context.loader.spec.js.map +1 -0
- package/dist/src/config/ignore.parser.d.ts +12 -0
- package/dist/src/config/ignore.parser.js +134 -0
- package/dist/src/config/ignore.parser.js.map +1 -0
- package/dist/src/config/ignore.parser.spec.d.ts +1 -0
- package/dist/src/config/ignore.parser.spec.js +130 -0
- package/dist/src/config/ignore.parser.spec.js.map +1 -0
- package/dist/src/config/index.d.ts +13 -0
- package/dist/src/config/index.js +44 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const config_schema_1 = require("./config.schema");
|
|
5
|
+
(0, vitest_1.describe)('CodingBuddyConfigSchema', () => {
|
|
6
|
+
(0, vitest_1.describe)('validateConfig', () => {
|
|
7
|
+
(0, vitest_1.it)('should accept empty config (all fields optional)', () => {
|
|
8
|
+
const result = (0, config_schema_1.validateConfig)({});
|
|
9
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
10
|
+
(0, vitest_1.expect)(result.data).toEqual({});
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('should accept minimal config with basic fields', () => {
|
|
13
|
+
const config = {
|
|
14
|
+
language: 'ko',
|
|
15
|
+
projectName: 'my-app',
|
|
16
|
+
};
|
|
17
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
18
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
19
|
+
(0, vitest_1.expect)(result.data).toEqual(config);
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)('should accept config with valid repository URL', () => {
|
|
22
|
+
const config = {
|
|
23
|
+
repository: 'https://github.com/example/app',
|
|
24
|
+
};
|
|
25
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
26
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
27
|
+
(0, vitest_1.expect)(result.data?.repository).toBe('https://github.com/example/app');
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)('should reject config with invalid repository URL', () => {
|
|
30
|
+
const config = {
|
|
31
|
+
repository: 'not-a-valid-url',
|
|
32
|
+
};
|
|
33
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
34
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
35
|
+
(0, vitest_1.expect)(result.errors).toBeDefined();
|
|
36
|
+
(0, vitest_1.expect)(result.errors[0].path).toBe('repository');
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('should accept full config with all nested fields', () => {
|
|
39
|
+
const config = {
|
|
40
|
+
language: 'en',
|
|
41
|
+
projectName: 'full-app',
|
|
42
|
+
description: 'A full featured app',
|
|
43
|
+
repository: 'https://github.com/example/app',
|
|
44
|
+
techStack: {
|
|
45
|
+
languages: ['TypeScript', 'Python'],
|
|
46
|
+
frontend: ['React', 'Next.js'],
|
|
47
|
+
backend: ['NestJS'],
|
|
48
|
+
database: ['PostgreSQL'],
|
|
49
|
+
infrastructure: ['Docker', 'AWS'],
|
|
50
|
+
tools: ['ESLint'],
|
|
51
|
+
},
|
|
52
|
+
architecture: {
|
|
53
|
+
pattern: 'feature-sliced',
|
|
54
|
+
structure: ['src/', 'features/'],
|
|
55
|
+
componentStyle: 'feature-based',
|
|
56
|
+
},
|
|
57
|
+
conventions: {
|
|
58
|
+
style: 'airbnb',
|
|
59
|
+
naming: {
|
|
60
|
+
files: 'kebab-case',
|
|
61
|
+
components: 'PascalCase',
|
|
62
|
+
},
|
|
63
|
+
quotes: 'single',
|
|
64
|
+
semicolons: true,
|
|
65
|
+
},
|
|
66
|
+
testStrategy: {
|
|
67
|
+
approach: 'tdd',
|
|
68
|
+
frameworks: ['vitest'],
|
|
69
|
+
coverage: 80,
|
|
70
|
+
},
|
|
71
|
+
keyFiles: ['src/types.ts'],
|
|
72
|
+
avoid: ['legacy-api'],
|
|
73
|
+
};
|
|
74
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
75
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
76
|
+
(0, vitest_1.expect)(result.data).toEqual(config);
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('should accept config with deep optional fields', () => {
|
|
79
|
+
const config = {
|
|
80
|
+
techStack: {
|
|
81
|
+
frontend: ['React'],
|
|
82
|
+
details: {
|
|
83
|
+
React: {
|
|
84
|
+
version: '18.x',
|
|
85
|
+
notes: 'Using concurrent features',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
architecture: {
|
|
90
|
+
pattern: 'layered',
|
|
91
|
+
layers: [
|
|
92
|
+
{ name: 'domain', path: 'src/domain', description: 'Business logic' },
|
|
93
|
+
{ name: 'infra', path: 'src/infra', dependencies: ['domain'] },
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
98
|
+
(0, vitest_1.expect)(result.success).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)('should reject invalid naming convention enum', () => {
|
|
101
|
+
const config = {
|
|
102
|
+
conventions: {
|
|
103
|
+
naming: {
|
|
104
|
+
files: 'invalid-case',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
109
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
110
|
+
(0, vitest_1.expect)(result.errors).toBeDefined();
|
|
111
|
+
(0, vitest_1.expect)(result.errors.length).toBeGreaterThan(0);
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.it)('should reject invalid coverage value (over 100)', () => {
|
|
114
|
+
const config = {
|
|
115
|
+
testStrategy: {
|
|
116
|
+
coverage: 150,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
120
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
121
|
+
(0, vitest_1.expect)(result.errors).toBeDefined();
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.it)('should reject invalid coverage value (negative)', () => {
|
|
124
|
+
const config = {
|
|
125
|
+
testStrategy: {
|
|
126
|
+
coverage: -10,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
130
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
(0, vitest_1.it)('should reject non-object config', () => {
|
|
133
|
+
(0, vitest_1.expect)((0, config_schema_1.validateConfig)(null).success).toBe(false);
|
|
134
|
+
(0, vitest_1.expect)((0, config_schema_1.validateConfig)('string').success).toBe(false);
|
|
135
|
+
(0, vitest_1.expect)((0, config_schema_1.validateConfig)(123).success).toBe(false);
|
|
136
|
+
(0, vitest_1.expect)((0, config_schema_1.validateConfig)([]).success).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('should provide error path for nested validation errors', () => {
|
|
139
|
+
const config = {
|
|
140
|
+
conventions: {
|
|
141
|
+
naming: {
|
|
142
|
+
files: 'invalid',
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
const result = (0, config_schema_1.validateConfig)(config);
|
|
147
|
+
(0, vitest_1.expect)(result.success).toBe(false);
|
|
148
|
+
(0, vitest_1.expect)(result.errors[0].path).toContain('conventions');
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
(0, vitest_1.describe)('parseConfig', () => {
|
|
152
|
+
(0, vitest_1.it)('should return parsed config for valid input', () => {
|
|
153
|
+
const config = { language: 'ko' };
|
|
154
|
+
const result = (0, config_schema_1.parseConfig)(config);
|
|
155
|
+
(0, vitest_1.expect)(result).toEqual(config);
|
|
156
|
+
});
|
|
157
|
+
(0, vitest_1.it)('should throw for invalid input', () => {
|
|
158
|
+
(0, vitest_1.expect)(() => (0, config_schema_1.parseConfig)({ testStrategy: { coverage: 200 } })).toThrow();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.describe)('isCodingBuddyConfig', () => {
|
|
162
|
+
(0, vitest_1.it)('should return true for valid config', () => {
|
|
163
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({})).toBe(true);
|
|
164
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({ language: 'ko' })).toBe(true);
|
|
165
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({ techStack: { frontend: ['React'] } })).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.it)('should return false for invalid config', () => {
|
|
168
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)(null)).toBe(false);
|
|
169
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)('string')).toBe(false);
|
|
170
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({ testStrategy: { coverage: 200 } })).toBe(false);
|
|
171
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({ conventions: { naming: { files: 'invalid' } } })).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.it)('should reject invalid repository URL', () => {
|
|
174
|
+
(0, vitest_1.expect)((0, config_schema_1.isCodingBuddyConfig)({ repository: 'not-a-url' })).toBe(false);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
(0, vitest_1.describe)('getDefaultConfig', () => {
|
|
178
|
+
(0, vitest_1.it)('should return empty object as default', () => {
|
|
179
|
+
const defaults = (0, config_schema_1.getDefaultConfig)();
|
|
180
|
+
(0, vitest_1.expect)(defaults).toEqual({});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
(0, vitest_1.describe)('mergeWithDefaults', () => {
|
|
184
|
+
(0, vitest_1.it)('should merge user config with defaults', () => {
|
|
185
|
+
const userConfig = {
|
|
186
|
+
language: 'ko',
|
|
187
|
+
projectName: 'my-app',
|
|
188
|
+
};
|
|
189
|
+
const result = (0, config_schema_1.mergeWithDefaults)(userConfig);
|
|
190
|
+
(0, vitest_1.expect)(result.language).toBe('ko');
|
|
191
|
+
(0, vitest_1.expect)(result.projectName).toBe('my-app');
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.it)('should preserve user config values', () => {
|
|
194
|
+
const userConfig = {
|
|
195
|
+
techStack: {
|
|
196
|
+
frontend: ['React'],
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
const result = (0, config_schema_1.mergeWithDefaults)(userConfig);
|
|
200
|
+
(0, vitest_1.expect)(result.techStack?.frontend).toEqual(['React']);
|
|
201
|
+
});
|
|
202
|
+
(0, vitest_1.it)('should deep merge nested objects', () => {
|
|
203
|
+
const userConfig = {
|
|
204
|
+
techStack: {
|
|
205
|
+
frontend: ['React'],
|
|
206
|
+
backend: ['NestJS'],
|
|
207
|
+
},
|
|
208
|
+
conventions: {
|
|
209
|
+
style: 'airbnb',
|
|
210
|
+
naming: {
|
|
211
|
+
files: 'kebab-case',
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
const result = (0, config_schema_1.mergeWithDefaults)(userConfig);
|
|
216
|
+
(0, vitest_1.expect)(result.techStack?.frontend).toEqual(['React']);
|
|
217
|
+
(0, vitest_1.expect)(result.techStack?.backend).toEqual(['NestJS']);
|
|
218
|
+
(0, vitest_1.expect)(result.conventions?.style).toBe('airbnb');
|
|
219
|
+
(0, vitest_1.expect)(result.conventions?.naming?.files).toBe('kebab-case');
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
(0, vitest_1.describe)('schema type inference', () => {
|
|
223
|
+
(0, vitest_1.it)('should correctly infer types from schema', () => {
|
|
224
|
+
const config = config_schema_1.CodingBuddyConfigSchema.parse({
|
|
225
|
+
language: 'en',
|
|
226
|
+
techStack: {
|
|
227
|
+
frontend: ['React'],
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
(0, vitest_1.expect)(typeof config.language).toBe('string');
|
|
231
|
+
(0, vitest_1.expect)(Array.isArray(config.techStack?.frontend)).toBe(true);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=config.schema.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.schema.spec.js","sourceRoot":"","sources":["../../../src/config/config.schema.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { type ContextFile } from './context.loader';
|
|
3
|
+
import type { CodingBuddyConfig } from './config.schema';
|
|
4
|
+
export interface ProjectConfig {
|
|
5
|
+
settings: CodingBuddyConfig;
|
|
6
|
+
ignorePatterns: string[];
|
|
7
|
+
contextFiles: ContextFile[];
|
|
8
|
+
sources: {
|
|
9
|
+
config: string | null;
|
|
10
|
+
ignore: string | null;
|
|
11
|
+
context: string | null;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare class ConfigService implements OnModuleInit {
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private projectRoot;
|
|
17
|
+
private projectConfig;
|
|
18
|
+
private isLoaded;
|
|
19
|
+
constructor();
|
|
20
|
+
onModuleInit(): Promise<void>;
|
|
21
|
+
setProjectRoot(root: string): void;
|
|
22
|
+
getProjectRoot(): string;
|
|
23
|
+
loadProjectConfig(): Promise<ProjectConfig>;
|
|
24
|
+
getProjectConfig(): Promise<ProjectConfig>;
|
|
25
|
+
getSettings(): Promise<CodingBuddyConfig>;
|
|
26
|
+
getIgnorePatterns(): Promise<string[]>;
|
|
27
|
+
shouldIgnorePath(relativePath: string): Promise<boolean>;
|
|
28
|
+
getContextFiles(): Promise<ContextFile[]>;
|
|
29
|
+
getFormattedContext(): Promise<string>;
|
|
30
|
+
getLanguage(): Promise<string | undefined>;
|
|
31
|
+
reload(): Promise<ProjectConfig>;
|
|
32
|
+
isConfigLoaded(): boolean;
|
|
33
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var ConfigService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ConfigService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const config_loader_1 = require("./config.loader");
|
|
16
|
+
const ignore_parser_1 = require("./ignore.parser");
|
|
17
|
+
const context_loader_1 = require("./context.loader");
|
|
18
|
+
let ConfigService = ConfigService_1 = class ConfigService {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.logger = new common_1.Logger(ConfigService_1.name);
|
|
21
|
+
this.projectConfig = null;
|
|
22
|
+
this.isLoaded = false;
|
|
23
|
+
this.projectRoot = process.env.CODINGBUDDY_PROJECT_ROOT ?? process.cwd();
|
|
24
|
+
}
|
|
25
|
+
async onModuleInit() {
|
|
26
|
+
await this.loadProjectConfig();
|
|
27
|
+
}
|
|
28
|
+
setProjectRoot(root) {
|
|
29
|
+
this.projectRoot = root;
|
|
30
|
+
this.isLoaded = false;
|
|
31
|
+
this.projectConfig = null;
|
|
32
|
+
}
|
|
33
|
+
getProjectRoot() {
|
|
34
|
+
return this.projectRoot;
|
|
35
|
+
}
|
|
36
|
+
async loadProjectConfig() {
|
|
37
|
+
this.logger.log(`Loading project config from: ${this.projectRoot}`);
|
|
38
|
+
let configResult;
|
|
39
|
+
try {
|
|
40
|
+
configResult = await (0, config_loader_1.loadConfig)(this.projectRoot);
|
|
41
|
+
if (configResult.source) {
|
|
42
|
+
this.logger.log(`Loaded config from: ${configResult.source}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.logger.log('No config file found, using defaults');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof config_loader_1.ConfigLoadError) {
|
|
50
|
+
this.logger.error(`Config load error: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
configResult = { config: {}, source: null, warnings: [] };
|
|
53
|
+
}
|
|
54
|
+
const ignoreResult = await (0, ignore_parser_1.loadIgnoreFile)(this.projectRoot);
|
|
55
|
+
const allIgnorePatterns = [
|
|
56
|
+
...(0, ignore_parser_1.getDefaultIgnorePatterns)(),
|
|
57
|
+
...ignoreResult.patterns,
|
|
58
|
+
];
|
|
59
|
+
if (ignoreResult.source) {
|
|
60
|
+
this.logger.log(`Loaded ignore patterns from: ${ignoreResult.source}`);
|
|
61
|
+
}
|
|
62
|
+
const contextResult = await (0, context_loader_1.loadContextFiles)(this.projectRoot);
|
|
63
|
+
if (contextResult.source) {
|
|
64
|
+
this.logger.log(`Loaded ${contextResult.files.length} context files from: ${contextResult.source}`);
|
|
65
|
+
}
|
|
66
|
+
if (contextResult.errors.length > 0) {
|
|
67
|
+
this.logger.warn(`Context loading errors: ${contextResult.errors.join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
this.projectConfig = {
|
|
70
|
+
settings: configResult.config,
|
|
71
|
+
ignorePatterns: allIgnorePatterns,
|
|
72
|
+
contextFiles: contextResult.files,
|
|
73
|
+
sources: {
|
|
74
|
+
config: configResult.source,
|
|
75
|
+
ignore: ignoreResult.source,
|
|
76
|
+
context: contextResult.source,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
this.isLoaded = true;
|
|
80
|
+
return this.projectConfig;
|
|
81
|
+
}
|
|
82
|
+
async getProjectConfig() {
|
|
83
|
+
if (!this.isLoaded || !this.projectConfig) {
|
|
84
|
+
return this.loadProjectConfig();
|
|
85
|
+
}
|
|
86
|
+
return this.projectConfig;
|
|
87
|
+
}
|
|
88
|
+
async getSettings() {
|
|
89
|
+
const config = await this.getProjectConfig();
|
|
90
|
+
return config.settings;
|
|
91
|
+
}
|
|
92
|
+
async getIgnorePatterns() {
|
|
93
|
+
const config = await this.getProjectConfig();
|
|
94
|
+
return config.ignorePatterns;
|
|
95
|
+
}
|
|
96
|
+
async shouldIgnorePath(relativePath) {
|
|
97
|
+
const patterns = await this.getIgnorePatterns();
|
|
98
|
+
return (0, ignore_parser_1.shouldIgnore)(relativePath, patterns);
|
|
99
|
+
}
|
|
100
|
+
async getContextFiles() {
|
|
101
|
+
const config = await this.getProjectConfig();
|
|
102
|
+
return config.contextFiles;
|
|
103
|
+
}
|
|
104
|
+
async getFormattedContext() {
|
|
105
|
+
const files = await this.getContextFiles();
|
|
106
|
+
return (0, context_loader_1.formatContextForAI)(files);
|
|
107
|
+
}
|
|
108
|
+
async getLanguage() {
|
|
109
|
+
const settings = await this.getSettings();
|
|
110
|
+
return settings.language;
|
|
111
|
+
}
|
|
112
|
+
async reload() {
|
|
113
|
+
this.isLoaded = false;
|
|
114
|
+
this.projectConfig = null;
|
|
115
|
+
return this.loadProjectConfig();
|
|
116
|
+
}
|
|
117
|
+
isConfigLoaded() {
|
|
118
|
+
return this.isLoaded;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
exports.ConfigService = ConfigService;
|
|
122
|
+
exports.ConfigService = ConfigService = ConfigService_1 = __decorate([
|
|
123
|
+
(0, common_1.Injectable)(),
|
|
124
|
+
__metadata("design:paramtypes", [])
|
|
125
|
+
], ConfigService);
|
|
126
|
+
//# sourceMappingURL=config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/config.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isCodingBuddyConfig = void 0;
|
|
4
|
+
var config_schema_1 = require("./config.schema");
|
|
5
|
+
Object.defineProperty(exports, "isCodingBuddyConfig", { enumerable: true, get: function () { return config_schema_1.isCodingBuddyConfig; } });
|
|
6
|
+
//# sourceMappingURL=config.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../../src/config/config.types.ts"],"names":[],"mappings":";;;AA0CA,iDAAsD;AAA7C,oHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const CONTEXT_DIR_NAME = ".codingbuddy";
|
|
2
|
+
export declare const KNOWN_SUBDIRS: {
|
|
3
|
+
readonly context: "context";
|
|
4
|
+
readonly prompts: "prompts";
|
|
5
|
+
readonly agents: "agents";
|
|
6
|
+
};
|
|
7
|
+
export type ContextFileType = 'context' | 'prompt' | 'agent' | 'other';
|
|
8
|
+
export interface ContextFile {
|
|
9
|
+
path: string;
|
|
10
|
+
content: string;
|
|
11
|
+
type: ContextFileType;
|
|
12
|
+
extension: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ContextLoadResult {
|
|
15
|
+
files: ContextFile[];
|
|
16
|
+
source: string | null;
|
|
17
|
+
errors: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function getContextFileType(relativePath: string): ContextFileType;
|
|
20
|
+
export declare function isLoadableFile(filePath: string): boolean;
|
|
21
|
+
export declare function loadContextFiles(projectRoot: string): Promise<ContextLoadResult>;
|
|
22
|
+
export declare function getFilesByType(files: ContextFile[], type: ContextFileType): ContextFile[];
|
|
23
|
+
export declare function formatContextForAI(files: ContextFile[]): string;
|
|
24
|
+
export declare function hasContextDir(projectRoot: string): boolean;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KNOWN_SUBDIRS = exports.CONTEXT_DIR_NAME = void 0;
|
|
4
|
+
exports.getContextFileType = getContextFileType;
|
|
5
|
+
exports.isLoadableFile = isLoadableFile;
|
|
6
|
+
exports.loadContextFiles = loadContextFiles;
|
|
7
|
+
exports.getFilesByType = getFilesByType;
|
|
8
|
+
exports.formatContextForAI = formatContextForAI;
|
|
9
|
+
exports.hasContextDir = hasContextDir;
|
|
10
|
+
const fs = require("fs/promises");
|
|
11
|
+
const fs_1 = require("fs");
|
|
12
|
+
const path = require("path");
|
|
13
|
+
exports.CONTEXT_DIR_NAME = '.codingbuddy';
|
|
14
|
+
exports.KNOWN_SUBDIRS = {
|
|
15
|
+
context: 'context',
|
|
16
|
+
prompts: 'prompts',
|
|
17
|
+
agents: 'agents',
|
|
18
|
+
};
|
|
19
|
+
function getContextFileType(relativePath) {
|
|
20
|
+
const parts = relativePath.split('/');
|
|
21
|
+
if (parts[0] === exports.KNOWN_SUBDIRS.context) {
|
|
22
|
+
return 'context';
|
|
23
|
+
}
|
|
24
|
+
if (parts[0] === exports.KNOWN_SUBDIRS.prompts) {
|
|
25
|
+
return 'prompt';
|
|
26
|
+
}
|
|
27
|
+
if (parts[0] === exports.KNOWN_SUBDIRS.agents) {
|
|
28
|
+
return 'agent';
|
|
29
|
+
}
|
|
30
|
+
return 'other';
|
|
31
|
+
}
|
|
32
|
+
function isLoadableFile(filePath) {
|
|
33
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
34
|
+
const loadableExtensions = [
|
|
35
|
+
'.md',
|
|
36
|
+
'.txt',
|
|
37
|
+
'.json',
|
|
38
|
+
'.yaml',
|
|
39
|
+
'.yml',
|
|
40
|
+
'.js',
|
|
41
|
+
'.ts',
|
|
42
|
+
'.jsx',
|
|
43
|
+
'.tsx',
|
|
44
|
+
];
|
|
45
|
+
return loadableExtensions.includes(ext);
|
|
46
|
+
}
|
|
47
|
+
async function getAllFiles(dirPath, basePath = '') {
|
|
48
|
+
const files = [];
|
|
49
|
+
try {
|
|
50
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
|
|
53
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
54
|
+
if (entry.isDirectory()) {
|
|
55
|
+
const subFiles = await getAllFiles(fullPath, relativePath);
|
|
56
|
+
files.push(...subFiles);
|
|
57
|
+
}
|
|
58
|
+
else if (entry.isFile()) {
|
|
59
|
+
files.push(relativePath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
}
|
|
65
|
+
return files;
|
|
66
|
+
}
|
|
67
|
+
async function loadContextFile(contextDir, relativePath) {
|
|
68
|
+
const fullPath = path.join(contextDir, relativePath);
|
|
69
|
+
try {
|
|
70
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
71
|
+
const extension = path.extname(relativePath).toLowerCase();
|
|
72
|
+
return {
|
|
73
|
+
path: relativePath,
|
|
74
|
+
content,
|
|
75
|
+
type: getContextFileType(relativePath),
|
|
76
|
+
extension,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function loadContextFiles(projectRoot) {
|
|
84
|
+
const contextDir = path.join(projectRoot, exports.CONTEXT_DIR_NAME);
|
|
85
|
+
if (!(0, fs_1.existsSync)(contextDir)) {
|
|
86
|
+
return {
|
|
87
|
+
files: [],
|
|
88
|
+
source: null,
|
|
89
|
+
errors: [],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const allFiles = await getAllFiles(contextDir);
|
|
93
|
+
const loadableFiles = allFiles.filter(isLoadableFile);
|
|
94
|
+
const files = [];
|
|
95
|
+
const errors = [];
|
|
96
|
+
for (const relativePath of loadableFiles) {
|
|
97
|
+
const file = await loadContextFile(contextDir, relativePath);
|
|
98
|
+
if (file) {
|
|
99
|
+
files.push(file);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
errors.push(`Failed to load: ${relativePath}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
files,
|
|
107
|
+
source: contextDir,
|
|
108
|
+
errors,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function getFilesByType(files, type) {
|
|
112
|
+
return files.filter((f) => f.type === type);
|
|
113
|
+
}
|
|
114
|
+
function formatContextForAI(files) {
|
|
115
|
+
if (files.length === 0) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
const sections = [];
|
|
119
|
+
const contextFiles = getFilesByType(files, 'context');
|
|
120
|
+
const promptFiles = getFilesByType(files, 'prompt');
|
|
121
|
+
const agentFiles = getFilesByType(files, 'agent');
|
|
122
|
+
const otherFiles = getFilesByType(files, 'other');
|
|
123
|
+
if (contextFiles.length > 0) {
|
|
124
|
+
sections.push('## Project Context\n');
|
|
125
|
+
for (const file of contextFiles) {
|
|
126
|
+
sections.push(`### ${file.path}\n\n${file.content}\n`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (promptFiles.length > 0) {
|
|
130
|
+
sections.push('## Custom Prompts\n');
|
|
131
|
+
for (const file of promptFiles) {
|
|
132
|
+
sections.push(`### ${file.path}\n\n${file.content}\n`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (agentFiles.length > 0) {
|
|
136
|
+
sections.push('## Custom Agents\n');
|
|
137
|
+
for (const file of agentFiles) {
|
|
138
|
+
sections.push(`### ${file.path}\n\n${file.content}\n`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (otherFiles.length > 0) {
|
|
142
|
+
sections.push('## Additional Files\n');
|
|
143
|
+
for (const file of otherFiles) {
|
|
144
|
+
sections.push(`### ${file.path}\n\n${file.content}\n`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return sections.join('\n');
|
|
148
|
+
}
|
|
149
|
+
function hasContextDir(projectRoot) {
|
|
150
|
+
const contextDir = path.join(projectRoot, exports.CONTEXT_DIR_NAME);
|
|
151
|
+
return (0, fs_1.existsSync)(contextDir);
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=context.loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.loader.js","sourceRoot":"","sources":["../../../src/config/context.loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|