cast-code 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/app.module.js +45 -0
- package/dist/app.module.js.map +1 -0
- package/dist/common/common.module.js +49 -0
- package/dist/common/common.module.js.map +1 -0
- package/dist/common/constants/index.js +105 -0
- package/dist/common/constants/index.js.map +1 -0
- package/dist/common/index.js +24 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/services/config.service.js +119 -0
- package/dist/common/services/config.service.js.map +1 -0
- package/dist/common/services/llm.service.js +56 -0
- package/dist/common/services/llm.service.js.map +1 -0
- package/dist/common/services/markdown-parser.service.js +101 -0
- package/dist/common/services/markdown-parser.service.js.map +1 -0
- package/dist/common/services/markdown-renderer.service.js +220 -0
- package/dist/common/services/markdown-renderer.service.js.map +1 -0
- package/dist/common/services/multi-llm.service.js +115 -0
- package/dist/common/services/multi-llm.service.js.map +1 -0
- package/dist/common/types/index.js +20 -0
- package/dist/common/types/index.js.map +1 -0
- package/dist/common/types/markdown.types.js +6 -0
- package/dist/common/types/markdown.types.js.map +1 -0
- package/dist/main.js +84 -0
- package/dist/main.js.map +1 -0
- package/dist/modules/agents/agents.module.js +43 -0
- package/dist/modules/agents/agents.module.js.map +1 -0
- package/dist/modules/agents/definitions/architect.md +35 -0
- package/dist/modules/agents/definitions/backend.md +43 -0
- package/dist/modules/agents/definitions/coder.md +34 -0
- package/dist/modules/agents/definitions/devops.md +42 -0
- package/dist/modules/agents/definitions/frontend.md +46 -0
- package/dist/modules/agents/definitions/reviewer.md +35 -0
- package/dist/modules/agents/definitions/tester.md +41 -0
- package/dist/modules/agents/index.js +23 -0
- package/dist/modules/agents/index.js.map +1 -0
- package/dist/modules/agents/services/agent-loader.service.js +150 -0
- package/dist/modules/agents/services/agent-loader.service.js.map +1 -0
- package/dist/modules/agents/services/agent-registry.service.js +108 -0
- package/dist/modules/agents/services/agent-registry.service.js.map +1 -0
- package/dist/modules/agents/types/agent.types.js +6 -0
- package/dist/modules/agents/types/agent.types.js.map +1 -0
- package/dist/modules/agents/types/index.js +20 -0
- package/dist/modules/agents/types/index.js.map +1 -0
- package/dist/modules/config/config.module.js +38 -0
- package/dist/modules/config/config.module.js.map +1 -0
- package/dist/modules/config/index.js +24 -0
- package/dist/modules/config/index.js.map +1 -0
- package/dist/modules/config/services/config-commands.service.js +405 -0
- package/dist/modules/config/services/config-commands.service.js.map +1 -0
- package/dist/modules/config/services/config-manager.service.js +175 -0
- package/dist/modules/config/services/config-manager.service.js.map +1 -0
- package/dist/modules/config/services/init-config.service.js +238 -0
- package/dist/modules/config/services/init-config.service.js.map +1 -0
- package/dist/modules/config/types/config.types.js +163 -0
- package/dist/modules/config/types/config.types.js.map +1 -0
- package/dist/modules/config/types/index.js +20 -0
- package/dist/modules/config/types/index.js.map +1 -0
- package/dist/modules/core/core.module.js +60 -0
- package/dist/modules/core/core.module.js.map +1 -0
- package/dist/modules/core/index.js +22 -0
- package/dist/modules/core/index.js.map +1 -0
- package/dist/modules/core/services/deep-agent.service.js +575 -0
- package/dist/modules/core/services/deep-agent.service.js.map +1 -0
- package/dist/modules/core/services/plan-mode.service.js +225 -0
- package/dist/modules/core/services/plan-mode.service.js.map +1 -0
- package/dist/modules/git/git.module.js +48 -0
- package/dist/modules/git/git.module.js.map +1 -0
- package/dist/modules/git/index.js +23 -0
- package/dist/modules/git/index.js.map +1 -0
- package/dist/modules/git/services/code-review.service.js +330 -0
- package/dist/modules/git/services/code-review.service.js.map +1 -0
- package/dist/modules/git/services/commit-generator.service.js +403 -0
- package/dist/modules/git/services/commit-generator.service.js.map +1 -0
- package/dist/modules/git/services/index.js +21 -0
- package/dist/modules/git/services/index.js.map +1 -0
- package/dist/modules/git/services/monorepo-detector.service.js +338 -0
- package/dist/modules/git/services/monorepo-detector.service.js.map +1 -0
- package/dist/modules/git/services/pr-generator.service.js +429 -0
- package/dist/modules/git/services/pr-generator.service.js.map +1 -0
- package/dist/modules/git/services/release-notes.service.js +426 -0
- package/dist/modules/git/services/release-notes.service.js.map +1 -0
- package/dist/modules/git/types/git.types.js +6 -0
- package/dist/modules/git/types/git.types.js.map +1 -0
- package/dist/modules/git/types/index.js +20 -0
- package/dist/modules/git/types/index.js.map +1 -0
- package/dist/modules/mcp/catalog/mcp-templates.js +606 -0
- package/dist/modules/mcp/catalog/mcp-templates.js.map +1 -0
- package/dist/modules/mcp/index.js +23 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/mcp.module.js +35 -0
- package/dist/modules/mcp/mcp.module.js.map +1 -0
- package/dist/modules/mcp/services/mcp-client.service.js +289 -0
- package/dist/modules/mcp/services/mcp-client.service.js.map +1 -0
- package/dist/modules/mcp/services/mcp-registry.service.js +197 -0
- package/dist/modules/mcp/services/mcp-registry.service.js.map +1 -0
- package/dist/modules/mcp/types/index.js +20 -0
- package/dist/modules/mcp/types/index.js.map +1 -0
- package/dist/modules/mcp/types/mcp.types.js +6 -0
- package/dist/modules/mcp/types/mcp.types.js.map +1 -0
- package/dist/modules/memory/index.js +23 -0
- package/dist/modules/memory/index.js.map +1 -0
- package/dist/modules/memory/memory.module.js +35 -0
- package/dist/modules/memory/memory.module.js.map +1 -0
- package/dist/modules/memory/services/memory-tools.service.js +78 -0
- package/dist/modules/memory/services/memory-tools.service.js.map +1 -0
- package/dist/modules/memory/services/memory.service.js +169 -0
- package/dist/modules/memory/services/memory.service.js.map +1 -0
- package/dist/modules/memory/types/index.js +20 -0
- package/dist/modules/memory/types/index.js.map +1 -0
- package/dist/modules/memory/types/memory.types.js +6 -0
- package/dist/modules/memory/types/memory.types.js.map +1 -0
- package/dist/modules/mentions/index.js +22 -0
- package/dist/modules/mentions/index.js.map +1 -0
- package/dist/modules/mentions/mentions.module.js +32 -0
- package/dist/modules/mentions/mentions.module.js.map +1 -0
- package/dist/modules/mentions/services/mentions.service.js +336 -0
- package/dist/modules/mentions/services/mentions.service.js.map +1 -0
- package/dist/modules/mentions/types/index.js +20 -0
- package/dist/modules/mentions/types/index.js.map +1 -0
- package/dist/modules/mentions/types/mention.types.js +19 -0
- package/dist/modules/mentions/types/mention.types.js.map +1 -0
- package/dist/modules/permissions/index.js +23 -0
- package/dist/modules/permissions/index.js.map +1 -0
- package/dist/modules/permissions/permissions.module.js +35 -0
- package/dist/modules/permissions/permissions.module.js.map +1 -0
- package/dist/modules/permissions/services/permission.service.js +269 -0
- package/dist/modules/permissions/services/permission.service.js.map +1 -0
- package/dist/modules/permissions/services/prompt.service.js +116 -0
- package/dist/modules/permissions/services/prompt.service.js.map +1 -0
- package/dist/modules/permissions/types/permission.types.js +32 -0
- package/dist/modules/permissions/types/permission.types.js.map +1 -0
- package/dist/modules/project/index.js +24 -0
- package/dist/modules/project/index.js.map +1 -0
- package/dist/modules/project/project.module.js +38 -0
- package/dist/modules/project/project.module.js.map +1 -0
- package/dist/modules/project/services/project-analyzer.service.js +1063 -0
- package/dist/modules/project/services/project-analyzer.service.js.map +1 -0
- package/dist/modules/project/services/project-context.service.js +62 -0
- package/dist/modules/project/services/project-context.service.js.map +1 -0
- package/dist/modules/project/services/project-loader.service.js +147 -0
- package/dist/modules/project/services/project-loader.service.js.map +1 -0
- package/dist/modules/project/types/index.js +20 -0
- package/dist/modules/project/types/index.js.map +1 -0
- package/dist/modules/project/types/project.types.js +6 -0
- package/dist/modules/project/types/project.types.js.map +1 -0
- package/dist/modules/repl/index.js +21 -0
- package/dist/modules/repl/index.js.map +1 -0
- package/dist/modules/repl/repl.module.js +66 -0
- package/dist/modules/repl/repl.module.js.map +1 -0
- package/dist/modules/repl/services/commands/agent-commands.service.js +196 -0
- package/dist/modules/repl/services/commands/agent-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/git-commands.service.js +500 -0
- package/dist/modules/repl/services/commands/git-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/mcp-commands.service.js +579 -0
- package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/project-commands.service.js +226 -0
- package/dist/modules/repl/services/commands/project-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/repl-commands.service.js +254 -0
- package/dist/modules/repl/services/commands/repl-commands.service.js.map +1 -0
- package/dist/modules/repl/services/repl.service.js +647 -0
- package/dist/modules/repl/services/repl.service.js.map +1 -0
- package/dist/modules/repl/services/smart-input.js +544 -0
- package/dist/modules/repl/services/smart-input.js.map +1 -0
- package/dist/modules/repl/services/welcome-screen.service.js +117 -0
- package/dist/modules/repl/services/welcome-screen.service.js.map +1 -0
- package/dist/modules/repl/utils/prompts-with-esc.js +187 -0
- package/dist/modules/repl/utils/prompts-with-esc.js.map +1 -0
- package/dist/modules/repl/utils/theme.js +185 -0
- package/dist/modules/repl/utils/theme.js.map +1 -0
- package/dist/modules/skills/definitions/general/file-operations.md +60 -0
- package/dist/modules/skills/definitions/general/git-operations.md +59 -0
- package/dist/modules/skills/definitions/general/planning.md +86 -0
- package/dist/modules/skills/definitions/general/search.md +59 -0
- package/dist/modules/skills/definitions/specialized/api-design.md +85 -0
- package/dist/modules/skills/definitions/specialized/database-operations.md +78 -0
- package/dist/modules/skills/definitions/specialized/frontend-bootstrap.md +71 -0
- package/dist/modules/skills/definitions/specialized/react-patterns.md +77 -0
- package/dist/modules/skills/definitions/specialized/testing-strategies.md +79 -0
- package/dist/modules/skills/index.js +23 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/services/skill-loader.service.js +130 -0
- package/dist/modules/skills/services/skill-loader.service.js.map +1 -0
- package/dist/modules/skills/services/skill-registry.service.js +96 -0
- package/dist/modules/skills/services/skill-registry.service.js.map +1 -0
- package/dist/modules/skills/skills.module.js +38 -0
- package/dist/modules/skills/skills.module.js.map +1 -0
- package/dist/modules/skills/types/index.js +20 -0
- package/dist/modules/skills/types/index.js.map +1 -0
- package/dist/modules/skills/types/skill.types.js +6 -0
- package/dist/modules/skills/types/skill.types.js.map +1 -0
- package/dist/modules/tasks/index.js +24 -0
- package/dist/modules/tasks/index.js.map +1 -0
- package/dist/modules/tasks/services/plan-executor.service.js +199 -0
- package/dist/modules/tasks/services/plan-executor.service.js.map +1 -0
- package/dist/modules/tasks/services/plan-mode.service.js +118 -0
- package/dist/modules/tasks/services/plan-mode.service.js.map +1 -0
- package/dist/modules/tasks/services/plan-persistence.service.js +148 -0
- package/dist/modules/tasks/services/plan-persistence.service.js.map +1 -0
- package/dist/modules/tasks/services/task-management.service.js +255 -0
- package/dist/modules/tasks/services/task-management.service.js.map +1 -0
- package/dist/modules/tasks/services/task-tools.service.js +270 -0
- package/dist/modules/tasks/services/task-tools.service.js.map +1 -0
- package/dist/modules/tasks/tasks.module.js +49 -0
- package/dist/modules/tasks/tasks.module.js.map +1 -0
- package/dist/modules/tasks/types/task.types.js +21 -0
- package/dist/modules/tasks/types/task.types.js.map +1 -0
- package/dist/modules/tools/index.js +24 -0
- package/dist/modules/tools/index.js.map +1 -0
- package/dist/modules/tools/services/filesystem-tools.service.js +450 -0
- package/dist/modules/tools/services/filesystem-tools.service.js.map +1 -0
- package/dist/modules/tools/services/search-tools.service.js +63 -0
- package/dist/modules/tools/services/search-tools.service.js.map +1 -0
- package/dist/modules/tools/services/shell-tools.service.js +194 -0
- package/dist/modules/tools/services/shell-tools.service.js.map +1 -0
- package/dist/modules/tools/services/tools-registry.service.js +83 -0
- package/dist/modules/tools/services/tools-registry.service.js.map +1 -0
- package/dist/modules/tools/tools.module.js +46 -0
- package/dist/modules/tools/tools.module.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "CodeReviewService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return CodeReviewService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _child_process = require("child_process");
|
|
13
|
+
const _messages = require("@langchain/core/messages");
|
|
14
|
+
const _multillmservice = require("../../../common/services/multi-llm.service");
|
|
15
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
16
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
17
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
18
|
+
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;
|
|
19
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
20
|
+
}
|
|
21
|
+
function _ts_metadata(k, v) {
|
|
22
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
23
|
+
}
|
|
24
|
+
let CodeReviewService = class CodeReviewService {
|
|
25
|
+
async reviewFile(filePath) {
|
|
26
|
+
const content = this.readFile(filePath);
|
|
27
|
+
if (!content) {
|
|
28
|
+
return {
|
|
29
|
+
file: filePath,
|
|
30
|
+
issues: [
|
|
31
|
+
{
|
|
32
|
+
severity: 'error',
|
|
33
|
+
message: 'Could not read file'
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
summary: 'File not found or empty',
|
|
37
|
+
score: 0
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const llm = this.multiLlmService.createModel('reviewer');
|
|
41
|
+
const prompt = this.buildReviewPrompt(filePath, content);
|
|
42
|
+
const response = await llm.invoke([
|
|
43
|
+
new _messages.SystemMessage(this.getReviewSystemPrompt()),
|
|
44
|
+
new _messages.HumanMessage(prompt)
|
|
45
|
+
]);
|
|
46
|
+
const responseText = this.extractContent(response.content);
|
|
47
|
+
return this.parseReviewResponse(filePath, responseText, content);
|
|
48
|
+
}
|
|
49
|
+
async reviewFiles(filePaths) {
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const file of filePaths){
|
|
52
|
+
const result = await this.reviewFile(file);
|
|
53
|
+
results.push(result);
|
|
54
|
+
}
|
|
55
|
+
return results;
|
|
56
|
+
}
|
|
57
|
+
async reviewDiff(stagedOnly = false) {
|
|
58
|
+
const files = this.getChangedFiles(stagedOnly);
|
|
59
|
+
return this.reviewFiles(files);
|
|
60
|
+
}
|
|
61
|
+
async fixFile(filePath) {
|
|
62
|
+
const content = this.readFile(filePath);
|
|
63
|
+
if (!content) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: 'Could not read file'
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const llm = this.multiLlmService.createModel('reviewer');
|
|
70
|
+
const prompt = this.buildFixPrompt(filePath, content);
|
|
71
|
+
const response = await llm.invoke([
|
|
72
|
+
new _messages.SystemMessage(this.getFixSystemPrompt()),
|
|
73
|
+
new _messages.HumanMessage(prompt)
|
|
74
|
+
]);
|
|
75
|
+
const responseText = this.extractContent(response.content);
|
|
76
|
+
const fixedCode = this.extractCodeBlock(responseText);
|
|
77
|
+
if (fixedCode) {
|
|
78
|
+
this.writeFile(filePath, fixedCode);
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
fixed: fixedCode
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: 'Could not generate fix'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async indentFile(filePath) {
|
|
90
|
+
try {
|
|
91
|
+
const content = this.readFile(filePath);
|
|
92
|
+
if (!content) {
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error: 'Could not read file'
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
(0, _child_process.execSync)(`npx prettier --write "${filePath}"`, {
|
|
100
|
+
cwd: process.cwd()
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
success: true
|
|
104
|
+
};
|
|
105
|
+
} catch {
|
|
106
|
+
const llm = this.multiLlmService.createModel('reviewer');
|
|
107
|
+
const prompt = `Format and indent this code properly. Maintain all functionality, only fix indentation and formatting:
|
|
108
|
+
|
|
109
|
+
File: ${filePath}
|
|
110
|
+
|
|
111
|
+
\`\`\`
|
|
112
|
+
${content}
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
Return ONLY the formatted code in a code block.`;
|
|
116
|
+
const response = await llm.invoke([
|
|
117
|
+
new _messages.SystemMessage('You are a code formatter. Fix indentation and formatting only.'),
|
|
118
|
+
new _messages.HumanMessage(prompt)
|
|
119
|
+
]);
|
|
120
|
+
const responseText = this.extractContent(response.content);
|
|
121
|
+
const formattedCode = this.extractCodeBlock(responseText);
|
|
122
|
+
if (formattedCode) {
|
|
123
|
+
this.writeFile(filePath, formattedCode);
|
|
124
|
+
return {
|
|
125
|
+
success: true
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: 'Could not format file'
|
|
132
|
+
};
|
|
133
|
+
} catch (error) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
error: error.message
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async indentAll(pattern = 'src/**/*.{ts,tsx,js,jsx}') {
|
|
141
|
+
try {
|
|
142
|
+
const files = (0, _child_process.execSync)(`find src -type f -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx"`, {
|
|
143
|
+
cwd: process.cwd(),
|
|
144
|
+
encoding: 'utf-8'
|
|
145
|
+
}).trim().split('\n').filter((f)=>f);
|
|
146
|
+
let success = 0;
|
|
147
|
+
let failed = 0;
|
|
148
|
+
for (const file of files){
|
|
149
|
+
const result = await this.indentFile(file);
|
|
150
|
+
if (result.success) success++;
|
|
151
|
+
else failed++;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
success,
|
|
155
|
+
failed
|
|
156
|
+
};
|
|
157
|
+
} catch {
|
|
158
|
+
return {
|
|
159
|
+
success: 0,
|
|
160
|
+
failed: 0
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
readFile(filePath) {
|
|
165
|
+
try {
|
|
166
|
+
return (0, _child_process.execSync)(`cat "${filePath}"`, {
|
|
167
|
+
cwd: process.cwd(),
|
|
168
|
+
encoding: 'utf-8'
|
|
169
|
+
});
|
|
170
|
+
} catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
writeFile(filePath, content) {
|
|
175
|
+
try {
|
|
176
|
+
const fs = require('fs');
|
|
177
|
+
fs.writeFileSync(filePath, content);
|
|
178
|
+
} catch {}
|
|
179
|
+
}
|
|
180
|
+
getChangedFiles(stagedOnly = false) {
|
|
181
|
+
try {
|
|
182
|
+
const cmd = stagedOnly ? 'git diff --cached --name-only --diff-filter=ACM' : 'git diff --name-only --diff-filter=ACM';
|
|
183
|
+
const output = (0, _child_process.execSync)(cmd, {
|
|
184
|
+
cwd: process.cwd(),
|
|
185
|
+
encoding: 'utf-8'
|
|
186
|
+
});
|
|
187
|
+
return output.trim().split('\n').filter((f)=>f && (f.endsWith('.ts') || f.endsWith('.tsx') || f.endsWith('.js') || f.endsWith('.jsx')));
|
|
188
|
+
} catch {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
buildReviewPrompt(filePath, content) {
|
|
193
|
+
return `Review this code file:
|
|
194
|
+
|
|
195
|
+
File: ${filePath}
|
|
196
|
+
|
|
197
|
+
\`\`\`
|
|
198
|
+
${content.slice(0, 3000)}${content.length > 3000 ? '\n... (truncated)' : ''}
|
|
199
|
+
\`\`\`
|
|
200
|
+
|
|
201
|
+
Provide a detailed code review following the format specified.`;
|
|
202
|
+
}
|
|
203
|
+
buildFixPrompt(filePath, content) {
|
|
204
|
+
return `Fix any issues in this code (bugs, security, performance, best practices):
|
|
205
|
+
|
|
206
|
+
File: ${filePath}
|
|
207
|
+
|
|
208
|
+
\`\`\`
|
|
209
|
+
${content}
|
|
210
|
+
\`\`\`
|
|
211
|
+
|
|
212
|
+
Return ONLY the fixed code in a code block. Do not add explanations.`;
|
|
213
|
+
}
|
|
214
|
+
getReviewSystemPrompt() {
|
|
215
|
+
return `You are a senior code reviewer. Analyze code and provide actionable feedback.
|
|
216
|
+
|
|
217
|
+
**SEVERITY LEVELS:**
|
|
218
|
+
- error: Bugs, security issues, broken functionality
|
|
219
|
+
- warning: Potential issues, anti-patterns, performance concerns
|
|
220
|
+
- suggestion: Improvements, best practices, style issues
|
|
221
|
+
- praise: Good practices worth highlighting
|
|
222
|
+
|
|
223
|
+
**OUTPUT FORMAT:**
|
|
224
|
+
SCORE: <0-100>
|
|
225
|
+
|
|
226
|
+
SUMMARY: <2-3 sentence overall assessment>
|
|
227
|
+
|
|
228
|
+
ISSUES:
|
|
229
|
+
[severity] Line <number>: <message>
|
|
230
|
+
Suggestion: <how to fix>
|
|
231
|
+
Code: <relevant code snippet>
|
|
232
|
+
|
|
233
|
+
(repeat for each issue)
|
|
234
|
+
|
|
235
|
+
PRAISES:
|
|
236
|
+
- <what was done well>
|
|
237
|
+
|
|
238
|
+
Be thorough but constructive. Focus on important issues, not nitpicks.`;
|
|
239
|
+
}
|
|
240
|
+
getFixSystemPrompt() {
|
|
241
|
+
return `You are an expert developer. Fix all issues in the provided code including:
|
|
242
|
+
- Bugs and logic errors
|
|
243
|
+
- Security vulnerabilities
|
|
244
|
+
- Performance issues
|
|
245
|
+
- Type safety problems
|
|
246
|
+
- Best practice violations
|
|
247
|
+
|
|
248
|
+
Return ONLY the fixed code in a markdown code block. Preserve all functionality while fixing issues.`;
|
|
249
|
+
}
|
|
250
|
+
parseReviewResponse(filePath, content, originalCode) {
|
|
251
|
+
const issues = [];
|
|
252
|
+
const scoreMatch = content.match(/SCORE:\s*(\d+)/i);
|
|
253
|
+
const score = scoreMatch ? parseInt(scoreMatch[1]) : 50;
|
|
254
|
+
const summaryMatch = content.match(/SUMMARY:\s*(.+?)(?=\n\n|ISSUES:|PRAISES:|$)/is);
|
|
255
|
+
const summary = summaryMatch ? summaryMatch[1].trim() : 'No summary provided';
|
|
256
|
+
const issuesMatch = content.match(/ISSUES:([\s\S]+?)(?=PRAISES:|$)/i);
|
|
257
|
+
if (issuesMatch) {
|
|
258
|
+
const issuesText = issuesMatch[1].trim();
|
|
259
|
+
const issueBlocks = issuesText.split(/\n\n+/);
|
|
260
|
+
for (const block of issueBlocks){
|
|
261
|
+
const lines = block.trim().split('\n');
|
|
262
|
+
const firstLine = lines[0];
|
|
263
|
+
const match = firstLine.match(/\[(\w+)\]\s*Line\s*(\d+)?\s*:?\s*(.+)/i);
|
|
264
|
+
if (match) {
|
|
265
|
+
const severity = match[1].toLowerCase();
|
|
266
|
+
const line = match[2] ? parseInt(match[2]) : undefined;
|
|
267
|
+
const message = match[3].trim();
|
|
268
|
+
let suggestion;
|
|
269
|
+
let code;
|
|
270
|
+
for(let i = 1; i < lines.length; i++){
|
|
271
|
+
if (lines[i].toLowerCase().includes('suggestion:')) {
|
|
272
|
+
suggestion = lines[i].replace(/suggestion:/i, '').trim();
|
|
273
|
+
} else if (lines[i].toLowerCase().includes('code:')) {
|
|
274
|
+
code = lines[i + 1]?.trim() || lines[i].replace(/code:/i, '').trim();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
issues.push({
|
|
278
|
+
severity,
|
|
279
|
+
line,
|
|
280
|
+
message,
|
|
281
|
+
suggestion,
|
|
282
|
+
code
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const praisesMatch = content.match(/PRAISES:([\s\S]+?)$/i);
|
|
288
|
+
if (praisesMatch) {
|
|
289
|
+
const praises = praisesMatch[1].trim().split('\n').filter((p)=>p.trim().startsWith('-'));
|
|
290
|
+
for (const praise of praises){
|
|
291
|
+
issues.push({
|
|
292
|
+
severity: 'praise',
|
|
293
|
+
message: praise.replace(/^-\s*/, '').trim()
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
file: filePath,
|
|
299
|
+
issues,
|
|
300
|
+
summary,
|
|
301
|
+
score
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
extractCodeBlock(text) {
|
|
305
|
+
const match = text.match(/```[\w]*\n([\s\S]*?)```/);
|
|
306
|
+
return match ? match[1].trim() : null;
|
|
307
|
+
}
|
|
308
|
+
extractContent(content) {
|
|
309
|
+
if (typeof content === 'string') return content;
|
|
310
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
311
|
+
const first = content[0];
|
|
312
|
+
if (typeof first === 'object' && first !== null && 'text' in first) {
|
|
313
|
+
return String(first.text);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return String(content);
|
|
317
|
+
}
|
|
318
|
+
constructor(multiLlmService){
|
|
319
|
+
this.multiLlmService = multiLlmService;
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
CodeReviewService = _ts_decorate([
|
|
323
|
+
(0, _common.Injectable)(),
|
|
324
|
+
_ts_metadata("design:type", Function),
|
|
325
|
+
_ts_metadata("design:paramtypes", [
|
|
326
|
+
typeof _multillmservice.MultiLlmService === "undefined" ? Object : _multillmservice.MultiLlmService
|
|
327
|
+
])
|
|
328
|
+
], CodeReviewService);
|
|
329
|
+
|
|
330
|
+
//# sourceMappingURL=code-review.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/git/services/code-review.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { execSync } from 'child_process';\nimport { HumanMessage, SystemMessage } from '@langchain/core/messages';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\n\nexport interface ReviewIssue {\n severity: 'error' | 'warning' | 'suggestion' | 'praise';\n line?: number;\n message: string;\n suggestion?: string;\n code?: string;\n}\n\nexport interface ReviewResult {\n file: string;\n issues: ReviewIssue[];\n summary: string;\n score: number;\n}\n\n@Injectable()\nexport class CodeReviewService {\n constructor(private readonly multiLlmService: MultiLlmService) {}\n\n async reviewFile(filePath: string): Promise<ReviewResult> {\n const content = this.readFile(filePath);\n if (!content) {\n return {\n file: filePath,\n issues: [{ severity: 'error', message: 'Could not read file' }],\n summary: 'File not found or empty',\n score: 0,\n };\n }\n\n const llm = this.multiLlmService.createModel('reviewer');\n const prompt = this.buildReviewPrompt(filePath, content);\n\n const response = await llm.invoke([\n new SystemMessage(this.getReviewSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const responseText = this.extractContent(response.content);\n return this.parseReviewResponse(filePath, responseText, content);\n }\n\n async reviewFiles(filePaths: string[]): Promise<ReviewResult[]> {\n const results: ReviewResult[] = [];\n for (const file of filePaths) {\n const result = await this.reviewFile(file);\n results.push(result);\n }\n return results;\n }\n\n async reviewDiff(stagedOnly = false): Promise<ReviewResult[]> {\n const files = this.getChangedFiles(stagedOnly);\n return this.reviewFiles(files);\n }\n\n async fixFile(filePath: string): Promise<{ success: boolean; fixed?: string; error?: string }> {\n const content = this.readFile(filePath);\n if (!content) {\n return { success: false, error: 'Could not read file' };\n }\n\n const llm = this.multiLlmService.createModel('reviewer');\n const prompt = this.buildFixPrompt(filePath, content);\n\n const response = await llm.invoke([\n new SystemMessage(this.getFixSystemPrompt()),\n new HumanMessage(prompt),\n ]);\n\n const responseText = this.extractContent(response.content);\n const fixedCode = this.extractCodeBlock(responseText);\n\n if (fixedCode) {\n this.writeFile(filePath, fixedCode);\n return { success: true, fixed: fixedCode };\n }\n\n return { success: false, error: 'Could not generate fix' };\n }\n\n async indentFile(filePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n const content = this.readFile(filePath);\n if (!content) {\n return { success: false, error: 'Could not read file' };\n }\n\n try {\n execSync(`npx prettier --write \"${filePath}\"`, { cwd: process.cwd() });\n return { success: true };\n } catch {\n const llm = this.multiLlmService.createModel('reviewer');\n const prompt = `Format and indent this code properly. Maintain all functionality, only fix indentation and formatting:\n\nFile: ${filePath}\n\n\\`\\`\\`\n${content}\n\\`\\`\\`\n\nReturn ONLY the formatted code in a code block.`;\n\n const response = await llm.invoke([\n new SystemMessage('You are a code formatter. Fix indentation and formatting only.'),\n new HumanMessage(prompt),\n ]);\n\n const responseText = this.extractContent(response.content);\n const formattedCode = this.extractCodeBlock(responseText);\n\n if (formattedCode) {\n this.writeFile(filePath, formattedCode);\n return { success: true };\n }\n }\n\n return { success: false, error: 'Could not format file' };\n } catch (error: any) {\n return { success: false, error: error.message };\n }\n }\n\n async indentAll(pattern = 'src/**/*.{ts,tsx,js,jsx}'): Promise<{ success: number; failed: number }> {\n try {\n const files = execSync(`find src -type f -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.js\" -o -name \"*.jsx\"`, {\n cwd: process.cwd(),\n encoding: 'utf-8',\n }).trim().split('\\n').filter(f => f);\n\n let success = 0;\n let failed = 0;\n\n for (const file of files) {\n const result = await this.indentFile(file);\n if (result.success) success++;\n else failed++;\n }\n\n return { success, failed };\n } catch {\n return { success: 0, failed: 0 };\n }\n }\n\n private readFile(filePath: string): string | null {\n try {\n return execSync(`cat \"${filePath}\"`, { cwd: process.cwd(), encoding: 'utf-8' });\n } catch {\n return null;\n }\n }\n\n private writeFile(filePath: string, content: string): void {\n try {\n const fs = require('fs');\n fs.writeFileSync(filePath, content);\n } catch {\n }\n }\n\n private getChangedFiles(stagedOnly = false): string[] {\n try {\n const cmd = stagedOnly \n ? 'git diff --cached --name-only --diff-filter=ACM'\n : 'git diff --name-only --diff-filter=ACM';\n \n const output = execSync(cmd, { cwd: process.cwd(), encoding: 'utf-8' });\n return output.trim().split('\\n').filter(f => f && (f.endsWith('.ts') || f.endsWith('.tsx') || f.endsWith('.js') || f.endsWith('.jsx')));\n } catch {\n return [];\n }\n }\n\n private buildReviewPrompt(filePath: string, content: string): string {\n return `Review this code file:\n\nFile: ${filePath}\n\n\\`\\`\\`\n${content.slice(0, 3000)}${content.length > 3000 ? '\\n... (truncated)' : ''}\n\\`\\`\\`\n\nProvide a detailed code review following the format specified.`;\n }\n\n private buildFixPrompt(filePath: string, content: string): string {\n return `Fix any issues in this code (bugs, security, performance, best practices):\n\nFile: ${filePath}\n\n\\`\\`\\`\n${content}\n\\`\\`\\`\n\nReturn ONLY the fixed code in a code block. Do not add explanations.`;\n }\n\n private getReviewSystemPrompt(): string {\n return `You are a senior code reviewer. Analyze code and provide actionable feedback.\n\n**SEVERITY LEVELS:**\n- error: Bugs, security issues, broken functionality\n- warning: Potential issues, anti-patterns, performance concerns\n- suggestion: Improvements, best practices, style issues\n- praise: Good practices worth highlighting\n\n**OUTPUT FORMAT:**\nSCORE: <0-100>\n\nSUMMARY: <2-3 sentence overall assessment>\n\nISSUES:\n[severity] Line <number>: <message>\nSuggestion: <how to fix>\nCode: <relevant code snippet>\n\n(repeat for each issue)\n\nPRAISES:\n- <what was done well>\n\nBe thorough but constructive. Focus on important issues, not nitpicks.`;\n }\n\n private getFixSystemPrompt(): string {\n return `You are an expert developer. Fix all issues in the provided code including:\n- Bugs and logic errors\n- Security vulnerabilities\n- Performance issues\n- Type safety problems\n- Best practice violations\n\nReturn ONLY the fixed code in a markdown code block. Preserve all functionality while fixing issues.`;\n }\n\n private parseReviewResponse(filePath: string, content: string, originalCode: string): ReviewResult {\n const issues: ReviewIssue[] = [];\n \n const scoreMatch = content.match(/SCORE:\\s*(\\d+)/i);\n const score = scoreMatch ? parseInt(scoreMatch[1]) : 50;\n\n const summaryMatch = content.match(/SUMMARY:\\s*(.+?)(?=\\n\\n|ISSUES:|PRAISES:|$)/is);\n const summary = summaryMatch ? summaryMatch[1].trim() : 'No summary provided';\n\n const issuesMatch = content.match(/ISSUES:([\\s\\S]+?)(?=PRAISES:|$)/i);\n if (issuesMatch) {\n const issuesText = issuesMatch[1].trim();\n const issueBlocks = issuesText.split(/\\n\\n+/);\n \n for (const block of issueBlocks) {\n const lines = block.trim().split('\\n');\n const firstLine = lines[0];\n \n const match = firstLine.match(/\\[(\\w+)\\]\\s*Line\\s*(\\d+)?\\s*:?\\s*(.+)/i);\n if (match) {\n const severity = match[1].toLowerCase() as ReviewIssue['severity'];\n const line = match[2] ? parseInt(match[2]) : undefined;\n const message = match[3].trim();\n \n let suggestion: string | undefined;\n let code: string | undefined;\n \n for (let i = 1; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes('suggestion:')) {\n suggestion = lines[i].replace(/suggestion:/i, '').trim();\n } else if (lines[i].toLowerCase().includes('code:')) {\n code = lines[i + 1]?.trim() || lines[i].replace(/code:/i, '').trim();\n }\n }\n \n issues.push({ severity, line, message, suggestion, code });\n }\n }\n }\n\n const praisesMatch = content.match(/PRAISES:([\\s\\S]+?)$/i);\n if (praisesMatch) {\n const praises = praisesMatch[1].trim().split('\\n').filter(p => p.trim().startsWith('-'));\n for (const praise of praises) {\n issues.push({\n severity: 'praise',\n message: praise.replace(/^-\\s*/, '').trim(),\n });\n }\n }\n\n return { file: filePath, issues, summary, score };\n }\n\n private extractCodeBlock(text: string): string | null {\n const match = text.match(/```[\\w]*\\n([\\s\\S]*?)```/);\n return match ? match[1].trim() : null;\n }\n\n private extractContent(content: unknown): string {\n if (typeof content === 'string') return content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0];\n if (typeof first === 'object' && first !== null && 'text' in first) {\n return String(first.text);\n }\n }\n return String(content);\n }\n}\n"],"names":["CodeReviewService","reviewFile","filePath","content","readFile","file","issues","severity","message","summary","score","llm","multiLlmService","createModel","prompt","buildReviewPrompt","response","invoke","SystemMessage","getReviewSystemPrompt","HumanMessage","responseText","extractContent","parseReviewResponse","reviewFiles","filePaths","results","result","push","reviewDiff","stagedOnly","files","getChangedFiles","fixFile","success","error","buildFixPrompt","getFixSystemPrompt","fixedCode","extractCodeBlock","writeFile","fixed","indentFile","execSync","cwd","process","formattedCode","indentAll","pattern","encoding","trim","split","filter","f","failed","fs","require","writeFileSync","cmd","output","endsWith","slice","length","originalCode","scoreMatch","match","parseInt","summaryMatch","issuesMatch","issuesText","issueBlocks","block","lines","firstLine","toLowerCase","line","undefined","suggestion","code","i","includes","replace","praisesMatch","praises","p","startsWith","praise","text","Array","isArray","first","String"],"mappings":"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"}
|