@frankzhang2026/opencode-android-orchestrator 0.9.0 → 1.0.0
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/CHANGELOG.md +34 -0
- package/README.md +92 -55
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/android-sdk.d.ts +10 -0
- package/dist/config/android-sdk.d.ts.map +1 -0
- package/dist/config/android-sdk.js +50 -0
- package/dist/config/android-sdk.js.map +1 -0
- package/dist/config/commit-message-prefix.d.ts +31 -0
- package/dist/config/commit-message-prefix.d.ts.map +1 -0
- package/dist/config/commit-message-prefix.js +155 -0
- package/dist/config/commit-message-prefix.js.map +1 -0
- package/dist/config/queue-policy.d.ts +12 -0
- package/dist/config/queue-policy.d.ts.map +1 -0
- package/dist/config/queue-policy.js +18 -0
- package/dist/config/queue-policy.js.map +1 -0
- package/dist/config/verification-policy.d.ts +10 -3
- package/dist/config/verification-policy.d.ts.map +1 -1
- package/dist/config/verification-policy.js +66 -13
- package/dist/config/verification-policy.js.map +1 -1
- package/dist/doctor/index.d.ts.map +1 -1
- package/dist/doctor/index.js +3 -49
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/installation.d.ts.map +1 -1
- package/dist/doctor/installation.js +81 -0
- package/dist/doctor/installation.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/adaptive-templates.d.ts +8 -2
- package/dist/installer/adaptive-templates.d.ts.map +1 -1
- package/dist/installer/adaptive-templates.js +10 -0
- package/dist/installer/adaptive-templates.js.map +1 -1
- package/dist/installer/index.d.ts +1 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +1 -0
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/init.d.ts +4 -1
- package/dist/installer/init.d.ts.map +1 -1
- package/dist/installer/init.js +60 -9
- package/dist/installer/init.js.map +1 -1
- package/dist/installer/install-manifest.d.ts +1 -0
- package/dist/installer/install-manifest.d.ts.map +1 -1
- package/dist/installer/install-manifest.js +6 -1
- package/dist/installer/install-manifest.js.map +1 -1
- package/dist/installer/opencode-config.d.ts +3 -3
- package/dist/installer/opencode-config.js +1 -1
- package/dist/installer/uninstall.d.ts.map +1 -1
- package/dist/installer/uninstall.js +5 -0
- package/dist/installer/uninstall.js.map +1 -1
- package/dist/installer/upgrade.d.ts +5 -1
- package/dist/installer/upgrade.d.ts.map +1 -1
- package/dist/installer/upgrade.js +94 -11
- package/dist/installer/upgrade.js.map +1 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +11 -5
- package/dist/plugin/index.js.map +1 -1
- package/dist/queue/approvals.d.ts +49 -0
- package/dist/queue/approvals.d.ts.map +1 -0
- package/dist/queue/approvals.js +68 -0
- package/dist/queue/approvals.js.map +1 -0
- package/dist/queue/cli.d.ts +3 -0
- package/dist/queue/cli.d.ts.map +1 -0
- package/dist/queue/cli.js +109 -0
- package/dist/queue/cli.js.map +1 -0
- package/dist/queue/executor.d.ts +24 -0
- package/dist/queue/executor.d.ts.map +1 -0
- package/dist/queue/executor.js +445 -0
- package/dist/queue/executor.js.map +1 -0
- package/dist/queue/lifecycle.d.ts +3 -0
- package/dist/queue/lifecycle.d.ts.map +1 -0
- package/dist/queue/lifecycle.js +24 -0
- package/dist/queue/lifecycle.js.map +1 -0
- package/dist/queue/queue.d.ts +154 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +411 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/service.d.ts +15 -0
- package/dist/queue/service.d.ts.map +1 -0
- package/dist/queue/service.js +152 -0
- package/dist/queue/service.js.map +1 -0
- package/dist/queue/storage.d.ts +30 -0
- package/dist/queue/storage.d.ts.map +1 -0
- package/dist/queue/storage.js +171 -0
- package/dist/queue/storage.js.map +1 -0
- package/dist/queue/tools.d.ts +12 -0
- package/dist/queue/tools.d.ts.map +1 -0
- package/dist/queue/tools.js +144 -0
- package/dist/queue/tools.js.map +1 -0
- package/docs/MIGRATION.md +47 -14
- package/docs/QUEUE.md +146 -0
- package/docs/SECURITY.md +48 -32
- package/docs/TROUBLESHOOTING.md +36 -11
- package/package.json +1 -1
- package/templates/.opencode/agents/scheduled-planner.md +60 -131
- package/templates/.opencode/commands/abort-task.md +6 -15
- package/templates/.opencode/commands/acceptance.md +6 -15
- package/templates/.opencode/commands/change.md +3 -1
- package/templates/.opencode/commands/resume-review.md +6 -14
- package/templates/.opencode/commands/resume-task.md +6 -23
- package/templates/.opencode/skills/scheduled-quality-orchestrator/SKILL.md +69 -248
- package/templates/AGENTS.md.fragment +8 -0
- package/templates/README.md +9 -1
- package/templates/automation/config.json +9 -2
- package/templates/automation/config.schema.json +222 -45
- package/templates/scripts/automation/abort-task.sh +4 -2
- package/templates/scripts/automation/accept-and-integrate.sh +9 -2
- package/templates/scripts/automation/acceptance-report.sh +4 -2
- package/templates/scripts/automation/approve-and-run.sh +5 -0
- package/templates/scripts/automation/begin-review.sh +1 -0
- package/templates/scripts/automation/block-task.sh +1 -0
- package/templates/scripts/automation/claim-task.sh +1 -0
- package/templates/scripts/automation/lib.sh +186 -2
- package/templates/scripts/automation/orchestrate-task.sh +12 -0
- package/templates/scripts/automation/preflight.sh +25 -4
- package/templates/scripts/automation/prepare-contract-review.sh +4 -0
- package/templates/scripts/automation/quality-gate.sh +1 -0
- package/templates/scripts/automation/record-red.sh +1 -0
- package/templates/scripts/automation/resume-review-fix.sh +1 -0
- package/templates/scripts/automation/resume-review.sh +1 -0
- package/templates/scripts/automation/resume-task.sh +1 -0
- package/templates/scripts/automation/scope-gate.sh +10 -2
- package/templates/scripts/automation/show-acceptance-review.sh +3 -0
- package/templates/scripts/automation/submit-review.sh +8 -2
- package/templates/scripts/automation/tests/run-tests.sh +59 -4
- package/templates/scripts/automation/verify-task.sh +13 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { ApprovalProof } from "./approvals.js";
|
|
2
|
+
import { QueueStorage, type ProcessIdentity } from "./storage.js";
|
|
3
|
+
import { type QueuePolicy } from "../config/queue-policy.js";
|
|
4
|
+
export type WorkspaceStrategy = "inPlaceExclusive" | "isolatedWorktree";
|
|
5
|
+
export type CommitPolicy = "humanApproval" | "autoCommit";
|
|
6
|
+
export type JobKind = "execute" | "integrate" | "revalidate" | "resume" | "resume-review" | "abort" | "recover";
|
|
7
|
+
export interface QueueConfiguration {
|
|
8
|
+
schemaVersion: number;
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
mode: string;
|
|
11
|
+
workspaceStrategy: WorkspaceStrategy;
|
|
12
|
+
commitPolicy?: CommitPolicy;
|
|
13
|
+
pushAfterAcceptance: false;
|
|
14
|
+
unitTestsEnabled: boolean;
|
|
15
|
+
autoCleanupWorktrees: boolean;
|
|
16
|
+
worktreeBase: string;
|
|
17
|
+
queue?: QueuePolicy["queue"];
|
|
18
|
+
approvalPhrases: Record<string, string>;
|
|
19
|
+
protectedPaths: string[];
|
|
20
|
+
gradleVerification: {
|
|
21
|
+
fullUnitTestTasks: string[];
|
|
22
|
+
focusedTestTasks: string[];
|
|
23
|
+
assembleTasks: string[];
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface Draft {
|
|
27
|
+
proposalApproval?: ApprovalProof;
|
|
28
|
+
key: string;
|
|
29
|
+
taskId: string;
|
|
30
|
+
version: number;
|
|
31
|
+
contract: Record<string, unknown>;
|
|
32
|
+
contractText: string;
|
|
33
|
+
plan: string;
|
|
34
|
+
contractSha256: string;
|
|
35
|
+
planSha256: string;
|
|
36
|
+
planningHead: string;
|
|
37
|
+
targetBranch: string;
|
|
38
|
+
sourceRoot: string;
|
|
39
|
+
workspaceStrategy: WorkspaceStrategy;
|
|
40
|
+
commitPolicy: CommitPolicy;
|
|
41
|
+
notBefore: string | null;
|
|
42
|
+
dependsOn: string[];
|
|
43
|
+
priority: number;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
digest: string;
|
|
46
|
+
}
|
|
47
|
+
export interface QueueItem extends Draft {
|
|
48
|
+
approvedWorkspaceStrategy: WorkspaceStrategy;
|
|
49
|
+
queuePriority: number;
|
|
50
|
+
sequence: number;
|
|
51
|
+
approvedAt: string;
|
|
52
|
+
authorization: {
|
|
53
|
+
source: "contractApproval";
|
|
54
|
+
digest: string;
|
|
55
|
+
commitPolicy: CommitPolicy;
|
|
56
|
+
pushAfterAcceptance: false;
|
|
57
|
+
revoked: boolean;
|
|
58
|
+
proof?: ApprovalProof;
|
|
59
|
+
};
|
|
60
|
+
state: string;
|
|
61
|
+
waitingReason: string | null;
|
|
62
|
+
runId: string | null;
|
|
63
|
+
taskRoot: string | null;
|
|
64
|
+
request: {
|
|
65
|
+
kind: JobKind;
|
|
66
|
+
approval: string | null;
|
|
67
|
+
candidate: string | null;
|
|
68
|
+
proof?: ApprovalProof;
|
|
69
|
+
} | null;
|
|
70
|
+
sealedDiff: string | null;
|
|
71
|
+
sealedRunId: string | null;
|
|
72
|
+
candidateId: string | null;
|
|
73
|
+
completedCommit: string | null;
|
|
74
|
+
}
|
|
75
|
+
export interface QueueRun {
|
|
76
|
+
id: string;
|
|
77
|
+
key: string;
|
|
78
|
+
kind: JobKind;
|
|
79
|
+
createdAt: string;
|
|
80
|
+
launcher: ProcessIdentity;
|
|
81
|
+
worker: ProcessIdentity | null;
|
|
82
|
+
outcome: {
|
|
83
|
+
state: string;
|
|
84
|
+
error: string | null;
|
|
85
|
+
} | null;
|
|
86
|
+
}
|
|
87
|
+
export interface QueueNotification {
|
|
88
|
+
id: string;
|
|
89
|
+
key: string;
|
|
90
|
+
state: string;
|
|
91
|
+
at: string;
|
|
92
|
+
message: string;
|
|
93
|
+
sealedDiff: string | null;
|
|
94
|
+
commit: string | null;
|
|
95
|
+
pushed: false;
|
|
96
|
+
acknowledged: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface QueueDocument {
|
|
99
|
+
schemaVersion: 1;
|
|
100
|
+
sequence: number;
|
|
101
|
+
paused: boolean;
|
|
102
|
+
fault: string | null;
|
|
103
|
+
strategy: WorkspaceStrategy | null;
|
|
104
|
+
drafts: Draft[];
|
|
105
|
+
items: QueueItem[];
|
|
106
|
+
active: QueueRun | null;
|
|
107
|
+
runs: QueueRun[];
|
|
108
|
+
notifications: QueueNotification[];
|
|
109
|
+
}
|
|
110
|
+
export interface DraftInput {
|
|
111
|
+
contract: Record<string, unknown>;
|
|
112
|
+
plan: string;
|
|
113
|
+
planningHead: string;
|
|
114
|
+
targetBranch: string;
|
|
115
|
+
workspaceStrategy?: WorkspaceStrategy;
|
|
116
|
+
commitPolicy?: CommitPolicy;
|
|
117
|
+
notBefore?: string;
|
|
118
|
+
dependsOn?: string[];
|
|
119
|
+
priority?: number;
|
|
120
|
+
}
|
|
121
|
+
export declare const TASK_ID: RegExp;
|
|
122
|
+
export declare function now(): string;
|
|
123
|
+
export declare function matchesPath(pattern: string, path: string): boolean;
|
|
124
|
+
export declare function validateContract(contract: Record<string, unknown>, config: QueueConfiguration): void;
|
|
125
|
+
export declare function draftFromItem(item: QueueItem): Draft;
|
|
126
|
+
export declare function assertAuthorized(item: QueueItem): void;
|
|
127
|
+
export declare class TaskQueue {
|
|
128
|
+
readonly storage: QueueStorage<QueueDocument>;
|
|
129
|
+
constructor(directory: string);
|
|
130
|
+
config(): QueueConfiguration;
|
|
131
|
+
snapshot(targetBranch?: string): {
|
|
132
|
+
sourceRoot: string;
|
|
133
|
+
targetBranch: string;
|
|
134
|
+
planningHead: string;
|
|
135
|
+
files: string[];
|
|
136
|
+
};
|
|
137
|
+
private sensitive;
|
|
138
|
+
readSnapshot(head: string, path: string): string;
|
|
139
|
+
draft(input: DraftInput, proposalApproval?: ApprovalProof): Draft;
|
|
140
|
+
approvalText(draft: Draft): string;
|
|
141
|
+
enqueue(key: string, digest: string, approval: string, proof?: ApprovalProof): QueueItem;
|
|
142
|
+
item(key: string): QueueItem;
|
|
143
|
+
private findItem;
|
|
144
|
+
reorder(key: string, priority: number): void;
|
|
145
|
+
setPolicy(workspaceStrategy: WorkspaceStrategy, commitPolicy: CommitPolicy): void;
|
|
146
|
+
recoverExecution(): void;
|
|
147
|
+
details(key: string): Record<string, unknown>;
|
|
148
|
+
notify(document: QueueDocument, item: QueueItem, message: string): void;
|
|
149
|
+
control(action: "pause" | "resume" | "clear-fault" | "cancel" | "revoke" | "acknowledge", key?: string): QueueDocument;
|
|
150
|
+
request(key: string, kind: Exclude<JobKind, "execute">, approval?: string, candidate?: string, proof?: ApprovalProof): void;
|
|
151
|
+
reserve(): QueueRun | null;
|
|
152
|
+
reconcile(): void;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { atomicJson, fileLock, git, invariant, isAlive, processGroupAlive, processIdentity, readJson, sha256, QueueStorage, } from "./storage.js";
|
|
6
|
+
import { queuePolicy } from "../config/queue-policy.js";
|
|
7
|
+
const TERMINAL = new Set(["COMPLETED", "CANCELLED", "ABORTED", "SUPERSEDED"]);
|
|
8
|
+
const STOPPED = new Set(["AWAITING_HUMAN", "READY_TO_COMMIT", "BLOCKED", "TEST_FAILED", "NEEDS_HUMAN", "INTEGRATION_BLOCKED", "BASELINE_REVIEW"]);
|
|
9
|
+
export const TASK_ID = /^TASK-[A-Z0-9-]+$/;
|
|
10
|
+
export function now() { return new Date().toISOString(); }
|
|
11
|
+
export function matchesPath(pattern, path) {
|
|
12
|
+
const expression = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
13
|
+
.replace(/\*\*/g, "\u0001").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]")
|
|
14
|
+
.replace(/\u0001\//g, "(?:.*/)?").replace(/\u0001/g, ".*");
|
|
15
|
+
return new RegExp(`^${expression}${pattern.endsWith("/") ? ".*" : ""}$`).test(path);
|
|
16
|
+
}
|
|
17
|
+
export function validateContract(contract, config) {
|
|
18
|
+
invariant(TASK_ID.test(String(contract.id)), "Invalid task ID");
|
|
19
|
+
invariant([1, 2, 3].includes(Number(contract.schemaVersion)), "Unsupported contract schema");
|
|
20
|
+
invariant(contract.designApproved === true && contract.ambiguityPolicy === "BLOCKED", "An approved, bounded design is required");
|
|
21
|
+
invariant(typeof contract.title === "string" && contract.title.length > 0, "Contract title is required");
|
|
22
|
+
invariant(contract.planPath === `docs/plans/${contract.id}.md`, "Plan must use the task-specific docs/plans path");
|
|
23
|
+
invariant(Number.isInteger(contract.maxChangedFiles) && Number(contract.maxChangedFiles) >= 1 && Number(contract.maxChangedFiles) <= 12, "Invalid file limit");
|
|
24
|
+
invariant(Number.isInteger(contract.maxFixLoops) && Number(contract.maxFixLoops) >= 0 && Number(contract.maxFixLoops) <= 1, "Invalid fix-loop limit");
|
|
25
|
+
for (const key of ["allowedPaths", "forbiddenPaths", "acceptanceCriteria", "nonGoals"]) {
|
|
26
|
+
invariant(Array.isArray(contract[key]) && contract[key].length > 0 && contract[key].every(value => typeof value === "string" && value.length > 0), `Invalid ${key}`);
|
|
27
|
+
}
|
|
28
|
+
const allowed = contract.allowedPaths;
|
|
29
|
+
const forbidden = contract.forbiddenPaths;
|
|
30
|
+
for (const path of [...allowed, ...forbidden])
|
|
31
|
+
invariant(/^[A-Za-z0-9._/?*-]+$/.test(path) && !path.startsWith("/") && !path.includes(".."), "Unsafe contract path");
|
|
32
|
+
for (const path of config.protectedPaths) {
|
|
33
|
+
invariant(!allowed.some(pattern => matchesPath(pattern, path)), `Allowed paths overlap protected path: ${path}`);
|
|
34
|
+
invariant(forbidden.some(pattern => matchesPath(pattern, path)), `Forbidden paths must cover: ${path}`);
|
|
35
|
+
}
|
|
36
|
+
const skills = contract.schemaVersion === 1 ? contract.allowedSuperpowers : contract.allowedWorkflowSkills;
|
|
37
|
+
const expected = ["test-driven-development", "systematic-debugging", "verification-before-completion"].map(skill => contract.schemaVersion === 1 ? skill : `android-orchestrator-${skill}`);
|
|
38
|
+
invariant(JSON.stringify(skills) === JSON.stringify(expected), "Invalid workflow skill allowlist");
|
|
39
|
+
invariant(Array.isArray(contract.targetTests) && contract.targetTests.length > 0, "Focused tests are required");
|
|
40
|
+
for (const target of contract.targetTests) {
|
|
41
|
+
invariant(target && typeof target === "object" && typeof target.gradleTask === "string" && config.gradleVerification.focusedTestTasks.includes(target.gradleTask), "Focused test task is not configured");
|
|
42
|
+
invariant(typeof target.filter === "string" && /^[A-Za-z0-9_.#$*-]+$/.test(target.filter), "Unsafe test filter");
|
|
43
|
+
}
|
|
44
|
+
invariant(typeof contract.deviceTestsRequired === "boolean", "Missing device-test policy");
|
|
45
|
+
invariant(contract.testPolicy === "required" || (contract.testPolicy === "not-required" && typeof contract.testPolicyReason === "string" && contract.testPolicyReason.length >= 20), "Missing test policy");
|
|
46
|
+
invariant(!/replace with|TASK-EXAMPLE|\btodo\b|\btbd\b|placeholder/i.test(JSON.stringify(contract)), "Contract contains placeholders");
|
|
47
|
+
}
|
|
48
|
+
function draftDigest(draft) {
|
|
49
|
+
const { digest: _digest, ...sealed } = draft;
|
|
50
|
+
return sha256(JSON.stringify(sealed));
|
|
51
|
+
}
|
|
52
|
+
export function draftFromItem(item) {
|
|
53
|
+
const { sequence: _sequence, approvedAt: _approvedAt, authorization: _authorization, state: _state, waitingReason: _waitingReason, runId: _runId, taskRoot: _taskRoot, request: _request, sealedDiff: _sealedDiff, sealedRunId: _sealedRunId, candidateId: _candidateId, completedCommit: _commit, approvedWorkspaceStrategy, queuePriority: _priority, ...draft } = item;
|
|
54
|
+
return { ...draft, workspaceStrategy: approvedWorkspaceStrategy };
|
|
55
|
+
}
|
|
56
|
+
export function assertAuthorized(item) {
|
|
57
|
+
invariant(!item.authorization.revoked, "Contract authorization was revoked");
|
|
58
|
+
invariant(item.digest === draftDigest(draftFromItem(item)) && item.digest === item.authorization.digest, "Approved contract or scheduling policy changed; fresh approval required");
|
|
59
|
+
invariant(item.authorization.commitPolicy === item.commitPolicy && item.authorization.pushAfterAcceptance === false, "Invalid sealed commit or no-push authorization");
|
|
60
|
+
invariant(sha256(item.contractText) === item.contractSha256 && sha256(item.plan) === item.planSha256, "Approved artifacts changed");
|
|
61
|
+
invariant(JSON.stringify(JSON.parse(item.contractText)) === JSON.stringify(item.contract), "Contract text and metadata disagree");
|
|
62
|
+
invariant(item.workspaceStrategy !== "isolatedWorktree" || item.commitPolicy === "humanApproval", "isolatedWorktree + autoCommit is unsupported");
|
|
63
|
+
}
|
|
64
|
+
export class TaskQueue {
|
|
65
|
+
storage;
|
|
66
|
+
constructor(directory) {
|
|
67
|
+
this.storage = new QueueStorage(directory, () => ({ schemaVersion: 1, sequence: 0, paused: false, fault: null, strategy: null, drafts: [], items: [], active: null, runs: [], notifications: [] }));
|
|
68
|
+
}
|
|
69
|
+
config() {
|
|
70
|
+
const config = readJson(join(this.storage.root, "automation/config.json"));
|
|
71
|
+
invariant(config.schemaVersion === 6, "Queue execution requires an upgraded schema V6 installation");
|
|
72
|
+
invariant(config.enabled && config.mode === "orchestrated", "Automation is not enabled in orchestrated mode");
|
|
73
|
+
invariant(config.pushAfterAcceptance === false, "Remote push is forbidden");
|
|
74
|
+
invariant(["inPlaceExclusive", "isolatedWorktree"].includes(config.workspaceStrategy), "Unsupported workspace strategy");
|
|
75
|
+
invariant(config.commitPolicy === undefined || ["humanApproval", "autoCommit"].includes(config.commitPolicy), "Unsupported commit policy");
|
|
76
|
+
queuePolicy(config);
|
|
77
|
+
return config;
|
|
78
|
+
}
|
|
79
|
+
snapshot(targetBranch) {
|
|
80
|
+
const document = this.storage.read();
|
|
81
|
+
const occupied = document.items.find(item => item.taskRoot && !TERMINAL.has(item.state));
|
|
82
|
+
const branch = targetBranch ?? occupied?.targetBranch ?? git(this.storage.root, ["symbolic-ref", "--short", "HEAD"]);
|
|
83
|
+
git(this.storage.root, ["check-ref-format", `refs/heads/${branch}`]);
|
|
84
|
+
const head = git(this.storage.root, ["rev-parse", "--verify", `refs/heads/${branch}^{commit}`]);
|
|
85
|
+
const files = git(this.storage.root, ["ls-tree", "-r", "--name-only", head]).split("\n").filter(path => !this.sensitive(path));
|
|
86
|
+
return { sourceRoot: this.storage.root, targetBranch: branch, planningHead: head, files };
|
|
87
|
+
}
|
|
88
|
+
sensitive(path) {
|
|
89
|
+
return /(^|\/)(\.env(?:\..*)?|local\.properties)$|\.(jks|keystore)$/.test(path);
|
|
90
|
+
}
|
|
91
|
+
readSnapshot(head, path) {
|
|
92
|
+
invariant(/^[a-f0-9]{40,64}$/.test(head), "A fixed planning commit is required");
|
|
93
|
+
invariant(!path.startsWith("/") && !path.split("/").includes("..") && !path.includes("\0") && !this.sensitive(path), "Snapshot path is not allowed");
|
|
94
|
+
const type = git(this.storage.root, ["cat-file", "-t", `${head}:${path}`]);
|
|
95
|
+
invariant(type === "blob", "Snapshot path must be a file");
|
|
96
|
+
const size = Number(git(this.storage.root, ["cat-file", "-s", `${head}:${path}`]));
|
|
97
|
+
invariant(size <= 1024 * 1024, "Snapshot file exceeds 1 MiB");
|
|
98
|
+
return git(this.storage.root, ["show", `${head}:${path}`]);
|
|
99
|
+
}
|
|
100
|
+
draft(input, proposalApproval) {
|
|
101
|
+
const config = this.config();
|
|
102
|
+
validateContract(input.contract, config);
|
|
103
|
+
invariant(input.plan.trim().length >= 20 && Buffer.byteLength(input.plan) <= 1024 * 1024, "A complete plan of at most 1 MiB is required");
|
|
104
|
+
invariant(/^[a-f0-9]{40,64}$/.test(input.planningHead), "A fixed planning commit is required");
|
|
105
|
+
git(this.storage.root, ["check-ref-format", `refs/heads/${input.targetBranch}`]);
|
|
106
|
+
git(this.storage.root, ["merge-base", "--is-ancestor", input.planningHead, `refs/heads/${input.targetBranch}`]);
|
|
107
|
+
const workspaceStrategy = input.workspaceStrategy ?? config.workspaceStrategy;
|
|
108
|
+
// Missing policy always retains human acceptance, irrespective of defaults.
|
|
109
|
+
const commitPolicy = input.commitPolicy ?? "humanApproval";
|
|
110
|
+
invariant(["inPlaceExclusive", "isolatedWorktree"].includes(workspaceStrategy), "Invalid workspace strategy");
|
|
111
|
+
invariant(["humanApproval", "autoCommit"].includes(commitPolicy), "Invalid commit policy");
|
|
112
|
+
invariant(workspaceStrategy === "inPlaceExclusive" || commitPolicy === "humanApproval", "isolatedWorktree + autoCommit is unsupported");
|
|
113
|
+
const dependencies = input.dependsOn ?? [];
|
|
114
|
+
invariant(dependencies.every(id => TASK_ID.test(id) && id !== input.contract.id) && new Set(dependencies).size === dependencies.length, "Invalid task dependencies");
|
|
115
|
+
const priority = input.priority ?? 0;
|
|
116
|
+
invariant(Number.isInteger(priority) && priority >= -100 && priority <= 100, "Priority must be an integer from -100 to 100");
|
|
117
|
+
invariant(input.notBefore === undefined || /(?:Z|[+-]\d{2}:\d{2})$/.test(input.notBefore), "notBefore must include an explicit timezone offset");
|
|
118
|
+
const notBefore = input.notBefore === undefined ? null : new Date(input.notBefore).toISOString();
|
|
119
|
+
const contractText = `${JSON.stringify(input.contract, null, 2)}\n`;
|
|
120
|
+
return this.storage.transaction(document => {
|
|
121
|
+
const taskId = String(input.contract.id);
|
|
122
|
+
const version = Math.max(0, ...document.drafts.filter(draft => draft.taskId === taskId).map(draft => draft.version)) + 1;
|
|
123
|
+
const sealed = { ...(proposalApproval ? { proposalApproval } : {}), key: `${taskId}@${version}`, taskId, version, contract: input.contract, contractText,
|
|
124
|
+
plan: input.plan, contractSha256: sha256(contractText), planSha256: sha256(input.plan),
|
|
125
|
+
planningHead: input.planningHead, targetBranch: input.targetBranch, sourceRoot: this.storage.root,
|
|
126
|
+
workspaceStrategy, commitPolicy, notBefore, dependsOn: dependencies, priority, createdAt: now() };
|
|
127
|
+
const draft = { ...sealed, digest: draftDigest(sealed) };
|
|
128
|
+
document.drafts.push(draft);
|
|
129
|
+
return draft;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
approvalText(draft) {
|
|
133
|
+
return draft.commitPolicy === "autoCommit"
|
|
134
|
+
? `批准入队 ${draft.key}:通过构建、全量单测和独立 Review 后自动本地提交并集成,不推送远程。`
|
|
135
|
+
: `批准入队 ${draft.key}:执行后等待人工确认提交,不推送远程。`;
|
|
136
|
+
}
|
|
137
|
+
enqueue(key, digest, approval, proof) {
|
|
138
|
+
this.config();
|
|
139
|
+
return this.storage.transaction(document => {
|
|
140
|
+
const existing = document.items.find(item => item.key === key);
|
|
141
|
+
if (existing) {
|
|
142
|
+
invariant(existing.digest === digest && this.approvalText(existing) === approval, "Repeated approval does not match the sealed contract");
|
|
143
|
+
return existing;
|
|
144
|
+
}
|
|
145
|
+
const draft = document.drafts.find(candidate => candidate.key === key);
|
|
146
|
+
invariant(draft && draft.digest === digest && draftDigest(draft) === digest, "Draft changed; display a fresh contract review");
|
|
147
|
+
invariant(this.approvalText(draft) === approval, "Explicit approval for this version and commit policy is required");
|
|
148
|
+
invariant(!document.items.some(item => item.taskId === draft.taskId && item.state !== "CANCELLED" && item.state !== "SUPERSEDED"), "This task already has an approved execution; use a new task ID or cancel its unstarted version");
|
|
149
|
+
for (const dependency of draft.dependsOn)
|
|
150
|
+
invariant(document.items.some(item => item.taskId === dependency && item.state !== "CANCELLED"), `Approve dependency first: ${dependency}`);
|
|
151
|
+
const item = { ...draft, approvedWorkspaceStrategy: draft.workspaceStrategy, queuePriority: draft.priority,
|
|
152
|
+
sequence: ++document.sequence, approvedAt: now(),
|
|
153
|
+
authorization: { source: "contractApproval", digest, commitPolicy: draft.commitPolicy, pushAfterAcceptance: false, revoked: false, ...(proof ? { proof } : {}) },
|
|
154
|
+
state: "QUEUED", waitingReason: null, runId: null, taskRoot: null, request: null, sealedDiff: null, sealedRunId: null, candidateId: null, completedCommit: null };
|
|
155
|
+
document.items.push(item);
|
|
156
|
+
this.notify(document, item, "Contract approved and durably enqueued");
|
|
157
|
+
return item;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
item(key) {
|
|
161
|
+
const item = this.findItem(this.storage.read(), key);
|
|
162
|
+
invariant(item, `Unknown queued task: ${key}`);
|
|
163
|
+
return item;
|
|
164
|
+
}
|
|
165
|
+
findItem(document, key) {
|
|
166
|
+
return document.items.find(item => item.key === key) ?? [...document.items].reverse().find(item => item.taskId === key);
|
|
167
|
+
}
|
|
168
|
+
reorder(key, priority) {
|
|
169
|
+
invariant(Number.isInteger(priority) && priority >= -100 && priority <= 100, "Priority must be an integer from -100 to 100");
|
|
170
|
+
this.storage.transaction(document => {
|
|
171
|
+
const item = this.findItem(document, key);
|
|
172
|
+
invariant(item?.state === "QUEUED", "Only unstarted queue items may be reordered");
|
|
173
|
+
item.queuePriority = priority;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
setPolicy(workspaceStrategy, commitPolicy) {
|
|
177
|
+
const release = fileLock(join(this.storage.runtime, "locks/lifecycle.lock"));
|
|
178
|
+
try {
|
|
179
|
+
this.storage.transaction(document => {
|
|
180
|
+
invariant(document.paused && !document.active, "Pause the queue and wait for its executor before changing policy");
|
|
181
|
+
invariant(!document.items.some(item => item.taskRoot && !TERMINAL.has(item.state)), "Retained workspaces must complete or abort before a policy change");
|
|
182
|
+
invariant(!existsSync(join(this.storage.runtime, "locks/repository.workspace.lease")), "Repository still has a workspace owner");
|
|
183
|
+
const config = this.config();
|
|
184
|
+
helperFreeCleanCheck(this.storage.root);
|
|
185
|
+
const policy = queuePolicy({ ...config, workspaceStrategy, commitPolicy });
|
|
186
|
+
atomicJson(join(this.storage.root, "automation/config.json"), { ...config, ...policy });
|
|
187
|
+
document.strategy = workspaceStrategy;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
release();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
recoverExecution() {
|
|
195
|
+
this.storage.transaction(document => {
|
|
196
|
+
const run = document.active;
|
|
197
|
+
invariant(run, "No active execution to recover");
|
|
198
|
+
if (run.worker) {
|
|
199
|
+
invariant(!isAlive(run.worker) && !processGroupAlive(run.worker.pid), "Executor or its children are still alive; preserve the execution slot");
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
invariant(run.launcher && !isAlive(run.launcher), "Execution launcher is still alive or unknown; cannot recover its reservation");
|
|
203
|
+
}
|
|
204
|
+
const item = this.findItem(document, run.key);
|
|
205
|
+
item.state = "BLOCKED";
|
|
206
|
+
item.waitingReason = "Interrupted execution preserved; inspect its workspace, then request resume, abort or commit recovery";
|
|
207
|
+
item.sealedRunId = null;
|
|
208
|
+
this.notify(document, item, item.waitingReason);
|
|
209
|
+
document.runs.push({ ...run, outcome: { state: item.state, error: item.waitingReason } });
|
|
210
|
+
// Invalidate the reservation atomically. A delayed, unregistered worker
|
|
211
|
+
// cannot acquire it after this transaction, even if it starts later.
|
|
212
|
+
document.active = null;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
details(key) {
|
|
216
|
+
const item = this.item(key);
|
|
217
|
+
const evidence = {};
|
|
218
|
+
for (const name of ["acceptance-report", "review", "full-test-verification", "commit-transaction", "integration", "planning-baseline"]) {
|
|
219
|
+
const path = join(this.storage.runtime, "evidence", item.taskId, `${name}.json`);
|
|
220
|
+
if (existsSync(path))
|
|
221
|
+
evidence[name] = readJson(path);
|
|
222
|
+
}
|
|
223
|
+
return { ...item, currentTargetHead: git(item.sourceRoot, ["rev-parse", `refs/heads/${item.targetBranch}`]), evidence };
|
|
224
|
+
}
|
|
225
|
+
notify(document, item, message) {
|
|
226
|
+
const id = sha256(`${item.key}:${item.state}:${item.candidateId}:${item.completedCommit}:${message}`);
|
|
227
|
+
if (!document.notifications.some(notification => notification.id === id))
|
|
228
|
+
document.notifications.push({ id, key: item.key, state: item.state, at: now(), message, sealedDiff: item.sealedDiff, commit: item.completedCommit, pushed: false, acknowledged: false });
|
|
229
|
+
}
|
|
230
|
+
control(action, key) {
|
|
231
|
+
return this.storage.transaction(document => {
|
|
232
|
+
if (action === "pause")
|
|
233
|
+
document.paused = true;
|
|
234
|
+
if (action === "resume")
|
|
235
|
+
document.paused = false;
|
|
236
|
+
if (action === "clear-fault") {
|
|
237
|
+
invariant(!document.active, "Resolve the active execution before clearing a public fault");
|
|
238
|
+
document.fault = null;
|
|
239
|
+
}
|
|
240
|
+
if (action === "acknowledge") {
|
|
241
|
+
const notification = document.notifications.find(notification => notification.id === key);
|
|
242
|
+
invariant(notification, "Unknown notification");
|
|
243
|
+
notification.acknowledged = true;
|
|
244
|
+
}
|
|
245
|
+
if (action === "cancel" || action === "revoke") {
|
|
246
|
+
const item = this.findItem(document, key ?? "");
|
|
247
|
+
invariant(item && !TERMINAL.has(item.state), "No active approval for this task");
|
|
248
|
+
if (action === "cancel") {
|
|
249
|
+
invariant(item.taskRoot === null && document.active?.key !== item.key, "Running or occupied tasks require the approved abort workflow");
|
|
250
|
+
item.state = "CANCELLED";
|
|
251
|
+
}
|
|
252
|
+
item.authorization.revoked = true;
|
|
253
|
+
this.notify(document, item, action === "cancel" ? "Queued task cancelled" : "Commit authorization revoked; preserve workspace");
|
|
254
|
+
}
|
|
255
|
+
return document;
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
request(key, kind, approval, candidate, proof) {
|
|
259
|
+
const config = this.config();
|
|
260
|
+
this.storage.transaction(document => {
|
|
261
|
+
const item = this.findItem(document, key);
|
|
262
|
+
invariant(item && item.taskRoot && !TERMINAL.has(item.state), "Task has no recoverable workspace");
|
|
263
|
+
invariant(document.active?.key !== item.key || kind === "abort", "Task is still running; wait for its recorded process to exit");
|
|
264
|
+
invariant(!item.request || item.request.kind === kind, "An earlier request is already queued for this task");
|
|
265
|
+
if (kind === "integrate") {
|
|
266
|
+
invariant(item.commitPolicy === "humanApproval" && item.state === "AWAITING_HUMAN", "Task is not awaiting human acceptance");
|
|
267
|
+
invariant(candidate && candidate === item.candidateId, "Acceptance must bind to the latest sealed candidate and target baseline");
|
|
268
|
+
invariant(approval === config.approvalPhrases.acceptance, "Explicit final acceptance is required");
|
|
269
|
+
}
|
|
270
|
+
else if (kind !== "recover" && kind !== "revalidate") {
|
|
271
|
+
const phrase = kind === "abort" ? config.approvalPhrases.abort : config.approvalPhrases.resume;
|
|
272
|
+
invariant(approval === phrase, `Explicit ${kind} approval is required`);
|
|
273
|
+
}
|
|
274
|
+
if (kind === "revalidate")
|
|
275
|
+
invariant(item.workspaceStrategy === "isolatedWorktree" && item.state === "AWAITING_HUMAN", "Only a sealed isolated candidate can be revalidated");
|
|
276
|
+
item.request = { kind, approval: approval ?? null, candidate: candidate ?? null, ...(proof ? { proof } : {}) };
|
|
277
|
+
this.notify(document, item, `${kind} requested; waiting for the repository execution slot`);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
reserve() {
|
|
281
|
+
const config = this.config();
|
|
282
|
+
// Disk traversal stays outside the intake transaction.
|
|
283
|
+
const retained = this.storage.read().items.filter(item => item.taskRoot && item.workspaceStrategy === "isolatedWorktree" && existsSync(item.taskRoot));
|
|
284
|
+
let workspaceBytes = 0;
|
|
285
|
+
for (const item of retained) {
|
|
286
|
+
const usage = spawnSync("du", ["-sk", item.taskRoot], { encoding: "utf8" });
|
|
287
|
+
invariant(usage.status === 0, "Cannot measure retained workspace disk usage");
|
|
288
|
+
workspaceBytes += Number(usage.stdout.trim().split(/\s+/)[0]) * 1024;
|
|
289
|
+
}
|
|
290
|
+
return this.storage.transaction(document => {
|
|
291
|
+
if (existsSync(join(this.storage.runtime, "locks/lifecycle.lock")))
|
|
292
|
+
return null;
|
|
293
|
+
if (document.active || document.paused || document.fault)
|
|
294
|
+
return null;
|
|
295
|
+
if (!config.unitTestsEnabled) {
|
|
296
|
+
document.fault = "Queued execution requires full unit tests; enable unitTestsEnabled";
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
const occupied = document.items.filter(item => item.taskRoot && !TERMINAL.has(item.state));
|
|
300
|
+
if (occupied.some(item => item.workspaceStrategy !== config.workspaceStrategy)) {
|
|
301
|
+
document.fault = "Workspace strategy changed while tasks retain a workspace; restore the recorded strategy";
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
const fixed = occupied.find(item => item.workspaceStrategy === "inPlaceExclusive");
|
|
305
|
+
const leaseDirectory = join(this.storage.runtime, "locks/repository.workspace.lease");
|
|
306
|
+
if (existsSync(leaseDirectory) && !existsSync(join(leaseDirectory, "lease.json"))) {
|
|
307
|
+
document.fault = "Repository workspace lease is incomplete; recover its ownership before scheduling";
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
const requests = document.items.filter(item => item.request).sort((a, b) => a.sequence - b.sequence);
|
|
311
|
+
const pending = document.items.filter(item => item.state === "QUEUED").sort((a, b) => b.queuePriority - a.queuePriority || a.sequence - b.sequence);
|
|
312
|
+
for (const item of [...requests, ...pending]) {
|
|
313
|
+
item.waitingReason = null;
|
|
314
|
+
if (fixed && fixed.key !== item.key) {
|
|
315
|
+
item.waitingReason = `Waiting for ${fixed.taskId}: ${fixed.state}`;
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (item.commitPolicy === "autoCommit" && config.workspaceStrategy === "isolatedWorktree") {
|
|
319
|
+
item.waitingReason = "isolatedWorktree + autoCommit is unsupported; fresh contract approval is required";
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (!item.request && item.notBefore && Date.parse(item.notBefore) > Date.now()) {
|
|
323
|
+
item.waitingReason = `Scheduled for ${item.notBefore}`;
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
const dependency = item.dependsOn.find(id => !document.items.some(candidate => candidate.taskId === id && candidate.state === "COMPLETED"));
|
|
327
|
+
if (dependency && !item.request) {
|
|
328
|
+
item.waitingReason = `Waiting for dependency ${dependency} to complete local integration`;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (!item.request && config.workspaceStrategy === "isolatedWorktree" && (retained.length >= (config.queue?.maxWorkspaces ?? 3) || workspaceBytes >= (config.queue?.maxWorkspaceBytes ?? 20 * 1024 ** 3))) {
|
|
332
|
+
item.waitingReason = "Isolated workspace capacity or disk limit reached";
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
try {
|
|
336
|
+
if (item.request?.kind !== "abort")
|
|
337
|
+
assertAuthorized(item);
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
item.waitingReason = String(error);
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
// Legacy leases and unknown workspace owners cannot be bypassed.
|
|
344
|
+
const leasePath = join(this.storage.runtime, "locks/repository.workspace.lease/lease.json");
|
|
345
|
+
if (existsSync(leasePath)) {
|
|
346
|
+
const lease = readJson(leasePath);
|
|
347
|
+
if (lease.taskId !== item.taskId) {
|
|
348
|
+
item.waitingReason = `Repository workspace is leased by ${lease.taskId}`;
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const launcher = processIdentity(process.pid);
|
|
353
|
+
invariant(launcher, "Cannot establish execution launcher identity");
|
|
354
|
+
const run = { id: randomUUID(), key: item.key, kind: item.request?.kind ?? "execute", createdAt: now(), launcher, worker: null, outcome: null };
|
|
355
|
+
document.active = run;
|
|
356
|
+
document.strategy = config.workspaceStrategy;
|
|
357
|
+
item.runId = run.id;
|
|
358
|
+
item.sealedRunId = null;
|
|
359
|
+
if (run.kind === "execute") {
|
|
360
|
+
item.workspaceStrategy = config.workspaceStrategy;
|
|
361
|
+
item.state = "CLAIMED";
|
|
362
|
+
}
|
|
363
|
+
return run;
|
|
364
|
+
}
|
|
365
|
+
return null;
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
reconcile() {
|
|
369
|
+
this.storage.transaction(document => {
|
|
370
|
+
const run = document.active;
|
|
371
|
+
if (!run)
|
|
372
|
+
return;
|
|
373
|
+
const item = document.items.find(item => item.key === run.key);
|
|
374
|
+
invariant(item, "Active execution has no contract");
|
|
375
|
+
if (!run.worker) {
|
|
376
|
+
// A crash between reservation and spawn is ambiguous, never requeue it.
|
|
377
|
+
if (Date.now() - Date.parse(run.createdAt) > 30000)
|
|
378
|
+
document.fault = "Execution launch ownership is unknown; explicit recovery is required";
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (isAlive(run.worker) || processGroupAlive(run.worker.pid))
|
|
382
|
+
return;
|
|
383
|
+
if (!run.outcome) {
|
|
384
|
+
item.state = "BLOCKED";
|
|
385
|
+
item.waitingReason = "Executor stopped without a durable outcome; preserve workspace and recover";
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
item.state = run.outcome.state;
|
|
389
|
+
item.waitingReason = run.outcome.error;
|
|
390
|
+
}
|
|
391
|
+
if (run.outcome && item.sealedRunId === run.id && item.workspaceStrategy === "isolatedWorktree" && STOPPED.has(item.state) && item.sealedDiff) {
|
|
392
|
+
// Worker seals while it owns the lease. Only release after its entire
|
|
393
|
+
// process group has exited; never infer this from the shell exit alone.
|
|
394
|
+
const workspacePath = join(this.storage.runtime, "workspaces", `${item.taskId}.json`);
|
|
395
|
+
if (existsSync(workspacePath)) {
|
|
396
|
+
const workspace = readJson(workspacePath);
|
|
397
|
+
atomicJson(workspacePath, { ...workspace, repositoryLeaseRequired: false, executionExited: true });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (item.request?.kind === run.kind)
|
|
401
|
+
item.request = null;
|
|
402
|
+
this.notify(document, item, item.waitingReason ?? (item.state === "COMPLETED" ? "Local integration completed; not pushed" : `Task reached ${item.state}`));
|
|
403
|
+
document.runs.push(structuredClone(run));
|
|
404
|
+
document.active = null;
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
function helperFreeCleanCheck(root) {
|
|
409
|
+
invariant(git(root, ["status", "--porcelain"]) === "", "Workspace must be clean before changing queue policy");
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|