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.
- package/LICENSE +21 -0
- package/README.md +24 -18
- package/dist/doctor/checks/agentweaver-home.js +57 -0
- package/dist/doctor/checks/category.js +9 -0
- package/dist/doctor/checks/cwd-context.js +69 -0
- package/dist/doctor/checks/env-diagnostics.js +171 -0
- package/dist/doctor/checks/executors.js +106 -0
- package/dist/doctor/checks/flow-readiness.js +305 -0
- package/dist/doctor/checks/node-version.js +79 -0
- package/dist/doctor/checks/register.js +18 -0
- package/dist/doctor/checks/system.js +91 -0
- package/dist/doctor/index.js +4 -0
- package/dist/doctor/orchestrator.js +78 -0
- package/dist/doctor/registry.js +50 -0
- package/dist/doctor/runner.js +89 -0
- package/dist/doctor/types.js +12 -0
- package/dist/index.js +23 -27
- 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 +6 -3
- 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
|
|
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: "
|
|
189
|
-
description:
|
|
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: "
|
|
216
|
-
description:
|
|
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:
|
|
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
|
-
|
|
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) {
|
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
|
}
|