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.
- package/README.md +19 -19
- package/dist/index.js +6 -26
- package/dist/interactive-ui.js +25 -25
- package/dist/pipeline/declarative-flows.js +1 -0
- package/dist/pipeline/flow-specs/auto-common.json +1 -0
- package/dist/pipeline/flow-specs/auto-golang.json +2 -1
- package/dist/pipeline/flow-specs/bugz/bug-analyze.json +1 -0
- package/dist/pipeline/flow-specs/bugz/bug-fix.json +1 -0
- package/dist/pipeline/flow-specs/git-commit.json +1 -0
- package/dist/pipeline/flow-specs/gitlab/gitlab-diff-review.json +3 -2
- package/dist/pipeline/flow-specs/gitlab/gitlab-review.json +3 -2
- package/dist/pipeline/flow-specs/gitlab/mr-description.json +1 -0
- package/dist/pipeline/flow-specs/go/run-go-linter-loop.json +3 -2
- package/dist/pipeline/flow-specs/go/run-go-tests-loop.json +3 -2
- package/dist/pipeline/flow-specs/implement.json +1 -0
- package/dist/pipeline/flow-specs/plan.json +2 -1
- package/dist/pipeline/flow-specs/review/review-fix.json +1 -0
- package/dist/pipeline/flow-specs/review/review-loop.json +1 -0
- package/dist/pipeline/flow-specs/review/review-project.json +1 -0
- package/dist/pipeline/flow-specs/review/review.json +2 -1
- package/dist/pipeline/flow-specs/task-describe.json +7 -6
- package/dist/pipeline/nodes/git-commit-node.js +1 -1
- package/dist/pipeline/nodes/git-status-node.js +1 -1
- package/dist/pipeline/nodes/review-findings-form-node.js +8 -8
- package/dist/pipeline/nodes/user-input-node.js +2 -2
- package/dist/runtime/process-runner.js +2 -2
- package/dist/scope.js +2 -2
- 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
|
|
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: "
|
|
192
|
-
description:
|
|
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: "
|
|
219
|
-
description:
|
|
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:
|
|
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 } : {}),
|
package/dist/interactive-ui.js
CHANGED
|
@@ -213,7 +213,7 @@ export class InteractiveUi {
|
|
|
213
213
|
top: 3,
|
|
214
214
|
left: 0,
|
|
215
215
|
width: "34%",
|
|
216
|
-
height: "50%-
|
|
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
|
|
235
|
+
top: "50%-1",
|
|
236
236
|
left: 0,
|
|
237
237
|
width: "34%",
|
|
238
|
-
bottom:
|
|
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:
|
|
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
|
|
811
|
-
"Right
|
|
812
|
-
"Left
|
|
813
|
-
"Enter
|
|
814
|
-
"Enter
|
|
815
|
-
"Esc
|
|
816
|
-
"F1
|
|
817
|
-
"Tab
|
|
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
|
-
"
|
|
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
|
-
|
|
1525
|
+
`Flow folder \`${selectedItem.pathSegments.join("/")}\`.`,
|
|
1526
1526
|
"",
|
|
1527
|
-
|
|
1528
|
-
|
|
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() || "
|
|
1534
|
+
const description = flow.description?.trim() || "No description available for this flow.";
|
|
1535
1535
|
const details = [
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
flow.source === "project-local" && 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("
|
|
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: "
|
|
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();
|
|
@@ -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": "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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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: "
|
|
52
|
-
help: "
|
|
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: "
|
|
61
|
-
help: "Space
|
|
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: "
|
|
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: "
|
|
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
|
-
?
|
|
50
|
-
:
|
|
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("
|
|
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(
|
|
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: "
|
|
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: "
|
|
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.
|
|
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": "
|
|
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"
|