@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.
Files changed (107) hide show
  1. package/LICENSE +201 -0
  2. package/bin/jcr-adk.mjs +8 -0
  3. package/dist/argv.d.ts +10 -0
  4. package/dist/argv.d.ts.map +1 -0
  5. package/dist/argv.js +56 -0
  6. package/dist/argv.js.map +1 -0
  7. package/dist/audit-summary.d.ts +28 -0
  8. package/dist/audit-summary.d.ts.map +1 -0
  9. package/dist/audit-summary.js +39 -0
  10. package/dist/audit-summary.js.map +1 -0
  11. package/dist/commands/audit.d.ts +8 -0
  12. package/dist/commands/audit.d.ts.map +1 -0
  13. package/dist/commands/audit.js +20 -0
  14. package/dist/commands/audit.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +8 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +25 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/explain-fail.d.ts +8 -0
  20. package/dist/commands/explain-fail.d.ts.map +1 -0
  21. package/dist/commands/explain-fail.js +41 -0
  22. package/dist/commands/explain-fail.js.map +1 -0
  23. package/dist/commands/gate.d.ts +8 -0
  24. package/dist/commands/gate.d.ts.map +1 -0
  25. package/dist/commands/gate.js +104 -0
  26. package/dist/commands/gate.js.map +1 -0
  27. package/dist/commands/handoff.d.ts +8 -0
  28. package/dist/commands/handoff.d.ts.map +1 -0
  29. package/dist/commands/handoff.js +61 -0
  30. package/dist/commands/handoff.js.map +1 -0
  31. package/dist/commands/init.d.ts +8 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +48 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/plan.d.ts +8 -0
  36. package/dist/commands/plan.d.ts.map +1 -0
  37. package/dist/commands/plan.js +55 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/replay.d.ts +8 -0
  40. package/dist/commands/replay.d.ts.map +1 -0
  41. package/dist/commands/replay.js +39 -0
  42. package/dist/commands/replay.js.map +1 -0
  43. package/dist/commands/review-pack.d.ts +8 -0
  44. package/dist/commands/review-pack.d.ts.map +1 -0
  45. package/dist/commands/review-pack.js +64 -0
  46. package/dist/commands/review-pack.js.map +1 -0
  47. package/dist/commands/run.d.ts +8 -0
  48. package/dist/commands/run.d.ts.map +1 -0
  49. package/dist/commands/run.js +205 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/commands/sync.d.ts +8 -0
  52. package/dist/commands/sync.d.ts.map +1 -0
  53. package/dist/commands/sync.js +133 -0
  54. package/dist/commands/sync.js.map +1 -0
  55. package/dist/commands/tool.d.ts +12 -0
  56. package/dist/commands/tool.d.ts.map +1 -0
  57. package/dist/commands/tool.js +154 -0
  58. package/dist/commands/tool.js.map +1 -0
  59. package/dist/event-reader.d.ts +28 -0
  60. package/dist/event-reader.d.ts.map +1 -0
  61. package/dist/event-reader.js +39 -0
  62. package/dist/event-reader.js.map +1 -0
  63. package/dist/explain-fail-summary.d.ts +46 -0
  64. package/dist/explain-fail-summary.d.ts.map +1 -0
  65. package/dist/explain-fail-summary.js +405 -0
  66. package/dist/explain-fail-summary.js.map +1 -0
  67. package/dist/handlers.d.ts +134 -0
  68. package/dist/handlers.d.ts.map +1 -0
  69. package/dist/handlers.js +257 -0
  70. package/dist/handlers.js.map +1 -0
  71. package/dist/handoff-summary.d.ts +62 -0
  72. package/dist/handoff-summary.d.ts.map +1 -0
  73. package/dist/handoff-summary.js +170 -0
  74. package/dist/handoff-summary.js.map +1 -0
  75. package/dist/index.d.ts +11 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +6 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/lifecycle-artifacts.d.ts +62 -0
  80. package/dist/lifecycle-artifacts.d.ts.map +1 -0
  81. package/dist/lifecycle-artifacts.js +160 -0
  82. package/dist/lifecycle-artifacts.js.map +1 -0
  83. package/dist/main.d.ts +30 -0
  84. package/dist/main.d.ts.map +1 -0
  85. package/dist/main.js +159 -0
  86. package/dist/main.js.map +1 -0
  87. package/dist/permissions.d.ts +42 -0
  88. package/dist/permissions.d.ts.map +1 -0
  89. package/dist/permissions.js +57 -0
  90. package/dist/permissions.js.map +1 -0
  91. package/dist/replay-summary.d.ts +28 -0
  92. package/dist/replay-summary.d.ts.map +1 -0
  93. package/dist/replay-summary.js +73 -0
  94. package/dist/replay-summary.js.map +1 -0
  95. package/dist/review-pack-summary.d.ts +67 -0
  96. package/dist/review-pack-summary.d.ts.map +1 -0
  97. package/dist/review-pack-summary.js +199 -0
  98. package/dist/review-pack-summary.js.map +1 -0
  99. package/dist/session-run.d.ts +62 -0
  100. package/dist/session-run.d.ts.map +1 -0
  101. package/dist/session-run.js +112 -0
  102. package/dist/session-run.js.map +1 -0
  103. package/dist/session.d.ts +24 -0
  104. package/dist/session.d.ts.map +1 -0
  105. package/dist/session.js +37 -0
  106. package/dist/session.js.map +1 -0
  107. package/package.json +41 -0
@@ -0,0 +1,257 @@
1
+ /**
2
+ * CLI command handler skeletons — E6 / CMD-02R.
3
+ *
4
+ * Core-stage handlers:
5
+ * - `doctor`: read-only, no state mutation.
6
+ * - `gate`: verifier-controlled mutation only (runs gate, may update status).
7
+ * - `audit`: read-only event/gate/policy summary (CMD-03R / F-12).
8
+ * - `replay`: read-only JSONL replay summary (SR-09 / F-02).
9
+ * - `explain-fail`: read-only failure explanation (DAC-008).
10
+ * - `handoff`: read-only handoff package (DAC-006).
11
+ * - `review-pack`: read-only reviewer evidence bundle (DAC-007).
12
+ *
13
+ * Lifecycle init/plan/run/sync are in commands/*.ts.
14
+ */
15
+ import { gateAllowsMutation, runGate } from "@jcr-adk/verifier";
16
+ import { readFile } from "node:fs/promises";
17
+ import { buildAuditSummary } from "./audit-summary.js";
18
+ import { filterEvents, readWorkspaceEvents } from "./event-reader.js";
19
+ import { loadWorkspaceConfig, pathExists, readSpecMetadata, resolveSpecArtifactPaths, } from "./lifecycle-artifacts.js";
20
+ import { checkReadReportMutationDeny } from "./permissions.js";
21
+ import { buildExplainFailSummary } from "./explain-fail-summary.js";
22
+ import { buildHandoffPackage, renderHandoffMarkdown, } from "./handoff-summary.js";
23
+ import { buildReviewPackBundle, extractSpecGoal, parseAcceptanceFile, renderReviewPackMarkdown, } from "./review-pack-summary.js";
24
+ import { buildReplaySummary } from "./replay-summary.js";
25
+ /**
26
+ * `jcr-adk doctor` handler — read-only.
27
+ * Guards against any lifecycle state mutation attempts (CMD-02R).
28
+ */
29
+ export function runDoctorHandler(input) {
30
+ // CMD-02R: read/report command must not mutate state.
31
+ // The doctor handler itself never mutates, but we assert that explicitly
32
+ // so any future code adding mutation can be caught at review.
33
+ const check = checkReadReportMutationDeny("jcr-adk doctor");
34
+ if (check.allowed) {
35
+ // Handler was reclassified as mutating — this is a programming error.
36
+ throw new Error(`CMD-02R invariant violated: jcr-adk doctor was reclassified as a mutating command.`);
37
+ }
38
+ return { ok: input.report.ok, report: input.report };
39
+ }
40
+ /**
41
+ * `jcr-adk gate` handler — verifier-controlled mutation.
42
+ * Runs the gate, and:
43
+ * - PASS → caller may proceed with lifecycle mutation (G-02 check passes).
44
+ * - FAIL/TIMEOUT/ERROR → blocks mutation and returns reason.
45
+ *
46
+ * The handler itself does NOT write to the event store; it returns the run
47
+ * result so the caller can emit policy.denied / gate.completed events in the
48
+ * correct EVENT_FIRST_WRITE_ORDERING.
49
+ */
50
+ export async function runGateHandler(input) {
51
+ const run = await runGate(input);
52
+ if (!run.ok || !gateAllowsMutation(run.result)) {
53
+ const reason = run.ok ? `gate returned ${run.result}` : run.reason;
54
+ return {
55
+ ok: false,
56
+ gateResult: run.result,
57
+ reason,
58
+ };
59
+ }
60
+ return { ok: true, gateResult: "PASS", gateRun: run };
61
+ }
62
+ function assertReadOnlyCommand(command) {
63
+ const check = checkReadReportMutationDeny(command);
64
+ if (check.allowed) {
65
+ throw new Error(`CMD-02R invariant violated: ${command} was reclassified as mutating.`);
66
+ }
67
+ }
68
+ /** `jcr-adk audit` — read-only event/gate/policy summary. */
69
+ export async function runAuditHandler(input) {
70
+ assertReadOnlyCommand("jcr-adk audit");
71
+ const read = await readWorkspaceEvents(input.workspaceRoot);
72
+ const filtered = filterEvents(read.events, {
73
+ specId: input.specId,
74
+ runId: input.runId,
75
+ });
76
+ const summary = buildAuditSummary(input.workspaceRoot, read.eventsPath, filtered, {
77
+ specId: input.specId,
78
+ runId: input.runId,
79
+ });
80
+ // Fail-closed: a corrupt/unreadable log must not report a clean empty summary.
81
+ if (!read.ok) {
82
+ return { ok: false, summary, error: read.error };
83
+ }
84
+ return { ok: true, summary };
85
+ }
86
+ /** `jcr-adk replay` — reconstruct run summary from JSONL events. */
87
+ export async function runReplayHandler(input) {
88
+ assertReadOnlyCommand("jcr-adk replay");
89
+ const read = await readWorkspaceEvents(input.workspaceRoot);
90
+ const summary = buildReplaySummary(read.events, input.runId, input.specId);
91
+ // Fail-closed: distinguish a corrupt log from a genuinely unknown runId.
92
+ if (!read.ok) {
93
+ return { ok: false, summary, reason: "READ_ERROR", error: read.error };
94
+ }
95
+ if (summary.eventCount === 0) {
96
+ return { ok: false, summary, reason: "NO_EVENTS" };
97
+ }
98
+ return { ok: true, summary };
99
+ }
100
+ /** `jcr-adk explain-fail` — structured failure explanation from JSONL events. */
101
+ export async function runExplainFailHandler(input) {
102
+ assertReadOnlyCommand("jcr-adk explain-fail");
103
+ const read = await readWorkspaceEvents(input.workspaceRoot);
104
+ if (!read.ok) {
105
+ return { ok: false, reason: "READ_ERROR", error: read.error };
106
+ }
107
+ const built = buildExplainFailSummary(read.events, input.targetId, input.workspaceRoot, input.specId);
108
+ if (built === null) {
109
+ return { ok: false, reason: "NOT_FOUND" };
110
+ }
111
+ return { ok: true, summary: built };
112
+ }
113
+ /** `jcr-adk handoff` — build context package from spec artifacts + JSONL audit. */
114
+ export async function runHandoffHandler(input) {
115
+ assertReadOnlyCommand("jcr-adk handoff");
116
+ const config = await loadWorkspaceConfig(input.workspaceRoot);
117
+ let paths;
118
+ try {
119
+ paths = resolveSpecArtifactPaths(config, input.specId);
120
+ }
121
+ catch {
122
+ return { ok: false, reason: "SPEC_NOT_FOUND" };
123
+ }
124
+ if (!(await pathExists(paths.metadataJson))) {
125
+ return { ok: false, reason: "SPEC_NOT_FOUND" };
126
+ }
127
+ const read = await readWorkspaceEvents(input.workspaceRoot);
128
+ if (!read.ok) {
129
+ return { ok: false, reason: "READ_ERROR", error: read.error };
130
+ }
131
+ let metadata;
132
+ try {
133
+ metadata = await readSpecMetadata(paths.metadataJson);
134
+ }
135
+ catch (err) {
136
+ return {
137
+ ok: false,
138
+ reason: "ARTIFACT_READ_ERROR",
139
+ error: err instanceof Error ? err.message : String(err),
140
+ };
141
+ }
142
+ let specMd = "";
143
+ if (await pathExists(paths.specMd)) {
144
+ try {
145
+ specMd = await readFile(paths.specMd, "utf8");
146
+ }
147
+ catch (err) {
148
+ return {
149
+ ok: false,
150
+ reason: "ARTIFACT_READ_ERROR",
151
+ error: err instanceof Error ? err.message : String(err),
152
+ };
153
+ }
154
+ }
155
+ let acceptanceRaw = { items: [] };
156
+ if (await pathExists(paths.acceptanceJson)) {
157
+ try {
158
+ acceptanceRaw = JSON.parse(await readFile(paths.acceptanceJson, "utf8"));
159
+ }
160
+ catch (err) {
161
+ return {
162
+ ok: false,
163
+ reason: "ARTIFACT_READ_ERROR",
164
+ error: err instanceof Error ? err.message : String(err),
165
+ };
166
+ }
167
+ }
168
+ const specRelative = `.jcr-adk/specs/${input.specId}`;
169
+ const pkg = buildHandoffPackage(input.specId, input.workspaceRoot, {
170
+ specGoal: extractSpecGoal(specMd, input.specId),
171
+ currentStatus: metadata.status,
172
+ acceptance: parseAcceptanceFile(acceptanceRaw),
173
+ relatedFiles: [
174
+ `${specRelative}/spec.md`,
175
+ `${specRelative}/plan.md`,
176
+ `${specRelative}/acceptance.json`,
177
+ `${specRelative}/metadata.json`,
178
+ ],
179
+ lastRunId: metadata.lastGateRunId,
180
+ reportHash: metadata.reportHash,
181
+ }, filterEvents(read.events, { specId: input.specId }));
182
+ return { ok: true, package: pkg, markdown: renderHandoffMarkdown(pkg) };
183
+ }
184
+ /** `jcr-adk review-pack` — reviewer evidence bundle from spec + JSONL audit. */
185
+ export async function runReviewPackHandler(input) {
186
+ assertReadOnlyCommand("jcr-adk review-pack");
187
+ const config = await loadWorkspaceConfig(input.workspaceRoot);
188
+ let paths;
189
+ try {
190
+ paths = resolveSpecArtifactPaths(config, input.specId);
191
+ }
192
+ catch {
193
+ return { ok: false, reason: "SPEC_NOT_FOUND" };
194
+ }
195
+ if (!(await pathExists(paths.metadataJson))) {
196
+ return { ok: false, reason: "SPEC_NOT_FOUND" };
197
+ }
198
+ const read = await readWorkspaceEvents(input.workspaceRoot);
199
+ if (!read.ok) {
200
+ return { ok: false, reason: "READ_ERROR", error: read.error };
201
+ }
202
+ let metadata;
203
+ try {
204
+ metadata = await readSpecMetadata(paths.metadataJson);
205
+ }
206
+ catch (err) {
207
+ return {
208
+ ok: false,
209
+ reason: "ARTIFACT_READ_ERROR",
210
+ error: err instanceof Error ? err.message : String(err),
211
+ };
212
+ }
213
+ let specMd = "";
214
+ if (await pathExists(paths.specMd)) {
215
+ try {
216
+ specMd = await readFile(paths.specMd, "utf8");
217
+ }
218
+ catch (err) {
219
+ return {
220
+ ok: false,
221
+ reason: "ARTIFACT_READ_ERROR",
222
+ error: err instanceof Error ? err.message : String(err),
223
+ };
224
+ }
225
+ }
226
+ let acceptanceRaw = { items: [] };
227
+ if (await pathExists(paths.acceptanceJson)) {
228
+ try {
229
+ acceptanceRaw = JSON.parse(await readFile(paths.acceptanceJson, "utf8"));
230
+ }
231
+ catch (err) {
232
+ return {
233
+ ok: false,
234
+ reason: "ARTIFACT_READ_ERROR",
235
+ error: err instanceof Error ? err.message : String(err),
236
+ };
237
+ }
238
+ }
239
+ const specRelative = `.jcr-adk/specs/${input.specId}`;
240
+ const specEvents = filterEvents(read.events, { specId: input.specId });
241
+ const bundle = buildReviewPackBundle({
242
+ specId: input.specId,
243
+ requirementsSummary: extractSpecGoal(specMd, input.specId),
244
+ currentStatus: metadata.status,
245
+ acceptance: parseAcceptanceFile(acceptanceRaw),
246
+ artifactPaths: [
247
+ `${specRelative}/spec.md`,
248
+ `${specRelative}/plan.md`,
249
+ `${specRelative}/acceptance.json`,
250
+ `${specRelative}/metadata.json`,
251
+ ],
252
+ events: specEvents,
253
+ reportHash: metadata.reportHash,
254
+ });
255
+ return { ok: true, bundle, markdown: renderReviewPackMarkdown(bundle) };
256
+ }
257
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Handoff package builder — DAC-006 / Recovery plane read-only context artifact.
3
+ *
4
+ * Aggregates spec artifacts + JSONL audit data. Does not mutate SpecStatus (CMD-02R).
5
+ * SEC-16: package is context for humans/agents — not a completion verdict.
6
+ */
7
+ import type { PersistedAdkEvent } from "@jcr-adk/state";
8
+ export interface HandoffFailedGate {
9
+ readonly gateId: string;
10
+ readonly runId: string;
11
+ readonly result: string;
12
+ readonly reportHash?: string;
13
+ readonly timestamp: string;
14
+ }
15
+ export interface HandoffAcceptanceItem {
16
+ readonly id: string;
17
+ readonly description: string;
18
+ readonly evidencePath: string;
19
+ readonly status: "pending" | "evidence_defined";
20
+ }
21
+ export interface HandoffPackage {
22
+ readonly specId: string;
23
+ readonly generatedAt: string;
24
+ readonly specGoal: string;
25
+ readonly currentStatus: string;
26
+ readonly failedGates: readonly HandoffFailedGate[];
27
+ readonly acceptance: readonly HandoffAcceptanceItem[];
28
+ readonly relatedFiles: readonly string[];
29
+ readonly nextCommands: readonly string[];
30
+ readonly prohibitions: readonly string[];
31
+ readonly lastRunId?: string;
32
+ readonly reportHash?: string;
33
+ /** Set when metadata status and JSONL gate outcomes may disagree (SEC-16). */
34
+ readonly statusNote?: string;
35
+ /** `observed` = from artifacts/JSONL; `inferred` = heuristic guidance */
36
+ readonly evidenceLabel: "observed" | "inferred";
37
+ }
38
+ export interface HandoffSpecArtifacts {
39
+ readonly specGoal: string;
40
+ readonly currentStatus: string;
41
+ readonly acceptance: readonly HandoffAcceptanceItem[];
42
+ readonly relatedFiles: readonly string[];
43
+ readonly lastRunId?: string;
44
+ readonly reportHash?: string;
45
+ }
46
+ /** Extract goal text from plan scaffold spec.md. */
47
+ export declare function extractSpecGoal(specMd: string, specId: string): string;
48
+ export declare function parseAcceptanceFile(raw: unknown): HandoffAcceptanceItem[];
49
+ /** Collect gateIds whose latest gate.report outcome is non-PASS for a spec. */
50
+ export declare function collectFailedGates(events: readonly PersistedAdkEvent[], specId: string): HandoffFailedGate[];
51
+ export declare function buildNextCommands(input: {
52
+ readonly workspaceRoot: string;
53
+ readonly specId: string;
54
+ readonly currentStatus: string;
55
+ readonly failedGates: readonly HandoffFailedGate[];
56
+ readonly lastRunId?: string;
57
+ }): string[];
58
+ /** Build handoff package from spec artifacts and optional workspace events. */
59
+ export declare function buildHandoffPackage(specId: string, workspaceRoot: string, artifacts: HandoffSpecArtifacts, events: readonly PersistedAdkEvent[]): HandoffPackage;
60
+ /** Render handoff package as markdown for human/agent handoff. */
61
+ export declare function renderHandoffMarkdown(pkg: HandoffPackage): string;
62
+ //# sourceMappingURL=handoff-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-summary.d.ts","sourceRoot":"","sources":["../src/handoff-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,kBAAkB,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACtD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAqBD,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkBtE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,qBAAqB,EAAE,CAazE;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAyBrB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,EAAE,CAyBX;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,oBAAoB,EAC/B,MAAM,EAAE,SAAS,iBAAiB,EAAE,GACnC,cAAc,CAgChB;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAqDjE"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Handoff package builder — DAC-006 / Recovery plane read-only context artifact.
3
+ *
4
+ * Aggregates spec artifacts + JSONL audit data. Does not mutate SpecStatus (CMD-02R).
5
+ * SEC-16: package is context for humans/agents — not a completion verdict.
6
+ */
7
+ const DEFAULT_PROHIBITIONS = [
8
+ "Do not set metadata status to verified without a gate PASS and sealed reportHash (G-02)",
9
+ "Do not mutate lifecycle state via read/report commands (audit/replay/handoff/explain-fail/review-pack) — CMD-02R",
10
+ "Do not bypass policy with spoofed tool args or unapproved destructive shell commands (AC-008)",
11
+ "Do not mark acceptance items passed without non-empty evidence paths (G-03)",
12
+ ];
13
+ function payloadOf(event) {
14
+ return event.payload;
15
+ }
16
+ /** Extract goal text from plan scaffold spec.md. */
17
+ export function extractSpecGoal(specMd, specId) {
18
+ const lines = specMd.split("\n");
19
+ const titleLine = lines.find((line) => line.startsWith("# "));
20
+ const title = titleLine?.slice(2).trim();
21
+ const intentIdx = lines.findIndex((line) => /^##\s+Intent\b/i.test(line.trim()));
22
+ if (intentIdx >= 0) {
23
+ const intentParts = [];
24
+ for (let i = intentIdx + 1; i < lines.length; i++) {
25
+ const line = lines[i];
26
+ if (line.startsWith("## "))
27
+ break;
28
+ const trimmed = line.trim();
29
+ if (trimmed)
30
+ intentParts.push(trimmed);
31
+ }
32
+ if (intentParts.length > 0)
33
+ return intentParts.join(" ");
34
+ }
35
+ return title ?? `Spec ${specId}`;
36
+ }
37
+ export function parseAcceptanceFile(raw) {
38
+ const data = raw;
39
+ if (!Array.isArray(data.items))
40
+ return [];
41
+ return data.items.map((item) => {
42
+ const evidencePath = typeof item.evidencePath === "string" ? item.evidencePath : "";
43
+ return {
44
+ id: typeof item.id === "string" ? item.id : "UNKNOWN",
45
+ description: typeof item.description === "string" ? item.description : "",
46
+ evidencePath,
47
+ status: evidencePath.trim() ? "evidence_defined" : "pending",
48
+ };
49
+ });
50
+ }
51
+ /** Collect gateIds whose latest gate.report outcome is non-PASS for a spec. */
52
+ export function collectFailedGates(events, specId) {
53
+ const latestByGateId = new Map();
54
+ for (const event of events) {
55
+ if (event.specId !== specId || event.kind !== "gate.report")
56
+ continue;
57
+ const payload = payloadOf(event);
58
+ const result = String(payload.result ?? "UNKNOWN");
59
+ const gateId = typeof payload.gateId === "string" ? payload.gateId : "UNKNOWN-GATE";
60
+ const entry = {
61
+ gateId,
62
+ runId: event.runId,
63
+ result,
64
+ reportHash: typeof payload.reportHash === "string" ? payload.reportHash : undefined,
65
+ timestamp: event.timestamp,
66
+ };
67
+ const existing = latestByGateId.get(gateId);
68
+ if (!existing || event.timestamp >= existing.timestamp) {
69
+ latestByGateId.set(gateId, entry);
70
+ }
71
+ }
72
+ return [...latestByGateId.values()]
73
+ .filter((entry) => entry.result !== "PASS")
74
+ .sort((a, b) => a.timestamp.localeCompare(b.timestamp));
75
+ }
76
+ export function buildNextCommands(input) {
77
+ const w = `--workspace ${JSON.stringify(input.workspaceRoot)}`;
78
+ const commands = [
79
+ `jcr-adk audit ${input.specId} ${w}`,
80
+ `jcr-adk doctor ${w}`,
81
+ ];
82
+ if (input.lastRunId) {
83
+ commands.push(`jcr-adk replay ${input.lastRunId} --spec-id ${input.specId} ${w}`);
84
+ }
85
+ if (input.failedGates.length > 0) {
86
+ const latest = input.failedGates.at(-1);
87
+ commands.push(`jcr-adk explain-fail ${latest.gateId} --spec-id ${input.specId} ${w}`, `jcr-adk gate ${input.specId} --gate-id ${latest.gateId} --acceptance-file .jcr-adk/specs/${input.specId}/acceptance.json ${w}`);
88
+ }
89
+ else if (input.currentStatus !== "verified") {
90
+ commands.push(`jcr-adk run --spec-id ${input.specId} --dry-run ${w}`, `jcr-adk sync ${input.specId} --acceptance-file .jcr-adk/specs/${input.specId}/acceptance.json ${w}`);
91
+ }
92
+ return commands;
93
+ }
94
+ /** Build handoff package from spec artifacts and optional workspace events. */
95
+ export function buildHandoffPackage(specId, workspaceRoot, artifacts, events) {
96
+ const failedGates = collectFailedGates(events, specId);
97
+ const evidencePaths = artifacts.acceptance
98
+ .map((item) => item.evidencePath.trim())
99
+ .filter((path) => path.length > 0);
100
+ const relatedFiles = [...new Set([...artifacts.relatedFiles, ...evidencePaths])].sort();
101
+ return {
102
+ specId,
103
+ generatedAt: new Date().toISOString(),
104
+ specGoal: artifacts.specGoal,
105
+ currentStatus: artifacts.currentStatus,
106
+ failedGates,
107
+ acceptance: artifacts.acceptance,
108
+ relatedFiles,
109
+ nextCommands: buildNextCommands({
110
+ workspaceRoot,
111
+ specId,
112
+ currentStatus: artifacts.currentStatus,
113
+ failedGates,
114
+ lastRunId: artifacts.lastRunId,
115
+ }),
116
+ prohibitions: [...DEFAULT_PROHIBITIONS],
117
+ lastRunId: artifacts.lastRunId,
118
+ reportHash: artifacts.reportHash,
119
+ statusNote: artifacts.currentStatus === "verified" && failedGates.length > 0
120
+ ? "metadata.json is verified but JSONL records newer non-PASS gate — lifecycle status unchanged; inspect failedGates for audit drift"
121
+ : undefined,
122
+ evidenceLabel: "observed",
123
+ };
124
+ }
125
+ /** Render handoff package as markdown for human/agent handoff. */
126
+ export function renderHandoffMarkdown(pkg) {
127
+ const failedSection = pkg.failedGates.length === 0
128
+ ? "_No failed gate recorded in JSONL audit log._\n"
129
+ : pkg.failedGates
130
+ .map((gate) => `- **${gate.gateId}** (${gate.result}) runId=\`${gate.runId}\` at ${gate.timestamp}`)
131
+ .join("\n");
132
+ const acceptanceSection = pkg.acceptance
133
+ .map((item) => `- **${item.id}** [${item.status}]: ${item.description} — \`${item.evidencePath || "(no path)"}\``)
134
+ .join("\n");
135
+ const nextSection = pkg.nextCommands.map((cmd) => `- \`${cmd}\``).join("\n");
136
+ const prohibitSection = pkg.prohibitions.map((rule) => `- ${rule}`).join("\n");
137
+ const filesSection = pkg.relatedFiles.map((file) => `- \`${file}\``).join("\n");
138
+ return `# Handoff — ${pkg.specId}
139
+
140
+ > Generated: ${pkg.generatedAt}
141
+ > Status: **${pkg.currentStatus}**
142
+ > Evidence label: ${pkg.evidenceLabel}
143
+ ${pkg.statusNote ? `\n> **Note:** ${pkg.statusNote}\n` : ""}
144
+
145
+ ## SPEC Goal
146
+
147
+ ${pkg.specGoal}
148
+
149
+ ## Failed Gates
150
+
151
+ ${failedSection}
152
+
153
+ ## Acceptance
154
+
155
+ ${acceptanceSection || "_No acceptance items found._"}
156
+
157
+ ## Related Files
158
+
159
+ ${filesSection || "_No related files listed._"}
160
+
161
+ ## Next Recommended Commands
162
+
163
+ ${nextSection}
164
+
165
+ ## Prohibitions
166
+
167
+ ${prohibitSection}
168
+ `;
169
+ }
170
+ //# sourceMappingURL=handoff-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff-summary.js","sourceRoot":"","sources":["../src/handoff-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type { CommandType, CommandPermission, CommandCheckResult } from "./permissions.js";
2
+ export { COMMAND_PERMISSION_MATRIX, getCommandPermission, isReadReportCommand, checkReadReportMutationDeny, } from "./permissions.js";
3
+ export type { DoctorHandlerInput, DoctorHandlerResult, GateHandlerInput, GateHandlerResult } from "./handlers.js";
4
+ export { runDoctorHandler, runGateHandler } from "./handlers.js";
5
+ export type { ParsedArgv } from "./argv.js";
6
+ export { parseArgv, flagString, flagBoolean } from "./argv.js";
7
+ export type { CliSession, CreateCliSessionInput } from "./session.js";
8
+ export { createCliSession } from "./session.js";
9
+ export { runCli } from "./main.js";
10
+ export type { RunCliOptions } from "./main.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE/D,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { COMMAND_PERMISSION_MATRIX, getCommandPermission, isReadReportCommand, checkReadReportMutationDeny, } from "./permissions.js";
2
+ export { runDoctorHandler, runGateHandler } from "./handlers.js";
3
+ export { parseArgv, flagString, flagBoolean } from "./argv.js";
4
+ export { createCliSession } from "./session.js";
5
+ export { runCli } from "./main.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Lifecycle artifact helpers — init/plan/run/sync CLI.
3
+ *
4
+ * Reuses core path resolution (`resolveAdkConfig`, `resolveSpecDir`, `joinWithinRoot`)
5
+ * so workspace boundary rules stay consistent with the rest of the harness.
6
+ */
7
+ import { type AdkConfig } from "@jcr-adk/core";
8
+ export type WriteOutcome = "created" | "existing" | "written";
9
+ export interface SpecArtifactPaths {
10
+ readonly specDir: string;
11
+ readonly specMd: string;
12
+ readonly planMd: string;
13
+ readonly acceptanceJson: string;
14
+ readonly metadataJson: string;
15
+ readonly progressJsonl: string;
16
+ }
17
+ export interface SpecMetadata {
18
+ readonly specId: string;
19
+ readonly status: string;
20
+ readonly createdAt: string;
21
+ readonly updatedAt: string;
22
+ readonly lastGateRunId?: string;
23
+ readonly reportHash?: string;
24
+ }
25
+ /** True when the path exists and is accessible. */
26
+ export declare function pathExists(filePath: string): Promise<boolean>;
27
+ /** Load workspace config from disk when present; otherwise default v1 layout. */
28
+ export declare function loadWorkspaceConfig(workspaceRoot: string): Promise<AdkConfig>;
29
+ /** Resolve standard spec artifact paths under `.jcr-adk/specs/{specId}/`. */
30
+ export declare function resolveSpecArtifactPaths(config: AdkConfig, specId: string): SpecArtifactPaths;
31
+ /** Write JSON with optional overwrite (`force`). */
32
+ export declare function writeJsonArtifact(filePath: string, data: unknown, force: boolean): Promise<WriteOutcome>;
33
+ /** Write text with optional overwrite (`force`). */
34
+ export declare function writeTextArtifact(filePath: string, content: string, force: boolean): Promise<WriteOutcome>;
35
+ /** Create directory when missing; returns whether it was newly created. */
36
+ export declare function ensureDir(dirPath: string): Promise<boolean>;
37
+ /** Read and parse spec metadata.json. */
38
+ export declare function readSpecMetadata(metadataPath: string): Promise<SpecMetadata>;
39
+ /** Append one JSONL progress line (command-controlled write — MVP v1). */
40
+ export declare function appendProgressLine(filePath: string, entry: Record<string, unknown>): Promise<void>;
41
+ /** Build default v1 config file for `jcr-adk init`. */
42
+ export declare function buildInitConfigFile(projectId?: string): import("@jcr-adk/core").AdkConfigFileV1;
43
+ /** Standard init scaffold paths derived from workspace root. */
44
+ export declare function resolveInitPaths(workspaceRoot: string): {
45
+ configFile: string;
46
+ specsDir: string;
47
+ logsDir: string;
48
+ gateReportsDir: string;
49
+ };
50
+ /** Template builders for `jcr-adk plan`. */
51
+ export declare function buildPlanSpecMarkdown(specId: string, title: string, intent?: string): string;
52
+ export declare function buildPlanMarkdown(specId: string): string;
53
+ export declare function buildPlanAcceptanceJson(specId: string): {
54
+ specId: string;
55
+ items: {
56
+ id: string;
57
+ description: string;
58
+ evidencePath: string;
59
+ }[];
60
+ };
61
+ export declare function buildPlannedMetadata(specId: string, now?: Date): SpecMetadata;
62
+ //# sourceMappingURL=lifecycle-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-artifacts.d.ts","sourceRoot":"","sources":["../src/lifecycle-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,mDAAmD;AACnD,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED,iFAAiF;AACjF,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAYnF;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAc7F;AAED,oDAAoD;AACpD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,oDAAoD;AACpD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,2EAA2E;AAC3E,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjE;AAED,yCAAyC;AACzC,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAElF;AAED,0EAA0E;AAC1E,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxG;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,2CAErD;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM;;;;;EAQrD;AAED,4CAA4C;AAC5C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAaxD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM;;;;;;;EAqBrD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,YAAY,CAQnF"}