kodu 1.1.21 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +36 -68
- package/README.md +97 -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/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 +9 -0
- package/dist/src/commands/pack/pack.command.js +72 -3
- package/dist/src/commands/pack/pack.command.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/core/file-system/fs.service.d.ts +1 -0
- package/dist/src/core/file-system/fs.service.js +4 -1
- package/dist/src/core/file-system/fs.service.js.map +1 -1
- 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 +0 -8
- package/dist/src/shared/git/git.service.js +2 -34
- 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/skills/kodu-ops/SKILL.md +184 -0
- package/src/app.module.ts +0 -8
- package/src/commands/init/init.command.ts +15 -310
- package/src/commands/pack/pack.command.ts +66 -3
- 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/core/file-system/fs.service.ts +7 -1
- package/src/shared/constants.ts +0 -4
- package/src/shared/git/git.module.ts +0 -2
- package/src/shared/git/git.service.ts +1 -33
- 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 -60
- 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/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
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ConfigService } from '../../core/config/config.service';
|
|
2
|
-
import { PromptService } from '../../core/config/prompt.service';
|
|
3
|
-
export type ReviewMode = string;
|
|
4
|
-
export declare class AiService {
|
|
5
|
-
private readonly configService;
|
|
6
|
-
private readonly promptService;
|
|
7
|
-
constructor(configService: ConfigService, promptService: PromptService);
|
|
8
|
-
reviewDiff(diff: string, mode: ReviewMode): Promise<{
|
|
9
|
-
text: string;
|
|
10
|
-
}>;
|
|
11
|
-
generateCommitMessage(diff: string): Promise<string>;
|
|
12
|
-
getAvailableReviewModes(): string[];
|
|
13
|
-
hasApiKey(): boolean;
|
|
14
|
-
getApiKeyEnvName(): string;
|
|
15
|
-
private createAgent;
|
|
16
|
-
private buildReviewPrompt;
|
|
17
|
-
private buildCommitPrompt;
|
|
18
|
-
private getApiKey;
|
|
19
|
-
private getModelId;
|
|
20
|
-
private getModelSettingsForCommand;
|
|
21
|
-
private cleanCommitMessage;
|
|
22
|
-
}
|
|
@@ -1,164 +0,0 @@
|
|
|
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 config_service_1 = require("../../core/config/config.service");
|
|
16
|
-
const default_prompts_1 = require("../../core/config/default-prompts");
|
|
17
|
-
const prompt_service_1 = require("../../core/config/prompt.service");
|
|
18
|
-
const constants_1 = require("../constants");
|
|
19
|
-
let AiService = class AiService {
|
|
20
|
-
configService;
|
|
21
|
-
promptService;
|
|
22
|
-
constructor(configService, promptService) {
|
|
23
|
-
this.configService = configService;
|
|
24
|
-
this.promptService = promptService;
|
|
25
|
-
}
|
|
26
|
-
async reviewDiff(diff, mode) {
|
|
27
|
-
const agent = this.createAgent('kodu-review-agent', 'AI Reviewer for staged git diff. Be concise.');
|
|
28
|
-
const userPrompt = await this.buildReviewPrompt(diff, mode);
|
|
29
|
-
const modelSettings = this.getModelSettingsForCommand('review');
|
|
30
|
-
const output = await agent.generate(userPrompt, { modelSettings });
|
|
31
|
-
return { text: output.text.trim() };
|
|
32
|
-
}
|
|
33
|
-
async generateCommitMessage(diff) {
|
|
34
|
-
const agent = this.createAgent('kodu-commit-agent', 'Generate a concise Conventional Commit message. Only output the message string.');
|
|
35
|
-
const prompt = await this.buildCommitPrompt(diff);
|
|
36
|
-
const modelSettings = this.getModelSettingsForCommand('commit');
|
|
37
|
-
const output = await agent.generate(prompt, { modelSettings });
|
|
38
|
-
const raw = output.text.trim();
|
|
39
|
-
const cleaned = this.cleanCommitMessage(raw);
|
|
40
|
-
if (!cleaned) {
|
|
41
|
-
throw new Error('AI did not return a valid commit message.');
|
|
42
|
-
}
|
|
43
|
-
return cleaned;
|
|
44
|
-
}
|
|
45
|
-
getAvailableReviewModes() {
|
|
46
|
-
const config = this.configService.getConfig();
|
|
47
|
-
const standardModes = [...default_prompts_1.STANDARD_REVIEW_MODES];
|
|
48
|
-
const customModes = config.prompts?.review
|
|
49
|
-
? Object.keys(config.prompts.review)
|
|
50
|
-
: [];
|
|
51
|
-
return Array.from(new Set([...standardModes, ...customModes]));
|
|
52
|
-
}
|
|
53
|
-
hasApiKey() {
|
|
54
|
-
const config = this.configService.getConfig();
|
|
55
|
-
if (!config.llm) {
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
const envName = config.llm.apiKeyEnv ?? 'OPENAI_API_KEY';
|
|
59
|
-
const value = process.env[envName];
|
|
60
|
-
return Boolean(value);
|
|
61
|
-
}
|
|
62
|
-
getApiKeyEnvName() {
|
|
63
|
-
const config = this.configService.getConfig();
|
|
64
|
-
return config.llm?.apiKeyEnv ?? 'OPENAI_API_KEY';
|
|
65
|
-
}
|
|
66
|
-
createAgent(id, instructions) {
|
|
67
|
-
const apiKey = this.getApiKey();
|
|
68
|
-
const modelId = this.getModelId();
|
|
69
|
-
return new agent_1.Agent({
|
|
70
|
-
id,
|
|
71
|
-
name: id,
|
|
72
|
-
instructions,
|
|
73
|
-
model: {
|
|
74
|
-
id: modelId,
|
|
75
|
-
apiKey,
|
|
76
|
-
},
|
|
77
|
-
maxRetries: 1,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
async buildReviewPrompt(diff, mode) {
|
|
81
|
-
const config = this.configService.getConfig();
|
|
82
|
-
const customPrompt = config.prompts?.review?.[mode];
|
|
83
|
-
if (customPrompt) {
|
|
84
|
-
return this.promptService.load(customPrompt, { diff, mode });
|
|
85
|
-
}
|
|
86
|
-
if (default_prompts_1.STANDARD_REVIEW_MODES.includes(mode)) {
|
|
87
|
-
const defaultPrompt = default_prompts_1.DEFAULT_REVIEW_PROMPTS[mode];
|
|
88
|
-
return (0, default_prompts_1.replacePromptVariables)(defaultPrompt, { diff, mode });
|
|
89
|
-
}
|
|
90
|
-
return (0, default_prompts_1.replacePromptVariables)(default_prompts_1.DEFAULT_REVIEW_PROMPTS.bug, { diff, mode });
|
|
91
|
-
}
|
|
92
|
-
async buildCommitPrompt(diff) {
|
|
93
|
-
const config = this.configService.getConfig();
|
|
94
|
-
const customPrompt = config.prompts?.commit;
|
|
95
|
-
if (customPrompt) {
|
|
96
|
-
return this.promptService.load(customPrompt, { diff });
|
|
97
|
-
}
|
|
98
|
-
return (0, default_prompts_1.replacePromptVariables)(default_prompts_1.DEFAULT_COMMIT_PROMPT, { diff });
|
|
99
|
-
}
|
|
100
|
-
getApiKey() {
|
|
101
|
-
const config = this.configService.getConfig();
|
|
102
|
-
if (!config.llm) {
|
|
103
|
-
throw new Error('LLM configuration not found. Add llm section to kodu.json');
|
|
104
|
-
}
|
|
105
|
-
const envName = config.llm.apiKeyEnv ?? 'OPENAI_API_KEY';
|
|
106
|
-
const value = process.env[envName];
|
|
107
|
-
if (!value) {
|
|
108
|
-
throw new Error(`API key not found: set ${envName} in environment.`);
|
|
109
|
-
}
|
|
110
|
-
return value;
|
|
111
|
-
}
|
|
112
|
-
getModelId() {
|
|
113
|
-
const config = this.configService.getConfig();
|
|
114
|
-
if (!config.llm) {
|
|
115
|
-
throw new Error('LLM configuration not found. Add llm section to kodu.json');
|
|
116
|
-
}
|
|
117
|
-
const model = config.llm.model;
|
|
118
|
-
if (!model.includes('/')) {
|
|
119
|
-
throw new Error(`Invalid model format: "${model}". Expected format "provider/model-name" (e.g., "openai/gpt-4o")`);
|
|
120
|
-
}
|
|
121
|
-
return model;
|
|
122
|
-
}
|
|
123
|
-
getModelSettingsForCommand(command) {
|
|
124
|
-
const config = this.configService.getConfig();
|
|
125
|
-
const commands = config.llm?.commands;
|
|
126
|
-
const defaultMax = command === 'commit' ? constants_1.DEFAULT_COMMIT_TOKENS : constants_1.DEFAULT_REVIEW_TOKENS;
|
|
127
|
-
const base = { maxOutputTokens: defaultMax };
|
|
128
|
-
if (!commands) {
|
|
129
|
-
return base;
|
|
130
|
-
}
|
|
131
|
-
const override = commands[command];
|
|
132
|
-
const settings = override?.modelSettings;
|
|
133
|
-
if (!settings) {
|
|
134
|
-
return base;
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
...settings,
|
|
138
|
-
maxOutputTokens: settings.maxOutputTokens ?? defaultMax,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
cleanCommitMessage(text) {
|
|
142
|
-
const unfenced = text.replace(/^```[a-zA-Z]*\s*/g, '').replace(/```$/g, '');
|
|
143
|
-
const lines = unfenced
|
|
144
|
-
.split('\n')
|
|
145
|
-
.map((line) => line.trim())
|
|
146
|
-
.filter((line) => line.length > 0);
|
|
147
|
-
if (lines.length === 0) {
|
|
148
|
-
return '';
|
|
149
|
-
}
|
|
150
|
-
const first = lines[0]
|
|
151
|
-
.replace(/^"|"$/g, '')
|
|
152
|
-
.replace(/^'|'$/g, '')
|
|
153
|
-
.replace(/^Commit message:?\s*/i, '')
|
|
154
|
-
.trim();
|
|
155
|
-
return first;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
exports.AiService = AiService;
|
|
159
|
-
exports.AiService = AiService = __decorate([
|
|
160
|
-
(0, common_1.Injectable)(),
|
|
161
|
-
__metadata("design:paramtypes", [config_service_1.ConfigService,
|
|
162
|
-
prompt_service_1.PromptService])
|
|
163
|
-
], AiService);
|
|
164
|
-
//# sourceMappingURL=ai.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../../src/shared/ai/ai.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
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.SshModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const ssh_service_1 = require("./ssh.service");
|
|
12
|
-
let SshModule = class SshModule {
|
|
13
|
-
};
|
|
14
|
-
exports.SshModule = SshModule;
|
|
15
|
-
exports.SshModule = SshModule = __decorate([
|
|
16
|
-
(0, common_1.Module)({
|
|
17
|
-
providers: [ssh_service_1.SshService],
|
|
18
|
-
exports: [ssh_service_1.SshService],
|
|
19
|
-
})
|
|
20
|
-
], SshModule);
|
|
21
|
-
//# sourceMappingURL=ssh.module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.module.js","sourceRoot":"","sources":["../../../../src/shared/ssh/ssh.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+CAA2C;AAMpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAJrB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,wBAAU,CAAC;QACvB,OAAO,EAAE,CAAC,wBAAU,CAAC;KACtB,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { ServerConfig } from '../../core/config/config.schema';
|
|
2
|
-
export type SshResult = {
|
|
3
|
-
success: boolean;
|
|
4
|
-
stdout: string;
|
|
5
|
-
stderr: string;
|
|
6
|
-
exitCode: number;
|
|
7
|
-
error?: string;
|
|
8
|
-
};
|
|
9
|
-
export declare class SshService {
|
|
10
|
-
execute(serverConfig: ServerConfig, command: string): Promise<SshResult>;
|
|
11
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
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.SshService = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const execa_1 = require("execa");
|
|
12
|
-
let SshService = class SshService {
|
|
13
|
-
async execute(serverConfig, command) {
|
|
14
|
-
const args = [
|
|
15
|
-
'-i',
|
|
16
|
-
serverConfig.sshKeyPath,
|
|
17
|
-
'-p',
|
|
18
|
-
String(serverConfig.port ?? 22),
|
|
19
|
-
'-o',
|
|
20
|
-
'StrictHostKeyChecking=no',
|
|
21
|
-
'-o',
|
|
22
|
-
'ConnectTimeout=10',
|
|
23
|
-
`${serverConfig.user}@${serverConfig.host}`,
|
|
24
|
-
command,
|
|
25
|
-
];
|
|
26
|
-
try {
|
|
27
|
-
const { stdout, stderr, exitCode } = await (0, execa_1.execa)('ssh', args, {
|
|
28
|
-
env: serverConfig.env,
|
|
29
|
-
});
|
|
30
|
-
return {
|
|
31
|
-
success: (exitCode ?? 0) === 0,
|
|
32
|
-
stdout,
|
|
33
|
-
stderr,
|
|
34
|
-
exitCode: exitCode ?? 0,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
const failure = error;
|
|
39
|
-
return {
|
|
40
|
-
success: false,
|
|
41
|
-
stdout: failure.stdout ?? '',
|
|
42
|
-
stderr: failure.stderr ?? '',
|
|
43
|
-
exitCode: failure.exitCode ?? -1,
|
|
44
|
-
error: failure.shortMessage ?? failure.message ?? 'Unknown SSH error',
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
exports.SshService = SshService;
|
|
50
|
-
exports.SshService = SshService = __decorate([
|
|
51
|
-
(0, common_1.Injectable)()
|
|
52
|
-
], SshService);
|
|
53
|
-
//# sourceMappingURL=ssh.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.service.js","sourceRoot":"","sources":["../../../../src/shared/ssh/ssh.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,iCAA8B;AAYvB,IAAM,UAAU,GAAhB,MAAM,UAAU;IACrB,KAAK,CAAC,OAAO,CACX,YAA0B,EAC1B,OAAe;QAEf,MAAM,IAAI,GAAG;YACX,IAAI;YACJ,YAAY,CAAC,UAAU;YACvB,IAAI;YACJ,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI;YACJ,0BAA0B;YAC1B,IAAI;YACJ,mBAAmB;YACnB,GAAG,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE;YAC3C,OAAO;SACR,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,IAAI,EAAE;gBAC5D,GAAG,EAAE,YAAY,CAAC,GAAG;aACtB,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC;gBAC9B,MAAM;gBACN,MAAM;gBACN,QAAQ,EAAE,QAAQ,IAAI,CAAC;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAMf,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;gBAChC,KAAK,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,OAAO,IAAI,mBAAmB;aACtE,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AA/CY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;GACA,UAAU,CA+CtB"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { writeFile } from 'node:fs/promises';
|
|
2
|
-
import { Command, CommandRunner, Option } from 'nest-commander';
|
|
3
|
-
import { UiService } from '../../core/ui/ui.service';
|
|
4
|
-
import { AiService } from '../../shared/ai/ai.service';
|
|
5
|
-
import { GitService } from '../../shared/git/git.service';
|
|
6
|
-
|
|
7
|
-
type CommitOptions = {
|
|
8
|
-
ci?: boolean;
|
|
9
|
-
output?: string;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
@Command({
|
|
13
|
-
name: 'commit',
|
|
14
|
-
description: 'Generate and apply commit message',
|
|
15
|
-
})
|
|
16
|
-
export class CommitCommand extends CommandRunner {
|
|
17
|
-
constructor(
|
|
18
|
-
private readonly ui: UiService,
|
|
19
|
-
private readonly git: GitService,
|
|
20
|
-
private readonly ai: AiService,
|
|
21
|
-
) {
|
|
22
|
-
super();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@Option({ flags: '--ci', description: 'CI mode: no spinners and dialogs' })
|
|
26
|
-
parseCi(): boolean {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@Option({
|
|
31
|
-
flags: '-o, --output <path>',
|
|
32
|
-
description: 'Save message to file',
|
|
33
|
-
})
|
|
34
|
-
parseOutput(value: string): string {
|
|
35
|
-
return value;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async run(_inputs: string[], options: CommitOptions = {}): Promise<void> {
|
|
39
|
-
const ciMode = Boolean(options.ci);
|
|
40
|
-
const spinner = ciMode
|
|
41
|
-
? undefined
|
|
42
|
-
: this.ui.createSpinner({ text: 'Collecting diff...' }).start();
|
|
43
|
-
|
|
44
|
-
const logProgress = (text: string): void => {
|
|
45
|
-
if (ciMode) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (spinner) {
|
|
49
|
-
spinner.text = text;
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
this.ui.log.info(text);
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const finishProgress = (text: string): void => {
|
|
56
|
-
if (ciMode) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if (spinner) {
|
|
60
|
-
spinner.success(text);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
this.ui.log.success(text);
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
try {
|
|
67
|
-
if (!this.ai.hasApiKey()) {
|
|
68
|
-
const envName = this.ai.getApiKeyEnvName();
|
|
69
|
-
if (spinner) {
|
|
70
|
-
spinner.stop('AI key not found');
|
|
71
|
-
} else {
|
|
72
|
-
this.ui.log.error('AI key not found');
|
|
73
|
-
}
|
|
74
|
-
this.ui.log.warn(`'commit' command requires AI key to work.`);
|
|
75
|
-
this.ui.log.info(`Set key: export ${envName}=<your_key>`);
|
|
76
|
-
this.ui.log.info(
|
|
77
|
-
`Environment variable name is configured via llm.apiKeyEnv in kodu.json`,
|
|
78
|
-
);
|
|
79
|
-
process.exitCode = 1;
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
await this.git.ensureRepo();
|
|
84
|
-
|
|
85
|
-
const hasStaged = await this.git.hasStagedChanges();
|
|
86
|
-
if (!hasStaged) {
|
|
87
|
-
if (spinner) {
|
|
88
|
-
spinner.stop('No staged changes');
|
|
89
|
-
} else {
|
|
90
|
-
this.ui.log.info('No staged changes');
|
|
91
|
-
}
|
|
92
|
-
this.ui.log.warn('First run git add for the required files.');
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const diff = await this.git.getStagedDiff();
|
|
97
|
-
if (!diff.trim()) {
|
|
98
|
-
if (spinner) {
|
|
99
|
-
spinner.stop(
|
|
100
|
-
'Diff is empty - possibly everything excluded by packer.ignore',
|
|
101
|
-
);
|
|
102
|
-
} else {
|
|
103
|
-
this.ui.log.info(
|
|
104
|
-
'Diff is empty - possibly everything excluded by packer.ignore',
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
this.ui.log.warn(
|
|
108
|
-
'Diff is empty: all changes fell into packer.ignore exclusions.',
|
|
109
|
-
);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
logProgress('Generating commit message...');
|
|
114
|
-
const commitMessage = await this.ai.generateCommitMessage(diff);
|
|
115
|
-
|
|
116
|
-
finishProgress('Message ready');
|
|
117
|
-
if (!ciMode) {
|
|
118
|
-
this.ui.log.info(`Suggestion: ${commitMessage}`);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
console.log(commitMessage);
|
|
122
|
-
if (options.output) {
|
|
123
|
-
await writeFile(options.output, commitMessage, { encoding: 'utf8' });
|
|
124
|
-
if (!ciMode) {
|
|
125
|
-
this.ui.log.success(`Message saved to ${options.output}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
} catch (error) {
|
|
129
|
-
if (spinner) {
|
|
130
|
-
spinner.error('Error creating commit');
|
|
131
|
-
} else {
|
|
132
|
-
this.ui.log.error('Error creating commit');
|
|
133
|
-
}
|
|
134
|
-
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
135
|
-
this.ui.log.error(message);
|
|
136
|
-
process.exitCode = 1;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { ConfigModule } from '../../core/config/config.module';
|
|
3
|
-
import { UiModule } from '../../core/ui/ui.module';
|
|
4
|
-
import { AiModule } from '../../shared/ai/ai.module';
|
|
5
|
-
import { GitModule } from '../../shared/git/git.module';
|
|
6
|
-
import { CommitCommand } from './commit.command';
|
|
7
|
-
|
|
8
|
-
@Module({
|
|
9
|
-
imports: [ConfigModule, UiModule, GitModule, AiModule],
|
|
10
|
-
providers: [CommitCommand],
|
|
11
|
-
})
|
|
12
|
-
export class CommitModule {}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Command, CommandRunner } from 'nest-commander';
|
|
2
|
-
import { printJson } from './ops.utils';
|
|
3
|
-
import { OpsEnvCommand } from './subcommands/ops-env.command';
|
|
4
|
-
import { OpsRoutesCommand } from './subcommands/ops-routes.command';
|
|
5
|
-
import { OpsServiceCommand } from './subcommands/ops-service.command';
|
|
6
|
-
import { OpsSysinfoCommand } from './subcommands/ops-sysinfo.command';
|
|
7
|
-
|
|
8
|
-
@Command({
|
|
9
|
-
name: 'ops',
|
|
10
|
-
description: 'Remote server operations for agents',
|
|
11
|
-
subCommands: [
|
|
12
|
-
OpsSysinfoCommand,
|
|
13
|
-
OpsEnvCommand,
|
|
14
|
-
OpsRoutesCommand,
|
|
15
|
-
OpsServiceCommand,
|
|
16
|
-
],
|
|
17
|
-
})
|
|
18
|
-
export class OpsCommand extends CommandRunner {
|
|
19
|
-
async run(): Promise<void> {
|
|
20
|
-
printJson(
|
|
21
|
-
{
|
|
22
|
-
status: 'error',
|
|
23
|
-
code: 'VALIDATION_ERROR',
|
|
24
|
-
error: 'Missing ops subcommand',
|
|
25
|
-
},
|
|
26
|
-
true,
|
|
27
|
-
);
|
|
28
|
-
process.exitCode = 1;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Module } from '@nestjs/common';
|
|
2
|
-
import { ConfigModule } from '../../core/config/config.module';
|
|
3
|
-
import { SshModule } from '../../shared/ssh/ssh.module';
|
|
4
|
-
import { OpsCommand } from './ops.command';
|
|
5
|
-
import { OpsEnvCommand } from './subcommands/ops-env.command';
|
|
6
|
-
import { OpsRoutesCommand } from './subcommands/ops-routes.command';
|
|
7
|
-
import { OpsServiceCommand } from './subcommands/ops-service.command';
|
|
8
|
-
import { OpsSysinfoCommand } from './subcommands/ops-sysinfo.command';
|
|
9
|
-
|
|
10
|
-
@Module({
|
|
11
|
-
imports: [ConfigModule, SshModule],
|
|
12
|
-
providers: [
|
|
13
|
-
OpsCommand,
|
|
14
|
-
OpsSysinfoCommand,
|
|
15
|
-
OpsEnvCommand,
|
|
16
|
-
OpsRoutesCommand,
|
|
17
|
-
OpsServiceCommand,
|
|
18
|
-
],
|
|
19
|
-
})
|
|
20
|
-
export class OpsModule {}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ServerConfig } from '../../core/config/config.schema';
|
|
2
|
-
|
|
3
|
-
export type OpsErrorCode =
|
|
4
|
-
| 'CLI_ERROR'
|
|
5
|
-
| 'CONFIG_ERROR'
|
|
6
|
-
| 'NOT_FOUND'
|
|
7
|
-
| 'VALIDATION_ERROR';
|
|
8
|
-
|
|
9
|
-
export type ResolvedServerConfig = ServerConfig & {
|
|
10
|
-
sshKeyPath: string;
|
|
11
|
-
paths?: {
|
|
12
|
-
apps: string;
|
|
13
|
-
caddy?: string;
|
|
14
|
-
};
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export class OpsCliError extends Error {
|
|
18
|
-
constructor(
|
|
19
|
-
public readonly code: OpsErrorCode,
|
|
20
|
-
message: string,
|
|
21
|
-
) {
|
|
22
|
-
super(message);
|
|
23
|
-
}
|
|
24
|
-
}
|