@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,160 @@
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 { access, appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
8
+ import { dirname } from "node:path";
9
+ import { defaultAdkConfigFile, parseAdkConfigFile, resolveAdkConfig, resolveAdkPaths, resolveSpecDir, } from "@jcr-adk/core";
10
+ /** True when the path exists and is accessible. */
11
+ export async function pathExists(filePath) {
12
+ try {
13
+ await access(filePath);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ /** Load workspace config from disk when present; otherwise default v1 layout. */
21
+ export async function loadWorkspaceConfig(workspaceRoot) {
22
+ const paths = resolveAdkPaths(workspaceRoot);
23
+ if (!(await pathExists(paths.configFilePath))) {
24
+ return resolveAdkConfig(workspaceRoot);
25
+ }
26
+ const raw = JSON.parse(await readFile(paths.configFilePath, "utf8"));
27
+ const parsed = parseAdkConfigFile(raw);
28
+ if (!parsed.ok) {
29
+ throw new Error(`invalid adk.json: ${parsed.message}`);
30
+ }
31
+ return resolveAdkConfig(workspaceRoot, parsed.config);
32
+ }
33
+ /** Resolve standard spec artifact paths under `.jcr-adk/specs/{specId}/`. */
34
+ export function resolveSpecArtifactPaths(config, specId) {
35
+ const specDirResult = resolveSpecDir(config, specId);
36
+ if (!specDirResult.ok) {
37
+ throw new Error(specDirResult.message);
38
+ }
39
+ const specDir = specDirResult.absolutePath;
40
+ return {
41
+ specDir,
42
+ specMd: `${specDir}/spec.md`,
43
+ planMd: `${specDir}/plan.md`,
44
+ acceptanceJson: `${specDir}/acceptance.json`,
45
+ metadataJson: `${specDir}/metadata.json`,
46
+ progressJsonl: `${specDir}/progress.jsonl`,
47
+ };
48
+ }
49
+ /** Write JSON with optional overwrite (`force`). */
50
+ export async function writeJsonArtifact(filePath, data, force) {
51
+ const exists = await pathExists(filePath);
52
+ if (exists && !force)
53
+ return "existing";
54
+ await mkdir(dirname(filePath), { recursive: true });
55
+ await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
56
+ return exists ? "written" : "created";
57
+ }
58
+ /** Write text with optional overwrite (`force`). */
59
+ export async function writeTextArtifact(filePath, content, force) {
60
+ const exists = await pathExists(filePath);
61
+ if (exists && !force)
62
+ return "existing";
63
+ await mkdir(dirname(filePath), { recursive: true });
64
+ await writeFile(filePath, content.endsWith("\n") ? content : `${content}\n`, "utf8");
65
+ return exists ? "written" : "created";
66
+ }
67
+ /** Create directory when missing; returns whether it was newly created. */
68
+ export async function ensureDir(dirPath) {
69
+ const exists = await pathExists(dirPath);
70
+ await mkdir(dirPath, { recursive: true });
71
+ return !exists;
72
+ }
73
+ /** Read and parse spec metadata.json. */
74
+ export async function readSpecMetadata(metadataPath) {
75
+ return JSON.parse(await readFile(metadataPath, "utf8"));
76
+ }
77
+ /** Append one JSONL progress line (command-controlled write — MVP v1). */
78
+ export async function appendProgressLine(filePath, entry) {
79
+ await mkdir(dirname(filePath), { recursive: true });
80
+ await appendFile(filePath, `${JSON.stringify(entry)}\n`, "utf8");
81
+ }
82
+ /** Build default v1 config file for `jcr-adk init`. */
83
+ export function buildInitConfigFile(projectId) {
84
+ return defaultAdkConfigFile(projectId);
85
+ }
86
+ /** Standard init scaffold paths derived from workspace root. */
87
+ export function resolveInitPaths(workspaceRoot) {
88
+ const paths = resolveAdkPaths(workspaceRoot);
89
+ return {
90
+ configFile: paths.configFilePath,
91
+ specsDir: paths.specsDir,
92
+ logsDir: paths.logsDir,
93
+ gateReportsDir: paths.gateReportsDir,
94
+ };
95
+ }
96
+ /** Template builders for `jcr-adk plan`. */
97
+ export function buildPlanSpecMarkdown(specId, title, intent) {
98
+ const intentBlock = intent?.trim()
99
+ ? `\n## Intent\n\n${intent.trim()}\n`
100
+ : "\n## Intent\n\nGenerated by `jcr-adk plan` (template MVP).\n";
101
+ return `# ${title}
102
+
103
+ > Spec ID: ${specId}
104
+
105
+ ${intentBlock}
106
+ ## Acceptance Criteria
107
+
108
+ | ID | Description |
109
+ |----|-------------|
110
+ | AC-01 | Doctor diagnostics pass in workspace |
111
+ | AC-02 | Guarded tool pipeline records audit events |
112
+ | AC-03 | Gate PASS seals reportHash and updates metadata |
113
+ `;
114
+ }
115
+ export function buildPlanMarkdown(specId) {
116
+ return `# Plan — ${specId}
117
+
118
+ ## Steps
119
+
120
+ 1. **Plan**: Scaffold SPEC/PLAN/AC under .jcr-adk/specs/
121
+ 2. **Run**: Execute agent via jcr-adk run (dry-run or live guarded SDK)
122
+ 3. **Sync**: Run gate with evidence-backed acceptance; update metadata
123
+
124
+ ## Notes
125
+
126
+ - Template-based MVP plan (no LLM generation in v1).
127
+ `;
128
+ }
129
+ export function buildPlanAcceptanceJson(specId) {
130
+ return {
131
+ specId,
132
+ items: [
133
+ {
134
+ id: "AC-01",
135
+ description: "Doctor diagnostics pass",
136
+ evidencePath: "evidence/ac-01-pass.json",
137
+ },
138
+ {
139
+ id: "AC-02",
140
+ description: "Audit events recorded for tool pipeline",
141
+ evidencePath: "evidence/ac-01-pass.json",
142
+ },
143
+ {
144
+ id: "AC-03",
145
+ description: "Gate PASS with reportHash",
146
+ evidencePath: "evidence/ac-01-pass.json",
147
+ },
148
+ ],
149
+ };
150
+ }
151
+ export function buildPlannedMetadata(specId, now = new Date()) {
152
+ const ts = now.toISOString();
153
+ return {
154
+ specId,
155
+ status: "planned",
156
+ createdAt: ts,
157
+ updatedAt: ts,
158
+ };
159
+ }
160
+ //# sourceMappingURL=lifecycle-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle-artifacts.js","sourceRoot":"","sources":["../src/lifecycle-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,cAAc,GAEf,MAAM,eAAe,CAAC;AAsBvB,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,aAAqB;IAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAY,CAAC;IAChF,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAc;IACxE,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC;IAC3C,OAAO;QACL,OAAO;QACP,MAAM,EAAE,GAAG,OAAO,UAAU;QAC5B,MAAM,EAAE,GAAG,OAAO,UAAU;QAC5B,cAAc,EAAE,GAAG,OAAO,kBAAkB;QAC5C,YAAY,EAAE,GAAG,OAAO,gBAAgB;QACxC,aAAa,EAAE,GAAG,OAAO,iBAAiB;KAC3C,CAAC;AACJ,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,IAAa,EACb,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IACxC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAAe,EACf,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,MAAM,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IACxC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC;AACjB,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,YAAoB;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAiB,CAAC;AAC1E,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAA8B;IACvF,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAC,aAAqB;IACpD,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAC7C,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,cAAc;QAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,KAAa,EAAE,MAAe;IAClF,MAAM,WAAW,GAAG,MAAM,EAAE,IAAI,EAAE;QAChC,CAAC,CAAC,kBAAkB,MAAM,CAAC,IAAI,EAAE,IAAI;QACrC,CAAC,CAAC,8DAA8D,CAAC;IAEnE,OAAO,KAAK,KAAK;;aAEN,MAAM;;EAEjB,WAAW;;;;;;;;CAQZ,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,YAAY,MAAM;;;;;;;;;;;CAW1B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,OAAO;QACL,MAAM;QACN,KAAK,EAAE;YACL;gBACE,EAAE,EAAE,OAAO;gBACX,WAAW,EAAE,yBAAyB;gBACtC,YAAY,EAAE,0BAA0B;aACzC;YACD;gBACE,EAAE,EAAE,OAAO;gBACX,WAAW,EAAE,yCAAyC;gBACtD,YAAY,EAAE,0BAA0B;aACzC;YACD;gBACE,EAAE,EAAE,OAAO;gBACX,WAAW,EAAE,2BAA2B;gBACxC,YAAY,EAAE,0BAA0B;aACzC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACnE,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC7B,OAAO;QACL,MAAM;QACN,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * CLI entrypoint — `jcr-adk` command dispatcher.
3
+ *
4
+ * Core-stage commands:
5
+ * doctor read-only diagnostics (CMD-02R)
6
+ * gate verifier-controlled mutation (G-02)
7
+ * tool guarded tool execution via GuardedToolExecutor (M5)
8
+ *
9
+ * MVP Full lifecycle commands:
10
+ * init scaffold `.jcr-adk` layout
11
+ * plan template SPEC/PLAN/AC/metadata
12
+ * run guarded SDK runner (dry-run default, live opt-in)
13
+ * sync gate PASS → metadata/progress/sync-summary
14
+ * audit read-only event/gate/policy summary (CMD-03R)
15
+ * replay read-only JSONL run replay (SR-09)
16
+ * explain-fail read-only failure explanation (DAC-008)
17
+ * handoff read-only handoff package (DAC-006)
18
+ * review-pack read-only reviewer evidence bundle (DAC-007)
19
+ */
20
+ export interface RunCliOptions {
21
+ readonly stdout?: (line: string) => void;
22
+ readonly stderr?: (line: string) => void;
23
+ readonly env?: Record<string, string | undefined>;
24
+ }
25
+ /**
26
+ * Run the CLI and return a process exit code.
27
+ * Does not call process.exit — safe for tests.
28
+ */
29
+ export declare function runCli(argv: readonly string[], options?: RunCliOptions): Promise<number>;
30
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAoDH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACnD;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoFlG"}
package/dist/main.js ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * CLI entrypoint — `jcr-adk` command dispatcher.
3
+ *
4
+ * Core-stage commands:
5
+ * doctor read-only diagnostics (CMD-02R)
6
+ * gate verifier-controlled mutation (G-02)
7
+ * tool guarded tool execution via GuardedToolExecutor (M5)
8
+ *
9
+ * MVP Full lifecycle commands:
10
+ * init scaffold `.jcr-adk` layout
11
+ * plan template SPEC/PLAN/AC/metadata
12
+ * run guarded SDK runner (dry-run default, live opt-in)
13
+ * sync gate PASS → metadata/progress/sync-summary
14
+ * audit read-only event/gate/policy summary (CMD-03R)
15
+ * replay read-only JSONL run replay (SR-09)
16
+ * explain-fail read-only failure explanation (DAC-008)
17
+ * handoff read-only handoff package (DAC-006)
18
+ * review-pack read-only reviewer evidence bundle (DAC-007)
19
+ */
20
+ import { parseArgv } from "./argv.js";
21
+ import { runAuditCommand } from "./commands/audit.js";
22
+ import { runDoctorCommand } from "./commands/doctor.js";
23
+ import { runGateCommand } from "./commands/gate.js";
24
+ import { runInitCommand } from "./commands/init.js";
25
+ import { runPlanCommand } from "./commands/plan.js";
26
+ import { runRunCommand } from "./commands/run.js";
27
+ import { runReplayCommand } from "./commands/replay.js";
28
+ import { runExplainFailCommand } from "./commands/explain-fail.js";
29
+ import { runHandoffCommand } from "./commands/handoff.js";
30
+ import { runReviewPackCommand } from "./commands/review-pack.js";
31
+ import { runSyncCommand } from "./commands/sync.js";
32
+ import { runToolCommand } from "./commands/tool.js";
33
+ import { fileURLToPath } from "node:url";
34
+ const HELP = `jcr-adk — Cursor ADK Core CLI
35
+
36
+ Usage:
37
+ jcr-adk init [--workspace <path>] [--project-id <id>] [--force]
38
+ jcr-adk plan [--workspace <path>] [--spec-id <id>] [--title <text>] [--intent <text>] [--force]
39
+ jcr-adk run --spec-id <id> [--workspace <path>] [--run-id <id>] [--dry-run] [--live] [--prompt <text>]
40
+ jcr-adk sync <specId> [--run-id <id>] [--acceptance-file <path>]
41
+ jcr-adk audit [specId] [--run-id <id>] [--workspace <path>]
42
+ jcr-adk replay <runId> [--spec-id <id>] [--workspace <path>]
43
+ jcr-adk explain-fail <gateId|runId> [--spec-id <id>] [--workspace <path>]
44
+ jcr-adk handoff <specId> [--workspace <path>] [--write] [--markdown]
45
+ jcr-adk review-pack <specId> [--workspace <path>] [--write] [--markdown]
46
+ jcr-adk doctor [--workspace <path>]
47
+ jcr-adk gate <specId> [--gate-id <id>] [--run-id <id>] [--acceptance <json>]
48
+ jcr-adk tool <toolName> --spec-id <id> [--target-path <path>] [--shell-command <cmd>] [--args <json>]
49
+
50
+ Global flags:
51
+ --workspace, -w Workspace root (default: cwd)
52
+ --help, -h Show this help
53
+
54
+ Examples:
55
+ jcr-adk init
56
+ jcr-adk plan --spec-id SPEC-001 --title "Hello ADK"
57
+ jcr-adk run --spec-id SPEC-001 --dry-run
58
+ jcr-adk sync SPEC-001 --acceptance-file acceptance/gate-items.json
59
+ jcr-adk audit SPEC-001
60
+ jcr-adk replay RUN-001 --spec-id SPEC-001
61
+ jcr-adk explain-fail GATE-SPEC-001 --spec-id SPEC-001
62
+ jcr-adk handoff SPEC-001
63
+ jcr-adk review-pack SPEC-001 --write
64
+ jcr-adk doctor
65
+ jcr-adk gate SPEC-001 --acceptance '[{"id":"A1","description":"ok","evidencePath":"fixtures/a1.json","passed":true}]'
66
+ jcr-adk tool adk_spec_read --spec-id SPEC-001
67
+ `;
68
+ /**
69
+ * Run the CLI and return a process exit code.
70
+ * Does not call process.exit — safe for tests.
71
+ */
72
+ export async function runCli(argv, options = {}) {
73
+ const writeOut = options.stdout ?? ((line) => console.log(line));
74
+ const writeErr = options.stderr ?? ((line) => console.error(line));
75
+ const env = options.env ?? process.env;
76
+ const parsed = parseArgv(argv);
77
+ if (parsed.flags.help === true || parsed.flags.h === true || parsed.command === "help") {
78
+ writeOut(HELP.trimEnd());
79
+ return 0;
80
+ }
81
+ if (!parsed.command) {
82
+ writeErr("error: missing command\n");
83
+ writeErr(HELP.trimEnd());
84
+ return 2;
85
+ }
86
+ switch (parsed.command) {
87
+ case "init": {
88
+ const result = await runInitCommand(parsed);
89
+ writeOut(result.output);
90
+ return result.exitCode;
91
+ }
92
+ case "plan": {
93
+ const result = await runPlanCommand(parsed);
94
+ writeOut(result.output);
95
+ return result.exitCode;
96
+ }
97
+ case "run": {
98
+ const result = await runRunCommand(parsed, env);
99
+ writeOut(result.output);
100
+ return result.exitCode;
101
+ }
102
+ case "sync": {
103
+ const result = await runSyncCommand(parsed);
104
+ writeOut(result.output);
105
+ return result.exitCode;
106
+ }
107
+ case "audit": {
108
+ const result = await runAuditCommand(parsed);
109
+ writeOut(result.output);
110
+ return result.exitCode;
111
+ }
112
+ case "replay": {
113
+ const result = await runReplayCommand(parsed);
114
+ writeOut(result.output);
115
+ return result.exitCode;
116
+ }
117
+ case "explain-fail": {
118
+ const result = await runExplainFailCommand(parsed);
119
+ writeOut(result.output);
120
+ return result.exitCode;
121
+ }
122
+ case "handoff": {
123
+ const result = await runHandoffCommand(parsed);
124
+ writeOut(result.output);
125
+ return result.exitCode;
126
+ }
127
+ case "review-pack": {
128
+ const result = await runReviewPackCommand(parsed);
129
+ writeOut(result.output);
130
+ return result.exitCode;
131
+ }
132
+ case "doctor": {
133
+ const result = runDoctorCommand(parsed, env);
134
+ writeOut(result.output);
135
+ return result.exitCode;
136
+ }
137
+ case "gate": {
138
+ const result = await runGateCommand(parsed);
139
+ writeOut(result.output);
140
+ return result.exitCode;
141
+ }
142
+ case "tool": {
143
+ const result = await runToolCommand(parsed);
144
+ writeOut(result.output);
145
+ return result.exitCode;
146
+ }
147
+ default: {
148
+ writeErr(`error: unknown command '${parsed.command}'\n`);
149
+ writeErr(HELP.trimEnd());
150
+ return 2;
151
+ }
152
+ }
153
+ }
154
+ /** Direct execution: `node --import tsx src/main.ts ...` or `pnpm jcr-adk ...` */
155
+ if (process.argv[1] === fileURLToPath(import.meta.url)) {
156
+ const code = await runCli(process.argv.slice(2));
157
+ process.exit(code);
158
+ }
159
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Command Permission Matrix — CMD-02A/B/02R / DF-09
3
+ * SSOT: 22-command-specification-design.md §Permission Matrix
4
+ *
5
+ * Ported from spikes/core-p0-verify/src/lib/command-permission-matrix.ts (PR-009).
6
+ */
7
+ /** High-level command classification. */
8
+ export type CommandType = "read/report" | "report" | "verifier" | "lifecycle";
9
+ /** One row in the permission matrix. */
10
+ export interface CommandPermission {
11
+ readonly command: string;
12
+ readonly type: CommandType;
13
+ /** True = command may write lifecycle artifacts. */
14
+ readonly mutatesState: boolean;
15
+ /** True = verifier gate must run before command completes. */
16
+ readonly requiresGate: boolean;
17
+ /** True = human approval required before execution. */
18
+ readonly requiresApproval: boolean;
19
+ readonly output: string;
20
+ }
21
+ /**
22
+ * Canonical command permission matrix.
23
+ * All `read/report` commands must have mutatesState=false (CMD-02B invariant).
24
+ */
25
+ export declare const COMMAND_PERMISSION_MATRIX: readonly CommandPermission[];
26
+ /** Look up permission entry for a command. Returns undefined for unknown commands. */
27
+ export declare function getCommandPermission(command: string): CommandPermission | undefined;
28
+ /** True when command is a read-only / report command (must not mutate state). */
29
+ export declare function isReadReportCommand(command: string): boolean;
30
+ export type CommandCheckResult = {
31
+ readonly allowed: true;
32
+ } | {
33
+ readonly allowed: false;
34
+ readonly reason: string;
35
+ readonly ruleId: "CMD-02R" | "CMD-UNKNOWN";
36
+ };
37
+ /**
38
+ * DF-09 / CMD-02R: read/report commands must not mutate lifecycle state.
39
+ * Returns allowed when the command is permitted to mutate, denied otherwise.
40
+ */
41
+ export declare function checkReadReportMutationDeny(command: string): CommandCheckResult;
42
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yCAAyC;AACzC,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAE9E,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,iBAAiB,EAajE,CAAC;AAIF,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEnF;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAA;CAAE,CAAC;AAErG;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAoB/E"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Command Permission Matrix — CMD-02A/B/02R / DF-09
3
+ * SSOT: 22-command-specification-design.md §Permission Matrix
4
+ *
5
+ * Ported from spikes/core-p0-verify/src/lib/command-permission-matrix.ts (PR-009).
6
+ */
7
+ /**
8
+ * Canonical command permission matrix.
9
+ * All `read/report` commands must have mutatesState=false (CMD-02B invariant).
10
+ */
11
+ export const COMMAND_PERMISSION_MATRIX = [
12
+ { command: "jcr-adk audit", type: "read/report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "audit summary" },
13
+ { command: "jcr-adk replay", type: "read/report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "replay summary" },
14
+ { command: "jcr-adk handoff", type: "report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "handoff package" },
15
+ { command: "jcr-adk review-pack", type: "report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "evidence bundle" },
16
+ { command: "jcr-adk explain-fail", type: "report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "failure explanation" },
17
+ { command: "jcr-adk debug-bundle", type: "report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "debug bundle" },
18
+ { command: "jcr-adk doctor", type: "read/report", mutatesState: false, requiresGate: false, requiresApproval: false, output: "diagnostic report" },
19
+ { command: "jcr-adk gate", type: "verifier", mutatesState: true, requiresGate: true, requiresApproval: false, output: "gate report" },
20
+ { command: "jcr-adk sync", type: "lifecycle", mutatesState: true, requiresGate: true, requiresApproval: true, output: "sync report" },
21
+ { command: "jcr-adk init", type: "lifecycle", mutatesState: true, requiresGate: false, requiresApproval: false, output: "lifecycle artifacts" },
22
+ { command: "jcr-adk plan", type: "lifecycle", mutatesState: true, requiresGate: false, requiresApproval: false, output: "lifecycle artifacts" },
23
+ { command: "jcr-adk run", type: "lifecycle", mutatesState: true, requiresGate: false, requiresApproval: false, output: "lifecycle artifacts" },
24
+ ];
25
+ const _matrixByCommand = new Map(COMMAND_PERMISSION_MATRIX.map((row) => [row.command, row]));
26
+ /** Look up permission entry for a command. Returns undefined for unknown commands. */
27
+ export function getCommandPermission(command) {
28
+ return _matrixByCommand.get(command);
29
+ }
30
+ /** True when command is a read-only / report command (must not mutate state). */
31
+ export function isReadReportCommand(command) {
32
+ const perm = getCommandPermission(command);
33
+ return perm !== undefined && !perm.mutatesState;
34
+ }
35
+ /**
36
+ * DF-09 / CMD-02R: read/report commands must not mutate lifecycle state.
37
+ * Returns allowed when the command is permitted to mutate, denied otherwise.
38
+ */
39
+ export function checkReadReportMutationDeny(command) {
40
+ const perm = getCommandPermission(command);
41
+ if (!perm) {
42
+ return {
43
+ allowed: false,
44
+ reason: `Unknown command: ${command}`,
45
+ ruleId: "CMD-UNKNOWN",
46
+ };
47
+ }
48
+ if (!perm.mutatesState) {
49
+ return {
50
+ allowed: false,
51
+ reason: `Read/report command '${command}' must not mutate lifecycle state (CMD-02R).`,
52
+ ruleId: "CMD-02R",
53
+ };
54
+ }
55
+ return { allowed: true };
56
+ }
57
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * JSONL replay summary — F-02 / SR-09 read-only reconstruction.
3
+ */
4
+ import type { PersistedAdkEvent } from "@jcr-adk/state";
5
+ export type ReplayStatus = "completed" | "failed" | "in_progress" | "unknown";
6
+ export interface ReplayTimelineEntry {
7
+ readonly seq: number;
8
+ readonly kind: string;
9
+ readonly timestamp: string;
10
+ readonly specId: string;
11
+ readonly runId: string;
12
+ readonly detail?: string;
13
+ }
14
+ export interface ReplaySummary {
15
+ readonly runId: string;
16
+ readonly specId?: string;
17
+ readonly eventCount: number;
18
+ readonly status: ReplayStatus;
19
+ readonly timeline: readonly ReplayTimelineEntry[];
20
+ readonly toolsInvoked: readonly string[];
21
+ readonly gateResults: readonly {
22
+ readonly result: string;
23
+ readonly reportHash?: string;
24
+ }[];
25
+ readonly policyDenialCount: number;
26
+ }
27
+ export declare function buildReplaySummary(events: readonly PersistedAdkEvent[], runId: string, specId?: string): ReplaySummary;
28
+ //# sourceMappingURL=replay-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-summary.d.ts","sourceRoot":"","sources":["../src/replay-summary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAmBD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAqDf"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * JSONL replay summary — F-02 / SR-09 read-only reconstruction.
3
+ */
4
+ function timelineDetail(event) {
5
+ const payload = event.payload;
6
+ if (event.kind === "tool.invoked" || event.kind === "tool.completed" || event.kind === "tool.failed") {
7
+ const toolName = payload.toolName;
8
+ return typeof toolName === "string" ? toolName : undefined;
9
+ }
10
+ if (event.kind === "gate.report") {
11
+ const result = payload.result;
12
+ return typeof result === "string" ? `gate:${result}` : undefined;
13
+ }
14
+ if (event.kind === "policy.denied") {
15
+ const ruleId = payload.ruleId;
16
+ return typeof ruleId === "string" ? `deny:${ruleId}` : "deny";
17
+ }
18
+ return undefined;
19
+ }
20
+ export function buildReplaySummary(events, runId, specId) {
21
+ const filtered = events.filter((event) => {
22
+ if (event.runId !== runId)
23
+ return false;
24
+ if (specId && event.specId !== specId)
25
+ return false;
26
+ return true;
27
+ });
28
+ const toolsInvoked = new Set();
29
+ const gateResults = [];
30
+ let policyDenialCount = 0;
31
+ let status = "unknown";
32
+ const timeline = filtered.map((event) => {
33
+ const payload = event.payload;
34
+ if (event.kind === "tool.invoked" && typeof payload.toolName === "string") {
35
+ toolsInvoked.add(payload.toolName);
36
+ }
37
+ if (event.kind === "gate.report") {
38
+ gateResults.push({
39
+ result: String(payload.result ?? "UNKNOWN"),
40
+ reportHash: typeof payload.reportHash === "string" ? payload.reportHash : undefined,
41
+ });
42
+ }
43
+ if (event.kind === "policy.denied") {
44
+ policyDenialCount += 1;
45
+ }
46
+ if (event.kind === "run.completed")
47
+ status = "completed";
48
+ if (event.kind === "run.failed")
49
+ status = "failed";
50
+ if (event.kind === "run.started" && status === "unknown")
51
+ status = "in_progress";
52
+ return {
53
+ seq: event.seq,
54
+ kind: event.kind,
55
+ timestamp: event.timestamp,
56
+ specId: event.specId,
57
+ runId: event.runId,
58
+ detail: timelineDetail(event),
59
+ };
60
+ });
61
+ const resolvedSpecId = specId ?? filtered[0]?.specId;
62
+ return {
63
+ runId,
64
+ specId: resolvedSpecId,
65
+ eventCount: filtered.length,
66
+ status,
67
+ timeline,
68
+ toolsInvoked: [...toolsInvoked].sort(),
69
+ gateResults,
70
+ policyDenialCount,
71
+ };
72
+ }
73
+ //# sourceMappingURL=replay-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-summary.js","sourceRoot":"","sources":["../src/replay-summary.ts"],"names":[],"mappings":"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"}