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.
Files changed (128) hide show
  1. package/.prettierrc +4 -0
  2. package/AGENTS.md +97 -0
  3. package/README.md +85 -100
  4. package/biome.json +50 -0
  5. package/dist/app.module.d.ts +2 -0
  6. package/dist/app.module.js +42 -0
  7. package/dist/app.module.js.map +1 -0
  8. package/dist/commands/clean/clean.command.d.ts +16 -0
  9. package/dist/commands/clean/clean.command.js +88 -0
  10. package/dist/commands/clean/clean.command.js.map +1 -0
  11. package/dist/commands/clean/clean.module.d.ts +2 -0
  12. package/dist/commands/clean/clean.module.js +25 -0
  13. package/dist/commands/clean/clean.module.js.map +1 -0
  14. package/dist/commands/commit/commit.command.d.ts +18 -0
  15. package/dist/commands/commit/commit.command.js +135 -0
  16. package/dist/commands/commit/commit.command.js.map +1 -0
  17. package/dist/commands/commit/commit.module.d.ts +2 -0
  18. package/dist/commands/commit/commit.module.js +25 -0
  19. package/dist/commands/commit/commit.module.js.map +1 -0
  20. package/dist/commands/init/init.command.d.ts +14 -0
  21. package/dist/commands/init/init.command.js +166 -0
  22. package/dist/commands/init/init.command.js.map +1 -0
  23. package/dist/commands/init/init.module.d.ts +2 -0
  24. package/dist/commands/init/init.module.js +22 -0
  25. package/dist/commands/init/init.module.js.map +1 -0
  26. package/dist/commands/pack/pack.command.d.ts +25 -0
  27. package/dist/commands/pack/pack.command.js +161 -0
  28. package/dist/commands/pack/pack.command.js.map +1 -0
  29. package/dist/commands/pack/pack.module.d.ts +2 -0
  30. package/dist/commands/pack/pack.module.js +25 -0
  31. package/dist/commands/pack/pack.module.js.map +1 -0
  32. package/dist/commands/review/review.command.d.ts +31 -0
  33. package/dist/commands/review/review.command.js +260 -0
  34. package/dist/commands/review/review.command.js.map +1 -0
  35. package/dist/commands/review/review.module.d.ts +2 -0
  36. package/dist/commands/review/review.module.js +26 -0
  37. package/dist/commands/review/review.module.js.map +1 -0
  38. package/dist/core/config/config.module.d.ts +2 -0
  39. package/dist/core/config/config.module.js +22 -0
  40. package/dist/core/config/config.module.js.map +1 -0
  41. package/dist/core/config/config.schema.d.ts +16 -0
  42. package/dist/core/config/config.schema.js +48 -0
  43. package/dist/core/config/config.schema.js.map +1 -0
  44. package/dist/core/config/config.service.d.ts +7 -0
  45. package/dist/core/config/config.service.js +51 -0
  46. package/dist/core/config/config.service.js.map +1 -0
  47. package/dist/core/config/config.types.d.ts +1 -0
  48. package/dist/core/config/config.types.js +3 -0
  49. package/dist/core/config/config.types.js.map +1 -0
  50. package/dist/core/file-system/fs.module.d.ts +2 -0
  51. package/dist/core/file-system/fs.module.js +21 -0
  52. package/dist/core/file-system/fs.module.js.map +1 -0
  53. package/dist/core/file-system/fs.service.d.ts +8 -0
  54. package/dist/core/file-system/fs.service.js +62 -0
  55. package/dist/core/file-system/fs.service.js.map +1 -0
  56. package/dist/core/ui/ui.module.d.ts +2 -0
  57. package/dist/core/ui/ui.module.js +22 -0
  58. package/dist/core/ui/ui.module.js.map +1 -0
  59. package/dist/core/ui/ui.service.d.ts +22 -0
  60. package/dist/core/ui/ui.service.js +43 -0
  61. package/dist/core/ui/ui.service.js.map +1 -0
  62. package/dist/main.d.ts +2 -0
  63. package/dist/main.js +10 -0
  64. package/dist/main.js.map +1 -0
  65. package/dist/shared/ai/ai.module.d.ts +2 -0
  66. package/dist/shared/ai/ai.module.js +23 -0
  67. package/dist/shared/ai/ai.module.js.map +1 -0
  68. package/dist/shared/ai/ai.service.d.ts +27 -0
  69. package/dist/shared/ai/ai.service.js +126 -0
  70. package/dist/shared/ai/ai.service.js.map +1 -0
  71. package/dist/shared/cleaner/cleaner.service.d.ts +18 -0
  72. package/dist/shared/cleaner/cleaner.service.js +187 -0
  73. package/dist/shared/cleaner/cleaner.service.js.map +1 -0
  74. package/dist/shared/cleaner/cleaner.types.d.ts +14 -0
  75. package/dist/shared/cleaner/cleaner.types.js +3 -0
  76. package/dist/shared/cleaner/cleaner.types.js.map +1 -0
  77. package/dist/shared/git/git.module.d.ts +2 -0
  78. package/dist/shared/git/git.module.js +23 -0
  79. package/dist/shared/git/git.module.js.map +1 -0
  80. package/dist/shared/git/git.service.d.ts +11 -0
  81. package/dist/shared/git/git.service.js +61 -0
  82. package/dist/shared/git/git.service.js.map +1 -0
  83. package/dist/shared/tokenizer/tokenizer.module.d.ts +2 -0
  84. package/dist/shared/tokenizer/tokenizer.module.js +23 -0
  85. package/dist/shared/tokenizer/tokenizer.module.js.map +1 -0
  86. package/dist/shared/tokenizer/tokenizer.service.d.ts +15 -0
  87. package/dist/shared/tokenizer/tokenizer.service.js +59 -0
  88. package/dist/shared/tokenizer/tokenizer.service.js.map +1 -0
  89. package/dist/tsconfig.build.tsbuildinfo +1 -0
  90. package/docs/plan.md +92 -0
  91. package/docs/project_charter.md +92 -0
  92. package/docs/todo.md +5 -0
  93. package/knip.json +10 -0
  94. package/kodu.json +22 -0
  95. package/nest-cli.json +8 -0
  96. package/package.json +41 -41
  97. package/src/app.module.ts +29 -0
  98. package/src/commands/clean/clean.command.ts +83 -0
  99. package/src/commands/clean/clean.module.ts +12 -0
  100. package/src/commands/commit/commit.command.ts +120 -0
  101. package/src/commands/commit/commit.module.ts +12 -0
  102. package/src/commands/init/init.command.ts +193 -0
  103. package/src/commands/init/init.module.ts +9 -0
  104. package/src/commands/pack/pack.command.ts +167 -0
  105. package/src/commands/pack/pack.module.ts +12 -0
  106. package/src/commands/review/review.command.ts +266 -0
  107. package/src/commands/review/review.module.ts +13 -0
  108. package/src/core/config/config.module.ts +9 -0
  109. package/src/core/config/config.schema.ts +50 -0
  110. package/src/core/config/config.service.ts +46 -0
  111. package/src/core/config/config.types.ts +1 -0
  112. package/src/core/file-system/fs.module.ts +8 -0
  113. package/src/core/file-system/fs.service.ts +44 -0
  114. package/src/core/ui/ui.module.ts +9 -0
  115. package/src/core/ui/ui.service.ts +39 -0
  116. package/src/main.ts +9 -0
  117. package/src/shared/ai/ai.module.ts +10 -0
  118. package/src/shared/ai/ai.service.ts +160 -0
  119. package/src/shared/cleaner/cleaner.service.ts +227 -0
  120. package/src/shared/cleaner/cleaner.types.ts +16 -0
  121. package/src/shared/git/git.module.ts +10 -0
  122. package/src/shared/git/git.service.ts +49 -0
  123. package/src/shared/tokenizer/tokenizer.module.ts +10 -0
  124. package/src/shared/tokenizer/tokenizer.service.ts +54 -0
  125. package/tsconfig.build.json +4 -0
  126. package/tsconfig.json +25 -0
  127. package/LICENSE +0 -21
  128. package/dist/index.js +0 -146
@@ -0,0 +1,61 @@
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.GitService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const execa_1 = require("execa");
15
+ const config_service_1 = require("../../core/config/config.service");
16
+ const EXCLUDE_PREFIX = ':(exclude)';
17
+ let GitService = class GitService {
18
+ configService;
19
+ constructor(configService) {
20
+ this.configService = configService;
21
+ }
22
+ async ensureRepo() {
23
+ try {
24
+ await (0, execa_1.execa)('git', ['rev-parse', '--is-inside-work-tree']);
25
+ }
26
+ catch (error) {
27
+ const message = error instanceof Error && 'stdout' in error
28
+ ? String(error.stderr ?? error.message)
29
+ : 'Git репозиторий не найден. Инициализируйте git перед выполнением команды.';
30
+ throw new Error(message);
31
+ }
32
+ }
33
+ async hasStagedChanges() {
34
+ const { stdout } = await (0, execa_1.execa)('git', ['diff', '--staged', '--name-only']);
35
+ return stdout.trim().length > 0;
36
+ }
37
+ async getStagedDiff() {
38
+ await this.ensureRepo();
39
+ const excludeArgs = this.buildExcludeArgs();
40
+ const args = ['diff', '--staged', '--unified=3', '--', '.', ...excludeArgs];
41
+ const { stdout } = await (0, execa_1.execa)('git', args);
42
+ return stdout;
43
+ }
44
+ async getStatusShort() {
45
+ const { stdout } = await (0, execa_1.execa)('git', ['status', '--short']);
46
+ return stdout.trim();
47
+ }
48
+ async commit(message) {
49
+ await (0, execa_1.execa)('git', ['commit', '-m', message]);
50
+ }
51
+ buildExcludeArgs() {
52
+ const ignore = this.configService.getConfig().packer.ignore ?? [];
53
+ return ignore.map((pattern) => `${EXCLUDE_PREFIX}${pattern}`);
54
+ }
55
+ };
56
+ exports.GitService = GitService;
57
+ exports.GitService = GitService = __decorate([
58
+ (0, common_1.Injectable)(),
59
+ __metadata("design:paramtypes", [config_service_1.ConfigService])
60
+ ], GitService);
61
+ //# sourceMappingURL=git.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../../src/shared/git/git.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,iCAA8B;AAC9B,qEAAiE;AAEjE,MAAM,cAAc,GAAG,YAAY,CAAC;AAG7B,IAAM,UAAU,GAAhB,MAAM,UAAU;IACQ;IAA7B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK;gBACzC,CAAC,CAAC,MAAM,CAAE,KAA6B,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;gBAChE,CAAC,CAAC,2EAA2E,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC;QAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,gBAAgB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AAzCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAEiC,8BAAa;GAD9C,UAAU,CAyCtB"}
@@ -0,0 +1,2 @@
1
+ export declare class TokenizerModule {
2
+ }
@@ -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.TokenizerModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_module_1 = require("../../core/config/config.module");
12
+ const tokenizer_service_1 = require("./tokenizer.service");
13
+ let TokenizerModule = class TokenizerModule {
14
+ };
15
+ exports.TokenizerModule = TokenizerModule;
16
+ exports.TokenizerModule = TokenizerModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [config_module_1.ConfigModule],
19
+ providers: [tokenizer_service_1.TokenizerService],
20
+ exports: [tokenizer_service_1.TokenizerService],
21
+ })
22
+ ], TokenizerModule);
23
+ //# sourceMappingURL=tokenizer.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.module.js","sourceRoot":"","sources":["../../../src/shared/tokenizer/tokenizer.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,2DAAuD;AAOhD,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,SAAS,EAAE,CAAC,oCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,oCAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,15 @@
1
+ import { ConfigService } from '../../core/config/config.service';
2
+ type TokenEstimate = {
3
+ tokens: number;
4
+ usdEstimate: number;
5
+ };
6
+ export declare class TokenizerService {
7
+ private readonly configService;
8
+ private encoder?;
9
+ constructor(configService: ConfigService);
10
+ count(text: string): TokenEstimate;
11
+ private getPricePerMillion;
12
+ private createEncoder;
13
+ private getEncoder;
14
+ }
15
+ export {};
@@ -0,0 +1,59 @@
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.TokenizerService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const js_tiktoken_1 = require("js-tiktoken");
15
+ const config_service_1 = require("../../core/config/config.service");
16
+ const PRICE_PER_MILLION = {
17
+ 'gpt-4o': 2.5,
18
+ 'gpt-4o-mini': 0.15,
19
+ o1: 15,
20
+ };
21
+ let TokenizerService = class TokenizerService {
22
+ configService;
23
+ encoder;
24
+ constructor(configService) {
25
+ this.configService = configService;
26
+ }
27
+ count(text) {
28
+ const tokens = this.getEncoder().encode(text).length;
29
+ const price = this.getPricePerMillion();
30
+ const usdEstimate = price > 0 ? (tokens / 1_000_000) * price : 0;
31
+ return { tokens, usdEstimate };
32
+ }
33
+ getPricePerMillion() {
34
+ const model = this.configService.getConfig().llm.model;
35
+ const key = model.toLowerCase();
36
+ return PRICE_PER_MILLION[key] ?? 0;
37
+ }
38
+ createEncoder() {
39
+ const model = this.configService.getConfig().llm.model;
40
+ try {
41
+ return (0, js_tiktoken_1.encodingForModel)(model);
42
+ }
43
+ catch {
44
+ return (0, js_tiktoken_1.encodingForModel)('gpt-4o');
45
+ }
46
+ }
47
+ getEncoder() {
48
+ if (!this.encoder) {
49
+ this.encoder = this.createEncoder();
50
+ }
51
+ return this.encoder;
52
+ }
53
+ };
54
+ exports.TokenizerService = TokenizerService;
55
+ exports.TokenizerService = TokenizerService = __decorate([
56
+ (0, common_1.Injectable)(),
57
+ __metadata("design:paramtypes", [config_service_1.ConfigService])
58
+ ], TokenizerService);
59
+ //# sourceMappingURL=tokenizer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.service.js","sourceRoot":"","sources":["../../../src/shared/tokenizer/tokenizer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmE;AACnE,qEAAiE;AAOjE,MAAM,iBAAiB,GAA2B;IAChD,QAAQ,EAAE,GAAG;IACb,aAAa,EAAE,IAAI;IACnB,EAAE,EAAE,EAAE;CACP,CAAC;AAGK,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGE;IAFrB,OAAO,CAAuC;IAEtD,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAEO,kBAAkB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACvD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAEvD,IAAI,CAAC;YACH,OAAO,IAAA,8BAAgB,EAAC,KAAsB,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YAEP,OAAO,IAAA,8BAAgB,EAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF,CAAA;AArCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAIiC,8BAAa;GAH9C,gBAAgB,CAqC5B"}