agentweaver 0.1.13 → 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 (28) hide show
  1. package/README.md +19 -19
  2. package/dist/index.js +6 -26
  3. package/dist/interactive-ui.js +25 -25
  4. package/dist/pipeline/declarative-flows.js +1 -0
  5. package/dist/pipeline/flow-specs/auto-common.json +1 -0
  6. package/dist/pipeline/flow-specs/auto-golang.json +2 -1
  7. package/dist/pipeline/flow-specs/bugz/bug-analyze.json +1 -0
  8. package/dist/pipeline/flow-specs/bugz/bug-fix.json +1 -0
  9. package/dist/pipeline/flow-specs/git-commit.json +1 -0
  10. package/dist/pipeline/flow-specs/gitlab/gitlab-diff-review.json +3 -2
  11. package/dist/pipeline/flow-specs/gitlab/gitlab-review.json +3 -2
  12. package/dist/pipeline/flow-specs/gitlab/mr-description.json +1 -0
  13. package/dist/pipeline/flow-specs/go/run-go-linter-loop.json +3 -2
  14. package/dist/pipeline/flow-specs/go/run-go-tests-loop.json +3 -2
  15. package/dist/pipeline/flow-specs/implement.json +1 -0
  16. package/dist/pipeline/flow-specs/plan.json +2 -1
  17. package/dist/pipeline/flow-specs/review/review-fix.json +1 -0
  18. package/dist/pipeline/flow-specs/review/review-loop.json +1 -0
  19. package/dist/pipeline/flow-specs/review/review-project.json +1 -0
  20. package/dist/pipeline/flow-specs/review/review.json +2 -1
  21. package/dist/pipeline/flow-specs/task-describe.json +7 -6
  22. package/dist/pipeline/nodes/git-commit-node.js +1 -1
  23. package/dist/pipeline/nodes/git-status-node.js +1 -1
  24. package/dist/pipeline/nodes/review-findings-form-node.js +8 -8
  25. package/dist/pipeline/nodes/user-input-node.js +2 -2
  26. package/dist/runtime/process-runner.js +2 -2
  27. package/dist/scope.js +2 -2
  28. package/package.json +3 -2
package/README.md CHANGED
@@ -69,25 +69,25 @@ This keeps workflow design in JSON while keeping implementation details in typed
69
69
 
70
70
  User-invokable built-in commands currently map to these flow specs:
71
71
 
72
- - `plan`
73
- - `task-describe`
74
- - `implement`
75
- - `review`
76
- - `review-fix`
77
- - `review-loop`
78
- - `bug-analyze`
79
- - `bug-fix`
80
- - `git-commit`
81
- - `gitlab-diff-review`
82
- - `gitlab-review`
83
- - `mr-description`
84
- - `run-go-tests-loop`
85
- - `run-go-linter-loop`
86
- - `auto-golang`
87
- - `auto-common`
88
- - `doctor`
89
-
90
- There are also built-in nested/helper flows that are loaded declaratively but are not direct top-level CLI commands, for example `review-project`.
72
+ - `plan` — 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
73
+ - `task-describe` — generates a brief task description from a Jira issue or from manual input; when Jira is provided, fetches the issue and summarizes it; otherwise accepts free-form text and analyzes the codebase to produce a richer description
74
+ - `implement` — runs LLM-backed implementation based on previously approved design and plan artifacts; executes code changes locally in the project working directory
75
+ - `review` — 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
76
+ - `review-fix` — 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
77
+ - `review-loop` — 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
78
+ - `bug-analyze` — 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
79
+ - `bug-fix` — 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
80
+ - `git-commit` — 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
81
+ - `gitlab-diff-review` — 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
82
+ - `gitlab-review` — 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
83
+ - `mr-description` — generates a concise merge request description based on the task context and current code changes; produces both markdown and structured JSON artifacts
84
+ - `run-go-tests-loop` — 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
85
+ - `run-go-linter-loop` — 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
86
+ - `auto-golang` — end-to-end resumable pipeline for Go projects: plan → 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
87
+ - `auto-common` — end-to-end resumable pipeline without language-specific checks: plan → implement → review loop; simplified alternative to auto-golang for projects that do not need Go linter/test loops
88
+ - `doctor` — diagnostics command that runs system, executor, and flow readiness health checks; supports filtering by category or check ID and JSON output
89
+
90
+ There are also built-in nested/helper flows that are loaded declaratively but are not direct top-level CLI commands, for example `review-project` (project-level code review used internally when no prior design/plan artifacts are present).
91
91
 
92
92
  ## Requirements
93
93
 
package/dist/index.js CHANGED
@@ -84,7 +84,7 @@ function formatProcessFailure(error) {
84
84
  if (!preview) {
85
85
  return baseMessage;
86
86
  }
87
- return `${baseMessage}\nПричина:\n${preview}`;
87
+ return `${baseMessage}\nReason:\n${preview}`;
88
88
  }
89
89
  function escapeRegExp(value) {
90
90
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -188,8 +188,8 @@ function launchProfileSelectionForm() {
188
188
  const defaultExecutor = DEFAULT_LAUNCH_PROFILE.executor;
189
189
  return {
190
190
  formId: "flow-launch-profile",
191
- title: "Настройки запуска LLM",
192
- description: `Выберите executor для запуска flow. Текущий default: ${defaultExecutor}.`,
191
+ title: "LLM Launch Settings",
192
+ description: `Select an executor for the flow. Current default: ${defaultExecutor}.`,
193
193
  submitLabel: "Continue",
194
194
  fields: [
195
195
  {
@@ -215,8 +215,8 @@ function launchModelSelectionForm(executor) {
215
215
  }));
216
216
  return {
217
217
  formId: "flow-launch-model",
218
- title: "Настройки запуска LLM",
219
- description: `Выберите модель для запуска flow. Текущий default для ${resolvedExecutor}: ${defaultModel}.`,
218
+ title: "LLM Launch Settings",
219
+ description: `Select a model for the flow. Current default for ${resolvedExecutor}: ${defaultModel}.`,
220
220
  submitLabel: "Start",
221
221
  fields: [
222
222
  {
@@ -525,32 +525,12 @@ function autoFlowParams(config, forceRefreshSummary = false) {
525
525
  runGoLinterIteration: nextArtifactIteration(config.taskKey, "run-go-linter-result", "json"),
526
526
  };
527
527
  }
528
- const FLOW_DESCRIPTIONS = {
529
- "auto-golang": "Full task pipeline: planning, implementation, checks, review, review replies, and repeated iterations until ready to merge.",
530
- "bug-analyze": "Analyzes bug from Jira and creates structured artifacts: root cause hypothesis, fix design, and implementation plan.",
531
- "git-commit": "Collects git status/diff, generates commit message via LLM, allows file selection and commit confirmation.",
532
- "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.",
533
- "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.",
534
- "bug-fix": "Takes bug-analyze results as source of truth and implements the bug fix in code.",
535
- "mr-description": "Prepares a brief intent description for a merge request based on the task and current changes.",
536
- plan: "Loads task from Jira and creates design, implementation plan, and QA plan in structured JSON and markdown.",
537
- "task-describe": "Builds a brief task description either from Jira or from quick user-input without Jira.",
538
- implement: "Implements the task from approved design/plan artifacts and runs post-verify builds if needed.",
539
- review: "Runs code review of current changes and writes structured findings artifacts.",
540
- "review-fix": "Fixes issues after review-reply, updates code, and runs mandatory checks after modifications.",
541
- "review-loop": "Iteratively runs review and review-fix cycles up to 5 times until ready-to-merge is achieved.",
542
- "run-go-tests-loop": "Cycles through `./run_go_tests.py` locally, analyzes the last error, and fixes code until successful or attempts exhausted.",
543
- "run-go-linter-loop": "Cycles through `./run_go_linter.py` locally, fixes linter or generation issues, and retries until success.",
544
- };
545
- function flowDescription(id) {
546
- return FLOW_DESCRIPTIONS[id] ?? "Описание для этого flow пока не задано.";
547
- }
548
528
  function interactiveFlowDefinition(entry) {
549
529
  const flow = entry.flow;
550
530
  return {
551
531
  id: entry.id,
552
532
  label: entry.id,
553
- description: flowDescription(entry.id),
533
+ description: flow.description ?? "No description available for this flow.",
554
534
  source: entry.source,
555
535
  treePath: [...entry.treePath],
556
536
  ...(entry.source === "project-local" ? { sourcePath: entry.absolutePath } : {}),
@@ -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
  }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "kind": "task-describe-flow",
3
3
  "version": 1,
4
+ "description": "Generates a brief task description from a Jira issue or from manual input. When Jira is provided, fetches the issue and summarizes it; otherwise accepts free-form text and analyzes the codebase to produce a richer description.",
4
5
  "phases": [
5
6
  {
6
7
  "id": "task_describe",
@@ -12,7 +13,7 @@
12
13
  "formId": { "const": "task-describe-source-input" },
13
14
  "title": { "const": "Task Describe Source" },
14
15
  "description": {
15
- "const": "Укажи либо Jira issue key / browse URL, либо кратко опиши задачу вручную."
16
+ "const": "Provide a Jira issue key / browse URL, or describe the task manually."
16
17
  },
17
18
  "submitLabel": { "const": "Generate description" },
18
19
  "fields": {
@@ -22,7 +23,7 @@
22
23
  "id": "jira_ref",
23
24
  "type": "text",
24
25
  "label": "Jira issue key or browse URL",
25
- "help": "Например: DEMO-3288 или https://jira.example.ru/browse/DEMO-3288. Оставь пустым, если опишешь задачу вручную.",
26
+ "help": "Example: DEMO-3288 or https://jira.example.com/browse/DEMO-3288. Leave empty to describe the task manually.",
26
27
  "required": false
27
28
  }
28
29
  },
@@ -31,11 +32,11 @@
31
32
  "id": "additional_instructions",
32
33
  "type": "text",
33
34
  "label": "Additional instructions",
34
- "help": "Необязательные указания для генерации описания. Например: ссылка на другой локальный репозиторий, связанный проект, ограничения или полезный контекст.",
35
+ "help": "Optional instructions for description generation. Example: link to another local repo, related project, constraints, or useful context.",
35
36
  "required": false,
36
37
  "multiline": true,
37
38
  "rows": 4,
38
- "placeholder": "Например: смотри также ../billing-service, описание API есть в docs/task-templates.md"
39
+ "placeholder": "e.g. see also ../billing-service, API docs in docs/task-templates.md"
39
40
  }
40
41
  },
41
42
  {
@@ -43,11 +44,11 @@
43
44
  "id": "task_description",
44
45
  "type": "text",
45
46
  "label": "Task description",
46
- "help": "Кратко опиши задачу своими словами. Заполни это поле только если Jira нет.",
47
+ "help": "Briefly describe the task in your own words. Fill this field only if Jira is not used.",
47
48
  "required": false,
48
49
  "multiline": true,
49
50
  "rows": 3,
50
- "placeholder": "Например: добавить фильтр по статусу в список заказов и сохранить выбранное значение в URL"
51
+ "placeholder": "e.g. add a status filter to the order list and persist the selected value in the URL"
51
52
  }
52
53
  }
53
54
  ]
@@ -6,7 +6,7 @@ export const gitCommitNode = {
6
6
  async run(context, params) {
7
7
  printInfo(params.labelText ?? "Committing changes");
8
8
  if (context.dryRun) {
9
- printInfo("DRY RUN: git commit не выполнен");
9
+ printInfo("DRY RUN: git commit was not executed");
10
10
  return {
11
11
  value: {
12
12
  output: "",
@@ -187,7 +187,7 @@ export const gitStatusNode = {
187
187
  });
188
188
  const files = parsePorcelain(porcelainOutput);
189
189
  if (files.length === 0) {
190
- throw new TaskRunnerError("Нет изменённых файлов для коммита.");
190
+ throw new TaskRunnerError("No changed files to commit.");
191
191
  }
192
192
  const diff = await context.runtime.runCommand(["git", "diff"], {
193
193
  dryRun: context.dryRun,
@@ -48,8 +48,8 @@ export const reviewFindingsFormNode = {
48
48
  {
49
49
  id: "apply_all",
50
50
  type: "boolean",
51
- label: "Исправить все findings в этой итерации",
52
- help: "Если включено, выбор списка ниже не ограничивает scope исправлений.",
51
+ label: "Fix all findings in this iteration",
52
+ help: "If enabled, the selection list below does not limit the scope of fixes.",
53
53
  default: selectableFindings.length === 0,
54
54
  },
55
55
  ];
@@ -57,8 +57,8 @@ export const reviewFindingsFormNode = {
57
57
  fields.push({
58
58
  id: "selected_findings",
59
59
  type: "multi-select",
60
- label: "Какие findings исправить сейчас",
61
- help: "Space переключает пункт. Если apply_all=false, выберите хотя бы один finding.",
60
+ label: "Which findings to fix now",
61
+ help: "Space toggles an item. If apply_all is off, select at least one finding.",
62
62
  options: selectableFindings.map((finding) => ({
63
63
  value: finding.title,
64
64
  label: `${finding.title} | ${finding.severity || "-"}`,
@@ -80,17 +80,17 @@ export const reviewFindingsFormNode = {
80
80
  fields.push({
81
81
  id: "extra_notes",
82
82
  type: "text",
83
- label: "Дополнительные указания",
84
- help: "Короткий комментарий для этой итерации review-fix.",
83
+ label: "Additional instructions",
84
+ help: "Short comment for this review-fix iteration.",
85
85
  default: "",
86
- placeholder: "Например: исправить только блокеры",
86
+ placeholder: "e.g. fix only blockers",
87
87
  });
88
88
  return {
89
89
  value: {
90
90
  formId: params.formId,
91
91
  title: params.title,
92
92
  ...(params.description ? { description: params.description } : {}),
93
- submitLabel: "Запустить review-fix",
93
+ submitLabel: "Run review-fix",
94
94
  fields,
95
95
  findingCount: selectableFindings.length,
96
96
  },
@@ -46,8 +46,8 @@ function buildTaskDescribePromptSuffix(params, values) {
46
46
  ].join("\n\n")
47
47
  : "",
48
48
  summaryText: additionalInstructions
49
- ? `Источник задачи: Jira\nJira: ${jiraRef}\n\nДополнительные указания:\n${additionalInstructions}`
50
- : `Источник задачи: Jira\nJira: ${jiraRef}`,
49
+ ? `Task source: Jira\nJira: ${jiraRef}\n\nAdditional instructions:\n${additionalInstructions}`
50
+ : `Task source: Jira\nJira: ${jiraRef}`,
51
51
  };
52
52
  }
53
53
  return {
@@ -112,7 +112,7 @@ export async function runCommand(argv, options = {}) {
112
112
  }
113
113
  });
114
114
  if (outputAdapter.renderAuxiliaryOutput !== false) {
115
- printFramedBlock("Запуск", formatLaunchDetails(statusLabel), "cyan");
115
+ printFramedBlock("Launch", formatLaunchDetails(statusLabel), "cyan");
116
116
  }
117
117
  try {
118
118
  const exitCode = await new Promise((resolve, reject) => {
@@ -134,7 +134,7 @@ export async function runCommand(argv, options = {}) {
134
134
  });
135
135
  });
136
136
  if (outputAdapter.renderAuxiliaryOutput !== false) {
137
- printInfo(`Закончили работу: ${statusLabel} (${formatDuration(Date.now() - startedAt)})`);
137
+ printInfo(`Finished: ${statusLabel} (${formatDuration(Date.now() - startedAt)})`);
138
138
  }
139
139
  if (signal?.aborted) {
140
140
  throw Object.assign(new FlowInterruptedError(), {
package/dist/scope.js CHANGED
@@ -104,14 +104,14 @@ export function buildJiraTaskInputForm() {
104
104
  return {
105
105
  formId: "jira-task-input",
106
106
  title: "Jira Task",
107
- description: "Укажи Jira issue key или browse URL для task-driven flow.",
107
+ description: "Provide a Jira issue key or browse URL for a task-driven flow.",
108
108
  submitLabel: "Continue",
109
109
  fields: [
110
110
  {
111
111
  id: "jira_ref",
112
112
  type: "text",
113
113
  label: "Jira issue key or browse URL",
114
- help: "Например: DEMO-3288 или https://jira.example.ru/browse/DEMO-3288",
114
+ help: "Example: DEMO-3288 or https://jira.example.com/browse/DEMO-3288",
115
115
  required: true,
116
116
  },
117
117
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentweaver",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "CLI orchestrator for Jira/Codex engineering workflows",
5
5
  "keywords": [
6
6
  "agent",
@@ -18,7 +18,7 @@
18
18
  "type": "git",
19
19
  "url": "git+https://github.com/seko99/AgentWeaver.git"
20
20
  },
21
- "license": "UNLICENSED",
21
+ "license": "MIT",
22
22
  "type": "module",
23
23
  "main": "dist/index.js",
24
24
  "exports": "./dist/index.js",
@@ -28,6 +28,7 @@
28
28
  "files": [
29
29
  "dist",
30
30
  "README.md",
31
+ "LICENSE",
31
32
  "run_go_tests.py",
32
33
  "run_go_linter.py",
33
34
  "run_go_coverage.sh"