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.
Files changed (129) hide show
  1. package/AGENTS.md +36 -68
  2. package/README.md +97 -96
  3. package/dist/package.json +1 -2
  4. package/dist/src/app.module.js +0 -8
  5. package/dist/src/app.module.js.map +1 -1
  6. package/dist/src/commands/init/init.command.d.ts +2 -9
  7. package/dist/src/commands/init/init.command.js +15 -241
  8. package/dist/src/commands/init/init.command.js.map +1 -1
  9. package/dist/src/commands/pack/pack.command.d.ts +9 -0
  10. package/dist/src/commands/pack/pack.command.js +72 -3
  11. package/dist/src/commands/pack/pack.command.js.map +1 -1
  12. package/dist/src/core/config/config.schema.d.ts +0 -46
  13. package/dist/src/core/config/config.schema.js +1 -51
  14. package/dist/src/core/config/config.schema.js.map +1 -1
  15. package/dist/src/core/config/config.service.js +2 -2
  16. package/dist/src/core/config/config.service.js.map +1 -1
  17. package/dist/src/core/config/prompt.service.d.ts +1 -4
  18. package/dist/src/core/config/prompt.service.js +4 -17
  19. package/dist/src/core/config/prompt.service.js.map +1 -1
  20. package/dist/src/core/file-system/fs.service.d.ts +1 -0
  21. package/dist/src/core/file-system/fs.service.js +4 -1
  22. package/dist/src/core/file-system/fs.service.js.map +1 -1
  23. package/dist/src/shared/constants.d.ts +0 -4
  24. package/dist/src/shared/constants.js +1 -5
  25. package/dist/src/shared/constants.js.map +1 -1
  26. package/dist/src/shared/git/git.module.js +0 -2
  27. package/dist/src/shared/git/git.module.js.map +1 -1
  28. package/dist/src/shared/git/git.service.d.ts +0 -8
  29. package/dist/src/shared/git/git.service.js +2 -34
  30. package/dist/src/shared/git/git.service.js.map +1 -1
  31. package/dist/src/shared/tokenizer/tokenizer.module.js +0 -2
  32. package/dist/src/shared/tokenizer/tokenizer.module.js.map +1 -1
  33. package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -6
  34. package/dist/src/shared/tokenizer/tokenizer.service.js +8 -38
  35. package/dist/src/shared/tokenizer/tokenizer.service.js.map +1 -1
  36. package/dist/tsconfig.build.tsbuildinfo +1 -1
  37. package/kodu.schema.json +0 -139
  38. package/package.json +1 -2
  39. package/skills/kodu-ops/SKILL.md +184 -0
  40. package/src/app.module.ts +0 -8
  41. package/src/commands/init/init.command.ts +15 -310
  42. package/src/commands/pack/pack.command.ts +66 -3
  43. package/src/core/config/config.schema.ts +1 -68
  44. package/src/core/config/config.service.ts +2 -2
  45. package/src/core/config/prompt.service.ts +4 -26
  46. package/src/core/file-system/fs.service.ts +7 -1
  47. package/src/shared/constants.ts +0 -4
  48. package/src/shared/git/git.module.ts +0 -2
  49. package/src/shared/git/git.service.ts +1 -33
  50. package/src/shared/tokenizer/tokenizer.module.ts +0 -2
  51. package/src/shared/tokenizer/tokenizer.service.ts +9 -39
  52. package/.kodu/prompts/.keep +0 -0
  53. package/.kodu/prompts/commit.md +0 -9
  54. package/.kodu/prompts/pack.md +0 -7
  55. package/.kodu/prompts/review-bug.md +0 -6
  56. package/.kodu/prompts/review-security.md +0 -6
  57. package/.kodu/prompts/review-style.md +0 -6
  58. package/.opencode/command/openspec-apply.md +0 -24
  59. package/.opencode/command/openspec-archive.md +0 -27
  60. package/.opencode/command/openspec-proposal.md +0 -29
  61. package/.opencode/skills/kodu-ops/SKILL.md +0 -60
  62. package/dist/src/commands/commit/commit.command.d.ts +0 -18
  63. package/dist/src/commands/commit/commit.command.js +0 -149
  64. package/dist/src/commands/commit/commit.command.js.map +0 -1
  65. package/dist/src/commands/commit/commit.module.d.ts +0 -2
  66. package/dist/src/commands/commit/commit.module.js +0 -25
  67. package/dist/src/commands/commit/commit.module.js.map +0 -1
  68. package/dist/src/commands/ops/ops.command.d.ts +0 -4
  69. package/dist/src/commands/ops/ops.command.js +0 -39
  70. package/dist/src/commands/ops/ops.command.js.map +0 -1
  71. package/dist/src/commands/ops/ops.module.d.ts +0 -2
  72. package/dist/src/commands/ops/ops.module.js +0 -33
  73. package/dist/src/commands/ops/ops.module.js.map +0 -1
  74. package/dist/src/commands/ops/ops.types.d.ts +0 -13
  75. package/dist/src/commands/ops/ops.types.js +0 -12
  76. package/dist/src/commands/ops/ops.types.js.map +0 -1
  77. package/dist/src/commands/ops/ops.utils.d.ts +0 -13
  78. package/dist/src/commands/ops/ops.utils.js +0 -121
  79. package/dist/src/commands/ops/ops.utils.js.map +0 -1
  80. package/dist/src/commands/ops/subcommands/ops-env.command.d.ts +0 -24
  81. package/dist/src/commands/ops/subcommands/ops-env.command.js +0 -156
  82. package/dist/src/commands/ops/subcommands/ops-env.command.js.map +0 -1
  83. package/dist/src/commands/ops/subcommands/ops-routes.command.d.ts +0 -22
  84. package/dist/src/commands/ops/subcommands/ops-routes.command.js +0 -203
  85. package/dist/src/commands/ops/subcommands/ops-routes.command.js.map +0 -1
  86. package/dist/src/commands/ops/subcommands/ops-service.command.d.ts +0 -22
  87. package/dist/src/commands/ops/subcommands/ops-service.command.js +0 -169
  88. package/dist/src/commands/ops/subcommands/ops-service.command.js.map +0 -1
  89. package/dist/src/commands/ops/subcommands/ops-sysinfo.command.d.ts +0 -14
  90. package/dist/src/commands/ops/subcommands/ops-sysinfo.command.js +0 -75
  91. package/dist/src/commands/ops/subcommands/ops-sysinfo.command.js.map +0 -1
  92. package/dist/src/commands/review/review.command.d.ts +0 -26
  93. package/dist/src/commands/review/review.command.js +0 -205
  94. package/dist/src/commands/review/review.command.js.map +0 -1
  95. package/dist/src/commands/review/review.module.d.ts +0 -2
  96. package/dist/src/commands/review/review.module.js +0 -26
  97. package/dist/src/commands/review/review.module.js.map +0 -1
  98. package/dist/src/core/config/default-prompts.d.ts +0 -9
  99. package/dist/src/core/config/default-prompts.js +0 -49
  100. package/dist/src/core/config/default-prompts.js.map +0 -1
  101. package/dist/src/shared/ai/ai.module.d.ts +0 -2
  102. package/dist/src/shared/ai/ai.module.js +0 -23
  103. package/dist/src/shared/ai/ai.module.js.map +0 -1
  104. package/dist/src/shared/ai/ai.service.d.ts +0 -22
  105. package/dist/src/shared/ai/ai.service.js +0 -164
  106. package/dist/src/shared/ai/ai.service.js.map +0 -1
  107. package/dist/src/shared/ssh/ssh.module.d.ts +0 -2
  108. package/dist/src/shared/ssh/ssh.module.js +0 -21
  109. package/dist/src/shared/ssh/ssh.module.js.map +0 -1
  110. package/dist/src/shared/ssh/ssh.service.d.ts +0 -11
  111. package/dist/src/shared/ssh/ssh.service.js +0 -53
  112. package/dist/src/shared/ssh/ssh.service.js.map +0 -1
  113. package/src/commands/commit/commit.command.ts +0 -139
  114. package/src/commands/commit/commit.module.ts +0 -12
  115. package/src/commands/ops/ops.command.ts +0 -30
  116. package/src/commands/ops/ops.module.ts +0 -20
  117. package/src/commands/ops/ops.types.ts +0 -24
  118. package/src/commands/ops/ops.utils.ts +0 -160
  119. package/src/commands/ops/subcommands/ops-env.command.ts +0 -165
  120. package/src/commands/ops/subcommands/ops-routes.command.ts +0 -221
  121. package/src/commands/ops/subcommands/ops-service.command.ts +0 -190
  122. package/src/commands/ops/subcommands/ops-sysinfo.command.ts +0 -77
  123. package/src/commands/review/review.command.ts +0 -199
  124. package/src/commands/review/review.module.ts +0 -13
  125. package/src/core/config/default-prompts.ts +0 -53
  126. package/src/shared/ai/ai.module.ts +0 -10
  127. package/src/shared/ai/ai.service.ts +0 -216
  128. package/src/shared/ssh/ssh.module.ts +0 -8
  129. package/src/shared/ssh/ssh.service.ts +0 -61
@@ -1,38 +1,20 @@
1
1
  import { Injectable } from '@nestjs/common';
2
2
  import { execa } from 'execa';
3
- import { ConfigService } from '../../core/config/config.service';
4
-
5
- const EXCLUDE_PREFIX = ':(exclude)';
6
3
 
7
4
  @Injectable()
8
5
  export class GitService {
9
- constructor(private readonly configService: ConfigService) {}
10
-
11
6
  async ensureRepo(): Promise<void> {
12
7
  try {
13
8
  await execa('git', ['rev-parse', '--is-inside-work-tree']);
14
9
  } catch (error) {
15
10
  const message =
16
- error instanceof Error && 'stdout' in error
11
+ error instanceof Error && 'stderr' in error
17
12
  ? String((error as { stderr?: string }).stderr ?? error.message)
18
13
  : 'Git repository not found. Initialize git before running the command.';
19
14
  throw new Error(message);
20
15
  }
21
16
  }
22
17
 
23
- async hasStagedChanges(): Promise<boolean> {
24
- const { stdout } = await execa('git', ['diff', '--staged', '--name-only']);
25
- return stdout.trim().length > 0;
26
- }
27
-
28
- async getStagedDiff(): Promise<string> {
29
- await this.ensureRepo();
30
- const excludeArgs = this.buildExcludeArgs();
31
- const args = ['diff', '--staged', '--unified=3', '--', '.', ...excludeArgs];
32
- const { stdout } = await execa('git', args);
33
- return stdout;
34
- }
35
-
36
18
  async getChangedFiles(): Promise<string[]> {
37
19
  await this.ensureRepo();
38
20
  const changed = new Set<string>();
@@ -52,18 +34,4 @@ export class GitService {
52
34
  await load(['ls-files', '--others', '--exclude-standard']);
53
35
  return [...changed].sort();
54
36
  }
55
-
56
- async getStatusShort(): Promise<string> {
57
- const { stdout } = await execa('git', ['status', '--short']);
58
- return stdout.trim();
59
- }
60
-
61
- async commit(message: string): Promise<void> {
62
- await execa('git', ['commit', '-m', message]);
63
- }
64
-
65
- private buildExcludeArgs(): string[] {
66
- const ignore = this.configService.getConfig().packer.ignore ?? [];
67
- return ignore.map((pattern) => `${EXCLUDE_PREFIX}${pattern}`);
68
- }
69
37
  }
@@ -1,9 +1,7 @@
1
1
  import { Module } from '@nestjs/common';
2
- import { ConfigModule } from '../../core/config/config.module';
3
2
  import { TokenizerService } from './tokenizer.service';
4
3
 
5
4
  @Module({
6
- imports: [ConfigModule],
7
5
  providers: [TokenizerService],
8
6
  exports: [TokenizerService],
9
7
  })
@@ -1,60 +1,30 @@
1
1
  import { Injectable } from '@nestjs/common';
2
- import { encodingForModel, getEncoding, type TiktokenModel } from 'js-tiktoken';
3
- import { ConfigService } from '../../core/config/config.service';
4
- import { DEFAULT_LLM_MODEL, DEFAULT_PRICE_PER_MILLION } from '../constants';
2
+ import { encodingForModel, getEncoding } from 'js-tiktoken';
3
+ import { DEFAULT_PRICE_PER_MILLION } from '../constants';
5
4
 
6
5
  type TokenEstimate = {
7
6
  tokens: number;
8
7
  usdEstimate: number;
9
8
  };
10
9
 
11
- const PRICE_PER_MILLION: Record<string, number> = {
12
- 'gpt-4o': 10,
13
- 'gpt-5-mini': 2.5,
14
- };
15
-
16
10
  @Injectable()
17
11
  export class TokenizerService {
18
- private encoder?: ReturnType<typeof encodingForModel>;
19
-
20
- constructor(private readonly configService: ConfigService) {}
12
+ private encoder?: ReturnType<typeof getEncoding>;
21
13
 
22
14
  count(text: string): TokenEstimate {
23
15
  const tokens = this.getEncoder().encode(text).length;
24
- const price = this.getPricePerMillion();
25
- const usdEstimate = price > 0 ? (tokens / 1_000_000) * price : 0;
26
-
16
+ const usdEstimate = (tokens / 1_000_000) * DEFAULT_PRICE_PER_MILLION;
27
17
  return { tokens, usdEstimate };
28
18
  }
29
19
 
30
- private getPricePerMillion(): number {
31
- const config = this.configService.getConfig();
32
- const model = config.llm?.model ?? `openai/${DEFAULT_LLM_MODEL}`;
33
- const key = this.normalizeModelKey(model);
34
- return PRICE_PER_MILLION[key] ?? DEFAULT_PRICE_PER_MILLION;
35
- }
36
-
37
- private createEncoder() {
38
- try {
39
- return encodingForModel(DEFAULT_LLM_MODEL as TiktokenModel);
40
- } catch {
41
- return getEncoding('o200k_base');
42
- }
43
- }
44
-
45
20
  private getEncoder() {
46
21
  if (!this.encoder) {
47
- this.encoder = this.createEncoder();
22
+ try {
23
+ this.encoder = encodingForModel('gpt-4o');
24
+ } catch {
25
+ this.encoder = getEncoding('o200k_base');
26
+ }
48
27
  }
49
-
50
28
  return this.encoder;
51
29
  }
52
-
53
- private normalizeModelKey(model: string): string {
54
- const lower = model.toLowerCase();
55
- if (lower.includes('/')) {
56
- return lower.split('/').pop() ?? lower;
57
- }
58
- return lower;
59
- }
60
30
  }
File without changes
@@ -1,9 +0,0 @@
1
- You generate Conventional Commit messages.
2
- Rules:
3
- - Format: <type>(<optional scope>): <subject>
4
- - Lowercase subject, no trailing period.
5
- - Keep under 70 characters.
6
- - Summarize the diff accurately.
7
-
8
- Diff:
9
- {diff}
@@ -1,7 +0,0 @@
1
- Project context below. Keep instructions concise.
2
-
3
- Files packed ({{tokenCount}} tokens, ~{{usdEstimate}}):
4
- {{fileList}}
5
-
6
- Context:
7
- {{context}}
@@ -1,6 +0,0 @@
1
- You are a strict code reviewer. Response format: concise markdown with bullet points.
2
- Mode: {mode}. Find potential bugs, logical errors, and regressions.
3
- Provide a concise list of issues and recommendations. If no critical issues found, state that.
4
-
5
- Diff:
6
- {diff}
@@ -1,6 +0,0 @@
1
- You are a strict code reviewer. Response format: concise markdown with bullet points.
2
- Mode: {mode}. Find vulnerabilities, secret leaks, improper permission checks.
3
- Provide a concise list of issues and recommendations. If no critical issues found, state that.
4
-
5
- Diff:
6
- {diff}
@@ -1,6 +0,0 @@
1
- You are a strict code reviewer. Response format: concise markdown with bullet points.
2
- Mode: {mode}. Check readability, consistency, formatting, and naming.
3
- Provide a concise list of issues and recommendations. If no critical issues found, state that.
4
-
5
- Diff:
6
- {diff}
@@ -1,24 +0,0 @@
1
- ---
2
- description: Implement an approved OpenSpec change and keep tasks in sync.
3
- ---
4
- The user has requested to implement the following change proposal. Find the change proposal and follow the instructions below. If you're not sure or if ambiguous, ask for clarification from the user.
5
- <UserRequest>
6
- $ARGUMENTS
7
- </UserRequest>
8
- <!-- OPENSPEC:START -->
9
- **Guardrails**
10
- - Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
11
- - Keep changes tightly scoped to the requested outcome.
12
- - Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
13
-
14
- **Steps**
15
- Track these steps as TODOs and complete them one by one.
16
- 1. Read `changes/<id>/proposal.md`, `design.md` (if present), and `tasks.md` to confirm scope and acceptance criteria.
17
- 2. Work through tasks sequentially, keeping edits minimal and focused on the requested change.
18
- 3. Confirm completion before updating statuses—make sure every item in `tasks.md` is finished.
19
- 4. Update the checklist after all work is done so each task is marked `- [x]` and reflects reality.
20
- 5. Reference `openspec list` or `openspec show <item>` when additional context is required.
21
-
22
- **Reference**
23
- - Use `openspec show <id> --json --deltas-only` if you need additional context from the proposal while implementing.
24
- <!-- OPENSPEC:END -->
@@ -1,27 +0,0 @@
1
- ---
2
- description: Archive a deployed OpenSpec change and update specs.
3
- ---
4
- <ChangeId>
5
- $ARGUMENTS
6
- </ChangeId>
7
- <!-- OPENSPEC:START -->
8
- **Guardrails**
9
- - Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
10
- - Keep changes tightly scoped to the requested outcome.
11
- - Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
12
-
13
- **Steps**
14
- 1. Determine the change ID to archive:
15
- - If this prompt already includes a specific change ID (for example inside a `<ChangeId>` block populated by slash-command arguments), use that value after trimming whitespace.
16
- - If the conversation references a change loosely (for example by title or summary), run `openspec list` to surface likely IDs, share the relevant candidates, and confirm which one the user intends.
17
- - Otherwise, review the conversation, run `openspec list`, and ask the user which change to archive; wait for a confirmed change ID before proceeding.
18
- - If you still cannot identify a single change ID, stop and tell the user you cannot archive anything yet.
19
- 2. Validate the change ID by running `openspec list` (or `openspec show <id>`) and stop if the change is missing, already archived, or otherwise not ready to archive.
20
- 3. Run `openspec archive <id> --yes` so the CLI moves the change and applies spec updates without prompts (use `--skip-specs` only for tooling-only work).
21
- 4. Review the command output to confirm the target specs were updated and the change landed in `changes/archive/`.
22
- 5. Validate with `openspec validate --strict --no-interactive` and inspect with `openspec show <id>` if anything looks off.
23
-
24
- **Reference**
25
- - Use `openspec list` to confirm change IDs before archiving.
26
- - Inspect refreshed specs with `openspec list --specs` and address any validation issues before handing off.
27
- <!-- OPENSPEC:END -->
@@ -1,29 +0,0 @@
1
- ---
2
- description: Scaffold a new OpenSpec change and validate strictly.
3
- ---
4
- The user has requested the following change proposal. Use the openspec instructions to create their change proposal.
5
- <UserRequest>
6
- $ARGUMENTS
7
- </UserRequest>
8
- <!-- OPENSPEC:START -->
9
- **Guardrails**
10
- - Favor straightforward, minimal implementations first and add complexity only when it is requested or clearly required.
11
- - Keep changes tightly scoped to the requested outcome.
12
- - Refer to `openspec/AGENTS.md` (located inside the `openspec/` directory—run `ls openspec` or `openspec update` if you don't see it) if you need additional OpenSpec conventions or clarifications.
13
- - Identify any vague or ambiguous details and ask the necessary follow-up questions before editing files.
14
- - Do not write any code during the proposal stage. Only create design documents (proposal.md, tasks.md, design.md, and spec deltas). Implementation happens in the apply stage after approval.
15
-
16
- **Steps**
17
- 1. Review `openspec/project.md`, run `openspec list` and `openspec list --specs`, and inspect related code or docs (e.g., via `rg`/`ls`) to ground the proposal in current behaviour; note any gaps that require clarification.
18
- 2. Choose a unique verb-led `change-id` and scaffold `proposal.md`, `tasks.md`, and `design.md` (when needed) under `openspec/changes/<id>/`.
19
- 3. Map the change into concrete capabilities or requirements, breaking multi-scope efforts into distinct spec deltas with clear relationships and sequencing.
20
- 4. Capture architectural reasoning in `design.md` when the solution spans multiple systems, introduces new patterns, or demands trade-off discussion before committing to specs.
21
- 5. Draft spec deltas in `changes/<id>/specs/<capability>/spec.md` (one folder per capability) using `## ADDED|MODIFIED|REMOVED Requirements` with at least one `#### Scenario:` per requirement and cross-reference related capabilities when relevant.
22
- 6. Draft `tasks.md` as an ordered list of small, verifiable work items that deliver user-visible progress, include validation (tests, tooling), and highlight dependencies or parallelizable work.
23
- 7. Validate with `openspec validate <id> --strict --no-interactive` and resolve every issue before sharing the proposal.
24
-
25
- **Reference**
26
- - Use `openspec show <id> --json --deltas-only` or `openspec show <spec> --type spec` to inspect details when validation fails.
27
- - Search existing requirements with `rg -n "Requirement:|Scenario:" openspec/specs` before writing new ones.
28
- - Explore the codebase with `rg <keyword>`, `ls`, or direct file reads so proposals align with current implementation realities.
29
- <!-- OPENSPEC:END -->
@@ -1,60 +0,0 @@
1
- ---
2
- name: kodu-ops
3
- description: Полный справочник по `kodu ops` на русском — команды, опции и примеры
4
- compatibility: opencode
5
- metadata:
6
- audience: operators
7
- workflow: kodu
8
- ---
9
-
10
- # Навык Kodu Ops
11
-
12
- **Назначение:** показать агенту, как управлять серверами через `kodu ops` без знания точных флагов. Весь текст на русском, есть детальные описания опций и готовые примеры.
13
-
14
- ## Что я умею
15
-
16
- - `sysinfo` собирает диагностические данные (uptime, занятость диска и памяти).
17
- - `env` управляет файлами `.env` на сервере: выдаёт переменные, устанавливает/удаляет ключи и значения.
18
- - `routes` редактирует маршруты Caddy: показывает список, добавляет, обновляет и удаляет блоки reverse proxy.
19
- - `service` работает с Docker Compose: клонирует репозиторий, поднимает, останавливает, показывает логи и статус.
20
-
21
- ## Как использовать
22
-
23
- 1. Вызов `skill({ name: 'kodu-ops' })` отдаёт содержание этого файла агенту.
24
- 2. Пользователь говорит простыми русскими фразами, что хочет сделать (пример ниже).
25
- 3. Агент преобразует фразу в нужные `kodu ops` команды, вызывая каждую из них в порядке описания.
26
- 4. Для каждой команды всегда возвращается JSON с полями `status`, `code`, `error` (при ошибке). Если что-то не так — достаточно посмотреть в `error` и повторить `kodu ops <subcommand> --help`.
27
-
28
- ## Команды
29
-
30
- ### sysinfo
31
- - Флаги: `--server <имя>` (обязательно).
32
- - Описание: собирает uptime, использование диска и памяти на удалённом сервере.
33
- - Пример: `kodu ops sysinfo --server dev`
34
-
35
- ### env
36
- - Флаги: `--server <имя>`, `--action <get|set|unset>`, `--project <путь>`, `--key <ключ>` (для set/unset), `--val <значение>` (только для set).
37
- - Описание: `get` — выводит содержимое `.env`; `set` — добавляет или обновляет переменную (заменяет значение); `unset` — удаляет переменную.
38
- - Пример: `kodu ops env --server dev --action set --project my-app --key PORT --val 3123`
39
-
40
- ### routes
41
- - Флаги: `--server <имя>`, `--action <list|add|remove|update>`, `--domain <домен>` (для add/update/remove), `--upstream <host:port>` (для add/update).
42
- - Описание: `list` — показывает `Caddyfile`, `add` — добавляет блок `domain { reverse_proxy upstream }`, `update` — изменяет upstream, `remove` — удаляет блок.
43
- - Пример: `kodu ops routes --server dev --action add --domain api.example.com --upstream 127.0.0.1:3000`
44
-
45
- ### service
46
- - Флаги: `--server <имя>`, `--action <clone|pull|up|down|logs|status>`, `--project <имя>`, `--repo <url>` (для clone).
47
- - Описание: `clone` — клонирует репозиторий и готовит проект, `up`/`down` поднимает/останавливает, `logs` показывает последние 200 строк, `status` делает `docker compose ps`, `pull` обновляет образ.
48
- - Пример: `kodu ops service --server dev --action clone --project temp --repo https://github.com/org/repo.git`
49
-
50
- ## Примеры сценариев
51
-
52
- 1. «Подскажи sysinfo на сервере dev, затем установи PORT=3123 для проекта temp и добавь маршрут api.example.com → 127.0.0.1:3000.» → агент запускает `sysinfo`, `env --action set`, `routes --action add` по очереди.
53
- 2. «Склонируй проект staff из репозитория и подними его в фоне, потом покажи статус и логи.» → агент вызывает `service clone`, `service up`, `service status`, `service logs`.
54
- 3. «Сними переменные с my-app на prod и удали старый маршрут.» → `env --action unset`, `routes --action remove`.
55
-
56
- ## Когда использовать
57
-
58
- Применяйте, когда нужно администрировать сервер или проект через `kodu ops`, но вы не помните точные флаги. Просто опишите задачу на русском — навык подскажет, какие команды существует и какие опции нужны. При необходимости уточните, что вывод строго JSON, а ошибки находятся в `error`.
59
-
60
- Также можно выполнять много действий в одном запросе: навык объясняет, что команды выполняются по порядку, так что фраза «сначала ... затем ...» корректно переведётся в соответствующую последовательность `kodu ops`.
@@ -1,18 +0,0 @@
1
- import { CommandRunner } from 'nest-commander';
2
- import { UiService } from '../../core/ui/ui.service';
3
- import { AiService } from '../../shared/ai/ai.service';
4
- import { GitService } from '../../shared/git/git.service';
5
- type CommitOptions = {
6
- ci?: boolean;
7
- output?: string;
8
- };
9
- export declare class CommitCommand extends CommandRunner {
10
- private readonly ui;
11
- private readonly git;
12
- private readonly ai;
13
- constructor(ui: UiService, git: GitService, ai: AiService);
14
- parseCi(): boolean;
15
- parseOutput(value: string): string;
16
- run(_inputs: string[], options?: CommitOptions): Promise<void>;
17
- }
18
- export {};
@@ -1,149 +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.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: 'Collecting 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
- if (!this.ai.hasApiKey()) {
61
- const envName = this.ai.getApiKeyEnvName();
62
- if (spinner) {
63
- spinner.stop('AI key not found');
64
- }
65
- else {
66
- this.ui.log.error('AI key not found');
67
- }
68
- this.ui.log.warn(`'commit' command requires AI key to work.`);
69
- this.ui.log.info(`Set key: export ${envName}=<your_key>`);
70
- this.ui.log.info(`Environment variable name is configured via llm.apiKeyEnv in kodu.json`);
71
- process.exitCode = 1;
72
- return;
73
- }
74
- await this.git.ensureRepo();
75
- const hasStaged = await this.git.hasStagedChanges();
76
- if (!hasStaged) {
77
- if (spinner) {
78
- spinner.stop('No staged changes');
79
- }
80
- else {
81
- this.ui.log.info('No staged changes');
82
- }
83
- this.ui.log.warn('First run git add for the required files.');
84
- return;
85
- }
86
- const diff = await this.git.getStagedDiff();
87
- if (!diff.trim()) {
88
- if (spinner) {
89
- spinner.stop('Diff is empty - possibly everything excluded by packer.ignore');
90
- }
91
- else {
92
- this.ui.log.info('Diff is empty - possibly everything excluded by packer.ignore');
93
- }
94
- this.ui.log.warn('Diff is empty: all changes fell into packer.ignore exclusions.');
95
- return;
96
- }
97
- logProgress('Generating commit message...');
98
- const commitMessage = await this.ai.generateCommitMessage(diff);
99
- finishProgress('Message ready');
100
- if (!ciMode) {
101
- this.ui.log.info(`Suggestion: ${commitMessage}`);
102
- }
103
- console.log(commitMessage);
104
- if (options.output) {
105
- await (0, promises_1.writeFile)(options.output, commitMessage, { encoding: 'utf8' });
106
- if (!ciMode) {
107
- this.ui.log.success(`Message saved to ${options.output}`);
108
- }
109
- }
110
- }
111
- catch (error) {
112
- if (spinner) {
113
- spinner.error('Error creating commit');
114
- }
115
- else {
116
- this.ui.log.error('Error creating commit');
117
- }
118
- const message = error instanceof Error ? error.message : 'Unknown error';
119
- this.ui.log.error(message);
120
- process.exitCode = 1;
121
- }
122
- }
123
- };
124
- exports.CommitCommand = CommitCommand;
125
- __decorate([
126
- (0, nest_commander_1.Option)({ flags: '--ci', description: 'CI mode: no spinners and dialogs' }),
127
- __metadata("design:type", Function),
128
- __metadata("design:paramtypes", []),
129
- __metadata("design:returntype", Boolean)
130
- ], CommitCommand.prototype, "parseCi", null);
131
- __decorate([
132
- (0, nest_commander_1.Option)({
133
- flags: '-o, --output <path>',
134
- description: 'Save message to file',
135
- }),
136
- __metadata("design:type", Function),
137
- __metadata("design:paramtypes", [String]),
138
- __metadata("design:returntype", String)
139
- ], CommitCommand.prototype, "parseOutput", null);
140
- exports.CommitCommand = CommitCommand = __decorate([
141
- (0, nest_commander_1.Command)({
142
- name: 'commit',
143
- description: 'Generate and apply commit message',
144
- }),
145
- __metadata("design:paramtypes", [ui_service_1.UiService,
146
- git_service_1.GitService,
147
- ai_service_1.AiService])
148
- ], CommitCommand);
149
- //# sourceMappingURL=commit.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commit.command.js","sourceRoot":"","sources":["../../../../src/commands/commit/commit.command.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare class CommitModule {
2
- }
@@ -1,25 +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.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
@@ -1 +0,0 @@
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"}
@@ -1,4 +0,0 @@
1
- import { CommandRunner } from 'nest-commander';
2
- export declare class OpsCommand extends CommandRunner {
3
- run(): Promise<void>;
4
- }
@@ -1,39 +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.OpsCommand = void 0;
10
- const nest_commander_1 = require("nest-commander");
11
- const ops_utils_1 = require("./ops.utils");
12
- const ops_env_command_1 = require("./subcommands/ops-env.command");
13
- const ops_routes_command_1 = require("./subcommands/ops-routes.command");
14
- const ops_service_command_1 = require("./subcommands/ops-service.command");
15
- const ops_sysinfo_command_1 = require("./subcommands/ops-sysinfo.command");
16
- let OpsCommand = class OpsCommand extends nest_commander_1.CommandRunner {
17
- async run() {
18
- (0, ops_utils_1.printJson)({
19
- status: 'error',
20
- code: 'VALIDATION_ERROR',
21
- error: 'Missing ops subcommand',
22
- }, true);
23
- process.exitCode = 1;
24
- }
25
- };
26
- exports.OpsCommand = OpsCommand;
27
- exports.OpsCommand = OpsCommand = __decorate([
28
- (0, nest_commander_1.Command)({
29
- name: 'ops',
30
- description: 'Remote server operations for agents',
31
- subCommands: [
32
- ops_sysinfo_command_1.OpsSysinfoCommand,
33
- ops_env_command_1.OpsEnvCommand,
34
- ops_routes_command_1.OpsRoutesCommand,
35
- ops_service_command_1.OpsServiceCommand,
36
- ],
37
- })
38
- ], OpsCommand);
39
- //# sourceMappingURL=ops.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops.command.js","sourceRoot":"","sources":["../../../../src/commands/ops/ops.command.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mDAAwD;AACxD,2CAAwC;AACxC,mEAA8D;AAC9D,yEAAoE;AACpE,2EAAsE;AACtE,2EAAsE;AAY/D,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,8BAAa;IAC3C,KAAK,CAAC,GAAG;QACP,IAAA,qBAAS,EACP;YACE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,wBAAwB;SAChC,EACD,IAAI,CACL,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;CACF,CAAA;AAZY,gCAAU;qBAAV,UAAU;IAVtB,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,qCAAqC;QAClD,WAAW,EAAE;YACX,uCAAiB;YACjB,+BAAa;YACb,qCAAgB;YAChB,uCAAiB;SAClB;KACF,CAAC;GACW,UAAU,CAYtB"}
@@ -1,2 +0,0 @@
1
- export declare class OpsModule {
2
- }
@@ -1,33 +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.OpsModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const config_module_1 = require("../../core/config/config.module");
12
- const ssh_module_1 = require("../../shared/ssh/ssh.module");
13
- const ops_command_1 = require("./ops.command");
14
- const ops_env_command_1 = require("./subcommands/ops-env.command");
15
- const ops_routes_command_1 = require("./subcommands/ops-routes.command");
16
- const ops_service_command_1 = require("./subcommands/ops-service.command");
17
- const ops_sysinfo_command_1 = require("./subcommands/ops-sysinfo.command");
18
- let OpsModule = class OpsModule {
19
- };
20
- exports.OpsModule = OpsModule;
21
- exports.OpsModule = OpsModule = __decorate([
22
- (0, common_1.Module)({
23
- imports: [config_module_1.ConfigModule, ssh_module_1.SshModule],
24
- providers: [
25
- ops_command_1.OpsCommand,
26
- ops_sysinfo_command_1.OpsSysinfoCommand,
27
- ops_env_command_1.OpsEnvCommand,
28
- ops_routes_command_1.OpsRoutesCommand,
29
- ops_service_command_1.OpsServiceCommand,
30
- ],
31
- })
32
- ], OpsModule);
33
- //# sourceMappingURL=ops.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ops.module.js","sourceRoot":"","sources":["../../../../src/commands/ops/ops.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,4DAAwD;AACxD,+CAA2C;AAC3C,mEAA8D;AAC9D,yEAAoE;AACpE,2EAAsE;AACtE,2EAAsE;AAY/D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAVrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,EAAE,sBAAS,CAAC;QAClC,SAAS,EAAE;YACT,wBAAU;YACV,uCAAiB;YACjB,+BAAa;YACb,qCAAgB;YAChB,uCAAiB;SAClB;KACF,CAAC;GACW,SAAS,CAAG"}