codingbuddy 0.0.0-canary.20251218084232.5c876ac → 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.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/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 +9 -0
- package/dist/src/config/index.js +26 -1
- package/dist/src/config/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type CodingBuddyConfig } from './config.schema';
|
|
2
|
+
export declare const CONFIG_FILE_NAMES: readonly ["codingbuddy.config.js", "codingbuddy.config.mjs", "codingbuddy.config.json"];
|
|
3
|
+
export interface ConfigLoadResult {
|
|
4
|
+
config: CodingBuddyConfig;
|
|
5
|
+
source: string | null;
|
|
6
|
+
warnings: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare class ConfigLoadError extends Error {
|
|
9
|
+
readonly filePath: string;
|
|
10
|
+
readonly cause?: Error;
|
|
11
|
+
constructor(message: string, filePath: string, cause?: Error);
|
|
12
|
+
}
|
|
13
|
+
export declare function findConfigFile(projectRoot: string): string | null;
|
|
14
|
+
export declare function loadJsConfig(filePath: string): Promise<unknown>;
|
|
15
|
+
export declare function loadJsonConfig(filePath: string): Promise<unknown>;
|
|
16
|
+
export declare function loadConfigFromFile(filePath: string): Promise<unknown>;
|
|
17
|
+
export declare function validateAndTransform(raw: unknown, filePath: string): {
|
|
18
|
+
config: CodingBuddyConfig;
|
|
19
|
+
warnings: string[];
|
|
20
|
+
};
|
|
21
|
+
export declare function loadConfig(projectRoot?: string): Promise<ConfigLoadResult>;
|
|
22
|
+
export declare function hasConfigFile(projectRoot: string): boolean;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigLoadError = exports.CONFIG_FILE_NAMES = void 0;
|
|
4
|
+
exports.findConfigFile = findConfigFile;
|
|
5
|
+
exports.loadJsConfig = loadJsConfig;
|
|
6
|
+
exports.loadJsonConfig = loadJsonConfig;
|
|
7
|
+
exports.loadConfigFromFile = loadConfigFromFile;
|
|
8
|
+
exports.validateAndTransform = validateAndTransform;
|
|
9
|
+
exports.loadConfig = loadConfig;
|
|
10
|
+
exports.hasConfigFile = hasConfigFile;
|
|
11
|
+
const fs = require("fs/promises");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
const url_1 = require("url");
|
|
15
|
+
const config_schema_1 = require("./config.schema");
|
|
16
|
+
exports.CONFIG_FILE_NAMES = [
|
|
17
|
+
'codingbuddy.config.js',
|
|
18
|
+
'codingbuddy.config.mjs',
|
|
19
|
+
'codingbuddy.config.json',
|
|
20
|
+
];
|
|
21
|
+
class ConfigLoadError extends Error {
|
|
22
|
+
constructor(message, filePath, cause) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.filePath = filePath;
|
|
25
|
+
this.cause = cause;
|
|
26
|
+
this.name = 'ConfigLoadError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ConfigLoadError = ConfigLoadError;
|
|
30
|
+
function findConfigFile(projectRoot) {
|
|
31
|
+
for (const fileName of exports.CONFIG_FILE_NAMES) {
|
|
32
|
+
const filePath = path.join(projectRoot, fileName);
|
|
33
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
34
|
+
return filePath;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
async function loadJsConfig(filePath) {
|
|
40
|
+
try {
|
|
41
|
+
const fileUrl = (0, url_1.pathToFileURL)(filePath).href;
|
|
42
|
+
const module = await Promise.resolve(`${fileUrl}`).then(s => require(s));
|
|
43
|
+
return module.default ?? module;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new ConfigLoadError(`Failed to load JavaScript config: ${error instanceof Error ? error.message : String(error)}`, filePath, error instanceof Error ? error : undefined);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function loadJsonConfig(filePath) {
|
|
50
|
+
try {
|
|
51
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
52
|
+
return JSON.parse(content);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error instanceof SyntaxError) {
|
|
56
|
+
throw new ConfigLoadError(`Invalid JSON in config file: ${error.message}`, filePath, error);
|
|
57
|
+
}
|
|
58
|
+
throw new ConfigLoadError(`Failed to read config file: ${error instanceof Error ? error.message : String(error)}`, filePath, error instanceof Error ? error : undefined);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function loadConfigFromFile(filePath) {
|
|
62
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
63
|
+
if (ext === '.json') {
|
|
64
|
+
return loadJsonConfig(filePath);
|
|
65
|
+
}
|
|
66
|
+
if (ext === '.js' || ext === '.mjs') {
|
|
67
|
+
return loadJsConfig(filePath);
|
|
68
|
+
}
|
|
69
|
+
throw new ConfigLoadError(`Unsupported config file format: ${ext}`, filePath);
|
|
70
|
+
}
|
|
71
|
+
function validateAndTransform(raw, filePath) {
|
|
72
|
+
const result = (0, config_schema_1.validateConfig)(raw);
|
|
73
|
+
if (!result.success) {
|
|
74
|
+
const errorMessages = result.errors
|
|
75
|
+
.map((e) => ` - ${e.path}: ${e.message}`)
|
|
76
|
+
.join('\n');
|
|
77
|
+
throw new ConfigLoadError(`Invalid configuration:\n${errorMessages}`, filePath);
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
config: result.data,
|
|
81
|
+
warnings: [],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function loadConfig(projectRoot) {
|
|
85
|
+
const root = projectRoot ?? process.cwd();
|
|
86
|
+
const configPath = findConfigFile(root);
|
|
87
|
+
if (!configPath) {
|
|
88
|
+
return {
|
|
89
|
+
config: {},
|
|
90
|
+
source: null,
|
|
91
|
+
warnings: [],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const raw = await loadConfigFromFile(configPath);
|
|
95
|
+
const { config, warnings } = validateAndTransform(raw, configPath);
|
|
96
|
+
return {
|
|
97
|
+
config,
|
|
98
|
+
source: configPath,
|
|
99
|
+
warnings,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function hasConfigFile(projectRoot) {
|
|
103
|
+
return findConfigFile(projectRoot) !== null;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=config.loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.loader.js","sourceRoot":"","sources":["../../../src/config/config.loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const config_loader_1 = require("./config.loader");
|
|
5
|
+
(0, vitest_1.describe)('config.loader', () => {
|
|
6
|
+
(0, vitest_1.describe)('CONFIG_FILE_NAMES', () => {
|
|
7
|
+
(0, vitest_1.it)('should have correct priority order', () => {
|
|
8
|
+
(0, vitest_1.expect)(config_loader_1.CONFIG_FILE_NAMES[0]).toBe('codingbuddy.config.js');
|
|
9
|
+
(0, vitest_1.expect)(config_loader_1.CONFIG_FILE_NAMES[1]).toBe('codingbuddy.config.mjs');
|
|
10
|
+
(0, vitest_1.expect)(config_loader_1.CONFIG_FILE_NAMES[2]).toBe('codingbuddy.config.json');
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('should have 3 supported file names', () => {
|
|
13
|
+
(0, vitest_1.expect)(config_loader_1.CONFIG_FILE_NAMES).toHaveLength(3);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.describe)('ConfigLoadError', () => {
|
|
17
|
+
(0, vitest_1.it)('should create error with message and file path', () => {
|
|
18
|
+
const error = new config_loader_1.ConfigLoadError('Test error', '/path/to/config.js');
|
|
19
|
+
(0, vitest_1.expect)(error.message).toBe('Test error');
|
|
20
|
+
(0, vitest_1.expect)(error.filePath).toBe('/path/to/config.js');
|
|
21
|
+
(0, vitest_1.expect)(error.name).toBe('ConfigLoadError');
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('should include cause when provided', () => {
|
|
24
|
+
const cause = new Error('Original error');
|
|
25
|
+
const error = new config_loader_1.ConfigLoadError('Wrapped error', '/path/to/config.js', cause);
|
|
26
|
+
(0, vitest_1.expect)(error.cause).toBe(cause);
|
|
27
|
+
});
|
|
28
|
+
(0, vitest_1.it)('should be instanceof Error', () => {
|
|
29
|
+
const error = new config_loader_1.ConfigLoadError('Test', '/path');
|
|
30
|
+
(0, vitest_1.expect)(error).toBeInstanceOf(Error);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.describe)('validateAndTransform', () => {
|
|
34
|
+
(0, vitest_1.it)('should accept valid config', () => {
|
|
35
|
+
const raw = {
|
|
36
|
+
language: 'ko',
|
|
37
|
+
projectName: 'test-project',
|
|
38
|
+
techStack: {
|
|
39
|
+
frontend: ['React'],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const result = (0, config_loader_1.validateAndTransform)(raw, '/path/config.json');
|
|
43
|
+
(0, vitest_1.expect)(result.config.language).toBe('ko');
|
|
44
|
+
(0, vitest_1.expect)(result.config.projectName).toBe('test-project');
|
|
45
|
+
(0, vitest_1.expect)(result.config.techStack?.frontend).toEqual(['React']);
|
|
46
|
+
(0, vitest_1.expect)(result.warnings).toEqual([]);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('should accept empty config', () => {
|
|
49
|
+
const result = (0, config_loader_1.validateAndTransform)({}, '/path/config.json');
|
|
50
|
+
(0, vitest_1.expect)(result.config).toEqual({});
|
|
51
|
+
(0, vitest_1.expect)(result.warnings).toEqual([]);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.it)('should throw ConfigLoadError for invalid config', () => {
|
|
54
|
+
const raw = {
|
|
55
|
+
testStrategy: {
|
|
56
|
+
coverage: 200,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
(0, vitest_1.expect)(() => (0, config_loader_1.validateAndTransform)(raw, '/path/config.json')).toThrow(config_loader_1.ConfigLoadError);
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('should include field path in error message', () => {
|
|
62
|
+
const raw = {
|
|
63
|
+
conventions: {
|
|
64
|
+
naming: {
|
|
65
|
+
files: 'invalid-value',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
(0, config_loader_1.validateAndTransform)(raw, '/path/config.json');
|
|
71
|
+
vitest_1.expect.fail('Should have thrown');
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
(0, vitest_1.expect)(error).toBeInstanceOf(config_loader_1.ConfigLoadError);
|
|
75
|
+
(0, vitest_1.expect)(error.message).toContain('conventions');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('should throw ConfigLoadError for invalid URL in repository', () => {
|
|
79
|
+
const raw = {
|
|
80
|
+
repository: 'not-a-valid-url',
|
|
81
|
+
};
|
|
82
|
+
(0, vitest_1.expect)(() => (0, config_loader_1.validateAndTransform)(raw, '/path/config.json')).toThrow(config_loader_1.ConfigLoadError);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=config.loader.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.loader.spec.js","sourceRoot":"","sources":["../../../src/config/config.loader.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CodingBuddyConfigModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const config_service_1 = require("./config.service");
|
|
12
|
+
let CodingBuddyConfigModule = class CodingBuddyConfigModule {
|
|
13
|
+
};
|
|
14
|
+
exports.CodingBuddyConfigModule = CodingBuddyConfigModule;
|
|
15
|
+
exports.CodingBuddyConfigModule = CodingBuddyConfigModule = __decorate([
|
|
16
|
+
(0, common_1.Module)({
|
|
17
|
+
providers: [config_service_1.ConfigService],
|
|
18
|
+
exports: [config_service_1.ConfigService],
|
|
19
|
+
})
|
|
20
|
+
], CodingBuddyConfigModule);
|
|
21
|
+
//# sourceMappingURL=config.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.module.js","sourceRoot":"","sources":["../../../src/config/config.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAiD;AAM1C,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAAG,CAAA;AAA1B,0DAAuB;kCAAvB,uBAAuB;IAJnC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,uBAAuB,CAAG"}
|
|
@@ -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,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 {};
|