@cluesmith/codev 3.0.0 → 3.0.1

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 (286) hide show
  1. package/LICENSE +201 -0
  2. package/bin/af.js +2 -2
  3. package/bin/afx.js +8 -0
  4. package/bin/consult.js +2 -1
  5. package/bin/team.js +2 -1
  6. package/{dashboard/dist/assets/index-nr0cXxtf.css → dashboard-dist/assets/index-BWYZtvwm.css} +1 -1
  7. package/dashboard-dist/assets/index-Dn9zmcKp.js +195 -0
  8. package/dashboard-dist/assets/index-Dn9zmcKp.js.map +1 -0
  9. package/{dashboard/dist → dashboard-dist}/index.html +2 -2
  10. package/dist/agent-farm/cli.d.ts.map +1 -1
  11. package/dist/agent-farm/cli.js +13 -14
  12. package/dist/agent-farm/cli.js.map +1 -1
  13. package/dist/agent-farm/commands/architect.d.ts +4 -4
  14. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  15. package/dist/agent-farm/commands/architect.js +23 -12
  16. package/dist/agent-farm/commands/architect.js.map +1 -1
  17. package/dist/agent-farm/commands/attach.js +8 -8
  18. package/dist/agent-farm/commands/attach.js.map +1 -1
  19. package/dist/agent-farm/commands/bench.d.ts +1 -1
  20. package/dist/agent-farm/commands/bench.js +1 -1
  21. package/dist/agent-farm/commands/cron.js +1 -1
  22. package/dist/agent-farm/commands/cron.js.map +1 -1
  23. package/dist/agent-farm/commands/db.d.ts +3 -3
  24. package/dist/agent-farm/commands/db.js +4 -4
  25. package/dist/agent-farm/commands/db.js.map +1 -1
  26. package/dist/agent-farm/commands/open.js +2 -2
  27. package/dist/agent-farm/commands/open.js.map +1 -1
  28. package/dist/agent-farm/commands/rename.js +1 -1
  29. package/dist/agent-farm/commands/rename.js.map +1 -1
  30. package/dist/agent-farm/commands/send.js +3 -3
  31. package/dist/agent-farm/commands/send.js.map +1 -1
  32. package/dist/agent-farm/commands/shell.js +3 -3
  33. package/dist/agent-farm/commands/shell.js.map +1 -1
  34. package/dist/agent-farm/commands/spawn-roles.d.ts +8 -4
  35. package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
  36. package/dist/agent-farm/commands/spawn-roles.js +48 -28
  37. package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
  38. package/dist/agent-farm/commands/spawn-worktree.d.ts +1 -1
  39. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  40. package/dist/agent-farm/commands/spawn-worktree.js +80 -13
  41. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  42. package/dist/agent-farm/commands/spawn.d.ts +6 -6
  43. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  44. package/dist/agent-farm/commands/spawn.js +90 -53
  45. package/dist/agent-farm/commands/spawn.js.map +1 -1
  46. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  47. package/dist/agent-farm/commands/status.js +48 -3
  48. package/dist/agent-farm/commands/status.js.map +1 -1
  49. package/dist/agent-farm/commands/team-update.d.ts +1 -1
  50. package/dist/agent-farm/commands/team-update.js +1 -1
  51. package/dist/agent-farm/commands/team.d.ts +1 -1
  52. package/dist/agent-farm/commands/team.js +1 -1
  53. package/dist/agent-farm/commands/tower-cloud.d.ts +2 -2
  54. package/dist/agent-farm/commands/tower-cloud.js +3 -3
  55. package/dist/agent-farm/commands/tower-cloud.js.map +1 -1
  56. package/dist/agent-farm/commands/tower.js +2 -2
  57. package/dist/agent-farm/commands/tower.js.map +1 -1
  58. package/dist/agent-farm/lib/cloud-config.js +2 -2
  59. package/dist/agent-farm/lib/cloud-config.js.map +1 -1
  60. package/dist/agent-farm/lib/tower-client.d.ts +6 -230
  61. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  62. package/dist/agent-farm/lib/tower-client.js +6 -293
  63. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  64. package/dist/agent-farm/lib/tunnel-client.js +1 -1
  65. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  66. package/dist/agent-farm/servers/message-write.d.ts +24 -0
  67. package/dist/agent-farm/servers/message-write.d.ts.map +1 -0
  68. package/dist/agent-farm/servers/message-write.js +63 -0
  69. package/dist/agent-farm/servers/message-write.js.map +1 -0
  70. package/dist/agent-farm/servers/overview.d.ts +4 -1
  71. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  72. package/dist/agent-farm/servers/overview.js +38 -5
  73. package/dist/agent-farm/servers/overview.js.map +1 -1
  74. package/dist/agent-farm/servers/send-buffer.d.ts +4 -3
  75. package/dist/agent-farm/servers/send-buffer.d.ts.map +1 -1
  76. package/dist/agent-farm/servers/send-buffer.js +7 -4
  77. package/dist/agent-farm/servers/send-buffer.js.map +1 -1
  78. package/dist/agent-farm/servers/tower-cron-parser.js +1 -1
  79. package/dist/agent-farm/servers/tower-cron-parser.js.map +1 -1
  80. package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
  81. package/dist/agent-farm/servers/tower-cron.js +4 -5
  82. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  83. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  84. package/dist/agent-farm/servers/tower-instances.js +6 -5
  85. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  86. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  87. package/dist/agent-farm/servers/tower-routes.js +19 -16
  88. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  89. package/dist/agent-farm/servers/tower-server.js +1 -1
  90. package/dist/agent-farm/servers/tower-terminals.d.ts +2 -2
  91. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  92. package/dist/agent-farm/servers/tower-terminals.js +47 -18
  93. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  94. package/dist/agent-farm/servers/tower-tunnel.js +2 -2
  95. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  96. package/dist/agent-farm/servers/tower-utils.d.ts +9 -6
  97. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  98. package/dist/agent-farm/servers/tower-utils.js +12 -6
  99. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  100. package/dist/agent-farm/types.d.ts +9 -0
  101. package/dist/agent-farm/types.d.ts.map +1 -1
  102. package/dist/agent-farm/utils/config.d.ts +11 -0
  103. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  104. package/dist/agent-farm/utils/config.js +21 -0
  105. package/dist/agent-farm/utils/config.js.map +1 -1
  106. package/dist/agent-farm/utils/harness.d.ts +85 -0
  107. package/dist/agent-farm/utils/harness.d.ts.map +1 -0
  108. package/dist/agent-farm/utils/harness.js +212 -0
  109. package/dist/agent-farm/utils/harness.js.map +1 -0
  110. package/dist/cli.d.ts +1 -1
  111. package/dist/cli.d.ts.map +1 -1
  112. package/dist/cli.js +19 -5
  113. package/dist/cli.js.map +1 -1
  114. package/dist/commands/adopt.js +2 -2
  115. package/dist/commands/adopt.js.map +1 -1
  116. package/dist/commands/consult/index.d.ts +37 -3
  117. package/dist/commands/consult/index.d.ts.map +1 -1
  118. package/dist/commands/consult/index.js +220 -150
  119. package/dist/commands/consult/index.js.map +1 -1
  120. package/dist/commands/doctor.d.ts.map +1 -1
  121. package/dist/commands/doctor.js +54 -8
  122. package/dist/commands/doctor.js.map +1 -1
  123. package/dist/commands/init.js +1 -1
  124. package/dist/commands/init.js.map +1 -1
  125. package/dist/commands/porch/artifacts.d.ts +69 -0
  126. package/dist/commands/porch/artifacts.d.ts.map +1 -0
  127. package/dist/commands/porch/artifacts.js +368 -0
  128. package/dist/commands/porch/artifacts.js.map +1 -0
  129. package/dist/commands/porch/checks.d.ts +8 -1
  130. package/dist/commands/porch/checks.d.ts.map +1 -1
  131. package/dist/commands/porch/checks.js +98 -1
  132. package/dist/commands/porch/checks.js.map +1 -1
  133. package/dist/commands/porch/index.d.ts +12 -7
  134. package/dist/commands/porch/index.d.ts.map +1 -1
  135. package/dist/commands/porch/index.js +216 -61
  136. package/dist/commands/porch/index.js.map +1 -1
  137. package/dist/commands/porch/next.d.ts.map +1 -1
  138. package/dist/commands/porch/next.js +72 -74
  139. package/dist/commands/porch/next.js.map +1 -1
  140. package/dist/commands/porch/notify.d.ts +2 -2
  141. package/dist/commands/porch/notify.js +5 -5
  142. package/dist/commands/porch/notify.js.map +1 -1
  143. package/dist/commands/porch/prompts.d.ts +2 -1
  144. package/dist/commands/porch/prompts.d.ts.map +1 -1
  145. package/dist/commands/porch/prompts.js +19 -7
  146. package/dist/commands/porch/prompts.js.map +1 -1
  147. package/dist/commands/porch/state.d.ts +27 -2
  148. package/dist/commands/porch/state.d.ts.map +1 -1
  149. package/dist/commands/porch/state.js +96 -9
  150. package/dist/commands/porch/state.js.map +1 -1
  151. package/dist/commands/porch/types.d.ts +8 -0
  152. package/dist/commands/porch/types.d.ts.map +1 -1
  153. package/dist/lib/config.d.ts +14 -0
  154. package/dist/lib/config.d.ts.map +1 -1
  155. package/dist/lib/config.js +7 -0
  156. package/dist/lib/config.js.map +1 -1
  157. package/dist/lib/forge-contracts.d.ts +9 -0
  158. package/dist/lib/forge-contracts.d.ts.map +1 -1
  159. package/dist/lib/forge-contracts.js.map +1 -1
  160. package/dist/lib/forge.js +1 -1
  161. package/dist/lib/forge.js.map +1 -1
  162. package/dist/lib/team-github.d.ts +49 -0
  163. package/dist/lib/team-github.d.ts.map +1 -1
  164. package/dist/lib/team-github.js +115 -6
  165. package/dist/lib/team-github.js.map +1 -1
  166. package/dist/terminal/pty-manager.d.ts.map +1 -1
  167. package/dist/terminal/pty-manager.js +2 -0
  168. package/dist/terminal/pty-manager.js.map +1 -1
  169. package/dist/terminal/ws-protocol.d.ts +10 -8
  170. package/dist/terminal/ws-protocol.d.ts.map +1 -1
  171. package/dist/terminal/ws-protocol.js +3 -0
  172. package/dist/terminal/ws-protocol.js.map +1 -1
  173. package/package.json +28 -25
  174. package/scripts/forge/gitea/auth-status.sh +0 -0
  175. package/scripts/forge/gitea/issue-comment.sh +0 -0
  176. package/scripts/forge/gitea/issue-list.sh +0 -0
  177. package/scripts/forge/gitea/issue-view.sh +0 -0
  178. package/scripts/forge/gitea/pr-exists.sh +4 -1
  179. package/scripts/forge/gitea/pr-list.sh +0 -0
  180. package/scripts/forge/gitea/pr-merge.sh +0 -0
  181. package/scripts/forge/gitea/pr-view.sh +0 -0
  182. package/scripts/forge/gitea/recently-closed.sh +0 -0
  183. package/scripts/forge/gitea/recently-merged.sh +0 -0
  184. package/scripts/forge/gitea/repo-archive.sh +0 -0
  185. package/scripts/forge/gitea/user-identity.sh +0 -0
  186. package/scripts/forge/github/auth-status.sh +0 -0
  187. package/scripts/forge/github/issue-comment.sh +0 -0
  188. package/scripts/forge/github/issue-list.sh +2 -2
  189. package/scripts/forge/github/issue-view.sh +0 -0
  190. package/scripts/forge/github/on-it-timestamps.sh +0 -0
  191. package/scripts/forge/github/pr-diff.sh +0 -0
  192. package/scripts/forge/github/pr-exists.sh +3 -1
  193. package/scripts/forge/github/pr-list.sh +2 -2
  194. package/scripts/forge/github/pr-merge.sh +0 -0
  195. package/scripts/forge/github/pr-search.sh +0 -0
  196. package/scripts/forge/github/pr-view.sh +0 -0
  197. package/scripts/forge/github/recently-closed.sh +0 -0
  198. package/scripts/forge/github/recently-merged.sh +0 -0
  199. package/scripts/forge/github/repo-archive.sh +0 -0
  200. package/scripts/forge/github/team-activity.sh +0 -0
  201. package/scripts/forge/github/user-identity.sh +0 -0
  202. package/scripts/forge/gitlab/auth-status.sh +0 -0
  203. package/scripts/forge/gitlab/issue-comment.sh +0 -0
  204. package/scripts/forge/gitlab/issue-list.sh +0 -0
  205. package/scripts/forge/gitlab/issue-view.sh +0 -0
  206. package/scripts/forge/gitlab/pr-diff.sh +0 -0
  207. package/scripts/forge/gitlab/pr-exists.sh +3 -1
  208. package/scripts/forge/gitlab/pr-list.sh +0 -0
  209. package/scripts/forge/gitlab/pr-merge.sh +0 -0
  210. package/scripts/forge/gitlab/pr-search.sh +0 -0
  211. package/scripts/forge/gitlab/pr-view.sh +0 -0
  212. package/scripts/forge/gitlab/recently-closed.sh +0 -0
  213. package/scripts/forge/gitlab/recently-merged.sh +0 -0
  214. package/scripts/forge/gitlab/repo-archive.sh +0 -0
  215. package/scripts/forge/gitlab/user-identity.sh +0 -0
  216. package/scripts/postinstall.mjs +51 -0
  217. package/skeleton/.claude/skills/afx/SKILL.md +144 -0
  218. package/skeleton/.claude/skills/codev/SKILL.md +3 -3
  219. package/skeleton/.claude/skills/consult/SKILL.md +1 -1
  220. package/skeleton/.claude/skills/porch/SKILL.md +2 -2
  221. package/skeleton/DEPENDENCIES.md +1 -1
  222. package/skeleton/builders.md +4 -4
  223. package/skeleton/protocol-schema.json +2 -2
  224. package/skeleton/protocols/air/builder-prompt.md +6 -6
  225. package/skeleton/protocols/air/prompts/pr.md +17 -5
  226. package/skeleton/protocols/air/protocol.md +1 -2
  227. package/skeleton/protocols/aspir/builder-prompt.md +28 -6
  228. package/skeleton/protocols/aspir/prompts/review.md +11 -0
  229. package/skeleton/protocols/aspir/protocol.json +9 -1
  230. package/skeleton/protocols/aspir/protocol.md +1 -1
  231. package/skeleton/protocols/aspir/templates/plan.md +0 -20
  232. package/skeleton/protocols/aspir/templates/spec.md +0 -28
  233. package/skeleton/protocols/bugfix/builder-prompt.md +6 -6
  234. package/skeleton/protocols/bugfix/prompts/pr.md +16 -4
  235. package/skeleton/protocols/experiment/builder-prompt.md +15 -0
  236. package/skeleton/protocols/experiment/protocol.md +1 -6
  237. package/skeleton/protocols/maintain/builder-prompt.md +12 -11
  238. package/skeleton/protocols/maintain/prompts/maintain.md +88 -0
  239. package/skeleton/protocols/maintain/prompts/review.md +84 -0
  240. package/skeleton/protocols/maintain/protocol.json +14 -68
  241. package/skeleton/protocols/maintain/protocol.md +111 -409
  242. package/skeleton/protocols/maintain/templates/maintenance-run.md +18 -49
  243. package/skeleton/protocols/protocol-schema.json +1 -1
  244. package/skeleton/protocols/research/builder-prompt.md +85 -0
  245. package/skeleton/protocols/research/protocol.json +118 -0
  246. package/skeleton/protocols/research/protocol.md +169 -0
  247. package/skeleton/protocols/spike/builder-prompt.md +1 -1
  248. package/skeleton/protocols/spike/protocol.md +4 -4
  249. package/skeleton/protocols/spir/builder-prompt.md +28 -5
  250. package/skeleton/protocols/spir/prompts/review.md +11 -0
  251. package/skeleton/protocols/spir/protocol.json +9 -1
  252. package/skeleton/protocols/spir/protocol.md +2 -2
  253. package/skeleton/protocols/spir/templates/plan.md +0 -20
  254. package/skeleton/protocols/spir/templates/spec.md +0 -28
  255. package/skeleton/resources/commands/agent-farm.md +84 -84
  256. package/skeleton/resources/commands/codev.md +1 -1
  257. package/skeleton/resources/commands/consult.md +16 -7
  258. package/skeleton/resources/commands/overview.md +14 -15
  259. package/skeleton/resources/risk-triage.md +1 -1
  260. package/skeleton/resources/workflow-reference.md +14 -14
  261. package/skeleton/roles/architect.md +39 -39
  262. package/skeleton/roles/builder.md +22 -14
  263. package/skeleton/templates/AGENTS.md +5 -3
  264. package/skeleton/templates/CLAUDE.md +5 -3
  265. package/skeleton/templates/cheatsheet.md +12 -12
  266. package/templates/3d-viewer.html +16 -18
  267. package/templates/tower.html +1 -1
  268. package/dashboard/dist/assets/index-CTrlY11L.js +0 -194
  269. package/dashboard/dist/assets/index-CTrlY11L.js.map +0 -1
  270. package/skeleton/.claude/skills/af/SKILL.md +0 -146
  271. package/skeleton/porch/prompts/understand.md +0 -61
  272. package/skeleton/porch/prompts/verify.md +0 -58
  273. package/skeleton/protocols/maintain/prompts/audit.md +0 -111
  274. package/skeleton/protocols/maintain/prompts/clean.md +0 -91
  275. package/skeleton/protocols/maintain/prompts/sync.md +0 -113
  276. package/skeleton/protocols/maintain/prompts/verify.md +0 -110
  277. package/skeleton/protocols/tick/builder-prompt.md +0 -65
  278. package/skeleton/protocols/tick/consult-types/impl-review.md +0 -72
  279. package/skeleton/protocols/tick/consult-types/plan-review.md +0 -59
  280. package/skeleton/protocols/tick/consult-types/pr-review.md +0 -72
  281. package/skeleton/protocols/tick/consult-types/spec-review.md +0 -55
  282. package/skeleton/protocols/tick/protocol.json +0 -151
  283. package/skeleton/protocols/tick/protocol.md +0 -277
  284. package/skeleton/protocols/tick/templates/plan.md +0 -67
  285. package/skeleton/protocols/tick/templates/review.md +0 -89
  286. package/skeleton/protocols/tick/templates/spec.md +0 -61
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Artifact Resolver — pluggable backend for codev artifact access.
3
+ *
4
+ * Decouples porch from filesystem assumptions. Two backends:
5
+ * - LocalResolver: reads from codev/specs/, codev/plans/ (default, backward compatible)
6
+ * - CliResolver: shells out to a configurable CLI command (e.g. `my-tool get`)
7
+ *
8
+ * Spec 559: Porch Artifact Resolver
9
+ */
10
+ import { execFileSync } from 'node:child_process';
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import { globSync } from 'glob';
14
+ import { loadConfig } from '../../lib/config.js';
15
+ // =============================================================================
16
+ // Shared Helpers
17
+ // =============================================================================
18
+ /**
19
+ * Check if artifact content has pre-approval frontmatter.
20
+ * Looks for YAML frontmatter with `approved:` and `validated:` fields.
21
+ * Used by both LocalResolver and CliResolver for consistency.
22
+ */
23
+ export function isPreApprovedContent(content) {
24
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
25
+ if (!frontmatterMatch)
26
+ return false;
27
+ const frontmatter = frontmatterMatch[1];
28
+ const hasApproved = /^approved:\s*.+$/m.test(frontmatter);
29
+ // Accept both inline YAML arrays (validated: [a, b]) and block YAML lists (validated:\n - a)
30
+ const hasValidated = /^validated:\s*(\[.+\]|$)/m.test(frontmatter);
31
+ return hasApproved && hasValidated;
32
+ }
33
+ // =============================================================================
34
+ // Local Resolver (default — reads from codev/ directory)
35
+ // =============================================================================
36
+ export class LocalResolver {
37
+ workspaceRoot;
38
+ constructor(workspaceRoot) {
39
+ this.workspaceRoot = workspaceRoot;
40
+ }
41
+ findSpecBaseName(projectId, _title) {
42
+ const specsDir = path.join(this.workspaceRoot, 'codev', 'specs');
43
+ if (!fs.existsSync(specsDir))
44
+ return null;
45
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
46
+ try {
47
+ const files = fs.readdirSync(specsDir);
48
+ const specFile = files.find(f => {
49
+ if (!f.endsWith('.md'))
50
+ return false;
51
+ const numMatch = f.match(/^(\d+)/);
52
+ if (!numMatch)
53
+ return false;
54
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
55
+ });
56
+ return specFile ? specFile.replace(/\.md$/, '') : null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ getSpecContent(projectId, title) {
63
+ const baseName = this.findSpecBaseName(projectId, title);
64
+ if (!baseName)
65
+ return null;
66
+ const filePath = path.join(this.workspaceRoot, 'codev', 'specs', `${baseName}.md`);
67
+ try {
68
+ return fs.readFileSync(filePath, 'utf-8');
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ getPlanContent(projectId, title) {
75
+ // Try new location first: codev/projects/<id>-<name>/plan.md
76
+ const projectsDir = path.join(this.workspaceRoot, 'codev', 'projects');
77
+ if (fs.existsSync(projectsDir)) {
78
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
79
+ try {
80
+ const dirs = fs.readdirSync(projectsDir);
81
+ const projDir = dirs.find(d => {
82
+ const numMatch = d.match(/^(\d+)/);
83
+ if (!numMatch)
84
+ return false;
85
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
86
+ });
87
+ if (projDir) {
88
+ const planPath = path.join(projectsDir, projDir, 'plan.md');
89
+ if (fs.existsSync(planPath)) {
90
+ return fs.readFileSync(planPath, 'utf-8');
91
+ }
92
+ }
93
+ }
94
+ catch { /* continue to legacy */ }
95
+ }
96
+ // Legacy location: codev/plans/<id>-*.md
97
+ const plansDir = path.join(this.workspaceRoot, 'codev', 'plans');
98
+ if (!fs.existsSync(plansDir))
99
+ return null;
100
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
101
+ try {
102
+ const files = fs.readdirSync(plansDir);
103
+ const planFile = files.find(f => {
104
+ if (!f.endsWith('.md'))
105
+ return false;
106
+ const numMatch = f.match(/^(\d+)/);
107
+ if (!numMatch)
108
+ return false;
109
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
110
+ });
111
+ if (planFile) {
112
+ return fs.readFileSync(path.join(plansDir, planFile), 'utf-8');
113
+ }
114
+ }
115
+ catch { /* ignore */ }
116
+ return null;
117
+ }
118
+ getReviewContent(projectId, _title) {
119
+ const reviewsDir = path.join(this.workspaceRoot, 'codev', 'reviews');
120
+ if (!fs.existsSync(reviewsDir))
121
+ return null;
122
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
123
+ try {
124
+ const files = fs.readdirSync(reviewsDir);
125
+ const reviewFile = files.find(f => {
126
+ if (!f.endsWith('.md'))
127
+ return false;
128
+ const numMatch = f.match(/^(\d+)/);
129
+ if (!numMatch)
130
+ return false;
131
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
132
+ });
133
+ if (reviewFile) {
134
+ return fs.readFileSync(path.join(reviewsDir, reviewFile), 'utf-8');
135
+ }
136
+ }
137
+ catch { /* ignore */ }
138
+ return null;
139
+ }
140
+ hasPreApproval(artifactGlob) {
141
+ const matches = globSync(artifactGlob, { cwd: this.workspaceRoot });
142
+ if (matches.length === 0)
143
+ return false;
144
+ const filePath = path.join(this.workspaceRoot, matches[0]);
145
+ try {
146
+ const content = fs.readFileSync(filePath, 'utf-8');
147
+ return isPreApprovedContent(content);
148
+ }
149
+ catch {
150
+ return false;
151
+ }
152
+ }
153
+ }
154
+ // =============================================================================
155
+ // CLI Resolver (shells out to a configurable CLI command)
156
+ // =============================================================================
157
+ /** Sentinel value for cached negative results (CLI returned error) */
158
+ const NEGATIVE_CACHE = Symbol('negative');
159
+ export class CliResolver {
160
+ scope;
161
+ command;
162
+ cache = new Map();
163
+ extraEnv;
164
+ constructor(scope, command, workspaceRoot) {
165
+ this.scope = scope;
166
+ this.command = command;
167
+ // Read data repo env vars from .env if not already in process.env.
168
+ // af_builder.sh injects these into builder worktree .env files.
169
+ this.extraEnv = {};
170
+ const dataRepo = process.env.CODEV_ARTIFACTS_DATA_REPO;
171
+ if (!dataRepo && workspaceRoot) {
172
+ const envPath = path.join(workspaceRoot, '.env');
173
+ try {
174
+ const envContent = fs.readFileSync(envPath, 'utf-8');
175
+ const match = envContent.match(/^CODEV_ARTIFACTS_DATA_REPO=(.+)$/m);
176
+ if (match?.[1]?.trim()) {
177
+ this.extraEnv.CODEV_ARTIFACTS_DATA_REPO = match[1].trim();
178
+ }
179
+ }
180
+ catch { /* .env may not exist */ }
181
+ }
182
+ }
183
+ findSpecBaseName(projectId, _title) {
184
+ const children = this.listChildren('specs');
185
+ if (!children)
186
+ return null;
187
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
188
+ const match = children.find(name => {
189
+ const numMatch = name.match(/^(\d+)/);
190
+ if (!numMatch)
191
+ return false;
192
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
193
+ });
194
+ return match || null;
195
+ }
196
+ getSpecContent(projectId, _title) {
197
+ const baseName = this.findSpecBaseName(projectId, _title);
198
+ if (!baseName)
199
+ return null;
200
+ return this.getContent(`specs/${baseName}`);
201
+ }
202
+ getPlanContent(projectId, _title) {
203
+ const baseName = this.findPlanBaseName(projectId);
204
+ if (!baseName)
205
+ return null;
206
+ return this.getContent(`plans/${baseName}`);
207
+ }
208
+ getReviewContent(projectId, _title) {
209
+ const baseName = this.findReviewBaseName(projectId);
210
+ if (!baseName)
211
+ return null;
212
+ return this.getContent(`reviews/${baseName}`);
213
+ }
214
+ hasPreApproval(artifactGlob) {
215
+ // Determine artifact type from glob path (e.g., "codev/specs/0559-*.md" or "codev/plans/0559-*.md")
216
+ const typeMatch = artifactGlob.match(/\b(specs|plans|reviews)\b/);
217
+ const idMatch = artifactGlob.match(/(?:specs|plans|reviews)\/0*(\d+)/);
218
+ if (!idMatch)
219
+ return false;
220
+ const projectId = idMatch[1];
221
+ let content = null;
222
+ const artifactType = typeMatch?.[1] || 'specs';
223
+ if (artifactType === 'plans') {
224
+ content = this.getPlanContent(projectId, '');
225
+ }
226
+ else if (artifactType === 'reviews') {
227
+ content = this.getReviewContent(projectId, '');
228
+ }
229
+ else {
230
+ content = this.getSpecContent(projectId, '');
231
+ }
232
+ if (!content)
233
+ return false;
234
+ return isPreApprovedContent(content);
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // Internal helpers
238
+ // ---------------------------------------------------------------------------
239
+ findPlanBaseName(projectId) {
240
+ const children = this.listChildren('plans');
241
+ if (!children)
242
+ return null;
243
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
244
+ const match = children.find(name => {
245
+ const numMatch = name.match(/^(\d+)/);
246
+ if (!numMatch)
247
+ return false;
248
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
249
+ });
250
+ return match || null;
251
+ }
252
+ findReviewBaseName(projectId) {
253
+ const children = this.listChildren('reviews');
254
+ if (!children)
255
+ return null;
256
+ const normalizedId = projectId.replace(/^0+/, '') || '0';
257
+ const match = children.find(name => {
258
+ const numMatch = name.match(/^(\d+)/);
259
+ if (!numMatch)
260
+ return false;
261
+ return (numMatch[1].replace(/^0+/, '') || '0') === normalizedId;
262
+ });
263
+ return match || null;
264
+ }
265
+ listChildren(subPath) {
266
+ const cacheKey = `list:${subPath}`;
267
+ if (this.cache.has(cacheKey)) {
268
+ const cached = this.cache.get(cacheKey);
269
+ if (cached === NEGATIVE_CACHE)
270
+ return null;
271
+ const items = cached.split('\n').filter(Boolean);
272
+ return items.length > 0 ? items : null;
273
+ }
274
+ const scopePath = `${this.scope}/${subPath}`;
275
+ try {
276
+ const output = execFileSync(this.command, ['get', '--list', scopePath], {
277
+ encoding: 'utf-8',
278
+ timeout: 5000,
279
+ env: { ...process.env, ...this.extraEnv },
280
+ }).trim();
281
+ // Cache both non-empty and empty results (empty = scope exists but has no children)
282
+ this.cache.set(cacheKey, output);
283
+ const items = output ? output.split('\n').filter(Boolean) : [];
284
+ return items.length > 0 ? items : null;
285
+ }
286
+ catch (err) {
287
+ this.handleError(err, scopePath);
288
+ // Cache failures as negative to avoid repeated CLI timeouts
289
+ this.cache.set(cacheKey, NEGATIVE_CACHE);
290
+ return null;
291
+ }
292
+ }
293
+ getContent(subPath) {
294
+ const cacheKey = `content:${subPath}`;
295
+ if (this.cache.has(cacheKey)) {
296
+ const cached = this.cache.get(cacheKey);
297
+ return cached === NEGATIVE_CACHE ? null : cached;
298
+ }
299
+ const scopePath = `${this.scope}/${subPath}`;
300
+ try {
301
+ const output = execFileSync(this.command, ['get', scopePath], {
302
+ encoding: 'utf-8',
303
+ timeout: 5000,
304
+ env: { ...process.env, ...this.extraEnv },
305
+ });
306
+ this.cache.set(cacheKey, output);
307
+ return output;
308
+ }
309
+ catch (err) {
310
+ this.handleError(err, scopePath);
311
+ // Cache failures as negative to avoid repeated CLI timeouts
312
+ this.cache.set(cacheKey, NEGATIVE_CACHE);
313
+ return null;
314
+ }
315
+ }
316
+ handleError(err, scopePath) {
317
+ if (err && typeof err === 'object' && 'code' in err) {
318
+ if (err.code === 'ENOENT') {
319
+ throw new Error(`CLI command '${this.command}' not found. Ensure it is installed and on PATH.`);
320
+ }
321
+ }
322
+ // Non-zero exit — log warning for debugging
323
+ if (err && typeof err === 'object' && 'stderr' in err) {
324
+ const stderr = err.stderr;
325
+ if (stderr) {
326
+ console.error(`[porch] ${this.command} get ${scopePath}: ${stderr.trim()}`);
327
+ }
328
+ }
329
+ }
330
+ }
331
+ // =============================================================================
332
+ // Factory
333
+ // =============================================================================
334
+ /**
335
+ * Create the appropriate artifact resolver for this workspace.
336
+ * Reads config via loadConfig() (v3.0.0 unified config — .codev/config.json).
337
+ *
338
+ * @param workspaceRoot - The top-level workspace (where .codev/config.json lives).
339
+ * Always used to load config; also used as the .env source
340
+ * for the CLI backend.
341
+ * @param artifactRoot - Optional override for where the local backend reads
342
+ * specs/plans/reviews from. When the project lives in a
343
+ * builder worktree (`.builders/<slug>/`), pass that
344
+ * worktree's root so artifact lookups find files there
345
+ * instead of the top-level `codev/` directory (bugfix #676).
346
+ * Defaults to workspaceRoot.
347
+ */
348
+ export function getResolver(workspaceRoot, artifactRoot) {
349
+ const config = loadConfig(workspaceRoot);
350
+ const artifacts = config.artifacts;
351
+ if (artifacts?.backend === 'cli') {
352
+ if (!artifacts.command) {
353
+ throw new Error(`.codev/config.json has artifacts.backend: "cli" but no artifacts.command.\n` +
354
+ `Add: "artifacts": { "backend": "cli", "command": "my-tool", "scope": "org/project" }`);
355
+ }
356
+ if (!artifacts.scope) {
357
+ throw new Error(`.codev/config.json has artifacts.backend: "cli" but no artifacts.scope.\n` +
358
+ `Add: "artifacts": { "backend": "cli", "command": "${artifacts.command}", "scope": "org/project" }`);
359
+ }
360
+ return new CliResolver(artifacts.scope, artifacts.command, workspaceRoot);
361
+ }
362
+ if (artifacts?.backend && artifacts.backend !== 'local') {
363
+ throw new Error(`.codev/config.json has unknown artifacts.backend: "${artifacts.backend}".\n` +
364
+ `Valid values: "local" (default), "cli"`);
365
+ }
366
+ return new LocalResolver(artifactRoot ?? workspaceRoot);
367
+ }
368
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../src/commands/porch/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAuBjD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChE,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAEpC,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,8FAA8F;IAC9F,MAAM,YAAY,GAAG,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE,OAAO,WAAW,IAAI,YAAY,CAAC;AACrC,CAAC;AAED,gFAAgF;AAChF,yDAAyD;AACzD,gFAAgF;AAEhF,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;IAAG,CAAC;IAE7C,gBAAgB,CAAC,SAAiB,EAAE,MAAc;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC9B,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,KAAa;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC;QACnF,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,KAAa;QAC7C,6DAA6D;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACvE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACnC,IAAI,CAAC,QAAQ;wBAAE,OAAO,KAAK,CAAC;oBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;gBAClE,CAAC,CAAC,CAAC;gBACH,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtC,CAAC;QAED,yCAAyC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAE1C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC9B,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAExB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,MAAc;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAChC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,CAAC,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAExB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,0DAA0D;AAC1D,gFAAgF;AAEhF,sEAAsE;AACtE,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAG1C,MAAM,OAAO,WAAW;IAKZ;IACA;IALF,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,QAAQ,CAAyB;IAEzC,YACU,KAAa,EACb,OAAe,EACvB,aAAsB;QAFd,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QAGvB,mEAAmE;QACnE,gEAAgE;QAChE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QACvD,IAAI,CAAC,QAAQ,IAAI,aAAa,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACpE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,yBAAyB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,MAAc;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,MAAc;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,cAAc,CAAC,SAAiB,EAAE,MAAc;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,MAAc;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,cAAc,CAAC,YAAoB;QACjC,oGAAoG;QACpG,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,MAAM,YAAY,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QAE/C,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAEtE,gBAAgB,CAAC,SAAiB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAEO,kBAAkB,CAAC,SAAiB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,YAAY,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,MAAM,QAAQ,GAAG,QAAQ,OAAO,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACzC,IAAI,MAAM,KAAK,cAAc;gBAAE,OAAO,IAAI,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE;gBACtE,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;aAC1C,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,oFAAoF;YACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACjC,4DAA4D;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAAe;QAChC,MAAM,QAAQ,GAAG,WAAW,OAAO,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YACzC,OAAO,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE;gBAC5D,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;aAC1C,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACjC,4DAA4D;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,GAAY,EAAE,SAAiB;QACjD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACpD,IAAK,GAAwB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChD,MAAM,IAAI,KAAK,CACb,gBAAgB,IAAI,CAAC,OAAO,kDAAkD,CAC/E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,4CAA4C;QAC5C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG,EAAE,CAAC;YACtD,MAAM,MAAM,GAAI,GAA0B,CAAC,MAAM,CAAC;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,OAAO,QAAQ,SAAS,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,aAAqB,EAAE,YAAqB;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,IAAI,SAAS,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,6EAA6E;gBAC7E,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,2EAA2E;gBAC3E,qDAAqD,SAAS,CAAC,OAAO,6BAA6B,CACpG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,SAAS,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,sDAAsD,SAAS,CAAC,OAAO,MAAM;YAC7E,wCAAwC,CACzC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,aAAa,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;AAC1D,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * with timeout support.
6
6
  */
7
7
  import type { CheckResult, CheckDef } from './types.js';
8
+ import type { ArtifactResolver } from './artifacts.js';
8
9
  /** Environment variables passed to check commands */
9
10
  export interface CheckEnv {
10
11
  PROJECT_ID: string;
@@ -14,6 +15,12 @@ export interface CheckEnv {
14
15
  * Run a single check command
15
16
  */
16
17
  export declare function runCheck(name: string, command: string, cwd: string, env: CheckEnv, timeoutMs?: number): Promise<CheckResult>;
18
+ /**
19
+ * Try to run an artifact-dependent check programmatically via the resolver.
20
+ * Returns a CheckResult if the check name is recognized, null otherwise
21
+ * (caller should fall back to shell execution).
22
+ */
23
+ export declare function runArtifactCheck(name: string, command: string, resolver: ArtifactResolver, env: CheckEnv): CheckResult | null;
17
24
  /**
18
25
  * Run multiple checks for a phase.
19
26
  * Accepts either Record<string, string> (legacy) or Record<string, CheckDef>.
@@ -22,7 +29,7 @@ export declare function runCheck(name: string, command: string, cwd: string, env
22
29
  * command dispatcher instead of running the protocol.json command directly.
23
30
  * This allows per-project forge configuration while keeping protocol JSON unchanged.
24
31
  */
25
- export declare function runPhaseChecks(checks: Record<string, string | CheckDef>, cwd: string, env: CheckEnv, timeoutMs?: number): Promise<CheckResult[]>;
32
+ export declare function runPhaseChecks(checks: Record<string, string | CheckDef>, cwd: string, env: CheckEnv, timeoutMs?: number, resolver?: ArtifactResolver, overriddenChecks?: Set<string>): Promise<CheckResult[]>;
26
33
  /**
27
34
  * Format check results for terminal output
28
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAYxD,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,WAAW,CAAC,CAsFtB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,EACzC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,WAAW,EAAE,CAAC,CA2BxB;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAwBjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAE/D"}
1
+ {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAYvD,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,WAAW,CAAC,CAsFtB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,QAAQ,GACZ,WAAW,GAAG,IAAI,CAqFpB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,EACzC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,EACb,SAAS,GAAE,MAA2B,EACtC,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CAwCxB;AA+CD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAwBjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAE/D"}
@@ -94,6 +94,91 @@ export async function runCheck(name, command, cwd, env, timeoutMs = DEFAULT_TIME
94
94
  });
95
95
  });
96
96
  }
97
+ /**
98
+ * Try to run an artifact-dependent check programmatically via the resolver.
99
+ * Returns a CheckResult if the check name is recognized, null otherwise
100
+ * (caller should fall back to shell execution).
101
+ */
102
+ export function runArtifactCheck(name, command, resolver, env) {
103
+ const startTime = Date.now();
104
+ const { PROJECT_ID: projectId, PROJECT_TITLE: title } = env;
105
+ switch (name) {
106
+ case 'plan_exists': {
107
+ const content = resolver.getPlanContent(projectId, title);
108
+ return {
109
+ name,
110
+ command,
111
+ passed: content !== null,
112
+ output: content !== null ? 'Plan found via resolver' : undefined,
113
+ error: content === null ? 'Plan not found' : undefined,
114
+ duration_ms: Date.now() - startTime,
115
+ };
116
+ }
117
+ case 'has_phases_json': {
118
+ const content = resolver.getPlanContent(projectId, title);
119
+ if (content === null) {
120
+ return { name, command, passed: false, error: 'Plan not found', duration_ms: Date.now() - startTime };
121
+ }
122
+ const has = /"phases"\s*:/.test(content);
123
+ return {
124
+ name,
125
+ command,
126
+ passed: has,
127
+ output: has ? 'Found phases JSON block' : undefined,
128
+ error: has ? undefined : 'No "phases": found in plan',
129
+ duration_ms: Date.now() - startTime,
130
+ };
131
+ }
132
+ case 'min_two_phases': {
133
+ const content = resolver.getPlanContent(projectId, title);
134
+ if (content === null) {
135
+ return { name, command, passed: false, error: 'Plan not found', duration_ms: Date.now() - startTime };
136
+ }
137
+ const matches = content.match(/"id":\s*"[^"]*"/g);
138
+ const count = matches ? matches.length : 0;
139
+ return {
140
+ name,
141
+ command,
142
+ passed: count >= 2,
143
+ output: `Found ${count} phase(s)`,
144
+ error: count < 2 ? `Only ${count} phase(s) found, need at least 2` : undefined,
145
+ duration_ms: Date.now() - startTime,
146
+ };
147
+ }
148
+ case 'review_has_arch_updates': {
149
+ const content = resolver.getReviewContent(projectId, title);
150
+ if (content === null) {
151
+ return { name, command, passed: false, error: 'Review not found', duration_ms: Date.now() - startTime };
152
+ }
153
+ const has = content.includes('## Architecture Updates');
154
+ return {
155
+ name,
156
+ command,
157
+ passed: has,
158
+ output: has ? 'Found Architecture Updates section' : undefined,
159
+ error: has ? undefined : 'Missing "## Architecture Updates" section in review',
160
+ duration_ms: Date.now() - startTime,
161
+ };
162
+ }
163
+ case 'review_has_lessons_updates': {
164
+ const content = resolver.getReviewContent(projectId, title);
165
+ if (content === null) {
166
+ return { name, command, passed: false, error: 'Review not found', duration_ms: Date.now() - startTime };
167
+ }
168
+ const has = content.includes('## Lessons Learned Updates');
169
+ return {
170
+ name,
171
+ command,
172
+ passed: has,
173
+ output: has ? 'Found Lessons Learned Updates section' : undefined,
174
+ error: has ? undefined : 'Missing "## Lessons Learned Updates" section in review',
175
+ duration_ms: Date.now() - startTime,
176
+ };
177
+ }
178
+ default:
179
+ return null; // Not an artifact check — fall through to shell execution
180
+ }
181
+ }
97
182
  /**
98
183
  * Run multiple checks for a phase.
99
184
  * Accepts either Record<string, string> (legacy) or Record<string, CheckDef>.
@@ -102,10 +187,22 @@ export async function runCheck(name, command, cwd, env, timeoutMs = DEFAULT_TIME
102
187
  * command dispatcher instead of running the protocol.json command directly.
103
188
  * This allows per-project forge configuration while keeping protocol JSON unchanged.
104
189
  */
105
- export async function runPhaseChecks(checks, cwd, env, timeoutMs = DEFAULT_TIMEOUT_MS) {
190
+ export async function runPhaseChecks(checks, cwd, env, timeoutMs = DEFAULT_TIMEOUT_MS, resolver, overriddenChecks) {
106
191
  const results = [];
107
192
  for (const [name, checkVal] of Object.entries(checks)) {
108
193
  const command = typeof checkVal === 'string' ? checkVal : checkVal.command;
194
+ // Try resolver-based check first (handles artifact-dependent checks programmatically).
195
+ // Skip resolver fast-path if the user overrode this check via .codev/config.json —
196
+ // their custom command should run instead.
197
+ if (resolver && !overriddenChecks?.has(name)) {
198
+ const artifactResult = runArtifactCheck(name, command, resolver, env);
199
+ if (artifactResult) {
200
+ results.push(artifactResult);
201
+ if (!artifactResult.passed)
202
+ break;
203
+ continue;
204
+ }
205
+ }
109
206
  const checkCwd = typeof checkVal === 'object' && checkVal.cwd
110
207
  ? path.resolve(cwd, checkVal.cwd)
111
208
  : cwd;
@@ -1 +1 @@
1
- {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE3F,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,4CAA4C;AAC5C,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAYzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,OAAe,EACf,GAAW,EACX,GAAa,EACb,YAAoB,kBAAkB;IAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,yCAAyC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YACnC,GAAG;YACH,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE;gBACH,GAAG,OAAO,CAAC,GAAG;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;aACjC;SACF,CAAC,CAAC;QAEH,iBAAiB;QACjB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE,mBAAmB,SAAS,GAAG,IAAI,GAAG;oBAC7C,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC;oBACN,IAAI;oBACJ,OAAO;oBACP,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;oBACrB,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,aAAa,IAAI,EAAE;oBAC3C,WAAW,EAAE,QAAQ;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC;gBACN,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAAe,EACf,QAA0B,EAC1B,GAAa;IAEb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAE5D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,OAAO,KAAK,IAAI;gBACxB,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;gBAChE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;gBACtD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YACxG,CAAC;YACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS;gBACnD,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B;gBACrD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC;QACJ,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YACxG,CAAC;YACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,KAAK,IAAI,CAAC;gBAClB,MAAM,EAAE,SAAS,KAAK,WAAW;gBACjC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,kCAAkC,CAAC,CAAC,CAAC,SAAS;gBAC9E,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC;QACJ,CAAC;QAED,KAAK,yBAAyB,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YAC1G,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;YACxD,OAAO;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,SAAS;gBAC9D,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qDAAqD;gBAC9E,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC;QACJ,CAAC;QAED,KAAK,4BAA4B,CAAC,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;YAC1G,CAAC;YACD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;YAC3D,OAAO;gBACL,IAAI;gBACJ,OAAO;gBACP,MAAM,EAAE,GAAG;gBACX,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,SAAS;gBACjE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wDAAwD;gBACjF,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACpC,CAAC;QACJ,CAAC;QAED;YACE,OAAO,IAAI,CAAC,CAAC,0DAA0D;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyC,EACzC,GAAW,EACX,GAAa,EACb,YAAoB,kBAAkB,EACtC,QAA2B,EAC3B,gBAA8B;IAE9B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAE3E,uFAAuF;QACvF,mFAAmF;QACnF,2CAA2C;QAC3C,IAAI,QAAQ,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtE,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,IAAI,CAAC,cAAc,CAAC,MAAM;oBAAE,MAAM;gBAClC,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,GAAG;YAC3D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;YACjC,CAAC,CAAC,GAAG,CAAC;QAER,2DAA2D;QAC3D,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,MAAM;YAC1B,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErB,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAClC,IAAY,EACZ,GAAW;IAEX,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,qBAAqB,CAAC;IAEpF,IAAI,CAAC;QACH,0BAA0B;QAC1B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAEjG,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE;YACpD,iBAAiB,EAAE,UAAU,CAAC,IAAI,EAAE;SACrC,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhC,kFAAkF;QAClF,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;QAElG,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,QAAQ;YACjB,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACpC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACvD,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW;YACjC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACjD,CAAC,CAAC,EAAE,CAAC;QAEP,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,uBAAuB;YACvB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -4,42 +4,47 @@
4
4
  * Claude calls porch as a tool; porch returns prescriptive instructions.
5
5
  * All commands produce clear, actionable output.
6
6
  */
7
+ import { type ArtifactResolver } from './artifacts.js';
7
8
  /**
8
9
  * porch status <id>
9
10
  * Shows current state and prescriptive next steps.
10
11
  */
11
- export declare function status(workspaceRoot: string, projectId: string): Promise<void>;
12
+ export declare function status(workspaceRoot: string, projectId: string, resolver?: ArtifactResolver): Promise<void>;
12
13
  /**
13
14
  * porch check <id>
14
15
  * Runs the phase checks and reports results.
15
16
  */
16
- export declare function check(workspaceRoot: string, projectId: string): Promise<void>;
17
+ export declare function check(workspaceRoot: string, projectId: string, resolver?: ArtifactResolver): Promise<void>;
17
18
  /**
18
19
  * porch done <id>
19
20
  * Advances to next phase if checks pass. Refuses if checks fail.
20
21
  */
21
- export declare function done(workspaceRoot: string, projectId: string): Promise<void>;
22
+ export declare function done(workspaceRoot: string, projectId: string, resolver?: ArtifactResolver, options?: {
23
+ pr?: number;
24
+ branch?: string;
25
+ merged?: number;
26
+ }): Promise<void>;
22
27
  /**
23
28
  * porch gate <id>
24
29
  * Requests human approval for current gate.
25
30
  */
26
- export declare function gate(workspaceRoot: string, projectId: string): Promise<void>;
31
+ export declare function gate(workspaceRoot: string, projectId: string, resolver?: ArtifactResolver): Promise<void>;
27
32
  /**
28
33
  * porch approve <id> <gate> --a-human-explicitly-approved-this
29
34
  * Human approves a gate. Requires explicit flag to prevent automated approvals.
30
35
  */
31
- export declare function approve(workspaceRoot: string, projectId: string, gateName: string, hasHumanFlag: boolean): Promise<void>;
36
+ export declare function approve(workspaceRoot: string, projectId: string, gateName: string, hasHumanFlag: boolean, resolver?: ArtifactResolver): Promise<void>;
32
37
  /**
33
38
  * porch rollback <id> <phase>
34
39
  * Rewinds project to an earlier phase, clearing downstream gates and resetting build state.
35
40
  */
36
- export declare function rollback(workspaceRoot: string, projectId: string, targetPhase: string): Promise<void>;
41
+ export declare function rollback(workspaceRoot: string, projectId: string, targetPhase: string, resolver?: ArtifactResolver): Promise<void>;
37
42
  /**
38
43
  * porch init <protocol> <id> <name>
39
44
  * Initialize a new project.
40
45
  *
41
46
  * Idempotent: if status.yaml already exists, preserves it and reports
42
- * current state. This supports `af spawn --resume` where the builder
47
+ * current state. This supports `afx spawn --resume` where the builder
43
48
  * may re-run `porch init` after a session restart.
44
49
  */
45
50
  export declare function init(workspaceRoot: string, protocolName: string, projectId: string, projectName: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2FH;;;GAGG;AACH,wBAAsB,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FpF;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CnF;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIlF;AAqED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDlF;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC,CAmEf;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Ef;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CACxB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AA4DD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqCH,OAAO,EAA8B,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA+EnF;;;GAGG;AACH,wBAAsB,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FjH;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhH;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgL5K;AAsED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD/G;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,OAAO,EACrB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiGf;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA2Ef;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CACxB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Cf;AA4DD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwIvD"}