p-dev-harness 0.3.0 → 0.3.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 (808) hide show
  1. package/README.md +16 -5
  2. package/dist/github/client.d.ts +88 -1
  3. package/dist/github/client.d.ts.map +1 -1
  4. package/dist/github/client.js +98 -7
  5. package/dist/github/client.js.map +1 -1
  6. package/dist/github/rate-limit-metadata.d.ts +16 -0
  7. package/dist/github/rate-limit-metadata.d.ts.map +1 -0
  8. package/dist/github/rate-limit-metadata.js +73 -0
  9. package/dist/github/rate-limit-metadata.js.map +1 -0
  10. package/dist/p-dev/git-object-plumbing.d.ts +19 -0
  11. package/dist/p-dev/git-object-plumbing.d.ts.map +1 -0
  12. package/dist/p-dev/git-object-plumbing.js +196 -0
  13. package/dist/p-dev/git-object-plumbing.js.map +1 -0
  14. package/dist/p-dev/package-paths.d.ts +1 -0
  15. package/dist/p-dev/package-paths.d.ts.map +1 -1
  16. package/dist/p-dev/package-paths.js +3 -0
  17. package/dist/p-dev/package-paths.js.map +1 -1
  18. package/dist/p-dev/workspace-snapshot-digest.d.ts +12 -0
  19. package/dist/p-dev/workspace-snapshot-digest.d.ts.map +1 -0
  20. package/dist/p-dev/workspace-snapshot-digest.js +34 -0
  21. package/dist/p-dev/workspace-snapshot-digest.js.map +1 -0
  22. package/dist/p-dev/workspace-snapshot-generator.d.ts +15 -0
  23. package/dist/p-dev/workspace-snapshot-generator.d.ts.map +1 -0
  24. package/dist/p-dev/workspace-snapshot-generator.js +69 -0
  25. package/dist/p-dev/workspace-snapshot-generator.js.map +1 -0
  26. package/dist/p-dev/workspace-snapshot-git.d.ts +26 -0
  27. package/dist/p-dev/workspace-snapshot-git.d.ts.map +1 -0
  28. package/dist/p-dev/workspace-snapshot-git.js +151 -0
  29. package/dist/p-dev/workspace-snapshot-git.js.map +1 -0
  30. package/dist/p-dev/workspace-snapshot-manifest.d.ts +18 -0
  31. package/dist/p-dev/workspace-snapshot-manifest.d.ts.map +1 -0
  32. package/dist/p-dev/workspace-snapshot-manifest.js +292 -0
  33. package/dist/p-dev/workspace-snapshot-manifest.js.map +1 -0
  34. package/dist/p-dev/workspace-snapshot-policy.d.ts +16 -0
  35. package/dist/p-dev/workspace-snapshot-policy.d.ts.map +1 -0
  36. package/dist/p-dev/workspace-snapshot-policy.js +168 -0
  37. package/dist/p-dev/workspace-snapshot-policy.js.map +1 -0
  38. package/dist/p-dev/workspace-snapshot-types.d.ts +54 -0
  39. package/dist/p-dev/workspace-snapshot-types.d.ts.map +1 -0
  40. package/dist/p-dev/workspace-snapshot-types.js +7 -0
  41. package/dist/p-dev/workspace-snapshot-types.js.map +1 -0
  42. package/dist/p-dev/workspace-snapshot-validation.d.ts +17 -0
  43. package/dist/p-dev/workspace-snapshot-validation.d.ts.map +1 -0
  44. package/dist/p-dev/workspace-snapshot-validation.js +115 -0
  45. package/dist/p-dev/workspace-snapshot-validation.js.map +1 -0
  46. package/dist/setup/github-remote-provider.d.ts +129 -0
  47. package/dist/setup/github-remote-provider.d.ts.map +1 -1
  48. package/dist/setup/github-remote-provider.js +214 -3
  49. package/dist/setup/github-remote-provider.js.map +1 -1
  50. package/dist/setup/github-remote-setup-live.d.ts +46 -1
  51. package/dist/setup/github-remote-setup-live.d.ts.map +1 -1
  52. package/dist/setup/github-remote-setup-live.js +121 -4
  53. package/dist/setup/github-remote-setup-live.js.map +1 -1
  54. package/dist/setup/github-secret-encryption.d.ts.map +1 -1
  55. package/dist/setup/github-secret-encryption.js +3 -1
  56. package/dist/setup/github-secret-encryption.js.map +1 -1
  57. package/dist/setup/github-upload-rate-limit-gate.d.ts +17 -0
  58. package/dist/setup/github-upload-rate-limit-gate.d.ts.map +1 -0
  59. package/dist/setup/github-upload-rate-limit-gate.js +42 -0
  60. package/dist/setup/github-upload-rate-limit-gate.js.map +1 -0
  61. package/dist/setup/harness-managed-repo-marker.d.ts +28 -1
  62. package/dist/setup/harness-managed-repo-marker.d.ts.map +1 -1
  63. package/dist/setup/harness-managed-repo-marker.js +165 -2
  64. package/dist/setup/harness-managed-repo-marker.js.map +1 -1
  65. package/dist/setup/harness-provisioning-context.d.ts +14 -12
  66. package/dist/setup/harness-provisioning-context.d.ts.map +1 -1
  67. package/dist/setup/harness-provisioning-context.js +54 -42
  68. package/dist/setup/harness-provisioning-context.js.map +1 -1
  69. package/dist/setup/harness-provisioning-pending-state.d.ts +33 -22
  70. package/dist/setup/harness-provisioning-pending-state.d.ts.map +1 -1
  71. package/dist/setup/harness-provisioning-pending-state.js +49 -30
  72. package/dist/setup/harness-provisioning-pending-state.js.map +1 -1
  73. package/dist/setup/harness-repo-provisioning.d.ts +10 -5
  74. package/dist/setup/harness-repo-provisioning.d.ts.map +1 -1
  75. package/dist/setup/harness-repo-provisioning.js +403 -335
  76. package/dist/setup/harness-repo-provisioning.js.map +1 -1
  77. package/dist/setup/harness-snapshot-provisioning-helpers.d.ts +21 -0
  78. package/dist/setup/harness-snapshot-provisioning-helpers.d.ts.map +1 -0
  79. package/dist/setup/harness-snapshot-provisioning-helpers.js +55 -0
  80. package/dist/setup/harness-snapshot-provisioning-helpers.js.map +1 -0
  81. package/dist/setup/harness-snapshot-provisioning.d.ts +111 -0
  82. package/dist/setup/harness-snapshot-provisioning.d.ts.map +1 -0
  83. package/dist/setup/harness-snapshot-provisioning.js +684 -0
  84. package/dist/setup/harness-snapshot-provisioning.js.map +1 -0
  85. package/dist/setup/harness-workspace-snapshot-loader.d.ts +15 -0
  86. package/dist/setup/harness-workspace-snapshot-loader.d.ts.map +1 -0
  87. package/dist/setup/harness-workspace-snapshot-loader.js +80 -0
  88. package/dist/setup/harness-workspace-snapshot-loader.js.map +1 -0
  89. package/dist/setup/mock-git-repository-store.d.ts +43 -0
  90. package/dist/setup/mock-git-repository-store.d.ts.map +1 -0
  91. package/dist/setup/mock-git-repository-store.js +232 -0
  92. package/dist/setup/mock-git-repository-store.js.map +1 -0
  93. package/gui/.next/BUILD_ID +1 -1
  94. package/gui/.next/app-build-manifest.json +49 -49
  95. package/gui/.next/app-path-routes-manifest.json +15 -15
  96. package/gui/.next/build-manifest.json +2 -2
  97. package/gui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  98. package/gui/.next/server/app/_not-found.html +1 -1
  99. package/gui/.next/server/app/_not-found.rsc +2 -2
  100. package/gui/.next/server/app/api/setup/apply-connect-services/route.js +1 -1
  101. package/gui/.next/server/app/api/setup/apply-connect-services/route.js.nft.json +1 -1
  102. package/gui/.next/server/app/api/setup/apply-connect-services/route_client-reference-manifest.js +1 -1
  103. package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route.js +1 -1
  104. package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route.js.nft.json +1 -1
  105. package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route_client-reference-manifest.js +1 -1
  106. package/gui/.next/server/app/api/setup/apply-harness-secrets/route.js +1 -1
  107. package/gui/.next/server/app/api/setup/apply-harness-secrets/route.js.nft.json +1 -1
  108. package/gui/.next/server/app/api/setup/apply-harness-secrets/route_client-reference-manifest.js +1 -1
  109. package/gui/.next/server/app/api/setup/apply-linear-setup/route.js +1 -1
  110. package/gui/.next/server/app/api/setup/apply-linear-setup/route.js.nft.json +1 -1
  111. package/gui/.next/server/app/api/setup/apply-linear-setup/route_client-reference-manifest.js +1 -1
  112. package/gui/.next/server/app/api/setup/apply-local-files/route.js +1 -1
  113. package/gui/.next/server/app/api/setup/apply-local-files/route.js.nft.json +1 -1
  114. package/gui/.next/server/app/api/setup/apply-local-files/route_client-reference-manifest.js +1 -1
  115. package/gui/.next/server/app/api/setup/apply-target-workflow/route.js +1 -1
  116. package/gui/.next/server/app/api/setup/apply-target-workflow/route.js.nft.json +1 -1
  117. package/gui/.next/server/app/api/setup/apply-target-workflow/route_client-reference-manifest.js +1 -1
  118. package/gui/.next/server/app/api/setup/apply-vercel-bridge/route.js +1 -1
  119. package/gui/.next/server/app/api/setup/apply-vercel-bridge/route.js.nft.json +1 -1
  120. package/gui/.next/server/app/api/setup/apply-vercel-bridge/route_client-reference-manifest.js +1 -1
  121. package/gui/.next/server/app/api/setup/finalize-target-workflow/route.js +1 -1
  122. package/gui/.next/server/app/api/setup/finalize-target-workflow/route.js.nft.json +1 -1
  123. package/gui/.next/server/app/api/setup/finalize-target-workflow/route_client-reference-manifest.js +1 -1
  124. package/gui/.next/server/app/api/setup/harness-provisioning-summary/route.js +1 -1
  125. package/gui/.next/server/app/api/setup/harness-provisioning-summary/route.js.nft.json +1 -1
  126. package/gui/.next/server/app/api/setup/harness-provisioning-summary/route_client-reference-manifest.js +1 -1
  127. package/gui/.next/server/app/api/setup/linear-options/route.js +1 -1
  128. package/gui/.next/server/app/api/setup/linear-options/route.js.nft.json +1 -1
  129. package/gui/.next/server/app/api/setup/linear-options/route_client-reference-manifest.js +1 -1
  130. package/gui/.next/server/app/api/setup/linear-summary/route.js +1 -1
  131. package/gui/.next/server/app/api/setup/linear-summary/route.js.nft.json +1 -1
  132. package/gui/.next/server/app/api/setup/linear-summary/route_client-reference-manifest.js +1 -1
  133. package/gui/.next/server/app/api/setup/local-readiness/route_client-reference-manifest.js +1 -1
  134. package/gui/.next/server/app/api/setup/manual-harness-secret-values/route.js +1 -1
  135. package/gui/.next/server/app/api/setup/manual-harness-secret-values/route.js.nft.json +1 -1
  136. package/gui/.next/server/app/api/setup/manual-harness-secret-values/route_client-reference-manifest.js +1 -1
  137. package/gui/.next/server/app/api/setup/preview-connect-services/route.js +1 -1
  138. package/gui/.next/server/app/api/setup/preview-connect-services/route.js.nft.json +1 -1
  139. package/gui/.next/server/app/api/setup/preview-connect-services/route_client-reference-manifest.js +1 -1
  140. package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route.js +1 -1
  141. package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route.js.nft.json +1 -1
  142. package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route_client-reference-manifest.js +1 -1
  143. package/gui/.next/server/app/api/setup/preview-harness-secrets/route.js +1 -1
  144. package/gui/.next/server/app/api/setup/preview-harness-secrets/route.js.nft.json +1 -1
  145. package/gui/.next/server/app/api/setup/preview-harness-secrets/route_client-reference-manifest.js +1 -1
  146. package/gui/.next/server/app/api/setup/preview-linear-setup/route.js +1 -1
  147. package/gui/.next/server/app/api/setup/preview-linear-setup/route.js.nft.json +1 -1
  148. package/gui/.next/server/app/api/setup/preview-linear-setup/route_client-reference-manifest.js +1 -1
  149. package/gui/.next/server/app/api/setup/preview-local-files/route.js +1 -1
  150. package/gui/.next/server/app/api/setup/preview-local-files/route.js.nft.json +1 -1
  151. package/gui/.next/server/app/api/setup/preview-local-files/route_client-reference-manifest.js +1 -1
  152. package/gui/.next/server/app/api/setup/preview-target-workflow/route.js +1 -1
  153. package/gui/.next/server/app/api/setup/preview-target-workflow/route.js.nft.json +1 -1
  154. package/gui/.next/server/app/api/setup/preview-target-workflow/route_client-reference-manifest.js +1 -1
  155. package/gui/.next/server/app/api/setup/preview-vercel-bridge/route.js +1 -1
  156. package/gui/.next/server/app/api/setup/preview-vercel-bridge/route.js.nft.json +1 -1
  157. package/gui/.next/server/app/api/setup/preview-vercel-bridge/route_client-reference-manifest.js +1 -1
  158. package/gui/.next/server/app/api/setup/remote-summary/route.js +1 -1
  159. package/gui/.next/server/app/api/setup/remote-summary/route.js.nft.json +1 -1
  160. package/gui/.next/server/app/api/setup/remote-summary/route_client-reference-manifest.js +1 -1
  161. package/gui/.next/server/app/api/setup/summary/route.js +1 -1
  162. package/gui/.next/server/app/api/setup/summary/route.js.nft.json +1 -1
  163. package/gui/.next/server/app/api/setup/summary/route_client-reference-manifest.js +1 -1
  164. package/gui/.next/server/app/api/setup/vercel-bridge-options/route.js +1 -1
  165. package/gui/.next/server/app/api/setup/vercel-bridge-options/route.js.nft.json +1 -1
  166. package/gui/.next/server/app/api/setup/vercel-bridge-options/route_client-reference-manifest.js +1 -1
  167. package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route.js +1 -1
  168. package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route.js.nft.json +1 -1
  169. package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route_client-reference-manifest.js +1 -1
  170. package/gui/.next/server/app/api/setup/vercel-summary/route.js +1 -1
  171. package/gui/.next/server/app/api/setup/vercel-summary/route.js.nft.json +1 -1
  172. package/gui/.next/server/app/api/setup/vercel-summary/route_client-reference-manifest.js +1 -1
  173. package/gui/.next/server/app/api/setup/verify-harness-repo/route.js +1 -1
  174. package/gui/.next/server/app/api/setup/verify-harness-repo/route.js.nft.json +1 -1
  175. package/gui/.next/server/app/api/setup/verify-harness-repo/route_client-reference-manifest.js +1 -1
  176. package/gui/.next/server/app/api/setup/verify-service/route_client-reference-manifest.js +1 -1
  177. package/gui/.next/server/app/api/setup/verify-target-repo/route_client-reference-manifest.js +1 -1
  178. package/gui/.next/server/app/index.html +1 -1
  179. package/gui/.next/server/app/index.rsc +2 -2
  180. package/gui/.next/server/app/page_client-reference-manifest.js +1 -1
  181. package/gui/.next/server/app/settings/configure/page.js +2 -2
  182. package/gui/.next/server/app/settings/configure/page.js.nft.json +1 -1
  183. package/gui/.next/server/app/settings/configure/page_client-reference-manifest.js +1 -1
  184. package/gui/.next/server/app-paths-manifest.json +15 -15
  185. package/gui/.next/server/chunks/477.js +2 -2
  186. package/gui/.next/server/chunks/647.js +82 -0
  187. package/gui/.next/server/chunks/900.js +1 -1
  188. package/gui/.next/server/pages/404.html +1 -1
  189. package/gui/.next/server/pages/500.html +1 -1
  190. package/gui/.next/static/css/781f3c93b6d7425a.css +3 -0
  191. package/gui/.next/trace +4 -4
  192. package/package.json +2 -1
  193. package/workspace-snapshot/files/.agents/skills/architecture-evolution-audit/SKILL.md +282 -0
  194. package/workspace-snapshot/files/.agents/skills/code-health-audit/SKILL.md +188 -0
  195. package/workspace-snapshot/files/.agents/skills/implementation/SKILL.md +279 -0
  196. package/workspace-snapshot/files/.agents/skills/issue-intake/SKILL.md +163 -0
  197. package/workspace-snapshot/files/.agents/skills/issue-intake/examples.md +112 -0
  198. package/workspace-snapshot/files/.agents/skills/planner/SKILL.md +253 -0
  199. package/workspace-snapshot/files/.agents/skills/security-audit/SKILL.md +270 -0
  200. package/workspace-snapshot/files/.env.example +37 -0
  201. package/workspace-snapshot/files/.github/CODEOWNERS +4 -0
  202. package/workspace-snapshot/files/.github/dependabot.yml +12 -0
  203. package/workspace-snapshot/files/.github/workflows/ci.yml +32 -0
  204. package/workspace-snapshot/files/.github/workflows/codeql.yml +35 -0
  205. package/workspace-snapshot/files/.github/workflows/harness-auto-runner.yml +561 -0
  206. package/workspace-snapshot/files/.harness/config.example.json +83 -0
  207. package/workspace-snapshot/files/AGENTS.md +130 -0
  208. package/workspace-snapshot/files/ARCHITECTURE.md +385 -0
  209. package/workspace-snapshot/files/CHANGELOG.md +166 -0
  210. package/workspace-snapshot/files/LICENSE +21 -0
  211. package/workspace-snapshot/files/README.md +110 -0
  212. package/workspace-snapshot/files/ROADMAP.md +50 -0
  213. package/workspace-snapshot/files/api/linear-webhook.ts +41 -0
  214. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-connect-services/route.ts +21 -0
  215. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-harness-repo-provisioning/route.ts +35 -0
  216. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-harness-secrets/route.ts +42 -0
  217. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-linear-setup/route.ts +23 -0
  218. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-local-files/route.ts +42 -0
  219. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-target-workflow/route.ts +49 -0
  220. package/workspace-snapshot/files/apps/gui/app/api/setup/apply-vercel-bridge/route.ts +26 -0
  221. package/workspace-snapshot/files/apps/gui/app/api/setup/finalize-target-workflow/route.ts +32 -0
  222. package/workspace-snapshot/files/apps/gui/app/api/setup/harness-provisioning-summary/route.ts +17 -0
  223. package/workspace-snapshot/files/apps/gui/app/api/setup/linear-options/route.ts +17 -0
  224. package/workspace-snapshot/files/apps/gui/app/api/setup/linear-summary/route.ts +15 -0
  225. package/workspace-snapshot/files/apps/gui/app/api/setup/local-readiness/route.ts +18 -0
  226. package/workspace-snapshot/files/apps/gui/app/api/setup/manual-harness-secret-values/route.ts +33 -0
  227. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-connect-services/route.ts +17 -0
  228. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-harness-repo-provisioning/route.ts +22 -0
  229. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-harness-secrets/route.ts +19 -0
  230. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-linear-setup/route.ts +20 -0
  231. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-local-files/route.ts +17 -0
  232. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-target-workflow/route.ts +25 -0
  233. package/workspace-snapshot/files/apps/gui/app/api/setup/preview-vercel-bridge/route.ts +23 -0
  234. package/workspace-snapshot/files/apps/gui/app/api/setup/remote-summary/route.ts +15 -0
  235. package/workspace-snapshot/files/apps/gui/app/api/setup/summary/route.ts +10 -0
  236. package/workspace-snapshot/files/apps/gui/app/api/setup/vercel-bridge-options/route.ts +29 -0
  237. package/workspace-snapshot/files/apps/gui/app/api/setup/vercel-bridge-redeploy-status/route.ts +22 -0
  238. package/workspace-snapshot/files/apps/gui/app/api/setup/vercel-summary/route.ts +15 -0
  239. package/workspace-snapshot/files/apps/gui/app/api/setup/verify-harness-repo/route.ts +31 -0
  240. package/workspace-snapshot/files/apps/gui/app/api/setup/verify-service/route.ts +41 -0
  241. package/workspace-snapshot/files/apps/gui/app/api/setup/verify-target-repo/route.ts +33 -0
  242. package/workspace-snapshot/files/apps/gui/app/layout.tsx +28 -0
  243. package/workspace-snapshot/files/apps/gui/app/page.tsx +5 -0
  244. package/workspace-snapshot/files/apps/gui/app/settings/configure/page.tsx +34 -0
  245. package/workspace-snapshot/files/apps/gui/components/custom/app-shell.tsx +39 -0
  246. package/workspace-snapshot/files/apps/gui/components/custom/configure-experience.tsx +671 -0
  247. package/workspace-snapshot/files/apps/gui/components/custom/configure-page-content.tsx +45 -0
  248. package/workspace-snapshot/files/apps/gui/components/custom/configure-workflow.tsx +1284 -0
  249. package/workspace-snapshot/files/apps/gui/components/custom/connected-status.tsx +30 -0
  250. package/workspace-snapshot/files/apps/gui/components/custom/environment-config-form.tsx +400 -0
  251. package/workspace-snapshot/files/apps/gui/components/custom/first-run-stepper.tsx +199 -0
  252. package/workspace-snapshot/files/apps/gui/components/custom/github-token-help-disclosure.tsx +142 -0
  253. package/workspace-snapshot/files/apps/gui/components/custom/guided-cloud-secrets-card.tsx +993 -0
  254. package/workspace-snapshot/files/apps/gui/components/custom/guided-linear-workspace-card.tsx +526 -0
  255. package/workspace-snapshot/files/apps/gui/components/custom/guided-local-readiness-card.tsx +132 -0
  256. package/workspace-snapshot/files/apps/gui/components/custom/guided-step-transition.tsx +60 -0
  257. package/workspace-snapshot/files/apps/gui/components/custom/guided-target-workflow-card.tsx +396 -0
  258. package/workspace-snapshot/files/apps/gui/components/custom/guided-vercel-bridge-card.tsx +861 -0
  259. package/workspace-snapshot/files/apps/gui/components/custom/local-write-confirmation.tsx +91 -0
  260. package/workspace-snapshot/files/apps/gui/components/custom/local-write-preview.tsx +52 -0
  261. package/workspace-snapshot/files/apps/gui/components/custom/preview-panel.tsx +19 -0
  262. package/workspace-snapshot/files/apps/gui/components/custom/primary-setup-task-card.tsx +65 -0
  263. package/workspace-snapshot/files/apps/gui/components/custom/readiness-banner.tsx +91 -0
  264. package/workspace-snapshot/files/apps/gui/components/custom/remote-action-confirmation.tsx +155 -0
  265. package/workspace-snapshot/files/apps/gui/components/custom/remote-action-preview.tsx +84 -0
  266. package/workspace-snapshot/files/apps/gui/components/custom/remote-secret-form.tsx +123 -0
  267. package/workspace-snapshot/files/apps/gui/components/custom/remote-setup-section.tsx +354 -0
  268. package/workspace-snapshot/files/apps/gui/components/custom/review-cloud-secrets-disclosure.tsx +59 -0
  269. package/workspace-snapshot/files/apps/gui/components/custom/review-generated-files-disclosure.tsx +67 -0
  270. package/workspace-snapshot/files/apps/gui/components/custom/section-card.tsx +33 -0
  271. package/workspace-snapshot/files/apps/gui/components/custom/service-icons.tsx +30 -0
  272. package/workspace-snapshot/files/apps/gui/components/custom/setup-apply-result.tsx +52 -0
  273. package/workspace-snapshot/files/apps/gui/components/custom/setup-checklist.tsx +206 -0
  274. package/workspace-snapshot/files/apps/gui/components/custom/setup-dashboard.tsx +124 -0
  275. package/workspace-snapshot/files/apps/gui/components/custom/setup-readonly-sections.tsx +210 -0
  276. package/workspace-snapshot/files/apps/gui/components/custom/status-badge.tsx +22 -0
  277. package/workspace-snapshot/files/apps/gui/components/custom/target-repo-config-form.tsx +647 -0
  278. package/workspace-snapshot/files/apps/gui/components/custom/target-workflow-pr-card.tsx +283 -0
  279. package/workspace-snapshot/files/apps/gui/components/custom/theme-provider.tsx +11 -0
  280. package/workspace-snapshot/files/apps/gui/components/custom/theme-toggle.tsx +44 -0
  281. package/workspace-snapshot/files/apps/gui/components/custom/workflow-install-pending-panel.tsx +116 -0
  282. package/workspace-snapshot/files/apps/gui/components/ui/badge.tsx +40 -0
  283. package/workspace-snapshot/files/apps/gui/components/ui/button.tsx +52 -0
  284. package/workspace-snapshot/files/apps/gui/components/ui/card.tsx +64 -0
  285. package/workspace-snapshot/files/apps/gui/components/ui/checkbox.tsx +21 -0
  286. package/workspace-snapshot/files/apps/gui/components/ui/input.tsx +22 -0
  287. package/workspace-snapshot/files/apps/gui/components/ui/label.tsx +20 -0
  288. package/workspace-snapshot/files/apps/gui/components/ui/separator.tsx +23 -0
  289. package/workspace-snapshot/files/apps/gui/components/ui/skeleton.tsx +13 -0
  290. package/workspace-snapshot/files/apps/gui/components/ui/textarea.tsx +22 -0
  291. package/workspace-snapshot/files/apps/gui/components.json +21 -0
  292. package/workspace-snapshot/files/apps/gui/lib/constants/breakpoints.ts +13 -0
  293. package/workspace-snapshot/files/apps/gui/lib/constants/form.ts +8 -0
  294. package/workspace-snapshot/files/apps/gui/lib/constants/index.ts +4 -0
  295. package/workspace-snapshot/files/apps/gui/lib/constants/layout.ts +9 -0
  296. package/workspace-snapshot/files/apps/gui/lib/constants/spacing.ts +8 -0
  297. package/workspace-snapshot/files/apps/gui/lib/guided-setup.ts +216 -0
  298. package/workspace-snapshot/files/apps/gui/lib/setup-json-response.ts +19 -0
  299. package/workspace-snapshot/files/apps/gui/lib/setup-server.ts +836 -0
  300. package/workspace-snapshot/files/apps/gui/lib/step6-remote-state.ts +43 -0
  301. package/workspace-snapshot/files/apps/gui/lib/utils.ts +6 -0
  302. package/workspace-snapshot/files/apps/gui/lib/vercel-bridge-polling-ui.ts +16 -0
  303. package/workspace-snapshot/files/apps/gui/lib/verification-state.ts +170 -0
  304. package/workspace-snapshot/files/apps/gui/next-env.d.ts +6 -0
  305. package/workspace-snapshot/files/apps/gui/next.config.ts +34 -0
  306. package/workspace-snapshot/files/apps/gui/postcss.config.mjs +8 -0
  307. package/workspace-snapshot/files/apps/gui/public/setup/github-token/github-pat-generate-classic.png +0 -0
  308. package/workspace-snapshot/files/apps/gui/public/setup/github-token/github-pat-generate-new-token.png +0 -0
  309. package/workspace-snapshot/files/apps/gui/public/setup/github-token/github-pat-verify-email.png +0 -0
  310. package/workspace-snapshot/files/apps/gui/styles/globals.css +86 -0
  311. package/workspace-snapshot/files/apps/gui/tsconfig.json +24 -0
  312. package/workspace-snapshot/files/apps/gui/tweetsodium.d.ts +14 -0
  313. package/workspace-snapshot/files/docs/architecture/linear-automation-state-machine.md +267 -0
  314. package/workspace-snapshot/files/docs/decisions/0001-cursor-first-v0.1.md +59 -0
  315. package/workspace-snapshot/files/docs/decisions/0003-automation-state-machine-and-auto-model-policy.md +65 -0
  316. package/workspace-snapshot/files/docs/decisions/0004-agent-provider-boundary.md +109 -0
  317. package/workspace-snapshot/files/docs/design/product-development-harness-gui.md +1024 -0
  318. package/workspace-snapshot/files/docs/getting-started.md +123 -0
  319. package/workspace-snapshot/files/docs/gui-local.md +151 -0
  320. package/workspace-snapshot/files/docs/gui-remote-setup.md +106 -0
  321. package/workspace-snapshot/files/docs/integration-repair.md +82 -0
  322. package/workspace-snapshot/files/docs/issue-intake.md +124 -0
  323. package/workspace-snapshot/files/docs/linear-watcher-setup.md +184 -0
  324. package/workspace-snapshot/files/docs/milestones/m1-runner-foundation.md +51 -0
  325. package/workspace-snapshot/files/docs/milestones/m2-planning-phase.md +129 -0
  326. package/workspace-snapshot/files/docs/milestones/m3-implementation-phase.md +158 -0
  327. package/workspace-snapshot/files/docs/milestones/m4-handoff-phase.md +122 -0
  328. package/workspace-snapshot/files/docs/milestones/m5-revision-phase.md +101 -0
  329. package/workspace-snapshot/files/docs/milestones/m6-merge-phase.md +143 -0
  330. package/workspace-snapshot/files/docs/milestones/m7-issue-intake.md +72 -0
  331. package/workspace-snapshot/files/docs/milestones/m8-linear-watcher.md +80 -0
  332. package/workspace-snapshot/files/docs/npm-packaging-spike.md +52 -0
  333. package/workspace-snapshot/files/docs/operator-config.md +187 -0
  334. package/workspace-snapshot/files/docs/p-dev.md +213 -0
  335. package/workspace-snapshot/files/docs/production-sync-automation.md +176 -0
  336. package/workspace-snapshot/files/docs/provider-portability.md +131 -0
  337. package/workspace-snapshot/files/docs/releases/release-process.md +272 -0
  338. package/workspace-snapshot/files/docs/releases/v0.2.0.md +193 -0
  339. package/workspace-snapshot/files/docs/releases/v0.3.0.md +188 -0
  340. package/workspace-snapshot/files/docs/releases/v0.3.1.md +102 -0
  341. package/workspace-snapshot/files/docs/research/001-manual-run-retrospective.md +64 -0
  342. package/workspace-snapshot/files/docs/research/002-linear-cursor-integration-smoke-test.md +64 -0
  343. package/workspace-snapshot/files/docs/research/003-cursor-automation-planning-router-spike.md +104 -0
  344. package/workspace-snapshot/files/docs/research/README.md +26 -0
  345. package/workspace-snapshot/files/docs/security.md +190 -0
  346. package/workspace-snapshot/files/docs/skills/README.md +7 -0
  347. package/workspace-snapshot/files/docs/skills/skill-architecture.md +197 -0
  348. package/workspace-snapshot/files/docs/target-repo-branch-setup.md +80 -0
  349. package/workspace-snapshot/files/evals/README.md +31 -0
  350. package/workspace-snapshot/files/examples/README.md +32 -0
  351. package/workspace-snapshot/files/examples/runs/001-target-app-github-link/README.md +49 -0
  352. package/workspace-snapshot/files/examples/runs/001-target-app-github-link/eval-scorecard.md +63 -0
  353. package/workspace-snapshot/files/examples/runs/001-target-app-github-link/implementation-plan.md +79 -0
  354. package/workspace-snapshot/files/examples/runs/001-target-app-github-link/linear-issue.md +74 -0
  355. package/workspace-snapshot/files/examples/runs/001-target-app-github-link/pr-readiness-report.md +92 -0
  356. package/workspace-snapshot/files/examples/runs/m5.5-live-sandbox-smoke/README.md +73 -0
  357. package/workspace-snapshot/files/gpt/issue-intake/custom-gpt-instructions.md +112 -0
  358. package/workspace-snapshot/files/gpt/issue-intake/knowledge.md +278 -0
  359. package/workspace-snapshot/files/gpt/issue-intake/setup-guide.md +115 -0
  360. package/workspace-snapshot/files/gpt/issue-intake/smoke-test.md +119 -0
  361. package/workspace-snapshot/files/harness.config.json +92 -0
  362. package/workspace-snapshot/files/harness.config.schema.json +352 -0
  363. package/workspace-snapshot/files/package-lock.json +3716 -0
  364. package/workspace-snapshot/files/package.json +60 -0
  365. package/workspace-snapshot/files/packages/p-dev/LICENSE +21 -0
  366. package/workspace-snapshot/files/packages/p-dev/README.md +64 -0
  367. package/workspace-snapshot/files/packages/p-dev/gui.next.config.mjs +13 -0
  368. package/workspace-snapshot/files/packages/p-dev/package.json +63 -0
  369. package/workspace-snapshot/files/prompts/issue-intake-chatgpt.md +264 -0
  370. package/workspace-snapshot/files/scripts/generate-config-schema.ts +16 -0
  371. package/workspace-snapshot/files/scripts/prepare-p-dev-package.ts +155 -0
  372. package/workspace-snapshot/files/skills/README.md +7 -0
  373. package/workspace-snapshot/files/skills/issue-intake/README.md +5 -0
  374. package/workspace-snapshot/files/src/agents/cursor-provider.ts +109 -0
  375. package/workspace-snapshot/files/src/agents/index.ts +68 -0
  376. package/workspace-snapshot/files/src/agents/provider.ts +7 -0
  377. package/workspace-snapshot/files/src/agents/types.ts +85 -0
  378. package/workspace-snapshot/files/src/artifacts/events.ts +31 -0
  379. package/workspace-snapshot/files/src/artifacts/manifest-fields.ts +9 -0
  380. package/workspace-snapshot/files/src/artifacts/manifest.ts +20 -0
  381. package/workspace-snapshot/files/src/artifacts/paths.ts +145 -0
  382. package/workspace-snapshot/files/src/artifacts/redact.ts +50 -0
  383. package/workspace-snapshot/files/src/artifacts/run-id.ts +4 -0
  384. package/workspace-snapshot/files/src/artifacts/snapshot.ts +13 -0
  385. package/workspace-snapshot/files/src/artifacts/summary.ts +116 -0
  386. package/workspace-snapshot/files/src/cli/commands/diagnose-vercel-bridge.ts +25 -0
  387. package/workspace-snapshot/files/src/cli/commands/doctor.ts +205 -0
  388. package/workspace-snapshot/files/src/cli/commands/inspect.ts +46 -0
  389. package/workspace-snapshot/files/src/cli/commands/operator-init.ts +39 -0
  390. package/workspace-snapshot/files/src/cli/commands/redact-output.ts +19 -0
  391. package/workspace-snapshot/files/src/cli/commands/resolve-route.ts +81 -0
  392. package/workspace-snapshot/files/src/cli/commands/run.ts +53 -0
  393. package/workspace-snapshot/files/src/cli/commands/sync-production.ts +207 -0
  394. package/workspace-snapshot/files/src/cli/commands/validate-issue.ts +72 -0
  395. package/workspace-snapshot/files/src/cli/exit-codes.ts +4 -0
  396. package/workspace-snapshot/files/src/cli/finalize-exit.ts +9 -0
  397. package/workspace-snapshot/files/src/cli/program.ts +200 -0
  398. package/workspace-snapshot/files/src/config/defaults.ts +33 -0
  399. package/workspace-snapshot/files/src/config/load-config.ts +80 -0
  400. package/workspace-snapshot/files/src/config/load-dotenv.ts +11 -0
  401. package/workspace-snapshot/files/src/config/resolve-config.ts +127 -0
  402. package/workspace-snapshot/files/src/config/schema.ts +129 -0
  403. package/workspace-snapshot/files/src/config/status-names.ts +63 -0
  404. package/workspace-snapshot/files/src/config/types.ts +1 -0
  405. package/workspace-snapshot/files/src/cursor/agent-factory.ts +126 -0
  406. package/workspace-snapshot/files/src/cursor/errors.ts +18 -0
  407. package/workspace-snapshot/files/src/cursor/git-result.ts +87 -0
  408. package/workspace-snapshot/files/src/cursor/model.ts +47 -0
  409. package/workspace-snapshot/files/src/cursor/revision-git-result.ts +80 -0
  410. package/workspace-snapshot/files/src/cursor/run-cleanup.ts +30 -0
  411. package/workspace-snapshot/files/src/cursor/run-observer.ts +367 -0
  412. package/workspace-snapshot/files/src/cursor/urls.ts +19 -0
  413. package/workspace-snapshot/files/src/fixture/frontmatter.ts +56 -0
  414. package/workspace-snapshot/files/src/github/actions-url.ts +13 -0
  415. package/workspace-snapshot/files/src/github/base-branch.ts +120 -0
  416. package/workspace-snapshot/files/src/github/check-policy.ts +108 -0
  417. package/workspace-snapshot/files/src/github/client.ts +796 -0
  418. package/workspace-snapshot/files/src/github/commit-reachability.ts +184 -0
  419. package/workspace-snapshot/files/src/github/links.ts +23 -0
  420. package/workspace-snapshot/files/src/github/merge-result.ts +31 -0
  421. package/workspace-snapshot/files/src/github/pr-discovery.ts +55 -0
  422. package/workspace-snapshot/files/src/github/pr-inspector.ts +297 -0
  423. package/workspace-snapshot/files/src/github/pr-url.ts +23 -0
  424. package/workspace-snapshot/files/src/github/rate-limit-metadata.ts +105 -0
  425. package/workspace-snapshot/files/src/gui/configure-health.ts +160 -0
  426. package/workspace-snapshot/files/src/gui/dev-server-process.ts +213 -0
  427. package/workspace-snapshot/files/src/gui/port.ts +78 -0
  428. package/workspace-snapshot/files/src/gui/repo-root.ts +61 -0
  429. package/workspace-snapshot/files/src/gui/start-configure-stable.ts +139 -0
  430. package/workspace-snapshot/files/src/gui/start-gui.ts +126 -0
  431. package/workspace-snapshot/files/src/index.ts +10 -0
  432. package/workspace-snapshot/files/src/linear/client.ts +49 -0
  433. package/workspace-snapshot/files/src/linear/comment-card.ts +74 -0
  434. package/workspace-snapshot/files/src/linear/comments.ts +891 -0
  435. package/workspace-snapshot/files/src/linear/handoff-comment.ts +19 -0
  436. package/workspace-snapshot/files/src/linear/issue-query.ts +70 -0
  437. package/workspace-snapshot/files/src/linear/markers.ts +238 -0
  438. package/workspace-snapshot/files/src/linear/merge-source-comment.ts +46 -0
  439. package/workspace-snapshot/files/src/linear/parser.ts +101 -0
  440. package/workspace-snapshot/files/src/linear/phase-labels.ts +58 -0
  441. package/workspace-snapshot/files/src/linear/planning-comment.ts +19 -0
  442. package/workspace-snapshot/files/src/linear/pm-feedback-comment.ts +41 -0
  443. package/workspace-snapshot/files/src/linear/revision-comment.ts +19 -0
  444. package/workspace-snapshot/files/src/linear/states.ts +20 -0
  445. package/workspace-snapshot/files/src/linear/writer.ts +216 -0
  446. package/workspace-snapshot/files/src/p-dev/browser.ts +26 -0
  447. package/workspace-snapshot/files/src/p-dev/cli.ts +93 -0
  448. package/workspace-snapshot/files/src/p-dev/git-object-plumbing.ts +271 -0
  449. package/workspace-snapshot/files/src/p-dev/launch.ts +173 -0
  450. package/workspace-snapshot/files/src/p-dev/main.ts +10 -0
  451. package/workspace-snapshot/files/src/p-dev/next-bin.ts +8 -0
  452. package/workspace-snapshot/files/src/p-dev/node-version.ts +46 -0
  453. package/workspace-snapshot/files/src/p-dev/package-paths.ts +47 -0
  454. package/workspace-snapshot/files/src/p-dev/package-version.ts +63 -0
  455. package/workspace-snapshot/files/src/p-dev/runtime-mode.ts +28 -0
  456. package/workspace-snapshot/files/src/p-dev/shutdown.ts +66 -0
  457. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-digest.ts +50 -0
  458. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-generator.ts +112 -0
  459. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-git.ts +221 -0
  460. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-manifest.ts +336 -0
  461. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-policy.ts +198 -0
  462. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-types.ts +59 -0
  463. package/workspace-snapshot/files/src/p-dev/workspace-snapshot-validation.ts +137 -0
  464. package/workspace-snapshot/files/src/p-dev/workspace.ts +114 -0
  465. package/workspace-snapshot/files/src/preview/production-from-merge.ts +143 -0
  466. package/workspace-snapshot/files/src/preview/urls.ts +28 -0
  467. package/workspace-snapshot/files/src/preview/vercel-from-pr.ts +123 -0
  468. package/workspace-snapshot/files/src/prompts/branch-name.ts +22 -0
  469. package/workspace-snapshot/files/src/prompts/builder.ts +88 -0
  470. package/workspace-snapshot/files/src/prompts/implementation.md +77 -0
  471. package/workspace-snapshot/files/src/prompts/integration-repair-builder.ts +65 -0
  472. package/workspace-snapshot/files/src/prompts/integration-repair.md +111 -0
  473. package/workspace-snapshot/files/src/prompts/planning.md +64 -0
  474. package/workspace-snapshot/files/src/prompts/revision-builder.ts +61 -0
  475. package/workspace-snapshot/files/src/prompts/revision.md +71 -0
  476. package/workspace-snapshot/files/src/resolver/allowed-repos.ts +18 -0
  477. package/workspace-snapshot/files/src/resolver/errors.ts +14 -0
  478. package/workspace-snapshot/files/src/resolver/normalize-repo.ts +32 -0
  479. package/workspace-snapshot/files/src/resolver/target-repo.ts +118 -0
  480. package/workspace-snapshot/files/src/runner/building-recovery.ts +26 -0
  481. package/workspace-snapshot/files/src/runner/dry-run.ts +137 -0
  482. package/workspace-snapshot/files/src/runner/errors.ts +70 -0
  483. package/workspace-snapshot/files/src/runner/execution-environment.ts +179 -0
  484. package/workspace-snapshot/files/src/runner/fixture.ts +25 -0
  485. package/workspace-snapshot/files/src/runner/idempotency.ts +507 -0
  486. package/workspace-snapshot/files/src/runner/orchestrator.ts +182 -0
  487. package/workspace-snapshot/files/src/runner/phase-args.ts +49 -0
  488. package/workspace-snapshot/files/src/runner/phase-infer.ts +67 -0
  489. package/workspace-snapshot/files/src/runner/phases/handoff.ts +615 -0
  490. package/workspace-snapshot/files/src/runner/phases/implementation.ts +617 -0
  491. package/workspace-snapshot/files/src/runner/phases/integration-repair.ts +613 -0
  492. package/workspace-snapshot/files/src/runner/phases/merge.ts +1202 -0
  493. package/workspace-snapshot/files/src/runner/phases/planning.ts +456 -0
  494. package/workspace-snapshot/files/src/runner/phases/production-sync.ts +308 -0
  495. package/workspace-snapshot/files/src/runner/phases/revision.ts +795 -0
  496. package/workspace-snapshot/files/src/runner/preflight.ts +218 -0
  497. package/workspace-snapshot/files/src/runner/resolve-route.ts +154 -0
  498. package/workspace-snapshot/files/src/setup/config-builder.ts +117 -0
  499. package/workspace-snapshot/files/src/setup/config-local-editor.ts +260 -0
  500. package/workspace-snapshot/files/src/setup/config-writer.ts +173 -0
  501. package/workspace-snapshot/files/src/setup/control-plane-readiness-server.ts +16 -0
  502. package/workspace-snapshot/files/src/setup/control-plane-readiness.ts +291 -0
  503. package/workspace-snapshot/files/src/setup/control-plane-setup-state.ts +60 -0
  504. package/workspace-snapshot/files/src/setup/control-plane-types.ts +121 -0
  505. package/workspace-snapshot/files/src/setup/doctor-summary.ts +96 -0
  506. package/workspace-snapshot/files/src/setup/env-merge.ts +266 -0
  507. package/workspace-snapshot/files/src/setup/env-writer.ts +179 -0
  508. package/workspace-snapshot/files/src/setup/first-run-readiness.ts +1431 -0
  509. package/workspace-snapshot/files/src/setup/generated-instructions.ts +96 -0
  510. package/workspace-snapshot/files/src/setup/github-dispatch-token.ts +88 -0
  511. package/workspace-snapshot/files/src/setup/github-remote-provider.ts +983 -0
  512. package/workspace-snapshot/files/src/setup/github-remote-setup-live.ts +775 -0
  513. package/workspace-snapshot/files/src/setup/github-repo-slug.ts +31 -0
  514. package/workspace-snapshot/files/src/setup/github-secret-encryption.ts +16 -0
  515. package/workspace-snapshot/files/src/setup/github-upload-rate-limit-gate.ts +58 -0
  516. package/workspace-snapshot/files/src/setup/github-workflow-permissions.ts +174 -0
  517. package/workspace-snapshot/files/src/setup/gui-view-model.ts +566 -0
  518. package/workspace-snapshot/files/src/setup/guided-config-form.ts +52 -0
  519. package/workspace-snapshot/files/src/setup/harness-dispatch-repo.ts +158 -0
  520. package/workspace-snapshot/files/src/setup/harness-managed-repo-marker.ts +653 -0
  521. package/workspace-snapshot/files/src/setup/harness-provisioning-context.ts +331 -0
  522. package/workspace-snapshot/files/src/setup/harness-provisioning-pending-state.ts +282 -0
  523. package/workspace-snapshot/files/src/setup/harness-repo-provisioning.ts +1656 -0
  524. package/workspace-snapshot/files/src/setup/harness-secret-fingerprint.ts +51 -0
  525. package/workspace-snapshot/files/src/setup/harness-secret-setup.ts +439 -0
  526. package/workspace-snapshot/files/src/setup/harness-snapshot-provisioning-helpers.ts +92 -0
  527. package/workspace-snapshot/files/src/setup/harness-snapshot-provisioning.ts +1007 -0
  528. package/workspace-snapshot/files/src/setup/harness-template-identity.ts +151 -0
  529. package/workspace-snapshot/files/src/setup/harness-workspace-snapshot-loader.ts +105 -0
  530. package/workspace-snapshot/files/src/setup/linear-setup-apply.ts +270 -0
  531. package/workspace-snapshot/files/src/setup/linear-setup-client.ts +276 -0
  532. package/workspace-snapshot/files/src/setup/linear-setup-plan.ts +353 -0
  533. package/workspace-snapshot/files/src/setup/linear-setup-summary.ts +33 -0
  534. package/workspace-snapshot/files/src/setup/linear-status-contract.ts +110 -0
  535. package/workspace-snapshot/files/src/setup/linear-webhook-env-local.ts +104 -0
  536. package/workspace-snapshot/files/src/setup/linear-webhook-secret.ts +441 -0
  537. package/workspace-snapshot/files/src/setup/local-apply-actions.ts +524 -0
  538. package/workspace-snapshot/files/src/setup/local-readiness-checks.ts +334 -0
  539. package/workspace-snapshot/files/src/setup/mock-git-repository-store.ts +291 -0
  540. package/workspace-snapshot/files/src/setup/mock-target-workflow-finalization.ts +445 -0
  541. package/workspace-snapshot/files/src/setup/model-settings.ts +73 -0
  542. package/workspace-snapshot/files/src/setup/permission-model.ts +79 -0
  543. package/workspace-snapshot/files/src/setup/redact-secrets.ts +85 -0
  544. package/workspace-snapshot/files/src/setup/remote-actions.ts +214 -0
  545. package/workspace-snapshot/files/src/setup/remote-apply-actions.ts +390 -0
  546. package/workspace-snapshot/files/src/setup/remote-preview-fingerprint.ts +37 -0
  547. package/workspace-snapshot/files/src/setup/remote-setup-summary.ts +143 -0
  548. package/workspace-snapshot/files/src/setup/secret-change-token.ts +14 -0
  549. package/workspace-snapshot/files/src/setup/service-verification.ts +549 -0
  550. package/workspace-snapshot/files/src/setup/setup-actions.ts +183 -0
  551. package/workspace-snapshot/files/src/setup/setup-github-auth.ts +15 -0
  552. package/workspace-snapshot/files/src/setup/setup-state.ts +74 -0
  553. package/workspace-snapshot/files/src/setup/stale-smoke-repo.ts +141 -0
  554. package/workspace-snapshot/files/src/setup/sync-downstream-summaries.ts +105 -0
  555. package/workspace-snapshot/files/src/setup/target-workflow-finalization-lock.ts +95 -0
  556. package/workspace-snapshot/files/src/setup/target-workflow-finalization-types.ts +55 -0
  557. package/workspace-snapshot/files/src/setup/target-workflow-finalization.ts +897 -0
  558. package/workspace-snapshot/files/src/setup/target-workflow-setup.ts +247 -0
  559. package/workspace-snapshot/files/src/setup/test-only-provisioning-provider.ts +51 -0
  560. package/workspace-snapshot/files/src/setup/test-only-remote-setup-provider.ts +51 -0
  561. package/workspace-snapshot/files/src/setup/tweetsodium.d.ts +14 -0
  562. package/workspace-snapshot/files/src/setup/vercel-bridge-diagnostics.ts +510 -0
  563. package/workspace-snapshot/files/src/setup/vercel-bridge-options.ts +160 -0
  564. package/workspace-snapshot/files/src/setup/vercel-bridge-readiness.ts +150 -0
  565. package/workspace-snapshot/files/src/setup/vercel-bridge-redeploy-poll.ts +744 -0
  566. package/workspace-snapshot/files/src/setup/vercel-bridge-redeploy-state.ts +46 -0
  567. package/workspace-snapshot/files/src/setup/vercel-bridge-structured-log.ts +86 -0
  568. package/workspace-snapshot/files/src/setup/vercel-bridge-verification.ts +63 -0
  569. package/workspace-snapshot/files/src/setup/vercel-production-redeploy.ts +298 -0
  570. package/workspace-snapshot/files/src/setup/vercel-setup-apply.ts +1058 -0
  571. package/workspace-snapshot/files/src/setup/vercel-setup-client.ts +695 -0
  572. package/workspace-snapshot/files/src/setup/vercel-setup-plan.ts +672 -0
  573. package/workspace-snapshot/files/src/setup/vercel-setup-summary.ts +42 -0
  574. package/workspace-snapshot/files/src/setup/vercel-webhook-probe.ts +161 -0
  575. package/workspace-snapshot/files/src/setup/workflow-install-merge-errors.ts +166 -0
  576. package/workspace-snapshot/files/src/types/parsed-issue.ts +8 -0
  577. package/workspace-snapshot/files/src/types/run.ts +157 -0
  578. package/workspace-snapshot/files/src/validate/constants.ts +2 -0
  579. package/workspace-snapshot/files/src/validate/issue.ts +286 -0
  580. package/workspace-snapshot/files/src/validate/report.ts +68 -0
  581. package/workspace-snapshot/files/src/validate/types.ts +29 -0
  582. package/workspace-snapshot/files/src/webhook/dispatch-github.ts +44 -0
  583. package/workspace-snapshot/files/src/webhook/dispatch-statuses.ts +26 -0
  584. package/workspace-snapshot/files/src/webhook/extract-issue-key.ts +49 -0
  585. package/workspace-snapshot/files/src/webhook/filter.ts +41 -0
  586. package/workspace-snapshot/files/src/webhook/handle-linear-webhook.ts +201 -0
  587. package/workspace-snapshot/files/src/webhook/parse-linear-issue-event.ts +105 -0
  588. package/workspace-snapshot/files/src/webhook/redact-log.ts +26 -0
  589. package/workspace-snapshot/files/src/webhook/types.ts +75 -0
  590. package/workspace-snapshot/files/src/webhook/verify.ts +68 -0
  591. package/workspace-snapshot/files/src/webhook/workflow-command.ts +10 -0
  592. package/workspace-snapshot/files/src/workflow/dispatch-metadata.ts +59 -0
  593. package/workspace-snapshot/files/src/workflow/manifest-summary.ts +57 -0
  594. package/workspace-snapshot/files/src/workflow/production-sync-dispatch.ts +65 -0
  595. package/workspace-snapshot/files/src/workflow/summarize-manifest.ts +20 -0
  596. package/workspace-snapshot/files/src/workflow/validate.ts +43 -0
  597. package/workspace-snapshot/files/src/workflow/write-dispatch-metadata.ts +8 -0
  598. package/workspace-snapshot/files/templates/eval-scorecard.md +54 -0
  599. package/workspace-snapshot/files/templates/implementation-plan.md +59 -0
  600. package/workspace-snapshot/files/templates/linear-issue.md +53 -0
  601. package/workspace-snapshot/files/templates/pr-readiness-report.md +57 -0
  602. package/workspace-snapshot/files/tests/agents/cursor-provider.test.ts +238 -0
  603. package/workspace-snapshot/files/tests/artifacts/manifest.test.ts +54 -0
  604. package/workspace-snapshot/files/tests/artifacts/redact.test.ts +47 -0
  605. package/workspace-snapshot/files/tests/cli/doctor.test.ts +120 -0
  606. package/workspace-snapshot/files/tests/cli/finalize-exit.test.ts +28 -0
  607. package/workspace-snapshot/files/tests/cli/operator-init.test.ts +146 -0
  608. package/workspace-snapshot/files/tests/cli/sync-production-dispatch.test.ts +103 -0
  609. package/workspace-snapshot/files/tests/cli/validate-issue.test.ts +99 -0
  610. package/workspace-snapshot/files/tests/config/load-dotenv.test.ts +64 -0
  611. package/workspace-snapshot/files/tests/config/resolve-config.test.ts +273 -0
  612. package/workspace-snapshot/files/tests/config/schema.test.ts +107 -0
  613. package/workspace-snapshot/files/tests/cursor/agent-factory.test.ts +217 -0
  614. package/workspace-snapshot/files/tests/cursor/git-result.test.ts +77 -0
  615. package/workspace-snapshot/files/tests/cursor/model.test.ts +108 -0
  616. package/workspace-snapshot/files/tests/cursor/revision-git-result.test.ts +68 -0
  617. package/workspace-snapshot/files/tests/cursor/run-cleanup.test.ts +52 -0
  618. package/workspace-snapshot/files/tests/cursor/run-observer.test.ts +280 -0
  619. package/workspace-snapshot/files/tests/cursor/urls.test.ts +27 -0
  620. package/workspace-snapshot/files/tests/fixtures/config/minimal.json +16 -0
  621. package/workspace-snapshot/files/tests/fixtures/github/pr-4-vercel-comment.json +10 -0
  622. package/workspace-snapshot/files/tests/fixtures/issues/broad-for-direct-impl.md +28 -0
  623. package/workspace-snapshot/files/tests/fixtures/issues/context-target-repo.md +21 -0
  624. package/workspace-snapshot/files/tests/fixtures/issues/explicit-target-repo.md +21 -0
  625. package/workspace-snapshot/files/tests/fixtures/issues/gpt-broad-example.md +35 -0
  626. package/workspace-snapshot/files/tests/fixtures/issues/gpt-narrow-example.md +30 -0
  627. package/workspace-snapshot/files/tests/fixtures/issues/invalid-missing-task.md +16 -0
  628. package/workspace-snapshot/files/tests/fixtures/issues/invalid-no-ac-bullets.md +20 -0
  629. package/workspace-snapshot/files/tests/fixtures/issues/missing-acceptance-criteria.md +17 -0
  630. package/workspace-snapshot/files/tests/fixtures/issues/unknown-repo.md +20 -0
  631. package/workspace-snapshot/files/tests/fixtures/issues/valid-minimal.md +20 -0
  632. package/workspace-snapshot/files/tests/fixtures/issues/valid-project-only.md +17 -0
  633. package/workspace-snapshot/files/tests/fixtures/issues/valid-target-app.md +31 -0
  634. package/workspace-snapshot/files/tests/fixtures/linear/implementation-comment-wes-13.md +16 -0
  635. package/workspace-snapshot/files/tests/fixtures/linear/pm-feedback-wes-13.md +3 -0
  636. package/workspace-snapshot/files/tests/fixtures/webhook/issue-building-to-pr-open.json +27 -0
  637. package/workspace-snapshot/files/tests/fixtures/webhook/issue-pm-review.json +27 -0
  638. package/workspace-snapshot/files/tests/fixtures/webhook/issue-ready-for-planning.json +27 -0
  639. package/workspace-snapshot/files/tests/fixtures/webhook/issue-title-only-update.json +25 -0
  640. package/workspace-snapshot/files/tests/fixtures/workflows/harness-auto-runner-with-production-sync.yml +561 -0
  641. package/workspace-snapshot/files/tests/fixtures/workflows/trigger-harness-production-sync.yml +31 -0
  642. package/workspace-snapshot/files/tests/github/actions-url.test.ts +45 -0
  643. package/workspace-snapshot/files/tests/github/base-branch.test.ts +156 -0
  644. package/workspace-snapshot/files/tests/github/check-policy.test.ts +59 -0
  645. package/workspace-snapshot/files/tests/github/client.test.ts +226 -0
  646. package/workspace-snapshot/files/tests/github/commit-reachability.test.ts +148 -0
  647. package/workspace-snapshot/files/tests/github/merge-result.test.ts +26 -0
  648. package/workspace-snapshot/files/tests/github/pr-discovery.test.ts +55 -0
  649. package/workspace-snapshot/files/tests/github/pr-inspector.test.ts +393 -0
  650. package/workspace-snapshot/files/tests/github/pr-url.test.ts +30 -0
  651. package/workspace-snapshot/files/tests/github/rate-limit-metadata.test.ts +92 -0
  652. package/workspace-snapshot/files/tests/gui/configure-fix-loop.test.ts +460 -0
  653. package/workspace-snapshot/files/tests/gui/configure-health.test.ts +67 -0
  654. package/workspace-snapshot/files/tests/gui/design-system.test.ts +86 -0
  655. package/workspace-snapshot/files/tests/gui/dev-server-process.test.ts +22 -0
  656. package/workspace-snapshot/files/tests/gui/guided-setup.test.ts +186 -0
  657. package/workspace-snapshot/files/tests/gui/m6-configure-boundaries.test.ts +884 -0
  658. package/workspace-snapshot/files/tests/gui/packaged-harness-cloud-secrets-routes.test.ts +287 -0
  659. package/workspace-snapshot/files/tests/gui/packaged-harness-provisioning-routes.test.ts +212 -0
  660. package/workspace-snapshot/files/tests/gui/packaged-harness-target-workflow-routes.test.ts +227 -0
  661. package/workspace-snapshot/files/tests/gui/port.test.ts +74 -0
  662. package/workspace-snapshot/files/tests/gui/repo-root.test.ts +60 -0
  663. package/workspace-snapshot/files/tests/gui/setup-api.test.ts +181 -0
  664. package/workspace-snapshot/files/tests/gui/setup-json-response.test.ts +34 -0
  665. package/workspace-snapshot/files/tests/gui/step6-remote-state.test.ts +75 -0
  666. package/workspace-snapshot/files/tests/gui/sync-downstream-summaries.test.ts +198 -0
  667. package/workspace-snapshot/files/tests/gui/vercel-bridge-polling-ui.test.ts +25 -0
  668. package/workspace-snapshot/files/tests/gui/verification-state.test.ts +172 -0
  669. package/workspace-snapshot/files/tests/linear/comment-assertions.ts +24 -0
  670. package/workspace-snapshot/files/tests/linear/comment-card.test.ts +73 -0
  671. package/workspace-snapshot/files/tests/linear/comments.test.ts +185 -0
  672. package/workspace-snapshot/files/tests/linear/handoff-comment.test.ts +34 -0
  673. package/workspace-snapshot/files/tests/linear/markers.test.ts +97 -0
  674. package/workspace-snapshot/files/tests/linear/merge-comment.test.ts +61 -0
  675. package/workspace-snapshot/files/tests/linear/merge-source-comment.test.ts +49 -0
  676. package/workspace-snapshot/files/tests/linear/parser.test.ts +83 -0
  677. package/workspace-snapshot/files/tests/linear/planning-comment.test.ts +29 -0
  678. package/workspace-snapshot/files/tests/linear/pm-feedback-comment.test.ts +63 -0
  679. package/workspace-snapshot/files/tests/p-dev/browser.test.ts +38 -0
  680. package/workspace-snapshot/files/tests/p-dev/cli.test.ts +39 -0
  681. package/workspace-snapshot/files/tests/p-dev/git-object-plumbing.test.ts +139 -0
  682. package/workspace-snapshot/files/tests/p-dev/launch.test.ts +110 -0
  683. package/workspace-snapshot/files/tests/p-dev/next-bin.test.ts +16 -0
  684. package/workspace-snapshot/files/tests/p-dev/node-version.test.ts +20 -0
  685. package/workspace-snapshot/files/tests/p-dev/package-manifest.test.ts +47 -0
  686. package/workspace-snapshot/files/tests/p-dev/package-packed-artifact.test.ts +130 -0
  687. package/workspace-snapshot/files/tests/p-dev/package-paths.test.ts +43 -0
  688. package/workspace-snapshot/files/tests/p-dev/package-version.test.ts +55 -0
  689. package/workspace-snapshot/files/tests/p-dev/packaged-workspace-setup.test.ts +87 -0
  690. package/workspace-snapshot/files/tests/p-dev/runtime-mode.test.ts +18 -0
  691. package/workspace-snapshot/files/tests/p-dev/workspace-snapshot-digest.test.ts +61 -0
  692. package/workspace-snapshot/files/tests/p-dev/workspace-snapshot-generator.test.ts +76 -0
  693. package/workspace-snapshot/files/tests/p-dev/workspace-snapshot-policy.test.ts +35 -0
  694. package/workspace-snapshot/files/tests/p-dev/workspace-snapshot-validation.test.ts +158 -0
  695. package/workspace-snapshot/files/tests/p-dev/workspace.test.ts +80 -0
  696. package/workspace-snapshot/files/tests/preview/production-from-merge.test.ts +39 -0
  697. package/workspace-snapshot/files/tests/preview/vercel-from-pr.test.ts +120 -0
  698. package/workspace-snapshot/files/tests/prompts/builder.test.ts +58 -0
  699. package/workspace-snapshot/files/tests/prompts/implementation-builder.test.ts +76 -0
  700. package/workspace-snapshot/files/tests/prompts/issue-intake-chatgpt.test.ts +105 -0
  701. package/workspace-snapshot/files/tests/resolver/allowed-repos.test.ts +44 -0
  702. package/workspace-snapshot/files/tests/resolver/normalize-repo.test.ts +44 -0
  703. package/workspace-snapshot/files/tests/resolver/target-repo.test.ts +91 -0
  704. package/workspace-snapshot/files/tests/runner/building-recovery.test.ts +30 -0
  705. package/workspace-snapshot/files/tests/runner/dry-run.test.ts +128 -0
  706. package/workspace-snapshot/files/tests/runner/execution-environment.test.ts +114 -0
  707. package/workspace-snapshot/files/tests/runner/handoff.test.ts +312 -0
  708. package/workspace-snapshot/files/tests/runner/idempotency-handoff.test.ts +170 -0
  709. package/workspace-snapshot/files/tests/runner/idempotency-implementation.test.ts +143 -0
  710. package/workspace-snapshot/files/tests/runner/idempotency-merge.test.ts +118 -0
  711. package/workspace-snapshot/files/tests/runner/idempotency-revision.test.ts +111 -0
  712. package/workspace-snapshot/files/tests/runner/idempotency.test.ts +83 -0
  713. package/workspace-snapshot/files/tests/runner/implementation.test.ts +196 -0
  714. package/workspace-snapshot/files/tests/runner/integration-repair.test.ts +263 -0
  715. package/workspace-snapshot/files/tests/runner/merge.test.ts +760 -0
  716. package/workspace-snapshot/files/tests/runner/orchestrator.test.ts +301 -0
  717. package/workspace-snapshot/files/tests/runner/phase-args.test.ts +38 -0
  718. package/workspace-snapshot/files/tests/runner/planning.test.ts +160 -0
  719. package/workspace-snapshot/files/tests/runner/resolve-route.test.ts +249 -0
  720. package/workspace-snapshot/files/tests/runner/revision.test.ts +326 -0
  721. package/workspace-snapshot/files/tests/setup/config-builder.test.ts +136 -0
  722. package/workspace-snapshot/files/tests/setup/config-local-editor.test.ts +164 -0
  723. package/workspace-snapshot/files/tests/setup/connect-services-credential-availability.test.ts +151 -0
  724. package/workspace-snapshot/files/tests/setup/connect-services-env.test.ts +84 -0
  725. package/workspace-snapshot/files/tests/setup/control-plane-readiness.test.ts +59 -0
  726. package/workspace-snapshot/files/tests/setup/doctor-summary.test.ts +48 -0
  727. package/workspace-snapshot/files/tests/setup/env-merge.test.ts +177 -0
  728. package/workspace-snapshot/files/tests/setup/env-writer.test.ts +97 -0
  729. package/workspace-snapshot/files/tests/setup/first-run-readiness.test.ts +1099 -0
  730. package/workspace-snapshot/files/tests/setup/generated-instructions.test.ts +48 -0
  731. package/workspace-snapshot/files/tests/setup/github-dispatch-token.test.ts +111 -0
  732. package/workspace-snapshot/files/tests/setup/github-remote-provider.test.ts +66 -0
  733. package/workspace-snapshot/files/tests/setup/github-remote-setup-live.test.ts +59 -0
  734. package/workspace-snapshot/files/tests/setup/github-workflow-permissions.test.ts +71 -0
  735. package/workspace-snapshot/files/tests/setup/gui-remote-storage.test.ts +43 -0
  736. package/workspace-snapshot/files/tests/setup/gui-view-model.test.ts +251 -0
  737. package/workspace-snapshot/files/tests/setup/guided-config-form.test.ts +54 -0
  738. package/workspace-snapshot/files/tests/setup/harness-dispatch-repo.test.ts +105 -0
  739. package/workspace-snapshot/files/tests/setup/harness-managed-repo-marker.test.ts +141 -0
  740. package/workspace-snapshot/files/tests/setup/harness-provisioning-context.test.ts +89 -0
  741. package/workspace-snapshot/files/tests/setup/harness-provisioning-pending-state.test.ts +88 -0
  742. package/workspace-snapshot/files/tests/setup/harness-repo-provisioning.test.ts +897 -0
  743. package/workspace-snapshot/files/tests/setup/harness-secret-setup.test.ts +255 -0
  744. package/workspace-snapshot/files/tests/setup/harness-snapshot-default-branch.test.ts +73 -0
  745. package/workspace-snapshot/files/tests/setup/harness-snapshot-description-finalization.test.ts +136 -0
  746. package/workspace-snapshot/files/tests/setup/harness-snapshot-marker-tree.test.ts +61 -0
  747. package/workspace-snapshot/files/tests/setup/harness-snapshot-reconciliation.test.ts +132 -0
  748. package/workspace-snapshot/files/tests/setup/harness-snapshot-structured-errors.test.ts +137 -0
  749. package/workspace-snapshot/files/tests/setup/harness-snapshot-upload-rate-limit.test.ts +105 -0
  750. package/workspace-snapshot/files/tests/setup/linear-setup-apply.test.ts +131 -0
  751. package/workspace-snapshot/files/tests/setup/linear-setup-plan.test.ts +106 -0
  752. package/workspace-snapshot/files/tests/setup/linear-webhook-env-local.test.ts +95 -0
  753. package/workspace-snapshot/files/tests/setup/linear-webhook-secret.test.ts +256 -0
  754. package/workspace-snapshot/files/tests/setup/live-provisioning-error-preservation.test.ts +98 -0
  755. package/workspace-snapshot/files/tests/setup/local-apply-actions.test.ts +352 -0
  756. package/workspace-snapshot/files/tests/setup/local-readiness-checks.test.ts +175 -0
  757. package/workspace-snapshot/files/tests/setup/model-settings.test.ts +52 -0
  758. package/workspace-snapshot/files/tests/setup/packaged-provisioning-permissions.test.ts +41 -0
  759. package/workspace-snapshot/files/tests/setup/permission-model.test.ts +38 -0
  760. package/workspace-snapshot/files/tests/setup/redact-secrets.test.ts +78 -0
  761. package/workspace-snapshot/files/tests/setup/remote-actions.test.ts +45 -0
  762. package/workspace-snapshot/files/tests/setup/remote-apply-actions.test.ts +302 -0
  763. package/workspace-snapshot/files/tests/setup/remote-preview-fingerprint.test.ts +121 -0
  764. package/workspace-snapshot/files/tests/setup/service-verification.test.ts +312 -0
  765. package/workspace-snapshot/files/tests/setup/setup-actions.test.ts +96 -0
  766. package/workspace-snapshot/files/tests/setup/setup-form-defaults.test.ts +35 -0
  767. package/workspace-snapshot/files/tests/setup/setup-server-remote.test.ts +90 -0
  768. package/workspace-snapshot/files/tests/setup/stale-smoke-repo.test.ts +84 -0
  769. package/workspace-snapshot/files/tests/setup/step6-automatic-apply-outcome.test.ts +303 -0
  770. package/workspace-snapshot/files/tests/setup/target-workflow-finalization-lock.test.ts +51 -0
  771. package/workspace-snapshot/files/tests/setup/target-workflow-finalization-step-github.test.ts +435 -0
  772. package/workspace-snapshot/files/tests/setup/target-workflow-finalization.test.ts +222 -0
  773. package/workspace-snapshot/files/tests/setup/target-workflow-setup.test.ts +62 -0
  774. package/workspace-snapshot/files/tests/setup/test-workspace-snapshot-fixture.ts +100 -0
  775. package/workspace-snapshot/files/tests/setup/vercel-bridge-diagnostics.test.ts +429 -0
  776. package/workspace-snapshot/files/tests/setup/vercel-bridge-options.test.ts +135 -0
  777. package/workspace-snapshot/files/tests/setup/vercel-bridge-preview-fingerprint.test.ts +52 -0
  778. package/workspace-snapshot/files/tests/setup/vercel-bridge-redeploy-poll.test.ts +582 -0
  779. package/workspace-snapshot/files/tests/setup/vercel-bridge-structured-log.test.ts +45 -0
  780. package/workspace-snapshot/files/tests/setup/vercel-bridge-verification.test.ts +39 -0
  781. package/workspace-snapshot/files/tests/setup/vercel-endpoint-reachability.test.ts +60 -0
  782. package/workspace-snapshot/files/tests/setup/vercel-production-redeploy.test.ts +184 -0
  783. package/workspace-snapshot/files/tests/setup/vercel-setup-apply.test.ts +1282 -0
  784. package/workspace-snapshot/files/tests/setup/vercel-setup-client.test.ts +395 -0
  785. package/workspace-snapshot/files/tests/setup/vercel-setup-plan.test.ts +261 -0
  786. package/workspace-snapshot/files/tests/setup/vercel-webhook-probe.test.ts +78 -0
  787. package/workspace-snapshot/files/tests/setup/workflow-install-merge-errors.test.ts +38 -0
  788. package/workspace-snapshot/files/tests/validate-issue/report.test.ts +56 -0
  789. package/workspace-snapshot/files/tests/validate-issue/validate-issue.test.ts +202 -0
  790. package/workspace-snapshot/files/tests/webhook/dispatch-github.test.ts +193 -0
  791. package/workspace-snapshot/files/tests/webhook/extract-issue-key.test.ts +65 -0
  792. package/workspace-snapshot/files/tests/webhook/filter.test.ts +132 -0
  793. package/workspace-snapshot/files/tests/webhook/harness-auto-runner-workflow.test.ts +169 -0
  794. package/workspace-snapshot/files/tests/webhook/parse-linear-issue-event.test.ts +89 -0
  795. package/workspace-snapshot/files/tests/webhook/verify.test.ts +125 -0
  796. package/workspace-snapshot/files/tests/workflow/dispatch-metadata.test.ts +38 -0
  797. package/workspace-snapshot/files/tests/workflow/manifest-summary.test.ts +58 -0
  798. package/workspace-snapshot/files/tests/workflow/production-sync-dispatch.test.ts +101 -0
  799. package/workspace-snapshot/files/tests/workflow/validate.test.ts +70 -0
  800. package/workspace-snapshot/files/tests/workflow/workflow-shell-safety.test.ts +92 -0
  801. package/workspace-snapshot/files/tsconfig.json +22 -0
  802. package/workspace-snapshot/files/vercel.json +10 -0
  803. package/workspace-snapshot/files/vitest.config.ts +15 -0
  804. package/workspace-snapshot/manifest.json +4911 -0
  805. package/gui/.next/server/chunks/120.js +0 -81
  806. package/gui/.next/static/css/cc2acc71c03f3b4b.css +0 -3
  807. /package/gui/.next/static/{7x8X_k4tESvkyqRnNCC9E → ZGJuemeaiW4yT7CTlmjdG}/_buildManifest.js +0 -0
  808. /package/gui/.next/static/{7x8X_k4tESvkyqRnNCC9E → ZGJuemeaiW4yT7CTlmjdG}/_ssgManifest.js +0 -0
@@ -8,27 +8,44 @@ import { buildHarnessManagedRepoMarker, HARNESS_MANAGED_REPO_MARKER_FILE, marker
8
8
  import { buildPendingValidationContext, clearHarnessProvisioningPendingState, readHarnessProvisioningPendingState, validatePendingProvisioningState, withHarnessProvisioningMutex, writeHarnessProvisioningPendingStateAtomic, } from "./harness-provisioning-pending-state.js";
9
9
  import { parseRepoSlug } from "./github-remote-setup-live.js";
10
10
  import { assessPackagedProvisioningTokenCapabilities, } from "./github-workflow-permissions.js";
11
- import { HARNESS_DEFAULT_DESTINATION_DESCRIPTION, HARNESS_DEFAULT_DESTINATION_REPO_NAME, HARNESS_LEGACY_PUBLIC_SOURCE_REPO, HARNESS_TEMPLATE_IDENTITY_FILE, HARNESS_TEMPLATE_OWNER, HARNESS_TEMPLATE_REPO, parseHarnessTemplateIdentityJson, } from "./harness-template-identity.js";
11
+ import { HARNESS_DEFAULT_DESTINATION_DESCRIPTION, HARNESS_DEFAULT_DESTINATION_REPO_NAME, HARNESS_LEGACY_PUBLIC_SOURCE_REPO, HARNESS_TEMPLATE_IDENTITY_FILE, parseHarnessTemplateIdentityJson, } from "./harness-template-identity.js";
12
+ import { SnapshotProvisioningError, } from "./harness-snapshot-provisioning-helpers.js";
13
+ import { provisionHarnessWorkspaceFromSnapshot, verifyProvisionedHarnessWorkspace, } from "./harness-snapshot-provisioning.js";
14
+ import { loadEmbeddedWorkspaceSnapshot } from "./harness-workspace-snapshot-loader.js";
12
15
  import { persistGithubDispatchRepository } from "./local-apply-actions.js";
13
16
  import { resolveLocalFilePaths } from "./setup-state.js";
14
- const POST_CREATE_POLL_MAX_DELAY_MS = 8_000;
15
- function resolvePostCreatePollConfig() {
16
- return {
17
- timeoutMs: Number(process.env.HARNESS_PROVISIONING_POLL_TIMEOUT_MS ?? 60_000),
18
- initialDelayMs: Number(process.env.HARNESS_PROVISIONING_POLL_INITIAL_DELAY_MS ?? 1_000),
19
- maxDelayMs: Number(process.env.HARNESS_PROVISIONING_POLL_MAX_DELAY_MS ??
20
- POST_CREATE_POLL_MAX_DELAY_MS),
21
- };
22
- }
23
- function sleep(ms) {
24
- return new Promise((resolve) => setTimeout(resolve, ms));
25
- }
26
17
  function buildFingerprint(input) {
27
18
  return JSON.stringify(input);
28
19
  }
29
20
  function destinationSlug(login) {
30
21
  return `${login}/${HARNESS_DEFAULT_DESTINATION_REPO_NAME}`;
31
22
  }
23
+ function emptySnapshotPreviewFields() {
24
+ return {
25
+ packageName: "p-dev-harness",
26
+ packageVersion: "",
27
+ sourceRepository: "",
28
+ sourceCommit: "",
29
+ snapshotContentId: null,
30
+ snapshotFingerprint: null,
31
+ templateContentId: null,
32
+ };
33
+ }
34
+ function snapshotPreviewFields(snapshot, templateContentIdOverride) {
35
+ if (!snapshot) {
36
+ return emptySnapshotPreviewFields();
37
+ }
38
+ const snapshotContentId = snapshot.manifest.snapshotContentId;
39
+ return {
40
+ packageName: snapshot.manifest.packageName,
41
+ packageVersion: snapshot.manifest.packageVersion,
42
+ sourceRepository: snapshot.manifest.sourceRepository,
43
+ sourceCommit: snapshot.manifest.sourceCommit,
44
+ snapshotContentId,
45
+ snapshotFingerprint: snapshot.fingerprint,
46
+ templateContentId: templateContentIdOverride ?? snapshotContentId,
47
+ };
48
+ }
32
49
  function readSavedRepositoryId(existingEnv) {
33
50
  const raw = existingEnv?.values.GITHUB_DISPATCH_REPOSITORY_ID?.trim();
34
51
  if (!raw) {
@@ -40,14 +57,31 @@ function readSavedRepositoryId(existingEnv) {
40
57
  }
41
58
  return parsed;
42
59
  }
60
+ function buildSnapshotPendingValidationContext(snapshot, input) {
61
+ return buildPendingValidationContext({
62
+ operationId: input.operationId,
63
+ authenticatedUserId: input.authenticatedUserId,
64
+ authenticatedLogin: input.authenticatedLogin,
65
+ targetOwner: input.targetOwner,
66
+ targetRepo: input.targetRepo,
67
+ packageName: snapshot.manifest.packageName,
68
+ packageVersion: snapshot.manifest.packageVersion,
69
+ sourceRepository: snapshot.manifest.sourceRepository,
70
+ sourceCommit: snapshot.manifest.sourceCommit,
71
+ manifestSchemaVersion: snapshot.manifest.schemaVersion,
72
+ snapshotContentId: snapshot.manifest.snapshotContentId,
73
+ snapshotSha256: snapshot.manifest.snapshotSha256,
74
+ snapshotGitTreeSha1: snapshot.manifest.gitRootTreeSha1,
75
+ previewFingerprint: input.previewFingerprint,
76
+ });
77
+ }
43
78
  function buildProvisioningPreviewFingerprint(input) {
44
79
  const context = buildHarnessProvisioningPreviewContext({
45
80
  operationId: input.operationId,
46
81
  user: input.user,
47
82
  destination: input.destination,
48
- templateDefaultBranch: input.templatePreview.defaultBranch,
49
- templateHeadSha: input.templatePreview.headSha,
50
- templateIdentity: input.templatePreview.identity.identity,
83
+ manifest: input.snapshotPreview.manifest,
84
+ snapshotFingerprint: input.snapshotPreview.fingerprint,
51
85
  classification: input.classification,
52
86
  envBaseline: input.envBaseline,
53
87
  pDevVersion: input.pDevVersion,
@@ -57,6 +91,12 @@ function buildProvisioningPreviewFingerprint(input) {
57
91
  return serializeHarnessProvisioningPreviewContext(context);
58
92
  }
59
93
  async function resolveProvisioningOperation(input) {
94
+ const validationContext = buildSnapshotPendingValidationContext(input.snapshotPreview, {
95
+ authenticatedUserId: input.user.id,
96
+ authenticatedLogin: input.user.login,
97
+ targetOwner: input.user.login,
98
+ targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
99
+ });
60
100
  if (input.requestedOperationId) {
61
101
  const pending = await readHarnessProvisioningPendingState(input.cwd);
62
102
  if (pending && pending.operationId !== input.requestedOperationId) {
@@ -84,18 +124,7 @@ async function resolveProvisioningOperation(input) {
84
124
  pending: null,
85
125
  };
86
126
  }
87
- const validation = validatePendingProvisioningState(pending, buildPendingValidationContext({
88
- authenticatedUserId: input.user.id,
89
- authenticatedLogin: input.user.login,
90
- targetOwner: input.user.login,
91
- targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
92
- templateIdentity: input.templatePreview.identity.identity.templateIdentity,
93
- templateVersion: input.templatePreview.identity.identity.templateVersion,
94
- compatibilityVersion: input.templatePreview.identity.identity.compatibilityVersion,
95
- templateContentId: input.templatePreview.identity.identity.templateContentId,
96
- templateDefaultBranch: input.templatePreview.defaultBranch,
97
- templateHeadSha: input.templatePreview.headSha,
98
- }));
127
+ const validation = validatePendingProvisioningState(pending, validationContext);
99
128
  if (!validation.ok) {
100
129
  return {
101
130
  ok: false,
@@ -111,46 +140,6 @@ async function resolveProvisioningOperation(input) {
111
140
  pending,
112
141
  };
113
142
  }
114
- function pendingMatchesDestinationTemplateIdentity(pending, templateIdentity) {
115
- return (pending.templateIdentity === templateIdentity.templateIdentity &&
116
- pending.templateVersion === templateIdentity.templateVersion &&
117
- pending.compatibilityVersion === templateIdentity.compatibilityVersion &&
118
- pending.templateContentId === templateIdentity.templateContentId);
119
- }
120
- async function loadTemplatePreview(provider) {
121
- const template = await provider.getRepositoryMetadata(HARNESS_TEMPLATE_OWNER, HARNESS_TEMPLATE_REPO);
122
- if (!template || !template.isTemplate) {
123
- return {
124
- ok: false,
125
- state: "template-unavailable",
126
- message: "The approved p-dev harness template is missing or not marked as a GitHub template.",
127
- };
128
- }
129
- const headSha = await provider.getRepositoryDefaultBranchHead(HARNESS_TEMPLATE_OWNER, HARNESS_TEMPLATE_REPO, template.defaultBranch);
130
- const identityRaw = await provider.readRepositoryFileContent(HARNESS_TEMPLATE_OWNER, HARNESS_TEMPLATE_REPO, HARNESS_TEMPLATE_IDENTITY_FILE, headSha);
131
- if (!identityRaw) {
132
- return {
133
- ok: false,
134
- state: "template-identity-missing",
135
- message: "Template identity file is missing from the approved template.",
136
- };
137
- }
138
- const parsed = parseHarnessTemplateIdentityJson(identityRaw);
139
- if (!parsed.ok) {
140
- return {
141
- ok: false,
142
- state: "template-identity-invalid",
143
- message: parsed.reason,
144
- };
145
- }
146
- return {
147
- ok: true,
148
- defaultBranch: template.defaultBranch,
149
- headSha,
150
- identityRaw,
151
- identity: parsed,
152
- };
153
- }
154
143
  async function validateExplicitPackagedRepo(provider, repoSlug, savedRepositoryId) {
155
144
  if (repoSlug === HARNESS_LEGACY_PUBLIC_SOURCE_REPO) {
156
145
  return {
@@ -243,7 +232,7 @@ async function validateExplicitPackagedRepo(provider, repoSlug, savedRepositoryI
243
232
  marker,
244
233
  };
245
234
  }
246
- async function classifyDestinationRepo(provider, user, cwd, templatePreview) {
235
+ async function classifyDestinationRepo(provider, user, cwd, snapshotPreview) {
247
236
  const repoSlug = destinationSlug(user.login);
248
237
  const { owner, repo } = parseRepoSlug(repoSlug);
249
238
  const metadata = await provider.getRepositoryMetadata(owner, repo);
@@ -274,6 +263,21 @@ async function classifyDestinationRepo(provider, user, cwd, templatePreview) {
274
263
  repositoryId: metadata.repositoryId,
275
264
  };
276
265
  }
266
+ const pending = await readHarnessProvisioningPendingState(cwd);
267
+ if (pending && snapshotPreview) {
268
+ const validation = validatePendingProvisioningState(pending, buildSnapshotPendingValidationContext(snapshotPreview, {
269
+ authenticatedUserId: user.id,
270
+ authenticatedLogin: user.login,
271
+ targetOwner: user.login,
272
+ targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
273
+ }));
274
+ if (validation.ok) {
275
+ return { kind: "snapshot-only-with-pending" };
276
+ }
277
+ if (!validation.ok) {
278
+ return { kind: "unmanaged-collision" };
279
+ }
280
+ }
277
281
  const templateRaw = await provider.readRepositoryFileContent(owner, repo, HARNESS_TEMPLATE_IDENTITY_FILE, metadata.defaultBranch);
278
282
  if (templateRaw) {
279
283
  const parsedTemplate = parseHarnessTemplateIdentityJson(templateRaw);
@@ -283,64 +287,37 @@ async function classifyDestinationRepo(provider, user, cwd, templatePreview) {
283
287
  reason: `Generated repository template identity is invalid: ${parsedTemplate.reason}`,
284
288
  };
285
289
  }
286
- const pending = await readHarnessProvisioningPendingState(cwd);
287
- if (pending && templatePreview) {
288
- const validation = validatePendingProvisioningState(pending, buildPendingValidationContext({
289
- authenticatedUserId: user.id,
290
- authenticatedLogin: user.login,
291
- targetOwner: user.login,
292
- targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
293
- templateIdentity: templatePreview.identity.identity.templateIdentity,
294
- templateVersion: templatePreview.identity.identity.templateVersion,
295
- compatibilityVersion: templatePreview.identity.identity.compatibilityVersion,
296
- templateContentId: templatePreview.identity.identity.templateContentId,
297
- templateDefaultBranch: templatePreview.defaultBranch,
298
- templateHeadSha: templatePreview.headSha,
299
- }));
300
- if (validation.ok &&
301
- pendingMatchesDestinationTemplateIdentity(pending, parsedTemplate.identity)) {
302
- return { kind: "template-only-with-pending" };
303
- }
304
- if (!validation.ok) {
305
- return { kind: "unmanaged-collision" };
306
- }
307
- }
308
- return { kind: "template-only-without-pending" };
290
+ return { kind: "snapshot-only-without-pending" };
309
291
  }
310
292
  return { kind: "unmanaged-collision" };
311
293
  }
312
- async function pollGeneratedRepository(provider, repoSlug, expectedContentId) {
313
- const { owner, repo } = parseRepoSlug(repoSlug);
314
- const { timeoutMs, initialDelayMs, maxDelayMs } = resolvePostCreatePollConfig();
315
- const started = Date.now();
316
- let delay = initialDelayMs;
317
- while (Date.now() - started < timeoutMs) {
318
- const metadata = await provider.getRepositoryMetadata(owner, repo);
319
- if (metadata?.private && metadata.permissions.admin) {
320
- const identityRaw = await provider.readRepositoryFileContent(owner, repo, HARNESS_TEMPLATE_IDENTITY_FILE, metadata.defaultBranch);
321
- if (identityRaw) {
322
- const parsed = parseHarnessTemplateIdentityJson(identityRaw);
323
- if (parsed.ok &&
324
- parsed.identity.templateContentId === expectedContentId) {
325
- return {
326
- ok: true,
327
- defaultBranch: metadata.defaultBranch,
328
- repositoryId: metadata.repositoryId,
329
- identity: parsed,
330
- };
331
- }
332
- }
333
- }
334
- await sleep(delay);
335
- delay = Math.min(delay * 2, maxDelayMs);
336
- }
294
+ function buildSnapshotPendingState(input) {
295
+ const manifest = input.snapshotPreview.manifest;
337
296
  return {
338
- ok: false,
339
- timedOut: true,
340
- message: "Timed out waiting for the generated harness workspace to become ready. Retry Step 1 Continue.",
297
+ operationId: input.operationId,
298
+ authenticatedUserId: input.user.id,
299
+ authenticatedLogin: input.user.login,
300
+ packageName: manifest.packageName,
301
+ packageVersion: manifest.packageVersion,
302
+ sourceRepository: manifest.sourceRepository,
303
+ sourceCommit: manifest.sourceCommit,
304
+ manifestSchemaVersion: manifest.schemaVersion,
305
+ snapshotContentId: manifest.snapshotContentId,
306
+ snapshotSha256: manifest.snapshotSha256,
307
+ snapshotGitTreeSha1: manifest.gitRootTreeSha1,
308
+ targetOwner: input.user.login,
309
+ targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
310
+ previewFingerprint: input.previewFingerprint,
311
+ startedAt: input.pending?.startedAt ?? new Date().toISOString(),
312
+ phase: input.phase ?? input.pending?.phase,
313
+ repositoryId: input.repositoryId ?? input.pending?.repositoryId,
314
+ defaultBranch: input.defaultBranch ?? input.pending?.defaultBranch,
315
+ initializedCommitSha: input.initializedCommitSha ?? input.pending?.initializedCommitSha,
316
+ snapshotCommitSha: input.snapshotCommitSha ?? input.pending?.snapshotCommitSha,
317
+ markerCommitSha: input.markerCommitSha ?? input.pending?.markerCommitSha,
341
318
  };
342
319
  }
343
- async function finalizeManagedMarker(provider, input) {
320
+ async function finalizeLegacyTemplateManagedMarker(provider, input) {
344
321
  const { owner, repo } = parseRepoSlug(input.repoSlug);
345
322
  const metadata = await provider.getRepositoryMetadata(owner, repo);
346
323
  if (!metadata) {
@@ -403,6 +380,33 @@ async function finalizeManagedMarker(provider, input) {
403
380
  }
404
381
  return { ok: true };
405
382
  }
383
+ async function readLegacyTemplateIdentityAtHead(provider, repoSlug) {
384
+ const { owner, repo } = parseRepoSlug(repoSlug);
385
+ const metadata = await provider.getRepositoryMetadata(owner, repo);
386
+ if (!metadata) {
387
+ return {
388
+ ok: false,
389
+ message: `Harness workspace ${repoSlug} is not accessible.`,
390
+ };
391
+ }
392
+ const identityRaw = await provider.readRepositoryFileContent(owner, repo, HARNESS_TEMPLATE_IDENTITY_FILE, metadata.defaultBranch);
393
+ if (!identityRaw) {
394
+ return {
395
+ ok: false,
396
+ message: "Legacy generated repository template identity is missing.",
397
+ };
398
+ }
399
+ const parsed = parseHarnessTemplateIdentityJson(identityRaw);
400
+ if (!parsed.ok) {
401
+ return { ok: false, message: parsed.reason };
402
+ }
403
+ return {
404
+ ok: true,
405
+ defaultBranch: metadata.defaultBranch,
406
+ repositoryId: metadata.repositoryId,
407
+ identity: parsed,
408
+ };
409
+ }
406
410
  export async function loadHarnessRepoProvisioningSummary(options) {
407
411
  const runtimeMode = isPackagedPDevRuntime()
408
412
  ? "packaged"
@@ -485,29 +489,28 @@ export async function loadHarnessRepoProvisioningSummary(options) {
485
489
  };
486
490
  }
487
491
  export async function previewHarnessRepoProvisioning(options) {
492
+ const basePreview = {
493
+ creationPreviewFingerprint: null,
494
+ resumedFromPending: false,
495
+ harnessDispatchRepo: null,
496
+ authenticatedLogin: null,
497
+ recoverable: false,
498
+ willCreateRepository: false,
499
+ tokenCapabilities: {
500
+ tokenType: "unknown",
501
+ hasRepoScope: false,
502
+ hasWorkflowScope: false,
503
+ scopeAmbiguous: true,
504
+ },
505
+ };
488
506
  if (!isPackagedPDevRuntime()) {
489
507
  return {
490
508
  state: "skipped-not-packaged",
491
509
  fingerprint: buildFingerprint({ action: "preview", skipped: true }),
492
510
  operationId: options.operationId ?? randomUUID(),
493
- creationPreviewFingerprint: null,
494
- resumedFromPending: false,
495
- harnessDispatchRepo: null,
496
- authenticatedLogin: null,
497
- templateOwner: HARNESS_TEMPLATE_OWNER,
498
- templateRepo: HARNESS_TEMPLATE_REPO,
499
- templateDefaultBranch: "main",
500
- templateHeadSha: "",
501
- templateContentId: null,
502
511
  message: "Packaged runtime mode is not active.",
503
- recoverable: false,
504
- willCreateRepository: false,
505
- tokenCapabilities: {
506
- tokenType: "unknown",
507
- hasRepoScope: false,
508
- hasWorkflowScope: false,
509
- scopeAmbiguous: true,
510
- },
512
+ ...basePreview,
513
+ ...emptySnapshotPreviewFields(),
511
514
  };
512
515
  }
513
516
  const paths = resolveLocalFilePaths(options.cwd);
@@ -537,20 +540,14 @@ export async function previewHarnessRepoProvisioning(options) {
537
540
  state: "token-scope-ambiguous",
538
541
  fingerprint: buildFingerprint({ action: "preview", operationId }),
539
542
  operationId,
540
- creationPreviewFingerprint: null,
541
- resumedFromPending: false,
542
- harnessDispatchRepo: explicitRepo ?? null,
543
- authenticatedLogin: capabilities.login,
544
- templateOwner: HARNESS_TEMPLATE_OWNER,
545
- templateRepo: HARNESS_TEMPLATE_REPO,
546
- templateDefaultBranch: "main",
547
- templateHeadSha: "",
548
- templateContentId: null,
549
543
  message: capabilityCheck.ok
550
544
  ? "Token scope metadata is ambiguous."
551
545
  : capabilityCheck.message,
546
+ ...basePreview,
552
547
  recoverable: true,
553
- willCreateRepository: false,
548
+ harnessDispatchRepo: explicitRepo ?? null,
549
+ authenticatedLogin: capabilities.login,
550
+ ...emptySnapshotPreviewFields(),
554
551
  tokenCapabilities: {
555
552
  tokenType: capabilities.tokenType,
556
553
  hasRepoScope: capabilities.hasRepoScope,
@@ -570,18 +567,12 @@ export async function previewHarnessRepoProvisioning(options) {
570
567
  state,
571
568
  fingerprint: buildFingerprint({ action: "preview", operationId }),
572
569
  operationId,
573
- creationPreviewFingerprint: null,
574
- resumedFromPending: false,
575
- harnessDispatchRepo: explicitRepo ?? null,
576
- authenticatedLogin: capabilities.login,
577
- templateOwner: HARNESS_TEMPLATE_OWNER,
578
- templateRepo: HARNESS_TEMPLATE_REPO,
579
- templateDefaultBranch: "main",
580
- templateHeadSha: "",
581
- templateContentId: null,
582
570
  message: capabilityCheck.message,
571
+ ...basePreview,
583
572
  recoverable: true,
584
- willCreateRepository: false,
573
+ harnessDispatchRepo: explicitRepo ?? null,
574
+ authenticatedLogin: capabilities.login,
575
+ ...emptySnapshotPreviewFields(),
585
576
  tokenCapabilities: {
586
577
  tokenType: capabilities.tokenType,
587
578
  hasRepoScope: capabilities.hasRepoScope,
@@ -606,18 +597,12 @@ export async function previewHarnessRepoProvisioning(options) {
606
597
  state: explicit.state,
607
598
  fingerprint,
608
599
  operationId,
609
- creationPreviewFingerprint: null,
610
- resumedFromPending: false,
611
- harnessDispatchRepo: explicitRepo,
612
- authenticatedLogin: user.login,
613
- templateOwner: HARNESS_TEMPLATE_OWNER,
614
- templateRepo: HARNESS_TEMPLATE_REPO,
615
- templateDefaultBranch: "main",
616
- templateHeadSha: "",
617
- templateContentId: null,
618
600
  message: explicit.message,
601
+ ...basePreview,
619
602
  recoverable: true,
620
- willCreateRepository: false,
603
+ harnessDispatchRepo: explicitRepo,
604
+ authenticatedLogin: user.login,
605
+ ...emptySnapshotPreviewFields(),
621
606
  tokenCapabilities: {
622
607
  tokenType: capabilities.tokenType,
623
608
  hasRepoScope: capabilities.hasRepoScope,
@@ -626,22 +611,16 @@ export async function previewHarnessRepoProvisioning(options) {
626
611
  },
627
612
  };
628
613
  }
614
+ const legacyTemplateContentId = explicit.marker.marker.createdFromTemplate?.templateContentId ?? null;
629
615
  return {
630
616
  state: "explicit-repo-present",
631
617
  fingerprint,
632
618
  operationId,
633
- creationPreviewFingerprint: null,
634
- resumedFromPending: false,
619
+ message: `Reconnecting to saved harness workspace ${explicitRepo}.`,
620
+ ...basePreview,
635
621
  harnessDispatchRepo: explicitRepo,
636
622
  authenticatedLogin: user.login,
637
- templateOwner: HARNESS_TEMPLATE_OWNER,
638
- templateRepo: HARNESS_TEMPLATE_REPO,
639
- templateDefaultBranch: "main",
640
- templateHeadSha: "",
641
- templateContentId: explicit.marker.marker.createdFromTemplate.templateContentId,
642
- message: `Reconnecting to saved harness workspace ${explicitRepo}.`,
643
- recoverable: false,
644
- willCreateRepository: false,
623
+ ...snapshotPreviewFields(null, legacyTemplateContentId),
645
624
  tokenCapabilities: {
646
625
  tokenType: capabilities.tokenType,
647
626
  hasRepoScope: capabilities.hasRepoScope,
@@ -650,25 +629,17 @@ export async function previewHarnessRepoProvisioning(options) {
650
629
  },
651
630
  };
652
631
  }
653
- const templatePreview = await loadTemplatePreview(options.provider);
654
- if (!templatePreview.ok) {
632
+ const snapshotPreview = await loadEmbeddedWorkspaceSnapshot(options.moduleUrl ?? import.meta.url);
633
+ if (!snapshotPreview.ok) {
655
634
  const operationId = options.operationId ?? randomUUID();
656
635
  return {
657
- state: templatePreview.state,
636
+ state: snapshotPreview.state,
658
637
  fingerprint: buildFingerprint({ action: "preview", operationId }),
659
638
  operationId,
660
- creationPreviewFingerprint: null,
661
- resumedFromPending: false,
662
- harnessDispatchRepo: null,
639
+ message: snapshotPreview.message,
640
+ ...basePreview,
663
641
  authenticatedLogin: user.login,
664
- templateOwner: HARNESS_TEMPLATE_OWNER,
665
- templateRepo: HARNESS_TEMPLATE_REPO,
666
- templateDefaultBranch: "main",
667
- templateHeadSha: "",
668
- templateContentId: null,
669
- message: templatePreview.message,
670
- recoverable: false,
671
- willCreateRepository: false,
642
+ ...emptySnapshotPreviewFields(),
672
643
  tokenCapabilities: {
673
644
  tokenType: capabilities.tokenType,
674
645
  hasRepoScope: capabilities.hasRepoScope,
@@ -681,7 +652,7 @@ export async function previewHarnessRepoProvisioning(options) {
681
652
  cwd: options.cwd,
682
653
  requestedOperationId: options.operationId,
683
654
  user,
684
- templatePreview,
655
+ snapshotPreview,
685
656
  });
686
657
  if (!resolvedOperation.ok) {
687
658
  return {
@@ -691,18 +662,11 @@ export async function previewHarnessRepoProvisioning(options) {
691
662
  conflict: resolvedOperation.message,
692
663
  }),
693
664
  operationId: options.operationId ?? randomUUID(),
694
- creationPreviewFingerprint: null,
695
- resumedFromPending: false,
696
- harnessDispatchRepo: null,
697
- authenticatedLogin: user.login,
698
- templateOwner: HARNESS_TEMPLATE_OWNER,
699
- templateRepo: HARNESS_TEMPLATE_REPO,
700
- templateDefaultBranch: templatePreview.defaultBranch,
701
- templateHeadSha: templatePreview.headSha,
702
- templateContentId: templatePreview.identity.identity.templateContentId,
703
665
  message: resolvedOperation.message,
666
+ ...basePreview,
704
667
  recoverable: true,
705
- willCreateRepository: false,
668
+ authenticatedLogin: user.login,
669
+ ...snapshotPreviewFields(snapshotPreview),
706
670
  tokenCapabilities: {
707
671
  tokenType: capabilities.tokenType,
708
672
  hasRepoScope: capabilities.hasRepoScope,
@@ -713,15 +677,15 @@ export async function previewHarnessRepoProvisioning(options) {
713
677
  }
714
678
  const { operationId, resumedFromPending, creationPreviewFingerprint, } = resolvedOperation;
715
679
  const destination = destinationSlug(user.login);
716
- const classification = await classifyDestinationRepo(options.provider, user, options.cwd, templatePreview);
717
- let state = "template-preview-ready";
680
+ const classification = await classifyDestinationRepo(options.provider, user, options.cwd, snapshotPreview);
681
+ let state = "snapshot-preview-ready";
718
682
  let message = `p-dev will create or reconnect ${destination} as your private harness workspace.`;
719
683
  let willCreateRepository = false;
720
684
  switch (classification.kind) {
721
685
  case "absent":
722
686
  state = "repo-absent";
723
687
  willCreateRepository = true;
724
- message = `p-dev will create private harness workspace ${destination} from the approved template.`;
688
+ message = `p-dev will create private harness workspace ${destination} from the packaged workspace snapshot.`;
725
689
  break;
726
690
  case "valid-managed":
727
691
  state = "valid-existing-managed-repo";
@@ -739,20 +703,20 @@ export async function previewHarnessRepoProvisioning(options) {
739
703
  state = "same-name-malformed-marker";
740
704
  message = classification.reason;
741
705
  break;
742
- case "template-only-without-pending":
743
- state = "same-name-template-only-without-pending";
706
+ case "snapshot-only-without-pending":
707
+ state = "same-name-snapshot-only-without-pending";
744
708
  message = `${destination} looks like an unmanaged generated repo.`;
745
709
  break;
746
- case "template-only-with-pending":
747
- state = "same-name-template-only-with-pending";
748
- message = `Resuming marker finalization for ${destination}.`;
710
+ case "snapshot-only-with-pending":
711
+ state = "same-name-snapshot-only-with-pending";
712
+ message = `Resuming snapshot provisioning for ${destination}.`;
749
713
  break;
750
714
  }
751
715
  const fingerprint = buildProvisioningPreviewFingerprint({
752
716
  operationId,
753
717
  user,
754
718
  destination,
755
- templatePreview,
719
+ snapshotPreview,
756
720
  classification: classification.kind,
757
721
  envBaseline: existingEnv?.values.GITHUB_DISPATCH_REPOSITORY ?? "",
758
722
  pDevVersion,
@@ -767,16 +731,12 @@ export async function previewHarnessRepoProvisioning(options) {
767
731
  resumedFromPending,
768
732
  harnessDispatchRepo: classification.kind === "valid-managed" ? destination : null,
769
733
  authenticatedLogin: user.login,
770
- templateOwner: HARNESS_TEMPLATE_OWNER,
771
- templateRepo: HARNESS_TEMPLATE_REPO,
772
- templateDefaultBranch: templatePreview.defaultBranch,
773
- templateHeadSha: templatePreview.headSha,
774
- templateContentId: templatePreview.identity.identity.templateContentId,
775
734
  message,
776
735
  recoverable: state === "repo-absent" ||
777
736
  state === "valid-existing-managed-repo" ||
778
- state === "same-name-template-only-with-pending",
737
+ state === "same-name-snapshot-only-with-pending",
779
738
  willCreateRepository,
739
+ ...snapshotPreviewFields(snapshotPreview),
780
740
  tokenCapabilities: {
781
741
  tokenType: capabilities.tokenType,
782
742
  hasRepoScope: capabilities.hasRepoScope,
@@ -793,6 +753,7 @@ async function applyHarnessRepoProvisioningLocked(options) {
793
753
  cwd: options.cwd,
794
754
  provider: options.provider,
795
755
  operationId: options.operationId,
756
+ moduleUrl: options.moduleUrl,
796
757
  });
797
758
  if (!options.confirmed) {
798
759
  return {
@@ -805,7 +766,7 @@ async function applyHarnessRepoProvisioningLocked(options) {
805
766
  }
806
767
  if (preview.fingerprint !== options.fingerprint) {
807
768
  return {
808
- state: "template-preview-stale",
769
+ state: "snapshot-preview-stale",
809
770
  harnessDispatchRepo: preview.harnessDispatchRepo,
810
771
  message: "Provisioning preview is stale. Retry Step 1 Continue.",
811
772
  recoverable: true,
@@ -816,14 +777,15 @@ async function applyHarnessRepoProvisioningLocked(options) {
816
777
  preview.state === "token-unsupported" ||
817
778
  preview.state === "token-insufficient" ||
818
779
  preview.state === "token-scope-ambiguous" ||
819
- preview.state === "template-unavailable" ||
820
- preview.state === "template-identity-missing" ||
821
- preview.state === "template-identity-invalid" ||
822
- preview.state === "template-incompatible" ||
780
+ preview.state === "snapshot-unavailable" ||
781
+ preview.state === "snapshot-manifest-missing" ||
782
+ preview.state === "snapshot-manifest-invalid" ||
783
+ preview.state === "snapshot-incompatible" ||
784
+ preview.state === "snapshot-tampered" ||
823
785
  preview.state === "same-name-public-collision" ||
824
786
  preview.state === "same-name-unmanaged-collision" ||
825
787
  preview.state === "same-name-malformed-marker" ||
826
- preview.state === "same-name-template-only-without-pending" ||
788
+ preview.state === "same-name-snapshot-only-without-pending" ||
827
789
  preview.state === "explicit-packaged-repo-invalid" ||
828
790
  preview.state === "explicit-packaged-repo-legacy-source") {
829
791
  return {
@@ -839,7 +801,6 @@ async function applyHarnessRepoProvisioningLocked(options) {
839
801
  const paths = resolveLocalFilePaths(options.cwd);
840
802
  const existingEnv = await readExistingEnvFile(paths);
841
803
  const explicitRepo = existingEnv?.values.GITHUB_DISPATCH_REPOSITORY?.trim();
842
- let targetRepo = explicitRepo ?? destinationSlug(user.login);
843
804
  if (explicitRepo) {
844
805
  const explicit = await validateExplicitPackagedRepo(options.provider, explicitRepo, readSavedRepositoryId(existingEnv));
845
806
  if (!explicit.ok) {
@@ -874,24 +835,23 @@ async function applyHarnessRepoProvisioningLocked(options) {
874
835
  persisted: true,
875
836
  };
876
837
  }
877
- const templatePreview = await loadTemplatePreview(options.provider);
878
- if (!templatePreview.ok) {
838
+ const snapshotPreview = await loadEmbeddedWorkspaceSnapshot(options.moduleUrl ?? import.meta.url);
839
+ if (!snapshotPreview.ok) {
879
840
  return {
880
- state: templatePreview.state,
841
+ state: snapshotPreview.state,
881
842
  harnessDispatchRepo: null,
882
- message: templatePreview.message,
843
+ message: snapshotPreview.message,
883
844
  recoverable: false,
884
845
  persisted: false,
885
846
  };
886
847
  }
887
- const classification = await classifyDestinationRepo(options.provider, user, options.cwd, templatePreview);
848
+ const classification = await classifyDestinationRepo(options.provider, user, options.cwd, snapshotPreview);
888
849
  const currentContext = buildHarnessProvisioningPreviewContext({
889
850
  operationId: options.operationId,
890
851
  user,
891
852
  destination: destinationSlug(user.login),
892
- templateDefaultBranch: templatePreview.defaultBranch,
893
- templateHeadSha: templatePreview.headSha,
894
- templateIdentity: templatePreview.identity.identity,
853
+ manifest: snapshotPreview.manifest,
854
+ snapshotFingerprint: snapshotPreview.fingerprint,
895
855
  classification: classification.kind,
896
856
  envBaseline: existingEnv?.values.GITHUB_DISPATCH_REPOSITORY ?? "",
897
857
  pDevVersion,
@@ -904,13 +864,14 @@ async function applyHarnessRepoProvisioningLocked(options) {
904
864
  });
905
865
  if (!contextValidation.ok) {
906
866
  return {
907
- state: "template-preview-stale",
867
+ state: "snapshot-preview-stale",
908
868
  harnessDispatchRepo: null,
909
869
  message: contextValidation.message,
910
870
  recoverable: true,
911
871
  persisted: false,
912
872
  };
913
873
  }
874
+ let targetRepo = destinationSlug(user.login);
914
875
  let targetRepositoryId = classification.kind === "valid-managed"
915
876
  ? classification.repositoryId
916
877
  : undefined;
@@ -918,25 +879,19 @@ async function applyHarnessRepoProvisioningLocked(options) {
918
879
  if (preview.resumedFromPending) {
919
880
  if (!pending || !preview.creationPreviewFingerprint) {
920
881
  return {
921
- state: "same-name-template-only-without-pending",
882
+ state: "same-name-snapshot-only-without-pending",
922
883
  harnessDispatchRepo: destinationSlug(user.login),
923
884
  message: "Matching local pending provisioning evidence is required to resume.",
924
885
  recoverable: true,
925
886
  persisted: false,
926
887
  };
927
888
  }
928
- const pendingValidation = validatePendingProvisioningState(pending, buildPendingValidationContext({
889
+ const pendingValidation = validatePendingProvisioningState(pending, buildSnapshotPendingValidationContext(snapshotPreview, {
929
890
  operationId: options.operationId,
930
891
  authenticatedUserId: user.id,
931
892
  authenticatedLogin: user.login,
932
893
  targetOwner: user.login,
933
894
  targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
934
- templateIdentity: templatePreview.identity.identity.templateIdentity,
935
- templateVersion: templatePreview.identity.identity.templateVersion,
936
- compatibilityVersion: templatePreview.identity.identity.compatibilityVersion,
937
- templateContentId: templatePreview.identity.identity.templateContentId,
938
- templateDefaultBranch: templatePreview.defaultBranch,
939
- templateHeadSha: templatePreview.headSha,
940
895
  previewFingerprint: preview.creationPreviewFingerprint,
941
896
  }));
942
897
  if (!pendingValidation.ok) {
@@ -960,77 +915,199 @@ async function applyHarnessRepoProvisioningLocked(options) {
960
915
  persisted: false,
961
916
  };
962
917
  }
918
+ const creationFingerprint = preview.creationPreviewFingerprint ?? options.fingerprint;
919
+ let activePending = pending;
920
+ let requiresSnapshotVerification = false;
963
921
  if (classification.kind === "valid-managed") {
964
922
  targetRepo = classification.repoSlug;
965
923
  }
966
- else if (classification.kind === "absent" &&
967
- !preview.resumedFromPending) {
968
- const creationFingerprint = preview.creationPreviewFingerprint ?? options.fingerprint;
969
- await writeHarnessProvisioningPendingStateAtomic({
970
- operationId: options.operationId,
971
- authenticatedUserId: user.id,
972
- authenticatedLogin: user.login,
973
- targetOwner: user.login,
974
- targetRepo: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
975
- templateOwner: HARNESS_TEMPLATE_OWNER,
976
- templateRepo: HARNESS_TEMPLATE_REPO,
977
- templateIdentity: templatePreview.identity.identity.templateIdentity,
978
- templateVersion: templatePreview.identity.identity.templateVersion,
979
- compatibilityVersion: templatePreview.identity.identity.compatibilityVersion,
980
- templateContentId: templatePreview.identity.identity.templateContentId,
981
- templateDefaultBranch: templatePreview.defaultBranch,
982
- templateHeadSha: templatePreview.headSha,
983
- previewFingerprint: creationFingerprint,
984
- startedAt: new Date().toISOString(),
985
- }, options.cwd);
986
- try {
987
- const created = await options.provider.createRepositoryFromTemplate({
988
- templateOwner: HARNESS_TEMPLATE_OWNER,
989
- templateRepo: HARNESS_TEMPLATE_REPO,
990
- owner: user.login,
991
- name: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
992
- description: HARNESS_DEFAULT_DESTINATION_DESCRIPTION,
993
- private: true,
994
- includeAllBranches: false,
924
+ else if (classification.kind === "absent" ||
925
+ classification.kind === "snapshot-only-with-pending") {
926
+ const legacyTemplateIdentity = classification.kind === "snapshot-only-with-pending"
927
+ ? await readLegacyTemplateIdentityAtHead(options.provider, targetRepo)
928
+ : null;
929
+ if (classification.kind === "snapshot-only-with-pending" &&
930
+ legacyTemplateIdentity?.ok) {
931
+ const { owner, repo } = parseRepoSlug(targetRepo);
932
+ const legacyHeadSha = await options.provider.getRepositoryDefaultBranchHead(owner, repo, legacyTemplateIdentity.defaultBranch);
933
+ const markerResult = await finalizeLegacyTemplateManagedMarker(options.provider, {
934
+ repoSlug: targetRepo,
935
+ repositoryId: legacyTemplateIdentity.repositoryId,
936
+ defaultBranch: legacyTemplateIdentity.defaultBranch,
937
+ templateIdentity: legacyTemplateIdentity.identity,
938
+ templateHeadSha: legacyHeadSha,
939
+ operationId: options.operationId,
940
+ user,
941
+ pDevVersion,
995
942
  });
996
- targetRepo = created.fullName;
997
- targetRepositoryId = created.repositoryId;
943
+ if (!markerResult.ok) {
944
+ return {
945
+ state: "marker-write-pending",
946
+ harnessDispatchRepo: targetRepo,
947
+ message: markerResult.message,
948
+ recoverable: true,
949
+ persisted: false,
950
+ };
951
+ }
952
+ targetRepositoryId = legacyTemplateIdentity.repositoryId;
998
953
  }
999
- catch (error) {
1000
- const recovered = await classifyDestinationRepo(options.provider, user, options.cwd, templatePreview);
1001
- if (recovered.kind === "valid-managed" ||
1002
- recovered.kind === "template-only-with-pending") {
1003
- targetRepo = destinationSlug(user.login);
954
+ else {
955
+ if (classification.kind === "absent" && !preview.resumedFromPending) {
956
+ await writeHarnessProvisioningPendingStateAtomic(buildSnapshotPendingState({
957
+ operationId: options.operationId,
958
+ user,
959
+ snapshotPreview,
960
+ previewFingerprint: creationFingerprint,
961
+ }), options.cwd);
962
+ activePending = await readHarnessProvisioningPendingState(options.cwd);
1004
963
  }
1005
- else if (error instanceof GitHubApiError && error.status === 422) {
1006
- const retryClassification = await classifyDestinationRepo(options.provider, user, options.cwd, templatePreview);
1007
- if (retryClassification.kind === "absent") {
964
+ let provisionResult;
965
+ try {
966
+ provisionResult = await provisionHarnessWorkspaceFromSnapshot({
967
+ provider: options.provider,
968
+ user,
969
+ repoName: HARNESS_DEFAULT_DESTINATION_REPO_NAME,
970
+ description: HARNESS_DEFAULT_DESTINATION_DESCRIPTION,
971
+ snapshotRoot: snapshotPreview.snapshotRoot,
972
+ manifest: snapshotPreview.manifest,
973
+ packageVersion: snapshotPreview.packageVersion,
974
+ operationId: options.operationId,
975
+ pending: activePending,
976
+ onCheckpoint: async (checkpoint) => {
977
+ await writeHarnessProvisioningPendingStateAtomic(buildSnapshotPendingState({
978
+ operationId: options.operationId,
979
+ user,
980
+ snapshotPreview,
981
+ previewFingerprint: creationFingerprint,
982
+ pending: activePending,
983
+ phase: checkpoint.phase,
984
+ repositoryId: checkpoint.repositoryId,
985
+ defaultBranch: checkpoint.defaultBranch,
986
+ initializedCommitSha: checkpoint.initializedCommitSha,
987
+ snapshotCommitSha: checkpoint.snapshotCommitSha,
988
+ markerCommitSha: checkpoint.markerCommitSha,
989
+ }), options.cwd);
990
+ activePending = await readHarnessProvisioningPendingState(options.cwd);
991
+ },
992
+ });
993
+ }
994
+ catch (error) {
995
+ const message = error instanceof Error
996
+ ? error.message
997
+ : "Repository provisioning failed unexpectedly.";
998
+ if (error instanceof SnapshotProvisioningError &&
999
+ error.code === "marker-commit-failed") {
1000
+ const { owner, repo } = parseRepoSlug(destinationSlug(user.login));
1001
+ const metadata = await options.provider.getRepositoryMetadata(owner, repo);
1002
+ if (metadata) {
1003
+ const headSha = await options.provider.getRepositoryDefaultBranchHead(owner, repo, metadata.defaultBranch);
1004
+ let initializedCommitSha = activePending?.initializedCommitSha;
1005
+ try {
1006
+ const headCommit = await options.provider.getGitCommit(owner, repo, headSha);
1007
+ initializedCommitSha =
1008
+ headCommit.parents[0]?.sha ?? initializedCommitSha;
1009
+ }
1010
+ catch {
1011
+ // keep best-effort pending evidence
1012
+ }
1013
+ await writeHarnessProvisioningPendingStateAtomic(buildSnapshotPendingState({
1014
+ operationId: options.operationId,
1015
+ user,
1016
+ snapshotPreview,
1017
+ previewFingerprint: creationFingerprint,
1018
+ pending: activePending,
1019
+ phase: "marker-pending",
1020
+ repositoryId: metadata.repositoryId,
1021
+ initializedCommitSha,
1022
+ snapshotCommitSha: headSha,
1023
+ }), options.cwd);
1024
+ }
1025
+ return {
1026
+ state: "marker-write-pending",
1027
+ harnessDispatchRepo: destinationSlug(user.login),
1028
+ message,
1029
+ recoverable: true,
1030
+ persisted: false,
1031
+ };
1032
+ }
1033
+ const recovered = await classifyDestinationRepo(options.provider, user, options.cwd, snapshotPreview);
1034
+ if (recovered.kind === "valid-managed" ||
1035
+ recovered.kind === "snapshot-only-with-pending") {
1036
+ return {
1037
+ state: "repo-created-pending-verification",
1038
+ harnessDispatchRepo: destinationSlug(user.login),
1039
+ message,
1040
+ recoverable: true,
1041
+ persisted: false,
1042
+ };
1043
+ }
1044
+ else if (error instanceof GitHubApiError && error.status === 422) {
1045
+ const retryClassification = await classifyDestinationRepo(options.provider, user, options.cwd, snapshotPreview);
1046
+ if (retryClassification.kind === "absent") {
1047
+ return {
1048
+ state: "api-timeout-unknown",
1049
+ harnessDispatchRepo: destinationSlug(user.login),
1050
+ message: "Repository creation returned an ambiguous result. Retry Step 1 Continue.",
1051
+ recoverable: true,
1052
+ persisted: false,
1053
+ };
1054
+ }
1055
+ return {
1056
+ state: "repo-created-pending-verification",
1057
+ harnessDispatchRepo: destinationSlug(user.login),
1058
+ message,
1059
+ recoverable: true,
1060
+ persisted: false,
1061
+ };
1062
+ }
1063
+ else {
1008
1064
  return {
1009
1065
  state: "api-timeout-unknown",
1010
1066
  harnessDispatchRepo: destinationSlug(user.login),
1011
- message: "Repository creation returned an ambiguous result. Retry Step 1 Continue.",
1067
+ message,
1012
1068
  recoverable: true,
1013
1069
  persisted: false,
1014
1070
  };
1015
1071
  }
1016
- targetRepo = destinationSlug(user.login);
1017
1072
  }
1018
- else {
1019
- return {
1020
- state: "api-timeout-unknown",
1021
- harnessDispatchRepo: destinationSlug(user.login),
1022
- message: error instanceof Error
1023
- ? error.message
1024
- : "Repository creation failed unexpectedly.",
1025
- recoverable: true,
1026
- persisted: false,
1027
- };
1073
+ if (provisionResult) {
1074
+ if (!provisionResult.ok) {
1075
+ const markerPending = provisionResult.code === "marker-commit-failed" ||
1076
+ provisionResult.code === "description-finalization-failed" ||
1077
+ activePending?.phase === "marker-pending" ||
1078
+ activePending?.phase === "description-pending" ||
1079
+ Boolean(activePending?.snapshotCommitSha);
1080
+ return {
1081
+ state: markerPending
1082
+ ? "marker-write-pending"
1083
+ : provisionResult.recoverable
1084
+ ? "repo-created-pending-verification"
1085
+ : "api-timeout-unknown",
1086
+ harnessDispatchRepo: destinationSlug(user.login),
1087
+ message: provisionResult.message,
1088
+ recoverable: provisionResult.recoverable,
1089
+ persisted: false,
1090
+ };
1091
+ }
1092
+ targetRepo = provisionResult.fullName;
1093
+ targetRepositoryId = provisionResult.repositoryId;
1094
+ requiresSnapshotVerification = true;
1095
+ await writeHarnessProvisioningPendingStateAtomic(buildSnapshotPendingState({
1096
+ operationId: options.operationId,
1097
+ user,
1098
+ snapshotPreview,
1099
+ previewFingerprint: creationFingerprint,
1100
+ pending: activePending,
1101
+ phase: "persistence-pending",
1102
+ repositoryId: provisionResult.repositoryId,
1103
+ defaultBranch: provisionResult.defaultBranch,
1104
+ initializedCommitSha: provisionResult.initializedCommitSha,
1105
+ snapshotCommitSha: provisionResult.snapshotCommitSha,
1106
+ markerCommitSha: provisionResult.markerCommitSha,
1107
+ }), options.cwd);
1028
1108
  }
1029
1109
  }
1030
1110
  }
1031
- else if (classification.kind === "template-only-with-pending") {
1032
- targetRepo = destinationSlug(user.login);
1033
- }
1034
1111
  else {
1035
1112
  return {
1036
1113
  state: preview.state,
@@ -1040,50 +1117,41 @@ async function applyHarnessRepoProvisioningLocked(options) {
1040
1117
  persisted: false,
1041
1118
  };
1042
1119
  }
1043
- const poll = await pollGeneratedRepository(options.provider, targetRepo, templatePreview.identity.identity.templateContentId);
1044
- if (!poll.ok) {
1045
- return {
1046
- state: poll.timedOut ? "api-timeout-unknown" : "repo-created-pending-verification",
1047
- harnessDispatchRepo: targetRepo,
1048
- message: poll.message,
1049
- recoverable: true,
1050
- persisted: false,
1051
- };
1052
- }
1053
- const resolvedRepositoryId = targetRepositoryId ?? poll.repositoryId;
1054
- if (targetRepositoryId !== undefined &&
1055
- targetRepositoryId !== poll.repositoryId) {
1056
- return {
1057
- state: "repo-created-pending-verification",
1058
- harnessDispatchRepo: targetRepo,
1059
- message: `Generated harness workspace repository ID mismatch for ${targetRepo}.`,
1060
- recoverable: true,
1061
- persisted: false,
1062
- };
1120
+ if (targetRepositoryId === undefined) {
1121
+ const { owner, repo } = parseRepoSlug(targetRepo);
1122
+ const metadata = await options.provider.getRepositoryMetadata(owner, repo);
1123
+ if (!metadata) {
1124
+ return {
1125
+ state: "repo-created-pending-verification",
1126
+ harnessDispatchRepo: targetRepo,
1127
+ message: `Harness workspace ${targetRepo} is not accessible for verification.`,
1128
+ recoverable: true,
1129
+ persisted: false,
1130
+ };
1131
+ }
1132
+ targetRepositoryId = metadata.repositoryId;
1063
1133
  }
1064
- const markerResult = await finalizeManagedMarker(options.provider, {
1065
- repoSlug: targetRepo,
1066
- repositoryId: resolvedRepositoryId,
1067
- defaultBranch: poll.defaultBranch,
1068
- templateIdentity: poll.identity,
1069
- templateHeadSha: pending?.templateHeadSha ?? templatePreview.headSha,
1070
- operationId: options.operationId,
1071
- user,
1072
- pDevVersion,
1073
- });
1074
- if (!markerResult.ok) {
1075
- return {
1076
- state: "marker-write-pending",
1077
- harnessDispatchRepo: targetRepo,
1078
- message: markerResult.message,
1079
- recoverable: true,
1080
- persisted: false,
1081
- };
1134
+ if (requiresSnapshotVerification) {
1135
+ const verification = await verifyProvisionedHarnessWorkspace({
1136
+ provider: options.provider,
1137
+ repoSlug: targetRepo,
1138
+ repositoryId: targetRepositoryId,
1139
+ manifest: snapshotPreview.manifest,
1140
+ });
1141
+ if (!verification.ok) {
1142
+ return {
1143
+ state: "repo-created-pending-verification",
1144
+ harnessDispatchRepo: targetRepo,
1145
+ message: verification.message,
1146
+ recoverable: true,
1147
+ persisted: false,
1148
+ };
1149
+ }
1082
1150
  }
1083
1151
  const persist = await persistGithubDispatchRepository({
1084
1152
  cwd: options.cwd,
1085
1153
  githubDispatchRepository: targetRepo,
1086
- githubDispatchRepositoryId: resolvedRepositoryId,
1154
+ githubDispatchRepositoryId: targetRepositoryId,
1087
1155
  });
1088
1156
  if (persist.outcome !== "changed" && persist.outcome !== "skipped") {
1089
1157
  return {