@akagilnc/pi-workflow-roles 0.1.3873 → 0.1.3884
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 +2 -2
- package/README.zh-CN.md +3 -3
- package/dist/acp-host/production-host.js +313 -371
- package/dist/headless-host/production-host.js +301 -359
- package/dist/merger-contracts.js +23 -42
- package/dist/merger-git-state.js +69 -42
- package/dist/merger-role.js +30 -41
- package/dist/public-cli/invocation.js +12 -39
- package/dist/public-cli/main.js +219 -331
- package/dist/public-cli/option-definitions.js +5 -5
- package/dist/public-cli/run-lifecycle.js +0 -2
- package/dist/role-runtime.js +1 -13
- package/extensions/role-runtime.ts +0 -3
- package/package.json +1 -1
- package/souls/merger.md +1 -1
- package/src/merger-contracts.ts +24 -38
- package/src/merger-git-state.ts +67 -37
- package/src/merger-role.ts +52 -48
- package/src/public-cli/invocation.ts +13 -44
- package/src/public-cli/merger-run.ts +2 -113
- package/src/public-cli/option-definitions.ts +5 -5
- package/src/public-cli/run-lifecycle.ts +0 -2
- package/src/role-runtime-dependencies.ts +0 -2
- package/src/role-runtime.ts +2 -13
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Public Merger Role run:
|
|
3
|
-
*
|
|
2
|
+
* Public Merger Role run: read Git materials → force package merge-only method
|
|
3
|
+
* → post-admission coordinator → settle Terminal result (#114 / #517 / #827).
|
|
4
4
|
* #526: execution via RoleTurnHost; argv is Pi adapter internal.
|
|
5
5
|
*/
|
|
6
6
|
import type {
|
|
7
|
-
DurablePrincipalAuthority,
|
|
8
7
|
MethodBinding,
|
|
9
8
|
RoleTurnKnownFailure,
|
|
10
9
|
RoleTurnRequest,
|
|
11
10
|
} from "../host-contracts.ts";
|
|
12
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
13
|
-
import { join, resolve } from "node:path";
|
|
14
|
-
|
|
15
|
-
import { ensureRealDirectoryTree } from "../activation-ledger-topology.ts";
|
|
16
11
|
import { engineSessionMaterialFromOptions } from "../package-resources/engine-material.ts";
|
|
17
12
|
import {
|
|
18
13
|
loadPackagedMethodSkillMaterial,
|
|
@@ -20,13 +15,10 @@ import {
|
|
|
20
15
|
type PackagedMethodSkillMaterial,
|
|
21
16
|
type PackagedMethodSkillProvenance,
|
|
22
17
|
} from "../package-resources/method-skill.ts";
|
|
23
|
-
import { uuidv7 } from "../uuidv7.ts";
|
|
24
18
|
import { CliUsageError } from "./cli-errors.ts";
|
|
25
19
|
import {
|
|
26
20
|
admitMergerInvocation,
|
|
27
21
|
buildMergerTransportPrompt,
|
|
28
|
-
issueAdmissionPlacement,
|
|
29
|
-
MergerEnvelopeDerivationError,
|
|
30
22
|
type AdmittedMergerInvocation,
|
|
31
23
|
} from "./invocation.ts";
|
|
32
24
|
import {
|
|
@@ -116,82 +108,6 @@ async function loadMergerMethodMaterial(
|
|
|
116
108
|
);
|
|
117
109
|
}
|
|
118
110
|
|
|
119
|
-
/**
|
|
120
|
-
* Structural admit shell when envelope derivation fails: keeps role-correct
|
|
121
|
-
* Terminal identity for honest activation-class settlement without inventing
|
|
122
|
-
* parents/conflicts (those stay empty; the gate never receives a guessed packet).
|
|
123
|
-
*/
|
|
124
|
-
async function admitMergerShellForActivationFailure(options: {
|
|
125
|
-
home: string;
|
|
126
|
-
cwd: string;
|
|
127
|
-
instruction: string;
|
|
128
|
-
project?: string;
|
|
129
|
-
createRunId?: () => string;
|
|
130
|
-
principalAuthority: DurablePrincipalAuthority;
|
|
131
|
-
}): Promise<AdmittedMergerInvocation> {
|
|
132
|
-
const projectRoot = resolve(options.project ?? options.cwd);
|
|
133
|
-
const runId = (options.createRunId ?? uuidv7)();
|
|
134
|
-
const {
|
|
135
|
-
principal,
|
|
136
|
-
sessionDirectory,
|
|
137
|
-
sessionFile,
|
|
138
|
-
runDirectory,
|
|
139
|
-
ledgerHome,
|
|
140
|
-
bookKey,
|
|
141
|
-
} = issueAdmissionPlacement(options.principalAuthority, {
|
|
142
|
-
cwd: projectRoot,
|
|
143
|
-
runId,
|
|
144
|
-
role: "merger",
|
|
145
|
-
home: options.home,
|
|
146
|
-
});
|
|
147
|
-
ensureRealDirectoryTree(ledgerHome, sessionDirectory);
|
|
148
|
-
await mkdir(runDirectory, { recursive: true });
|
|
149
|
-
const emptyDerived = {
|
|
150
|
-
targetObjectId: "",
|
|
151
|
-
sourceObjectId: "",
|
|
152
|
-
automaticMergeTreeId: "",
|
|
153
|
-
expectedConflictPaths: [] as string[],
|
|
154
|
-
resolutionScope: [] as string[],
|
|
155
|
-
};
|
|
156
|
-
const admittedRequestPath = join(runDirectory, "admitted-request.json");
|
|
157
|
-
const mergerInputPath = join(runDirectory, "merger-input.json");
|
|
158
|
-
await writeFile(
|
|
159
|
-
admittedRequestPath,
|
|
160
|
-
`${JSON.stringify(
|
|
161
|
-
{
|
|
162
|
-
role: "merger",
|
|
163
|
-
runId,
|
|
164
|
-
bookKey,
|
|
165
|
-
projectRoot,
|
|
166
|
-
instruction: options.instruction,
|
|
167
|
-
instructionEmpty: false,
|
|
168
|
-
mergerInputPath,
|
|
169
|
-
derived: emptyDerived,
|
|
170
|
-
attachments: [],
|
|
171
|
-
sessionDirectory,
|
|
172
|
-
sessionFile,
|
|
173
|
-
},
|
|
174
|
-
null,
|
|
175
|
-
2,
|
|
176
|
-
)}\n`,
|
|
177
|
-
"utf8",
|
|
178
|
-
);
|
|
179
|
-
return {
|
|
180
|
-
role: "merger",
|
|
181
|
-
runId,
|
|
182
|
-
bookKey,
|
|
183
|
-
projectRoot,
|
|
184
|
-
instruction: options.instruction,
|
|
185
|
-
instructionEmpty: false,
|
|
186
|
-
attachments: [],
|
|
187
|
-
runDirectory,
|
|
188
|
-
principal,
|
|
189
|
-
admittedRequestPath,
|
|
190
|
-
mergerInputPath,
|
|
191
|
-
derived: emptyDerived,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
|
|
195
111
|
function mergerTurnOptions(
|
|
196
112
|
admitted: AdmittedMergerInvocation,
|
|
197
113
|
env: MergerRunEnv,
|
|
@@ -263,33 +179,6 @@ export async function runPublicMerger(
|
|
|
263
179
|
presentStructuralRejection(error, io);
|
|
264
180
|
return { exitCode: 2 };
|
|
265
181
|
}
|
|
266
|
-
if (error instanceof MergerEnvelopeDerivationError) {
|
|
267
|
-
const shell = await admitMergerShellForActivationFailure({
|
|
268
|
-
home: env.home,
|
|
269
|
-
principalAuthority: env.principalAuthority,
|
|
270
|
-
cwd: env.cwd,
|
|
271
|
-
instruction: parsed.instruction,
|
|
272
|
-
...(parsed.project === undefined ? {} : { project: parsed.project }),
|
|
273
|
-
...(env.createRunId === undefined
|
|
274
|
-
? {}
|
|
275
|
-
: { createRunId: env.createRunId }),
|
|
276
|
-
});
|
|
277
|
-
await markRunAdmitted(shell, env.principalAuthority);
|
|
278
|
-
return (await presentControlledFailure(
|
|
279
|
-
shell,
|
|
280
|
-
{
|
|
281
|
-
timedOut: false,
|
|
282
|
-
code: null,
|
|
283
|
-
stderr: "",
|
|
284
|
-
thrown: error,
|
|
285
|
-
knownCause: "activation",
|
|
286
|
-
knownDiagnostic: error.message,
|
|
287
|
-
},
|
|
288
|
-
mergerAdapters(env.packageRoot),
|
|
289
|
-
env.principalAuthority,
|
|
290
|
-
io,
|
|
291
|
-
)) as { exitCode: number; admitted: AdmittedMergerInvocation; terminal: TerminalResult };
|
|
292
|
-
}
|
|
293
182
|
throw error;
|
|
294
183
|
}
|
|
295
184
|
|
|
@@ -670,7 +670,7 @@ const NOTARY_OPTIONS = [
|
|
|
670
670
|
] as const satisfies readonly PublicOptionDefinition[];
|
|
671
671
|
|
|
672
672
|
const MERGER_OPTIONS = [
|
|
673
|
-
// Merger project face
|
|
673
|
+
// Merger project face: worktree whose Git materials are handed to the role.
|
|
674
674
|
{
|
|
675
675
|
id: "project",
|
|
676
676
|
owner: "merger",
|
|
@@ -681,8 +681,8 @@ const MERGER_OPTIONS = [
|
|
|
681
681
|
repeatable: false,
|
|
682
682
|
form: "option",
|
|
683
683
|
description: {
|
|
684
|
-
en: "Project root
|
|
685
|
-
zh: "
|
|
684
|
+
en: "Project root whose Git merge materials are read (defaults to cwd).",
|
|
685
|
+
zh: "读取 Git merge 材料的项目根(默认 cwd)。",
|
|
686
686
|
},
|
|
687
687
|
},
|
|
688
688
|
bindOwner("merger", SHARED_ATTACH_SEMANTICS),
|
|
@@ -1231,10 +1231,10 @@ const ROLE_COMMAND_HELP = {
|
|
|
1231
1231
|
},
|
|
1232
1232
|
merger: {
|
|
1233
1233
|
command: "merger",
|
|
1234
|
-
summary: "
|
|
1234
|
+
summary: "Reconcile merge materials in a worktree (escalate when nothing to merge).",
|
|
1235
1235
|
usage: ["ak-role merger [options] <instruction>"],
|
|
1236
1236
|
examples: [
|
|
1237
|
-
'ak-role merger --project /path/to/worktree "Reconcile the
|
|
1237
|
+
'ak-role merger --project /path/to/worktree "Reconcile the merge."',
|
|
1238
1238
|
],
|
|
1239
1239
|
},
|
|
1240
1240
|
inspector: {
|
|
@@ -1386,7 +1386,6 @@ async function loadResumableRunRecord(
|
|
|
1386
1386
|
if (
|
|
1387
1387
|
typeof d.targetObjectId === "string" &&
|
|
1388
1388
|
typeof d.sourceObjectId === "string" &&
|
|
1389
|
-
typeof d.automaticMergeTreeId === "string" &&
|
|
1390
1389
|
Array.isArray(d.expectedConflictPaths) &&
|
|
1391
1390
|
Array.isArray(d.resolutionScope) &&
|
|
1392
1391
|
d.expectedConflictPaths.every((p) => typeof p === "string") &&
|
|
@@ -1395,7 +1394,6 @@ async function loadResumableRunRecord(
|
|
|
1395
1394
|
derived = {
|
|
1396
1395
|
targetObjectId: d.targetObjectId,
|
|
1397
1396
|
sourceObjectId: d.sourceObjectId,
|
|
1398
|
-
automaticMergeTreeId: d.automaticMergeTreeId,
|
|
1399
1397
|
expectedConflictPaths: d.expectedConflictPaths as string[],
|
|
1400
1398
|
resolutionScope: d.resolutionScope as string[],
|
|
1401
1399
|
};
|
|
@@ -5,7 +5,6 @@ import { loadCanonicalSkillBinding as loadHomeCanonicalSkillBinding } from "./ca
|
|
|
5
5
|
import { createGhCollectorGitHubTransport, createGhIssueSoftFetcher } from "./collector-github.ts";
|
|
6
6
|
import { createPiDoctorAuditor } from "./doctor-auditor.ts";
|
|
7
7
|
import { loadDoctorCase } from "./doctor-evidence.ts";
|
|
8
|
-
import { createProductionMergerGitState } from "./merger-git-state.ts";
|
|
9
8
|
import { createNativeNavigatorSessionFactory, createNavigatorAttendance } from "./navigator-attendance.ts";
|
|
10
9
|
import { loadNavigatorWorkContext } from "./navigator-work-context.ts";
|
|
11
10
|
import { loadNotarySourceRunLocator } from "./notary-source-run.ts";
|
|
@@ -53,7 +52,6 @@ export function createRoleRuntimeDependencies(packageRoot: string): RoleRuntimeD
|
|
|
53
52
|
loadNotarySourceRun: loadNotarySourceRunLocator,
|
|
54
53
|
loadMergerSoul: () => loadMainRoleSessionMaterials("merger"),
|
|
55
54
|
loadMergerInput: async (path) => JSON.parse(await readFile(path, "utf8")),
|
|
56
|
-
createMergerGitState: (repositoryRoot) => createProductionMergerGitState(repositoryRoot),
|
|
57
55
|
async loadCanonicalSkillBinding(name) {
|
|
58
56
|
if (name === "tdd") {
|
|
59
57
|
return loadPackagedCanonicalSkillBinding(packageRoot, "tdd");
|
package/src/role-runtime.ts
CHANGED
|
@@ -423,7 +423,7 @@ export { MERGER_INPUT_FLAG, createMergerRoleRuntime } from "./merger-role.ts";
|
|
|
423
423
|
export { MERGER_OUTPUT_TOOL_NAME, mergerInputSchema, mergerOutputSchema, validateMergerInput, validateMergerOutput } from "./merger-contracts.ts";
|
|
424
424
|
export type { MergerInput, MergerMaterial, MergerOutput } from "./merger-contracts.ts";
|
|
425
425
|
export { createProductionMergerGitState } from "./merger-git-state.ts";
|
|
426
|
-
export type { MergerGitState, ActiveMergerGitState
|
|
426
|
+
export type { MergerGitState, ActiveMergerGitState } from "./merger-git-state.ts";
|
|
427
427
|
export type { MergerRoleDependencies } from "./merger-role.ts";
|
|
428
428
|
|
|
429
429
|
type WorkerArmable = {
|
|
@@ -627,8 +627,6 @@ export type RoleRuntimeDependencies = {
|
|
|
627
627
|
loadDoctorCase?(path: string): Promise<import("./doctor-contracts.ts").DoctorCase>;
|
|
628
628
|
loadMergerSoul?(): Promise<string>;
|
|
629
629
|
loadMergerInput?(path: string): Promise<unknown>;
|
|
630
|
-
mergerGitState?: MergerRoleDependencies["gitState"];
|
|
631
|
-
createMergerGitState?(repositoryRoot: string): MergerRoleDependencies["gitState"];
|
|
632
630
|
auditDoctorCompliance?(options: { context: HostContext; signal?: AbortSignal }): Promise<ComplianceDecision>;
|
|
633
631
|
createCollectorClock?(): CollectorClock;
|
|
634
632
|
createNavigatorAttendance?(options: { context: HostContext; role: string; phase: NavigatorPhase; subjectKey: string; subject: string; authority: string; contextError?: unknown; invocationId: string; onEvent: (event: import("./navigator-attendance.ts").NavigatorEvent, report: import("./navigator-attendance.ts").NavigatorReport) => void | Promise<void> }): NavigatorAttendanceDependency | Promise<NavigatorAttendanceDependency>;
|
|
@@ -1682,15 +1680,10 @@ export function createRoleRuntimeExtension(
|
|
|
1682
1680
|
},
|
|
1683
1681
|
},
|
|
1684
1682
|
);
|
|
1685
|
-
let sessionMergerGitState = dependencies.mergerGitState;
|
|
1686
1683
|
const merger = createMergerRoleRuntime(roleHost, {
|
|
1687
1684
|
async loadSoul() { if (!dependencies.loadMergerSoul) throw new Error("Merger runtime dependencies are not configured"); return dependencies.loadMergerSoul(); },
|
|
1688
1685
|
async loadInput(path) { if (!dependencies.loadMergerInput) throw new Error("Merger runtime dependencies are not configured"); return dependencies.loadMergerInput(path); },
|
|
1689
|
-
|
|
1690
|
-
activeMerge() { if (!sessionMergerGitState) throw new Error("Merger runtime dependencies are not configured"); return sessionMergerGitState.activeMerge(); },
|
|
1691
|
-
completedMerge(mergeCommitId, automaticMergeTreeId) { if (!sessionMergerGitState) throw new Error("Merger runtime dependencies are not configured"); return sessionMergerGitState.completedMerge(mergeCommitId, automaticMergeTreeId); },
|
|
1692
|
-
},
|
|
1693
|
-
}, hostActions);
|
|
1686
|
+
});
|
|
1694
1687
|
// #676 E: shared envelope owns collector lifecycle (mode/fork, tool surface,
|
|
1695
1688
|
// event gates). Role module supplies business activate/tools/materials only.
|
|
1696
1689
|
let activeCollector: CollectorActivation | undefined;
|
|
@@ -1997,10 +1990,6 @@ export function createRoleRuntimeExtension(
|
|
|
1997
1990
|
auditor,
|
|
1998
1991
|
diarist,
|
|
1999
1992
|
merger: async () => {
|
|
2000
|
-
if (dependencies.mergerGitState === undefined) {
|
|
2001
|
-
sessionMergerGitState = dependencies.createMergerGitState?.(ctx.cwd);
|
|
2002
|
-
}
|
|
2003
|
-
if (sessionMergerGitState === undefined) throw new Error("Merger runtime dependencies are not configured");
|
|
2004
1993
|
await merger.activate();
|
|
2005
1994
|
},
|
|
2006
1995
|
};
|