@osolmaz/pi-workflows 0.11.2 → 0.12.1
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 +15 -10
- package/dist/builtins/autoimplement-command-batches.d.ts +52 -0
- package/dist/builtins/autoimplement-command-batches.js +258 -0
- package/dist/builtins/autoimplement-command-batches.js.map +1 -0
- package/dist/builtins/autoimplement.workflow.d.ts +509 -124
- package/dist/builtins/autoimplement.workflow.js +884 -327
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/builtins/catalog.js +5 -3
- package/dist/builtins/catalog.js.map +1 -1
- package/dist/builtins/index.d.ts +4 -1
- package/dist/builtins/index.js +3 -1
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/monitor.workflow.d.ts +2 -4
- package/dist/builtins/monitor.workflow.js +26 -128
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/builtins/pi-agent-group.d.ts +72 -0
- package/dist/builtins/pi-agent-group.js +1087 -0
- package/dist/builtins/pi-agent-group.js.map +1 -0
- package/dist/builtins/plan-approval.workflow.d.ts +39 -5
- package/dist/builtins/plan-approval.workflow.js +92 -14
- package/dist/builtins/plan-approval.workflow.js.map +1 -1
- package/dist/builtins/plan-change.workflow.d.ts +301 -0
- package/dist/builtins/plan-change.workflow.js +256 -0
- package/dist/builtins/plan-change.workflow.js.map +1 -0
- package/dist/builtins/plan-presentation.js +2 -2
- package/dist/builtins/plan-presentation.js.map +1 -1
- package/dist/builtins/sanity-check.workflow.d.ts +85 -0
- package/dist/builtins/sanity-check.workflow.js +482 -0
- package/dist/builtins/sanity-check.workflow.js.map +1 -0
- package/dist/controllers/sqlite.d.ts +90 -2
- package/dist/controllers/sqlite.js +380 -5
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/extension/decision-channels.d.ts +2 -2
- package/dist/extension/decision-channels.js +29 -35
- package/dist/extension/decision-channels.js.map +1 -1
- package/dist/extension/deferred-turn-coordinator.d.ts +32 -0
- package/dist/extension/deferred-turn-coordinator.js +143 -0
- package/dist/extension/deferred-turn-coordinator.js.map +1 -0
- package/dist/extension/deferred-turn.d.ts +44 -0
- package/dist/extension/deferred-turn.js +110 -0
- package/dist/extension/deferred-turn.js.map +1 -0
- package/dist/extension/index.js +348 -80
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/session-events.d.ts +2 -2
- package/dist/extension/step-message.d.ts +1 -0
- package/dist/extension/step-message.js.map +1 -1
- package/dist/extension/widget.js +23 -3
- package/dist/extension/widget.js.map +1 -1
- package/dist/herdr/setup.js +4 -4
- package/dist/render/graph-render.js +1 -2
- package/dist/render/graph-render.js.map +1 -1
- package/dist/viewer/render.js +7 -6
- package/dist/viewer/render.js.map +1 -1
- package/dist/workflows/catalog.js +7 -2
- package/dist/workflows/catalog.js.map +1 -1
- package/dist/workflows/command-batch.d.ts +38 -0
- package/dist/workflows/command-batch.js +176 -0
- package/dist/workflows/command-batch.js.map +1 -0
- package/dist/workflows/composition.js +8 -0
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/decision-presentation.d.ts +1 -1
- package/dist/workflows/decision-presentation.js +51 -38
- package/dist/workflows/decision-presentation.js.map +1 -1
- package/dist/workflows/engine.d.ts +2 -2
- package/dist/workflows/engine.js +22 -17
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/errors.d.ts +13 -0
- package/dist/workflows/errors.js +15 -0
- package/dist/workflows/errors.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +16 -4
- package/dist/workflows/human-decision.js +175 -72
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +3 -2
- package/dist/workflows/index.js +2 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/progress.d.ts +1 -0
- package/dist/workflows/progress.js +15 -3
- package/dist/workflows/progress.js.map +1 -1
- package/dist/workflows/schema.js +12 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/shell.d.ts +4 -0
- package/dist/workflows/shell.js +6 -0
- package/dist/workflows/shell.js.map +1 -1
- package/dist/workflows/store.js +8 -1
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +37 -48
- package/docs/2026-08-18-herdr-piw-plan.md +1 -1
- package/docs/2026-08-20-durable-workflow-launch-plan.md +19 -23
- package/docs/CONTROLLERS.md +2 -2
- package/docs/DEFERRED_TURNS.md +298 -0
- package/docs/DESIGN_PHILOSOPHY.md +1 -1
- package/docs/HUMAN_DECISIONS.md +30 -40
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +17 -27
- package/docs/MONITOR.md +7 -13
- package/docs/WORKFLOW_COMPOSITION.md +10 -9
- package/docs/WORKFLOW_STEP_MESSAGES.md +5 -5
- package/docs/WORKFLOW_UPDATES.md +28 -5
- package/docs/plans/2026-08-04-controller-runtime-plan.md +1 -1
- package/docs/plans/2026-08-05-always-on-workflows-plan.md +1 -1
- package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +9 -9
- package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +1 -1
- package/docs/plans/2026-08-13-session-addressed-workflow-notifications-plan.md +1 -1
- package/docs/plans/2026-08-16-workflow-updates-plan.md +3 -3
- package/docs/plans/2026-08-17-bundled-skills-plan.md +6 -6
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +5 -5
- package/docs/plans/2026-08-19-human-decision-presentations-plan.md +1 -1
- package/docs/plans/2026-08-19-provider-compatible-workflow-tool-schema-plan.md +1 -1
- package/docs/plans/2026-08-19-workflow-composition-plan.md +6 -6
- package/docs/plans/2026-08-20-autoimplement-blocker-challenge-plan.md +3 -3
- package/docs/plans/2026-08-20-bounded-command-batches-plan.md +206 -0
- package/docs/plans/2026-08-20-herdr-plugin-sync-plan.md +9 -9
- package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +242 -0
- package/docs/plans/2026-08-21-deferred-turn-intents-plan.md +324 -0
- package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +322 -0
- package/docs/plans/2026-08-21-sanity-check-plan.md +283 -0
- package/docs/run-bundles.md +8 -6
- package/docs/workflows.md +85 -22
- package/examples/workflows/approved-plan.workflow.ts +19 -46
- package/examples/workflows/command-batch.workflow.ts +50 -0
- package/examples/workflows/sanity-check.workflow.ts +1 -0
- package/herdr-plugin.toml +3 -3
- package/package.json +7 -7
- package/schemas/decision-presentation-v1.schema.json +1 -1
- package/schemas/human-decision-accepted-v1.schema.json +16 -4
- package/schemas/human-decision-answer-attempt-v1.schema.json +1 -1
- package/schemas/human-decision-cancellation-v1.schema.json +1 -1
- package/schemas/human-decision-continuation-v1.schema.json +11 -2
- package/schemas/human-decision-delivery-v1.schema.json +9 -1
- package/schemas/human-decision-receipt-v1.schema.json +9 -1
- package/schemas/human-decision-request-v1.schema.json +25 -5
- package/schemas/human-decision-resolution-v1.schema.json +1 -1
- package/schemas/human-decision-settlement-v1.schema.json +1 -1
- package/skills/autodoc/SKILL.md +33 -2
- package/skills/autoimplement/SKILL.md +93 -12
- package/skills/autoplan/SKILL.md +26 -2
- package/skills/monitor/SKILL.md +66 -24
- package/skills/pi-workflows/SKILL.md +21 -6
- package/skills/sanity-check/SKILL.md +44 -0
- package/src/builtins/autoimplement-command-batches.ts +364 -0
- package/src/builtins/autoimplement.workflow.ts +1075 -370
- package/src/builtins/catalog.ts +5 -3
- package/src/builtins/index.ts +24 -0
- package/src/builtins/monitor.workflow.ts +27 -150
- package/src/builtins/pi-agent-group.ts +1407 -0
- package/src/builtins/plan-approval.workflow.ts +157 -24
- package/src/builtins/plan-change.workflow.ts +321 -0
- package/src/builtins/plan-presentation.ts +2 -2
- package/src/builtins/sanity-check.workflow.ts +769 -0
- package/src/controllers/sqlite.ts +580 -7
- package/src/extension/decision-channels.ts +36 -66
- package/src/extension/deferred-turn-coordinator.ts +171 -0
- package/src/extension/deferred-turn.ts +166 -0
- package/src/extension/index.ts +438 -90
- package/src/extension/session-events.ts +2 -2
- package/src/extension/step-message.ts +1 -0
- package/src/extension/widget.ts +24 -5
- package/src/herdr/setup.ts +4 -4
- package/src/render/graph-render.ts +1 -2
- package/src/viewer/render.ts +7 -6
- package/src/workflows/catalog.ts +7 -2
- package/src/workflows/command-batch.ts +254 -0
- package/src/workflows/composition.ts +9 -0
- package/src/workflows/decision-presentation.ts +56 -43
- package/src/workflows/engine.ts +25 -20
- package/src/workflows/errors.ts +24 -0
- package/src/workflows/human-decision.ts +218 -101
- package/src/workflows/index.ts +20 -11
- package/src/workflows/progress.ts +18 -3
- package/src/workflows/schema.ts +19 -1
- package/src/workflows/shell.ts +10 -0
- package/src/workflows/store.ts +8 -1
- package/src/workflows/types.ts +43 -59
- package/schemas/human-decision-accepted-v2.schema.json +0 -50
- package/schemas/human-decision-delivery-v2.schema.json +0 -36
- package/schemas/human-decision-receipt-v2.schema.json +0 -39
- package/schemas/human-decision-request-v2.schema.json +0 -69
- package/schemas/human-decision-resolution-v2.schema.json +0 -27
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# pi-workflows
|
|
2
2
|
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="assets/cover.svg" alt="pi-workflows: a representative multi-step workflow graph with plan, implement, verify, review, a fix loop, and a clean finish" width="880">
|
|
5
|
+
</p>
|
|
6
|
+
|
|
3
7
|
pi-workflows is a workflow extension for the [pi coding agent](https://pi.dev).
|
|
4
8
|
It lets you define multi-step agent workflows as TypeScript graphs, trigger
|
|
5
9
|
them at any point in a pi conversation with `/workflow`, and watch them run
|
|
@@ -36,13 +40,14 @@ Or try the npm package without installing it:
|
|
|
36
40
|
pi -e npm:@osolmaz/pi-workflows
|
|
37
41
|
```
|
|
38
42
|
|
|
39
|
-
The Pi package includes the extension and
|
|
43
|
+
The Pi package includes the extension and six optional skills:
|
|
40
44
|
|
|
41
45
|
- `pi-workflows` teaches the agent how to operate and author workflows.
|
|
42
46
|
- `monitor` starts and operates the built-in monitor workflow.
|
|
43
47
|
- `autoplan` selects the best practical solution and writes an implementation plan.
|
|
44
48
|
- `autodoc` records an existing plan in canonical documentation.
|
|
45
49
|
- `autoimplement` implements an existing plan and verifies the result.
|
|
50
|
+
- `sanity-check` reviews whether a contribution is necessary, focused, and well supported.
|
|
46
51
|
|
|
47
52
|
Pi discovers these skills when it loads the package. Use `pi config` to disable
|
|
48
53
|
the extension, all bundled skills, or one skill independently. The equivalent
|
|
@@ -76,14 +81,14 @@ or run it in place with `npx tsx src/viewer/cli.ts`.
|
|
|
76
81
|
|
|
77
82
|
## Herdr integration
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
`piw` and
|
|
84
|
+
pi-workflows also ships as a [Herdr](https://herdr.dev) plugin. After installing
|
|
85
|
+
`piw` and pi-workflows, synchronize the bundled plugin:
|
|
81
86
|
|
|
82
87
|
```bash
|
|
83
88
|
pi-workflows herdr sync
|
|
84
89
|
```
|
|
85
90
|
|
|
86
|
-
Run the same command after a
|
|
91
|
+
Run the same command after a pi-workflows update. It finds the package that
|
|
87
92
|
provides the running CLI and repairs a Herdr link when npm moved that package.
|
|
88
93
|
`pi-workflows herdr setup` remains an alias for existing installations. Use
|
|
89
94
|
`--json` for versioned machine-readable output. The [Herdr plugin sync
|
|
@@ -94,7 +99,7 @@ When Pi runs inside Herdr, a workflow widget shows `Ctrl+Shift+R piw`. When the
|
|
|
94
99
|
The shortcut opens the exact run bundle and lets you choose a split, tab, or new
|
|
95
100
|
workspace. `/piw` opens the same menu, and `/piw right`, `/piw below`, `/piw
|
|
96
101
|
left`, `/piw above`, `/piw tab`, or `/piw workspace` selects a placement
|
|
97
|
-
directly. If a viewer for that run already exists,
|
|
102
|
+
directly. If a viewer for that run already exists, pi-workflows focuses it
|
|
98
103
|
instead of opening a duplicate.
|
|
99
104
|
|
|
100
105
|
The plugin uses Herdr's public pane APIs and runs no service or polling loop. It
|
|
@@ -130,7 +135,7 @@ Then, from any pi conversation:
|
|
|
130
135
|
```
|
|
131
136
|
|
|
132
137
|
A model-started workflow is saved before the tool reports it as queued. The returned run ID works
|
|
133
|
-
with `workflow status` and `workflow cancel` before execution starts.
|
|
138
|
+
with `workflow status` and `workflow cancel` before execution starts. pi-workflows waits for the
|
|
134
139
|
current agent turn to settle before activation. If activation fails, it saves the failure and sends
|
|
135
140
|
one follow-up turn so the model can correct the cause and start a new run.
|
|
136
141
|
|
|
@@ -191,7 +196,7 @@ The model can use the same `workflow` tool to list, start, inspect, pause,
|
|
|
191
196
|
resume, cancel, and answer workflows. Step contracts use the tool's `submit`
|
|
192
197
|
action. Slash commands and model actions share one lifecycle implementation.
|
|
193
198
|
|
|
194
|
-
|
|
199
|
+
pi-workflows includes a `monitor` workflow for plain-language requests such as:
|
|
195
200
|
|
|
196
201
|
> Monitor PR 123 every 30 minutes. Report failed checks. Stop when it is merged or closed.
|
|
197
202
|
|
|
@@ -352,7 +357,7 @@ example set. Copy any of them into `.pi/workflows/` to use them:
|
|
|
352
357
|
a detailed implementation plan, using the ideal end state as guidance rather
|
|
353
358
|
than an out-of-scope requirement.
|
|
354
359
|
- `autoimplement` finds a clear existing plan, documents it when needed,
|
|
355
|
-
implements and verifies it, writes and runs the exact
|
|
360
|
+
implements and verifies it, writes and runs the exact pi-reviewer command,
|
|
356
361
|
tracks P0 through P2, handles PR comments and CI, and
|
|
357
362
|
finalizes the PR. P0 and P1 fixes require another review. P2-only work is
|
|
358
363
|
verified without another reviewer round. A five-minute CI wait routes to
|
|
@@ -361,8 +366,8 @@ example set. Copy any of them into `.pi/workflows/` to use them:
|
|
|
361
366
|
- `human-decision` shows a reusable verified-human gate with a structured
|
|
362
367
|
machine subject, a separate readable operator presentation, plain choices,
|
|
363
368
|
and exact replan text.
|
|
364
|
-
- `approved-plan`
|
|
365
|
-
|
|
369
|
+
- `approved-plan` includes the shared plan-change workflow, which composes
|
|
370
|
+
autoplan, autodoc, the configurable plan decision, and bounded replanning.
|
|
366
371
|
- `autoresearch` runs an iterative feature-search loop in the style of
|
|
367
372
|
[karpathy/autoresearch](https://github.com/karpathy/autoresearch): setup
|
|
368
373
|
creates a frozen evaluation harness, one editable feature file, and a
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type CommandBatchItem } from "../workflows/command-batch.js";
|
|
2
|
+
export declare const REVIEW_TIMEOUT_MS: number;
|
|
3
|
+
export declare const CI_WATCH_TIMEOUT_MS: number;
|
|
4
|
+
export declare const VERIFICATION_TIMEOUT_MS: number;
|
|
5
|
+
export declare const AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS = 1000000;
|
|
6
|
+
export declare const AUTOIMPLEMENT_MAX_CONCURRENCY = 8;
|
|
7
|
+
export type AutoimplementConcurrency = {
|
|
8
|
+
reviewer: number;
|
|
9
|
+
ciWatch: number;
|
|
10
|
+
verification: number;
|
|
11
|
+
};
|
|
12
|
+
export type PublishedRepository = {
|
|
13
|
+
id: string;
|
|
14
|
+
repository: string;
|
|
15
|
+
branch: string;
|
|
16
|
+
baseBranch: string;
|
|
17
|
+
headRevision: string;
|
|
18
|
+
pr: string;
|
|
19
|
+
dependencyFingerprint?: string;
|
|
20
|
+
};
|
|
21
|
+
export type PublishedRepositories = {
|
|
22
|
+
repositories: PublishedRepository[];
|
|
23
|
+
};
|
|
24
|
+
export type VerificationCommandPlan = {
|
|
25
|
+
commands: CommandBatchItem[];
|
|
26
|
+
untested: string[];
|
|
27
|
+
};
|
|
28
|
+
export type CiTargetInspection = {
|
|
29
|
+
id: string;
|
|
30
|
+
repository: string;
|
|
31
|
+
headRevision: string;
|
|
32
|
+
pr: string;
|
|
33
|
+
route: "green" | "failed" | "pending" | "unavailable";
|
|
34
|
+
reason: string;
|
|
35
|
+
relatedFailures: string[];
|
|
36
|
+
unrelatedFailures: string[];
|
|
37
|
+
trackingCommand?: CommandBatchItem;
|
|
38
|
+
};
|
|
39
|
+
export type CiInspectionBatch = {
|
|
40
|
+
route: "green" | "failed" | "pending" | "unavailable";
|
|
41
|
+
reason: string;
|
|
42
|
+
relatedFailures: string[];
|
|
43
|
+
unrelatedFailures: string[];
|
|
44
|
+
targets: CiTargetInspection[];
|
|
45
|
+
};
|
|
46
|
+
export declare function parseAutoimplementConcurrency(value: unknown): AutoimplementConcurrency;
|
|
47
|
+
export declare function parsePublishedRepositories(value: unknown): PublishedRepositories;
|
|
48
|
+
export declare function reviewerCommand(repository: PublishedRepository): CommandBatchItem;
|
|
49
|
+
export declare function parseVerificationCommandPlan(value: unknown): VerificationCommandPlan;
|
|
50
|
+
export declare function parseCiInspectionBatch(value: unknown): CiInspectionBatch;
|
|
51
|
+
export declare function parseCiCommand(value: unknown, id: string, repository: string, pr: string): CommandBatchItem;
|
|
52
|
+
export declare function repositoryId(repository: string): string;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { MAX_COMMAND_BATCH_ITEMS, validateCommandBatchRequest, } from "../workflows/command-batch.js";
|
|
4
|
+
export const REVIEW_TIMEOUT_MS = 10 * 60_000;
|
|
5
|
+
export const CI_WATCH_TIMEOUT_MS = 5 * 60_000;
|
|
6
|
+
export const VERIFICATION_TIMEOUT_MS = 45 * 60_000;
|
|
7
|
+
export const AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS = 1_000_000;
|
|
8
|
+
export const AUTOIMPLEMENT_MAX_CONCURRENCY = 8;
|
|
9
|
+
export function parseAutoimplementConcurrency(value) {
|
|
10
|
+
if (value === undefined)
|
|
11
|
+
return { reviewer: 4, ciWatch: 4, verification: 2 };
|
|
12
|
+
const input = requireRecord(value, "autoimplement concurrency");
|
|
13
|
+
for (const key of Object.keys(input)) {
|
|
14
|
+
if (key !== "reviewer" && key !== "ciWatch" && key !== "verification") {
|
|
15
|
+
throw new Error(`autoimplement concurrency.${key} is not supported`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
reviewer: concurrencyValue(input.reviewer ?? 4, "reviewer"),
|
|
20
|
+
ciWatch: concurrencyValue(input.ciWatch ?? 4, "ciWatch"),
|
|
21
|
+
verification: concurrencyValue(input.verification ?? 2, "verification"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function parsePublishedRepositories(value) {
|
|
25
|
+
const result = requireRecord(value, "publication result");
|
|
26
|
+
if (!Array.isArray(result.repositories) || result.repositories.length === 0) {
|
|
27
|
+
throw new Error("publication result repositories must be a non-empty array");
|
|
28
|
+
}
|
|
29
|
+
if (result.repositories.length > MAX_COMMAND_BATCH_ITEMS) {
|
|
30
|
+
throw new Error(`publication result repositories must contain at most ${MAX_COMMAND_BATCH_ITEMS} entries`);
|
|
31
|
+
}
|
|
32
|
+
const ids = new Set();
|
|
33
|
+
const repositories = result.repositories.map((entry, index) => {
|
|
34
|
+
const raw = requireRecord(entry, `publication repositories[${index}]`);
|
|
35
|
+
const repository = requireAbsolutePath(raw.repository, `publication repositories[${index}].repository`);
|
|
36
|
+
const id = repositoryId(repository);
|
|
37
|
+
if (ids.has(id))
|
|
38
|
+
throw new Error(`publication repository is duplicated: ${repository}`);
|
|
39
|
+
ids.add(id);
|
|
40
|
+
const dependencyFingerprint = optionalString(raw.dependencyFingerprint, `publication repositories[${index}].dependencyFingerprint`);
|
|
41
|
+
if (raw.pushed !== true) {
|
|
42
|
+
throw new Error(`publication repositories[${index}].pushed must be true`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
repository,
|
|
47
|
+
branch: requireString(raw.branch, `publication repositories[${index}].branch`),
|
|
48
|
+
baseBranch: requireString(raw.baseBranch, `publication repositories[${index}].baseBranch`),
|
|
49
|
+
headRevision: requireString(raw.headRevision, `publication repositories[${index}].headRevision`),
|
|
50
|
+
pr: requireString(raw.pr, `publication repositories[${index}].pr`),
|
|
51
|
+
...(dependencyFingerprint !== undefined ? { dependencyFingerprint } : {}),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
return { repositories };
|
|
55
|
+
}
|
|
56
|
+
export function reviewerCommand(repository) {
|
|
57
|
+
return {
|
|
58
|
+
id: repository.id,
|
|
59
|
+
command: "pi-reviewer",
|
|
60
|
+
args: ["--base", repository.baseBranch],
|
|
61
|
+
cwd: repository.repository,
|
|
62
|
+
timeoutMs: REVIEW_TIMEOUT_MS,
|
|
63
|
+
maxOutputChars: AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function parseVerificationCommandPlan(value) {
|
|
67
|
+
const result = requireRecord(value, "verification command plan");
|
|
68
|
+
if (!Array.isArray(result.commands) || result.commands.length === 0) {
|
|
69
|
+
throw new Error("verification commands must be a non-empty array");
|
|
70
|
+
}
|
|
71
|
+
const directories = new Set();
|
|
72
|
+
const commands = result.commands.map((entry, index) => {
|
|
73
|
+
const command = parseCommandItem(entry, `verification commands[${index}]`, {
|
|
74
|
+
maxTimeoutMs: VERIFICATION_TIMEOUT_MS,
|
|
75
|
+
});
|
|
76
|
+
if (directories.has(command.cwd)) {
|
|
77
|
+
throw new Error(`verification commands must use distinct working directories: ${command.cwd}`);
|
|
78
|
+
}
|
|
79
|
+
directories.add(command.cwd);
|
|
80
|
+
validateVerificationCommand(command, index);
|
|
81
|
+
return command;
|
|
82
|
+
});
|
|
83
|
+
const validated = validateCommandBatchRequest({ items: commands, maxConcurrency: 1 });
|
|
84
|
+
return {
|
|
85
|
+
commands: validated.items,
|
|
86
|
+
untested: stringArray(result.untested ?? [], "verification untested"),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function parseCiInspectionBatch(value) {
|
|
90
|
+
const result = requireRecord(value, "CI inspection");
|
|
91
|
+
if (!Array.isArray(result.targets) || result.targets.length === 0) {
|
|
92
|
+
throw new Error("CI inspection targets must be a non-empty array");
|
|
93
|
+
}
|
|
94
|
+
if (result.targets.length > MAX_COMMAND_BATCH_ITEMS) {
|
|
95
|
+
throw new Error(`CI inspection targets must contain at most ${MAX_COMMAND_BATCH_ITEMS} entries`);
|
|
96
|
+
}
|
|
97
|
+
const ids = new Set();
|
|
98
|
+
const targets = result.targets.map((entry, index) => {
|
|
99
|
+
const raw = requireRecord(entry, `CI targets[${index}]`);
|
|
100
|
+
const repository = requireAbsolutePath(raw.repository, `CI targets[${index}].repository`);
|
|
101
|
+
const id = repositoryId(repository);
|
|
102
|
+
if (ids.has(id))
|
|
103
|
+
throw new Error(`CI target is duplicated: ${repository}`);
|
|
104
|
+
ids.add(id);
|
|
105
|
+
if (raw.route !== "green" &&
|
|
106
|
+
raw.route !== "failed" &&
|
|
107
|
+
raw.route !== "pending" &&
|
|
108
|
+
raw.route !== "unavailable") {
|
|
109
|
+
throw new Error(`CI targets[${index}].route is invalid`);
|
|
110
|
+
}
|
|
111
|
+
const pr = requireString(raw.pr, `CI targets[${index}].pr`);
|
|
112
|
+
const target = {
|
|
113
|
+
id,
|
|
114
|
+
repository,
|
|
115
|
+
headRevision: requireString(raw.headRevision, `CI targets[${index}].headRevision`),
|
|
116
|
+
pr,
|
|
117
|
+
route: raw.route,
|
|
118
|
+
reason: requireString(raw.reason, `CI targets[${index}].reason`),
|
|
119
|
+
relatedFailures: stringArray(raw.relatedFailures ?? [], `CI targets[${index}].relatedFailures`),
|
|
120
|
+
unrelatedFailures: stringArray(raw.unrelatedFailures ?? [], `CI targets[${index}].unrelatedFailures`),
|
|
121
|
+
};
|
|
122
|
+
if (raw.route === "pending") {
|
|
123
|
+
target.trackingCommand = parseCiCommand(raw.trackingCommand, id, repository, pr);
|
|
124
|
+
}
|
|
125
|
+
return target;
|
|
126
|
+
});
|
|
127
|
+
const route = targets.some((target) => target.route === "failed")
|
|
128
|
+
? "failed"
|
|
129
|
+
: targets.some((target) => target.route === "pending")
|
|
130
|
+
? "pending"
|
|
131
|
+
: targets.some((target) => target.route === "unavailable")
|
|
132
|
+
? "unavailable"
|
|
133
|
+
: "green";
|
|
134
|
+
return {
|
|
135
|
+
route,
|
|
136
|
+
reason: targets.map((target) => `${target.id}: ${target.reason}`).join("; "),
|
|
137
|
+
relatedFailures: targets.flatMap((target) => target.relatedFailures),
|
|
138
|
+
unrelatedFailures: targets.flatMap((target) => target.unrelatedFailures),
|
|
139
|
+
targets,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function parseCiCommand(value, id, repository, pr) {
|
|
143
|
+
const raw = requireRecord(value, "CI tracking command");
|
|
144
|
+
if (raw.id !== id)
|
|
145
|
+
throw new Error("CI tracking command id must match the target repository");
|
|
146
|
+
const command = parseCommandItem(raw, "CI tracking command", {
|
|
147
|
+
id,
|
|
148
|
+
command: "gh",
|
|
149
|
+
cwd: repository,
|
|
150
|
+
maxTimeoutMs: CI_WATCH_TIMEOUT_MS,
|
|
151
|
+
});
|
|
152
|
+
const args = command.args;
|
|
153
|
+
const prWatch = (args.length === 3 && args[0] === "pr" && args[1] === "checks" && args[2] === "--watch") ||
|
|
154
|
+
(args.length === 4 &&
|
|
155
|
+
args[0] === "pr" &&
|
|
156
|
+
args[1] === "checks" &&
|
|
157
|
+
args[2] === pr &&
|
|
158
|
+
args[3] === "--watch");
|
|
159
|
+
const runWatch = args.length === 3 &&
|
|
160
|
+
args[0] === "run" &&
|
|
161
|
+
args[1] === "watch" &&
|
|
162
|
+
/^[1-9]\d*$/.test(args[2] ?? "");
|
|
163
|
+
if (!prWatch && !runWatch) {
|
|
164
|
+
throw new Error("CI tracking command args are not allowed for the target PR");
|
|
165
|
+
}
|
|
166
|
+
return { ...command, args: ["pr", "checks", pr, "--watch"] };
|
|
167
|
+
}
|
|
168
|
+
export function repositoryId(repository) {
|
|
169
|
+
const canonical = path.resolve(repository);
|
|
170
|
+
return createHash("sha256").update(canonical).digest("hex").slice(0, 16);
|
|
171
|
+
}
|
|
172
|
+
function parseCommandItem(value, label, options) {
|
|
173
|
+
const raw = requireRecord(value, label);
|
|
174
|
+
const id = options.id ?? requireString(raw.id, `${label}.id`);
|
|
175
|
+
const command = options.command ?? requireString(raw.command, `${label}.command`);
|
|
176
|
+
if (options.command !== undefined && raw.command !== options.command) {
|
|
177
|
+
throw new Error(`${label}.command must be ${options.command}`);
|
|
178
|
+
}
|
|
179
|
+
if (!Array.isArray(raw.args) || raw.args.some((arg) => typeof arg !== "string")) {
|
|
180
|
+
throw new Error(`${label}.args must be an array of strings`);
|
|
181
|
+
}
|
|
182
|
+
const cwd = options.cwd ?? requireAbsolutePath(raw.cwd, `${label}.cwd`);
|
|
183
|
+
if (options.cwd !== undefined && path.resolve(String(raw.cwd)) !== options.cwd) {
|
|
184
|
+
throw new Error(`${label}.cwd must match the target repository`);
|
|
185
|
+
}
|
|
186
|
+
const timeoutMs = positiveInteger(raw.timeoutMs, `${label}.timeoutMs`, options.maxTimeoutMs);
|
|
187
|
+
const maxOutputChars = positiveInteger(raw.maxOutputChars ?? AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS, `${label}.maxOutputChars`, AUTOIMPLEMENT_BATCH_MAX_OUTPUT_CHARS);
|
|
188
|
+
return { id, command, args: [...raw.args], cwd, timeoutMs, maxOutputChars };
|
|
189
|
+
}
|
|
190
|
+
function validateVerificationCommand(command, index) {
|
|
191
|
+
const forbiddenCommands = new Set([
|
|
192
|
+
"ash",
|
|
193
|
+
"bash",
|
|
194
|
+
"cmd",
|
|
195
|
+
"cmd.exe",
|
|
196
|
+
"csh",
|
|
197
|
+
"dash",
|
|
198
|
+
"fish",
|
|
199
|
+
"gh",
|
|
200
|
+
"git",
|
|
201
|
+
"ksh",
|
|
202
|
+
"powershell",
|
|
203
|
+
"powershell.exe",
|
|
204
|
+
"pwsh",
|
|
205
|
+
"pwsh.exe",
|
|
206
|
+
"rm",
|
|
207
|
+
"sh",
|
|
208
|
+
"tcsh",
|
|
209
|
+
"zsh",
|
|
210
|
+
]);
|
|
211
|
+
const executable = path.win32.basename(path.basename(command.command)).toLowerCase();
|
|
212
|
+
if (forbiddenCommands.has(executable)) {
|
|
213
|
+
throw new Error(`verification commands[${index}].command is not allowed`);
|
|
214
|
+
}
|
|
215
|
+
const joined = command.args.join(" ").toLowerCase();
|
|
216
|
+
if (/\b(publish|release|deploy|push|merge)\b/.test(joined)) {
|
|
217
|
+
throw new Error(`verification commands[${index}] contains a mutation or publication action`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function concurrencyValue(value, field) {
|
|
221
|
+
return positiveInteger(value, `autoimplement concurrency.${field}`, AUTOIMPLEMENT_MAX_CONCURRENCY);
|
|
222
|
+
}
|
|
223
|
+
function positiveInteger(value, label, maximum) {
|
|
224
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {
|
|
225
|
+
throw new Error(`${label} must be an integer from 1 through ${maximum}`);
|
|
226
|
+
}
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
function stringArray(value, label) {
|
|
230
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
|
|
231
|
+
throw new Error(`${label} must be an array of strings`);
|
|
232
|
+
}
|
|
233
|
+
return [...value];
|
|
234
|
+
}
|
|
235
|
+
function requireRecord(value, label) {
|
|
236
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
237
|
+
throw new Error(`${label} must be an object`);
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
function requireString(value, label) {
|
|
242
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
243
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
244
|
+
}
|
|
245
|
+
return value;
|
|
246
|
+
}
|
|
247
|
+
function optionalString(value, label) {
|
|
248
|
+
if (value === undefined)
|
|
249
|
+
return undefined;
|
|
250
|
+
return requireString(value, label);
|
|
251
|
+
}
|
|
252
|
+
function requireAbsolutePath(value, label) {
|
|
253
|
+
const resolved = requireString(value, label);
|
|
254
|
+
if (!path.isAbsolute(resolved))
|
|
255
|
+
throw new Error(`${label} must be absolute`);
|
|
256
|
+
return path.resolve(resolved);
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=autoimplement-command-batches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoimplement-command-batches.js","sourceRoot":"","sources":["../../src/builtins/autoimplement-command-batches.ts"],"names":[],"mappings":"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"}
|