@cluesmith/codev 3.0.0-rc.0 → 3.0.0-rc.10

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 (331) 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 +8 -0
  6. package/{dashboard/dist/assets/index-nr0cXxtf.css → dashboard-dist/assets/index-Bs8I7N2s.css} +1 -1
  7. package/dashboard-dist/assets/index-CkNo2z6t.js +195 -0
  8. package/dashboard-dist/assets/index-CkNo2z6t.js.map +1 -0
  9. package/dashboard-dist/dist/assets/index-Bs8I7N2s.css +32 -0
  10. package/dashboard-dist/dist/assets/index-CkNo2z6t.js +195 -0
  11. package/dashboard-dist/dist/assets/index-CkNo2z6t.js.map +1 -0
  12. package/{dashboard → dashboard-dist}/dist/index.html +2 -2
  13. package/dashboard-dist/index.html +14 -0
  14. package/dist/agent-farm/cli.d.ts.map +1 -1
  15. package/dist/agent-farm/cli.js +21 -13
  16. package/dist/agent-farm/cli.js.map +1 -1
  17. package/dist/agent-farm/commands/architect.d.ts +4 -4
  18. package/dist/agent-farm/commands/architect.d.ts.map +1 -1
  19. package/dist/agent-farm/commands/architect.js +23 -12
  20. package/dist/agent-farm/commands/architect.js.map +1 -1
  21. package/dist/agent-farm/commands/attach.js +8 -8
  22. package/dist/agent-farm/commands/attach.js.map +1 -1
  23. package/dist/agent-farm/commands/bench.d.ts +1 -1
  24. package/dist/agent-farm/commands/bench.js +1 -1
  25. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  26. package/dist/agent-farm/commands/cleanup.js +10 -5
  27. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  28. package/dist/agent-farm/commands/cron.js +1 -1
  29. package/dist/agent-farm/commands/cron.js.map +1 -1
  30. package/dist/agent-farm/commands/db.d.ts +3 -3
  31. package/dist/agent-farm/commands/db.js +4 -4
  32. package/dist/agent-farm/commands/db.js.map +1 -1
  33. package/dist/agent-farm/commands/open.js +2 -2
  34. package/dist/agent-farm/commands/open.js.map +1 -1
  35. package/dist/agent-farm/commands/rename.js +1 -1
  36. package/dist/agent-farm/commands/rename.js.map +1 -1
  37. package/dist/agent-farm/commands/send.d.ts +4 -1
  38. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  39. package/dist/agent-farm/commands/send.js +8 -5
  40. package/dist/agent-farm/commands/send.js.map +1 -1
  41. package/dist/agent-farm/commands/shell.js +3 -3
  42. package/dist/agent-farm/commands/shell.js.map +1 -1
  43. package/dist/agent-farm/commands/spawn-roles.d.ts +2 -1
  44. package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
  45. package/dist/agent-farm/commands/spawn-roles.js +1 -1
  46. package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
  47. package/dist/agent-farm/commands/spawn-worktree.d.ts +49 -10
  48. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  49. package/dist/agent-farm/commands/spawn-worktree.js +357 -49
  50. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  51. package/dist/agent-farm/commands/spawn.d.ts +6 -6
  52. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  53. package/dist/agent-farm/commands/spawn.js +182 -74
  54. package/dist/agent-farm/commands/spawn.js.map +1 -1
  55. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  56. package/dist/agent-farm/commands/status.js +48 -3
  57. package/dist/agent-farm/commands/status.js.map +1 -1
  58. package/dist/agent-farm/commands/team-update.d.ts +1 -1
  59. package/dist/agent-farm/commands/team-update.d.ts.map +1 -1
  60. package/dist/agent-farm/commands/team-update.js +8 -5
  61. package/dist/agent-farm/commands/team-update.js.map +1 -1
  62. package/dist/agent-farm/commands/team.d.ts +7 -1
  63. package/dist/agent-farm/commands/team.d.ts.map +1 -1
  64. package/dist/agent-farm/commands/team.js +36 -4
  65. package/dist/agent-farm/commands/team.js.map +1 -1
  66. package/dist/agent-farm/commands/tower-cloud.d.ts +2 -2
  67. package/dist/agent-farm/commands/tower-cloud.js +3 -3
  68. package/dist/agent-farm/commands/tower-cloud.js.map +1 -1
  69. package/dist/agent-farm/commands/tower.d.ts +1 -0
  70. package/dist/agent-farm/commands/tower.d.ts.map +1 -1
  71. package/dist/agent-farm/commands/tower.js +54 -3
  72. package/dist/agent-farm/commands/tower.js.map +1 -1
  73. package/dist/agent-farm/lib/cloud-config.js +2 -2
  74. package/dist/agent-farm/lib/cloud-config.js.map +1 -1
  75. package/dist/agent-farm/lib/tower-client.d.ts +6 -230
  76. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  77. package/dist/agent-farm/lib/tower-client.js +6 -293
  78. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  79. package/dist/agent-farm/lib/tunnel-client.js +1 -1
  80. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  81. package/dist/agent-farm/servers/message-write.d.ts +24 -0
  82. package/dist/agent-farm/servers/message-write.d.ts.map +1 -0
  83. package/dist/agent-farm/servers/message-write.js +63 -0
  84. package/dist/agent-farm/servers/message-write.js.map +1 -0
  85. package/dist/agent-farm/servers/overview.d.ts +10 -8
  86. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  87. package/dist/agent-farm/servers/overview.js +78 -38
  88. package/dist/agent-farm/servers/overview.js.map +1 -1
  89. package/dist/agent-farm/servers/send-buffer.d.ts +4 -3
  90. package/dist/agent-farm/servers/send-buffer.d.ts.map +1 -1
  91. package/dist/agent-farm/servers/send-buffer.js +7 -4
  92. package/dist/agent-farm/servers/send-buffer.js.map +1 -1
  93. package/dist/agent-farm/servers/tower-cron-parser.js +1 -1
  94. package/dist/agent-farm/servers/tower-cron-parser.js.map +1 -1
  95. package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
  96. package/dist/agent-farm/servers/tower-cron.js +4 -5
  97. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  98. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  99. package/dist/agent-farm/servers/tower-instances.js +24 -15
  100. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  101. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  102. package/dist/agent-farm/servers/tower-routes.js +9 -16
  103. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  104. package/dist/agent-farm/servers/tower-server.js +15 -1
  105. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  106. package/dist/agent-farm/servers/tower-terminals.d.ts +2 -2
  107. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  108. package/dist/agent-farm/servers/tower-terminals.js +64 -36
  109. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  110. package/dist/agent-farm/servers/tower-tunnel.js +2 -2
  111. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  112. package/dist/agent-farm/servers/tower-utils.d.ts +9 -6
  113. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  114. package/dist/agent-farm/servers/tower-utils.js +13 -7
  115. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  116. package/dist/agent-farm/types.d.ts +13 -0
  117. package/dist/agent-farm/types.d.ts.map +1 -1
  118. package/dist/agent-farm/utils/config.d.ts +11 -0
  119. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  120. package/dist/agent-farm/utils/config.js +39 -17
  121. package/dist/agent-farm/utils/config.js.map +1 -1
  122. package/dist/agent-farm/utils/harness.d.ts +85 -0
  123. package/dist/agent-farm/utils/harness.d.ts.map +1 -0
  124. package/dist/agent-farm/utils/harness.js +212 -0
  125. package/dist/agent-farm/utils/harness.js.map +1 -0
  126. package/dist/agent-farm/utils/roles.d.ts +11 -4
  127. package/dist/agent-farm/utils/roles.d.ts.map +1 -1
  128. package/dist/agent-farm/utils/roles.js +21 -6
  129. package/dist/agent-farm/utils/roles.js.map +1 -1
  130. package/dist/cli.d.ts +1 -1
  131. package/dist/cli.d.ts.map +1 -1
  132. package/dist/cli.js +118 -5
  133. package/dist/cli.js.map +1 -1
  134. package/dist/commands/adopt.d.ts.map +1 -1
  135. package/dist/commands/adopt.js +16 -45
  136. package/dist/commands/adopt.js.map +1 -1
  137. package/dist/commands/consult/index.d.ts +6 -2
  138. package/dist/commands/consult/index.d.ts.map +1 -1
  139. package/dist/commands/consult/index.js +231 -183
  140. package/dist/commands/consult/index.js.map +1 -1
  141. package/dist/commands/doctor.d.ts.map +1 -1
  142. package/dist/commands/doctor.js +121 -31
  143. package/dist/commands/doctor.js.map +1 -1
  144. package/dist/commands/init.d.ts.map +1 -1
  145. package/dist/commands/init.js +13 -43
  146. package/dist/commands/init.js.map +1 -1
  147. package/dist/commands/porch/artifacts.d.ts +69 -0
  148. package/dist/commands/porch/artifacts.d.ts.map +1 -0
  149. package/dist/commands/porch/artifacts.js +368 -0
  150. package/dist/commands/porch/artifacts.js.map +1 -0
  151. package/dist/commands/porch/checks.d.ts +14 -3
  152. package/dist/commands/porch/checks.d.ts.map +1 -1
  153. package/dist/commands/porch/checks.js +150 -4
  154. package/dist/commands/porch/checks.js.map +1 -1
  155. package/dist/commands/porch/config.d.ts +6 -9
  156. package/dist/commands/porch/config.d.ts.map +1 -1
  157. package/dist/commands/porch/config.js +12 -37
  158. package/dist/commands/porch/config.js.map +1 -1
  159. package/dist/commands/porch/index.d.ts +12 -7
  160. package/dist/commands/porch/index.d.ts.map +1 -1
  161. package/dist/commands/porch/index.js +273 -82
  162. package/dist/commands/porch/index.js.map +1 -1
  163. package/dist/commands/porch/next.d.ts.map +1 -1
  164. package/dist/commands/porch/next.js +142 -75
  165. package/dist/commands/porch/next.js.map +1 -1
  166. package/dist/commands/porch/notify.d.ts +2 -2
  167. package/dist/commands/porch/notify.js +5 -5
  168. package/dist/commands/porch/notify.js.map +1 -1
  169. package/dist/commands/porch/prompts.d.ts +2 -1
  170. package/dist/commands/porch/prompts.d.ts.map +1 -1
  171. package/dist/commands/porch/prompts.js +34 -38
  172. package/dist/commands/porch/prompts.js.map +1 -1
  173. package/dist/commands/porch/protocol.d.ts +4 -3
  174. package/dist/commands/porch/protocol.d.ts.map +1 -1
  175. package/dist/commands/porch/protocol.js +21 -21
  176. package/dist/commands/porch/protocol.js.map +1 -1
  177. package/dist/commands/porch/state.d.ts +27 -2
  178. package/dist/commands/porch/state.d.ts.map +1 -1
  179. package/dist/commands/porch/state.js +100 -9
  180. package/dist/commands/porch/state.js.map +1 -1
  181. package/dist/commands/porch/types.d.ts +10 -2
  182. package/dist/commands/porch/types.d.ts.map +1 -1
  183. package/dist/commands/sync.d.ts +26 -0
  184. package/dist/commands/sync.d.ts.map +1 -0
  185. package/dist/commands/sync.js +207 -0
  186. package/dist/commands/sync.js.map +1 -0
  187. package/dist/commands/update.d.ts +15 -2
  188. package/dist/commands/update.d.ts.map +1 -1
  189. package/dist/commands/update.js +159 -202
  190. package/dist/commands/update.js.map +1 -1
  191. package/dist/lib/config.d.ts +96 -0
  192. package/dist/lib/config.d.ts.map +1 -0
  193. package/dist/lib/config.js +165 -0
  194. package/dist/lib/config.js.map +1 -0
  195. package/dist/lib/forge-contracts.d.ts +100 -0
  196. package/dist/lib/forge-contracts.d.ts.map +1 -0
  197. package/dist/lib/forge-contracts.js +35 -0
  198. package/dist/lib/forge-contracts.js.map +1 -0
  199. package/dist/lib/forge.d.ts +102 -0
  200. package/dist/lib/forge.d.ts.map +1 -0
  201. package/dist/lib/forge.js +376 -0
  202. package/dist/lib/forge.js.map +1 -0
  203. package/dist/lib/github.d.ts +68 -60
  204. package/dist/lib/github.d.ts.map +1 -1
  205. package/dist/lib/github.js +160 -169
  206. package/dist/lib/github.js.map +1 -1
  207. package/dist/lib/skeleton.d.ts +15 -5
  208. package/dist/lib/skeleton.d.ts.map +1 -1
  209. package/dist/lib/skeleton.js +82 -7
  210. package/dist/lib/skeleton.js.map +1 -1
  211. package/dist/lib/team-github.d.ts +7 -3
  212. package/dist/lib/team-github.d.ts.map +1 -1
  213. package/dist/lib/team-github.js +29 -19
  214. package/dist/lib/team-github.js.map +1 -1
  215. package/dist/lib/team.d.ts.map +1 -1
  216. package/dist/lib/team.js +4 -1
  217. package/dist/lib/team.js.map +1 -1
  218. package/dist/terminal/pty-manager.d.ts.map +1 -1
  219. package/dist/terminal/pty-manager.js +2 -0
  220. package/dist/terminal/pty-manager.js.map +1 -1
  221. package/dist/terminal/ws-protocol.d.ts +10 -8
  222. package/dist/terminal/ws-protocol.d.ts.map +1 -1
  223. package/dist/terminal/ws-protocol.js +3 -0
  224. package/dist/terminal/ws-protocol.js.map +1 -1
  225. package/package.json +28 -24
  226. package/scripts/forge/gitea/auth-status.sh +3 -0
  227. package/scripts/forge/gitea/issue-comment.sh +3 -0
  228. package/scripts/forge/gitea/issue-list.sh +3 -0
  229. package/scripts/forge/gitea/issue-view.sh +3 -0
  230. package/scripts/forge/gitea/pr-exists.sh +6 -0
  231. package/scripts/forge/gitea/pr-list.sh +3 -0
  232. package/scripts/forge/gitea/pr-merge.sh +3 -0
  233. package/scripts/forge/gitea/pr-view.sh +3 -0
  234. package/scripts/forge/gitea/recently-closed.sh +3 -0
  235. package/scripts/forge/gitea/recently-merged.sh +3 -0
  236. package/scripts/forge/gitea/repo-archive.sh +11 -0
  237. package/scripts/forge/gitea/user-identity.sh +3 -0
  238. package/scripts/forge/github/auth-status.sh +4 -0
  239. package/scripts/forge/github/issue-comment.sh +5 -0
  240. package/scripts/forge/github/issue-list.sh +4 -0
  241. package/scripts/forge/github/issue-view.sh +5 -0
  242. package/scripts/forge/github/on-it-timestamps.sh +8 -0
  243. package/scripts/forge/github/pr-diff.sh +10 -0
  244. package/scripts/forge/github/pr-exists.sh +7 -0
  245. package/scripts/forge/github/pr-list.sh +4 -0
  246. package/scripts/forge/github/pr-merge.sh +5 -0
  247. package/scripts/forge/github/pr-search.sh +5 -0
  248. package/scripts/forge/github/pr-view.sh +11 -0
  249. package/scripts/forge/github/recently-closed.sh +15 -0
  250. package/scripts/forge/github/recently-merged.sh +15 -0
  251. package/scripts/forge/github/repo-archive.sh +10 -0
  252. package/scripts/forge/github/team-activity.sh +5 -0
  253. package/scripts/forge/github/user-identity.sh +4 -0
  254. package/scripts/forge/gitlab/auth-status.sh +3 -0
  255. package/scripts/forge/gitlab/issue-comment.sh +3 -0
  256. package/scripts/forge/gitlab/issue-list.sh +3 -0
  257. package/scripts/forge/gitlab/issue-view.sh +3 -0
  258. package/scripts/forge/gitlab/pr-diff.sh +3 -0
  259. package/scripts/forge/gitlab/pr-exists.sh +5 -0
  260. package/scripts/forge/gitlab/pr-list.sh +3 -0
  261. package/scripts/forge/gitlab/pr-merge.sh +3 -0
  262. package/scripts/forge/gitlab/pr-search.sh +3 -0
  263. package/scripts/forge/gitlab/pr-view.sh +3 -0
  264. package/scripts/forge/gitlab/recently-closed.sh +3 -0
  265. package/scripts/forge/gitlab/recently-merged.sh +3 -0
  266. package/scripts/forge/gitlab/repo-archive.sh +12 -0
  267. package/scripts/forge/gitlab/user-identity.sh +3 -0
  268. package/skeleton/.claude/skills/afx/SKILL.md +144 -0
  269. package/skeleton/.claude/skills/codev/SKILL.md +3 -3
  270. package/skeleton/.claude/skills/consult/SKILL.md +1 -1
  271. package/skeleton/.claude/skills/porch/SKILL.md +2 -2
  272. package/skeleton/DEPENDENCIES.md +1 -1
  273. package/skeleton/builders.md +4 -4
  274. package/skeleton/protocol-schema.json +2 -2
  275. package/skeleton/protocols/air/builder-prompt.md +6 -6
  276. package/skeleton/protocols/air/prompts/pr.md +2 -2
  277. package/skeleton/protocols/air/protocol.md +1 -2
  278. package/skeleton/protocols/aspir/builder-prompt.md +28 -6
  279. package/skeleton/protocols/aspir/protocol.json +9 -1
  280. package/skeleton/protocols/aspir/protocol.md +1 -1
  281. package/skeleton/protocols/aspir/templates/plan.md +0 -20
  282. package/skeleton/protocols/aspir/templates/spec.md +0 -28
  283. package/skeleton/protocols/bugfix/builder-prompt.md +6 -6
  284. package/skeleton/protocols/bugfix/prompts/pr.md +1 -1
  285. package/skeleton/protocols/experiment/protocol.md +1 -6
  286. package/skeleton/protocols/maintain/builder-prompt.md +12 -11
  287. package/skeleton/protocols/maintain/prompts/maintain.md +88 -0
  288. package/skeleton/protocols/maintain/prompts/review.md +72 -0
  289. package/skeleton/protocols/maintain/protocol.json +14 -68
  290. package/skeleton/protocols/maintain/protocol.md +111 -409
  291. package/skeleton/protocols/maintain/templates/maintenance-run.md +18 -49
  292. package/skeleton/protocols/protocol-schema.json +1 -1
  293. package/skeleton/protocols/spike/builder-prompt.md +1 -1
  294. package/skeleton/protocols/spike/protocol.md +4 -4
  295. package/skeleton/protocols/spir/builder-prompt.md +28 -5
  296. package/skeleton/protocols/spir/protocol.json +9 -1
  297. package/skeleton/protocols/spir/protocol.md +2 -2
  298. package/skeleton/protocols/spir/templates/plan.md +0 -20
  299. package/skeleton/protocols/spir/templates/spec.md +0 -28
  300. package/skeleton/resources/commands/agent-farm.md +84 -84
  301. package/skeleton/resources/commands/codev.md +1 -1
  302. package/skeleton/resources/commands/consult.md +16 -7
  303. package/skeleton/resources/commands/overview.md +14 -15
  304. package/skeleton/resources/risk-triage.md +1 -1
  305. package/skeleton/resources/workflow-reference.md +14 -14
  306. package/skeleton/roles/architect.md +55 -43
  307. package/skeleton/roles/builder.md +22 -14
  308. package/skeleton/templates/AGENTS.md +4 -3
  309. package/skeleton/templates/CLAUDE.md +4 -3
  310. package/skeleton/templates/cheatsheet.md +11 -12
  311. package/templates/3d-viewer.html +16 -18
  312. package/templates/tower.html +1 -1
  313. package/dashboard/dist/assets/index-CiIBsixF.js +0 -194
  314. package/dashboard/dist/assets/index-CiIBsixF.js.map +0 -1
  315. package/skeleton/.claude/skills/af/SKILL.md +0 -146
  316. package/skeleton/porch/prompts/understand.md +0 -61
  317. package/skeleton/porch/prompts/verify.md +0 -58
  318. package/skeleton/protocols/maintain/prompts/audit.md +0 -111
  319. package/skeleton/protocols/maintain/prompts/clean.md +0 -91
  320. package/skeleton/protocols/maintain/prompts/sync.md +0 -113
  321. package/skeleton/protocols/maintain/prompts/verify.md +0 -110
  322. package/skeleton/protocols/tick/builder-prompt.md +0 -65
  323. package/skeleton/protocols/tick/consult-types/impl-review.md +0 -72
  324. package/skeleton/protocols/tick/consult-types/plan-review.md +0 -59
  325. package/skeleton/protocols/tick/consult-types/pr-review.md +0 -72
  326. package/skeleton/protocols/tick/consult-types/spec-review.md +0 -55
  327. package/skeleton/protocols/tick/protocol.json +0 -151
  328. package/skeleton/protocols/tick/protocol.md +0 -277
  329. package/skeleton/protocols/tick/templates/plan.md +0 -67
  330. package/skeleton/protocols/tick/templates/review.md +0 -89
  331. package/skeleton/protocols/tick/templates/spec.md +0 -61
@@ -0,0 +1,69 @@
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
+ export interface ArtifactResolver {
11
+ /** Find spec basename by numeric ID (e.g., "0559-porch-artifact-resolver") */
12
+ findSpecBaseName(projectId: string, title: string): string | null;
13
+ /** Get full content of a spec by project ID */
14
+ getSpecContent(projectId: string, title: string): string | null;
15
+ /** Get full content of a plan by project ID */
16
+ getPlanContent(projectId: string, title: string): string | null;
17
+ /** Get full content of a review by project ID */
18
+ getReviewContent(projectId: string, title: string): string | null;
19
+ /** Check if a spec/plan has pre-approval frontmatter */
20
+ hasPreApproval(artifactGlob: string): boolean;
21
+ }
22
+ /**
23
+ * Check if artifact content has pre-approval frontmatter.
24
+ * Looks for YAML frontmatter with `approved:` and `validated:` fields.
25
+ * Used by both LocalResolver and CliResolver for consistency.
26
+ */
27
+ export declare function isPreApprovedContent(content: string): boolean;
28
+ export declare class LocalResolver implements ArtifactResolver {
29
+ private workspaceRoot;
30
+ constructor(workspaceRoot: string);
31
+ findSpecBaseName(projectId: string, _title: string): string | null;
32
+ getSpecContent(projectId: string, title: string): string | null;
33
+ getPlanContent(projectId: string, title: string): string | null;
34
+ getReviewContent(projectId: string, _title: string): string | null;
35
+ hasPreApproval(artifactGlob: string): boolean;
36
+ }
37
+ export declare class CliResolver implements ArtifactResolver {
38
+ private scope;
39
+ private command;
40
+ private cache;
41
+ private extraEnv;
42
+ constructor(scope: string, command: string, workspaceRoot?: string);
43
+ findSpecBaseName(projectId: string, _title: string): string | null;
44
+ getSpecContent(projectId: string, _title: string): string | null;
45
+ getPlanContent(projectId: string, _title: string): string | null;
46
+ getReviewContent(projectId: string, _title: string): string | null;
47
+ hasPreApproval(artifactGlob: string): boolean;
48
+ private findPlanBaseName;
49
+ private findReviewBaseName;
50
+ private listChildren;
51
+ private getContent;
52
+ private handleError;
53
+ }
54
+ /**
55
+ * Create the appropriate artifact resolver for this workspace.
56
+ * Reads config via loadConfig() (v3.0.0 unified config — .codev/config.json).
57
+ *
58
+ * @param workspaceRoot - The top-level workspace (where .codev/config.json lives).
59
+ * Always used to load config; also used as the .env source
60
+ * for the CLI backend.
61
+ * @param artifactRoot - Optional override for where the local backend reads
62
+ * specs/plans/reviews from. When the project lives in a
63
+ * builder worktree (`.builders/<slug>/`), pass that
64
+ * worktree's root so artifact lookups find files there
65
+ * instead of the top-level `codev/` directory (bugfix #676).
66
+ * Defaults to workspaceRoot.
67
+ */
68
+ export declare function getResolver(workspaceRoot: string, artifactRoot?: string): ArtifactResolver;
69
+ //# sourceMappingURL=artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAElE,+CAA+C;IAC/C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEhE,+CAA+C;IAC/C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEhE,iDAAiD;IACjD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAElE,wDAAwD;IACxD,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/C;AAMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS7D;AAMD,qBAAa,aAAc,YAAW,gBAAgB;IACxC,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,MAAM;IAEzC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmBlE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAW/D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA0C/D,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAqBlE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;CAY9C;AAUD,qBAAa,WAAY,YAAW,gBAAgB;IAKhD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAyB;gBAG/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACvB,aAAa,CAAC,EAAE,MAAM;IAkBxB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAalE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMhE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMhE,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMlE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IA0B7C,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,WAAW;CAgBpB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,gBAAgB,CA4B1F"}
@@ -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":"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"}
@@ -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;
@@ -15,10 +16,20 @@ export interface CheckEnv {
15
16
  */
16
17
  export declare function runCheck(name: string, command: string, cwd: string, env: CheckEnv, timeoutMs?: number): Promise<CheckResult>;
17
18
  /**
18
- * Run multiple checks for a phase
19
- * Accepts either Record<string, string> (legacy) or Record<string, CheckDef>
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).
20
22
  */
21
- export declare function runPhaseChecks(checks: Record<string, string | CheckDef>, cwd: string, env: CheckEnv, timeoutMs?: number): Promise<CheckResult[]>;
23
+ export declare function runArtifactCheck(name: string, command: string, resolver: ArtifactResolver, env: CheckEnv): CheckResult | null;
24
+ /**
25
+ * Run multiple checks for a phase.
26
+ * Accepts either Record<string, string> (legacy) or Record<string, CheckDef>.
27
+ *
28
+ * Special handling: `pr_exists` checks are routed through the forge concept
29
+ * command dispatcher instead of running the protocol.json command directly.
30
+ * This allows per-project forge configuration while keeping protocol JSON unchanged.
31
+ */
32
+ export declare function runPhaseChecks(checks: Record<string, string | CheckDef>, cwd: string, env: CheckEnv, timeoutMs?: number, resolver?: ArtifactResolver, overriddenChecks?: Set<string>): Promise<CheckResult[]>;
22
33
  /**
23
34
  * Format check results for terminal output
24
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AASxD,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;;;GAGG;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,CAkBxB;AAMD;;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"}