agentweaver 0.1.12 → 0.1.14

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +24 -18
  3. package/dist/doctor/checks/agentweaver-home.js +57 -0
  4. package/dist/doctor/checks/category.js +9 -0
  5. package/dist/doctor/checks/cwd-context.js +69 -0
  6. package/dist/doctor/checks/env-diagnostics.js +171 -0
  7. package/dist/doctor/checks/executors.js +106 -0
  8. package/dist/doctor/checks/flow-readiness.js +305 -0
  9. package/dist/doctor/checks/node-version.js +79 -0
  10. package/dist/doctor/checks/register.js +18 -0
  11. package/dist/doctor/checks/system.js +91 -0
  12. package/dist/doctor/index.js +4 -0
  13. package/dist/doctor/orchestrator.js +78 -0
  14. package/dist/doctor/registry.js +50 -0
  15. package/dist/doctor/runner.js +89 -0
  16. package/dist/doctor/types.js +12 -0
  17. package/dist/index.js +23 -27
  18. package/dist/interactive-ui.js +25 -25
  19. package/dist/pipeline/declarative-flows.js +1 -0
  20. package/dist/pipeline/flow-specs/auto-common.json +1 -0
  21. package/dist/pipeline/flow-specs/auto-golang.json +2 -1
  22. package/dist/pipeline/flow-specs/bugz/bug-analyze.json +1 -0
  23. package/dist/pipeline/flow-specs/bugz/bug-fix.json +1 -0
  24. package/dist/pipeline/flow-specs/git-commit.json +1 -0
  25. package/dist/pipeline/flow-specs/gitlab/gitlab-diff-review.json +3 -2
  26. package/dist/pipeline/flow-specs/gitlab/gitlab-review.json +3 -2
  27. package/dist/pipeline/flow-specs/gitlab/mr-description.json +1 -0
  28. package/dist/pipeline/flow-specs/go/run-go-linter-loop.json +3 -2
  29. package/dist/pipeline/flow-specs/go/run-go-tests-loop.json +3 -2
  30. package/dist/pipeline/flow-specs/implement.json +1 -0
  31. package/dist/pipeline/flow-specs/plan.json +2 -1
  32. package/dist/pipeline/flow-specs/review/review-fix.json +1 -0
  33. package/dist/pipeline/flow-specs/review/review-loop.json +1 -0
  34. package/dist/pipeline/flow-specs/review/review-project.json +1 -0
  35. package/dist/pipeline/flow-specs/review/review.json +2 -1
  36. package/dist/pipeline/flow-specs/task-describe.json +7 -6
  37. package/dist/pipeline/nodes/git-commit-node.js +1 -1
  38. package/dist/pipeline/nodes/git-status-node.js +1 -1
  39. package/dist/pipeline/nodes/review-findings-form-node.js +8 -8
  40. package/dist/pipeline/nodes/user-input-node.js +2 -2
  41. package/dist/runtime/process-runner.js +2 -2
  42. package/dist/scope.js +2 -2
  43. package/package.json +6 -3
  44. package/dist/pipeline/flow-model-settings.js +0 -77
@@ -0,0 +1,89 @@
1
+ import { DoctorStatus, ReadinessStatus } from "./types.js";
2
+ import { REGISTRY } from "./registry.js";
3
+ import { DoctorOrchestrator } from "./orchestrator.js";
4
+ import { CATEGORY } from "./checks/category.js";
5
+ import "./checks/register.js";
6
+ const STATUS_ICONS = {
7
+ [DoctorStatus.Ok]: "✓",
8
+ [DoctorStatus.Warn]: "⚠",
9
+ [DoctorStatus.Fail]: "✗",
10
+ };
11
+ const READINESS_LABELS = {
12
+ [ReadinessStatus.Ready]: "Ready",
13
+ [ReadinessStatus.ReadyWithWarnings]: "Ready with warnings",
14
+ [ReadinessStatus.NotReady]: "Not ready",
15
+ };
16
+ const CATEGORY_LABELS = {
17
+ [CATEGORY.SYSTEM]: "System",
18
+ [CATEGORY.EXECUTORS]: "Executors",
19
+ [CATEGORY.ENV_DIAGNOSTICS]: "Environment",
20
+ [CATEGORY.FLOW_READINESS]: "Flow Readiness",
21
+ };
22
+ async function runDoctorCommand(args) {
23
+ const jsonMode = args.includes("--json");
24
+ const filter = args.find((arg) => arg !== "--json");
25
+ const orchestrator = new DoctorOrchestrator();
26
+ const report = await orchestrator.run(undefined, filter);
27
+ if (jsonMode) {
28
+ process.stdout.write(JSON.stringify(report, null, 2));
29
+ return report.overall === ReadinessStatus.NotReady ? 1 : 0;
30
+ }
31
+ const grouped = new Map();
32
+ for (const result of report.checks) {
33
+ const check = REGISTRY.getById(result.id);
34
+ const cat = check?.category ?? "unknown";
35
+ if (!grouped.has(cat)) {
36
+ grouped.set(cat, []);
37
+ }
38
+ grouped.get(cat).push(result);
39
+ }
40
+ const categoryOrder = [
41
+ CATEGORY.SYSTEM,
42
+ CATEGORY.EXECUTORS,
43
+ CATEGORY.ENV_DIAGNOSTICS,
44
+ CATEGORY.FLOW_READINESS,
45
+ ];
46
+ for (const cat of categoryOrder) {
47
+ const items = grouped.get(cat);
48
+ if (!items || items.length === 0)
49
+ continue;
50
+ const label = CATEGORY_LABELS[cat] ?? cat;
51
+ console.log(`## ${label}`);
52
+ console.log();
53
+ for (const result of items) {
54
+ const icon = STATUS_ICONS[result.status];
55
+ const line = `[${icon}] ${result.title} - ${result.message}`;
56
+ console.log(line);
57
+ if (result.hint) {
58
+ console.log(` Hint: ${result.hint}`);
59
+ }
60
+ if (result.details) {
61
+ console.log(` Details: ${result.details}`);
62
+ }
63
+ }
64
+ console.log();
65
+ }
66
+ for (const [cat, items] of grouped) {
67
+ if (categoryOrder.includes(cat))
68
+ continue;
69
+ const label = CATEGORY_LABELS[cat] ?? cat;
70
+ console.log(`## ${label}`);
71
+ console.log();
72
+ for (const result of items) {
73
+ const icon = STATUS_ICONS[result.status];
74
+ const line = `[${icon}] ${result.title} - ${result.message}`;
75
+ console.log(line);
76
+ if (result.hint) {
77
+ console.log(` Hint: ${result.hint}`);
78
+ }
79
+ if (result.details) {
80
+ console.log(` Details: ${result.details}`);
81
+ }
82
+ }
83
+ console.log();
84
+ }
85
+ console.log(`Overall: ${READINESS_LABELS[report.overall]}`);
86
+ console.log(`Timestamp: ${report.timestamp}`);
87
+ return report.overall === ReadinessStatus.NotReady ? 1 : 0;
88
+ }
89
+ export { runDoctorCommand };
@@ -0,0 +1,12 @@
1
+ export var DoctorStatus;
2
+ (function (DoctorStatus) {
3
+ DoctorStatus["Ok"] = "ok";
4
+ DoctorStatus["Warn"] = "warn";
5
+ DoctorStatus["Fail"] = "fail";
6
+ })(DoctorStatus || (DoctorStatus = {}));
7
+ export var ReadinessStatus;
8
+ (function (ReadinessStatus) {
9
+ ReadinessStatus["Ready"] = "ready";
10
+ ReadinessStatus["ReadyWithWarnings"] = "ready_with_warnings";
11
+ ReadinessStatus["NotReady"] = "not_ready";
12
+ })(ReadinessStatus || (ReadinessStatus = {}));
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ import { runCommand } from "./runtime/process-runner.js";
23
23
  import { InteractiveUi } from "./interactive-ui.js";
24
24
  import { bye, printError, printInfo, printPanel, printSummary, setFlowExecutionState, stripAnsi, } from "./tui.js";
25
25
  import { requestUserInputInTerminal } from "./user-input.js";
26
+ import { runDoctorCommand } from "./doctor/index.js";
26
27
  import { attachJiraContext, detectGitBranchName, requestJiraContext, resolveProjectScope, } from "./scope.js";
27
28
  const COMMANDS = [
28
29
  "auto-golang",
@@ -31,6 +32,7 @@ const COMMANDS = [
31
32
  "auto-reset",
32
33
  "bug-analyze",
33
34
  "bug-fix",
35
+ "doctor",
34
36
  "git-commit",
35
37
  "gitlab-diff-review",
36
38
  "gitlab-review",
@@ -82,7 +84,7 @@ function formatProcessFailure(error) {
82
84
  if (!preview) {
83
85
  return baseMessage;
84
86
  }
85
- return `${baseMessage}\nПричина:\n${preview}`;
87
+ return `${baseMessage}\nReason:\n${preview}`;
86
88
  }
87
89
  function escapeRegExp(value) {
88
90
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -97,6 +99,7 @@ function usage() {
97
99
  agentweaver gitlab-review [--dry] [--verbose] [--prompt <text>] [--scope <name>]
98
100
  agentweaver bug-analyze [--dry] [--verbose] [--prompt <text>] <jira-browse-url|jira-issue-key>
99
101
  agentweaver bug-fix [--dry] [--verbose] [--prompt <text>] <jira-browse-url|jira-issue-key>
102
+ agentweaver doctor [<category>|<check-id>] [--json]
100
103
  agentweaver mr-description [--dry] [--verbose] [--prompt <text>] <jira-browse-url|jira-issue-key>
101
104
  agentweaver plan [--dry] [--verbose] [--prompt <text>] [--md-lang <en|ru>] [<jira-browse-url|jira-issue-key>]
102
105
  agentweaver task-describe [--dry] [--verbose] [--prompt <text>] [<jira-browse-url|jira-issue-key>]
@@ -185,8 +188,8 @@ function launchProfileSelectionForm() {
185
188
  const defaultExecutor = DEFAULT_LAUNCH_PROFILE.executor;
186
189
  return {
187
190
  formId: "flow-launch-profile",
188
- title: "Настройки запуска LLM",
189
- description: `Выберите executor для запуска flow. Текущий default: ${defaultExecutor}.`,
191
+ title: "LLM Launch Settings",
192
+ description: `Select an executor for the flow. Current default: ${defaultExecutor}.`,
190
193
  submitLabel: "Continue",
191
194
  fields: [
192
195
  {
@@ -212,8 +215,8 @@ function launchModelSelectionForm(executor) {
212
215
  }));
213
216
  return {
214
217
  formId: "flow-launch-model",
215
- title: "Настройки запуска LLM",
216
- description: `Выберите модель для запуска flow. Текущий default для ${resolvedExecutor}: ${defaultModel}.`,
218
+ title: "LLM Launch Settings",
219
+ description: `Select a model for the flow. Current default for ${resolvedExecutor}: ${defaultModel}.`,
217
220
  submitLabel: "Start",
218
221
  fields: [
219
222
  {
@@ -434,6 +437,7 @@ function buildBaseConfig(command, options = {}) {
434
437
  mdLang: options.mdLang ?? null,
435
438
  dryRun: options.dryRun ?? false,
436
439
  verbose: options.verbose ?? false,
440
+ ...(options.doctorArgs !== undefined ? { doctorArgs: options.doctorArgs } : {}),
437
441
  };
438
442
  }
439
443
  function commandRequiresTask(command) {
@@ -521,32 +525,12 @@ function autoFlowParams(config, forceRefreshSummary = false) {
521
525
  runGoLinterIteration: nextArtifactIteration(config.taskKey, "run-go-linter-result", "json"),
522
526
  };
523
527
  }
524
- const FLOW_DESCRIPTIONS = {
525
- "auto-golang": "Full task pipeline: planning, implementation, checks, review, review replies, and repeated iterations until ready to merge.",
526
- "bug-analyze": "Analyzes bug from Jira and creates structured artifacts: root cause hypothesis, fix design, and implementation plan.",
527
- "git-commit": "Collects git status/diff, generates commit message via LLM, allows file selection and commit confirmation.",
528
- "gitlab-diff-review": "Requests GitLab MR URL via user-input, downloads merge request diff via API, and runs code review with markdown and structured JSON artifacts.",
529
- "gitlab-review": "Requests GitLab MR URL via user-input, downloads code review comments via API, assesses which findings are fair and proposes fixes, then runs review-fix for the selected findings.",
530
- "bug-fix": "Takes bug-analyze results as source of truth and implements the bug fix in code.",
531
- "mr-description": "Prepares a brief intent description for a merge request based on the task and current changes.",
532
- plan: "Loads task from Jira and creates design, implementation plan, and QA plan in structured JSON and markdown.",
533
- "task-describe": "Builds a brief task description either from Jira or from quick user-input without Jira.",
534
- implement: "Implements the task from approved design/plan artifacts and runs post-verify builds if needed.",
535
- review: "Runs code review of current changes and writes structured findings artifacts.",
536
- "review-fix": "Fixes issues after review-reply, updates code, and runs mandatory checks after modifications.",
537
- "review-loop": "Iteratively runs review and review-fix cycles up to 5 times until ready-to-merge is achieved.",
538
- "run-go-tests-loop": "Cycles through `./run_go_tests.py` locally, analyzes the last error, and fixes code until successful or attempts exhausted.",
539
- "run-go-linter-loop": "Cycles through `./run_go_linter.py` locally, fixes linter or generation issues, and retries until success.",
540
- };
541
- function flowDescription(id) {
542
- return FLOW_DESCRIPTIONS[id] ?? "Описание для этого flow пока не задано.";
543
- }
544
528
  function interactiveFlowDefinition(entry) {
545
529
  const flow = entry.flow;
546
530
  return {
547
531
  id: entry.id,
548
532
  label: entry.id,
549
- description: flowDescription(entry.id),
533
+ description: flow.description ?? "No description available for this flow.",
550
534
  source: entry.source,
551
535
  treePath: [...entry.treePath],
552
536
  ...(entry.source === "project-local" ? { sourcePath: entry.absolutePath } : {}),
@@ -755,6 +739,10 @@ function requireJiraConfig(config) {
755
739
  }
756
740
  }
757
741
  async function executeCommand(baseConfig, runFollowupVerify = true, requestUserInput = requestUserInputInTerminal, resolvedScope, setSummary, forceRefreshSummary = false, launchMode = "restart", launchProfile, runtime = runtimeServices) {
742
+ if (baseConfig.command === "doctor") {
743
+ const exitCode = await runDoctorCommand(baseConfig.doctorArgs ?? []);
744
+ return exitCode === 0;
745
+ }
758
746
  const config = buildRuntimeConfig(baseConfig, resolvedScope ?? (await resolveScopeForCommand(baseConfig, requestUserInput)));
759
747
  if (config.command === "auto-golang") {
760
748
  requireJiraConfig(config);
@@ -1058,6 +1046,7 @@ function parseCliArgs(argv) {
1058
1046
  let helpPhases = false;
1059
1047
  let jiraRef;
1060
1048
  let mdLang;
1049
+ const doctorArgs = [];
1061
1050
  for (let index = 1; index < argv.length; index += 1) {
1062
1051
  const token = argv[index] ?? "";
1063
1052
  if (token === "--dry") {
@@ -1110,7 +1099,12 @@ function parseCliArgs(argv) {
1110
1099
  }
1111
1100
  continue;
1112
1101
  }
1113
- jiraRef = token;
1102
+ if (command === "doctor") {
1103
+ doctorArgs.push(token);
1104
+ }
1105
+ else {
1106
+ jiraRef = token;
1107
+ }
1114
1108
  }
1115
1109
  if (command === "auto-golang" && helpPhases) {
1116
1110
  printAutoPhasesHelp();
@@ -1130,6 +1124,7 @@ function parseCliArgs(argv) {
1130
1124
  ...(prompt !== undefined ? { prompt } : {}),
1131
1125
  ...(autoFromPhase !== undefined ? { autoFromPhase } : {}),
1132
1126
  ...(mdLang !== undefined ? { mdLang } : {}),
1127
+ ...(doctorArgs.length > 0 ? { doctorArgs } : {}),
1133
1128
  };
1134
1129
  }
1135
1130
  function buildConfigFromArgs(args) {
@@ -1141,6 +1136,7 @@ function buildConfigFromArgs(args) {
1141
1136
  ...(args.mdLang !== undefined ? { mdLang: args.mdLang } : {}),
1142
1137
  dryRun: args.dry,
1143
1138
  verbose: args.verbose,
1139
+ ...(args.doctorArgs !== undefined ? { doctorArgs: args.doctorArgs } : {}),
1144
1140
  });
1145
1141
  }
1146
1142
  async function runInteractive(jiraRef, forceRefresh = false, scopeName) {
@@ -213,7 +213,7 @@ export class InteractiveUi {
213
213
  top: 3,
214
214
  left: 0,
215
215
  width: "34%",
216
- height: "50%-1",
216
+ height: "50%-4",
217
217
  tags: true,
218
218
  label: " Current Flow ",
219
219
  padding: {
@@ -232,10 +232,10 @@ export class InteractiveUi {
232
232
  });
233
233
  this.flowList = blessed.list({
234
234
  parent: this.screen,
235
- top: "50%+2",
235
+ top: "50%-1",
236
236
  left: 0,
237
237
  width: "34%",
238
- bottom: 11,
238
+ bottom: 14,
239
239
  keys: true,
240
240
  vi: true,
241
241
  mouse: true,
@@ -395,7 +395,7 @@ export class InteractiveUi {
395
395
  bottom: 6,
396
396
  left: 0,
397
397
  width: "34%",
398
- height: 5,
398
+ height: 8,
399
399
  tags: true,
400
400
  label: " Flow Description ",
401
401
  padding: {
@@ -806,19 +806,19 @@ export class InteractiveUi {
806
806
  this.help.setContent(renderMarkdownToTerminal([
807
807
  "AgentWeaver interactive mode",
808
808
  "",
809
- "Клавиши:",
810
- "Up / Down выбрать папку или flow",
811
- "Right раскрыть папку",
812
- "Left свернуть папку или перейти к родителю",
813
- "Enter раскрыть папку или открыть запуск flow",
814
- "Enter подтвердить запуск в модалке",
815
- "Esc закрыть help/модалку или прервать running flow",
816
- "F1 открыть или закрыть help",
817
- "Tab переключить pane",
818
- "Ctrl+L очистить лог",
819
- "q / Ctrl+C выйти",
809
+ "Keys:",
810
+ "Up / Down select folder or flow",
811
+ "Right expand folder",
812
+ "Left collapse folder or go to parent",
813
+ "Enter expand folder or launch flow",
814
+ "Enter confirm launch in modal",
815
+ "Esc close help/modal or interrupt running flow",
816
+ "F1 open or close help",
817
+ "Tab switch pane",
818
+ "Ctrl+L clear log",
819
+ "q / Ctrl+C exit",
820
820
  "",
821
- "Доступные flow:",
821
+ "Available flows:",
822
822
  ...this.options.flows.map((flow) => flow.treePath.join("/")),
823
823
  ].join("\n")));
824
824
  this.footer.setContent(" Up/Down: select | Left/Right: fold | Enter: toggle/run | Esc: close/interrupt | h: help | Tab: switch pane | q: exit ");
@@ -1522,20 +1522,20 @@ export class InteractiveUi {
1522
1522
  if (selectedItem.kind === "folder") {
1523
1523
  const kindLabel = selectedItem.pathSegments[0] === "custom" ? "project-local" : "built-in";
1524
1524
  const folderDescription = [
1525
- `Папка flow \`${selectedItem.pathSegments.join("/")}\`.`,
1525
+ `Flow folder \`${selectedItem.pathSegments.join("/")}\`.`,
1526
1526
  "",
1527
- `Источник: ${kindLabel}`,
1528
- `Статус: ${this.expandedFlowFolders.has(selectedItem.key) ? "развёрнута" : "свёрнута"}`,
1527
+ `Source: ${kindLabel}`,
1528
+ `State: ${this.expandedFlowFolders.has(selectedItem.key) ? "expanded" : "collapsed"}`,
1529
1529
  ].join("\n");
1530
1530
  this.description.setContent(renderMarkdownToTerminal(stripAnsi(folderDescription)));
1531
1531
  return;
1532
1532
  }
1533
1533
  const { flow } = selectedItem;
1534
- const description = flow.description?.trim() || "Описание для этого flow пока не задано.";
1534
+ const description = flow.description?.trim() || "No description available for this flow.";
1535
1535
  const details = [
1536
- `Путь: ${flow.treePath.join("/")}`,
1537
- `Источник: ${flow.source === "project-local" ? "project-local" : "built-in"}`,
1538
- flow.source === "project-local" && flow.sourcePath ? `Файл: ${flow.sourcePath}` : "",
1536
+ `Path: ${flow.treePath.join("/")}`,
1537
+ `Source: ${flow.source === "project-local" ? "project-local" : "built-in"}`,
1538
+ flow.source === "project-local" && flow.sourcePath ? `File: ${flow.sourcePath}` : "",
1539
1539
  ]
1540
1540
  .filter((line) => line.length > 0)
1541
1541
  .join("\n");
@@ -1579,7 +1579,7 @@ export class InteractiveUi {
1579
1579
  renderProgress() {
1580
1580
  const flow = this.progressFlowDefinition();
1581
1581
  if (!flow) {
1582
- this.progress.setContent("Выберите конкретный flow в дереве, чтобы увидеть его прогресс.");
1582
+ this.progress.setContent("Select a flow in the tree to see its progress.");
1583
1583
  return;
1584
1584
  }
1585
1585
  const flowState = this.flowState.flowId === flow.id
@@ -1932,7 +1932,7 @@ export class InteractiveUi {
1932
1932
  flowId,
1933
1933
  resumeAvailable: true,
1934
1934
  hasExistingState: true,
1935
- details: "Текущий flow будет остановлен. Состояние сохранится, и его можно будет продолжить через Resume.",
1935
+ details: "The current flow will be stopped. State will be saved and can be continued via Resume.",
1936
1936
  selectedAction: "stop",
1937
1937
  };
1938
1938
  this.renderConfirm();
@@ -28,6 +28,7 @@ export function loadDeclarativeFlow(flow) {
28
28
  const loaded = {
29
29
  kind: spec.kind,
30
30
  version: spec.version,
31
+ ...(spec.description !== undefined ? { description: spec.description } : {}),
31
32
  constants: spec.constants ?? {},
32
33
  phases,
33
34
  source: ref.source,
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "auto-flow",
3
3
  "version": 1,
4
+ "description": "End-to-end resumable pipeline without language-specific checks. Runs: plan (with Jira fetch and Q&A) → implement → review loop. Simplified alternative to auto-golang for projects that do not need Go linter/test loops.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "plan",
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "kind": "auto-flow",
3
3
  "version": 1,
4
+ "description": "End-to-end resumable pipeline for Go projects. Runs the full sequence: plan (with Jira fetch and Q&A) → implement → linter loop → test loop → review loop → final linter loop → final test loop. Supports --from to restart from a specific phase and auto-status/auto-reset for state management.",
4
5
  "constants": {
5
- "autoReviewFixExtraPrompt": "Исправлять только блокеры, критикалы и важные"
6
+ "autoReviewFixExtraPrompt": "Fix only blockers, criticals, and important findings"
6
7
  },
7
8
  "phases": [
8
9
  {
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "bug-analyze-flow",
3
3
  "version": 1,
4
+ "description": "Fetches a Bug-type Jira issue, validates the issue type, generates or reuses a cached task summary, and produces structured bug analysis: root cause hypothesis, fix design, and step-by-step fix plan.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "bug_analyze",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "bug-fix-flow",
3
3
  "version": 1,
4
+ "description": "Applies the fix designed in bug-analyze. Uses the root cause hypothesis, fix design, and fix plan artifacts as the source of truth to implement code changes locally.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "bug_fix",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "git-commit-flow",
3
3
  "version": 1,
4
+ "description": "Four-phase commit workflow: collects git status and diff, generates a commit message via LLM, presents a file selection form, then shows the editable message for confirmation and executes the commit.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "collect_status",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "gitlab-diff-review-flow",
3
3
  "version": 1,
4
+ "description": "Prompts for a GitLab merge request URL, fetches the MR diff via GitLab API, and runs LLM-backed code review producing structured findings with severity levels and a ready-to-merge verdict.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "gitlab_diff_review",
@@ -11,14 +12,14 @@
11
12
  "params": {
12
13
  "formId": { "const": "gitlab-diff-review-input" },
13
14
  "title": { "const": "GitLab Diff Review" },
14
- "description": { "const": "Укажи ссылку на GitLab merge request, чтобы загрузить diff и запустить код-ревью." },
15
+ "description": { "const": "Provide a GitLab merge request URL to fetch the diff and run code review." },
15
16
  "fields": {
16
17
  "const": [
17
18
  {
18
19
  "id": "merge_request_url",
19
20
  "type": "text",
20
21
  "label": "GitLab MR URL",
21
- "help": "Например: https://gitlab.example.com/group/project/-/merge_requests/123",
22
+ "help": "Example: https://gitlab.example.com/group/project/-/merge_requests/123",
22
23
  "required": true,
23
24
  "placeholder": "https://gitlab.example.com/group/project/-/merge_requests/123"
24
25
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "gitlab-review-flow",
3
3
  "version": 1,
4
+ "description": "Prompts for a GitLab merge request URL, fetches existing code review comments via GitLab API, assesses which findings are fair and which can be dismissed, then runs review-fix to apply fixes for the accepted findings.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "gitlab_review",
@@ -11,14 +12,14 @@
11
12
  "params": {
12
13
  "formId": { "const": "gitlab-review-input" },
13
14
  "title": { "const": "GitLab Review" },
14
- "description": { "const": "Укажи ссылку на GitLab merge request, чтобы загрузить комментарии код-ревью." },
15
+ "description": { "const": "Provide a GitLab merge request URL to fetch code review comments." },
15
16
  "fields": {
16
17
  "const": [
17
18
  {
18
19
  "id": "merge_request_url",
19
20
  "type": "text",
20
21
  "label": "GitLab MR URL",
21
- "help": "Например: https://gitlab.example.com/group/project/-/merge_requests/123",
22
+ "help": "Example: https://gitlab.example.com/group/project/-/merge_requests/123",
22
23
  "required": true,
23
24
  "placeholder": "https://gitlab.example.com/group/project/-/merge_requests/123"
24
25
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "mr-description-flow",
3
3
  "version": 1,
4
+ "description": "Generates a concise merge request description based on the task context and current code changes. Produces both markdown and structured JSON artifacts.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "mr_description",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "run-go-linter-loop-flow",
3
3
  "version": 1,
4
+ "description": "Runs run_go_linter.py and analyzes output. If the linter reports issues, sends them to LLM for a fix and retries. Repeats up to 5 attempts, stopping early on success. Asserts success after the final attempt.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "run_go_linter_try_1",
@@ -70,7 +71,7 @@
70
71
  "appendPrompt": {
71
72
  "base": { "ref": "params.extraPrompt" },
72
73
  "suffix": {
73
- "template": "Последний результат run_go_linter.py сохранён в {result_file}. exitCode={exit_code}, summary={summary}.\nПолный raw-вывод последнего запуска:\n{raw_output}\nИсправь только то, что мешает успешному прохождению проверки.",
74
+ "template": "Latest run_go_linter.py result saved in {result_file}. exitCode={exit_code}, summary={summary}.\nFull raw output of the last run:\n{raw_output}\nFix only what prevents the check from passing.",
74
75
  "vars": {
75
76
  "result_file": {
76
77
  "artifact": {
@@ -197,7 +198,7 @@
197
198
  "appendPrompt": {
198
199
  "base": { "ref": "params.extraPrompt" },
199
200
  "suffix": {
200
- "template": "Последний результат run_go_linter.py сохранён в {result_file}. exitCode={exit_code}, summary={summary}.\nПолный raw-вывод последнего запуска:\n{raw_output}\nИсправь только то, что мешает успешному прохождению проверки.",
201
+ "template": "Latest run_go_linter.py result saved in {result_file}. exitCode={exit_code}, summary={summary}.\nFull raw output of the last run:\n{raw_output}\nFix only what prevents the check from passing.",
201
202
  "vars": {
202
203
  "result_file": {
203
204
  "artifact": {
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "run-go-tests-loop-flow",
3
3
  "version": 1,
4
+ "description": "Runs run_go_tests.py and analyzes failures. If tests fail, sends the error output to LLM for a fix and retries. Repeats up to 5 attempts, stopping early on success. Asserts success after the final attempt.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "run_go_tests_try_1",
@@ -70,7 +71,7 @@
70
71
  "appendPrompt": {
71
72
  "base": { "ref": "params.extraPrompt" },
72
73
  "suffix": {
73
- "template": "Последний результат run_go_tests.py сохранён в {result_file}. exitCode={exit_code}, summary={summary}.\nПолный raw-вывод последнего запуска:\n{raw_output}\nИсправь только то, что мешает успешному прохождению проверки.",
74
+ "template": "Latest run_go_tests.py result saved in {result_file}. exitCode={exit_code}, summary={summary}.\nFull raw output of the last run:\n{raw_output}\nFix only what prevents the check from passing.",
74
75
  "vars": {
75
76
  "result_file": {
76
77
  "artifact": {
@@ -197,7 +198,7 @@
197
198
  "appendPrompt": {
198
199
  "base": { "ref": "params.extraPrompt" },
199
200
  "suffix": {
200
- "template": "Последний результат run_go_tests.py сохранён в {result_file}. exitCode={exit_code}, summary={summary}.\nПолный raw-вывод последнего запуска:\n{raw_output}\nИсправь только то, что мешает успешному прохождению проверки.",
201
+ "template": "Latest run_go_tests.py result saved in {result_file}. exitCode={exit_code}, summary={summary}.\nFull raw output of the last run:\n{raw_output}\nFix only what prevents the check from passing.",
201
202
  "vars": {
202
203
  "result_file": {
203
204
  "artifact": {
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "implement-flow",
3
3
  "version": 1,
4
+ "description": "Runs LLM-backed implementation based on previously approved design and plan artifacts. Executes code changes locally in the project working directory.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "implement",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "plan-flow",
3
3
  "version": 1,
4
+ "description": "Fetches Jira task with attachments, generates clarifying questions for the developer, collects answers, and produces design, implementation plan, and QA plan as structured JSON and markdown artifacts.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "plan",
@@ -158,7 +159,7 @@
158
159
  "formId": { "const": "planning-questions" },
159
160
  "title": { "const": "Planning Questions" },
160
161
  "description": {
161
- "const": "Ответьте на вопросы модели, если они нужны для точного design/plan. Если вопросов нет, шаг завершится автоматически."
162
+ "const": "Answer the model's questions if they are needed for an accurate design/plan. If there are no questions, this step will complete automatically."
162
163
  }
163
164
  }
164
165
  },
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "review-fix-flow",
3
3
  "version": 1,
4
+ "description": "Takes review findings, auto-selects blockers and criticals (or lets the developer pick manually), builds a targeted fix prompt, and applies fixes locally. Runs mandatory checks after modifications.",
4
5
  "constants": {
5
6
  "autoReviewFixExtraPrompt": "Fix only blockers and criticals"
6
7
  },
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "review-loop-flow",
3
3
  "version": 1,
4
+ "description": "Iteratively runs review → review-fix cycles up to 5 times. Stops early when ready-to-merge is achieved. Each iteration auto-selects blockers and critical findings for fixing.",
4
5
  "constants": {
5
6
  "autoReviewFixExtraPrompt": "Fix only blockers and criticals. Skip minor and warning severity."
6
7
  },
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "review-project-flow",
3
3
  "version": 1,
4
+ "description": "Project-level code review. Runs a single LLM review step using the review-project prompt template. Used internally by the review command when no prior design/plan artifacts are present.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "review",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "review-flow",
3
3
  "version": 1,
4
+ "description": "Performs code review of current changes against the task design and plan. Produces structured review findings with severity levels and a ready-to-merge verdict.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "review",
@@ -116,7 +117,7 @@
116
117
  }
117
118
  },
118
119
  "panelTitle": { "const": "Ready To Merge" },
119
- "foundMessage": { "const": "Изменения готовы к merge\nФайл ready-to-merge.md создан." },
120
+ "foundMessage": { "const": "Changes are ready to merge.\nFile ready-to-merge.md has been created." },
120
121
  "tone": { "const": "green" }
121
122
  }
122
123
  }