kodu 1.2.0 → 2.0.1
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/AGENTS.md +36 -68
- package/README.md +128 -96
- package/dist/package.json +1 -2
- package/dist/src/app.module.js +0 -8
- package/dist/src/app.module.js.map +1 -1
- package/dist/src/commands/clean/clean.command.d.ts +14 -1
- package/dist/src/commands/clean/clean.command.js +142 -32
- package/dist/src/commands/clean/clean.command.js.map +1 -1
- package/dist/src/commands/init/init.command.d.ts +2 -9
- package/dist/src/commands/init/init.command.js +15 -241
- package/dist/src/commands/init/init.command.js.map +1 -1
- package/dist/src/commands/pack/pack.command.d.ts +12 -1
- package/dist/src/commands/pack/pack.command.js +81 -6
- package/dist/src/commands/pack/pack.command.js.map +1 -1
- package/dist/src/commands/pack/pack.module.js +2 -1
- package/dist/src/commands/pack/pack.module.js.map +1 -1
- package/dist/src/core/config/config.schema.d.ts +0 -46
- package/dist/src/core/config/config.schema.js +1 -51
- package/dist/src/core/config/config.schema.js.map +1 -1
- package/dist/src/core/config/config.service.js +2 -2
- package/dist/src/core/config/config.service.js.map +1 -1
- package/dist/src/core/config/prompt.service.d.ts +1 -4
- package/dist/src/core/config/prompt.service.js +4 -17
- package/dist/src/core/config/prompt.service.js.map +1 -1
- package/dist/src/shared/cleaner/cleaner.service.d.ts +2 -0
- package/dist/src/shared/cleaner/cleaner.service.js +32 -7
- package/dist/src/shared/cleaner/cleaner.service.js.map +1 -1
- package/dist/src/shared/cleaner/cleaner.types.d.ts +7 -0
- package/dist/src/shared/constants.d.ts +0 -4
- package/dist/src/shared/constants.js +1 -5
- package/dist/src/shared/constants.js.map +1 -1
- package/dist/src/shared/git/git.module.js +0 -2
- package/dist/src/shared/git/git.module.js.map +1 -1
- package/dist/src/shared/git/git.service.d.ts +1 -8
- package/dist/src/shared/git/git.service.js +10 -33
- package/dist/src/shared/git/git.service.js.map +1 -1
- package/dist/src/shared/tokenizer/tokenizer.module.js +0 -2
- package/dist/src/shared/tokenizer/tokenizer.module.js.map +1 -1
- package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -6
- package/dist/src/shared/tokenizer/tokenizer.service.js +8 -38
- package/dist/src/shared/tokenizer/tokenizer.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/kodu.schema.json +0 -139
- package/package.json +1 -2
- package/src/app.module.ts +0 -8
- package/src/commands/clean/clean.command.ts +143 -33
- package/src/commands/init/init.command.ts +15 -310
- package/src/commands/pack/pack.command.ts +74 -4
- package/src/commands/pack/pack.module.ts +2 -1
- package/src/core/config/config.schema.ts +1 -68
- package/src/core/config/config.service.ts +2 -2
- package/src/core/config/prompt.service.ts +4 -26
- package/src/shared/cleaner/cleaner.service.ts +43 -12
- package/src/shared/cleaner/cleaner.types.ts +7 -0
- package/src/shared/constants.ts +0 -4
- package/src/shared/git/git.module.ts +0 -2
- package/src/shared/git/git.service.ts +9 -31
- package/src/shared/tokenizer/tokenizer.module.ts +0 -2
- package/src/shared/tokenizer/tokenizer.service.ts +9 -39
- package/.kodu/prompts/.keep +0 -0
- package/.kodu/prompts/commit.md +0 -9
- package/.kodu/prompts/pack.md +0 -7
- package/.kodu/prompts/review-bug.md +0 -6
- package/.kodu/prompts/review-security.md +0 -6
- package/.kodu/prompts/review-style.md +0 -6
- package/.opencode/command/openspec-apply.md +0 -24
- package/.opencode/command/openspec-archive.md +0 -27
- package/.opencode/command/openspec-proposal.md +0 -29
- package/.opencode/skills/kodu-ops/SKILL.md +0 -184
- package/dist/src/commands/commit/commit.command.d.ts +0 -18
- package/dist/src/commands/commit/commit.command.js +0 -149
- package/dist/src/commands/commit/commit.command.js.map +0 -1
- package/dist/src/commands/commit/commit.module.d.ts +0 -2
- package/dist/src/commands/commit/commit.module.js +0 -25
- package/dist/src/commands/commit/commit.module.js.map +0 -1
- package/dist/src/commands/ops/ops.command.d.ts +0 -4
- package/dist/src/commands/ops/ops.command.js +0 -39
- package/dist/src/commands/ops/ops.command.js.map +0 -1
- package/dist/src/commands/ops/ops.module.d.ts +0 -2
- package/dist/src/commands/ops/ops.module.js +0 -33
- package/dist/src/commands/ops/ops.module.js.map +0 -1
- package/dist/src/commands/ops/ops.types.d.ts +0 -13
- package/dist/src/commands/ops/ops.types.js +0 -12
- package/dist/src/commands/ops/ops.types.js.map +0 -1
- package/dist/src/commands/ops/ops.utils.d.ts +0 -13
- package/dist/src/commands/ops/ops.utils.js +0 -121
- package/dist/src/commands/ops/ops.utils.js.map +0 -1
- package/dist/src/commands/ops/subcommands/ops-env.command.d.ts +0 -24
- package/dist/src/commands/ops/subcommands/ops-env.command.js +0 -156
- package/dist/src/commands/ops/subcommands/ops-env.command.js.map +0 -1
- package/dist/src/commands/ops/subcommands/ops-routes.command.d.ts +0 -22
- package/dist/src/commands/ops/subcommands/ops-routes.command.js +0 -203
- package/dist/src/commands/ops/subcommands/ops-routes.command.js.map +0 -1
- package/dist/src/commands/ops/subcommands/ops-service.command.d.ts +0 -22
- package/dist/src/commands/ops/subcommands/ops-service.command.js +0 -169
- package/dist/src/commands/ops/subcommands/ops-service.command.js.map +0 -1
- package/dist/src/commands/ops/subcommands/ops-sysinfo.command.d.ts +0 -14
- package/dist/src/commands/ops/subcommands/ops-sysinfo.command.js +0 -75
- package/dist/src/commands/ops/subcommands/ops-sysinfo.command.js.map +0 -1
- package/dist/src/commands/review/review.command.d.ts +0 -26
- package/dist/src/commands/review/review.command.js +0 -205
- package/dist/src/commands/review/review.command.js.map +0 -1
- package/dist/src/commands/review/review.module.d.ts +0 -2
- package/dist/src/commands/review/review.module.js +0 -26
- package/dist/src/commands/review/review.module.js.map +0 -1
- package/dist/src/core/config/default-prompts.d.ts +0 -9
- package/dist/src/core/config/default-prompts.js +0 -49
- package/dist/src/core/config/default-prompts.js.map +0 -1
- package/dist/src/shared/ai/ai.module.d.ts +0 -2
- package/dist/src/shared/ai/ai.module.js +0 -23
- package/dist/src/shared/ai/ai.module.js.map +0 -1
- package/dist/src/shared/ai/ai.service.d.ts +0 -22
- package/dist/src/shared/ai/ai.service.js +0 -164
- package/dist/src/shared/ai/ai.service.js.map +0 -1
- package/dist/src/shared/ssh/ssh.module.d.ts +0 -2
- package/dist/src/shared/ssh/ssh.module.js +0 -21
- package/dist/src/shared/ssh/ssh.module.js.map +0 -1
- package/dist/src/shared/ssh/ssh.service.d.ts +0 -11
- package/dist/src/shared/ssh/ssh.service.js +0 -53
- package/dist/src/shared/ssh/ssh.service.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/commands/commit/commit.command.ts +0 -139
- package/src/commands/commit/commit.module.ts +0 -12
- package/src/commands/ops/ops.command.ts +0 -30
- package/src/commands/ops/ops.module.ts +0 -20
- package/src/commands/ops/ops.types.ts +0 -24
- package/src/commands/ops/ops.utils.ts +0 -160
- package/src/commands/ops/subcommands/ops-env.command.ts +0 -165
- package/src/commands/ops/subcommands/ops-routes.command.ts +0 -221
- package/src/commands/ops/subcommands/ops-service.command.ts +0 -190
- package/src/commands/ops/subcommands/ops-sysinfo.command.ts +0 -77
- package/src/commands/review/review.command.ts +0 -199
- package/src/commands/review/review.module.ts +0 -13
- package/src/core/config/default-prompts.ts +0 -53
- package/src/shared/ai/ai.module.ts +0 -10
- package/src/shared/ai/ai.service.ts +0 -216
- package/src/shared/ssh/ssh.module.ts +0 -8
- package/src/shared/ssh/ssh.service.ts +0 -61
|
@@ -10,12 +10,14 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.CleanCommand = void 0;
|
|
13
|
+
const node_fs_1 = require("node:fs");
|
|
13
14
|
const nest_commander_1 = require("nest-commander");
|
|
14
15
|
const config_service_1 = require("../../core/config/config.service");
|
|
15
16
|
const fs_service_1 = require("../../core/file-system/fs.service");
|
|
16
17
|
const ui_service_1 = require("../../core/ui/ui.service");
|
|
17
18
|
const cleaner_service_1 = require("../../shared/cleaner/cleaner.service");
|
|
18
19
|
const git_service_1 = require("../../shared/git/git.service");
|
|
20
|
+
const SUPPORTED_EXTENSIONS = /\.(ts|tsx|js|jsx|mjs|cjs|html|htm)$/i;
|
|
19
21
|
let CleanCommand = class CleanCommand extends nest_commander_1.CommandRunner {
|
|
20
22
|
ui;
|
|
21
23
|
fsService;
|
|
@@ -36,7 +38,26 @@ let CleanCommand = class CleanCommand extends nest_commander_1.CommandRunner {
|
|
|
36
38
|
parseChanged() {
|
|
37
39
|
return true;
|
|
38
40
|
}
|
|
39
|
-
|
|
41
|
+
parseStaged() {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
parseBackup() {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
parseNoJsdoc() {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
parseVerbose() {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
parseStdin() {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
async run(inputs, options = {}) {
|
|
57
|
+
if (options.stdin) {
|
|
58
|
+
await this.runStdin(options);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
40
61
|
const spinner = this.ui
|
|
41
62
|
.createSpinner({ text: this.buildSpinnerText(options) })
|
|
42
63
|
.start();
|
|
@@ -50,32 +71,44 @@ let CleanCommand = class CleanCommand extends nest_commander_1.CommandRunner {
|
|
|
50
71
|
useGitignore: cleanerConfig.useGitignore,
|
|
51
72
|
ignore: ignorePatterns,
|
|
52
73
|
});
|
|
53
|
-
const targets = await this.collectTargets(allFiles, options);
|
|
74
|
+
const targets = await this.collectTargets(allFiles, inputs, options);
|
|
54
75
|
if (targets.length === 0) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
spinner.stop(noFilesMessage);
|
|
59
|
-
this.ui.log.warn(noFilesMessage);
|
|
76
|
+
const msg = this.noFilesMessage(options);
|
|
77
|
+
spinner.stop(msg);
|
|
78
|
+
this.ui.log.warn(msg);
|
|
60
79
|
return;
|
|
61
80
|
}
|
|
62
81
|
const summary = await this.cleaner.cleanFiles(targets, {
|
|
63
82
|
dryRun: options.dryRun,
|
|
83
|
+
backup: options.backup,
|
|
84
|
+
keepJSDoc: options.noJsdoc ? false : undefined,
|
|
85
|
+
onProgress: (current, total) => {
|
|
86
|
+
spinner.text = `${this.buildSpinnerText(options)} (${current}/${total})`;
|
|
87
|
+
},
|
|
64
88
|
});
|
|
65
89
|
spinner.success(options.dryRun ? 'Analysis complete' : 'Cleaning complete');
|
|
90
|
+
const bytesSaved = summary.bytesBefore - summary.bytesAfter;
|
|
91
|
+
const tokensSaved = Math.round(bytesSaved / 4);
|
|
66
92
|
if (options.dryRun) {
|
|
67
|
-
this.ui.log.info(`Files
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const previews =
|
|
72
|
-
.
|
|
73
|
-
.
|
|
74
|
-
|
|
75
|
-
|
|
93
|
+
this.ui.log.info(`Files affected: ${summary.filesChanged}/${summary.filesProcessed}, comments: ${summary.commentsRemoved}`);
|
|
94
|
+
this.ui.log.info(`Bytes saved: ${bytesSaved} (~${tokensSaved} tokens)`);
|
|
95
|
+
const limit = options.verbose ? Number.POSITIVE_INFINITY : 3;
|
|
96
|
+
for (const report of summary.reports.filter((r) => r.removed > 0)) {
|
|
97
|
+
const previews = options.verbose
|
|
98
|
+
? report.previews
|
|
99
|
+
: report.previews.slice(0, limit);
|
|
100
|
+
const more = !options.verbose && report.previews.length > limit
|
|
101
|
+
? ` +${report.previews.length - limit} more`
|
|
102
|
+
: '';
|
|
103
|
+
this.ui.log.info(` ${report.file} (${report.removed}): ${previews.map((p) => `"${p}"`).join(', ')}${more}`);
|
|
104
|
+
}
|
|
76
105
|
return;
|
|
77
106
|
}
|
|
78
107
|
this.ui.log.success(`Files cleaned: ${summary.filesChanged}, comments removed: ${summary.commentsRemoved}`);
|
|
108
|
+
this.ui.log.info(`Bytes saved: ${bytesSaved} (~${tokensSaved} tokens)`);
|
|
109
|
+
if (options.backup && summary.filesChanged > 0) {
|
|
110
|
+
this.ui.log.info('Originals backed up to .kodu/backup/');
|
|
111
|
+
}
|
|
79
112
|
}
|
|
80
113
|
catch (error) {
|
|
81
114
|
spinner.error('Error during cleaning');
|
|
@@ -84,28 +117,60 @@ let CleanCommand = class CleanCommand extends nest_commander_1.CommandRunner {
|
|
|
84
117
|
process.exitCode = 1;
|
|
85
118
|
}
|
|
86
119
|
}
|
|
120
|
+
async runStdin(options) {
|
|
121
|
+
try {
|
|
122
|
+
const input = await this.readStdin();
|
|
123
|
+
const cleaned = this.cleaner.cleanContent('stdin.ts', input, options.noJsdoc ? false : undefined);
|
|
124
|
+
process.stdout.write(cleaned);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
128
|
+
this.ui.log.error(message);
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
readStdin() {
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
const chunks = [];
|
|
135
|
+
const stream = (0, node_fs_1.createReadStream)('/dev/stdin');
|
|
136
|
+
stream.on('data', (chunk) => chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk));
|
|
137
|
+
stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
138
|
+
stream.on('error', reject);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
87
141
|
buildSpinnerText(options) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
142
|
+
if (options.staged)
|
|
143
|
+
return 'Cleaning staged files...';
|
|
144
|
+
if (options.changed)
|
|
145
|
+
return 'Cleaning changed files...';
|
|
146
|
+
return options.dryRun ? 'Analysing...' : 'Cleaning...';
|
|
91
147
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (
|
|
96
|
-
return
|
|
148
|
+
noFilesMessage(options) {
|
|
149
|
+
if (options.staged)
|
|
150
|
+
return 'No staged files to clean.';
|
|
151
|
+
if (options.changed)
|
|
152
|
+
return 'No changed files to clean.';
|
|
153
|
+
return 'No files to clean.';
|
|
154
|
+
}
|
|
155
|
+
async collectTargets(allFiles, inputs, options) {
|
|
156
|
+
const supported = allFiles.filter((f) => SUPPORTED_EXTENSIONS.test(f));
|
|
157
|
+
if (inputs.length > 0) {
|
|
158
|
+
return supported.filter((f) => inputs.some((i) => f === i || f.startsWith(`${i.replace(/\/$/, '')}/`)));
|
|
159
|
+
}
|
|
160
|
+
if (options.staged) {
|
|
161
|
+
const staged = new Set(await this.git.getStagedFiles());
|
|
162
|
+
return supported.filter((f) => staged.has(f));
|
|
97
163
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
164
|
+
if (options.changed) {
|
|
165
|
+
const changed = new Set(await this.git.getChangedFiles());
|
|
166
|
+
return supported.filter((f) => changed.has(f));
|
|
167
|
+
}
|
|
168
|
+
return supported;
|
|
101
169
|
}
|
|
102
170
|
};
|
|
103
171
|
exports.CleanCommand = CleanCommand;
|
|
104
172
|
__decorate([
|
|
105
|
-
(0, nest_commander_1.Option)({
|
|
106
|
-
flags: '-d, --dry-run',
|
|
107
|
-
description: 'Show what will be removed',
|
|
108
|
-
}),
|
|
173
|
+
(0, nest_commander_1.Option)({ flags: '-d, --dry-run', description: 'Show what will be removed' }),
|
|
109
174
|
__metadata("design:type", Function),
|
|
110
175
|
__metadata("design:paramtypes", []),
|
|
111
176
|
__metadata("design:returntype", Boolean)
|
|
@@ -113,12 +178,57 @@ __decorate([
|
|
|
113
178
|
__decorate([
|
|
114
179
|
(0, nest_commander_1.Option)({
|
|
115
180
|
flags: '-c, --changed',
|
|
116
|
-
description: 'Clean only changed files',
|
|
181
|
+
description: 'Clean only git-changed files (staged + unstaged + untracked)',
|
|
117
182
|
}),
|
|
118
183
|
__metadata("design:type", Function),
|
|
119
184
|
__metadata("design:paramtypes", []),
|
|
120
185
|
__metadata("design:returntype", Boolean)
|
|
121
186
|
], CleanCommand.prototype, "parseChanged", null);
|
|
187
|
+
__decorate([
|
|
188
|
+
(0, nest_commander_1.Option)({
|
|
189
|
+
flags: '-s, --staged',
|
|
190
|
+
description: 'Clean only git-staged files',
|
|
191
|
+
}),
|
|
192
|
+
__metadata("design:type", Function),
|
|
193
|
+
__metadata("design:paramtypes", []),
|
|
194
|
+
__metadata("design:returntype", Boolean)
|
|
195
|
+
], CleanCommand.prototype, "parseStaged", null);
|
|
196
|
+
__decorate([
|
|
197
|
+
(0, nest_commander_1.Option)({
|
|
198
|
+
flags: '-b, --backup',
|
|
199
|
+
description: 'Save originals to .kodu/backup/ before modifying',
|
|
200
|
+
}),
|
|
201
|
+
__metadata("design:type", Function),
|
|
202
|
+
__metadata("design:paramtypes", []),
|
|
203
|
+
__metadata("design:returntype", Boolean)
|
|
204
|
+
], CleanCommand.prototype, "parseBackup", null);
|
|
205
|
+
__decorate([
|
|
206
|
+
(0, nest_commander_1.Option)({
|
|
207
|
+
flags: '-n, --no-jsdoc',
|
|
208
|
+
description: 'Remove JSDoc comments (overrides config keepJSDoc)',
|
|
209
|
+
}),
|
|
210
|
+
__metadata("design:type", Function),
|
|
211
|
+
__metadata("design:paramtypes", []),
|
|
212
|
+
__metadata("design:returntype", Boolean)
|
|
213
|
+
], CleanCommand.prototype, "parseNoJsdoc", null);
|
|
214
|
+
__decorate([
|
|
215
|
+
(0, nest_commander_1.Option)({
|
|
216
|
+
flags: '-v, --verbose',
|
|
217
|
+
description: 'Show all removed comments in dry-run (not just first 3)',
|
|
218
|
+
}),
|
|
219
|
+
__metadata("design:type", Function),
|
|
220
|
+
__metadata("design:paramtypes", []),
|
|
221
|
+
__metadata("design:returntype", Boolean)
|
|
222
|
+
], CleanCommand.prototype, "parseVerbose", null);
|
|
223
|
+
__decorate([
|
|
224
|
+
(0, nest_commander_1.Option)({
|
|
225
|
+
flags: '--stdin',
|
|
226
|
+
description: 'Read from stdin, write cleaned result to stdout',
|
|
227
|
+
}),
|
|
228
|
+
__metadata("design:type", Function),
|
|
229
|
+
__metadata("design:paramtypes", []),
|
|
230
|
+
__metadata("design:returntype", Boolean)
|
|
231
|
+
], CleanCommand.prototype, "parseStdin", null);
|
|
122
232
|
exports.CleanCommand = CleanCommand = __decorate([
|
|
123
233
|
(0, nest_commander_1.Command)({ name: 'clean', description: 'Remove comments from code' }),
|
|
124
234
|
__metadata("design:paramtypes", [ui_service_1.UiService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clean.command.js","sourceRoot":"","sources":["../../../../src/commands/clean/clean.command.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAgE;AAChE,qEAAiE;AACjE,kEAA8D;AAC9D,yDAAqD;AACrD,0EAAsE;AACtE,8DAA0D;
|
|
1
|
+
{"version":3,"file":"clean.command.js","sourceRoot":"","sources":["../../../../src/commands/clean/clean.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,6 @@ export declare class InitCommand extends CommandRunner {
|
|
|
4
4
|
private readonly ui;
|
|
5
5
|
constructor(ui: UiService);
|
|
6
6
|
run(): Promise<void>;
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
private mergeWhitelist;
|
|
10
|
-
private writeConfig;
|
|
11
|
-
private ensurePromptFiles;
|
|
12
|
-
private buildPromptPaths;
|
|
13
|
-
private writePromptIfMissing;
|
|
14
|
-
private ensureGitignore;
|
|
15
|
-
private fileExists;
|
|
7
|
+
private updateGitignore;
|
|
8
|
+
private exists;
|
|
16
9
|
}
|
|
@@ -16,13 +16,8 @@ exports.InitCommand = void 0;
|
|
|
16
16
|
const node_fs_1 = require("node:fs");
|
|
17
17
|
const node_path_1 = __importDefault(require("node:path"));
|
|
18
18
|
const nest_commander_1 = require("nest-commander");
|
|
19
|
-
const default_prompts_1 = require("../../core/config/default-prompts");
|
|
20
19
|
const ui_service_1 = require("../../core/ui/ui.service");
|
|
21
|
-
const
|
|
22
|
-
const buildDefaultCommandSettings = () => ({
|
|
23
|
-
commit: { modelSettings: { maxOutputTokens: constants_1.DEFAULT_COMMIT_TOKENS } },
|
|
24
|
-
review: { modelSettings: { maxOutputTokens: constants_1.DEFAULT_REVIEW_TOKENS } },
|
|
25
|
-
});
|
|
20
|
+
const GITIGNORE_ENTRY = '.kodu/context.txt';
|
|
26
21
|
let InitCommand = class InitCommand extends nest_commander_1.CommandRunner {
|
|
27
22
|
ui;
|
|
28
23
|
constructor(ui) {
|
|
@@ -30,250 +25,29 @@ let InitCommand = class InitCommand extends nest_commander_1.CommandRunner {
|
|
|
30
25
|
this.ui = ui;
|
|
31
26
|
}
|
|
32
27
|
async run() {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
model: `openai/${constants_1.DEFAULT_LLM_MODEL}`,
|
|
36
|
-
apiKeyEnv: 'OPENAI_API_KEY',
|
|
37
|
-
};
|
|
38
|
-
const defaultConfig = {
|
|
39
|
-
$schema: 'https://raw.githubusercontent.com/uxname/kodu/refs/heads/master/kodu.schema.json',
|
|
40
|
-
llm: defaultLlmConfig,
|
|
41
|
-
ops: {
|
|
42
|
-
servers: {
|
|
43
|
-
dev: {
|
|
44
|
-
host: 'example.com',
|
|
45
|
-
port: 22,
|
|
46
|
-
user: 'ubuntu',
|
|
47
|
-
sshKeyPath: '~/.ssh/id_rsa',
|
|
48
|
-
description: 'Example AgentOps server',
|
|
49
|
-
paths: {
|
|
50
|
-
apps: '/var/agent-apps',
|
|
51
|
-
caddy: '/var/agent-apps/caddy',
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
cleaner: {
|
|
57
|
-
whitelist: ['//!'],
|
|
58
|
-
keepJSDoc: true,
|
|
59
|
-
useGitignore: true,
|
|
60
|
-
ignore: [],
|
|
61
|
-
},
|
|
62
|
-
packer: {
|
|
63
|
-
ignore: [
|
|
64
|
-
'package-lock.json',
|
|
65
|
-
'yarn.lock',
|
|
66
|
-
'pnpm-lock.yaml',
|
|
67
|
-
'.git',
|
|
68
|
-
'.kodu',
|
|
69
|
-
'node_modules',
|
|
70
|
-
'dist',
|
|
71
|
-
'coverage',
|
|
72
|
-
],
|
|
73
|
-
useGitignore: true,
|
|
74
|
-
contentBasedBinaryDetection: false,
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
const useAi = await this.ui.promptConfirm({
|
|
78
|
-
message: 'Will you use AI functions?',
|
|
79
|
-
default: true,
|
|
80
|
-
});
|
|
81
|
-
let llmConfig;
|
|
82
|
-
if (useAi) {
|
|
83
|
-
const useCustomModel = await this.ui.promptConfirm({
|
|
84
|
-
message: 'Use your own model?',
|
|
85
|
-
default: false,
|
|
86
|
-
});
|
|
87
|
-
let model;
|
|
88
|
-
if (useCustomModel) {
|
|
89
|
-
model = await this.ui.promptInput({
|
|
90
|
-
message: 'Enter model in format provider/model-name (e.g., openai/gpt-4o):',
|
|
91
|
-
default: defaultLlmConfig.model,
|
|
92
|
-
validate: (input) => {
|
|
93
|
-
if (!input.includes('/')) {
|
|
94
|
-
return 'Model must be in format provider/model-name';
|
|
95
|
-
}
|
|
96
|
-
return true;
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
model = await this.ui.promptSelect(this.buildModelQuestion(defaultLlmConfig.model));
|
|
102
|
-
}
|
|
103
|
-
llmConfig = {
|
|
104
|
-
model,
|
|
105
|
-
apiKeyEnv: defaultLlmConfig.apiKeyEnv,
|
|
106
|
-
commands: buildDefaultCommandSettings(),
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
const extendIgnore = await this.ui.promptConfirm({
|
|
110
|
-
message: 'Modify standard ignore list?',
|
|
111
|
-
default: false,
|
|
112
|
-
});
|
|
113
|
-
const ignoreList = extendIgnore
|
|
114
|
-
? await this.askIgnoreList(defaultConfig.packer.ignore)
|
|
115
|
-
: defaultConfig.packer.ignore;
|
|
116
|
-
const additionalWhitelist = await this.ui.promptInput({
|
|
117
|
-
message: 'Additional whitelist prefixes (comma-separated, empty - keep default):',
|
|
118
|
-
default: '',
|
|
119
|
-
});
|
|
120
|
-
const whitelist = this.mergeWhitelist(defaultConfig.cleaner.whitelist, additionalWhitelist);
|
|
121
|
-
const promptPaths = this.buildPromptPaths();
|
|
122
|
-
const configToSave = {
|
|
123
|
-
$schema: defaultConfig.$schema,
|
|
124
|
-
...(llmConfig && { llm: llmConfig }),
|
|
125
|
-
cleaner: {
|
|
126
|
-
whitelist,
|
|
127
|
-
keepJSDoc: defaultConfig.cleaner.keepJSDoc,
|
|
128
|
-
useGitignore: defaultConfig.cleaner.useGitignore,
|
|
129
|
-
ignore: defaultConfig.cleaner.ignore,
|
|
130
|
-
},
|
|
131
|
-
packer: {
|
|
132
|
-
ignore: ignoreList,
|
|
133
|
-
useGitignore: defaultConfig.packer.useGitignore,
|
|
134
|
-
contentBasedBinaryDetection: defaultConfig.packer.contentBasedBinaryDetection,
|
|
135
|
-
},
|
|
136
|
-
ops: defaultConfig.ops,
|
|
137
|
-
prompts: {
|
|
138
|
-
review: {
|
|
139
|
-
bug: promptPaths.review.bug,
|
|
140
|
-
style: promptPaths.review.style,
|
|
141
|
-
security: promptPaths.review.security,
|
|
142
|
-
},
|
|
143
|
-
commit: promptPaths.commit,
|
|
144
|
-
pack: promptPaths.pack,
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
await this.writeConfig(configPath, configToSave);
|
|
148
|
-
await this.ensurePromptFiles(promptPaths);
|
|
149
|
-
await this.ensureGitignore();
|
|
150
|
-
this.ui.log.success('Kodu configuration created.');
|
|
151
|
-
if (useAi) {
|
|
152
|
-
this.ui.log.info('🎉 Kodu initialized! Run `kodu pack` to continue.');
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
this.ui.log.info('🎉 Kodu initialized! Available commands: pack, clean.');
|
|
156
|
-
this.ui.log.info('To use AI functions (review, commit) add llm section to kodu.json.');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
buildModelQuestion(defaultModel) {
|
|
160
|
-
return {
|
|
161
|
-
message: 'Select AI model',
|
|
162
|
-
choices: [
|
|
163
|
-
{
|
|
164
|
-
name: 'OpenAI GPT-4o (recommended)',
|
|
165
|
-
value: `openai/${constants_1.DEFAULT_LLM_MODEL}`,
|
|
166
|
-
},
|
|
167
|
-
{ name: 'OpenAI GPT-4o Mini', value: 'openai/gpt-4o-mini' },
|
|
168
|
-
{ name: 'OpenAI GPT-4o', value: 'openai/gpt-4o' },
|
|
169
|
-
{
|
|
170
|
-
name: 'Anthropic Claude 3.5 Sonnet',
|
|
171
|
-
value: 'anthropic/claude-3-5-sonnet-20241022',
|
|
172
|
-
},
|
|
173
|
-
{ name: 'Google Gemini 2.5 Flash', value: 'google/gemini-2.5-flash' },
|
|
174
|
-
],
|
|
175
|
-
default: defaultModel,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
async askIgnoreList(defaultIgnore) {
|
|
179
|
-
const answer = await this.ui.promptInput({
|
|
180
|
-
message: 'Specify ignore patterns (comma-separated)',
|
|
181
|
-
default: defaultIgnore.join(', '),
|
|
182
|
-
});
|
|
183
|
-
return answer
|
|
184
|
-
.split(',')
|
|
185
|
-
.map((item) => item.trim())
|
|
186
|
-
.filter((item) => item.length > 0);
|
|
187
|
-
}
|
|
188
|
-
mergeWhitelist(defaultWhitelist, extra) {
|
|
189
|
-
if (!extra.trim()) {
|
|
190
|
-
return defaultWhitelist;
|
|
191
|
-
}
|
|
192
|
-
const additions = extra
|
|
193
|
-
.split(',')
|
|
194
|
-
.map((item) => item.trim())
|
|
195
|
-
.filter((item) => item.length > 0);
|
|
196
|
-
return Array.from(new Set([...defaultWhitelist, ...additions]));
|
|
197
|
-
}
|
|
198
|
-
async writeConfig(configPath, config) {
|
|
199
|
-
if (await this.fileExists(configPath)) {
|
|
200
|
-
const overwrite = await this.ui.promptConfirm({
|
|
201
|
-
message: 'kodu.json already exists. Overwrite?',
|
|
202
|
-
default: false,
|
|
203
|
-
});
|
|
204
|
-
if (!overwrite) {
|
|
205
|
-
this.ui.log.warn('Initialization cancelled: kodu.json file already exists.');
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
await node_fs_1.promises.writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`, 'utf8');
|
|
210
|
-
this.ui.log.success(`Saved ${configPath}`);
|
|
211
|
-
}
|
|
212
|
-
async ensurePromptFiles(paths) {
|
|
213
|
-
const promptDir = node_path_1.default.join(process.cwd(), '.kodu', 'prompts');
|
|
214
|
-
await node_fs_1.promises.mkdir(promptDir, { recursive: true });
|
|
215
|
-
const keepFile = node_path_1.default.join(promptDir, '.keep');
|
|
216
|
-
if (!(await this.fileExists(keepFile))) {
|
|
217
|
-
await node_fs_1.promises.writeFile(keepFile, '');
|
|
218
|
-
}
|
|
219
|
-
await Promise.all([
|
|
220
|
-
this.writePromptIfMissing(paths.review.bug, default_prompts_1.DEFAULT_REVIEW_PROMPTS.bug),
|
|
221
|
-
this.writePromptIfMissing(paths.review.style, default_prompts_1.DEFAULT_REVIEW_PROMPTS.style),
|
|
222
|
-
this.writePromptIfMissing(paths.review.security, default_prompts_1.DEFAULT_REVIEW_PROMPTS.security),
|
|
223
|
-
this.writePromptIfMissing(paths.commit, default_prompts_1.DEFAULT_COMMIT_PROMPT),
|
|
224
|
-
this.writePromptIfMissing(paths.pack, default_prompts_1.DEFAULT_PACK_PROMPT),
|
|
225
|
-
]);
|
|
226
|
-
}
|
|
227
|
-
buildPromptPaths() {
|
|
228
|
-
return {
|
|
229
|
-
review: {
|
|
230
|
-
bug: node_path_1.default.posix.join('.kodu', 'prompts', 'review-bug.md'),
|
|
231
|
-
style: node_path_1.default.posix.join('.kodu', 'prompts', 'review-style.md'),
|
|
232
|
-
security: node_path_1.default.posix.join('.kodu', 'prompts', 'review-security.md'),
|
|
233
|
-
},
|
|
234
|
-
commit: node_path_1.default.posix.join('.kodu', 'prompts', 'commit.md'),
|
|
235
|
-
pack: node_path_1.default.posix.join('.kodu', 'prompts', 'pack.md'),
|
|
236
|
-
};
|
|
28
|
+
await this.updateGitignore();
|
|
29
|
+
this.ui.log.success('Done.');
|
|
237
30
|
}
|
|
238
|
-
async
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if (await this.fileExists(absolute)) {
|
|
31
|
+
async updateGitignore() {
|
|
32
|
+
const gitignorePath = node_path_1.default.join(process.cwd(), '.gitignore');
|
|
33
|
+
if (!(await this.exists(gitignorePath))) {
|
|
34
|
+
this.ui.log.warn('.gitignore not found, skipping.');
|
|
243
35
|
return;
|
|
244
36
|
}
|
|
245
|
-
await node_fs_1.promises.
|
|
246
|
-
await node_fs_1.promises.writeFile(absolute, `${content}\n`, 'utf8');
|
|
247
|
-
}
|
|
248
|
-
async ensureGitignore() {
|
|
249
|
-
const gitignorePath = node_path_1.default.join(process.cwd(), '.gitignore');
|
|
250
|
-
const content = (await this.fileExists(gitignorePath))
|
|
251
|
-
? await node_fs_1.promises.readFile(gitignorePath, 'utf8')
|
|
252
|
-
: '';
|
|
37
|
+
const content = await node_fs_1.promises.readFile(gitignorePath, 'utf8');
|
|
253
38
|
const lines = content.split(/\r?\n/);
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const addEnv = await this.ui.promptConfirm({
|
|
257
|
-
message: '.env not in .gitignore. Add it?',
|
|
258
|
-
default: true,
|
|
259
|
-
});
|
|
260
|
-
if (addEnv) {
|
|
261
|
-
additions.push('.env');
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
if (additions.length === 0) {
|
|
39
|
+
if (lines.some((line) => line.trim() === GITIGNORE_ENTRY)) {
|
|
40
|
+
this.ui.log.info(`${GITIGNORE_ENTRY} already in .gitignore`);
|
|
265
41
|
return;
|
|
266
42
|
}
|
|
267
43
|
const trimmed = content.trimEnd();
|
|
268
|
-
const next = trimmed.length > 0
|
|
269
|
-
? `${trimmed}\n${additions.join('\n')}`
|
|
270
|
-
: additions.join('\n');
|
|
44
|
+
const next = trimmed.length > 0 ? `${trimmed}\n${GITIGNORE_ENTRY}` : GITIGNORE_ENTRY;
|
|
271
45
|
await node_fs_1.promises.writeFile(gitignorePath, `${next}\n`, 'utf8');
|
|
272
|
-
this.ui.log.success(
|
|
46
|
+
this.ui.log.success(`Added ${GITIGNORE_ENTRY} to .gitignore`);
|
|
273
47
|
}
|
|
274
|
-
async
|
|
48
|
+
async exists(target) {
|
|
275
49
|
try {
|
|
276
|
-
await node_fs_1.promises.access(
|
|
50
|
+
await node_fs_1.promises.access(target);
|
|
277
51
|
return true;
|
|
278
52
|
}
|
|
279
53
|
catch {
|
|
@@ -283,7 +57,7 @@ let InitCommand = class InitCommand extends nest_commander_1.CommandRunner {
|
|
|
283
57
|
};
|
|
284
58
|
exports.InitCommand = InitCommand;
|
|
285
59
|
exports.InitCommand = InitCommand = __decorate([
|
|
286
|
-
(0, nest_commander_1.Command)({ name: 'init', description: '
|
|
60
|
+
(0, nest_commander_1.Command)({ name: 'init', description: 'Add kodu output to .gitignore' }),
|
|
287
61
|
__metadata("design:paramtypes", [ui_service_1.UiService])
|
|
288
62
|
], InitCommand);
|
|
289
63
|
//# sourceMappingURL=init.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../../src/commands/init/init.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAyC;AACzC,0DAA6B;AAC7B,mDAAwD;
|
|
1
|
+
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../../src/commands/init/init.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAyC;AACzC,0DAA6B;AAC7B,mDAAwD;AACxD,yDAAqD;AAErD,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAGrC,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,8BAAa;IACf;IAA7B,YAA6B,EAAa;QACxC,KAAK,EAAE,CAAC;QADmB,OAAE,GAAF,EAAE,CAAW;IAE1C,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,aAAa,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,eAAe,wBAAwB,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,eAAe,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;QAC1E,MAAM,kBAAE,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,eAAe,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,MAAc;QACjC,IAAI,CAAC;YACH,MAAM,kBAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF,CAAA;AAzCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,wBAAO,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;qCAErC,sBAAS;GAD/B,WAAW,CAyCvB"}
|
|
@@ -3,12 +3,18 @@ import { ConfigService } from '../../core/config/config.service';
|
|
|
3
3
|
import { PromptService } from '../../core/config/prompt.service';
|
|
4
4
|
import { FsService } from '../../core/file-system/fs.service';
|
|
5
5
|
import { UiService } from '../../core/ui/ui.service';
|
|
6
|
+
import { CleanerService } from '../../shared/cleaner/cleaner.service';
|
|
6
7
|
import { TokenizerService } from '../../shared/tokenizer/tokenizer.service';
|
|
8
|
+
type OutputFormat = 'xml' | 'text';
|
|
7
9
|
type PackOptions = {
|
|
8
10
|
copy?: boolean;
|
|
9
11
|
template?: string;
|
|
10
12
|
out?: string;
|
|
11
13
|
path?: string[];
|
|
14
|
+
exclude?: string[];
|
|
15
|
+
list?: boolean;
|
|
16
|
+
format?: OutputFormat;
|
|
17
|
+
clean?: boolean;
|
|
12
18
|
};
|
|
13
19
|
export declare class PackCommand extends CommandRunner {
|
|
14
20
|
private readonly ui;
|
|
@@ -16,11 +22,16 @@ export declare class PackCommand extends CommandRunner {
|
|
|
16
22
|
private readonly promptService;
|
|
17
23
|
private readonly fsService;
|
|
18
24
|
private readonly tokenizer;
|
|
19
|
-
|
|
25
|
+
private readonly cleaner;
|
|
26
|
+
constructor(ui: UiService, configService: ConfigService, promptService: PromptService, fsService: FsService, tokenizer: TokenizerService, cleaner: CleanerService);
|
|
20
27
|
parseCopy(): boolean;
|
|
21
28
|
parseTemplate(value: string): string;
|
|
22
29
|
parseOut(value: string): string;
|
|
23
30
|
parsePath(value: string, previous?: string[]): string[];
|
|
31
|
+
parseExclude(value: string, previous?: string[]): string[];
|
|
32
|
+
parseList(): boolean;
|
|
33
|
+
parseClean(): boolean;
|
|
34
|
+
parseFormat(value: string): OutputFormat;
|
|
24
35
|
run(_inputs: string[], options: PackOptions): Promise<void>;
|
|
25
36
|
private buildContext;
|
|
26
37
|
private applyTemplate;
|