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,135 @@
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.CommitCommand = void 0;
13
+ const promises_1 = require("node:fs/promises");
14
+ const nest_commander_1 = require("nest-commander");
15
+ const ui_service_1 = require("../../core/ui/ui.service");
16
+ const ai_service_1 = require("../../shared/ai/ai.service");
17
+ const git_service_1 = require("../../shared/git/git.service");
18
+ let CommitCommand = class CommitCommand extends nest_commander_1.CommandRunner {
19
+ ui;
20
+ git;
21
+ ai;
22
+ constructor(ui, git, ai) {
23
+ super();
24
+ this.ui = ui;
25
+ this.git = git;
26
+ this.ai = ai;
27
+ }
28
+ parseCi() {
29
+ return true;
30
+ }
31
+ parseOutput(value) {
32
+ return value;
33
+ }
34
+ async run(_inputs, options = {}) {
35
+ const ciMode = Boolean(options.ci);
36
+ const spinner = ciMode
37
+ ? undefined
38
+ : this.ui.createSpinner({ text: 'Собираю diff...' }).start();
39
+ const logProgress = (text) => {
40
+ if (ciMode) {
41
+ return;
42
+ }
43
+ if (spinner) {
44
+ spinner.text = text;
45
+ return;
46
+ }
47
+ this.ui.log.info(text);
48
+ };
49
+ const finishProgress = (text) => {
50
+ if (ciMode) {
51
+ return;
52
+ }
53
+ if (spinner) {
54
+ spinner.success(text);
55
+ return;
56
+ }
57
+ this.ui.log.success(text);
58
+ };
59
+ try {
60
+ await this.git.ensureRepo();
61
+ const hasStaged = await this.git.hasStagedChanges();
62
+ if (!hasStaged) {
63
+ if (spinner) {
64
+ spinner.stop('Нет застейдженных изменений');
65
+ }
66
+ else {
67
+ this.ui.log.info('Нет застейдженных изменений');
68
+ }
69
+ this.ui.log.warn('Сначала выполните git add для нужных файлов.');
70
+ return;
71
+ }
72
+ const diff = await this.git.getStagedDiff();
73
+ if (!diff.trim()) {
74
+ if (spinner) {
75
+ spinner.stop('Diff пуст — возможно, всё исключено packer.ignore');
76
+ }
77
+ else {
78
+ this.ui.log.info('Diff пуст — возможно, всё исключено packer.ignore');
79
+ }
80
+ this.ui.log.warn('Diff пустой: все изменения попали в исключения packer.ignore.');
81
+ return;
82
+ }
83
+ logProgress('Генерирую сообщение коммита...');
84
+ const commitMessage = await this.ai.generateCommitMessage(diff);
85
+ finishProgress('Сообщение готово');
86
+ if (!ciMode) {
87
+ this.ui.log.info(`Предложение: ${commitMessage}`);
88
+ }
89
+ console.log(commitMessage);
90
+ if (options.output) {
91
+ await (0, promises_1.writeFile)(options.output, commitMessage, { encoding: 'utf8' });
92
+ if (!ciMode) {
93
+ this.ui.log.success(`Сообщение сохранено в ${options.output}`);
94
+ }
95
+ }
96
+ }
97
+ catch (error) {
98
+ if (spinner) {
99
+ spinner.error('Ошибка при создании коммита');
100
+ }
101
+ else {
102
+ this.ui.log.error('Ошибка при создании коммита');
103
+ }
104
+ const message = error instanceof Error ? error.message : 'Неизвестная ошибка';
105
+ this.ui.log.error(message);
106
+ process.exitCode = 1;
107
+ }
108
+ }
109
+ };
110
+ exports.CommitCommand = CommitCommand;
111
+ __decorate([
112
+ (0, nest_commander_1.Option)({ flags: '--ci', description: 'CI-режим: без спиннеров и диалогов' }),
113
+ __metadata("design:type", Function),
114
+ __metadata("design:paramtypes", []),
115
+ __metadata("design:returntype", Boolean)
116
+ ], CommitCommand.prototype, "parseCi", null);
117
+ __decorate([
118
+ (0, nest_commander_1.Option)({
119
+ flags: '-o, --output <path>',
120
+ description: 'Сохранить сообщение в файл',
121
+ }),
122
+ __metadata("design:type", Function),
123
+ __metadata("design:paramtypes", [String]),
124
+ __metadata("design:returntype", String)
125
+ ], CommitCommand.prototype, "parseOutput", null);
126
+ exports.CommitCommand = CommitCommand = __decorate([
127
+ (0, nest_commander_1.Command)({
128
+ name: 'commit',
129
+ description: 'Сгенерировать и применить сообщение коммита',
130
+ }),
131
+ __metadata("design:paramtypes", [ui_service_1.UiService,
132
+ git_service_1.GitService,
133
+ ai_service_1.AiService])
134
+ ], CommitCommand);
135
+ //# sourceMappingURL=commit.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.command.js","sourceRoot":"","sources":["../../../src/commands/commit/commit.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class CommitModule {
2
+ }
@@ -0,0 +1,25 @@
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.CommitModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_module_1 = require("../../core/config/config.module");
12
+ const ui_module_1 = require("../../core/ui/ui.module");
13
+ const ai_module_1 = require("../../shared/ai/ai.module");
14
+ const git_module_1 = require("../../shared/git/git.module");
15
+ const commit_command_1 = require("./commit.command");
16
+ let CommitModule = class CommitModule {
17
+ };
18
+ exports.CommitModule = CommitModule;
19
+ exports.CommitModule = CommitModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [config_module_1.ConfigModule, ui_module_1.UiModule, git_module_1.GitModule, ai_module_1.AiModule],
22
+ providers: [commit_command_1.CommitCommand],
23
+ })
24
+ ], CommitModule);
25
+ //# sourceMappingURL=commit.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.module.js","sourceRoot":"","sources":["../../../src/commands/commit/commit.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,uDAAmD;AACnD,yDAAqD;AACrD,4DAAwD;AACxD,qDAAiD;AAM1C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,oCAAY;uBAAZ,YAAY;IAJxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,EAAE,oBAAQ,EAAE,sBAAS,EAAE,oBAAQ,CAAC;QACtD,SAAS,EAAE,CAAC,8BAAa,CAAC;KAC3B,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,14 @@
1
+ import { CommandRunner } from 'nest-commander';
2
+ import { UiService } from '../../core/ui/ui.service';
3
+ export declare class InitCommand extends CommandRunner {
4
+ private readonly ui;
5
+ constructor(ui: UiService);
6
+ run(): Promise<void>;
7
+ private buildProviderQuestion;
8
+ private askIgnoreList;
9
+ private mergeWhitelist;
10
+ private writeConfig;
11
+ private ensureKoduFolders;
12
+ private ensureGitignore;
13
+ private fileExists;
14
+ }
@@ -0,0 +1,166 @@
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.InitCommand = void 0;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ const nest_commander_1 = require("nest-commander");
19
+ const ui_service_1 = require("../../core/ui/ui.service");
20
+ let InitCommand = class InitCommand extends nest_commander_1.CommandRunner {
21
+ ui;
22
+ constructor(ui) {
23
+ super();
24
+ this.ui = ui;
25
+ }
26
+ async run() {
27
+ const configPath = node_path_1.default.join(process.cwd(), 'kodu.json');
28
+ const defaultConfig = {
29
+ llm: { provider: 'openai', model: 'gpt-4o', apiKeyEnv: 'OPENAI_API_KEY' },
30
+ cleaner: { whitelist: ['//!'], keepJSDoc: true },
31
+ packer: {
32
+ ignore: [
33
+ 'package-lock.json',
34
+ 'yarn.lock',
35
+ 'pnpm-lock.yaml',
36
+ '.git',
37
+ '.kodu',
38
+ 'node_modules',
39
+ 'dist',
40
+ 'coverage',
41
+ ],
42
+ },
43
+ };
44
+ const provider = await this.ui.promptSelect(this.buildProviderQuestion(defaultConfig.llm.provider));
45
+ const extendIgnore = await this.ui.promptConfirm({
46
+ message: 'Изменить стандартный ignore-список?',
47
+ default: false,
48
+ });
49
+ const ignoreList = extendIgnore
50
+ ? await this.askIgnoreList(defaultConfig.packer.ignore)
51
+ : defaultConfig.packer.ignore;
52
+ const additionalWhitelist = await this.ui.promptInput({
53
+ message: 'Дополнительные префиксы для whitelist (через запятую, пусто — оставить дефолт):',
54
+ default: '',
55
+ });
56
+ const whitelist = this.mergeWhitelist(defaultConfig.cleaner.whitelist, additionalWhitelist);
57
+ const configToSave = {
58
+ llm: {
59
+ provider,
60
+ model: defaultConfig.llm.model,
61
+ apiKeyEnv: defaultConfig.llm.apiKeyEnv,
62
+ },
63
+ cleaner: { whitelist, keepJSDoc: defaultConfig.cleaner.keepJSDoc },
64
+ packer: { ignore: ignoreList },
65
+ };
66
+ await this.writeConfig(configPath, configToSave);
67
+ await this.ensureKoduFolders();
68
+ await this.ensureGitignore();
69
+ this.ui.log.success('Конфигурация Kodu создана.');
70
+ this.ui.log.info('🎉 Kodu initialized! Запустите `kodu pack`, чтобы продолжить.');
71
+ }
72
+ buildProviderQuestion(defaultProvider) {
73
+ return {
74
+ message: 'Выберите AI-провайдера',
75
+ choices: [{ name: 'OpenAI', value: 'openai' }],
76
+ default: defaultProvider,
77
+ };
78
+ }
79
+ async askIgnoreList(defaultIgnore) {
80
+ const answer = await this.ui.promptInput({
81
+ message: 'Укажите ignore-паттерны через запятую',
82
+ default: defaultIgnore.join(', '),
83
+ });
84
+ return answer
85
+ .split(',')
86
+ .map((item) => item.trim())
87
+ .filter((item) => item.length > 0);
88
+ }
89
+ mergeWhitelist(defaultWhitelist, extra) {
90
+ if (!extra.trim()) {
91
+ return defaultWhitelist;
92
+ }
93
+ const additions = extra
94
+ .split(',')
95
+ .map((item) => item.trim())
96
+ .filter((item) => item.length > 0);
97
+ return Array.from(new Set([...defaultWhitelist, ...additions]));
98
+ }
99
+ async writeConfig(configPath, config) {
100
+ if (await this.fileExists(configPath)) {
101
+ const overwrite = await this.ui.promptConfirm({
102
+ message: 'kodu.json уже существует. Перезаписать?',
103
+ default: false,
104
+ });
105
+ if (!overwrite) {
106
+ this.ui.log.warn('Инициализация отменена: файл kodu.json уже есть.');
107
+ return;
108
+ }
109
+ }
110
+ await node_fs_1.promises.writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
111
+ this.ui.log.success(`Сохранен ${configPath}`);
112
+ }
113
+ async ensureKoduFolders() {
114
+ const koduDir = node_path_1.default.join(process.cwd(), '.kodu');
115
+ const promptsDir = node_path_1.default.join(koduDir, 'prompts');
116
+ await node_fs_1.promises.mkdir(promptsDir, { recursive: true });
117
+ const keepFile = node_path_1.default.join(promptsDir, '.keep');
118
+ if (!(await this.fileExists(keepFile))) {
119
+ await node_fs_1.promises.writeFile(keepFile, '');
120
+ }
121
+ }
122
+ async ensureGitignore() {
123
+ const gitignorePath = node_path_1.default.join(process.cwd(), '.gitignore');
124
+ const content = (await this.fileExists(gitignorePath))
125
+ ? await node_fs_1.promises.readFile(gitignorePath, 'utf8')
126
+ : '';
127
+ const lines = content.split(/\r?\n/);
128
+ const additions = [];
129
+ if (!lines.some((line) => line.trim() === '.kodu' || line.trim() === '.kodu/')) {
130
+ additions.push('.kodu/');
131
+ }
132
+ if (!lines.some((line) => line.trim() === '.env')) {
133
+ const addEnv = await this.ui.promptConfirm({
134
+ message: 'В .gitignore нет .env. Добавить?',
135
+ default: true,
136
+ });
137
+ if (addEnv) {
138
+ additions.push('.env');
139
+ }
140
+ }
141
+ if (additions.length === 0) {
142
+ return;
143
+ }
144
+ const trimmed = content.trimEnd();
145
+ const next = trimmed.length > 0
146
+ ? `${trimmed}\n${additions.join('\n')}`
147
+ : additions.join('\n');
148
+ await node_fs_1.promises.writeFile(gitignorePath, `${next}\n`, 'utf8');
149
+ this.ui.log.success('Обновлен .gitignore');
150
+ }
151
+ async fileExists(targetPath) {
152
+ try {
153
+ await node_fs_1.promises.access(targetPath);
154
+ return true;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ };
161
+ exports.InitCommand = InitCommand;
162
+ exports.InitCommand = InitCommand = __decorate([
163
+ (0, nest_commander_1.Command)({ name: 'init', description: 'Инициализация конфигурации Kodu' }),
164
+ __metadata("design:paramtypes", [ui_service_1.UiService])
165
+ ], InitCommand);
166
+ //# sourceMappingURL=init.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../src/commands/init/init.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class InitModule {
2
+ }
@@ -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.InitModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const ui_module_1 = require("../../core/ui/ui.module");
12
+ const init_command_1 = require("./init.command");
13
+ let InitModule = class InitModule {
14
+ };
15
+ exports.InitModule = InitModule;
16
+ exports.InitModule = InitModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [ui_module_1.UiModule],
19
+ providers: [init_command_1.InitCommand],
20
+ })
21
+ ], InitModule);
22
+ //# sourceMappingURL=init.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.module.js","sourceRoot":"","sources":["../../../src/commands/init/init.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,uDAAmD;AACnD,iDAA6C;AAMtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IAJtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,oBAAQ,CAAC;QACnB,SAAS,EAAE,CAAC,0BAAW,CAAC;KACzB,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,25 @@
1
+ import { CommandRunner } from 'nest-commander';
2
+ import { FsService } from '../../core/file-system/fs.service';
3
+ import { UiService } from '../../core/ui/ui.service';
4
+ import { TokenizerService } from '../../shared/tokenizer/tokenizer.service';
5
+ type PackOptions = {
6
+ copy?: boolean;
7
+ template?: string;
8
+ out?: string;
9
+ };
10
+ export declare class PackCommand extends CommandRunner {
11
+ private readonly ui;
12
+ private readonly fsService;
13
+ private readonly tokenizer;
14
+ constructor(ui: UiService, fsService: FsService, tokenizer: TokenizerService);
15
+ parseCopy(): boolean;
16
+ parseTemplate(value: string): string;
17
+ parseOut(value: string): string;
18
+ run(_inputs: string[], options: PackOptions): Promise<void>;
19
+ private buildContext;
20
+ private applyTemplate;
21
+ private loadTemplate;
22
+ private writeOutput;
23
+ private fileExists;
24
+ }
25
+ export {};
@@ -0,0 +1,161 @@
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.PackCommand = void 0;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ const clipboardy_1 = __importDefault(require("clipboardy"));
19
+ const nest_commander_1 = require("nest-commander");
20
+ const fs_service_1 = require("../../core/file-system/fs.service");
21
+ const ui_service_1 = require("../../core/ui/ui.service");
22
+ const tokenizer_service_1 = require("../../shared/tokenizer/tokenizer.service");
23
+ let PackCommand = class PackCommand extends nest_commander_1.CommandRunner {
24
+ ui;
25
+ fsService;
26
+ tokenizer;
27
+ constructor(ui, fsService, tokenizer) {
28
+ super();
29
+ this.ui = ui;
30
+ this.fsService = fsService;
31
+ this.tokenizer = tokenizer;
32
+ }
33
+ parseCopy() {
34
+ return true;
35
+ }
36
+ parseTemplate(value) {
37
+ return value;
38
+ }
39
+ parseOut(value) {
40
+ return value;
41
+ }
42
+ async run(_inputs, options) {
43
+ const spinner = this.ui.createSpinner({ text: 'Сбор файлов...' }).start();
44
+ try {
45
+ const files = await this.fsService.findProjectFiles();
46
+ if (files.length === 0) {
47
+ spinner.stop('Нет файлов для упаковки.');
48
+ this.ui.log.warn('Нет файлов для упаковки.');
49
+ return;
50
+ }
51
+ const context = await this.buildContext(files);
52
+ const fileList = files.join('\n');
53
+ const { tokens, usdEstimate } = this.tokenizer.count(context);
54
+ const templateApplied = options.template
55
+ ? await this.applyTemplate(options.template, {
56
+ context,
57
+ fileList,
58
+ tokenCount: tokens,
59
+ usdEstimate,
60
+ })
61
+ : context;
62
+ const outputPath = await this.writeOutput(templateApplied, options.out);
63
+ if (options.copy) {
64
+ await clipboardy_1.default.write(templateApplied);
65
+ }
66
+ spinner.success('Сбор завершен');
67
+ this.ui.log.info(`Файлов: ${files.length}`);
68
+ this.ui.log.info(`Токены: ${tokens}`);
69
+ this.ui.log.info(`Оценка стоимости: ~$${usdEstimate.toFixed(4)}`);
70
+ this.ui.log.success(`Сохранено в ${outputPath}`);
71
+ if (options.copy) {
72
+ this.ui.log.success('Результат скопирован в буфер обмена');
73
+ }
74
+ }
75
+ catch (error) {
76
+ spinner.error('Ошибка при сборке контекста');
77
+ const message = error instanceof Error ? error.message : 'Неизвестная ошибка';
78
+ this.ui.log.error(message);
79
+ process.exitCode = 1;
80
+ }
81
+ }
82
+ async buildContext(files) {
83
+ const chunks = await Promise.all(files.map(async (file) => {
84
+ const content = await this.fsService.readFileRelative(file);
85
+ return `// file: ${file}\n${content}`;
86
+ }));
87
+ return chunks.join('\n\n');
88
+ }
89
+ async applyTemplate(name, ctx) {
90
+ const template = await this.loadTemplate(name);
91
+ const filled = template
92
+ .replace(/\{\{context\}\}/g, ctx.context)
93
+ .replace(/\{\{fileList\}\}/g, ctx.fileList)
94
+ .replace(/\{\{tokenCount\}\}/g, ctx.tokenCount.toString())
95
+ .replace(/\{\{usdEstimate\}\}/g, ctx.usdEstimate.toFixed(4));
96
+ if (!template.includes('{{context}}')) {
97
+ return `${filled}\n\n${ctx.context}`;
98
+ }
99
+ return filled;
100
+ }
101
+ async loadTemplate(name) {
102
+ const base = node_path_1.default.join(process.cwd(), '.kodu', 'prompts', name);
103
+ const candidates = [`${base}.md`, `${base}.txt`];
104
+ for (const candidate of candidates) {
105
+ if (await this.fileExists(candidate)) {
106
+ return node_fs_1.promises.readFile(candidate, 'utf8');
107
+ }
108
+ }
109
+ throw new Error(`Шаблон ${name} не найден. Ожидались файлы: ${candidates
110
+ .map((c) => node_path_1.default.relative(process.cwd(), c))
111
+ .join(', ')}`);
112
+ }
113
+ async writeOutput(content, outPath) {
114
+ const target = outPath ?? node_path_1.default.join(process.cwd(), '.kodu', 'context.txt');
115
+ const dir = node_path_1.default.dirname(target);
116
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
117
+ await node_fs_1.promises.writeFile(target, `${content}\n`, 'utf8');
118
+ return target;
119
+ }
120
+ async fileExists(filePath) {
121
+ try {
122
+ await node_fs_1.promises.access(filePath);
123
+ return true;
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ };
130
+ exports.PackCommand = PackCommand;
131
+ __decorate([
132
+ (0, nest_commander_1.Option)({ flags: '-c, --copy', description: 'Скопировать результат в буфер' }),
133
+ __metadata("design:type", Function),
134
+ __metadata("design:paramtypes", []),
135
+ __metadata("design:returntype", Boolean)
136
+ ], PackCommand.prototype, "parseCopy", null);
137
+ __decorate([
138
+ (0, nest_commander_1.Option)({
139
+ flags: '-t, --template <name>',
140
+ description: 'Имя шаблона из .kodu/prompts',
141
+ }),
142
+ __metadata("design:type", Function),
143
+ __metadata("design:paramtypes", [String]),
144
+ __metadata("design:returntype", String)
145
+ ], PackCommand.prototype, "parseTemplate", null);
146
+ __decorate([
147
+ (0, nest_commander_1.Option)({
148
+ flags: '-o, --out <path>',
149
+ description: 'Путь для сохранения результата',
150
+ }),
151
+ __metadata("design:type", Function),
152
+ __metadata("design:paramtypes", [String]),
153
+ __metadata("design:returntype", String)
154
+ ], PackCommand.prototype, "parseOut", null);
155
+ exports.PackCommand = PackCommand = __decorate([
156
+ (0, nest_commander_1.Command)({ name: 'pack', description: 'Собрать контекст проекта в один файл' }),
157
+ __metadata("design:paramtypes", [ui_service_1.UiService,
158
+ fs_service_1.FsService,
159
+ tokenizer_service_1.TokenizerService])
160
+ ], PackCommand);
161
+ //# sourceMappingURL=pack.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.command.js","sourceRoot":"","sources":["../../../src/commands/pack/pack.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare class PackModule {
2
+ }
@@ -0,0 +1,25 @@
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.PackModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_module_1 = require("../../core/config/config.module");
12
+ const fs_module_1 = require("../../core/file-system/fs.module");
13
+ const ui_module_1 = require("../../core/ui/ui.module");
14
+ const tokenizer_module_1 = require("../../shared/tokenizer/tokenizer.module");
15
+ const pack_command_1 = require("./pack.command");
16
+ let PackModule = class PackModule {
17
+ };
18
+ exports.PackModule = PackModule;
19
+ exports.PackModule = PackModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [config_module_1.ConfigModule, ui_module_1.UiModule, fs_module_1.FsModule, tokenizer_module_1.TokenizerModule],
22
+ providers: [pack_command_1.PackCommand],
23
+ })
24
+ ], PackModule);
25
+ //# sourceMappingURL=pack.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.module.js","sourceRoot":"","sources":["../../../src/commands/pack/pack.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,gEAA4D;AAC5D,uDAAmD;AACnD,8EAA0E;AAC1E,iDAA6C;AAMtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IAJtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,EAAE,oBAAQ,EAAE,oBAAQ,EAAE,kCAAe,CAAC;QAC5D,SAAS,EAAE,CAAC,0BAAW,CAAC;KACzB,CAAC;GACW,UAAU,CAAG"}