kodu 1.1.2 → 1.1.4
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/.prettierrc +4 -0
- package/AGENTS.md +97 -0
- package/README.md +85 -100
- package/biome.json +50 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +42 -0
- package/dist/app.module.js.map +1 -0
- package/dist/commands/clean/clean.command.d.ts +16 -0
- package/dist/commands/clean/clean.command.js +88 -0
- package/dist/commands/clean/clean.command.js.map +1 -0
- package/dist/commands/clean/clean.module.d.ts +2 -0
- package/dist/commands/clean/clean.module.js +25 -0
- package/dist/commands/clean/clean.module.js.map +1 -0
- package/dist/commands/commit/commit.command.d.ts +18 -0
- package/dist/commands/commit/commit.command.js +135 -0
- package/dist/commands/commit/commit.command.js.map +1 -0
- package/dist/commands/commit/commit.module.d.ts +2 -0
- package/dist/commands/commit/commit.module.js +25 -0
- package/dist/commands/commit/commit.module.js.map +1 -0
- package/dist/commands/init/init.command.d.ts +14 -0
- package/dist/commands/init/init.command.js +166 -0
- package/dist/commands/init/init.command.js.map +1 -0
- package/dist/commands/init/init.module.d.ts +2 -0
- package/dist/commands/init/init.module.js +22 -0
- package/dist/commands/init/init.module.js.map +1 -0
- package/dist/commands/pack/pack.command.d.ts +25 -0
- package/dist/commands/pack/pack.command.js +161 -0
- package/dist/commands/pack/pack.command.js.map +1 -0
- package/dist/commands/pack/pack.module.d.ts +2 -0
- package/dist/commands/pack/pack.module.js +25 -0
- package/dist/commands/pack/pack.module.js.map +1 -0
- package/dist/commands/review/review.command.d.ts +31 -0
- package/dist/commands/review/review.command.js +260 -0
- package/dist/commands/review/review.command.js.map +1 -0
- package/dist/commands/review/review.module.d.ts +2 -0
- package/dist/commands/review/review.module.js +26 -0
- package/dist/commands/review/review.module.js.map +1 -0
- package/dist/core/config/config.module.d.ts +2 -0
- package/dist/core/config/config.module.js +22 -0
- package/dist/core/config/config.module.js.map +1 -0
- package/dist/core/config/config.schema.d.ts +16 -0
- package/dist/core/config/config.schema.js +48 -0
- package/dist/core/config/config.schema.js.map +1 -0
- package/dist/core/config/config.service.d.ts +7 -0
- package/dist/core/config/config.service.js +51 -0
- package/dist/core/config/config.service.js.map +1 -0
- package/dist/core/config/config.types.d.ts +1 -0
- package/dist/core/config/config.types.js +3 -0
- package/dist/core/config/config.types.js.map +1 -0
- package/dist/core/file-system/fs.module.d.ts +2 -0
- package/dist/core/file-system/fs.module.js +21 -0
- package/dist/core/file-system/fs.module.js.map +1 -0
- package/dist/core/file-system/fs.service.d.ts +8 -0
- package/dist/core/file-system/fs.service.js +62 -0
- package/dist/core/file-system/fs.service.js.map +1 -0
- package/dist/core/ui/ui.module.d.ts +2 -0
- package/dist/core/ui/ui.module.js +22 -0
- package/dist/core/ui/ui.module.js.map +1 -0
- package/dist/core/ui/ui.service.d.ts +22 -0
- package/dist/core/ui/ui.service.js +43 -0
- package/dist/core/ui/ui.service.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/shared/ai/ai.module.d.ts +2 -0
- package/dist/shared/ai/ai.module.js +23 -0
- package/dist/shared/ai/ai.module.js.map +1 -0
- package/dist/shared/ai/ai.service.d.ts +27 -0
- package/dist/shared/ai/ai.service.js +126 -0
- package/dist/shared/ai/ai.service.js.map +1 -0
- package/dist/shared/cleaner/cleaner.service.d.ts +18 -0
- package/dist/shared/cleaner/cleaner.service.js +187 -0
- package/dist/shared/cleaner/cleaner.service.js.map +1 -0
- package/dist/shared/cleaner/cleaner.types.d.ts +14 -0
- package/dist/shared/cleaner/cleaner.types.js +3 -0
- package/dist/shared/cleaner/cleaner.types.js.map +1 -0
- package/dist/shared/git/git.module.d.ts +2 -0
- package/dist/shared/git/git.module.js +23 -0
- package/dist/shared/git/git.module.js.map +1 -0
- package/dist/shared/git/git.service.d.ts +11 -0
- package/dist/shared/git/git.service.js +61 -0
- package/dist/shared/git/git.service.js.map +1 -0
- package/dist/shared/tokenizer/tokenizer.module.d.ts +2 -0
- package/dist/shared/tokenizer/tokenizer.module.js +23 -0
- package/dist/shared/tokenizer/tokenizer.module.js.map +1 -0
- package/dist/shared/tokenizer/tokenizer.service.d.ts +15 -0
- package/dist/shared/tokenizer/tokenizer.service.js +59 -0
- package/dist/shared/tokenizer/tokenizer.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/docs/plan.md +92 -0
- package/docs/project_charter.md +92 -0
- package/docs/todo.md +5 -0
- package/knip.json +10 -0
- package/kodu.json +22 -0
- package/nest-cli.json +8 -0
- package/package.json +41 -41
- package/src/app.module.ts +29 -0
- package/src/commands/clean/clean.command.ts +83 -0
- package/src/commands/clean/clean.module.ts +12 -0
- package/src/commands/commit/commit.command.ts +120 -0
- package/src/commands/commit/commit.module.ts +12 -0
- package/src/commands/init/init.command.ts +193 -0
- package/src/commands/init/init.module.ts +9 -0
- package/src/commands/pack/pack.command.ts +167 -0
- package/src/commands/pack/pack.module.ts +12 -0
- package/src/commands/review/review.command.ts +266 -0
- package/src/commands/review/review.module.ts +13 -0
- package/src/core/config/config.module.ts +9 -0
- package/src/core/config/config.schema.ts +50 -0
- package/src/core/config/config.service.ts +46 -0
- package/src/core/config/config.types.ts +1 -0
- package/src/core/file-system/fs.module.ts +8 -0
- package/src/core/file-system/fs.service.ts +44 -0
- package/src/core/ui/ui.module.ts +9 -0
- package/src/core/ui/ui.service.ts +39 -0
- package/src/main.ts +9 -0
- package/src/shared/ai/ai.module.ts +10 -0
- package/src/shared/ai/ai.service.ts +160 -0
- package/src/shared/cleaner/cleaner.service.ts +227 -0
- package/src/shared/cleaner/cleaner.types.ts +16 -0
- package/src/shared/git/git.module.ts +10 -0
- package/src/shared/git/git.service.ts +49 -0
- package/src/shared/tokenizer/tokenizer.module.ts +10 -0
- package/src/shared/tokenizer/tokenizer.service.ts +54 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +25 -0
- package/LICENSE +0 -21
- package/dist/index.js +0 -146
|
@@ -0,0 +1,22 @@
|
|
|
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.UiModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const ui_service_1 = require("./ui.service");
|
|
12
|
+
let UiModule = class UiModule {
|
|
13
|
+
};
|
|
14
|
+
exports.UiModule = UiModule;
|
|
15
|
+
exports.UiModule = UiModule = __decorate([
|
|
16
|
+
(0, common_1.Global)(),
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
providers: [ui_service_1.UiService],
|
|
19
|
+
exports: [ui_service_1.UiService],
|
|
20
|
+
})
|
|
21
|
+
], UiModule);
|
|
22
|
+
//# sourceMappingURL=ui.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.module.js","sourceRoot":"","sources":["../../../src/core/ui/ui.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,6CAAyC;AAOlC,IAAM,QAAQ,GAAd,MAAM,QAAQ;CAAG,CAAA;AAAX,4BAAQ;mBAAR,QAAQ;IALpB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,sBAAS,CAAC;QACtB,OAAO,EAAE,CAAC,sBAAS,CAAC;KACrB,CAAC;GACW,QAAQ,CAAG"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import confirm from '@inquirer/confirm';
|
|
2
|
+
import input from '@inquirer/input';
|
|
3
|
+
import select from '@inquirer/select';
|
|
4
|
+
import { type Spinner, type Options as SpinnerOptions } from 'yocto-spinner';
|
|
5
|
+
type InputOptions = Parameters<typeof input>[0];
|
|
6
|
+
type ConfirmOptions = Parameters<typeof confirm>[0];
|
|
7
|
+
type SelectOptions<TValue> = Parameters<typeof select<TValue>>[0];
|
|
8
|
+
export declare class UiService {
|
|
9
|
+
readonly log: {
|
|
10
|
+
success: (message: string) => void;
|
|
11
|
+
warn: (message: string) => void;
|
|
12
|
+
error: (message: string) => void;
|
|
13
|
+
info: (message: string) => void;
|
|
14
|
+
};
|
|
15
|
+
createSpinner(options?: SpinnerOptions & {
|
|
16
|
+
text?: string;
|
|
17
|
+
}): Spinner;
|
|
18
|
+
promptInput(options: InputOptions): Promise<string>;
|
|
19
|
+
promptConfirm(options: ConfirmOptions): Promise<boolean>;
|
|
20
|
+
promptSelect<TValue>(options: SelectOptions<TValue>): Promise<TValue>;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UiService = void 0;
|
|
13
|
+
const confirm_1 = __importDefault(require("@inquirer/confirm"));
|
|
14
|
+
const input_1 = __importDefault(require("@inquirer/input"));
|
|
15
|
+
const select_1 = __importDefault(require("@inquirer/select"));
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
18
|
+
const yocto_spinner_1 = __importDefault(require("yocto-spinner"));
|
|
19
|
+
let UiService = class UiService {
|
|
20
|
+
log = {
|
|
21
|
+
success: (message) => console.log(picocolors_1.default.green(`✔ ${message}`)),
|
|
22
|
+
warn: (message) => console.log(picocolors_1.default.yellow(`⚠ ${message}`)),
|
|
23
|
+
error: (message) => console.log(picocolors_1.default.red(`✖ ${message}`)),
|
|
24
|
+
info: (message) => console.log(picocolors_1.default.cyan(`ℹ ${message}`)),
|
|
25
|
+
};
|
|
26
|
+
createSpinner(options) {
|
|
27
|
+
return (0, yocto_spinner_1.default)({ text: options?.text ?? '', ...options });
|
|
28
|
+
}
|
|
29
|
+
promptInput(options) {
|
|
30
|
+
return (0, input_1.default)(options);
|
|
31
|
+
}
|
|
32
|
+
promptConfirm(options) {
|
|
33
|
+
return (0, confirm_1.default)(options);
|
|
34
|
+
}
|
|
35
|
+
promptSelect(options) {
|
|
36
|
+
return (0, select_1.default)(options);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.UiService = UiService;
|
|
40
|
+
exports.UiService = UiService = __decorate([
|
|
41
|
+
(0, common_1.Injectable)()
|
|
42
|
+
], UiService);
|
|
43
|
+
//# sourceMappingURL=ui.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.service.js","sourceRoot":"","sources":["../../../src/core/ui/ui.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gEAAwC;AACxC,4DAAoC;AACpC,8DAAsC;AACtC,2CAA4C;AAC5C,4DAA4B;AAC5B,kEAGuB;AAOhB,IAAM,SAAS,GAAf,MAAM,SAAS;IACX,GAAG,GAAG;QACb,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QACjE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;KAChE,CAAC;IAEF,aAAa,CAAC,OAA4C;QACxD,OAAO,IAAA,uBAAY,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,WAAW,CAAC,OAAqB;QAC/B,OAAO,IAAA,eAAK,EAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,aAAa,CAAC,OAAuB;QACnC,OAAO,IAAA,iBAAO,EAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,YAAY,CAAS,OAA8B;QACjD,OAAO,IAAA,gBAAM,EAAS,OAAO,CAAC,CAAC;IACjC,CAAC;CACF,CAAA;AAvBY,8BAAS;oBAAT,SAAS;IADrB,IAAA,mBAAU,GAAE;GACA,SAAS,CAuBrB"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const nest_commander_1 = require("nest-commander");
|
|
5
|
+
const app_module_1 = require("./app.module");
|
|
6
|
+
async function bootstrap() {
|
|
7
|
+
await nest_commander_1.CommandFactory.run(app_module_1.AppModule);
|
|
8
|
+
}
|
|
9
|
+
bootstrap();
|
|
10
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AAEA,mDAAgD;AAChD,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,+BAAc,CAAC,GAAG,CAAC,sBAAS,CAAC,CAAC;AACtC,CAAC;AACD,SAAS,EAAE,CAAC"}
|
|
@@ -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.AiModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const config_module_1 = require("../../core/config/config.module");
|
|
12
|
+
const ai_service_1 = require("./ai.service");
|
|
13
|
+
let AiModule = class AiModule {
|
|
14
|
+
};
|
|
15
|
+
exports.AiModule = AiModule;
|
|
16
|
+
exports.AiModule = AiModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [config_module_1.ConfigModule],
|
|
19
|
+
providers: [ai_service_1.AiService],
|
|
20
|
+
exports: [ai_service_1.AiService],
|
|
21
|
+
})
|
|
22
|
+
], AiModule);
|
|
23
|
+
//# sourceMappingURL=ai.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.module.js","sourceRoot":"","sources":["../../../src/shared/ai/ai.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,6CAAyC;AAOlC,IAAM,QAAQ,GAAd,MAAM,QAAQ;CAAG,CAAA;AAAX,4BAAQ;mBAAR,QAAQ;IALpB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,SAAS,EAAE,CAAC,sBAAS,CAAC;QACtB,OAAO,EAAE,CAAC,sBAAS,CAAC;KACrB,CAAC;GACW,QAAQ,CAAG"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ConfigService } from '../../core/config/config.service';
|
|
2
|
+
export type ReviewMode = 'bug' | 'style' | 'security';
|
|
3
|
+
type ReviewIssue = {
|
|
4
|
+
severity: 'low' | 'medium' | 'high';
|
|
5
|
+
file?: string;
|
|
6
|
+
line?: number;
|
|
7
|
+
message: string;
|
|
8
|
+
};
|
|
9
|
+
export type ReviewResult = {
|
|
10
|
+
summary: string;
|
|
11
|
+
issues: ReviewIssue[];
|
|
12
|
+
};
|
|
13
|
+
export declare class AiService {
|
|
14
|
+
private readonly configService;
|
|
15
|
+
constructor(configService: ConfigService);
|
|
16
|
+
reviewDiff(diff: string, mode: ReviewMode, structured: boolean): Promise<{
|
|
17
|
+
text: string;
|
|
18
|
+
structured?: ReviewResult;
|
|
19
|
+
}>;
|
|
20
|
+
generateCommitMessage(diff: string): Promise<string>;
|
|
21
|
+
private createAgent;
|
|
22
|
+
private buildReviewPrompt;
|
|
23
|
+
private getApiKey;
|
|
24
|
+
private getModelId;
|
|
25
|
+
private cleanCommitMessage;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AiService = void 0;
|
|
13
|
+
const agent_1 = require("@mastra/core/agent");
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const zod_1 = require("zod");
|
|
16
|
+
const config_service_1 = require("../../core/config/config.service");
|
|
17
|
+
let AiService = class AiService {
|
|
18
|
+
configService;
|
|
19
|
+
constructor(configService) {
|
|
20
|
+
this.configService = configService;
|
|
21
|
+
}
|
|
22
|
+
async reviewDiff(diff, mode, structured) {
|
|
23
|
+
const agent = this.createAgent('kodu-review-agent', 'AI Reviewer for staged git diff. Be concise.');
|
|
24
|
+
const userPrompt = this.buildReviewPrompt(diff, mode);
|
|
25
|
+
if (structured) {
|
|
26
|
+
const schema = zod_1.z.object({
|
|
27
|
+
summary: zod_1.z.string(),
|
|
28
|
+
issues: zod_1.z
|
|
29
|
+
.array(zod_1.z.object({
|
|
30
|
+
severity: zod_1.z.enum(['low', 'medium', 'high']).default('low'),
|
|
31
|
+
file: zod_1.z.string().optional(),
|
|
32
|
+
line: zod_1.z.number().int().positive().optional(),
|
|
33
|
+
message: zod_1.z.string(),
|
|
34
|
+
}))
|
|
35
|
+
.default([]),
|
|
36
|
+
});
|
|
37
|
+
const output = await agent.generate(userPrompt, {
|
|
38
|
+
structuredOutput: { schema },
|
|
39
|
+
});
|
|
40
|
+
return { text: output.text.trim(), structured: output.object };
|
|
41
|
+
}
|
|
42
|
+
const output = await agent.generate(userPrompt);
|
|
43
|
+
return { text: output.text.trim() };
|
|
44
|
+
}
|
|
45
|
+
async generateCommitMessage(diff) {
|
|
46
|
+
const agent = this.createAgent('kodu-commit-agent', 'Generate a concise Conventional Commit message. Only output the message string.');
|
|
47
|
+
const output = await agent.generate(`
|
|
48
|
+
You generate Conventional Commit messages.
|
|
49
|
+
Rules:
|
|
50
|
+
- Format: <type>(<optional scope>): <subject>
|
|
51
|
+
- Lowercase subject, no trailing period.
|
|
52
|
+
- Keep under 70 characters.
|
|
53
|
+
- Summarize the diff accurately.
|
|
54
|
+
|
|
55
|
+
Diff:
|
|
56
|
+
${diff}
|
|
57
|
+
`.trim());
|
|
58
|
+
const raw = output.text.trim();
|
|
59
|
+
const cleaned = this.cleanCommitMessage(raw);
|
|
60
|
+
if (!cleaned) {
|
|
61
|
+
throw new Error('AI не вернул валидное сообщение коммита.');
|
|
62
|
+
}
|
|
63
|
+
return cleaned;
|
|
64
|
+
}
|
|
65
|
+
createAgent(id, instructions) {
|
|
66
|
+
const apiKey = this.getApiKey();
|
|
67
|
+
const modelId = this.getModelId();
|
|
68
|
+
return new agent_1.Agent({
|
|
69
|
+
id,
|
|
70
|
+
name: id,
|
|
71
|
+
instructions,
|
|
72
|
+
model: { id: modelId, apiKey },
|
|
73
|
+
maxRetries: 1,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
buildReviewPrompt(diff, mode) {
|
|
77
|
+
const focusByMode = {
|
|
78
|
+
bug: 'Найди потенциальные баги, логические ошибки, регрессы.',
|
|
79
|
+
style: 'Проверь читаемость, согласованность, форматирование и нейминг.',
|
|
80
|
+
security: 'Найди уязвимости, утечки секретов, неправильные проверки прав.',
|
|
81
|
+
};
|
|
82
|
+
return `
|
|
83
|
+
Ты — строгий ревьюер кода. Формат ответа: краткий markdown с пунктами.
|
|
84
|
+
Режим: ${mode}. ${focusByMode[mode]}
|
|
85
|
+
Дай сжатый список проблем и рекомендаций. Если критичных нет — скажи об этом.
|
|
86
|
+
|
|
87
|
+
Diff:
|
|
88
|
+
${diff}
|
|
89
|
+
`.trim();
|
|
90
|
+
}
|
|
91
|
+
getApiKey() {
|
|
92
|
+
const envName = this.configService.getConfig().llm.apiKeyEnv ?? 'OPENAI_API_KEY';
|
|
93
|
+
const value = process.env[envName];
|
|
94
|
+
if (!value) {
|
|
95
|
+
throw new Error(`Не найден API ключ: установите ${envName} в окружении.`);
|
|
96
|
+
}
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
getModelId() {
|
|
100
|
+
const model = this.configService.getConfig().llm.model;
|
|
101
|
+
const normalized = model.includes('/') ? model : `openai/${model}`;
|
|
102
|
+
return normalized;
|
|
103
|
+
}
|
|
104
|
+
cleanCommitMessage(text) {
|
|
105
|
+
const unfenced = text.replace(/^```[a-zA-Z]*\s*/g, '').replace(/```$/g, '');
|
|
106
|
+
const lines = unfenced
|
|
107
|
+
.split('\n')
|
|
108
|
+
.map((line) => line.trim())
|
|
109
|
+
.filter((line) => line.length > 0);
|
|
110
|
+
if (lines.length === 0) {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
const first = lines[0]
|
|
114
|
+
.replace(/^"|"$/g, '')
|
|
115
|
+
.replace(/^'|'$/g, '')
|
|
116
|
+
.replace(/^Commit message:?\s*/i, '')
|
|
117
|
+
.trim();
|
|
118
|
+
return first;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
exports.AiService = AiService;
|
|
122
|
+
exports.AiService = AiService = __decorate([
|
|
123
|
+
(0, common_1.Injectable)(),
|
|
124
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
125
|
+
], AiService);
|
|
126
|
+
//# sourceMappingURL=ai.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../src/shared/ai/ai.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ConfigService } from '../../core/config/config.service';
|
|
2
|
+
import { FsService } from '../../core/file-system/fs.service';
|
|
3
|
+
import { type CleanOptions, type CleanSummary } from './cleaner.types';
|
|
4
|
+
export declare class CleanerService {
|
|
5
|
+
private readonly configService;
|
|
6
|
+
private readonly fsService;
|
|
7
|
+
private readonly project;
|
|
8
|
+
private readonly systemWhitelist;
|
|
9
|
+
constructor(configService: ConfigService, fsService: FsService);
|
|
10
|
+
cleanFiles(files: string[], options?: CleanOptions): Promise<CleanSummary>;
|
|
11
|
+
private cleanSource;
|
|
12
|
+
private collectCommentRanges;
|
|
13
|
+
private shouldRemove;
|
|
14
|
+
private normalizePreview;
|
|
15
|
+
private getReplacement;
|
|
16
|
+
private buildWhitelist;
|
|
17
|
+
private writeFile;
|
|
18
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CleanerService = void 0;
|
|
16
|
+
const node_fs_1 = require("node:fs");
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const ts_morph_1 = require("ts-morph");
|
|
20
|
+
const config_service_1 = require("../../core/config/config.service");
|
|
21
|
+
const fs_service_1 = require("../../core/file-system/fs.service");
|
|
22
|
+
let CleanerService = class CleanerService {
|
|
23
|
+
configService;
|
|
24
|
+
fsService;
|
|
25
|
+
project = new ts_morph_1.Project({
|
|
26
|
+
useInMemoryFileSystem: false,
|
|
27
|
+
skipFileDependencyResolution: true,
|
|
28
|
+
compilerOptions: {
|
|
29
|
+
allowJs: true,
|
|
30
|
+
jsx: ts_morph_1.ts.JsxEmit.Preserve,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
systemWhitelist = [
|
|
34
|
+
'@ts-ignore',
|
|
35
|
+
'@ts-expect-error',
|
|
36
|
+
'eslint-disable',
|
|
37
|
+
'prettier-ignore',
|
|
38
|
+
'biome-ignore',
|
|
39
|
+
'todo',
|
|
40
|
+
'fixme',
|
|
41
|
+
];
|
|
42
|
+
constructor(configService, fsService) {
|
|
43
|
+
this.configService = configService;
|
|
44
|
+
this.fsService = fsService;
|
|
45
|
+
}
|
|
46
|
+
async cleanFiles(files, options = {}) {
|
|
47
|
+
const config = this.configService.getConfig();
|
|
48
|
+
const whitelist = this.buildWhitelist(config.cleaner.whitelist);
|
|
49
|
+
let commentsRemoved = 0;
|
|
50
|
+
let filesChanged = 0;
|
|
51
|
+
const reports = [];
|
|
52
|
+
for (const file of files) {
|
|
53
|
+
const original = await this.fsService.readFileRelative(file);
|
|
54
|
+
const result = this.cleanSource(file, original, whitelist, config.cleaner.keepJSDoc);
|
|
55
|
+
if (result.removed > 0) {
|
|
56
|
+
filesChanged += 1;
|
|
57
|
+
commentsRemoved += result.removed;
|
|
58
|
+
if (!options.dryRun) {
|
|
59
|
+
await this.writeFile(file, result.nextContent);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
reports.push({
|
|
63
|
+
file,
|
|
64
|
+
removed: result.removed,
|
|
65
|
+
previews: result.previews,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
filesProcessed: files.length,
|
|
70
|
+
filesChanged,
|
|
71
|
+
commentsRemoved,
|
|
72
|
+
reports,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
cleanSource(file, content, whitelist, keepJSDoc) {
|
|
76
|
+
const sourceFile = this.project.createSourceFile(file, content, {
|
|
77
|
+
overwrite: true,
|
|
78
|
+
});
|
|
79
|
+
const fullText = sourceFile.getFullText();
|
|
80
|
+
const ranges = this.collectCommentRanges(sourceFile);
|
|
81
|
+
const candidates = ranges.filter((range) => this.shouldRemove(range, whitelist, keepJSDoc));
|
|
82
|
+
if (candidates.length === 0) {
|
|
83
|
+
return { nextContent: content, removed: 0, previews: [] };
|
|
84
|
+
}
|
|
85
|
+
const previews = candidates
|
|
86
|
+
.slice(0, 3)
|
|
87
|
+
.map((range) => this.normalizePreview(range.text));
|
|
88
|
+
const sorted = [...candidates].sort((a, b) => b.start - a.start);
|
|
89
|
+
let nextContent = fullText;
|
|
90
|
+
for (const range of sorted) {
|
|
91
|
+
const replacement = this.getReplacement(fullText, range);
|
|
92
|
+
nextContent = `${nextContent.slice(0, range.start)}${replacement}${nextContent.slice(range.end)}`;
|
|
93
|
+
}
|
|
94
|
+
return { nextContent, removed: candidates.length, previews };
|
|
95
|
+
}
|
|
96
|
+
collectCommentRanges(sourceFile) {
|
|
97
|
+
const fullText = sourceFile.getFullText();
|
|
98
|
+
const ranges = new Map();
|
|
99
|
+
const addRanges = (items) => {
|
|
100
|
+
if (!items)
|
|
101
|
+
return;
|
|
102
|
+
for (const item of items) {
|
|
103
|
+
const key = `${item.pos}:${item.end}`;
|
|
104
|
+
if (ranges.has(key))
|
|
105
|
+
continue;
|
|
106
|
+
ranges.set(key, {
|
|
107
|
+
start: item.pos,
|
|
108
|
+
end: item.end,
|
|
109
|
+
text: fullText.slice(item.pos, item.end),
|
|
110
|
+
kind: 'comment',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const visit = (node) => {
|
|
115
|
+
addRanges(ts_morph_1.ts.getLeadingCommentRanges(fullText, node.getFullStart()));
|
|
116
|
+
addRanges(ts_morph_1.ts.getTrailingCommentRanges(fullText, node.getEnd()));
|
|
117
|
+
ts_morph_1.ts.forEachChild(node, visit);
|
|
118
|
+
};
|
|
119
|
+
visit(sourceFile.compilerNode);
|
|
120
|
+
const jsxExpressions = sourceFile.getDescendantsOfKind(ts_morph_1.SyntaxKind.JsxExpression);
|
|
121
|
+
for (const jsx of jsxExpressions) {
|
|
122
|
+
if (jsx.getExpression())
|
|
123
|
+
continue;
|
|
124
|
+
const text = jsx.getText();
|
|
125
|
+
if (!text.includes('/*'))
|
|
126
|
+
continue;
|
|
127
|
+
const start = jsx.getPos();
|
|
128
|
+
const end = jsx.getEnd();
|
|
129
|
+
const key = `${start}:${end}`;
|
|
130
|
+
if (!ranges.has(key)) {
|
|
131
|
+
ranges.set(key, {
|
|
132
|
+
start,
|
|
133
|
+
end,
|
|
134
|
+
text: fullText.slice(start, end),
|
|
135
|
+
kind: 'jsx',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return [...ranges.values()];
|
|
140
|
+
}
|
|
141
|
+
shouldRemove(range, whitelist, keepJSDoc) {
|
|
142
|
+
const trimmed = range.text.trimStart();
|
|
143
|
+
if (keepJSDoc && trimmed.startsWith('/**')) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const lower = range.text.toLowerCase();
|
|
147
|
+
for (const token of whitelist) {
|
|
148
|
+
if (lower.includes(token)) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
normalizePreview(text) {
|
|
155
|
+
const singleLine = text.replace(/\s+/g, ' ').trim();
|
|
156
|
+
if (singleLine.length <= 50)
|
|
157
|
+
return singleLine;
|
|
158
|
+
return `${singleLine.slice(0, 47)}...`;
|
|
159
|
+
}
|
|
160
|
+
getReplacement(original, range) {
|
|
161
|
+
if (range.kind === 'jsx') {
|
|
162
|
+
return '';
|
|
163
|
+
}
|
|
164
|
+
const before = range.start > 0 ? original[range.start - 1] : '';
|
|
165
|
+
const after = range.end < original.length ? original[range.end] : '';
|
|
166
|
+
const isIdentifier = (ch) => /[A-Za-z0-9_$]/.test(ch);
|
|
167
|
+
if (isIdentifier(before) && isIdentifier(after)) {
|
|
168
|
+
return ' ';
|
|
169
|
+
}
|
|
170
|
+
return '';
|
|
171
|
+
}
|
|
172
|
+
buildWhitelist(userList) {
|
|
173
|
+
const normalized = userList.map((item) => item.toLowerCase());
|
|
174
|
+
return new Set([...this.systemWhitelist, ...normalized]);
|
|
175
|
+
}
|
|
176
|
+
async writeFile(file, content) {
|
|
177
|
+
const absolute = node_path_1.default.resolve(process.cwd(), file);
|
|
178
|
+
await node_fs_1.promises.writeFile(absolute, content, 'utf8');
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
exports.CleanerService = CleanerService;
|
|
182
|
+
exports.CleanerService = CleanerService = __decorate([
|
|
183
|
+
(0, common_1.Injectable)(),
|
|
184
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService,
|
|
185
|
+
fs_service_1.FsService])
|
|
186
|
+
], CleanerService);
|
|
187
|
+
//# sourceMappingURL=cleaner.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaner.service.js","sourceRoot":"","sources":["../../../src/shared/cleaner/cleaner.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type CleanOptions = {
|
|
2
|
+
dryRun?: boolean;
|
|
3
|
+
};
|
|
4
|
+
export type FileCleanReport = {
|
|
5
|
+
file: string;
|
|
6
|
+
removed: number;
|
|
7
|
+
previews: string[];
|
|
8
|
+
};
|
|
9
|
+
export type CleanSummary = {
|
|
10
|
+
filesProcessed: number;
|
|
11
|
+
filesChanged: number;
|
|
12
|
+
commentsRemoved: number;
|
|
13
|
+
reports: FileCleanReport[];
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleaner.types.js","sourceRoot":"","sources":["../../../src/shared/cleaner/cleaner.types.ts"],"names":[],"mappings":""}
|
|
@@ -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.GitModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const config_module_1 = require("../../core/config/config.module");
|
|
12
|
+
const git_service_1 = require("./git.service");
|
|
13
|
+
let GitModule = class GitModule {
|
|
14
|
+
};
|
|
15
|
+
exports.GitModule = GitModule;
|
|
16
|
+
exports.GitModule = GitModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [config_module_1.ConfigModule],
|
|
19
|
+
providers: [git_service_1.GitService],
|
|
20
|
+
exports: [git_service_1.GitService],
|
|
21
|
+
})
|
|
22
|
+
], GitModule);
|
|
23
|
+
//# sourceMappingURL=git.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.module.js","sourceRoot":"","sources":["../../../src/shared/git/git.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,+CAA2C;AAOpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IALrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,SAAS,EAAE,CAAC,wBAAU,CAAC;QACvB,OAAO,EAAE,CAAC,wBAAU,CAAC;KACtB,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ConfigService } from '../../core/config/config.service';
|
|
2
|
+
export declare class GitService {
|
|
3
|
+
private readonly configService;
|
|
4
|
+
constructor(configService: ConfigService);
|
|
5
|
+
ensureRepo(): Promise<void>;
|
|
6
|
+
hasStagedChanges(): Promise<boolean>;
|
|
7
|
+
getStagedDiff(): Promise<string>;
|
|
8
|
+
getStatusShort(): Promise<string>;
|
|
9
|
+
commit(message: string): Promise<void>;
|
|
10
|
+
private buildExcludeArgs;
|
|
11
|
+
}
|