@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,133 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { flagString } from "../argv.js";
4
+ import { runGateCommand } from "./gate.js";
5
+ import { clearCurrentRunSession, resolveCliRunId } from "../session-run.js";
6
+ import { appendProgressLine, loadWorkspaceConfig, readSpecMetadata, resolveSpecArtifactPaths, writeJsonArtifact, } from "../lifecycle-artifacts.js";
7
+ async function loadAcceptanceFlags(parsed) {
8
+ const inline = flagString(parsed.flags, "acceptance", "a");
9
+ const filePath = flagString(parsed.flags, "acceptance-file");
10
+ let raw;
11
+ if (filePath) {
12
+ raw = JSON.parse(await readFile(filePath, "utf8"));
13
+ }
14
+ else if (inline) {
15
+ raw = JSON.parse(inline);
16
+ }
17
+ else {
18
+ throw new Error("acceptance criteria required: pass --acceptance <json> or --acceptance-file <path> (G-03 fail-closed)");
19
+ }
20
+ if (!Array.isArray(raw) || raw.length === 0) {
21
+ throw new Error("acceptance must be a non-empty JSON array of AcceptanceItem objects");
22
+ }
23
+ return raw;
24
+ }
25
+ /** `jcr-adk sync` — gate PASS 후 metadata/progress/sync-summary 갱신. */
26
+ export async function runSyncCommand(parsed) {
27
+ const workspaceRoot = flagString(parsed.flags, "workspace", "w") ?? process.cwd();
28
+ const specId = flagString(parsed.flags, "spec-id", "s") ?? parsed.positional[0];
29
+ if (!specId) {
30
+ return {
31
+ exitCode: 2,
32
+ output: "usage: jcr-adk sync <specId> [--run-id <id>] [--acceptance-file <path>]",
33
+ };
34
+ }
35
+ const runIdResult = await resolveCliRunId(workspaceRoot, specId, {
36
+ explicitRunId: flagString(parsed.flags, "run-id"),
37
+ mode: "reuse-or-fail",
38
+ });
39
+ if (!runIdResult.ok) {
40
+ return { exitCode: 2, output: runIdResult.message };
41
+ }
42
+ const runId = runIdResult.runId;
43
+ let acceptance;
44
+ try {
45
+ acceptance = await loadAcceptanceFlags(parsed);
46
+ }
47
+ catch (err) {
48
+ return { exitCode: 2, output: String(err) };
49
+ }
50
+ const gateResult = await runGateCommand({
51
+ command: "gate",
52
+ positional: [specId],
53
+ flags: {
54
+ workspace: workspaceRoot,
55
+ "run-id": runId,
56
+ acceptance: JSON.stringify(acceptance),
57
+ },
58
+ });
59
+ if (gateResult.exitCode !== 0) {
60
+ return { exitCode: gateResult.exitCode, output: gateResult.output };
61
+ }
62
+ const gateBody = JSON.parse(gateResult.output);
63
+ if (!gateBody.ok || gateBody.gateResult !== "PASS") {
64
+ return {
65
+ exitCode: 1,
66
+ output: JSON.stringify({ ok: false, reason: "gate did not PASS; metadata will not be marked verified (G-02)" }, null, 2),
67
+ };
68
+ }
69
+ try {
70
+ const config = await loadWorkspaceConfig(workspaceRoot);
71
+ const paths = resolveSpecArtifactPaths(config, specId);
72
+ const metadata = await readSpecMetadata(paths.metadataJson);
73
+ const progressMessage = flagString(parsed.flags, "progress-message") ??
74
+ `Sync completed for run ${runId}`;
75
+ // Consume the completed run session once the verifier has produced PASS.
76
+ // If any later artifact write fails, sync returns non-zero and the user must
77
+ // run again instead of reusing a possibly stale completed session.
78
+ await clearCurrentRunSession(workspaceRoot);
79
+ const updatedMetadata = {
80
+ ...metadata,
81
+ specId,
82
+ status: "verified",
83
+ lastGateRunId: runId,
84
+ reportHash: gateBody.reportHash,
85
+ updatedAt: new Date().toISOString(),
86
+ };
87
+ const eventsPath = config.adkEventsPath;
88
+ const eventsRaw = await readFile(eventsPath, "utf8").catch(() => "");
89
+ const lines = eventsRaw.split("\n").filter((l) => l.trim());
90
+ const eventKinds = lines.map((l) => JSON.parse(l).type);
91
+ const summary = {
92
+ workflow: "plan-run-sync",
93
+ specId,
94
+ runId,
95
+ gateResult: gateBody.gateResult,
96
+ reportHash: gateBody.reportHash,
97
+ eventCount: lines.length,
98
+ eventKinds,
99
+ metadataStatus: updatedMetadata.status,
100
+ completedAt: new Date().toISOString(),
101
+ };
102
+ await appendProgressLine(paths.progressJsonl, {
103
+ timestamp: new Date().toISOString(),
104
+ runId,
105
+ message: progressMessage,
106
+ });
107
+ // Persist verified metadata before the summary. A non-zero sync must never
108
+ // leave a verified metadata state if progress write fails mid-command.
109
+ await writeJsonArtifact(paths.metadataJson, updatedMetadata, true);
110
+ // sync-summary is written LAST so it only ever describes a fully verified,
111
+ // durably persisted state (no summary claiming "verified" while metadata or
112
+ // progress writes failed).
113
+ const summaryPath = join(workspaceRoot, "sync-summary.json");
114
+ await writeJsonArtifact(summaryPath, summary, true);
115
+ return {
116
+ exitCode: 0,
117
+ output: JSON.stringify({
118
+ ok: true,
119
+ specId,
120
+ runId,
121
+ gateResult: gateBody.gateResult,
122
+ reportHash: gateBody.reportHash,
123
+ metadataStatus: updatedMetadata.status,
124
+ syncSummaryPath: summaryPath,
125
+ summary,
126
+ }, null, 2),
127
+ };
128
+ }
129
+ catch (err) {
130
+ return { exitCode: 1, output: String(err) };
131
+ }
132
+ }
133
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ParsedArgv } from "../argv.js";
2
+ export interface ToolCommandResult {
3
+ readonly exitCode: number;
4
+ readonly output: string;
5
+ }
6
+ /**
7
+ * `jcr-adk tool <toolName>` — guarded tool execution via GuardedToolExecutor.
8
+ *
9
+ * All lifecycle writes pass through resolve → policy → audit → execute (M5).
10
+ */
11
+ export declare function runToolCommand(parsed: ParsedArgv): Promise<ToolCommandResult>;
12
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/commands/tool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA6DD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyGnF"}
@@ -0,0 +1,154 @@
1
+ import { isMutatingTool, resolveToolName } from "@jcr-adk/core";
2
+ import { readFile } from "node:fs/promises";
3
+ import { createCliSession } from "../session.js";
4
+ import { resolveCliRunId } from "../session-run.js";
5
+ import { flagString, flagBoolean } from "../argv.js";
6
+ function parseArgsJson(raw, flags) {
7
+ if (raw) {
8
+ const parsed = JSON.parse(raw);
9
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
10
+ throw new Error("--args must be a JSON object");
11
+ }
12
+ return parsed;
13
+ }
14
+ const args = {};
15
+ const message = flagString(flags, "message", "m");
16
+ if (message !== undefined)
17
+ args.message = message;
18
+ const nestedSpecId = flagString(flags, "arg-spec-id");
19
+ if (nestedSpecId !== undefined)
20
+ args.specId = nestedSpecId;
21
+ return args;
22
+ }
23
+ async function loadAcceptance(parsed) {
24
+ const inline = flagString(parsed.flags, "acceptance", "a");
25
+ const filePath = flagString(parsed.flags, "acceptance-file");
26
+ let raw;
27
+ if (filePath) {
28
+ raw = JSON.parse(await readFile(filePath, "utf8"));
29
+ }
30
+ else if (inline) {
31
+ raw = JSON.parse(inline);
32
+ }
33
+ else {
34
+ throw new Error("adk_gate_run requires --acceptance <json> or --acceptance-file <path>");
35
+ }
36
+ if (!Array.isArray(raw) || raw.length === 0) {
37
+ throw new Error("acceptance must be a non-empty JSON array");
38
+ }
39
+ return raw;
40
+ }
41
+ /**
42
+ * Strip fields that must come from trusted sources, not spoofable `--args`.
43
+ * correlation: specId/runId · gate outcome: result · gate inputs: acceptance/gateId.
44
+ * shellCommand is policy-relevant and resolved separately (flag or args) so the
45
+ * AC-008 shell check always runs — it must never ride raw `--args`.
46
+ * approved is a trusted gate signal (--approve flag only), not spoofable via --args.
47
+ */
48
+ function stripTrustedFields(args) {
49
+ const { specId: _s, runId: _r, result: _res, acceptance: _a, gateId: _g, shellCommand: _sc, approved: _ap, ...rest } = args;
50
+ return rest;
51
+ }
52
+ /**
53
+ * `jcr-adk tool <toolName>` — guarded tool execution via GuardedToolExecutor.
54
+ *
55
+ * All lifecycle writes pass through resolve → policy → audit → execute (M5).
56
+ */
57
+ export async function runToolCommand(parsed) {
58
+ const toolName = parsed.positional[0];
59
+ if (!toolName) {
60
+ return {
61
+ exitCode: 2,
62
+ output: "usage: jcr-adk tool <toolName> --spec-id <id> [--target-path <path>] [--shell-command <cmd>] [--approve] [--args <json>]",
63
+ };
64
+ }
65
+ const resolved = resolveToolName(toolName);
66
+ if (!resolved.ok) {
67
+ return { exitCode: 2, output: resolved.message };
68
+ }
69
+ const canonical = resolved.canonical;
70
+ const workspaceRoot = flagString(parsed.flags, "workspace", "w") ?? process.cwd();
71
+ const specId = flagString(parsed.flags, "spec-id", "s");
72
+ if (!specId) {
73
+ return { exitCode: 2, output: "missing required flag: --spec-id" };
74
+ }
75
+ const runId = flagString(parsed.flags, "run-id");
76
+ const targetPath = flagString(parsed.flags, "target-path", "t");
77
+ const shellCommandFlag = flagString(parsed.flags, "shell-command", "shell");
78
+ const approved = flagBoolean(parsed.flags, "approve");
79
+ const modeFlag = flagString(parsed.flags, "mode");
80
+ const argsRaw = flagString(parsed.flags, "args");
81
+ if (isMutatingTool(canonical) && targetPath === undefined) {
82
+ return {
83
+ exitCode: 2,
84
+ output: `mutating tool '${canonical}' requires --target-path (mutation boundary fail-closed)`,
85
+ };
86
+ }
87
+ let args;
88
+ try {
89
+ args = parseArgsJson(argsRaw, parsed.flags);
90
+ }
91
+ catch (err) {
92
+ return { exitCode: 2, output: `args parse error: ${String(err)}` };
93
+ }
94
+ const runIdResult = await resolveCliRunId(workspaceRoot, specId, {
95
+ explicitRunId: runId,
96
+ mode: "reuse-or-generate",
97
+ });
98
+ if (!runIdResult.ok) {
99
+ return { exitCode: 2, output: runIdResult.message };
100
+ }
101
+ const session = await createCliSession({
102
+ workspaceRoot,
103
+ specId,
104
+ runId: runIdResult.runId,
105
+ });
106
+ // SDK parity: a shellCommand declared via --args is policy-relevant. Resolve it
107
+ // (flag wins) so AC-008 always evaluates it, then strip it from raw args below.
108
+ const argsShellCommand = typeof args.shellCommand === "string" ? args.shellCommand : undefined;
109
+ const shellCommand = shellCommandFlag ?? argsShellCommand;
110
+ const safeUserArgs = stripTrustedFields(args);
111
+ if (canonical === "adk_spec_read" && safeUserArgs.specId === undefined) {
112
+ args = { ...safeUserArgs, specId };
113
+ }
114
+ else if (canonical === "adk_gate_run") {
115
+ // acceptance/gateId come from dedicated flags only; --args cannot spoof them.
116
+ let acceptance;
117
+ try {
118
+ acceptance = await loadAcceptance(parsed);
119
+ }
120
+ catch (err) {
121
+ return { exitCode: 2, output: String(err) };
122
+ }
123
+ args = {
124
+ ...safeUserArgs,
125
+ specId: session.correlation.specId,
126
+ runId: session.correlation.runId,
127
+ gateId: flagString(parsed.flags, "gate-id") ?? `GATE-${session.correlation.specId}`,
128
+ acceptance,
129
+ };
130
+ }
131
+ else {
132
+ args = safeUserArgs;
133
+ }
134
+ const result = await session.executor.execute({
135
+ toolName: canonical,
136
+ args,
137
+ correlation: session.correlation,
138
+ ...(targetPath !== undefined ? { targetPath } : {}),
139
+ ...(shellCommand !== undefined ? { shellCommand } : {}),
140
+ ...(approved ? { approved: true } : {}),
141
+ ...(modeFlag === "direct_write" ? { mode: "direct_write" } : {}),
142
+ });
143
+ if (!result.ok) {
144
+ return {
145
+ exitCode: 1,
146
+ output: JSON.stringify(result, null, 2),
147
+ };
148
+ }
149
+ return {
150
+ exitCode: 0,
151
+ output: JSON.stringify(result, null, 2),
152
+ };
153
+ }
154
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/commands/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Read-only workspace event access for audit/replay commands (F-02 / F-12).
3
+ */
4
+ import type { PersistedAdkEvent } from "@jcr-adk/state";
5
+ export type ReadWorkspaceEventsResult = {
6
+ readonly ok: true;
7
+ readonly eventsPath: string;
8
+ readonly events: readonly PersistedAdkEvent[];
9
+ } | {
10
+ readonly ok: false;
11
+ readonly eventsPath: string;
12
+ readonly events: readonly PersistedAdkEvent[];
13
+ readonly error: string;
14
+ };
15
+ /**
16
+ * Load all persisted ADK events from the workspace JSONL log.
17
+ *
18
+ * A missing log file is a valid empty state (`ok: true`, no events).
19
+ * A corrupt/unreadable log is fail-closed (`ok: false` with an error) so audit
20
+ * and replay surface tampering instead of silently reporting zero events.
21
+ */
22
+ export declare function readWorkspaceEvents(workspaceRoot: string): Promise<ReadWorkspaceEventsResult>;
23
+ /** Filter events by optional specId and/or runId. */
24
+ export declare function filterEvents(events: readonly PersistedAdkEvent[], filters: {
25
+ readonly specId?: string;
26
+ readonly runId?: string;
27
+ }): PersistedAdkEvent[];
28
+ //# sourceMappingURL=event-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-reader.d.ts","sourceRoot":"","sources":["../src/event-reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,MAAM,yBAAyB,GACjC;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC/C,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEN;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,yBAAyB,CAAC,CAcpC;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,iBAAiB,EAAE,CAMrB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Read-only workspace event access for audit/replay commands (F-02 / F-12).
3
+ */
4
+ import { JsonlEventStore } from "@jcr-adk/state";
5
+ import { loadWorkspaceConfig } from "./lifecycle-artifacts.js";
6
+ /**
7
+ * Load all persisted ADK events from the workspace JSONL log.
8
+ *
9
+ * A missing log file is a valid empty state (`ok: true`, no events).
10
+ * A corrupt/unreadable log is fail-closed (`ok: false` with an error) so audit
11
+ * and replay surface tampering instead of silently reporting zero events.
12
+ */
13
+ export async function readWorkspaceEvents(workspaceRoot) {
14
+ const config = await loadWorkspaceConfig(workspaceRoot);
15
+ const store = new JsonlEventStore({ filePath: config.adkEventsPath });
16
+ try {
17
+ const events = await store.readAll();
18
+ return { ok: true, eventsPath: config.adkEventsPath, events };
19
+ }
20
+ catch (err) {
21
+ return {
22
+ ok: false,
23
+ eventsPath: config.adkEventsPath,
24
+ events: [],
25
+ error: err instanceof Error ? err.message : String(err),
26
+ };
27
+ }
28
+ }
29
+ /** Filter events by optional specId and/or runId. */
30
+ export function filterEvents(events, filters) {
31
+ return events.filter((event) => {
32
+ if (filters.specId && event.specId !== filters.specId)
33
+ return false;
34
+ if (filters.runId && event.runId !== filters.runId)
35
+ return false;
36
+ return true;
37
+ });
38
+ }
39
+ //# sourceMappingURL=event-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-reader.js","sourceRoot":"","sources":["../src/event-reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAe/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,aAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,MAAM,CAAC,aAAa;YAChC,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAC1B,MAAoC,EACpC,OAA8D;IAE9D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACpE,IAAI,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Explain-fail summary — DAC-008 / Recovery plane read-only diagnostics.
3
+ *
4
+ * Reuses replay event shapes; does not mutate workspace state (CMD-02R).
5
+ * SEC-18: `evidenceLabel` distinguishes JSONL-observed facts from heuristic guidance.
6
+ */
7
+ import type { PersistedAdkEvent } from "@jcr-adk/state";
8
+ export type ExplainFailTargetKind = "gate" | "run";
9
+ export type ExplainFailFailureKind = "gate" | "policy" | "tool" | "run" | "none";
10
+ export interface ExplainFailSummary {
11
+ readonly target: {
12
+ readonly kind: ExplainFailTargetKind;
13
+ readonly id: string;
14
+ };
15
+ readonly specId?: string;
16
+ readonly runId?: string;
17
+ readonly failureKind: ExplainFailFailureKind;
18
+ readonly primaryCause: string;
19
+ readonly impact: {
20
+ readonly acceptanceItems?: readonly string[];
21
+ readonly affectedTools?: readonly string[];
22
+ readonly policyDenialCount?: number;
23
+ readonly relatedFiles?: readonly string[];
24
+ };
25
+ readonly possibleCauses: readonly string[];
26
+ readonly nextActions: readonly string[];
27
+ readonly rerunCommands: readonly string[];
28
+ /** `observed` = derived from JSONL events; `inferred` = heuristic guidance only */
29
+ readonly evidenceLabel: "observed" | "inferred";
30
+ }
31
+ export type ExplainTargetResolution = {
32
+ readonly kind: "gate";
33
+ readonly gateId: string;
34
+ readonly events: readonly PersistedAdkEvent[];
35
+ } | {
36
+ readonly kind: "run";
37
+ readonly runId: string;
38
+ readonly events: readonly PersistedAdkEvent[];
39
+ } | {
40
+ readonly kind: "not_found";
41
+ };
42
+ /** Resolve positional target as gateId (gate.report match) or runId (event correlation). */
43
+ export declare function resolveExplainTarget(events: readonly PersistedAdkEvent[], targetId: string, specId?: string): ExplainTargetResolution;
44
+ /** Build structured explain-fail output from workspace events (read-only). */
45
+ export declare function buildExplainFailSummary(events: readonly PersistedAdkEvent[], targetId: string, workspaceRoot: string, specId?: string): ExplainFailSummary | null;
46
+ //# sourceMappingURL=explain-fail-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain-fail-summary.d.ts","sourceRoot":"","sources":["../src/explain-fail-summary.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,KAAK,CAAC;AACnD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC3C,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,mFAAmF;IACnF,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,CAAC;CACjD;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,GACjG;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,GAC/F;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAWnC,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,uBAAuB,CAkBzB;AAsaD,8EAA8E;AAC9E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB,GAAG,IAAI,CAY3B"}