codebyplan 1.13.65 → 1.13.67

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 (300) hide show
  1. package/README.md +118 -75
  2. package/dist/__tests__/helpers.d.ts +22 -0
  3. package/dist/__tests__/helpers.d.ts.map +1 -0
  4. package/dist/ci-public.d.ts +20 -0
  5. package/dist/ci-public.d.ts.map +1 -0
  6. package/dist/ci.js +11 -2
  7. package/dist/cli/arch-map.d.ts +33 -0
  8. package/dist/cli/arch-map.d.ts.map +1 -0
  9. package/dist/cli/branch.d.ts +10 -0
  10. package/dist/cli/branch.d.ts.map +1 -0
  11. package/dist/cli/bump.d.ts +12 -0
  12. package/dist/cli/bump.d.ts.map +1 -0
  13. package/dist/cli/cd.d.ts +20 -0
  14. package/dist/cli/cd.d.ts.map +1 -0
  15. package/dist/cli/check.d.ts +30 -0
  16. package/dist/cli/check.d.ts.map +1 -0
  17. package/dist/cli/checkpoint.d.ts +17 -0
  18. package/dist/cli/checkpoint.d.ts.map +1 -0
  19. package/dist/cli/ci.d.ts +31 -0
  20. package/dist/cli/ci.d.ts.map +1 -0
  21. package/dist/cli/claude/__test-helpers__/expect-manifest.d.ts +7 -0
  22. package/dist/cli/claude/__test-helpers__/expect-manifest.d.ts.map +1 -0
  23. package/dist/cli/claude/__test-helpers__/tmp-fixture.d.ts +64 -0
  24. package/dist/cli/claude/__test-helpers__/tmp-fixture.d.ts.map +1 -0
  25. package/dist/cli/claude/audit-mode.d.ts +16 -0
  26. package/dist/cli/claude/audit-mode.d.ts.map +1 -0
  27. package/dist/cli/claude/generate.d.ts +23 -0
  28. package/dist/cli/claude/generate.d.ts.map +1 -0
  29. package/dist/cli/claude/install.d.ts +55 -0
  30. package/dist/cli/claude/install.d.ts.map +1 -0
  31. package/dist/cli/claude/migrate-memory.d.ts +117 -0
  32. package/dist/cli/claude/migrate-memory.d.ts.map +1 -0
  33. package/dist/cli/claude/readme.d.ts +28 -0
  34. package/dist/cli/claude/readme.d.ts.map +1 -0
  35. package/dist/cli/claude/status.d.ts +41 -0
  36. package/dist/cli/claude/status.d.ts.map +1 -0
  37. package/dist/cli/claude/uninstall.d.ts +21 -0
  38. package/dist/cli/claude/uninstall.d.ts.map +1 -0
  39. package/dist/cli/claude/update.d.ts +25 -0
  40. package/dist/cli/claude/update.d.ts.map +1 -0
  41. package/dist/cli/claude/verify-parity.d.ts +25 -0
  42. package/dist/cli/claude/verify-parity.d.ts.map +1 -0
  43. package/dist/cli/cleanup-plan-folders.d.ts +21 -0
  44. package/dist/cli/cleanup-plan-folders.d.ts.map +1 -0
  45. package/dist/cli/commit.d.ts +25 -0
  46. package/dist/cli/commit.d.ts.map +1 -0
  47. package/dist/cli/config.d.ts +50 -0
  48. package/dist/cli/config.d.ts.map +1 -0
  49. package/dist/cli/confirm.d.ts +9 -0
  50. package/dist/cli/confirm.d.ts.map +1 -0
  51. package/dist/cli/create-org.d.ts +9 -0
  52. package/dist/cli/create-org.d.ts.map +1 -0
  53. package/dist/cli/create-project.d.ts +10 -0
  54. package/dist/cli/create-project.d.ts.map +1 -0
  55. package/dist/cli/create-repo.d.ts +14 -0
  56. package/dist/cli/create-repo.d.ts.map +1 -0
  57. package/dist/cli/docs.d.ts +41 -0
  58. package/dist/cli/docs.d.ts.map +1 -0
  59. package/dist/cli/doctor.d.ts +17 -0
  60. package/dist/cli/doctor.d.ts.map +1 -0
  61. package/dist/cli/e2e/verify-round.d.ts +46 -0
  62. package/dist/cli/e2e/verify-round.d.ts.map +1 -0
  63. package/dist/cli/e2e.d.ts +11 -0
  64. package/dist/cli/e2e.d.ts.map +1 -0
  65. package/dist/cli/eslint.d.ts +20 -0
  66. package/dist/cli/eslint.d.ts.map +1 -0
  67. package/dist/cli/export-writer.d.ts +99 -0
  68. package/dist/cli/export-writer.d.ts.map +1 -0
  69. package/dist/cli/handoff.d.ts +13 -0
  70. package/dist/cli/handoff.d.ts.map +1 -0
  71. package/dist/cli/login.d.ts +10 -0
  72. package/dist/cli/login.d.ts.map +1 -0
  73. package/dist/cli/logout.d.ts +2 -0
  74. package/dist/cli/logout.d.ts.map +1 -0
  75. package/dist/cli/lsp.d.ts +16 -0
  76. package/dist/cli/lsp.d.ts.map +1 -0
  77. package/dist/cli/migration-collisions.d.ts +10 -0
  78. package/dist/cli/migration-collisions.d.ts.map +1 -0
  79. package/dist/cli/ports.d.ts +29 -0
  80. package/dist/cli/ports.d.ts.map +1 -0
  81. package/dist/cli/process-exit-signal.d.ts +24 -0
  82. package/dist/cli/process-exit-signal.d.ts.map +1 -0
  83. package/dist/cli/round.d.ts +79 -0
  84. package/dist/cli/round.d.ts.map +1 -0
  85. package/dist/cli/scaffold-publish-workflow.d.ts +16 -0
  86. package/dist/cli/scaffold-publish-workflow.d.ts.map +1 -0
  87. package/dist/cli/session/freshness-gate.d.ts +21 -0
  88. package/dist/cli/session/freshness-gate.d.ts.map +1 -0
  89. package/dist/cli/session/home-ff.d.ts +16 -0
  90. package/dist/cli/session/home-ff.d.ts.map +1 -0
  91. package/dist/cli/session/infra-files.d.ts +21 -0
  92. package/dist/cli/session/infra-files.d.ts.map +1 -0
  93. package/dist/cli/session/start.d.ts +70 -0
  94. package/dist/cli/session/start.d.ts.map +1 -0
  95. package/dist/cli/session.d.ts +17 -0
  96. package/dist/cli/session.d.ts.map +1 -0
  97. package/dist/cli/setup.d.ts +2 -0
  98. package/dist/cli/setup.d.ts.map +1 -0
  99. package/dist/cli/ship.d.ts +16 -0
  100. package/dist/cli/ship.d.ts.map +1 -0
  101. package/dist/cli/slug.d.ts +10 -0
  102. package/dist/cli/slug.d.ts.map +1 -0
  103. package/dist/cli/standalone-task.d.ts +31 -0
  104. package/dist/cli/standalone-task.d.ts.map +1 -0
  105. package/dist/cli/statusline.d.ts +10 -0
  106. package/dist/cli/statusline.d.ts.map +1 -0
  107. package/dist/cli/supabase/new-migration.d.ts +24 -0
  108. package/dist/cli/supabase/new-migration.d.ts.map +1 -0
  109. package/dist/cli/supabase/preview-check.d.ts +30 -0
  110. package/dist/cli/supabase/preview-check.d.ts.map +1 -0
  111. package/dist/cli/supabase/resolve-preview.d.ts +19 -0
  112. package/dist/cli/supabase/resolve-preview.d.ts.map +1 -0
  113. package/dist/cli/supabase/teardown-preview.d.ts +22 -0
  114. package/dist/cli/supabase/teardown-preview.d.ts.map +1 -0
  115. package/dist/cli/sync.d.ts +13 -0
  116. package/dist/cli/sync.d.ts.map +1 -0
  117. package/dist/cli/task.d.ts +17 -0
  118. package/dist/cli/task.d.ts.map +1 -0
  119. package/dist/cli/tech-stack.d.ts +11 -0
  120. package/dist/cli/tech-stack.d.ts.map +1 -0
  121. package/dist/cli/upgrade-auth.d.ts +2 -0
  122. package/dist/cli/upgrade-auth.d.ts.map +1 -0
  123. package/dist/cli/upload-e2e-images.d.ts +18 -0
  124. package/dist/cli/upload-e2e-images.d.ts.map +1 -0
  125. package/dist/cli/validate-waves.d.ts +22 -0
  126. package/dist/cli/validate-waves.d.ts.map +1 -0
  127. package/dist/cli/version-status.d.ts +42 -0
  128. package/dist/cli/version-status.d.ts.map +1 -0
  129. package/dist/cli/watch.d.ts +18 -0
  130. package/dist/cli/watch.d.ts.map +1 -0
  131. package/dist/cli/whoami.d.ts +5 -0
  132. package/dist/cli/whoami.d.ts.map +1 -0
  133. package/dist/cli/worktree/add.d.ts +81 -0
  134. package/dist/cli/worktree/add.d.ts.map +1 -0
  135. package/dist/cli/worktree/create.d.ts +46 -0
  136. package/dist/cli/worktree/create.d.ts.map +1 -0
  137. package/dist/cli/worktree/path.d.ts +19 -0
  138. package/dist/cli/worktree/path.d.ts.map +1 -0
  139. package/dist/cli/worktree/remove.d.ts +92 -0
  140. package/dist/cli/worktree/remove.d.ts.map +1 -0
  141. package/dist/cli/worktree.d.ts +15 -0
  142. package/dist/cli/worktree.d.ts.map +1 -0
  143. package/dist/cli.js +5697 -5322
  144. package/dist/dispatch.d.ts +64 -0
  145. package/dist/dispatch.d.ts.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/lib/agents-generator.d.ts +42 -0
  149. package/dist/lib/agents-generator.d.ts.map +1 -0
  150. package/dist/lib/api.d.ts +54 -0
  151. package/dist/lib/api.d.ts.map +1 -0
  152. package/dist/lib/atomic-write.d.ts +27 -0
  153. package/dist/lib/atomic-write.d.ts.map +1 -0
  154. package/dist/lib/branch-checkout.d.ts +47 -0
  155. package/dist/lib/branch-checkout.d.ts.map +1 -0
  156. package/dist/lib/branch-port-resolver.d.ts +58 -0
  157. package/dist/lib/branch-port-resolver.d.ts.map +1 -0
  158. package/dist/lib/bump.d.ts +97 -0
  159. package/dist/lib/bump.d.ts.map +1 -0
  160. package/dist/lib/cd-init.d.ts +86 -0
  161. package/dist/lib/cd-init.d.ts.map +1 -0
  162. package/dist/lib/check-baseline.d.ts +91 -0
  163. package/dist/lib/check-baseline.d.ts.map +1 -0
  164. package/dist/lib/check.d.ts +178 -0
  165. package/dist/lib/check.d.ts.map +1 -0
  166. package/dist/lib/ci-init.d.ts +106 -0
  167. package/dist/lib/ci-init.d.ts.map +1 -0
  168. package/dist/lib/ci-resolve.d.ts +60 -0
  169. package/dist/lib/ci-resolve.d.ts.map +1 -0
  170. package/dist/lib/claude-mode-audit.d.ts +41 -0
  171. package/dist/lib/claude-mode-audit.d.ts.map +1 -0
  172. package/dist/lib/claude-plan.d.ts +34 -0
  173. package/dist/lib/claude-plan.d.ts.map +1 -0
  174. package/dist/lib/commit-scope.d.ts +21 -0
  175. package/dist/lib/commit-scope.d.ts.map +1 -0
  176. package/dist/lib/e2e.d.ts +157 -0
  177. package/dist/lib/e2e.d.ts.map +1 -0
  178. package/dist/lib/eslint-generator.d.ts +86 -0
  179. package/dist/lib/eslint-generator.d.ts.map +1 -0
  180. package/dist/lib/file-lock.d.ts +44 -0
  181. package/dist/lib/file-lock.d.ts.map +1 -0
  182. package/dist/lib/flags.d.ts +115 -0
  183. package/dist/lib/flags.d.ts.map +1 -0
  184. package/dist/lib/gh-required-checks.d.ts +76 -0
  185. package/dist/lib/gh-required-checks.d.ts.map +1 -0
  186. package/dist/lib/git-utils.d.ts +46 -0
  187. package/dist/lib/git-utils.d.ts.map +1 -0
  188. package/dist/lib/gitignore-block.d.ts +32 -0
  189. package/dist/lib/gitignore-block.d.ts.map +1 -0
  190. package/dist/lib/gitignore-detect.d.ts +117 -0
  191. package/dist/lib/gitignore-detect.d.ts.map +1 -0
  192. package/dist/lib/handoff-file.d.ts +63 -0
  193. package/dist/lib/handoff-file.d.ts.map +1 -0
  194. package/dist/lib/hash.d.ts +9 -0
  195. package/dist/lib/hash.d.ts.map +1 -0
  196. package/dist/lib/lsp-detect.d.ts +42 -0
  197. package/dist/lib/lsp-detect.d.ts.map +1 -0
  198. package/dist/lib/manifest.d.ts +88 -0
  199. package/dist/lib/manifest.d.ts.map +1 -0
  200. package/dist/lib/mcp-client.d.ts +39 -0
  201. package/dist/lib/mcp-client.d.ts.map +1 -0
  202. package/dist/lib/migrate-branch-model.d.ts +34 -0
  203. package/dist/lib/migrate-branch-model.d.ts.map +1 -0
  204. package/dist/lib/migrate-local-config.d.ts +39 -0
  205. package/dist/lib/migrate-local-config.d.ts.map +1 -0
  206. package/dist/lib/migration-collisions.d.ts +61 -0
  207. package/dist/lib/migration-collisions.d.ts.map +1 -0
  208. package/dist/lib/port-verify.d.ts +73 -0
  209. package/dist/lib/port-verify.d.ts.map +1 -0
  210. package/dist/lib/prompt.d.ts +41 -0
  211. package/dist/lib/prompt.d.ts.map +1 -0
  212. package/dist/lib/readme-generator.d.ts +108 -0
  213. package/dist/lib/readme-generator.d.ts.map +1 -0
  214. package/dist/lib/repo-reader.d.ts +59 -0
  215. package/dist/lib/repo-reader.d.ts.map +1 -0
  216. package/dist/lib/scaffold-cd-workflow.d.ts +48 -0
  217. package/dist/lib/scaffold-cd-workflow.d.ts.map +1 -0
  218. package/dist/lib/scaffold-ci-workflow.d.ts +83 -0
  219. package/dist/lib/scaffold-ci-workflow.d.ts.map +1 -0
  220. package/dist/lib/scaffold-publish-workflow.d.ts +48 -0
  221. package/dist/lib/scaffold-publish-workflow.d.ts.map +1 -0
  222. package/dist/lib/server-detect.d.ts +20 -0
  223. package/dist/lib/server-detect.d.ts.map +1 -0
  224. package/dist/lib/session.d.ts +371 -0
  225. package/dist/lib/session.d.ts.map +1 -0
  226. package/dist/lib/settings-merge.d.ts +268 -0
  227. package/dist/lib/settings-merge.d.ts.map +1 -0
  228. package/dist/lib/ship.d.ts +84 -0
  229. package/dist/lib/ship.d.ts.map +1 -0
  230. package/dist/lib/slug.d.ts +26 -0
  231. package/dist/lib/slug.d.ts.map +1 -0
  232. package/dist/lib/spawn.d.ts +12 -0
  233. package/dist/lib/spawn.d.ts.map +1 -0
  234. package/dist/lib/state-client.d.ts +54 -0
  235. package/dist/lib/state-client.d.ts.map +1 -0
  236. package/dist/lib/state-store.d.ts +153 -0
  237. package/dist/lib/state-store.d.ts.map +1 -0
  238. package/dist/lib/state-sync.d.ts +101 -0
  239. package/dist/lib/state-sync.d.ts.map +1 -0
  240. package/dist/lib/statusline-config.d.ts +55 -0
  241. package/dist/lib/statusline-config.d.ts.map +1 -0
  242. package/dist/lib/structure-generator.d.ts +63 -0
  243. package/dist/lib/structure-generator.d.ts.map +1 -0
  244. package/dist/lib/supabase.d.ts +87 -0
  245. package/dist/lib/supabase.d.ts.map +1 -0
  246. package/dist/lib/sync-approvals.d.ts +108 -0
  247. package/dist/lib/sync-approvals.d.ts.map +1 -0
  248. package/dist/lib/tech-detect.d.ts +77 -0
  249. package/dist/lib/tech-detect.d.ts.map +1 -0
  250. package/dist/lib/template-walker.d.ts +26 -0
  251. package/dist/lib/template-walker.d.ts.map +1 -0
  252. package/dist/lib/templates-dir.d.ts +25 -0
  253. package/dist/lib/templates-dir.d.ts.map +1 -0
  254. package/dist/lib/types.d.ts +843 -0
  255. package/dist/lib/types.d.ts.map +1 -0
  256. package/dist/lib/validate-waves.d.ts +38 -0
  257. package/dist/lib/validate-waves.d.ts.map +1 -0
  258. package/dist/lib/verify-parity.d.ts +154 -0
  259. package/dist/lib/verify-parity.d.ts.map +1 -0
  260. package/dist/lib/version.d.ts +3 -0
  261. package/dist/lib/version.d.ts.map +1 -0
  262. package/dist/lib/watch-daemon.d.ts +114 -0
  263. package/dist/lib/watch-daemon.d.ts.map +1 -0
  264. package/dist/lib/worktree.d.ts +56 -0
  265. package/dist/lib/worktree.d.ts.map +1 -0
  266. package/dist/oauth/browser.d.ts +8 -0
  267. package/dist/oauth/browser.d.ts.map +1 -0
  268. package/dist/oauth/client-registration.d.ts +16 -0
  269. package/dist/oauth/client-registration.d.ts.map +1 -0
  270. package/dist/oauth/device-flow.d.ts +40 -0
  271. package/dist/oauth/device-flow.d.ts.map +1 -0
  272. package/dist/oauth/jwt-decode.d.ts +10 -0
  273. package/dist/oauth/jwt-decode.d.ts.map +1 -0
  274. package/dist/oauth/keychain.d.ts +17 -0
  275. package/dist/oauth/keychain.d.ts.map +1 -0
  276. package/dist/oauth/token-refresh.d.ts +7 -0
  277. package/dist/oauth/token-refresh.d.ts.map +1 -0
  278. package/dist/oauth/types.d.ts +28 -0
  279. package/dist/oauth/types.d.ts.map +1 -0
  280. package/dist/oauth/urls.d.ts +16 -0
  281. package/dist/oauth/urls.d.ts.map +1 -0
  282. package/package.json +5 -6
  283. package/templates/agents/cbp-security-agent.md +0 -1
  284. package/templates/agents/cbp-stripe-agent.md +0 -1
  285. package/templates/agents/cbp-testing-qa-agent.md +0 -1
  286. package/templates/hooks/cbp-skill-context-guard.sh +0 -1
  287. package/templates/hooks/cbp-test-hooks.sh +0 -81
  288. package/templates/hooks/validate-structure-lib.sh +36 -9
  289. package/templates/rules/cbp-operating-gotchas.md +8 -10
  290. package/templates/rules/todo-backend.md +4 -2
  291. package/templates/skills/cbp-build-cc-settings/reference/cbp-permission-policy.md +3 -3
  292. package/templates/skills/cbp-checkpoint-check/SKILL.md +0 -1
  293. package/templates/skills/cbp-checkpoint-end/SKILL.md +11 -5
  294. package/templates/skills/cbp-clear-continue/SKILL.md +0 -1
  295. package/templates/skills/cbp-clear-prep/SKILL.md +0 -1
  296. package/templates/skills/cbp-finalize/SKILL.md +2 -2
  297. package/templates/skills/cbp-setup-cd/SKILL.md +0 -1
  298. package/templates/skills/cbp-setup-ci/SKILL.md +0 -1
  299. package/templates/skills/cbp-standalone-task-complete/SKILL.md +40 -0
  300. package/templates/skills/cbp-stripe/SKILL.md +0 -1
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Shared check runner — `codebyplan check`.
3
+ *
4
+ * Converges the divergent check matrices (round + task scope via cbp-verify,
5
+ * cbp-merge-main) into ONE whole-repo + baseline runner. The CORE matrix is
6
+ * identical across scopes so a "round" check can never pass where a "task"
7
+ * check fails.
8
+ *
9
+ * Commands (turbo-native, whole-repo):
10
+ * gate6 → `node scripts/check-sibling-identity.mjs`
11
+ * ALWAYS hard-fail on non-zero exit; never baselined.
12
+ * lint → `turbo run lint` whole-repo per-package; diff vs baseline
13
+ * typecheck → `turbo run typecheck` whole-repo per-package; diff vs baseline
14
+ * tests → `turbo run test` whole-repo per-package; diff vs baseline
15
+ * audit → `pnpm audit --json` task scope only; diff vs baseline GHSA ids
16
+ *
17
+ * Per-package pass/fail is derived from the turbo --summarize JSON:
18
+ * turbo run <task> --summarize writes a run summary to .turbo/runs/<hash>.json
19
+ * The last line of turbo output matching /^Summary:\s+(.+\.json)$/ gives the path.
20
+ * Each task entry carries execution.exitCode; non-zero → package failed.
21
+ *
22
+ * Baseline file: .check-baseline.json at project root.
23
+ * A check FAILS (hard-fail) only when a package fails that is NOT in that
24
+ * check's known_failing[] (a NEW failure), or a GHSA id appears that is NOT
25
+ * in audit.ghsa_ids[]. gate6 is never in the baseline.
26
+ *
27
+ * Strict / absolute-green mode (noBaseline):
28
+ * When opts.noBaseline is true the baseline is IGNORED for the verdict — this
29
+ * is the WHOLE-REPO ABSOLUTE GREEN tier (zero baseline forgiveness). For
30
+ * lint/typecheck/tests the ENTIRE failing set counts as new_failures (not the
31
+ * diff-vs-baseline), so ANY red package fails the check; for audit ALL GHSA
32
+ * ids count, not just unallowlisted ones. gate6 is unchanged (always hard).
33
+ * noBaseline and updateBaseline are mutually exclusive: strict mode is a
34
+ * read-only verdict and never writes the baseline — if both are set,
35
+ * updateBaseline is ignored with a stderr warning.
36
+ */
37
+ import { type BaselineFile } from "./check-baseline.js";
38
+ /**
39
+ * Returned in new_failures[] when the turbo summary file cannot be read or
40
+ * parsed, OR when turbo exited non-zero but printed no Summary: path.
41
+ *
42
+ * The presence of this sentinel makes the check status = 'fail' so the runner
43
+ * NEVER silently passes when it cannot determine per-package results.
44
+ */
45
+ export declare const SUMMARY_UNREADABLE = "__summary_unreadable__";
46
+ /**
47
+ * Returned in new_failures[] when the turbo process was killed by a signal
48
+ * (spawnResult.status === null) and no summary path was captured.
49
+ *
50
+ * Distinct from SUMMARY_UNREADABLE so callers can distinguish OOM/SIGKILL
51
+ * ("something killed the process") from parse failures ("process ran but
52
+ * output was unreadable").
53
+ */
54
+ export declare const SPAWN_KILLED = "__spawn_killed__";
55
+ export type CheckScope = "round" | "task" | "merged";
56
+ export type CheckStatus = "pass" | "fail" | "skipped";
57
+ export interface CheckResult {
58
+ check: "gate6" | "lint" | "typecheck" | "tests" | "audit";
59
+ status: CheckStatus;
60
+ exit_code: number | null;
61
+ command: string;
62
+ stdout: string;
63
+ stderr: string;
64
+ executed: boolean;
65
+ /**
66
+ * NEW failing packages or GHSA IDs vs the baseline.
67
+ * Empty array → either all failures are baselined, or the check passed/skipped.
68
+ * undefined → check is not subject to baseline diffing (gate6, audit-skipped).
69
+ */
70
+ new_failures?: string[];
71
+ }
72
+ /**
73
+ * Injectable spawn function for tests.
74
+ * Default wraps child_process.spawnSync with shell: true.
75
+ */
76
+ export type SpawnFn = (command: string, opts: {
77
+ cwd: string;
78
+ }) => {
79
+ status: number | null;
80
+ stdout: string;
81
+ stderr: string;
82
+ };
83
+ export interface RunCheckOpts {
84
+ scope: CheckScope;
85
+ /** Defaults to process.cwd(). */
86
+ projectRoot?: string;
87
+ /**
88
+ * When provided, --files was passed on the CLI.
89
+ * In whole-repo mode this is a NO-OP: a deprecation notice is emitted to
90
+ * stderr and the value is ignored (turbo always runs whole-repo).
91
+ * Kept in the API for backwards compatibility.
92
+ */
93
+ changedFiles?: string[];
94
+ /** Defaults to a wrapper around child_process.spawnSync. */
95
+ spawnFn?: SpawnFn;
96
+ /**
97
+ * When true, run checks and WRITE the discovered failing set +
98
+ * current GHSA ids into .check-baseline.json instead of diffing.
99
+ * This is how the committed seed is produced.
100
+ */
101
+ updateBaseline?: boolean;
102
+ /**
103
+ * When true, IGNORE the baseline for the verdict — whole-repo ABSOLUTE GREEN.
104
+ * Every failing package (lint/typecheck/tests) and every GHSA id (audit)
105
+ * counts as a failure, so any red fails the check. gate6 is unchanged.
106
+ * Mutually exclusive with updateBaseline (strict mode never writes the
107
+ * baseline): if both are set, updateBaseline is ignored with a stderr warning.
108
+ */
109
+ noBaseline?: boolean;
110
+ /**
111
+ * Caps turbo's task parallelism (`turbo run <task> --concurrency=<n>`). The
112
+ * whole-repo (`--scope merged`) matrix runs every package's test suite at once
113
+ * and, at full concurrency, CPU-starves timing-sensitive suites into flaky
114
+ * timeouts — so the strict CI gate passes `1` to serialize and stay
115
+ * deterministic. Omitted (the dev-loop default) → turbo's own default.
116
+ */
117
+ concurrency?: number;
118
+ /**
119
+ * Injectable baseline loader for tests.
120
+ * Defaults to the real loadBaseline from check-baseline.ts.
121
+ */
122
+ loadBaselineFn?: (projectRoot: string) => BaselineFile;
123
+ /**
124
+ * Injectable baseline saver for tests.
125
+ * Defaults to the real saveBaseline from check-baseline.ts.
126
+ */
127
+ saveBaselineFn?: (projectRoot: string, baseline: BaselineFile) => void;
128
+ }
129
+ export interface RunCheckResult {
130
+ results: CheckResult[];
131
+ /** True when any hard-fail check has status === 'fail'. */
132
+ any_failed: boolean;
133
+ /** Names of checks that failed (post-baseline-diff verdict). */
134
+ hard_fail_checks: string[];
135
+ /**
136
+ * True when the run used strict / absolute-green mode (--no-baseline): the
137
+ * baseline was ignored and EVERY failing package / GHSA id counts as a
138
+ * failure. Lets JSON consumers tell a strict verdict from a baseline-tolerant
139
+ * one. Omitted (falsy) for normal baseline-diffed runs.
140
+ */
141
+ no_baseline?: boolean;
142
+ /**
143
+ * When updateBaseline was true but the write was skipped, reports why.
144
+ * 'gate6_failed' — gate6 check failed; indeterminate tree must not be baselined.
145
+ * 'indeterminate' — one or more sentinel values in currentFailing; results unreliable.
146
+ */
147
+ baseline_skipped?: "gate6_failed" | "indeterminate";
148
+ /** When updateBaseline was true, reports what was written. */
149
+ baseline_written?: {
150
+ lint_known_failing: string[];
151
+ typecheck_known_failing: string[];
152
+ tests_known_failing: string[];
153
+ audit_ghsa_ids: string[];
154
+ };
155
+ }
156
+ /**
157
+ * Resolve the turbo binary path.
158
+ *
159
+ * Search order:
160
+ * 1. projectRoot/node_modules/.bin/turbo (package-local install)
161
+ * 2. projectRoot/../../node_modules/.bin/turbo (monorepo workspace root)
162
+ *
163
+ * If turbo is found nowhere, returns a non-executable sentinel string so the
164
+ * caller's try/catch captures the spawn failure and surfaces an actionable
165
+ * error ("turbo not found — run pnpm install") rather than silently falling
166
+ * back to `npx turbo` which may download a possibly-wrong version.
167
+ *
168
+ * NOTE: bare "turbo" is intentionally NOT used — it is absent from the
169
+ * minimal shell PATH when Node spawns child processes (spawnSync shell:true
170
+ * uses /bin/sh which only has standard system paths).
171
+ */
172
+ export declare function resolveTurboBin(projectRoot: string): string;
173
+ /**
174
+ * Run the unified check matrix for a given scope.
175
+ * Never throws on subprocess failure — all errors are captured and reported.
176
+ */
177
+ export declare function runCheck(opts: RunCheckOpts): RunCheckResult;
178
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/lib/check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAKH,OAAO,EAOL,KAAK,YAAY,EAElB,MAAM,qBAAqB,CAAC;AAM7B;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,qBAAqB,CAAC;AA6C/C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1D,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,KAClB;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC;IACvD;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,2DAA2D;IAC3D,UAAU,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,cAAc,GAAG,eAAe,CAAC;IACpD,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE;QACjB,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;CACH;AA+GD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkB3D;AAqED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAmW3D"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Library for `codebyplan ci init`.
3
+ *
4
+ * Detects CI platforms from project file signals, builds a default CiConfig,
5
+ * and writes it to `.codebyplan/ci.json`. Idempotent — deep-merges newly
6
+ * detected platforms into an existing config, never overwriting existing platform
7
+ * keys unless --force is set.
8
+ *
9
+ * Platform detection follows the same signals as the testing-matrix reference
10
+ * (.claude/docs/architecture/testing-matrix.md):
11
+ * - next.config.{ts,js,mjs} → next_js
12
+ * - @nestjs/core in package.json → nestjs
13
+ * - tauri.conf.json or src-tauri/ → tauri
14
+ * - @types/vscode in devDependencies → vscode
15
+ * - expo in dependencies → expo
16
+ * - packages/ subdirectory exists → package
17
+ * - (fallback — none of above) → package
18
+ *
19
+ * Note: Tauri detection is implemented here directly; do NOT call detectTechStack
20
+ * for platform resolution (tech-detect.ts does not cover Tauri).
21
+ *
22
+ * The detection path is reader-driven (RepoReader interface) so tests can inject
23
+ * an InMemoryRepoReader. Write operations (mkdir, writeJsonAtomic) stay fs-direct.
24
+ */
25
+ import type { CiConfig, CiPlatformChecks } from "./types.js";
26
+ import { type RepoReader } from "./repo-reader.js";
27
+ /**
28
+ * Default CI check configurations per platform.
29
+ *
30
+ * Commands use generic `pnpm turbo` invocations without `--filter` as defaults.
31
+ * Callers (ci init, skills) should narrow scope by adjusting the `command` after
32
+ * writing the config for their specific project layout.
33
+ *
34
+ * Lint and e2e always delegate to their sibling config files and carry no
35
+ * inline `command`.
36
+ */
37
+ export declare const PLATFORM_COMMAND_MAP: Record<string, CiPlatformChecks>;
38
+ /**
39
+ * Detect CI platforms using the provided reader.
40
+ *
41
+ * `reader` provides async access to project content; it encapsulates its own
42
+ * project root, so all paths here are repo-root-relative (e.g. `apps`,
43
+ * `package.json`) and the reader resolves them. This keeps the function source
44
+ * agnostic (a LocalFsReader or a future GitHub-App-backed reader both work).
45
+ *
46
+ * Scans the project root and all direct children of `apps/` (monorepo pattern).
47
+ * Returns an array of unique platform slugs. The `package` platform is added
48
+ * when a `packages/` directory with at least one child is found. Falls back to
49
+ * `["package"]` when no other signals are detected.
50
+ *
51
+ * Per the approved design, list(dir) returns the immediate child DIRECTORY
52
+ * names under dir (loose files are excluded), matching the pre-refactor
53
+ * readdir({withFileTypes}).filter(isDirectory) behaviour. So scanning apps/*
54
+ * yields only sub-app directories, and a non-empty packages/ listing means at
55
+ * least one real sub-package directory exists.
56
+ */
57
+ export declare function detectPlatforms(reader: RepoReader): Promise<string[]>;
58
+ /**
59
+ * Build a default CiConfig from a list of detected platform slugs.
60
+ *
61
+ * Commands are sourced from PLATFORM_COMMAND_MAP. Unknown platform slugs fall
62
+ * back to the `package` defaults so all platforms are represented.
63
+ */
64
+ export declare function buildDefaultCiConfig(platforms: string[]): CiConfig;
65
+ export interface CiInitOptions {
66
+ /** If true, compute the operation but do NOT write any files. */
67
+ dryRun?: boolean;
68
+ /**
69
+ * If true, overwrite existing platform keys rather than deep-merging.
70
+ * Without --force, only NEW platforms (not already in the config) are added.
71
+ */
72
+ force?: boolean;
73
+ /**
74
+ * Override the project root directory (default: process.cwd()).
75
+ */
76
+ projectDir?: string;
77
+ /**
78
+ * Optional reader for project-content reads. When omitted, a LocalFsReader
79
+ * constructed with `projectDir` is used. Inject an InMemoryRepoReader in
80
+ * tests to avoid disk I/O.
81
+ */
82
+ reader?: RepoReader;
83
+ }
84
+ export interface CiInitResult {
85
+ /** `written` — file was created or updated. `skipped` — all platforms already present.
86
+ * `dry_run` — computed what would change but wrote nothing. */
87
+ status: "written" | "skipped" | "dry_run";
88
+ /** Absolute path to `.codebyplan/ci.json`. */
89
+ path: string;
90
+ /**
91
+ * For `written`/`dry_run` — the detected or newly-added platform slugs.
92
+ * For `skipped` — the already-present platform slugs (no-op).
93
+ */
94
+ platforms: string[];
95
+ }
96
+ /**
97
+ * Detect platforms in `projectDir` and write (or update) `.codebyplan/ci.json`.
98
+ *
99
+ * Idempotent deep-merge: newly detected platforms are added to the existing
100
+ * config; existing platform keys are left unchanged unless `force` is set.
101
+ *
102
+ * Detection reads are reader-driven (see RepoReader). Write operations remain
103
+ * fs-direct so that the reader interface stays read-only.
104
+ */
105
+ export declare function runCiInit(opts?: CiInitOptions): Promise<CiInitResult>;
106
+ //# sourceMappingURL=ci-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-init.d.ts","sourceRoot":"","sources":["../../src/lib/ci-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAMlE;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAiMjE,CAAC;AA+BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6D3E;AAMD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ,CAsBlE;AAMD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B;oEACgE;IAChE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAqF3E"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Library for `codebyplan ci resolve`.
3
+ *
4
+ * Resolves the shell command (or delegation pointer) for a CI check category
5
+ * by reading `.codebyplan/ci.json`. Falls back to PLATFORM_COMMAND_MAP defaults
6
+ * when ci.json is absent, empty, OR present-but-missing the requested category
7
+ * for the resolved platform — so a partial / older ci.json still resolves from
8
+ * the central default map rather than dropping the caller to a hardcoded literal
9
+ * (which is the duplication this CLI exists to eliminate).
10
+ *
11
+ * Resolution order (first usable check wins):
12
+ * 1. ci.json — config.platforms[slug][category]
13
+ * 2. PLATFORM_COMMAND_MAP[slug][category] — fallback (slug = the resolved platform)
14
+ * 3. PLATFORM_COMMAND_MAP["package"][category] — ultimate fallback (unknown slug)
15
+ *
16
+ * Where `slug` = opts.platform ?? first ci.json platform key ?? "package".
17
+ * `not_found` is returned only when no source carries the category — for the
18
+ * valid CiCategory values this never happens (the package defaults cover all),
19
+ * so it is a defensive terminal state.
20
+ */
21
+ import type { CiCategory, CiScope } from "./types.js";
22
+ export type CiResolveStatus = "resolved" | "delegates" | "fallback" | "not_found";
23
+ export interface CiResolveOptions {
24
+ /** The CI check category to resolve. */
25
+ category: CiCategory;
26
+ /** Platform slug to look up (e.g. "next_js", "nestjs"). Optional. */
27
+ platform?: string;
28
+ /** Project root directory. Defaults to process.cwd(). */
29
+ projectDir?: string;
30
+ }
31
+ export interface CiResolveResult {
32
+ /** How the resolution completed. */
33
+ status: CiResolveStatus;
34
+ /** The category that was resolved. */
35
+ category: CiCategory;
36
+ /**
37
+ * The platform slug that was used for resolution.
38
+ * Null when the platform could not be determined (e.g. unknown platform
39
+ * with absent ci.json and no PLATFORM_COMMAND_MAP entry).
40
+ */
41
+ platform: string | null;
42
+ /** Shell command to run. Present when status is "resolved" or "fallback". */
43
+ command?: string;
44
+ /**
45
+ * Path to the config file that owns this check category.
46
+ * Present when status is "delegates".
47
+ */
48
+ delegates_to?: string;
49
+ /** Scope of the check (per_app_changed or full_repo). */
50
+ scope?: CiScope;
51
+ /** Whether a failure blocks the PR/merge. */
52
+ hard_fail?: boolean;
53
+ /**
54
+ * True when ci.json was absent or had no platforms — PLATFORM_COMMAND_MAP
55
+ * defaults were used instead.
56
+ */
57
+ fallback_used: boolean;
58
+ }
59
+ export declare function resolveCiCommand(opts: CiResolveOptions): CiResolveResult;
60
+ //# sourceMappingURL=ci-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-resolve.d.ts","sourceRoot":"","sources":["../../src/lib/ci-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,EAAE,UAAU,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,sCAAsC;IACtC,QAAQ,EAAE,UAAU,CAAC;IACrB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAwDD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAwCxE"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Library for auditing the model/effort convention across authoring templates.
3
+ *
4
+ * Convention (from templates/skills/cbp-build-cc-mode/SKILL.md):
5
+ * Skills: model: inherit + effort: — both expected. `inherit` signals
6
+ * session-model inheritance explicitly. Absent model or a non-inherit
7
+ * model value is a gap.
8
+ * Agents: model: <pin> + effort: — both must be pinned. `inherit` is NOT
9
+ * permitted for agents.
10
+ *
11
+ * Agent default: model: sonnet, effort: xhigh.
12
+ * Exceptions: cbp-mechanical-edits → model: haiku, effort: low.
13
+ * cbp-map-architecture → model: sonnet, effort: high.
14
+ * cbp-e2e-* (5 agents) → model: sonnet, effort: high.
15
+ *
16
+ * Valid effort values: low | medium | high | xhigh | max.
17
+ */
18
+ export interface AuditEntry {
19
+ path: string;
20
+ surface: "agent" | "skill";
21
+ /** Parsed model value, or null if the frontmatter key is absent. */
22
+ model: string | null;
23
+ /** Parsed effort value, or null if the frontmatter key is absent. */
24
+ effort: string | null;
25
+ /** Human-readable expected value (e.g. "model:sonnet/effort:xhigh"). */
26
+ expected: string;
27
+ status: "ok" | "gap";
28
+ gap_reason?: string;
29
+ }
30
+ /**
31
+ * Scan `templatesDir/agents/*.md` and `templatesDir/skills/* /SKILL.md`,
32
+ * apply the model/effort convention, and return one AuditEntry per file.
33
+ *
34
+ * Vendored skills (a skill dir with a sibling `PROVENANCE.md`, installed via
35
+ * `npx skills add …`) are skipped — they follow their upstream author's
36
+ * frontmatter convention, not CBP's model/effort matrix.
37
+ *
38
+ * Read-only — never mutates any file.
39
+ */
40
+ export declare function auditMode(templatesDir: string): AuditEntry[];
41
+ //# sourceMappingURL=claude-mode-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-mode-audit.d.ts","sourceRoot":"","sources":["../../src/lib/claude-mode-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,oEAAoE;IACpE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0ID;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,EAAE,CAsC5D"}
@@ -0,0 +1,34 @@
1
+ import { type ManifestEntry } from "./manifest.js";
2
+ export interface DriftPlan {
3
+ unchanged: ManifestEntry[];
4
+ overwriteSafe: Array<{
5
+ packaged: ManifestEntry;
6
+ absSrc: string;
7
+ }>;
8
+ overwriteHandEdited: Array<{
9
+ packaged: ManifestEntry;
10
+ absSrc: string;
11
+ onDiskContent: Buffer;
12
+ }>;
13
+ newOptIn: Array<{
14
+ packaged: ManifestEntry;
15
+ absSrc: string;
16
+ }>;
17
+ removedFromPackage: ManifestEntry[];
18
+ }
19
+ /**
20
+ * Classify every file managed by the manifest into one of five buckets:
21
+ * - unchanged: on-disk and templates both match the manifest hash
22
+ * - overwriteSafe: templates changed, on-disk still matches manifest (safe overwrite)
23
+ * - overwriteHandEdited: on-disk differs from manifest (user hand-edit)
24
+ * - newOptIn: in templates but NOT in manifest (newly shipped)
25
+ * - removedFromPackage: in manifest but NOT in templates (removed from package)
26
+ *
27
+ * Pure read-only — never writes to disk.
28
+ * Extracted from update.ts `buildPlan` so both `runUpdate` and `runStatus` can
29
+ * share the same classification logic without duplicating code.
30
+ */
31
+ export declare function buildDriftPlan(projectDir: string, templatesDir: string, manifest: {
32
+ files: ManifestEntry[];
33
+ }): DriftPlan;
34
+ //# sourceMappingURL=claude-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-plan.d.ts","sourceRoot":"","sources":["../../src/lib/claude-plan.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,aAAa,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,mBAAmB,EAAE,KAAK,CAAC;QACzB,QAAQ,EAAE,aAAa,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,kBAAkB,EAAE,aAAa,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE;IAAE,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GACnC,SAAS,CA6DX"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Commit scope helper — computes the set intersection between staged files
3
+ * and the active task's known files.
4
+ *
5
+ * Pure function — no I/O. Takes pre-fetched file lists as parameters.
6
+ * No top-level side effects.
7
+ */
8
+ export interface ComputeScopeTaskFilesInput {
9
+ /** Paths from the active task's files_changed (resolved by the caller via MCP). */
10
+ taskPaths: string[];
11
+ /** Paths currently staged in the git index (from `git diff --cached --name-only`). */
12
+ stagedPaths: string[];
13
+ }
14
+ /**
15
+ * Returns the sorted set intersection of taskPaths and stagedPaths.
16
+ *
17
+ * Both inputs are treated as sets — duplicates within each list are deduplicated
18
+ * before intersection so the output contains each path at most once.
19
+ */
20
+ export declare function computeScopeTaskFiles(input: ComputeScopeTaskFilesInput): string[];
21
+ //# sourceMappingURL=commit-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-scope.d.ts","sourceRoot":"","sources":["../../src/lib/commit-scope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,0BAA0B;IACzC,mFAAmF;IACnF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sFAAsF;IACtF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAMD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,MAAM,EAAE,CAaV"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Pure lib for E2E deterministic gate verification.
3
+ *
4
+ * Codifies the three hard-fails from rules/e2e-mandatory.md and the
5
+ * context/testing/e2e.md dispatch/eligibility contract.
6
+ *
7
+ * No MCP imports, no filesystem side effects at module level.
8
+ * e2e.json content is passed in as an already-parsed object (or null).
9
+ * All public functions accept injectable deps so tests never hit real I/O.
10
+ */
11
+ export interface E2eFrameworkConfig {
12
+ enabled: boolean;
13
+ auto_run: boolean;
14
+ /** App source path (e.g. "apps/web"). Repo root is "" or "." for single-app. */
15
+ app: string;
16
+ /** e.g. ["web"] | ["ios","android"] | ["desktop"] */
17
+ platforms?: string[];
18
+ credential_vars?: {
19
+ email?: string | null;
20
+ password?: string | null;
21
+ };
22
+ }
23
+ export interface E2eConfig {
24
+ frameworks?: Record<string, E2eFrameworkConfig>;
25
+ }
26
+ export interface E2eTestResults {
27
+ passed: number;
28
+ failed: number;
29
+ skipped: number;
30
+ }
31
+ export interface E2eCriticalIssue {
32
+ type: string;
33
+ spec_path?: string | null;
34
+ reason: string;
35
+ }
36
+ /** Console/page error captured by the Playwright quality fixture. */
37
+ export interface E2eConsoleError {
38
+ test_name?: string;
39
+ type?: "console" | "pageerror" | "requestfailed";
40
+ text: string;
41
+ }
42
+ /** Aggregated axe accessibility scan summary (Playwright). */
43
+ export interface E2eA11ySummary {
44
+ scanned_pages?: string[];
45
+ violations?: Array<{
46
+ rule?: string;
47
+ impact?: string;
48
+ page?: string;
49
+ }>;
50
+ }
51
+ /** Shape of each entry in round.context.e2e_outputs[framework] */
52
+ export interface E2eOutputEntry {
53
+ status: "completed" | "failed";
54
+ tests_run?: boolean;
55
+ test_results?: E2eTestResults;
56
+ e2e_gallery?: E2eGalleryEntry[] | null;
57
+ preflight?: {
58
+ dev_server?: {
59
+ ok: boolean;
60
+ required?: boolean;
61
+ port?: number | null;
62
+ notes?: string;
63
+ };
64
+ simulator?: {
65
+ ok: boolean;
66
+ required?: boolean;
67
+ device?: string | null;
68
+ notes?: string;
69
+ };
70
+ built_binary?: {
71
+ ok: boolean;
72
+ required?: boolean;
73
+ path?: string | null;
74
+ notes?: string;
75
+ };
76
+ /** Full shape from context/testing/e2e.md: { required: string[], missing: string[], ok: bool } */
77
+ env_vars?: {
78
+ ok: boolean;
79
+ required?: string[];
80
+ missing?: string[];
81
+ };
82
+ auth_probe?: {
83
+ ok: boolean;
84
+ ran?: boolean;
85
+ probe_path?: string | null;
86
+ error?: string | null;
87
+ };
88
+ };
89
+ critical_issues?: E2eCriticalIssue[];
90
+ /** Quality-capture fields (rules/e2e-mandatory.md § Quality-Capture Mandates).
91
+ * Absent on legacy outputs — absence never fails verification. */
92
+ console_errors?: E2eConsoleError[] | null;
93
+ a11y?: E2eA11ySummary | null;
94
+ }
95
+ export interface E2eGalleryEntry {
96
+ test_name: string;
97
+ page_or_screen: string;
98
+ framework: string;
99
+ committed_path: string;
100
+ is_new: boolean;
101
+ baseline_diff_pct: number | null;
102
+ }
103
+ export interface VerifyRoundContext {
104
+ /** List of eligible framework names (from dispatcher's eligibility calc). */
105
+ e2e_eligible?: string[];
106
+ /** Map of framework → specialist output. */
107
+ e2e_outputs?: Record<string, E2eOutputEntry>;
108
+ /** Round type — "survey" rounds short-circuit to pass. */
109
+ round_type?: string;
110
+ }
111
+ export interface VerifyRoundInput {
112
+ round_context: VerifyRoundContext;
113
+ /** Paths of files changed in this round. */
114
+ files_changed: string[];
115
+ /** Parsed .codebyplan/e2e.json content, or null if absent. */
116
+ e2e_config: E2eConfig | null;
117
+ }
118
+ export interface FailedCheck {
119
+ check: "e2e_eligible_skipped" | "zero_assertion_run" | "empty_gallery" | "console_errors_reported" | "a11y_violations_reported";
120
+ framework: string;
121
+ detail: string;
122
+ }
123
+ export interface ValidSkip {
124
+ framework: string;
125
+ reason: string;
126
+ }
127
+ export interface VerifyRoundResult {
128
+ pass: boolean;
129
+ failed_checks: FailedCheck[];
130
+ skipped_validly: ValidSkip[];
131
+ }
132
+ /**
133
+ * Verify the three E2E hard-fails for a completed round.
134
+ *
135
+ * Hard-fails (per rules/e2e-mandatory.md):
136
+ *
137
+ * 1. e2e_eligible_skipped — a framework listed in e2e_eligible[] has no entry
138
+ * in e2e_outputs AND no valid skip reason recorded.
139
+ *
140
+ * 2. zero_assertion_run — a framework's e2e_outputs[f].test_results has
141
+ * passed === 0 && skipped > 0 for touched paths.
142
+ *
143
+ * 3. empty_gallery — eligible framework that ran with status "completed" reports
144
+ * empty / missing e2e_gallery[] (exception: vscode-test may have empty gallery
145
+ * when the extension has no visual surface — but the field MUST be present).
146
+ *
147
+ * 4. console_errors_reported — status "completed" but console_errors[] is
148
+ * non-empty (quality-capture inconsistency; a completed run must be
149
+ * console-clean). Absent/null field never fails (legacy outputs).
150
+ *
151
+ * 5. a11y_violations_reported — status "completed" but a11y.violations[] is
152
+ * non-empty. Absent/null field never fails (legacy outputs).
153
+ *
154
+ * Survey rounds and empty e2e_eligible short-circuit to pass.
155
+ */
156
+ export declare function verifyRound(input: VerifyRoundInput): VerifyRoundResult;
157
+ //# sourceMappingURL=e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e.d.ts","sourceRoot":"","sources":["../../src/lib/e2e.ts"],"names":[],"mappings":"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"}