@jcr-adk/cli 2.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/LICENSE +201 -0
- package/bin/jcr-adk.mjs +8 -0
- package/dist/argv.d.ts +10 -0
- package/dist/argv.d.ts.map +1 -0
- package/dist/argv.js +56 -0
- package/dist/argv.js.map +1 -0
- package/dist/audit-summary.d.ts +28 -0
- package/dist/audit-summary.d.ts.map +1 -0
- package/dist/audit-summary.js +39 -0
- package/dist/audit-summary.js.map +1 -0
- package/dist/commands/audit.d.ts +8 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +20 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +25 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain-fail.d.ts +8 -0
- package/dist/commands/explain-fail.d.ts.map +1 -0
- package/dist/commands/explain-fail.js +41 -0
- package/dist/commands/explain-fail.js.map +1 -0
- package/dist/commands/gate.d.ts +8 -0
- package/dist/commands/gate.d.ts.map +1 -0
- package/dist/commands/gate.js +104 -0
- package/dist/commands/gate.js.map +1 -0
- package/dist/commands/handoff.d.ts +8 -0
- package/dist/commands/handoff.d.ts.map +1 -0
- package/dist/commands/handoff.js +61 -0
- package/dist/commands/handoff.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +48 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +8 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +55 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/replay.d.ts +8 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +39 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/review-pack.d.ts +8 -0
- package/dist/commands/review-pack.d.ts.map +1 -0
- package/dist/commands/review-pack.js +64 -0
- package/dist/commands/review-pack.js.map +1 -0
- package/dist/commands/run.d.ts +8 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +205 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +133 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tool.d.ts +12 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +154 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/event-reader.d.ts +28 -0
- package/dist/event-reader.d.ts.map +1 -0
- package/dist/event-reader.js +39 -0
- package/dist/event-reader.js.map +1 -0
- package/dist/explain-fail-summary.d.ts +46 -0
- package/dist/explain-fail-summary.d.ts.map +1 -0
- package/dist/explain-fail-summary.js +405 -0
- package/dist/explain-fail-summary.js.map +1 -0
- package/dist/handlers.d.ts +134 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +257 -0
- package/dist/handlers.js.map +1 -0
- package/dist/handoff-summary.d.ts +62 -0
- package/dist/handoff-summary.d.ts.map +1 -0
- package/dist/handoff-summary.js +170 -0
- package/dist/handoff-summary.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle-artifacts.d.ts +62 -0
- package/dist/lifecycle-artifacts.d.ts.map +1 -0
- package/dist/lifecycle-artifacts.js +160 -0
- package/dist/lifecycle-artifacts.js.map +1 -0
- package/dist/main.d.ts +30 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +159 -0
- package/dist/main.js.map +1 -0
- package/dist/permissions.d.ts +42 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +57 -0
- package/dist/permissions.js.map +1 -0
- package/dist/replay-summary.d.ts +28 -0
- package/dist/replay-summary.d.ts.map +1 -0
- package/dist/replay-summary.js +73 -0
- package/dist/replay-summary.js.map +1 -0
- package/dist/review-pack-summary.d.ts +67 -0
- package/dist/review-pack-summary.d.ts.map +1 -0
- package/dist/review-pack-summary.js +199 -0
- package/dist/review-pack-summary.js.map +1 -0
- package/dist/session-run.d.ts +62 -0
- package/dist/session-run.d.ts.map +1 -0
- package/dist/session-run.js +112 -0
- package/dist/session-run.js.map +1 -0
- package/dist/session.d.ts +24 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +37 -0
- package/dist/session.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-pack bundle builder — DAC-007 / Recovery plane read-only evidence bundle.
|
|
3
|
+
*
|
|
4
|
+
* SEC-17: bundle is for human review — not an automatic approval verdict.
|
|
5
|
+
*/
|
|
6
|
+
import type { PersistedAdkEvent } from "@jcr-adk/state";
|
|
7
|
+
import { extractSpecGoal, parseAcceptanceFile, type HandoffAcceptanceItem } from "./handoff-summary.js";
|
|
8
|
+
export interface ReviewPackGateResult {
|
|
9
|
+
readonly gateId: string;
|
|
10
|
+
readonly runId: string;
|
|
11
|
+
readonly result: string;
|
|
12
|
+
readonly reportHash?: string;
|
|
13
|
+
readonly timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ReviewPackAcceptanceEvidence {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly description: string;
|
|
18
|
+
readonly evidencePath: string;
|
|
19
|
+
readonly evidenceStatus: "linked" | "missing_path" | "pending";
|
|
20
|
+
}
|
|
21
|
+
export interface ReviewPackPolicySummary {
|
|
22
|
+
readonly deniedCount: number;
|
|
23
|
+
readonly approvalRequiredCount: number;
|
|
24
|
+
readonly approvedCount: number;
|
|
25
|
+
readonly recentDenials: readonly {
|
|
26
|
+
readonly ruleId: string;
|
|
27
|
+
readonly reason: string;
|
|
28
|
+
readonly timestamp: string;
|
|
29
|
+
}[];
|
|
30
|
+
}
|
|
31
|
+
export interface ReviewPackBundle {
|
|
32
|
+
readonly specId: string;
|
|
33
|
+
readonly generatedAt: string;
|
|
34
|
+
readonly requirementsSummary: string;
|
|
35
|
+
readonly currentStatus: string;
|
|
36
|
+
readonly changedFiles: readonly string[];
|
|
37
|
+
readonly acceptanceEvidence: readonly ReviewPackAcceptanceEvidence[];
|
|
38
|
+
readonly gateResults: readonly ReviewPackGateResult[];
|
|
39
|
+
readonly policySummary: ReviewPackPolicySummary;
|
|
40
|
+
readonly residualRisk: readonly string[];
|
|
41
|
+
readonly reportHash?: string;
|
|
42
|
+
readonly statusNote?: string;
|
|
43
|
+
readonly evidenceLabel: "observed" | "inferred";
|
|
44
|
+
}
|
|
45
|
+
/** Latest gate.report per gateId for a spec (includes PASS). */
|
|
46
|
+
export declare function collectGateResults(events: readonly PersistedAdkEvent[], specId: string): ReviewPackGateResult[];
|
|
47
|
+
export declare function buildPolicySummary(events: readonly PersistedAdkEvent[]): ReviewPackPolicySummary;
|
|
48
|
+
export declare function mapAcceptanceEvidence(items: readonly HandoffAcceptanceItem[]): ReviewPackAcceptanceEvidence[];
|
|
49
|
+
export declare function collectChangedFiles(events: readonly PersistedAdkEvent[], artifactPaths: readonly string[], acceptance: readonly HandoffAcceptanceItem[]): string[];
|
|
50
|
+
export declare function buildResidualRisk(input: {
|
|
51
|
+
readonly acceptance: readonly ReviewPackAcceptanceEvidence[];
|
|
52
|
+
readonly gateResults: readonly ReviewPackGateResult[];
|
|
53
|
+
readonly policySummary: ReviewPackPolicySummary;
|
|
54
|
+
}): string[];
|
|
55
|
+
export declare function buildReviewPackBundle(input: {
|
|
56
|
+
readonly specId: string;
|
|
57
|
+
readonly requirementsSummary: string;
|
|
58
|
+
readonly currentStatus: string;
|
|
59
|
+
readonly acceptance: readonly HandoffAcceptanceItem[];
|
|
60
|
+
readonly artifactPaths: readonly string[];
|
|
61
|
+
readonly events: readonly PersistedAdkEvent[];
|
|
62
|
+
readonly reportHash?: string;
|
|
63
|
+
}): ReviewPackBundle;
|
|
64
|
+
/** Render reviewer-facing markdown summary. */
|
|
65
|
+
export declare function renderReviewPackMarkdown(bundle: ReviewPackBundle): string;
|
|
66
|
+
export { extractSpecGoal, parseAcceptanceFile };
|
|
67
|
+
//# sourceMappingURL=review-pack-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pack-summary.d.ts","sourceRoot":"","sources":["../src/review-pack-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review-pack bundle builder — DAC-007 / Recovery plane read-only evidence bundle.
|
|
3
|
+
*
|
|
4
|
+
* SEC-17: bundle is for human review — not an automatic approval verdict.
|
|
5
|
+
*/
|
|
6
|
+
import { extractSpecGoal, parseAcceptanceFile } from "./handoff-summary.js";
|
|
7
|
+
function payloadOf(event) {
|
|
8
|
+
return event.payload;
|
|
9
|
+
}
|
|
10
|
+
/** Latest gate.report per gateId for a spec (includes PASS). */
|
|
11
|
+
export function collectGateResults(events, specId) {
|
|
12
|
+
const latestByGateId = new Map();
|
|
13
|
+
for (const event of events) {
|
|
14
|
+
if (event.specId !== specId || event.kind !== "gate.report")
|
|
15
|
+
continue;
|
|
16
|
+
const payload = payloadOf(event);
|
|
17
|
+
const gateId = typeof payload.gateId === "string" ? payload.gateId : "UNKNOWN-GATE";
|
|
18
|
+
const entry = {
|
|
19
|
+
gateId,
|
|
20
|
+
runId: event.runId,
|
|
21
|
+
result: String(payload.result ?? "UNKNOWN"),
|
|
22
|
+
reportHash: typeof payload.reportHash === "string" ? payload.reportHash : undefined,
|
|
23
|
+
timestamp: event.timestamp,
|
|
24
|
+
};
|
|
25
|
+
const existing = latestByGateId.get(gateId);
|
|
26
|
+
if (!existing || event.timestamp >= existing.timestamp) {
|
|
27
|
+
latestByGateId.set(gateId, entry);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return [...latestByGateId.values()].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
31
|
+
}
|
|
32
|
+
export function buildPolicySummary(events) {
|
|
33
|
+
let deniedCount = 0;
|
|
34
|
+
let approvalRequiredCount = 0;
|
|
35
|
+
let approvedCount = 0;
|
|
36
|
+
const recentDenials = [];
|
|
37
|
+
for (const event of events) {
|
|
38
|
+
if (event.kind === "policy.denied") {
|
|
39
|
+
deniedCount += 1;
|
|
40
|
+
const payload = payloadOf(event);
|
|
41
|
+
recentDenials.push({
|
|
42
|
+
ruleId: typeof payload.ruleId === "string" ? payload.ruleId : "UNKNOWN",
|
|
43
|
+
reason: typeof payload.reason === "string" ? payload.reason : "policy denied",
|
|
44
|
+
timestamp: event.timestamp,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (event.kind === "policy.approval.required")
|
|
48
|
+
approvalRequiredCount += 1;
|
|
49
|
+
if (event.kind === "policy.approved")
|
|
50
|
+
approvedCount += 1;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
deniedCount,
|
|
54
|
+
approvalRequiredCount,
|
|
55
|
+
approvedCount,
|
|
56
|
+
recentDenials: recentDenials.slice(-5),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function mapAcceptanceEvidence(items) {
|
|
60
|
+
return items.map((item) => ({
|
|
61
|
+
id: item.id,
|
|
62
|
+
description: item.description,
|
|
63
|
+
evidencePath: item.evidencePath,
|
|
64
|
+
evidenceStatus: item.status === "pending"
|
|
65
|
+
? "pending"
|
|
66
|
+
: item.evidencePath.trim()
|
|
67
|
+
? "linked"
|
|
68
|
+
: "missing_path",
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
export function collectChangedFiles(events, artifactPaths, acceptance) {
|
|
72
|
+
const paths = new Set(artifactPaths);
|
|
73
|
+
for (const item of acceptance) {
|
|
74
|
+
const evidencePath = item.evidencePath.trim();
|
|
75
|
+
if (evidencePath)
|
|
76
|
+
paths.add(evidencePath);
|
|
77
|
+
}
|
|
78
|
+
for (const event of events) {
|
|
79
|
+
const payload = payloadOf(event);
|
|
80
|
+
if (typeof payload.targetPath === "string" && payload.targetPath.trim()) {
|
|
81
|
+
paths.add(payload.targetPath.trim());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return [...paths].sort();
|
|
85
|
+
}
|
|
86
|
+
export function buildResidualRisk(input) {
|
|
87
|
+
const risks = [];
|
|
88
|
+
for (const item of input.acceptance) {
|
|
89
|
+
if (item.evidenceStatus === "pending") {
|
|
90
|
+
risks.push(`Acceptance ${item.id} has no evidence path (manual/skipped risk, G-03)`);
|
|
91
|
+
}
|
|
92
|
+
if (item.evidenceStatus === "missing_path") {
|
|
93
|
+
risks.push(`Acceptance ${item.id} is missing a usable evidence path`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const gate of input.gateResults) {
|
|
97
|
+
if (gate.result !== "PASS") {
|
|
98
|
+
risks.push(`Gate ${gate.gateId} latest result is ${gate.result}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (input.policySummary.deniedCount > 0) {
|
|
102
|
+
risks.push(`${input.policySummary.deniedCount} policy denial(s) recorded in JSONL audit log`);
|
|
103
|
+
}
|
|
104
|
+
if (input.policySummary.approvalRequiredCount > input.policySummary.approvedCount) {
|
|
105
|
+
risks.push("Policy approval holds may be unresolved — review policy.approval.required events");
|
|
106
|
+
}
|
|
107
|
+
if (risks.length === 0) {
|
|
108
|
+
risks.push("No residual risks identified from artifacts and audit events (observed snapshot only)");
|
|
109
|
+
}
|
|
110
|
+
return risks;
|
|
111
|
+
}
|
|
112
|
+
export function buildReviewPackBundle(input) {
|
|
113
|
+
const acceptanceEvidence = mapAcceptanceEvidence(input.acceptance);
|
|
114
|
+
const gateResults = collectGateResults(input.events, input.specId);
|
|
115
|
+
const policySummary = buildPolicySummary(input.events);
|
|
116
|
+
const latestGateHash = gateResults.at(-1)?.reportHash;
|
|
117
|
+
const latestPassHash = [...gateResults].reverse().find((gate) => gate.result === "PASS")?.reportHash;
|
|
118
|
+
const nonPassGates = gateResults.filter((gate) => gate.result !== "PASS");
|
|
119
|
+
const hasAuditDrift = input.currentStatus === "verified" && nonPassGates.length > 0;
|
|
120
|
+
return {
|
|
121
|
+
specId: input.specId,
|
|
122
|
+
generatedAt: new Date().toISOString(),
|
|
123
|
+
requirementsSummary: input.requirementsSummary,
|
|
124
|
+
currentStatus: input.currentStatus,
|
|
125
|
+
changedFiles: collectChangedFiles(input.events, input.artifactPaths, input.acceptance),
|
|
126
|
+
acceptanceEvidence,
|
|
127
|
+
gateResults,
|
|
128
|
+
policySummary,
|
|
129
|
+
residualRisk: buildResidualRisk({ acceptance: acceptanceEvidence, gateResults, policySummary }),
|
|
130
|
+
reportHash: hasAuditDrift
|
|
131
|
+
? (input.reportHash ?? latestPassHash)
|
|
132
|
+
: (latestPassHash ?? latestGateHash ?? input.reportHash),
|
|
133
|
+
statusNote: hasAuditDrift
|
|
134
|
+
? "metadata.json is verified but JSONL records newer non-PASS gate — inspect gateResults for audit drift"
|
|
135
|
+
: undefined,
|
|
136
|
+
evidenceLabel: "observed",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** Render reviewer-facing markdown summary. */
|
|
140
|
+
export function renderReviewPackMarkdown(bundle) {
|
|
141
|
+
const gatesSection = bundle.gateResults
|
|
142
|
+
.map((gate) => `- **${gate.gateId}**: ${gate.result}` +
|
|
143
|
+
(gate.reportHash ? ` (reportHash: \`${gate.reportHash}\`)` : "") +
|
|
144
|
+
` — run \`${gate.runId}\` at ${gate.timestamp}`)
|
|
145
|
+
.join("\n");
|
|
146
|
+
const acceptanceSection = bundle.acceptanceEvidence
|
|
147
|
+
.map((item) => `- **${item.id}** [${item.evidenceStatus}]: ${item.description}` +
|
|
148
|
+
(item.evidencePath ? ` — \`${item.evidencePath}\`` : ""))
|
|
149
|
+
.join("\n");
|
|
150
|
+
const policySection = [
|
|
151
|
+
`- Denied: ${bundle.policySummary.deniedCount}`,
|
|
152
|
+
`- Approval required: ${bundle.policySummary.approvalRequiredCount}`,
|
|
153
|
+
`- Approved: ${bundle.policySummary.approvedCount}`,
|
|
154
|
+
].join("\n");
|
|
155
|
+
const denialDetails = bundle.policySummary.recentDenials.length === 0
|
|
156
|
+
? "_No recent policy.denied events._\n"
|
|
157
|
+
: bundle.policySummary.recentDenials
|
|
158
|
+
.map((d) => `- \`${d.ruleId}\` at ${d.timestamp}: ${d.reason}`)
|
|
159
|
+
.join("\n");
|
|
160
|
+
const filesSection = bundle.changedFiles.map((file) => `- \`${file}\``).join("\n");
|
|
161
|
+
const riskSection = bundle.residualRisk.map((risk) => `- ${risk}`).join("\n");
|
|
162
|
+
return `# Review Pack — ${bundle.specId}
|
|
163
|
+
|
|
164
|
+
> Generated: ${bundle.generatedAt}
|
|
165
|
+
> Status: **${bundle.currentStatus}**
|
|
166
|
+
> Evidence label: ${bundle.evidenceLabel}
|
|
167
|
+
${bundle.statusNote ? `\n> **Note:** ${bundle.statusNote}\n` : ""}
|
|
168
|
+
|
|
169
|
+
## Requirements Summary
|
|
170
|
+
|
|
171
|
+
${bundle.requirementsSummary}
|
|
172
|
+
|
|
173
|
+
## Changed / Related Files
|
|
174
|
+
|
|
175
|
+
${filesSection || "_No files listed._"}
|
|
176
|
+
|
|
177
|
+
## Acceptance Evidence
|
|
178
|
+
|
|
179
|
+
${acceptanceSection || "_No acceptance items._"}
|
|
180
|
+
|
|
181
|
+
## Gate Results
|
|
182
|
+
|
|
183
|
+
${gatesSection || "_No gate reports in audit log._"}
|
|
184
|
+
|
|
185
|
+
## Policy Decisions
|
|
186
|
+
|
|
187
|
+
${policySection}
|
|
188
|
+
|
|
189
|
+
### Recent Denials
|
|
190
|
+
|
|
191
|
+
${denialDetails}
|
|
192
|
+
|
|
193
|
+
## Residual Risk
|
|
194
|
+
|
|
195
|
+
${riskSection}
|
|
196
|
+
`;
|
|
197
|
+
}
|
|
198
|
+
export { extractSpecGoal, parseAcceptanceFile };
|
|
199
|
+
//# sourceMappingURL=review-pack-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-pack-summary.js","sourceRoot":"","sources":["../src/review-pack-summary.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAA8B,MAAM,sBAAsB,CAAC;AA2CxG,SAAS,SAAS,CAAC,KAAwB;IACzC,OAAO,KAAK,CAAC,OAAkC,CAAC;AAClD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,kBAAkB,CAChC,MAAoC,EACpC,MAAc;IAEd,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,SAAS;QACtE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;QACpF,MAAM,KAAK,GAAyB;YAClC,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;YAC3C,UAAU,EAAE,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACnF,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvD,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAoC;IACrE,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAC9B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,aAAa,GAAuD,EAAE,CAAC;IAE7E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,WAAW,IAAI,CAAC,CAAC;YACjB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YACjC,aAAa,CAAC,IAAI,CAAC;gBACjB,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBACvE,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;gBAC7E,SAAS,EAAE,KAAK,CAAC,SAAS;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B;YAAE,qBAAqB,IAAI,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YAAE,aAAa,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,WAAW;QACX,qBAAqB;QACrB,aAAa;QACb,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAuC;IAEvC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,cAAc,EACZ,IAAI,CAAC,MAAM,KAAK,SAAS;YACvB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;gBACxB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,cAAc;KACvB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAoC,EACpC,aAAgC,EAChC,UAA4C;IAE5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,aAAa,CAAC,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,YAAY;YAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACxE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAIjC;IACC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,mDAAmD,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,oCAAoC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,WAAW,+CAA+C,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,CAAC,qBAAqB,GAAG,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACtG,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAQrC;IACC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;IACtD,MAAM,cAAc,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC;IACrG,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,KAAK,UAAU,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpF,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC;QACtF,kBAAkB;QAClB,WAAW;QACX,aAAa;QACb,YAAY,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;QAC/F,UAAU,EAAE,aAAa;YACvB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC;YACtC,CAAC,CAAC,CAAC,cAAc,IAAI,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1D,UAAU,EACR,aAAa;YACX,CAAC,CAAC,uGAAuG;YACzG,CAAC,CAAC,SAAS;QACf,aAAa,EAAE,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,wBAAwB,CAAC,MAAwB;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW;SACpC,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE;QACtC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,YAAY,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,SAAS,EAAE,CAClD;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,iBAAiB,GAAG,MAAM,CAAC,kBAAkB;SAChD,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,cAAc,MAAM,IAAI,CAAC,WAAW,EAAE;QAChE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3D;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG;QACpB,aAAa,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE;QAC/C,wBAAwB,MAAM,CAAC,aAAa,CAAC,qBAAqB,EAAE;QACpE,eAAe,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE;KACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,aAAa,GACjB,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAC7C,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;aAC9D,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpB,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9E,OAAO,mBAAmB,MAAM,CAAC,MAAM;;eAE1B,MAAM,CAAC,WAAW;cACnB,MAAM,CAAC,aAAa;oBACd,MAAM,CAAC,aAAa;EACtC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE;;;;EAI/D,MAAM,CAAC,mBAAmB;;;;EAI1B,YAAY,IAAI,oBAAoB;;;;EAIpC,iBAAiB,IAAI,wBAAwB;;;;EAI7C,YAAY,IAAI,iCAAiC;;;;EAIjD,aAAa;;;;EAIb,aAAa;;;;EAIb,WAAW;CACZ,CAAC;AACF,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-command session runId — `.jcr-adk/state/current-run.json`.
|
|
3
|
+
*
|
|
4
|
+
* Wave 2 (KI-002): propagate runId across gate/tool/sync without repeating
|
|
5
|
+
* `--run-id` when the same spec is active in the workspace.
|
|
6
|
+
*
|
|
7
|
+
* Fail-closed contract (review hardening):
|
|
8
|
+
* - Only a SUCCESSFUL `run` records a `completed` session.
|
|
9
|
+
* - `sync` (reuse-or-fail) requires a `completed` session, so a failed run can
|
|
10
|
+
* never promote metadata to `verified` (NP-01 intent).
|
|
11
|
+
* - `sync` consumes the session on success so a later run cannot silently reuse
|
|
12
|
+
* a stale runId.
|
|
13
|
+
*/
|
|
14
|
+
export type RunSessionStatus = "started" | "completed" | "blocked";
|
|
15
|
+
export interface CurrentRunSession {
|
|
16
|
+
readonly specId: string;
|
|
17
|
+
readonly runId: string;
|
|
18
|
+
readonly status: RunSessionStatus;
|
|
19
|
+
readonly updatedAt: string;
|
|
20
|
+
}
|
|
21
|
+
export type ResolveRunIdMode =
|
|
22
|
+
/**
|
|
23
|
+
* Use a completed session runId when specId matches; otherwise mint an
|
|
24
|
+
* EPHEMERAL runId for this single command WITHOUT persisting a completed
|
|
25
|
+
* session. Auxiliary commands (gate/tool) must never fabricate a completed
|
|
26
|
+
* session, or `sync` could verify without a successful `run` (NP-01).
|
|
27
|
+
*/
|
|
28
|
+
"reuse-or-generate"
|
|
29
|
+
/** Use a completed session runId when specId matches; otherwise fail-closed. */
|
|
30
|
+
| "reuse-or-fail";
|
|
31
|
+
export declare function currentRunSessionPath(workspaceRoot: string): string;
|
|
32
|
+
export declare function readCurrentRunSession(workspaceRoot: string): Promise<CurrentRunSession | null>;
|
|
33
|
+
/** Atomically persist the session (temp write + rename) to avoid torn writes. */
|
|
34
|
+
export declare function writeCurrentRunSession(workspaceRoot: string, session: Pick<CurrentRunSession, "specId" | "runId" | "status">): Promise<void>;
|
|
35
|
+
/** Mark the active run session as completed after a successful `run`. */
|
|
36
|
+
export declare function markRunSessionCompleted(workspaceRoot: string, session: Pick<CurrentRunSession, "specId" | "runId">): Promise<void>;
|
|
37
|
+
/** Mark the active run session as blocked after AC-009 max-iteration stop. */
|
|
38
|
+
export declare function markRunSessionBlocked(workspaceRoot: string, session: Pick<CurrentRunSession, "specId" | "runId">): Promise<void>;
|
|
39
|
+
/** Consume (delete) the session so a later run starts from a fresh runId. */
|
|
40
|
+
export declare function clearCurrentRunSession(workspaceRoot: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Resolve runId for a downstream CLI command (gate / tool / sync).
|
|
43
|
+
*
|
|
44
|
+
* `run` does NOT use this helper: it owns runId generation and only records a
|
|
45
|
+
* completed session after a successful execution (see commands/run.ts).
|
|
46
|
+
*
|
|
47
|
+
* Fail-closed invariant: a `completed` session is created ONLY by a successful
|
|
48
|
+
* `run` or an explicit `--run-id` (where the caller asserts the run happened
|
|
49
|
+
* out-of-band). A BLOCKED session cannot be overridden by `--run-id` (AC-009).
|
|
50
|
+
* `reuse-or-generate` never persists a completed session.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveCliRunId(workspaceRoot: string, specId: string, options: {
|
|
53
|
+
readonly explicitRunId?: string;
|
|
54
|
+
readonly mode: ResolveRunIdMode;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
ok: true;
|
|
57
|
+
runId: string;
|
|
58
|
+
} | {
|
|
59
|
+
ok: false;
|
|
60
|
+
message: string;
|
|
61
|
+
}>;
|
|
62
|
+
//# sourceMappingURL=session-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-run.d.ts","sourceRoot":"","sources":["../src/session-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB;AAC1B;;;;;GAKG;AACD,mBAAmB;AACrB,gFAAgF;GAC9E,eAAe,CAAC;AAEpB,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAuBnC;AAED,iFAAiF;AACjF,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC,GAC9D,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,yEAAyE;AACzE,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,8EAA8E;AAC9E,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,OAAO,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,6EAA6E;AAC7E,wBAAsB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjF;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC5E,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCvE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-command session runId — `.jcr-adk/state/current-run.json`.
|
|
3
|
+
*
|
|
4
|
+
* Wave 2 (KI-002): propagate runId across gate/tool/sync without repeating
|
|
5
|
+
* `--run-id` when the same spec is active in the workspace.
|
|
6
|
+
*
|
|
7
|
+
* Fail-closed contract (review hardening):
|
|
8
|
+
* - Only a SUCCESSFUL `run` records a `completed` session.
|
|
9
|
+
* - `sync` (reuse-or-fail) requires a `completed` session, so a failed run can
|
|
10
|
+
* never promote metadata to `verified` (NP-01 intent).
|
|
11
|
+
* - `sync` consumes the session on success so a later run cannot silently reuse
|
|
12
|
+
* a stale runId.
|
|
13
|
+
*/
|
|
14
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
15
|
+
import { dirname, join } from "node:path";
|
|
16
|
+
import { generateRunId, resolveAdkPaths } from "@jcr-adk/core";
|
|
17
|
+
export function currentRunSessionPath(workspaceRoot) {
|
|
18
|
+
return join(resolveAdkPaths(workspaceRoot).adkDir, "state", "current-run.json");
|
|
19
|
+
}
|
|
20
|
+
export async function readCurrentRunSession(workspaceRoot) {
|
|
21
|
+
const filePath = currentRunSessionPath(workspaceRoot);
|
|
22
|
+
let raw;
|
|
23
|
+
try {
|
|
24
|
+
raw = JSON.parse(await readFile(filePath, "utf8"));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (typeof raw !== "object" || raw === null)
|
|
30
|
+
return null;
|
|
31
|
+
const record = raw;
|
|
32
|
+
if (typeof record.specId !== "string" || typeof record.runId !== "string")
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
specId: record.specId,
|
|
36
|
+
runId: record.runId,
|
|
37
|
+
// Fail-closed: only an explicit "completed" marker counts as completed.
|
|
38
|
+
status: record.status === "completed"
|
|
39
|
+
? "completed"
|
|
40
|
+
: record.status === "blocked"
|
|
41
|
+
? "blocked"
|
|
42
|
+
: "started",
|
|
43
|
+
updatedAt: typeof record.updatedAt === "string" ? record.updatedAt : new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Atomically persist the session (temp write + rename) to avoid torn writes. */
|
|
47
|
+
export async function writeCurrentRunSession(workspaceRoot, session) {
|
|
48
|
+
const filePath = currentRunSessionPath(workspaceRoot);
|
|
49
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
50
|
+
const body = {
|
|
51
|
+
specId: session.specId,
|
|
52
|
+
runId: session.runId,
|
|
53
|
+
status: session.status,
|
|
54
|
+
updatedAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
const tmpPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
57
|
+
await writeFile(tmpPath, `${JSON.stringify(body, null, 2)}\n`, "utf8");
|
|
58
|
+
await rename(tmpPath, filePath);
|
|
59
|
+
}
|
|
60
|
+
/** Mark the active run session as completed after a successful `run`. */
|
|
61
|
+
export async function markRunSessionCompleted(workspaceRoot, session) {
|
|
62
|
+
await writeCurrentRunSession(workspaceRoot, { ...session, status: "completed" });
|
|
63
|
+
}
|
|
64
|
+
/** Mark the active run session as blocked after AC-009 max-iteration stop. */
|
|
65
|
+
export async function markRunSessionBlocked(workspaceRoot, session) {
|
|
66
|
+
await writeCurrentRunSession(workspaceRoot, { ...session, status: "blocked" });
|
|
67
|
+
}
|
|
68
|
+
/** Consume (delete) the session so a later run starts from a fresh runId. */
|
|
69
|
+
export async function clearCurrentRunSession(workspaceRoot) {
|
|
70
|
+
await rm(currentRunSessionPath(workspaceRoot), { force: true });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve runId for a downstream CLI command (gate / tool / sync).
|
|
74
|
+
*
|
|
75
|
+
* `run` does NOT use this helper: it owns runId generation and only records a
|
|
76
|
+
* completed session after a successful execution (see commands/run.ts).
|
|
77
|
+
*
|
|
78
|
+
* Fail-closed invariant: a `completed` session is created ONLY by a successful
|
|
79
|
+
* `run` or an explicit `--run-id` (where the caller asserts the run happened
|
|
80
|
+
* out-of-band). A BLOCKED session cannot be overridden by `--run-id` (AC-009).
|
|
81
|
+
* `reuse-or-generate` never persists a completed session.
|
|
82
|
+
*/
|
|
83
|
+
export async function resolveCliRunId(workspaceRoot, specId, options) {
|
|
84
|
+
const current = await readCurrentRunSession(workspaceRoot);
|
|
85
|
+
if (current?.specId === specId && current.status === "blocked") {
|
|
86
|
+
return {
|
|
87
|
+
ok: false,
|
|
88
|
+
message: "run session is BLOCKED: max iteration exceeded (AC-009); run doctor/gate or start a fresh run before sync",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (options.explicitRunId) {
|
|
92
|
+
await writeCurrentRunSession(workspaceRoot, {
|
|
93
|
+
specId,
|
|
94
|
+
runId: options.explicitRunId,
|
|
95
|
+
status: "completed",
|
|
96
|
+
});
|
|
97
|
+
return { ok: true, runId: options.explicitRunId };
|
|
98
|
+
}
|
|
99
|
+
if (current?.specId === specId && current.status === "completed") {
|
|
100
|
+
return { ok: true, runId: current.runId };
|
|
101
|
+
}
|
|
102
|
+
if (options.mode === "reuse-or-fail") {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
message: "missing completed run session: pass --run-id or run `jcr-adk run` for this spec first (KI-002)",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// reuse-or-generate: ephemeral runId for this command only. Do NOT persist a
|
|
109
|
+
// completed session — otherwise gate/tool would let sync verify without a run.
|
|
110
|
+
return { ok: true, runId: generateRunId() };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=session-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-run.js","sourceRoot":"","sources":["../src/session-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAsB/D,MAAM,UAAU,qBAAqB,CAAC,aAAqB;IACzD,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,aAAqB;IAErB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,wEAAwE;QACxE,MAAM,EACJ,MAAM,CAAC,MAAM,KAAK,WAAW;YAC3B,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS;QACjB,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC9F,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,aAAqB,EACrB,OAA+D;IAE/D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAsB;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/D,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvE,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,aAAqB,EACrB,OAAoD;IAEpD,MAAM,sBAAsB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,aAAqB,EACrB,OAAoD;IAEpD,MAAM,sBAAsB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,aAAqB;IAChE,MAAM,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,MAAc,EACd,OAA6E;IAE7E,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC3D,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,2GAA2G;SAC9G,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,MAAM,sBAAsB,CAAC,aAAa,EAAE;YAC1C,MAAM;YACN,KAAK,EAAE,OAAO,CAAC,aAAa;YAC5B,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACrC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EACL,gGAAgG;SACnG,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime session — wires GuardedToolExecutor to workspace artifacts.
|
|
3
|
+
*
|
|
4
|
+
* Connects M5 integration layer to the CLI entrypoint:
|
|
5
|
+
* resolveAdkConfig → JsonlEventStore → F-01 registry adapter → GuardedToolExecutor
|
|
6
|
+
*/
|
|
7
|
+
import { type AdkConfig, type CorrelationIds } from "@jcr-adk/core";
|
|
8
|
+
import { JsonlEventStore } from "@jcr-adk/state";
|
|
9
|
+
import { GuardedToolExecutor } from "@jcr-adk/runtime";
|
|
10
|
+
export interface CliSession {
|
|
11
|
+
readonly workspaceRoot: string;
|
|
12
|
+
readonly config: AdkConfig;
|
|
13
|
+
readonly correlation: CorrelationIds;
|
|
14
|
+
readonly executor: GuardedToolExecutor;
|
|
15
|
+
readonly store: JsonlEventStore;
|
|
16
|
+
}
|
|
17
|
+
export interface CreateCliSessionInput {
|
|
18
|
+
readonly workspaceRoot: string;
|
|
19
|
+
readonly specId: string;
|
|
20
|
+
readonly runId?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Create a guarded execution session bound to the workspace JSONL event log. */
|
|
23
|
+
export declare function createCliSession(input: CreateCliSessionInput): Promise<CliSession>;
|
|
24
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,iFAAiF;AACjF,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BxF"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI runtime session — wires GuardedToolExecutor to workspace artifacts.
|
|
3
|
+
*
|
|
4
|
+
* Connects M5 integration layer to the CLI entrypoint:
|
|
5
|
+
* resolveAdkConfig → JsonlEventStore → F-01 registry adapter → GuardedToolExecutor
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir } from "node:fs/promises";
|
|
8
|
+
import { dirname } from "node:path";
|
|
9
|
+
import { createCorrelationIds, resolveAdkConfig, } from "@jcr-adk/core";
|
|
10
|
+
import { JsonlEventStore } from "@jcr-adk/state";
|
|
11
|
+
import { GuardedToolExecutor } from "@jcr-adk/runtime";
|
|
12
|
+
import { createF01RegistryAdapter } from "@jcr-adk/runner-sdk";
|
|
13
|
+
/** Create a guarded execution session bound to the workspace JSONL event log. */
|
|
14
|
+
export async function createCliSession(input) {
|
|
15
|
+
const config = resolveAdkConfig(input.workspaceRoot);
|
|
16
|
+
await mkdir(dirname(config.adkEventsPath), { recursive: true });
|
|
17
|
+
const correlation = createCorrelationIds({
|
|
18
|
+
specId: input.specId,
|
|
19
|
+
runId: input.runId,
|
|
20
|
+
});
|
|
21
|
+
const store = new JsonlEventStore({
|
|
22
|
+
filePath: config.adkEventsPath,
|
|
23
|
+
boundRunId: correlation.runId,
|
|
24
|
+
});
|
|
25
|
+
const executor = new GuardedToolExecutor({
|
|
26
|
+
store,
|
|
27
|
+
adapter: createF01RegistryAdapter({ workspaceRoot: input.workspaceRoot }),
|
|
28
|
+
});
|
|
29
|
+
return {
|
|
30
|
+
workspaceRoot: input.workspaceRoot,
|
|
31
|
+
config,
|
|
32
|
+
correlation,
|
|
33
|
+
executor,
|
|
34
|
+
store,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAgB/D,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAA4B;IACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACvC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,aAAa;QAC9B,UAAU,EAAE,WAAW,CAAC,KAAK;KAC9B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC;QACvC,KAAK;QACL,OAAO,EAAE,wBAAwB,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;KAC1E,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,MAAM;QACN,WAAW;QACX,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jcr-adk/cli",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"jcr-adk": "./bin/jcr-adk.mjs"
|
|
7
|
+
},
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@jcr-adk/verifier": "2.0.0",
|
|
18
|
+
"@jcr-adk/core": "2.0.0",
|
|
19
|
+
"@jcr-adk/state": "2.0.0",
|
|
20
|
+
"@jcr-adk/doctor": "2.0.0",
|
|
21
|
+
"@jcr-adk/runtime": "2.0.0",
|
|
22
|
+
"@jcr-adk/runner-sdk": "2.0.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"tsx": "^4.19.4",
|
|
26
|
+
"typescript": "^5.8.3"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"bin"
|
|
34
|
+
],
|
|
35
|
+
"description": "JCR ADK (Jason Cursor ADK) — cli",
|
|
36
|
+
"scripts": {
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"test": "node --import tsx --test src/permissions.test.ts src/handlers.test.ts src/main.test.ts src/lifecycle-cli.test.ts src/plan-run-sync-sample.test.ts src/session-run.test.ts src/audit-replay-cli.test.ts src/explain-fail-summary.test.ts src/explain-fail-cli.test.ts src/handoff-summary.test.ts src/handoff-cli.test.ts src/review-pack-summary.test.ts src/review-pack-cli.test.ts",
|
|
39
|
+
"build": "tsc -p tsconfig.build.json"
|
|
40
|
+
}
|
|
41
|
+
}
|