codingbuddy 2.4.2 → 3.0.2
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/agent/agent.types.js +23 -0
- package/dist/src/agent/agent.types.js.map +1 -1
- package/dist/src/cli/init/gitignore.utils.d.ts +17 -0
- package/dist/src/cli/init/gitignore.utils.js +80 -0
- package/dist/src/cli/init/gitignore.utils.js.map +1 -0
- package/dist/src/cli/init/index.d.ts +3 -0
- package/dist/src/cli/init/index.js +7 -1
- package/dist/src/cli/init/index.js.map +1 -1
- package/dist/src/cli/init/init.command.js +10 -0
- package/dist/src/cli/init/init.command.js.map +1 -1
- package/dist/src/cli/init/init.constants.d.ts +2 -0
- package/dist/src/cli/init/init.constants.js +11 -0
- package/dist/src/cli/init/init.constants.js.map +1 -0
- package/dist/src/diagnostic/diagnostic-log.service.d.ts +19 -0
- package/dist/src/diagnostic/diagnostic-log.service.js +146 -0
- package/dist/src/diagnostic/diagnostic-log.service.js.map +1 -0
- package/dist/src/diagnostic/diagnostic.module.d.ts +2 -0
- package/dist/src/diagnostic/diagnostic.module.js +23 -0
- package/dist/src/diagnostic/diagnostic.module.js.map +1 -0
- package/dist/src/diagnostic/diagnostic.types.d.ts +21 -0
- package/dist/src/diagnostic/diagnostic.types.js +8 -0
- package/dist/src/diagnostic/diagnostic.types.js.map +1 -0
- package/dist/src/diagnostic/index.d.ts +3 -0
- package/dist/src/diagnostic/index.js +20 -0
- package/dist/src/diagnostic/index.js.map +1 -0
- package/dist/src/keyword/keyword.service.js +19 -0
- package/dist/src/keyword/keyword.service.js.map +1 -1
- package/dist/src/mcp/handlers/mode.handler.d.ts +3 -1
- package/dist/src/mcp/handlers/mode.handler.js +18 -4
- package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
- package/dist/src/mcp/mcp.module.js +2 -0
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/skill/i18n/keywords.js +658 -0
- package/dist/src/skill/i18n/keywords.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -27,5 +27,28 @@ exports.FILE_PATTERN_SPECIALISTS = {
|
|
|
27
27
|
hook: ['test-strategy-specialist', 'performance-specialist'],
|
|
28
28
|
service: ['architecture-specialist', 'test-strategy-specialist'],
|
|
29
29
|
util: ['test-strategy-specialist', 'code-quality-specialist'],
|
|
30
|
+
metrics: ['observability-specialist', 'performance-specialist'],
|
|
31
|
+
tracing: ['observability-specialist'],
|
|
32
|
+
monitoring: ['observability-specialist', 'devops-engineer'],
|
|
33
|
+
telemetry: ['observability-specialist'],
|
|
34
|
+
logging: ['observability-specialist'],
|
|
35
|
+
alert: ['observability-specialist'],
|
|
36
|
+
sli: ['observability-specialist'],
|
|
37
|
+
slo: ['observability-specialist'],
|
|
38
|
+
event: ['event-architecture-specialist'],
|
|
39
|
+
queue: ['event-architecture-specialist'],
|
|
40
|
+
message: ['event-architecture-specialist'],
|
|
41
|
+
saga: ['event-architecture-specialist'],
|
|
42
|
+
websocket: ['event-architecture-specialist', 'performance-specialist'],
|
|
43
|
+
consumer: ['event-architecture-specialist'],
|
|
44
|
+
producer: ['event-architecture-specialist'],
|
|
45
|
+
migration: ['migration-specialist', 'data-engineer'],
|
|
46
|
+
migrate: ['migration-specialist'],
|
|
47
|
+
upgrade: ['migration-specialist'],
|
|
48
|
+
legacy: ['migration-specialist', 'architecture-specialist'],
|
|
49
|
+
deprecate: ['migration-specialist', 'documentation-specialist'],
|
|
50
|
+
rollback: ['migration-specialist'],
|
|
51
|
+
cutover: ['migration-specialist'],
|
|
52
|
+
versioning: ['migration-specialist', 'integration-specialist'],
|
|
30
53
|
};
|
|
31
54
|
//# sourceMappingURL=agent.types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.types.js","sourceRoot":"","sources":["../../../src/agent/agent.types.ts"],"names":[],"mappings":";;;AAqDa,QAAA,wBAAwB,GAA6B;IAEhE,IAAI,EAAE,CAAC,qBAAqB,CAAC;IAC7B,KAAK,EAAE,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC1D,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC,qBAAqB,CAAC;IAC9B,KAAK,EAAE,CAAC,qBAAqB,CAAC;IAC9B,GAAG,EAAE,CAAC,qBAAqB,CAAC;IAG5B,SAAS,EAAE;QACT,0BAA0B;QAC1B,gBAAgB;QAChB,wBAAwB;KACzB;IACD,MAAM,EAAE,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;IACtD,IAAI,EAAE,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;IACzD,KAAK,EAAE,CAAC,0BAA0B,CAAC;IACnC,KAAK,EAAE,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;IAGrD,IAAI,EAAE;QACJ,gBAAgB;QAChB,0BAA0B;QAC1B,wBAAwB;KACzB;IACD,MAAM,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAGtD,GAAG,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;IACtD,IAAI,EAAE,CAAC,0BAA0B,EAAE,wBAAwB,CAAC;IAC5D,OAAO,EAAE,CAAC,yBAAyB,EAAE,0BAA0B,CAAC;IAChE,IAAI,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.types.js","sourceRoot":"","sources":["../../../src/agent/agent.types.ts"],"names":[],"mappings":";;;AAqDa,QAAA,wBAAwB,GAA6B;IAEhE,IAAI,EAAE,CAAC,qBAAqB,CAAC;IAC7B,KAAK,EAAE,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC1D,QAAQ,EAAE,CAAC,qBAAqB,CAAC;IACjC,KAAK,EAAE,CAAC,qBAAqB,CAAC;IAC9B,KAAK,EAAE,CAAC,qBAAqB,CAAC;IAC9B,GAAG,EAAE,CAAC,qBAAqB,CAAC;IAG5B,SAAS,EAAE;QACT,0BAA0B;QAC1B,gBAAgB;QAChB,wBAAwB;KACzB;IACD,MAAM,EAAE,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;IACtD,IAAI,EAAE,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;IACzD,KAAK,EAAE,CAAC,0BAA0B,CAAC;IACnC,KAAK,EAAE,CAAC,0BAA0B,EAAE,gBAAgB,CAAC;IAGrD,IAAI,EAAE;QACJ,gBAAgB;QAChB,0BAA0B;QAC1B,wBAAwB;KACzB;IACD,MAAM,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;IAGtD,GAAG,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;IACtD,IAAI,EAAE,CAAC,0BAA0B,EAAE,wBAAwB,CAAC;IAC5D,OAAO,EAAE,CAAC,yBAAyB,EAAE,0BAA0B,CAAC;IAChE,IAAI,EAAE,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAG7D,OAAO,EAAE,CAAC,0BAA0B,EAAE,wBAAwB,CAAC;IAC/D,OAAO,EAAE,CAAC,0BAA0B,CAAC;IACrC,UAAU,EAAE,CAAC,0BAA0B,EAAE,iBAAiB,CAAC;IAC3D,SAAS,EAAE,CAAC,0BAA0B,CAAC;IACvC,OAAO,EAAE,CAAC,0BAA0B,CAAC;IACrC,KAAK,EAAE,CAAC,0BAA0B,CAAC;IACnC,GAAG,EAAE,CAAC,0BAA0B,CAAC;IACjC,GAAG,EAAE,CAAC,0BAA0B,CAAC;IAGjC,KAAK,EAAE,CAAC,+BAA+B,CAAC;IACxC,KAAK,EAAE,CAAC,+BAA+B,CAAC;IACxC,OAAO,EAAE,CAAC,+BAA+B,CAAC;IAC1C,IAAI,EAAE,CAAC,+BAA+B,CAAC;IACvC,SAAS,EAAE,CAAC,+BAA+B,EAAE,wBAAwB,CAAC;IACtE,QAAQ,EAAE,CAAC,+BAA+B,CAAC;IAC3C,QAAQ,EAAE,CAAC,+BAA+B,CAAC;IAG3C,SAAS,EAAE,CAAC,sBAAsB,EAAE,eAAe,CAAC;IACpD,OAAO,EAAE,CAAC,sBAAsB,CAAC;IACjC,OAAO,EAAE,CAAC,sBAAsB,CAAC;IACjC,MAAM,EAAE,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;IAC3D,SAAS,EAAE,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;IAC/D,QAAQ,EAAE,CAAC,sBAAsB,CAAC;IAClC,OAAO,EAAE,CAAC,sBAAsB,CAAC;IACjC,UAAU,EAAE,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;CAC/D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class GitignoreReadError extends Error {
|
|
2
|
+
readonly cause: unknown;
|
|
3
|
+
constructor(gitignorePath: string, cause: unknown);
|
|
4
|
+
}
|
|
5
|
+
export declare class GitignoreWriteError extends Error {
|
|
6
|
+
readonly cause: unknown;
|
|
7
|
+
constructor(gitignorePath: string, cause: unknown);
|
|
8
|
+
}
|
|
9
|
+
export interface GitignoreEntry {
|
|
10
|
+
pattern: string;
|
|
11
|
+
comment?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EnsureGitignoreResult {
|
|
14
|
+
added: string[];
|
|
15
|
+
alreadyExists: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function ensureGitignoreEntries(projectRoot: string, entries: GitignoreEntry[]): Promise<EnsureGitignoreResult>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitignoreWriteError = exports.GitignoreReadError = void 0;
|
|
4
|
+
exports.ensureGitignoreEntries = ensureGitignoreEntries;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
class GitignoreReadError extends Error {
|
|
9
|
+
constructor(gitignorePath, cause) {
|
|
10
|
+
const message = `Failed to read .gitignore at ${gitignorePath}`;
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'GitignoreReadError';
|
|
13
|
+
this.cause = cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.GitignoreReadError = GitignoreReadError;
|
|
17
|
+
class GitignoreWriteError extends Error {
|
|
18
|
+
constructor(gitignorePath, cause) {
|
|
19
|
+
const message = `Failed to update .gitignore at ${gitignorePath}`;
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'GitignoreWriteError';
|
|
22
|
+
this.cause = cause;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.GitignoreWriteError = GitignoreWriteError;
|
|
26
|
+
function patternExists(content, pattern) {
|
|
27
|
+
const lines = content.split('\n');
|
|
28
|
+
return lines.some(line => line.trim() === pattern);
|
|
29
|
+
}
|
|
30
|
+
async function ensureGitignoreEntries(projectRoot, entries) {
|
|
31
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
32
|
+
const result = {
|
|
33
|
+
added: [],
|
|
34
|
+
alreadyExists: [],
|
|
35
|
+
};
|
|
36
|
+
let existingContent = '';
|
|
37
|
+
if ((0, fs_1.existsSync)(gitignorePath)) {
|
|
38
|
+
try {
|
|
39
|
+
existingContent = await (0, promises_1.readFile)(gitignorePath, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new GitignoreReadError(gitignorePath, error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (patternExists(existingContent, entry.pattern)) {
|
|
47
|
+
result.alreadyExists.push(entry.pattern);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
result.added.push(entry.pattern);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (result.added.length === 0) {
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
const newLines = [];
|
|
57
|
+
const comment = entries.find(e => e.comment)?.comment;
|
|
58
|
+
if (comment) {
|
|
59
|
+
newLines.push(comment);
|
|
60
|
+
}
|
|
61
|
+
for (const pattern of result.added) {
|
|
62
|
+
newLines.push(pattern);
|
|
63
|
+
}
|
|
64
|
+
let finalContent = existingContent;
|
|
65
|
+
if (finalContent.length > 0 && !finalContent.endsWith('\n')) {
|
|
66
|
+
finalContent += '\n';
|
|
67
|
+
}
|
|
68
|
+
if (finalContent.length > 0) {
|
|
69
|
+
finalContent += '\n';
|
|
70
|
+
}
|
|
71
|
+
finalContent += newLines.join('\n') + '\n';
|
|
72
|
+
try {
|
|
73
|
+
await (0, promises_1.writeFile)(gitignorePath, finalContent, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new GitignoreWriteError(gitignorePath, error);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=gitignore.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitignore.utils.js","sourceRoot":"","sources":["../../../../src/cli/init/gitignore.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,3 +3,6 @@ export { buildSystemPrompt, buildAnalysisPrompt } from './prompt.builder';
|
|
|
3
3
|
export { ConfigGenerator } from './config.generator';
|
|
4
4
|
export { writeConfig, findExistingConfig, CONFIG_FILE_NAMES, } from './config.writer';
|
|
5
5
|
export type { ConfigFormat, WriteConfigOptions } from './config.writer';
|
|
6
|
+
export { ensureGitignoreEntries, GitignoreReadError, GitignoreWriteError, } from './gitignore.utils';
|
|
7
|
+
export type { GitignoreEntry, EnsureGitignoreResult } from './gitignore.utils';
|
|
8
|
+
export { CODINGBUDDY_GITIGNORE_ENTRIES } from './init.constants';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CONFIG_FILE_NAMES = exports.findExistingConfig = exports.writeConfig = exports.ConfigGenerator = exports.buildAnalysisPrompt = exports.buildSystemPrompt = exports.getApiKey = exports.runInit = void 0;
|
|
3
|
+
exports.CODINGBUDDY_GITIGNORE_ENTRIES = exports.GitignoreWriteError = exports.GitignoreReadError = exports.ensureGitignoreEntries = exports.CONFIG_FILE_NAMES = exports.findExistingConfig = exports.writeConfig = exports.ConfigGenerator = exports.buildAnalysisPrompt = exports.buildSystemPrompt = exports.getApiKey = exports.runInit = void 0;
|
|
4
4
|
var init_command_1 = require("./init.command");
|
|
5
5
|
Object.defineProperty(exports, "runInit", { enumerable: true, get: function () { return init_command_1.runInit; } });
|
|
6
6
|
Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return init_command_1.getApiKey; } });
|
|
@@ -13,4 +13,10 @@ var config_writer_1 = require("./config.writer");
|
|
|
13
13
|
Object.defineProperty(exports, "writeConfig", { enumerable: true, get: function () { return config_writer_1.writeConfig; } });
|
|
14
14
|
Object.defineProperty(exports, "findExistingConfig", { enumerable: true, get: function () { return config_writer_1.findExistingConfig; } });
|
|
15
15
|
Object.defineProperty(exports, "CONFIG_FILE_NAMES", { enumerable: true, get: function () { return config_writer_1.CONFIG_FILE_NAMES; } });
|
|
16
|
+
var gitignore_utils_1 = require("./gitignore.utils");
|
|
17
|
+
Object.defineProperty(exports, "ensureGitignoreEntries", { enumerable: true, get: function () { return gitignore_utils_1.ensureGitignoreEntries; } });
|
|
18
|
+
Object.defineProperty(exports, "GitignoreReadError", { enumerable: true, get: function () { return gitignore_utils_1.GitignoreReadError; } });
|
|
19
|
+
Object.defineProperty(exports, "GitignoreWriteError", { enumerable: true, get: function () { return gitignore_utils_1.GitignoreWriteError; } });
|
|
20
|
+
var init_constants_1 = require("./init.constants");
|
|
21
|
+
Object.defineProperty(exports, "CODINGBUDDY_GITIGNORE_ENTRIES", { enumerable: true, get: function () { return init_constants_1.CODINGBUDDY_GITIGNORE_ENTRIES; } });
|
|
16
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/init/index.ts"],"names":[],"mappings":";;;AAAA,+CAAoD;AAA3C,uGAAA,OAAO,OAAA;AAAE,yGAAA,SAAS,OAAA;AAC3B,mDAA0E;AAAjE,mHAAA,iBAAiB,OAAA;AAAE,qHAAA,mBAAmB,OAAA;AAC/C,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,iDAIyB;AAHvB,4GAAA,WAAW,OAAA;AACX,mHAAA,kBAAkB,OAAA;AAClB,kHAAA,iBAAiB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/init/index.ts"],"names":[],"mappings":";;;AAAA,+CAAoD;AAA3C,uGAAA,OAAO,OAAA;AAAE,yGAAA,SAAS,OAAA;AAC3B,mDAA0E;AAAjE,mHAAA,iBAAiB,OAAA;AAAE,qHAAA,mBAAmB,OAAA;AAC/C,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,iDAIyB;AAHvB,4GAAA,WAAW,OAAA;AACX,mHAAA,kBAAkB,OAAA;AAClB,kHAAA,iBAAiB,OAAA;AAGnB,qDAI2B;AAHzB,yHAAA,sBAAsB,OAAA;AACtB,qHAAA,kBAAkB,OAAA;AAClB,sHAAA,mBAAmB,OAAA;AAGrB,mDAAiE;AAAxD,+HAAA,6BAA6B,OAAA"}
|
|
@@ -8,6 +8,8 @@ const config_writer_1 = require("./config.writer");
|
|
|
8
8
|
const console_1 = require("../utils/console");
|
|
9
9
|
const templates_1 = require("./templates");
|
|
10
10
|
const init_wizard_1 = require("./init.wizard");
|
|
11
|
+
const gitignore_utils_1 = require("./gitignore.utils");
|
|
12
|
+
const init_constants_1 = require("./init.constants");
|
|
11
13
|
async function analyzeProjectWithLogging(projectRoot, console) {
|
|
12
14
|
console.log.step('🔍', 'Analyzing project...');
|
|
13
15
|
const analyzer = new analyzer_1.AnalyzerService();
|
|
@@ -55,6 +57,10 @@ async function runTemplateInit(options, console) {
|
|
|
55
57
|
raw: true,
|
|
56
58
|
});
|
|
57
59
|
console.log.success(`Configuration saved to ${configPath}`);
|
|
60
|
+
const gitignoreResult = await (0, gitignore_utils_1.ensureGitignoreEntries)(options.projectRoot, init_constants_1.CODINGBUDDY_GITIGNORE_ENTRIES);
|
|
61
|
+
if (gitignoreResult.added.length > 0) {
|
|
62
|
+
console.log.step('📝', `Updated .gitignore: ${gitignoreResult.added.join(', ')}`);
|
|
63
|
+
}
|
|
58
64
|
console.log.success('');
|
|
59
65
|
console.log.step('✅', `codingbuddy.config.${options.format} created!`);
|
|
60
66
|
console.log.info('');
|
|
@@ -90,6 +96,10 @@ async function runAiInit(options, console) {
|
|
|
90
96
|
format: options.format,
|
|
91
97
|
});
|
|
92
98
|
console.log.success(`Configuration saved to ${configPath}`);
|
|
99
|
+
const gitignoreResult = await (0, gitignore_utils_1.ensureGitignoreEntries)(options.projectRoot, init_constants_1.CODINGBUDDY_GITIGNORE_ENTRIES);
|
|
100
|
+
if (gitignoreResult.added.length > 0) {
|
|
101
|
+
console.log.step('📝', `Updated .gitignore: ${gitignoreResult.added.join(', ')}`);
|
|
102
|
+
}
|
|
93
103
|
console.log.success('');
|
|
94
104
|
console.log.step('✅', `codingbuddy.config.${options.format} created!`);
|
|
95
105
|
console.log.info('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../../src/cli/init/init.command.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../../src/cli/init/init.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CODINGBUDDY_GITIGNORE_ENTRIES = void 0;
|
|
4
|
+
exports.CODINGBUDDY_GITIGNORE_ENTRIES = [
|
|
5
|
+
{
|
|
6
|
+
pattern: 'docs/codingbuddy/context.md',
|
|
7
|
+
comment: '# Codingbuddy (local workspace)',
|
|
8
|
+
},
|
|
9
|
+
{ pattern: 'docs/codingbuddy/sessions/' },
|
|
10
|
+
];
|
|
11
|
+
//# sourceMappingURL=init.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.constants.js","sourceRoot":"","sources":["../../../../src/cli/init/init.constants.ts"],"names":[],"mappings":";;;AAca,QAAA,6BAA6B,GAAqB;IAC7D;QACE,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,iCAAiC;KAC3C;IACD,EAAE,OAAO,EAAE,4BAA4B,EAAE;CAC1C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ConfigService } from '../config/config.service';
|
|
2
|
+
import { type DiagnosticLogEntry, type LogOperationResult } from './diagnostic.types';
|
|
3
|
+
export declare class DiagnosticLogService {
|
|
4
|
+
private readonly configService;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(configService: ConfigService);
|
|
7
|
+
getLogDir(): string;
|
|
8
|
+
getLogFilePath(): string;
|
|
9
|
+
private ensureLogDir;
|
|
10
|
+
private loadOrCreateLogFile;
|
|
11
|
+
log(level: DiagnosticLogEntry['level'], category: string, message: string, context?: Record<string, unknown>): Promise<LogOperationResult>;
|
|
12
|
+
debug(category: string, message: string, context?: Record<string, unknown>): Promise<LogOperationResult>;
|
|
13
|
+
info(category: string, message: string, context?: Record<string, unknown>): Promise<LogOperationResult>;
|
|
14
|
+
warn(category: string, message: string, context?: Record<string, unknown>): Promise<LogOperationResult>;
|
|
15
|
+
error(category: string, message: string, context?: Record<string, unknown>): Promise<LogOperationResult>;
|
|
16
|
+
logConfigLoading(success: boolean, projectRoot: string, configLanguage?: string, error?: string): Promise<LogOperationResult>;
|
|
17
|
+
readLogs(): Promise<DiagnosticLogEntry[]>;
|
|
18
|
+
clearLogs(): Promise<LogOperationResult>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
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 DiagnosticLogService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.DiagnosticLogService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const fs = require("fs/promises");
|
|
16
|
+
const fs_1 = require("fs");
|
|
17
|
+
const path = require("path");
|
|
18
|
+
const config_service_1 = require("../config/config.service");
|
|
19
|
+
const diagnostic_types_1 = require("./diagnostic.types");
|
|
20
|
+
let DiagnosticLogService = DiagnosticLogService_1 = class DiagnosticLogService {
|
|
21
|
+
constructor(configService) {
|
|
22
|
+
this.configService = configService;
|
|
23
|
+
this.logger = new common_1.Logger(DiagnosticLogService_1.name);
|
|
24
|
+
}
|
|
25
|
+
getLogDir() {
|
|
26
|
+
const projectRoot = this.configService.getProjectRoot();
|
|
27
|
+
return path.join(projectRoot, diagnostic_types_1.LOG_DIR_PATH);
|
|
28
|
+
}
|
|
29
|
+
getLogFilePath() {
|
|
30
|
+
return path.join(this.getLogDir(), diagnostic_types_1.LOG_FILE_NAME);
|
|
31
|
+
}
|
|
32
|
+
ensureLogDir() {
|
|
33
|
+
const logDir = this.getLogDir();
|
|
34
|
+
if (!(0, fs_1.existsSync)(logDir)) {
|
|
35
|
+
(0, fs_1.mkdirSync)(logDir, { recursive: true });
|
|
36
|
+
this.logger.log(`Created log directory: ${logDir}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async loadOrCreateLogFile() {
|
|
40
|
+
const filePath = this.getLogFilePath();
|
|
41
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
42
|
+
try {
|
|
43
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
44
|
+
const logFile = JSON.parse(content);
|
|
45
|
+
if (logFile.version === diagnostic_types_1.LOG_SCHEMA_VERSION) {
|
|
46
|
+
return logFile;
|
|
47
|
+
}
|
|
48
|
+
this.logger.warn(`Log schema version mismatch, creating new log file`);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
this.logger.warn(`Failed to parse log file, creating new one`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
version: diagnostic_types_1.LOG_SCHEMA_VERSION,
|
|
56
|
+
createdAt: new Date().toISOString(),
|
|
57
|
+
entries: [],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async log(level, category, message, context) {
|
|
61
|
+
try {
|
|
62
|
+
this.ensureLogDir();
|
|
63
|
+
const logFile = await this.loadOrCreateLogFile();
|
|
64
|
+
const entry = {
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
level,
|
|
67
|
+
category,
|
|
68
|
+
message,
|
|
69
|
+
context,
|
|
70
|
+
};
|
|
71
|
+
logFile.entries.push(entry);
|
|
72
|
+
if (logFile.entries.length > diagnostic_types_1.MAX_LOG_ENTRIES) {
|
|
73
|
+
logFile.entries = logFile.entries.slice(-diagnostic_types_1.MAX_LOG_ENTRIES);
|
|
74
|
+
}
|
|
75
|
+
const filePath = this.getLogFilePath();
|
|
76
|
+
await fs.writeFile(filePath, JSON.stringify(logFile, null, 2), 'utf-8');
|
|
77
|
+
return { success: true, filePath };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
81
|
+
this.logger.error(`Failed to write diagnostic log: ${errorMessage}`);
|
|
82
|
+
return { success: false, error: errorMessage };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async debug(category, message, context) {
|
|
86
|
+
return this.log('debug', category, message, context);
|
|
87
|
+
}
|
|
88
|
+
async info(category, message, context) {
|
|
89
|
+
return this.log('info', category, message, context);
|
|
90
|
+
}
|
|
91
|
+
async warn(category, message, context) {
|
|
92
|
+
return this.log('warn', category, message, context);
|
|
93
|
+
}
|
|
94
|
+
async error(category, message, context) {
|
|
95
|
+
return this.log('error', category, message, context);
|
|
96
|
+
}
|
|
97
|
+
async logConfigLoading(success, projectRoot, configLanguage, error) {
|
|
98
|
+
const level = success ? 'info' : 'warn';
|
|
99
|
+
const message = success
|
|
100
|
+
? `Config loaded successfully`
|
|
101
|
+
: `Config loading failed or incomplete`;
|
|
102
|
+
return this.log(level, 'config', message, {
|
|
103
|
+
projectRoot,
|
|
104
|
+
configLanguage: configLanguage || null,
|
|
105
|
+
error: error || null,
|
|
106
|
+
timestamp: new Date().toISOString(),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async readLogs() {
|
|
110
|
+
try {
|
|
111
|
+
const filePath = this.getLogFilePath();
|
|
112
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
116
|
+
const logFile = JSON.parse(content);
|
|
117
|
+
return logFile.entries;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
121
|
+
this.logger.error(`Failed to read diagnostic logs: ${errorMessage}`);
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async clearLogs() {
|
|
126
|
+
try {
|
|
127
|
+
const filePath = this.getLogFilePath();
|
|
128
|
+
if ((0, fs_1.existsSync)(filePath)) {
|
|
129
|
+
await fs.unlink(filePath);
|
|
130
|
+
this.logger.log(`Cleared diagnostic log file: ${filePath}`);
|
|
131
|
+
}
|
|
132
|
+
return { success: true, filePath };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
136
|
+
this.logger.error(`Failed to clear diagnostic logs: ${errorMessage}`);
|
|
137
|
+
return { success: false, error: errorMessage };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
exports.DiagnosticLogService = DiagnosticLogService;
|
|
142
|
+
exports.DiagnosticLogService = DiagnosticLogService = DiagnosticLogService_1 = __decorate([
|
|
143
|
+
(0, common_1.Injectable)(),
|
|
144
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
145
|
+
], DiagnosticLogService);
|
|
146
|
+
//# sourceMappingURL=diagnostic-log.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic-log.service.js","sourceRoot":"","sources":["../../../src/diagnostic/diagnostic-log.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,kCAAkC;AAClC,2BAA2C;AAC3C,6BAA6B;AAC7B,6DAAyD;AACzD,yDAQ4B;AASrB,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAG/B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAEJ,CAAC;IAK7D,SAAS;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,+BAAY,CAAC,CAAC;IAC9C,CAAC;IAKD,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,gCAAa,CAAC,CAAC;IACpD,CAAC;IAKO,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,IAAA,eAAU,EAAC,MAAM,CAAC,EAAE,CAAC;YACxB,IAAA,cAAS,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAEvC,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;gBAGzD,IAAI,OAAO,CAAC,OAAO,KAAK,qCAAkB,EAAE,CAAC;oBAC3C,OAAO,OAAO,CAAC;gBACjB,CAAC;gBAGD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,qCAAkB;YAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAKD,KAAK,CAAC,GAAG,CACP,KAAkC,EAClC,QAAgB,EAChB,OAAe,EACf,OAAiC;QAEjC,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,EAAE,CAAC;YAEpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEjD,MAAM,KAAK,GAAuB;gBAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK;gBACL,QAAQ;gBACR,OAAO;gBACP,OAAO;aACR,CAAC;YAEF,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAG5B,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,kCAAe,EAAE,CAAC;gBAC7C,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,kCAAe,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAExE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;YACrE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,KAAK,CACT,QAAgB,EAChB,OAAe,EACf,OAAiC;QAEjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAKD,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,OAAe,EACf,OAAiC;QAEjC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAKD,KAAK,CAAC,IAAI,CACR,QAAgB,EAChB,OAAe,EACf,OAAiC;QAEjC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAKD,KAAK,CAAC,KAAK,CACT,QAAgB,EAChB,OAAe,EACf,OAAiC;QAEjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAKD,KAAK,CAAC,gBAAgB,CACpB,OAAgB,EAChB,WAAmB,EACnB,cAAuB,EACvB,KAAc;QAEd,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,4BAA4B;YAC9B,CAAC,CAAC,qCAAqC,CAAC;QAE1C,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;YACxC,WAAW;YACX,cAAc,EAAE,cAAc,IAAI,IAAI;YACtC,KAAK,EAAE,KAAK,IAAI,IAAI;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAKD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAEvC,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;YAEzD,OAAO,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAKD,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAEvC,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,YAAY,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;CACF,CAAA;AAnNY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAIiC,8BAAa;GAH9C,oBAAoB,CAmNhC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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.DiagnosticModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const diagnostic_log_service_1 = require("./diagnostic-log.service");
|
|
12
|
+
const config_module_1 = require("../config/config.module");
|
|
13
|
+
let DiagnosticModule = class DiagnosticModule {
|
|
14
|
+
};
|
|
15
|
+
exports.DiagnosticModule = DiagnosticModule;
|
|
16
|
+
exports.DiagnosticModule = DiagnosticModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [config_module_1.CodingBuddyConfigModule],
|
|
19
|
+
providers: [diagnostic_log_service_1.DiagnosticLogService],
|
|
20
|
+
exports: [diagnostic_log_service_1.DiagnosticLogService],
|
|
21
|
+
})
|
|
22
|
+
], DiagnosticModule);
|
|
23
|
+
//# sourceMappingURL=diagnostic.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.module.js","sourceRoot":"","sources":["../../../src/diagnostic/diagnostic.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qEAAgE;AAChE,2DAAkE;AAO3D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,uCAAuB,CAAC;QAClC,SAAS,EAAE,CAAC,6CAAoB,CAAC;QACjC,OAAO,EAAE,CAAC,6CAAoB,CAAC;KAChC,CAAC;GACW,gBAAgB,CAAG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface DiagnosticLogEntry {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
4
|
+
category: string;
|
|
5
|
+
message: string;
|
|
6
|
+
context?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface DiagnosticLogFile {
|
|
9
|
+
version: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
entries: DiagnosticLogEntry[];
|
|
12
|
+
}
|
|
13
|
+
export interface LogOperationResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
filePath?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const LOG_DIR_PATH = "docs/codingbuddy/log";
|
|
19
|
+
export declare const LOG_FILE_NAME = "diagnostic.log";
|
|
20
|
+
export declare const LOG_SCHEMA_VERSION = "1.0.0";
|
|
21
|
+
export declare const MAX_LOG_ENTRIES = 1000;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_LOG_ENTRIES = exports.LOG_SCHEMA_VERSION = exports.LOG_FILE_NAME = exports.LOG_DIR_PATH = void 0;
|
|
4
|
+
exports.LOG_DIR_PATH = 'docs/codingbuddy/log';
|
|
5
|
+
exports.LOG_FILE_NAME = 'diagnostic.log';
|
|
6
|
+
exports.LOG_SCHEMA_VERSION = '1.0.0';
|
|
7
|
+
exports.MAX_LOG_ENTRIES = 1000;
|
|
8
|
+
//# sourceMappingURL=diagnostic.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostic.types.js","sourceRoot":"","sources":["../../../src/diagnostic/diagnostic.types.ts"],"names":[],"mappings":";;;AAgCa,QAAA,YAAY,GAAG,sBAAsB,CAAC;AAKtC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AAKjC,QAAA,kBAAkB,GAAG,OAAO,CAAC;AAK7B,QAAA,eAAe,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./diagnostic.module"), exports);
|
|
18
|
+
__exportStar(require("./diagnostic-log.service"), exports);
|
|
19
|
+
__exportStar(require("./diagnostic.types"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/diagnostic/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,2DAAyC;AACzC,qDAAmC"}
|
|
@@ -21,6 +21,7 @@ const DEFAULT_CONFIG = {
|
|
|
21
21
|
defaultSpecialists: [
|
|
22
22
|
'architecture-specialist',
|
|
23
23
|
'test-strategy-specialist',
|
|
24
|
+
'migration-specialist',
|
|
24
25
|
],
|
|
25
26
|
},
|
|
26
27
|
ACT: {
|
|
@@ -50,6 +51,9 @@ const DEFAULT_CONFIG = {
|
|
|
50
51
|
'accessibility-specialist',
|
|
51
52
|
'performance-specialist',
|
|
52
53
|
'code-quality-specialist',
|
|
54
|
+
'observability-specialist',
|
|
55
|
+
'event-architecture-specialist',
|
|
56
|
+
'migration-specialist',
|
|
53
57
|
],
|
|
54
58
|
},
|
|
55
59
|
AUTO: {
|
|
@@ -65,6 +69,9 @@ const DEFAULT_CONFIG = {
|
|
|
65
69
|
'test-strategy-specialist',
|
|
66
70
|
'security-specialist',
|
|
67
71
|
'code-quality-specialist',
|
|
72
|
+
'observability-specialist',
|
|
73
|
+
'event-architecture-specialist',
|
|
74
|
+
'migration-specialist',
|
|
68
75
|
],
|
|
69
76
|
},
|
|
70
77
|
},
|
|
@@ -403,5 +410,17 @@ KeywordService.CONTEXT_SPECIALIST_PATTERNS = [
|
|
|
403
410
|
pattern: /외부\s*서비스|external\s*(api|service)|webhook|웹훅|third-?party|circuit\s*breaker|retry\s*pattern|API\s*integration|서드파티|연동|SDK\s*wrapper/i,
|
|
404
411
|
specialist: 'integration-specialist',
|
|
405
412
|
},
|
|
413
|
+
{
|
|
414
|
+
pattern: /observability|관측성|distributed\s*trac|분산\s*추적|SLI|SLO|error\s*budget|OpenTelemetry|otel|Prometheus|Grafana|Jaeger|Zipkin|log\s*aggregat|로그\s*수집|alerting\s*strateg|알림\s*전략|메트릭\s*수집|metric\s*collect|tracing\s*infra|monitoring|대시보드|dashboard|logs?\s*manag/i,
|
|
415
|
+
specialist: 'observability-specialist',
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
pattern: /event[- ]?driven|이벤트\s*기반|message\s*queue|메시지\s*큐|Kafka|RabbitMQ|SQS|Azure\s*Service\s*Bus|event\s*sourc|CQRS|saga\s*pattern|분산\s*트랜잭션|distributed\s*transaction|pub\/?sub|dead\s*letter|DLQ|websocket|SSE|server[- ]?sent|real[- ]?time|실시간|async\s*messag|비동기\s*통신/i,
|
|
419
|
+
specialist: 'event-architecture-specialist',
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
pattern: /migration|마이그레이션|migrate|이전|legacy\s*(system|code|moderniz)|레거시|upgrade\s*(framework|version|library)|업그레이드|strangler\s*fig|branch\s*by\s*abstraction|blue[- ]?green|canary\s*(deploy|release)|rollback|롤백|api\s*version|deprecat|dual[- ]?write|backward\s*compatib|호환성|zero[- ]?downtime|data\s*migration|데이터\s*마이그레이션|schema\s*migration|스키마\s*변경|cutover|전환/i,
|
|
423
|
+
specialist: 'migration-specialist',
|
|
424
|
+
},
|
|
406
425
|
];
|
|
407
426
|
//# sourceMappingURL=keyword.service.js.map
|