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
@@ -1,33 +1,33 @@
1
1
  {
2
2
  "/_not-found/page": "app/_not-found/page.js",
3
3
  "/api/setup/apply-connect-services/route": "app/api/setup/apply-connect-services/route.js",
4
- "/api/setup/apply-local-files/route": "app/api/setup/apply-local-files/route.js",
5
4
  "/api/setup/apply-harness-secrets/route": "app/api/setup/apply-harness-secrets/route.js",
6
5
  "/api/setup/finalize-target-workflow/route": "app/api/setup/finalize-target-workflow/route.js",
7
- "/api/setup/linear-summary/route": "app/api/setup/linear-summary/route.js",
6
+ "/api/setup/apply-vercel-bridge/route": "app/api/setup/apply-vercel-bridge/route.js",
7
+ "/api/setup/apply-local-files/route": "app/api/setup/apply-local-files/route.js",
8
+ "/api/setup/linear-options/route": "app/api/setup/linear-options/route.js",
8
9
  "/api/setup/harness-provisioning-summary/route": "app/api/setup/harness-provisioning-summary/route.js",
9
- "/api/setup/apply-linear-setup/route": "app/api/setup/apply-linear-setup/route.js",
10
- "/api/setup/preview-connect-services/route": "app/api/setup/preview-connect-services/route.js",
10
+ "/api/setup/apply-harness-repo-provisioning/route": "app/api/setup/apply-harness-repo-provisioning/route.js",
11
11
  "/api/setup/local-readiness/route": "app/api/setup/local-readiness/route.js",
12
- "/api/setup/linear-options/route": "app/api/setup/linear-options/route.js",
13
- "/api/setup/preview-linear-setup/route": "app/api/setup/preview-linear-setup/route.js",
14
- "/api/setup/preview-vercel-bridge/route": "app/api/setup/preview-vercel-bridge/route.js",
15
- "/api/setup/apply-target-workflow/route": "app/api/setup/apply-target-workflow/route.js",
12
+ "/api/setup/preview-connect-services/route": "app/api/setup/preview-connect-services/route.js",
13
+ "/api/setup/manual-harness-secret-values/route": "app/api/setup/manual-harness-secret-values/route.js",
14
+ "/api/setup/linear-summary/route": "app/api/setup/linear-summary/route.js",
16
15
  "/api/setup/preview-harness-secrets/route": "app/api/setup/preview-harness-secrets/route.js",
17
- "/api/setup/remote-summary/route": "app/api/setup/remote-summary/route.js",
18
16
  "/api/setup/preview-harness-repo-provisioning/route": "app/api/setup/preview-harness-repo-provisioning/route.js",
19
- "/api/setup/manual-harness-secret-values/route": "app/api/setup/manual-harness-secret-values/route.js",
17
+ "/api/setup/preview-linear-setup/route": "app/api/setup/preview-linear-setup/route.js",
20
18
  "/api/setup/preview-target-workflow/route": "app/api/setup/preview-target-workflow/route.js",
21
- "/api/setup/preview-local-files/route": "app/api/setup/preview-local-files/route.js",
22
- "/api/setup/vercel-summary/route": "app/api/setup/vercel-summary/route.js",
23
- "/api/setup/vercel-bridge-redeploy-status/route": "app/api/setup/vercel-bridge-redeploy-status/route.js",
19
+ "/api/setup/remote-summary/route": "app/api/setup/remote-summary/route.js",
24
20
  "/api/setup/summary/route": "app/api/setup/summary/route.js",
21
+ "/api/setup/apply-linear-setup/route": "app/api/setup/apply-linear-setup/route.js",
25
22
  "/api/setup/vercel-bridge-options/route": "app/api/setup/vercel-bridge-options/route.js",
23
+ "/api/setup/vercel-bridge-redeploy-status/route": "app/api/setup/vercel-bridge-redeploy-status/route.js",
26
24
  "/api/setup/verify-harness-repo/route": "app/api/setup/verify-harness-repo/route.js",
25
+ "/api/setup/preview-local-files/route": "app/api/setup/preview-local-files/route.js",
27
26
  "/api/setup/verify-service/route": "app/api/setup/verify-service/route.js",
28
27
  "/api/setup/verify-target-repo/route": "app/api/setup/verify-target-repo/route.js",
29
- "/api/setup/apply-vercel-bridge/route": "app/api/setup/apply-vercel-bridge/route.js",
30
- "/api/setup/apply-harness-repo-provisioning/route": "app/api/setup/apply-harness-repo-provisioning/route.js",
28
+ "/api/setup/vercel-summary/route": "app/api/setup/vercel-summary/route.js",
29
+ "/api/setup/preview-vercel-bridge/route": "app/api/setup/preview-vercel-bridge/route.js",
30
+ "/api/setup/apply-target-workflow/route": "app/api/setup/apply-target-workflow/route.js",
31
31
  "/page": "app/page.js",
32
32
  "/settings/configure/page": "app/settings/configure/page.js"
33
33
  }
@@ -1,8 +1,8 @@
1
- "use strict";exports.id=477,exports.ids=[477],exports.modules={1913:(a,b,c)=>{c.d(b,{BA:()=>n,Mc:()=>d,Qh:()=>l,Rd:()=>j,YN:()=>k,Z6:()=>m,aR:()=>e,dI:()=>i,ge:()=>h,qe:()=>f,rD:()=>g});let d='Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.',e="GitHub token lacks the workflow scope required to create or update Actions workflow files under .github/workflows/. Use a classic PAT with the workflow scope or a fine-grained PAT with Actions/workflows write permission on the target repo, then update GITHUB_TOKEN in .env.local.",f='This token is valid, but it is missing workflow access. Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.',g="Fine-grained PAT detected. Repo-specific workflow install permission will be checked in Step 2 for each target repo.",h="An earlier setup check did not catch this permission gap. GitHub sometimes only reveals workflow write limits when updating files under .github/workflows/. ";function i(a,b){let c=a?.trim().toLowerCase();return"fine-grained"===c?"fine-grained":"classic"===c||b.length>0?"classic":"unknown"}function j(a){return a.includes("workflow")}function k(a){return a.includes("repo")||a.includes("public_repo")}function l(a){return"classic"!==a.tokenType?{ok:!0,limitation:g}:k(a.oauthScopes)?a.hasWorkflowScope?{ok:!0}:{ok:!1,message:f}:{ok:!1,message:'This token is valid, but it is missing repo access. Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.'}}function m(a){return"fine-grained"===a.tokenType?{ok:!1,message:"p-dev's first release needs a classic GitHub token with repo and workflow scopes so it can create your private p-dev-harness workspace and configure Actions. Fine-grained tokens are not yet supported for automatic workspace provisioning."}:"unknown"===a.tokenType||0===a.oauthScopes.length?{ok:!1,message:"GitHub accepted this token, but p-dev could not verify that it is a classic PAT with repo and workflow scopes. Create a classic PAT with repo and workflow selected, then verify again."}:a.oauthScopes.includes("repo")?a.hasWorkflowScope?{ok:!0}:{ok:!1,message:"This token is missing the workflow scope required for harness Actions workflow setup. Create a classic PAT with repo and workflow selected, then verify again."}:{ok:!1,message:"This token is missing the repo scope required to create and access your private p-dev-harness workspace. Create a classic PAT with repo and workflow selected, then verify again."}}let n="GitHub does not expose fine-grained Workflows write permission through a dedicated read-only API. Step 2 confirms repo access and Actions visibility; Step 5 remains the final fallback if GitHub only reveals the limit on write."},16589:(a,b,c)=>{function d(a){let b=a.trim().match(/^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/?$/);return b?{owner:b[1],repo:b[2]}:null}function e(a){if(a.actualBaseBranch!==a.expectedBaseBranch)throw Error(`wrong_pr_base_branch: PR ${a.prUrl} targets "${a.actualBaseBranch}"; expected "${a.expectedBaseBranch}". Update the PR base branch before continuing.`)}c.d(b,{$H:()=>e,wL:()=>d}),c(67470)},39058:(a,b,c)=>{c.d(b,{_u:()=>m,tl:()=>t,yu:()=>v,im:()=>w});var d=c(1913),e=c(67470),f=c(16589),g=c(35966);async function h(a){let b=new g.LinearClient({apiKey:a}),c=await b.viewer;return c.name??c.email??c.id}var i=c(57362),j=c(87285),k=c(84998),l=c(74590);async function m(a){let b=new e.jh({token:a.trim()}),c=await b.inspectAuthenticatedUser(),f=(0,d.dI)(c.tokenType,c.oauthScopes);return{login:c.login,tokenType:f,oauthScopes:c.oauthScopes,hasWorkflowScope:c.oauthScopes.includes("workflow"),hasRepoScope:c.oauthScopes.includes("repo")||c.oauthScopes.includes("public_repo")}}function n(a,b){return(0,i.h4)(a,b)}async function o(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Linear API key before verifying."};try{let a=await h(b);return{status:"connected",label:a,message:`Connected as ${a}.`}}catch(a){return{status:"failed",message:function(a,b){let c=a instanceof Error?a.message:String(a);return/unauthorized|invalid|forbidden|authentication/i.test(c)?"Linear rejected this API key. Check that LINEAR_API_KEY is valid.":n(c,[b])}(a,b)}}}async function p(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a GitHub token before verifying."};try{let a=await m(b),c=(0,d.Qh)(a);if(!c.ok)return{status:"failed",message:c.message,limitation:d.Mc};let e=c.limitation??("classic"===a.tokenType?void 0:d.rD);return{status:"connected",label:a.login,message:`Connected as ${a.login}.`,limitation:e}}catch(a){var c,f;return{status:"failed",message:(c=a,f=b,c instanceof e.OS?401===c.status?"GitHub rejected this token. Check that GITHUB_TOKEN is valid and not expired.":403===c.status?"GitHub accepted the request but denied access. The token may lack required scopes.":n(`GitHub API returned HTTP ${c.status}. Check the token and try again.`,[f]):n(c instanceof Error?c.message:String(c),[f])),limitation:d.Mc}}}async function q(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Cursor API key before verifying."};try{let{Cursor:a}=await Promise.resolve().then(c.bind(c,28783)),d=(await a.models.list({apiKey:b})).length,e="";try{let c=await a.repositories.list({apiKey:b});c.length>0&&(e=` ${c.length} connected repo(s) visible to Cursor.`)}catch{}return{status:"connected",label:`${d} model(s)`,message:`Cursor API key accepted (${d} model(s) available).${e}`,limitation:"This confirms the key works with Cursor SDK listing. It does not guarantee a future cloud run can access every target repo."}}catch(a){return{status:"failed",message:function(a,b){let c=a instanceof Error?a.message:String(a);return/unauthorized|invalid|forbidden|authentication|401|403/i.test(c)?"Cursor rejected this API key. Check that CURSOR_API_KEY is valid.":n(c,[b])}(a,b),limitation:"Cursor verification uses read-only SDK model listing, not a live agent run."}}}async function r(a){let b=a.token.trim(),c=a.targetRepo.trim();if(!c)return{status:"failed",message:"Enter a GitHub target repo URL before verifying."};let g=function(a){let b=(0,f.wL)(a.trim());if(!b)return null;let c=`${b.owner}/${b.repo}`;return{...b,slug:c,normalizedUrl:`https://github.com/${c}`}}(c);if(!g)return{status:"failed",message:"Enter a valid GitHub repo URL like https://github.com/acme/my-product."};if(!b)return{status:"failed",message:"Add or save a GitHub token first, then verify repo + workflow access."};try{let a=await m(b);if("classic"===a.tokenType&&!a.hasWorkflowScope)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:d.qe,limitation:d.Mc};let c=new e.jh({token:b}),f=await c.getRepository(g.owner,g.repo),h=f.permissions?.pull===!0||f.permissions?.push===!0||f.permissions?.admin===!0||f.permissions?.maintain===!0,i=f.permissions?.push===!0||f.permissions?.admin===!0||f.permissions?.maintain===!0;if(!h)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub token cannot read ${g.slug}. Grant repo read access to this token.`};if(!i)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub token cannot write repository contents for ${g.slug}. Workflow install PRs need Contents write access. Use a classic PAT with repo + workflow or a fine-grained PAT with Contents write + Workflows write on this repo.`};try{await c.listActionsWorkflows(g.owner,g.repo)}catch(a){if(a instanceof e.OS&&(403===a.status||404===a.status)&&/workflow/i.test(a.message))return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:d.aR};if(a instanceof e.OS&&403===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub denied Actions workflow access for ${g.slug}. Grant Workflows write (fine-grained PAT) or workflow scope (classic PAT), then update GITHUB_TOKEN and verify again.`};throw a}if("fine-grained"===a.tokenType)return{status:"connected",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!0,message:`Connected to ${g.slug} with repo + workflow install access expected.`,limitation:d.BA};return{status:"connected",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!0,message:`Connected to ${g.slug} with repo + workflow install access.`}}catch(a){if(a instanceof e.OS){if(404===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`Repo ${g.slug} was not found or this token cannot access it.`};if(401===a.status)return{status:"failed",workflowInstallReady:!1,message:"GitHub rejected the token. Verify GITHUB_TOKEN and try again."};if(403===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub denied access to ${g.slug}. Check token permissions for this repo.`};return{status:"failed",workflowInstallReady:!1,message:n(`GitHub API returned HTTP ${a.status} while checking ${g.slug}.`,[b])}}return{status:"failed",workflowInstallReady:!1,message:n(a instanceof Error?a.message:String(a),[b])}}}async function s(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Vercel token before verifying."};try{let a=await (0,l.UL)(b);return{status:"connected",label:a.username,message:`Connected as ${a.username}.`,limitation:"This confirms the Vercel token can read account metadata. Project and env var writes still require preview + confirmation."}}catch(c){let a=c instanceof Error?c.message:String(c);if(/unauthorized|forbidden|401|403/i.test(a))return{status:"failed",message:"Vercel rejected this token. Check that VERCEL_TOKEN is valid."};return{status:"failed",message:n(a,[b])}}}async function t(a){let b=(0,k.ym)(a.cwd),c=await (0,j.Hn)(b);return c?.values[a.key]?.trim()||void 0}async function u(a){let b=a.token?.trim();if(b)return{token:b,usedSavedKey:!1};let c=await t({cwd:a.cwd,key:{linear:"LINEAR_API_KEY",cursor:"CURSOR_API_KEY",github:"GITHUB_TOKEN",vercel:"VERCEL_TOKEN"}[a.service]});return c?{token:c,usedSavedKey:!0}:{token:void 0,usedSavedKey:!1}}async function v(a){let b,c=await u(a);if(!c.token)return{status:"failed",message:`Enter ${({linear:"LINEAR_API_KEY",cursor:"CURSOR_API_KEY",github:"GITHUB_TOKEN",vercel:"VERCEL_TOKEN"})[a.service]} or save it in .env.local before verifying.`,usedSavedKey:!1};switch(a.service){case"linear":b=await o(c.token);break;case"cursor":b=await q(c.token);break;case"github":b=await p(c.token);break;case"vercel":b=await s(c.token)}return{...b,usedSavedKey:c.usedSavedKey}}async function w(a){let b=await u({cwd:a.cwd,service:"github",token:a.githubToken});return{...await r({token:b.token??"",targetRepo:a.targetRepo}),usedSavedGithubToken:b.usedSavedKey}}},57362:(a,b,c)=>{c.d(b,{B8:()=>g,Gn:()=>h,QJ:()=>e,h4:()=>f,qs:()=>i});let d=RegExp("^(LINEAR_API_KEY|CURSOR_API_KEY|GITHUB_TOKEN|VERCEL_TOKEN|HARNESS_GITHUB_TOKEN|HARNESS_CONFIG_JSON_B64|LINEAR_WEBHOOK_SECRET|GITHUB_DISPATCH_TOKEN)=(.*)$","gm");function e(a){return a.replace(d,(a,b,c)=>c.length>0?`${b}=<redacted>`:`${b}=`)}function f(a,b){let c=a;for(let a of b)a&&(c=c.split(a).join("<redacted>"));return c}function g(a){return[a?.linearApiKey,a?.cursorApiKey,a?.githubToken,a?.vercelToken].filter(a=>!!a)}function h(a){return[a?.linearApiKey,a?.cursorApiKey,a?.githubToken,a?.harnessConfigJsonB64].filter(a=>!!a)}function i(a,b=[]){let c=a=>f(e(a),b);return{...a,content:a.content?c(a.content):void 0,reason:a.reason?c(a.reason):void 0,logMessage:a.logMessage?c(a.logMessage):void 0,manualInstructions:a.manualInstructions?.map(a=>c(a))}}},58885:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(73024),e=c(76760),f=c.n(e),g=c(33443),h=c.n(g);function i(a=process.cwd()){h().config({path:f().join(a,".env")});let b=f().join(a,".env.local");(0,d.existsSync)(b)&&h().config({path:b,override:!0})}},67470:(a,b,c)=>{c.d(b,{OS:()=>e,jh:()=>g});var d=c(92116);class e extends Error{constructor(a,b){super(b),this.name="GitHubApiError",this.status=a}}let f="https://api.github.com";class g{constructor(a){this.token=a.token}async request(a,b){let c=await fetch(`${f}${a}`,{method:b?.method??"GET",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28",...b?.body?{"Content-Type":"application/json"}:{}},body:b?.body?JSON.stringify(b.body):void 0});if(!c.ok){let a=await c.text(),b=(0,d.M)(a||`GitHub API request failed: ${c.status}`);throw new e(c.status,b)}let g=await c.text();return 204!==c.status&&g.trim()?JSON.parse(g):{}}async graphqlRequest(a,b){let c=await fetch(`${f}/graphql`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28","Content-Type":"application/json"},body:JSON.stringify({query:a,variables:b})});if(!c.ok){let a=await c.text(),b=(0,d.M)(a||`GitHub GraphQL request failed: ${c.status}`);throw new e(c.status,b)}let g=await c.json();if(g.errors?.length)throw new e(422,g.errors.map(a=>a.message).join("; "));if(!g.data)throw new e(422,"GitHub GraphQL response missing data");return g.data}async getAuthenticatedUser(){return this.request("/user")}async inspectAuthenticatedUser(){let a=await fetch(`${f}/user`,{method:"GET",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28"}}),b=await a.text();if(!a.ok){let c=(0,d.M)(b||`GitHub API request failed: ${a.status}`);throw new e(a.status,c)}return{login:JSON.parse(b).login,oauthScopes:(a.headers.get("x-oauth-scopes")??"").split(",").map(a=>a.trim().toLowerCase()).filter(Boolean),tokenType:a.headers.get("github-authentication-token-type")}}async listActionsWorkflows(a,b){return this.request(`/repos/${a}/${b}/actions/workflows?per_page=1`)}async getBranchRef(a,b,c){return this.request(`/repos/${a}/${b}/git/ref/heads/${encodeURIComponent(c)}`)}async getRepository(a,b){return this.request(`/repos/${a}/${b}`)}async getRepositoryById(a){if(!Number.isInteger(a)||a<=0)throw Error(`Invalid GitHub repository ID: ${String(a)}`);return this.request(`/repositories/${a}`)}async getPullRequest(a,b,c){return this.request(`/repos/${a}/${b}/pulls/${c}`)}async markPullRequestReadyForReview(a,b,c){let d=await this.getPullRequest(a,b,c);return await this.graphqlRequest(`mutation MarkPullRequestReadyForReview($pullRequestId: ID!) {
1
+ "use strict";exports.id=477,exports.ids=[477],exports.modules={1913:(a,b,c)=>{c.d(b,{BA:()=>n,Mc:()=>d,Qh:()=>l,Rd:()=>j,YN:()=>k,Z6:()=>m,aR:()=>e,dI:()=>i,ge:()=>h,qe:()=>f,rD:()=>g});let d='Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.',e="GitHub token lacks the workflow scope required to create or update Actions workflow files under .github/workflows/. Use a classic PAT with the workflow scope or a fine-grained PAT with Actions/workflows write permission on the target repo, then update GITHUB_TOKEN in .env.local.",f='This token is valid, but it is missing workflow access. Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.',g="Fine-grained PAT detected. Repo-specific workflow install permission will be checked in Step 2 for each target repo.",h="An earlier setup check did not catch this permission gap. GitHub sometimes only reveals workflow write limits when updating files under .github/workflows/. ";function i(a,b){let c=a?.trim().toLowerCase();return"fine-grained"===c?"fine-grained":"classic"===c||b.length>0?"classic":"unknown"}function j(a){return a.includes("workflow")}function k(a){return a.includes("repo")||a.includes("public_repo")}function l(a){return"classic"!==a.tokenType?{ok:!0,limitation:g}:k(a.oauthScopes)?a.hasWorkflowScope?{ok:!0}:{ok:!1,message:f}:{ok:!1,message:'This token is valid, but it is missing repo access. Open "How do I get a GitHub token?" and create a classic token with repo and workflow selected.'}}function m(a){return"fine-grained"===a.tokenType?{ok:!1,message:"p-dev's first release needs a classic GitHub token with repo and workflow scopes so it can create your private p-dev-harness workspace and configure Actions. Fine-grained tokens are not yet supported for automatic workspace provisioning."}:"unknown"===a.tokenType||0===a.oauthScopes.length?{ok:!1,message:"GitHub accepted this token, but p-dev could not verify that it is a classic PAT with repo and workflow scopes. Create a classic PAT with repo and workflow selected, then verify again."}:a.oauthScopes.includes("repo")?a.hasWorkflowScope?{ok:!0}:{ok:!1,message:"This token is missing the workflow scope required for harness Actions workflow setup. Create a classic PAT with repo and workflow selected, then verify again."}:{ok:!1,message:"This token is missing the repo scope required to create and access your private p-dev-harness workspace. Create a classic PAT with repo and workflow selected, then verify again."}}let n="GitHub does not expose fine-grained Workflows write permission through a dedicated read-only API. Step 2 confirms repo access and Actions visibility; Step 5 remains the final fallback if GitHub only reveals the limit on write."},16589:(a,b,c)=>{function d(a){let b=a.trim().match(/^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/?$/);return b?{owner:b[1],repo:b[2]}:null}function e(a){if(a.actualBaseBranch!==a.expectedBaseBranch)throw Error(`wrong_pr_base_branch: PR ${a.prUrl} targets "${a.actualBaseBranch}"; expected "${a.expectedBaseBranch}". Update the PR base branch before continuing.`)}c.d(b,{$H:()=>e,wL:()=>d}),c(67470)},39058:(a,b,c)=>{c.d(b,{_u:()=>m,tl:()=>t,yu:()=>v,im:()=>w});var d=c(1913),e=c(67470),f=c(16589),g=c(35966);async function h(a){let b=new g.LinearClient({apiKey:a}),c=await b.viewer;return c.name??c.email??c.id}var i=c(57362),j=c(87285),k=c(84998),l=c(74590);async function m(a){let b=new e.jh({token:a.trim()}),c=await b.inspectAuthenticatedUser(),f=(0,d.dI)(c.tokenType,c.oauthScopes);return{login:c.login,tokenType:f,oauthScopes:c.oauthScopes,hasWorkflowScope:c.oauthScopes.includes("workflow"),hasRepoScope:c.oauthScopes.includes("repo")||c.oauthScopes.includes("public_repo")}}function n(a,b){return(0,i.h4)(a,b)}async function o(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Linear API key before verifying."};try{let a=await h(b);return{status:"connected",label:a,message:`Connected as ${a}.`}}catch(a){return{status:"failed",message:function(a,b){let c=a instanceof Error?a.message:String(a);return/unauthorized|invalid|forbidden|authentication/i.test(c)?"Linear rejected this API key. Check that LINEAR_API_KEY is valid.":n(c,[b])}(a,b)}}}async function p(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a GitHub token before verifying."};try{let a=await m(b),c=(0,d.Qh)(a);if(!c.ok)return{status:"failed",message:c.message,limitation:d.Mc};let e=c.limitation??("classic"===a.tokenType?void 0:d.rD);return{status:"connected",label:a.login,message:`Connected as ${a.login}.`,limitation:e}}catch(a){var c,f;return{status:"failed",message:(c=a,f=b,c instanceof e.OS?401===c.status?"GitHub rejected this token. Check that GITHUB_TOKEN is valid and not expired.":403===c.status?"GitHub accepted the request but denied access. The token may lack required scopes.":n(`GitHub API returned HTTP ${c.status}. Check the token and try again.`,[f]):n(c instanceof Error?c.message:String(c),[f])),limitation:d.Mc}}}async function q(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Cursor API key before verifying."};try{let{Cursor:a}=await Promise.resolve().then(c.bind(c,28783)),d=(await a.models.list({apiKey:b})).length,e="";try{let c=await a.repositories.list({apiKey:b});c.length>0&&(e=` ${c.length} connected repo(s) visible to Cursor.`)}catch{}return{status:"connected",label:`${d} model(s)`,message:`Cursor API key accepted (${d} model(s) available).${e}`,limitation:"This confirms the key works with Cursor SDK listing. It does not guarantee a future cloud run can access every target repo."}}catch(a){return{status:"failed",message:function(a,b){let c=a instanceof Error?a.message:String(a);return/unauthorized|invalid|forbidden|authentication|401|403/i.test(c)?"Cursor rejected this API key. Check that CURSOR_API_KEY is valid.":n(c,[b])}(a,b),limitation:"Cursor verification uses read-only SDK model listing, not a live agent run."}}}async function r(a){let b=a.token.trim(),c=a.targetRepo.trim();if(!c)return{status:"failed",message:"Enter a GitHub target repo URL before verifying."};let g=function(a){let b=(0,f.wL)(a.trim());if(!b)return null;let c=`${b.owner}/${b.repo}`;return{...b,slug:c,normalizedUrl:`https://github.com/${c}`}}(c);if(!g)return{status:"failed",message:"Enter a valid GitHub repo URL like https://github.com/acme/my-product."};if(!b)return{status:"failed",message:"Add or save a GitHub token first, then verify repo + workflow access."};try{let a=await m(b);if("classic"===a.tokenType&&!a.hasWorkflowScope)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:d.qe,limitation:d.Mc};let c=new e.jh({token:b}),f=await c.getRepository(g.owner,g.repo),h=f.permissions?.pull===!0||f.permissions?.push===!0||f.permissions?.admin===!0||f.permissions?.maintain===!0,i=f.permissions?.push===!0||f.permissions?.admin===!0||f.permissions?.maintain===!0;if(!h)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub token cannot read ${g.slug}. Grant repo read access to this token.`};if(!i)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub token cannot write repository contents for ${g.slug}. Workflow install PRs need Contents write access. Use a classic PAT with repo + workflow or a fine-grained PAT with Contents write + Workflows write on this repo.`};try{await c.listActionsWorkflows(g.owner,g.repo)}catch(a){if(a instanceof e.OS&&(403===a.status||404===a.status)&&/workflow/i.test(a.message))return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:d.aR};if(a instanceof e.OS&&403===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub denied Actions workflow access for ${g.slug}. Grant Workflows write (fine-grained PAT) or workflow scope (classic PAT), then update GITHUB_TOKEN and verify again.`};throw a}if("fine-grained"===a.tokenType)return{status:"connected",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!0,message:`Connected to ${g.slug} with repo + workflow install access expected.`,limitation:d.BA};return{status:"connected",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!0,message:`Connected to ${g.slug} with repo + workflow install access.`}}catch(a){if(a instanceof e.OS){if(404===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`Repo ${g.slug} was not found or this token cannot access it.`};if(401===a.status)return{status:"failed",workflowInstallReady:!1,message:"GitHub rejected the token. Verify GITHUB_TOKEN and try again."};if(403===a.status)return{status:"failed",repoSlug:g.slug,normalizedUrl:g.normalizedUrl,workflowInstallReady:!1,message:`GitHub denied access to ${g.slug}. Check token permissions for this repo.`};return{status:"failed",workflowInstallReady:!1,message:n(`GitHub API returned HTTP ${a.status} while checking ${g.slug}.`,[b])}}return{status:"failed",workflowInstallReady:!1,message:n(a instanceof Error?a.message:String(a),[b])}}}async function s(a){let b=a.trim();if(!b)return{status:"failed",message:"Enter a Vercel token before verifying."};try{let a=await (0,l.UL)(b);return{status:"connected",label:a.username,message:`Connected as ${a.username}.`,limitation:"This confirms the Vercel token can read account metadata. Project and env var writes still require preview + confirmation."}}catch(c){let a=c instanceof Error?c.message:String(c);if(/unauthorized|forbidden|401|403/i.test(a))return{status:"failed",message:"Vercel rejected this token. Check that VERCEL_TOKEN is valid."};return{status:"failed",message:n(a,[b])}}}async function t(a){let b=(0,k.ym)(a.cwd),c=await (0,j.Hn)(b);return c?.values[a.key]?.trim()||void 0}async function u(a){let b=a.token?.trim();if(b)return{token:b,usedSavedKey:!1};let c=await t({cwd:a.cwd,key:{linear:"LINEAR_API_KEY",cursor:"CURSOR_API_KEY",github:"GITHUB_TOKEN",vercel:"VERCEL_TOKEN"}[a.service]});return c?{token:c,usedSavedKey:!0}:{token:void 0,usedSavedKey:!1}}async function v(a){let b,c=await u(a);if(!c.token)return{status:"failed",message:`Enter ${({linear:"LINEAR_API_KEY",cursor:"CURSOR_API_KEY",github:"GITHUB_TOKEN",vercel:"VERCEL_TOKEN"})[a.service]} or save it in .env.local before verifying.`,usedSavedKey:!1};switch(a.service){case"linear":b=await o(c.token);break;case"cursor":b=await q(c.token);break;case"github":b=await p(c.token);break;case"vercel":b=await s(c.token)}return{...b,usedSavedKey:c.usedSavedKey}}async function w(a){let b=await u({cwd:a.cwd,service:"github",token:a.githubToken});return{...await r({token:b.token??"",targetRepo:a.targetRepo}),usedSavedGithubToken:b.usedSavedKey}}},45599:(a,b,c)=>{function d(a){let b={},c=a.get("retry-after");if(c){let a=Number(c);Number.isFinite(a)&&a>0&&(b.retryAfterSeconds=Math.ceil(a))}let d=a.get("x-ratelimit-remaining");if(null!==d&&""!==d.trim()){let a=Number(d);Number.isFinite(a)&&(b.rateLimitRemaining=a)}let e=a.get("x-ratelimit-reset");if(null!==e&&""!==e.trim()){let a=Number(e);Number.isFinite(a)&&(b.rateLimitResetEpochSeconds=a)}let f=a.get("x-github-request-id");return f&&(b.requestId=f),b}function e(a){return/secondary rate limit|abuse detection|temporarily blocked/i.test(a)}function f(a){return 429===a.status||403===a.status&&(!!(/rate limit/i.test(a.message)||e(a.message))||void 0!==a.retryAfterSeconds&&!!(a.retryAfterSeconds>0)||0===a.rateLimitRemaining)}function g(a){let{error:b,secondaryStrikeCount:c,nowMs:d}=a;if(void 0!==b.retryAfterSeconds&&b.retryAfterSeconds>0)return 1e3*b.retryAfterSeconds;if(0===b.rateLimitRemaining&&void 0!==b.rateLimitResetEpochSeconds)return Math.max(0,1e3*b.rateLimitResetEpochSeconds-d)+2e3;if(403===b.status||429===b.status){let a=Math.max(0,c-1);return Math.min(3e5,6e4*2**a)}return 6e4}c.d(b,{J6:()=>g,df:()=>f,nq:()=>d,pe:()=>e})},57362:(a,b,c)=>{c.d(b,{B8:()=>g,Gn:()=>h,QJ:()=>e,h4:()=>f,qs:()=>i});let d=RegExp("^(LINEAR_API_KEY|CURSOR_API_KEY|GITHUB_TOKEN|VERCEL_TOKEN|HARNESS_GITHUB_TOKEN|HARNESS_CONFIG_JSON_B64|LINEAR_WEBHOOK_SECRET|GITHUB_DISPATCH_TOKEN)=(.*)$","gm");function e(a){return a.replace(d,(a,b,c)=>c.length>0?`${b}=<redacted>`:`${b}=`)}function f(a,b){let c=a;for(let a of b)a&&(c=c.split(a).join("<redacted>"));return c}function g(a){return[a?.linearApiKey,a?.cursorApiKey,a?.githubToken,a?.vercelToken].filter(a=>!!a)}function h(a){return[a?.linearApiKey,a?.cursorApiKey,a?.githubToken,a?.harnessConfigJsonB64].filter(a=>!!a)}function i(a,b=[]){let c=a=>f(e(a),b);return{...a,content:a.content?c(a.content):void 0,reason:a.reason?c(a.reason):void 0,logMessage:a.logMessage?c(a.logMessage):void 0,manualInstructions:a.manualInstructions?.map(a=>c(a))}}},58885:(a,b,c)=>{c.d(b,{N:()=>i});var d=c(73024),e=c(76760),f=c.n(e),g=c(33443),h=c.n(g);function i(a=process.cwd()){h().config({path:f().join(a,".env")});let b=f().join(a,".env.local");(0,d.existsSync)(b)&&h().config({path:b,override:!0})}},67470:(a,b,c)=>{c.d(b,{OS:()=>f,jh:()=>i});var d=c(92116),e=c(45599);class f extends Error{constructor(a,b,c){super(b),this.name="GitHubApiError",this.status=a,c&&(this.retryAfterSeconds=c.retryAfterSeconds,this.rateLimitRemaining=c.rateLimitRemaining,this.rateLimitResetEpochSeconds=c.rateLimitResetEpochSeconds,this.requestId=c.requestId)}}function g(a,b,c){let g=(0,d.M)(b||`GitHub API request failed: ${a}`);return new f(a,g,c?(0,e.nq)(c):void 0)}let h="https://api.github.com";class i{constructor(a){this.token=a.token}async request(a,b){let c=await fetch(`${h}${a}`,{method:b?.method??"GET",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28",...b?.body?{"Content-Type":"application/json"}:{}},body:b?.body?JSON.stringify(b.body):void 0});if(!c.ok){let a=await c.text();throw g(c.status,a,c.headers)}let d=await c.text();return 204!==c.status&&d.trim()?JSON.parse(d):{}}async graphqlRequest(a,b){let c=await fetch(`${h}/graphql`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28","Content-Type":"application/json"},body:JSON.stringify({query:a,variables:b})});if(!c.ok){let a=await c.text();throw g(c.status,a,c.headers)}let d=await c.json();if(d.errors?.length)throw new f(422,d.errors.map(a=>a.message).join("; "));if(!d.data)throw new f(422,"GitHub GraphQL response missing data");return d.data}async getAuthenticatedUser(){return this.request("/user")}async inspectAuthenticatedUser(){let a=await fetch(`${h}/user`,{method:"GET",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28"}}),b=await a.text();if(!a.ok)throw g(a.status,b,a.headers);return{login:JSON.parse(b).login,oauthScopes:(a.headers.get("x-oauth-scopes")??"").split(",").map(a=>a.trim().toLowerCase()).filter(Boolean),tokenType:a.headers.get("github-authentication-token-type")}}async listActionsWorkflows(a,b){return this.request(`/repos/${a}/${b}/actions/workflows?per_page=1`)}async getBranchRef(a,b,c){return this.request(`/repos/${a}/${b}/git/ref/heads/${encodeURIComponent(c)}`)}async getRepository(a,b){return this.request(`/repos/${a}/${b}`)}async getRepositoryById(a){if(!Number.isInteger(a)||a<=0)throw Error(`Invalid GitHub repository ID: ${String(a)}`);return this.request(`/repositories/${a}`)}async getPullRequest(a,b,c){return this.request(`/repos/${a}/${b}/pulls/${c}`)}async markPullRequestReadyForReview(a,b,c){let d=await this.getPullRequest(a,b,c);return await this.graphqlRequest(`mutation MarkPullRequestReadyForReview($pullRequestId: ID!) {
2
2
  markPullRequestReadyForReview(input: { pullRequestId: $pullRequestId }) {
3
3
  pullRequest { isDraft }
4
4
  }
5
- }`,{pullRequestId:d.node_id}),this.getPullRequest(a,b,c)}async getPullRequestFiles(a,b,c){return this.request(`/repos/${a}/${b}/pulls/${c}/files`)}async getIssueComments(a,b,c){return this.request(`/repos/${a}/${b}/issues/${c}/comments`)}async getCheckRunsForRef(a,b,c){return this.request(`/repos/${a}/${b}/commits/${c}/check-runs`)}async getCombinedStatusForRef(a,b,c){return this.request(`/repos/${a}/${b}/commits/${c}/status`)}async mergePullRequest(a,b,c,d){return this.request(`/repos/${a}/${b}/pulls/${c}/merge`,{method:"PUT",body:{merge_method:d.mergeMethod,...d.commitTitle?{commit_title:d.commitTitle}:{},...d.expectedHeadSha?{sha:d.expectedHeadSha}:{}}})}async updatePullRequestBranch(a,b,c,d={}){return this.request(`/repos/${a}/${b}/pulls/${c}/update-branch`,{method:"PUT",body:{...d.expectedHeadSha?{expected_head_sha:d.expectedHeadSha}:{}}})}async compareCommits(a,b,c,d){return this.request(`/repos/${a}/${b}/compare/${c}...${d}`)}async getActionsPublicKey(a,b){return this.request(`/repos/${a}/${b}/actions/secrets/public-key`)}async listActionsSecrets(a,b){return this.request(`/repos/${a}/${b}/actions/secrets?per_page=100`)}async upsertActionsSecret(a,b,c,d,e){await this.request(`/repos/${a}/${b}/actions/secrets/${c}`,{method:"PUT",body:{encrypted_value:d,key_id:e}})}async getRepositoryContent(a,b,c,d){try{return await this.request(`/repos/${a}/${b}/contents/${c}?ref=${encodeURIComponent(d)}`)}catch(a){if(a instanceof e&&404===a.status)return null;throw a}}decodeRepositoryContent(a){return Buffer.from(a.content,"base64").toString("utf8")}async createOrUpdateRepositoryFile(a){return{commitSha:(await this.request(`/repos/${a.owner}/${a.repo}/contents/${a.path}`,{method:"PUT",body:{message:a.message,content:Buffer.from(a.content,"utf8").toString("base64"),branch:a.branch,...a.sha?{sha:a.sha}:{}}})).commit.sha}}async createGitRef(a,b,c,d){return this.request(`/repos/${a}/${b}/git/refs`,{method:"POST",body:{ref:`refs/heads/${c}`,sha:d}})}async createRepositoryFromTemplate(a){return this.request(`/repos/${a.templateOwner}/${a.templateRepo}/generate`,{method:"POST",body:{owner:a.owner,name:a.name,description:a.description,private:a.private,include_all_branches:a.includeAllBranches??!1}})}async createPullRequest(a){return this.request(`/repos/${a.owner}/${a.repo}/pulls`,{method:"POST",body:{title:a.title,head:a.head,base:a.base,body:a.body}})}async listPullRequests(a,b,c={}){let d=new URLSearchParams;return d.set("state",c.state??"open"),c.base&&d.set("base",c.base),c.head&&d.set("head",c.head),d.set("sort",c.sort??"created"),d.set("direction",c.direction??"desc"),this.request(`/repos/${a}/${b}/pulls?${d.toString()}`)}}},74590:(a,b,c)=>{c.d(b,{A3:()=>q,Eb:()=>o,FR:()=>z,MA:()=>B,P4:()=>p,UL:()=>l,V9:()=>v,_i:()=>y,b1:()=>w,bM:()=>u,c9:()=>f,dQ:()=>t,dk:()=>m,iQ:()=>i,ln:()=>n,oN:()=>r,wH:()=>A,wI:()=>x});var d=c(75365);let e="https://api.vercel.com";class f extends Error{constructor(a){super(a.message),this.name="VercelEnvVarTypeError",this.key=a.key,this.existingType=a.existingType,this.status=a.status}}class g extends Error{constructor(a){super(a.message),this.name="VercelTeamBillingError",this.status=a.status,this.providerCode=a.providerCode}}let h=new Set(["LINEAR_WEBHOOK_SECRET","GITHUB_DISPATCH_TOKEN"]);function i(a){return h.has(a)?"sensitive":"plain"}function j(a){return/cannot change the key of a sensitive environment variable/i.test(a.body)?new f({key:a.key,existingType:a.existingType,status:a.status,message:`Vercel rejected updating ${a.key} because sensitive environment variables cannot have their key changed via API. The app did not delete or recreate it. Update the value manually in Vercel or approve a separate delete/recreate repair.`}):/cannot change the type of a sensitive environment variable/i.test(a.body)?new f({key:a.key,existingType:a.existingType,status:a.status,message:`Vercel rejected updating ${a.key} because it is a sensitive environment variable whose type cannot be changed. The app did not delete or recreate it. Update the value manually in Vercel or approve a separate delete/recreate repair.`}):null}async function k(a,b,c){let d=new URL(`${e}${b}`);c?.teamId&&d.searchParams.set("teamId",c.teamId);let f=await fetch(d,{...c,headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json",...c?.headers??{}}});if(!f.ok){let a=await f.text();throw Error(`Vercel API ${f.status} on ${b}: ${a.slice(0,200)}`)}if(204!==f.status)return await f.json()}async function l(a){return(await k(a,"/v2/user")).user}async function m(a){return((await k(a,"/v2/teams")).teams??[]).map(a=>({id:a.id,name:a.name,slug:a.slug}))}async function n(a,b){let c="/v1/teams",d=new URL(`${e}${c}`),f=await fetch(d,{method:"POST",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({slug:b.slug.trim(),...b.name?.trim()?{name:b.name.trim()}:{}})});if(!f.ok){let a=await f.text(),b=function(a){let b=a.body.match(/"code"\s*:\s*"(payment_method_required|billing|payment[^"]*)"/i),c=b?.[1];return"payment_method_required"===c||/payment method is required/i.test(a.body)||/credit card/i.test(a.body)?new g({status:a.status,providerCode:c??"payment_method_required",message:"Vercel requires a payment method before creating another team. No harness setup was applied. Add or update billing in Vercel, or choose an existing team."}):null}({status:f.status,body:a});if(b)throw b;throw Error(`Vercel API ${f.status} on ${c}: ${a.slice(0,200)}`)}let h=await f.json();return{id:h.id,slug:h.slug,name:h.name??b.name?.trim()??h.slug}}async function o(a,b){return((await k(a,"/v9/projects",{teamId:b})).projects??[]).map(a=>({id:a.id,name:a.name,accountId:a.accountId}))}async function p(a,b){let c=await k(a,"/v11/projects",{method:"POST",teamId:b.teamId,body:JSON.stringify({name:b.name.trim()})});return{id:c.id,name:c.name,accountId:c.accountId}}async function q(a,b,c){return((await k(a,`/v9/projects/${b}/env`,{teamId:c})).envs??[]).map(a=>({id:a.id,key:a.key,target:a.target??[],type:a.type??"encrypted"}))}function r(a){return"READY"===a.readyState||"READY"===a.state}function s(a){return a.replace(/^https?:\/\//,"").replace(/\/$/,"").toLowerCase()}async function t(a){let b,c=a.listDeployments??u,d=a.getDeployment??v;if(a.preferredDeploymentId?.trim()){if(!r(b=await d(a.vercelToken,a.preferredDeploymentId.trim(),a.teamId)))return}else{if(!(b=(await c(a.vercelToken,a.projectId,a.teamId,{state:"READY",limit:5})).find(a=>r(a))))return;b.aliases?.length||(b=await d(a.vercelToken,b.id,a.teamId))}let e=function(a){let b=s(a.deploymentUrl),c=(a.aliases??[]).map(a=>s(a)).filter(Boolean),d=c.filter(a=>a!==b&&!function(a){let b=s(a);return/^.+-[a-z0-9]{8,}-.+\.vercel\.app$/i.test(b)}(a));if(d.length>0){let a=d.find(a=>!a.endsWith(".vercel.app"))??[...d].sort((a,b)=>a.length-b.length)[0];return{host:a,source:"stable_alias",stableAlias:a}}let e=c.find(a=>a!==b);return e?{host:e,source:"stable_alias",stableAlias:e}:{host:b,source:"latest_ready_deployment"}}({deploymentUrl:b.url,aliases:b.aliases});return{productionUrl:`https://${e.host}`,webhookUrl:function(a){let b=a.replace(/^https?:\/\//,"").replace(/\/$/,"");return`https://${b}/api/linear-webhook`}(e.host),deploymentId:b.id,deploymentUrl:b.url,source:e.source,stableAlias:e.stableAlias,readyState:b.readyState,state:b.state}}async function u(a,b,c,d){let e=new URLSearchParams({projectId:b,target:"production",limit:String(d?.limit??5)});return d?.state?.trim()&&e.set("state",d.state.trim()),((await k(a,`/v6/deployments?${e.toString()}`,{teamId:c})).deployments??[]).map(a=>({id:a.uid,url:a.url,state:a.state,readyState:a.readyState,aliases:a.alias??[]}))}async function v(a,b,c){let d=await k(a,`/v13/deployments/${b}`,{teamId:c});return{id:d.uid??d.id??b,url:d.url,state:d.state,readyState:d.readyState,aliases:d.alias??[]}}async function w(a,b){let c=await k(a,"/v13/deployments",{method:"POST",teamId:b.teamId,body:JSON.stringify({name:b.projectName.trim(),deploymentId:b.sourceDeploymentId,target:"production"})});return{id:c.uid??c.id??b.sourceDeploymentId,url:c.url,state:c.state,readyState:c.readyState}}async function x(a,b){let c=b.existingEnv?.id??b.existingEnvId,d=b.existingEnv?.type,f=i(b.key);if(c){var g;let f=`/v9/projects/${b.projectId}/env/${c}`,h=new URL(`${e}${f}`);b.teamId&&h.searchParams.set("teamId",b.teamId);let i=await fetch(h,{method:"PATCH",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({value:(g={value:b.value,existingEnv:b.existingEnv}).value,target:g.existingEnv?.target?.length?g.existingEnv.target:["production"]})});if(!i.ok){let a=await i.text(),c=j({key:b.key,existingType:d??"encrypted",status:i.status,body:a});if(c)throw c;throw Error(`Vercel API ${i.status} on ${f}: ${a.slice(0,200)}`)}return}let h=`/v10/projects/${b.projectId}/env`,k=new URL(`${e}${h}`);b.teamId&&k.searchParams.set("teamId",b.teamId);let l=await fetch(k,{method:"POST",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({key:b.key,value:b.value,type:f,target:["production"]})});if(!l.ok){let a=await l.text(),c=j({key:b.key,existingType:f,status:l.status,body:a});if(c)throw c;throw Error(`Vercel API ${l.status} on ${h}: ${a.slice(0,200)}`)}}async function y(a){try{let b=await fetch(a,{method:"GET",redirect:"manual"}),c=b.headers.get("location")??"";if((302===b.status||307===b.status||308===b.status)&&/vercel\.com\/sso-api/i.test(c))return{reachable:!1,statusCode:b.status,reason:"protection_redirect"};if(405===b.status)return{reachable:!0,statusCode:b.status};if(404===b.status||401===b.status||403===b.status||b.status>=500)return{reachable:!1,statusCode:b.status};if(b.status>=200&&b.status<400)return{reachable:!0,statusCode:b.status};return{reachable:!1,statusCode:b.status}}catch{return{reachable:!1}}}function z(a){let b=new Set(a.map(a=>a.key));return Object.fromEntries(d.P$.map(a=>[a,b.has(a)?"present":"missing"]))}function A(a,b){let c=b.trim().toLowerCase();return a.find(a=>a.slug.toLowerCase()===c)}function B(a,b){let c=b.trim().toLowerCase();return a.find(a=>a.name.toLowerCase()===c)}},75365:(a,b,c)=>{c.d(b,{P$:()=>d,ck:()=>e,s5:()=>g,vC:()=>f});let d=["LINEAR_WEBHOOK_SECRET","GITHUB_DISPATCH_TOKEN","HARNESS_TEAM_KEY"],e=["GITHUB_DISPATCH_REPOSITORY","GITHUB_DISPATCH_EVENT_TYPE","LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_MS"],f={GITHUB_DISPATCH_REPOSITORY:"weston-uribe/agentic-product-development-harness",GITHUB_DISPATCH_EVENT_TYPE:"linear_issue_status_changed",LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_MS:"60000"};function g(a){let b={LINEAR_WEBHOOK_SECRET:a.requiredEnvPresence?.LINEAR_WEBHOOK_SECRET??"missing",GITHUB_DISPATCH_TOKEN:a.requiredEnvPresence?.GITHUB_DISPATCH_TOKEN??"missing",HARNESS_TEAM_KEY:a.requiredEnvPresence?.HARNESS_TEAM_KEY??"missing"},c=[];for(let[d,e]of(a.projectId||c.push("Select the Vercel bridge project."),a.productionUrl||c.push("Resolve the Vercel production URL for the bridge project."),a.endpointReachable||c.push("Verify /api/linear-webhook is reachable on the production URL."),Object.entries(b)))"missing"===e&&c.push(`Vercel production env var ${d} is missing.`);a.linearWebhookVerified||c.push("Verify the Linear Issue webhook points at the Vercel bridge URL."),a.signedProbeVerified||c.push("Signed webhook delivery verification has not passed against production."),a.deploymentRedeployRequired&&c.push("Redeploy Vercel production after env var changes, then retry signed verification.");let d=0===c.length&&!!a.projectId&&!!a.productionUrl&&!!a.endpointReachable&&!0===a.linearWebhookVerified&&!0===a.signedProbeVerified&&!0!==a.deploymentRedeployRequired;return{projectSelected:!!a.projectId,productionUrl:a.productionUrl,webhookUrl:a.webhookUrl,endpointReachable:!!a.endpointReachable,requiredEnvPresence:b,linearWebhookVerified:!!a.linearWebhookVerified,signedProbeVerified:!!a.signedProbeVerified,deploymentRedeployRequired:!!a.deploymentRedeployRequired,manualComplete:!!a.manualComplete,ready:d,blockers:c}}},83954:(a,b,c)=>{c.d(b,{Re:()=>i,Vq:()=>h});var d=c(73024),e=c(76760),f=c.n(e);c(73136);var g=c(58885);function h(a=process.cwd()){let b=process.env.HARNESS_REPO_ROOT?.trim();if(b)return f().resolve(b);let c=process.env.P_DEV_HOME?.trim();if(c)return f().resolve(c);let e=f().resolve(a);for(;;){let a=f().join(e,"package.json");if((0,d.existsSync)(a))try{let b=(0,d.readFileSync)(a,"utf8");if("agentic-product-development-harness"===JSON.parse(b).name)return e}catch{}let b=f().dirname(e);if(b===e)break;e=b}throw Error(`Could not resolve harness repo root from ${a}. Set HARNESS_REPO_ROOT or run harness:gui from the repo.`)}function i(a){(0,g.N)(a);let b=process.env.HARNESS_CONFIG_PATH?.trim();b&&!f().isAbsolute(b)&&(process.env.HARNESS_CONFIG_PATH=f().resolve(a,b))}},84998:(a,b,c)=>{c.d(b,{bm:()=>i,gr:()=>f,it:()=>j,ym:()=>k});var d=c(76760),e=c.n(d);let f=".env.local",g=".harness",h=e().join(g,"config.example.json"),i=e().join(g,"config.local.json"),j=".harness/config.local.json";function k(a){let b=a??process.cwd();return{cwd:b,envExample:e().join(b,".env.example"),envLocal:e().join(b,f),harnessDir:e().join(b,g),configExample:e().join(b,h),configLocal:e().join(b,i)}}},87285:(a,b,c)=>{c.d(b,{HF:()=>n,Hn:()=>k,Ol:()=>p,Um:()=>i,W:()=>o,X_:()=>r,_b:()=>l,ed:()=>j,lL:()=>q});var d=c(51455),e=c(57362),f=c(84998);let g=["HARNESS_CONFIG_PATH","GITHUB_DISPATCH_REPOSITORY","GITHUB_DISPATCH_REPOSITORY_ID","LINEAR_API_KEY","CURSOR_API_KEY","GITHUB_TOKEN","VERCEL_TOKEN"];async function h(a){try{return await (0,d.access)(a),!0}catch{return!1}}function i(a){let b={},c={HARNESS_CONFIG_PATH:!1,GITHUB_DISPATCH_REPOSITORY:!1,GITHUB_DISPATCH_REPOSITORY_ID:!1,LINEAR_API_KEY:!1,CURSOR_API_KEY:!1,GITHUB_TOKEN:!1,VERCEL_TOKEN:!1};for(let d of a.split("\n")){let a=d.trim();if(!a||a.startsWith("#"))continue;let e=a.indexOf("=");if(-1===e)continue;let f=a.slice(0,e).trim(),g=a.slice(e+1).trim();f in c?(b[f]=g,g.length>0&&(c[f]=!0)):"LINEAR_WEBHOOK_SECRET"===f&&(b[f]=g)}return{values:b,presence:c}}async function j(a){return await h(a.envLocal)?(0,d.readFile)(a.envLocal,"utf8"):null}async function k(a){let b=await j(a);return null===b?null:i(b)}function l(a,b){let c={harnessConfigPath:b.harnessConfigPath?.trim()||a?.values.HARNESS_CONFIG_PATH||f.it,githubDispatchRepository:b.githubDispatchRepository?.trim()||a?.values.GITHUB_DISPATCH_REPOSITORY||void 0,githubDispatchRepositoryId:b.githubDispatchRepositoryId?.trim()||a?.values.GITHUB_DISPATCH_REPOSITORY_ID||void 0};for(let[d,e]of Object.entries({linearApiKey:"LINEAR_API_KEY",cursorApiKey:"CURSOR_API_KEY",githubToken:"GITHUB_TOKEN",vercelToken:"VERCEL_TOKEN"})){let f=b[d]?.trim();f?c[d]=f:a?.values[e]&&(c[d]=a.values[e])}return c}function m(a){return{HARNESS_CONFIG_PATH:a.harnessConfigPath??f.it,GITHUB_DISPATCH_REPOSITORY:a.githubDispatchRepository??"",GITHUB_DISPATCH_REPOSITORY_ID:a.githubDispatchRepositoryId??"",LINEAR_API_KEY:a.linearApiKey??"",CURSOR_API_KEY:a.cursorApiKey??"",GITHUB_TOKEN:a.githubToken??"",VERCEL_TOKEN:a.vercelToken??""}}function n(a,b){if(null===a){let a=m(b);return`# Operator local setup — generated by harness setup core
5
+ }`,{pullRequestId:d.node_id}),this.getPullRequest(a,b,c)}async getPullRequestFiles(a,b,c){return this.request(`/repos/${a}/${b}/pulls/${c}/files`)}async getIssueComments(a,b,c){return this.request(`/repos/${a}/${b}/issues/${c}/comments`)}async getCheckRunsForRef(a,b,c){return this.request(`/repos/${a}/${b}/commits/${c}/check-runs`)}async getCombinedStatusForRef(a,b,c){return this.request(`/repos/${a}/${b}/commits/${c}/status`)}async mergePullRequest(a,b,c,d){return this.request(`/repos/${a}/${b}/pulls/${c}/merge`,{method:"PUT",body:{merge_method:d.mergeMethod,...d.commitTitle?{commit_title:d.commitTitle}:{},...d.expectedHeadSha?{sha:d.expectedHeadSha}:{}}})}async updatePullRequestBranch(a,b,c,d={}){return this.request(`/repos/${a}/${b}/pulls/${c}/update-branch`,{method:"PUT",body:{...d.expectedHeadSha?{expected_head_sha:d.expectedHeadSha}:{}}})}async compareCommits(a,b,c,d){return this.request(`/repos/${a}/${b}/compare/${c}...${d}`)}async getActionsPublicKey(a,b){return this.request(`/repos/${a}/${b}/actions/secrets/public-key`)}async listActionsSecrets(a,b){return this.request(`/repos/${a}/${b}/actions/secrets?per_page=100`)}async upsertActionsSecret(a,b,c,d,e){await this.request(`/repos/${a}/${b}/actions/secrets/${c}`,{method:"PUT",body:{encrypted_value:d,key_id:e}})}async getRepositoryContent(a,b,c,d){try{return await this.request(`/repos/${a}/${b}/contents/${c}?ref=${encodeURIComponent(d)}`)}catch(a){if(a instanceof f&&404===a.status)return null;throw a}}decodeRepositoryContent(a){return Buffer.from(a.content,"base64").toString("utf8")}async createOrUpdateRepositoryFile(a){return{commitSha:(await this.request(`/repos/${a.owner}/${a.repo}/contents/${a.path}`,{method:"PUT",body:{message:a.message,content:Buffer.from(a.content,"utf8").toString("base64"),branch:a.branch,...a.sha?{sha:a.sha}:{}}})).commit.sha}}async createGitRef(a,b,c,d){return this.request(`/repos/${a}/${b}/git/refs`,{method:"POST",body:{ref:`refs/heads/${c}`,sha:d}})}async createUserRepository(a){return this.request("/user/repos",{method:"POST",body:{name:a.name,description:a.description,private:a.private,auto_init:a.autoInit}})}async updateUserRepository(a){return this.request(`/repos/${a.owner}/${a.repo}`,{method:"PATCH",body:{description:a.description}})}async createGitBlob(a){return this.request(`/repos/${a.owner}/${a.repo}/git/blobs`,{method:"POST",body:{content:a.content.toString("base64"),encoding:"base64"}})}async createGitTree(a){return this.request(`/repos/${a.owner}/${a.repo}/git/trees`,{method:"POST",body:{...a.baseTree?{base_tree:a.baseTree}:{},tree:a.tree}})}async createGitCommit(a){return this.request(`/repos/${a.owner}/${a.repo}/git/commits`,{method:"POST",body:{message:a.message,tree:a.tree,parents:a.parents,...a.author?{author:a.author}:{},...a.committer?{committer:a.committer}:{}}})}async getGitCommit(a,b,c){return this.request(`/repos/${a}/${b}/git/commits/${c}`)}async getGitTree(a){let b=a.recursive?"?recursive=1":"";return this.request(`/repos/${a.owner}/${a.repo}/git/trees/${a.treeSha}${b}`)}async getGitRef(a,b,c){let d=c.startsWith("refs/heads/")?c.slice(11):c.startsWith("refs/")?c.slice(5):c;return this.request(`/repos/${a}/${b}/git/ref/heads/${encodeURIComponent(d)}`)}async updateGitRef(a){let b=a.ref.startsWith("refs/heads/")?a.ref.slice(11):a.ref.startsWith("refs/")?a.ref.slice(5):a.ref;return this.request(`/repos/${a.owner}/${a.repo}/git/refs/heads/${encodeURIComponent(b)}`,{method:"PATCH",body:{sha:a.sha,force:a.force??!1}})}async createRepositoryFromTemplate(a){return this.request(`/repos/${a.templateOwner}/${a.templateRepo}/generate`,{method:"POST",body:{owner:a.owner,name:a.name,description:a.description,private:a.private,include_all_branches:a.includeAllBranches??!1}})}async createPullRequest(a){return this.request(`/repos/${a.owner}/${a.repo}/pulls`,{method:"POST",body:{title:a.title,head:a.head,base:a.base,body:a.body}})}async listPullRequests(a,b,c={}){let d=new URLSearchParams;return d.set("state",c.state??"open"),c.base&&d.set("base",c.base),c.head&&d.set("head",c.head),d.set("sort",c.sort??"created"),d.set("direction",c.direction??"desc"),this.request(`/repos/${a}/${b}/pulls?${d.toString()}`)}}},74590:(a,b,c)=>{c.d(b,{A3:()=>q,Eb:()=>o,FR:()=>z,MA:()=>B,P4:()=>p,UL:()=>l,V9:()=>v,_i:()=>y,b1:()=>w,bM:()=>u,c9:()=>f,dQ:()=>t,dk:()=>m,iQ:()=>i,ln:()=>n,oN:()=>r,wH:()=>A,wI:()=>x});var d=c(75365);let e="https://api.vercel.com";class f extends Error{constructor(a){super(a.message),this.name="VercelEnvVarTypeError",this.key=a.key,this.existingType=a.existingType,this.status=a.status}}class g extends Error{constructor(a){super(a.message),this.name="VercelTeamBillingError",this.status=a.status,this.providerCode=a.providerCode}}let h=new Set(["LINEAR_WEBHOOK_SECRET","GITHUB_DISPATCH_TOKEN"]);function i(a){return h.has(a)?"sensitive":"plain"}function j(a){return/cannot change the key of a sensitive environment variable/i.test(a.body)?new f({key:a.key,existingType:a.existingType,status:a.status,message:`Vercel rejected updating ${a.key} because sensitive environment variables cannot have their key changed via API. The app did not delete or recreate it. Update the value manually in Vercel or approve a separate delete/recreate repair.`}):/cannot change the type of a sensitive environment variable/i.test(a.body)?new f({key:a.key,existingType:a.existingType,status:a.status,message:`Vercel rejected updating ${a.key} because it is a sensitive environment variable whose type cannot be changed. The app did not delete or recreate it. Update the value manually in Vercel or approve a separate delete/recreate repair.`}):null}async function k(a,b,c){let d=new URL(`${e}${b}`);c?.teamId&&d.searchParams.set("teamId",c.teamId);let f=await fetch(d,{...c,headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json",...c?.headers??{}}});if(!f.ok){let a=await f.text();throw Error(`Vercel API ${f.status} on ${b}: ${a.slice(0,200)}`)}if(204!==f.status)return await f.json()}async function l(a){return(await k(a,"/v2/user")).user}async function m(a){return((await k(a,"/v2/teams")).teams??[]).map(a=>({id:a.id,name:a.name,slug:a.slug}))}async function n(a,b){let c="/v1/teams",d=new URL(`${e}${c}`),f=await fetch(d,{method:"POST",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({slug:b.slug.trim(),...b.name?.trim()?{name:b.name.trim()}:{}})});if(!f.ok){let a=await f.text(),b=function(a){let b=a.body.match(/"code"\s*:\s*"(payment_method_required|billing|payment[^"]*)"/i),c=b?.[1];return"payment_method_required"===c||/payment method is required/i.test(a.body)||/credit card/i.test(a.body)?new g({status:a.status,providerCode:c??"payment_method_required",message:"Vercel requires a payment method before creating another team. No harness setup was applied. Add or update billing in Vercel, or choose an existing team."}):null}({status:f.status,body:a});if(b)throw b;throw Error(`Vercel API ${f.status} on ${c}: ${a.slice(0,200)}`)}let h=await f.json();return{id:h.id,slug:h.slug,name:h.name??b.name?.trim()??h.slug}}async function o(a,b){return((await k(a,"/v9/projects",{teamId:b})).projects??[]).map(a=>({id:a.id,name:a.name,accountId:a.accountId}))}async function p(a,b){let c=await k(a,"/v11/projects",{method:"POST",teamId:b.teamId,body:JSON.stringify({name:b.name.trim()})});return{id:c.id,name:c.name,accountId:c.accountId}}async function q(a,b,c){return((await k(a,`/v9/projects/${b}/env`,{teamId:c})).envs??[]).map(a=>({id:a.id,key:a.key,target:a.target??[],type:a.type??"encrypted"}))}function r(a){return"READY"===a.readyState||"READY"===a.state}function s(a){return a.replace(/^https?:\/\//,"").replace(/\/$/,"").toLowerCase()}async function t(a){let b,c=a.listDeployments??u,d=a.getDeployment??v;if(a.preferredDeploymentId?.trim()){if(!r(b=await d(a.vercelToken,a.preferredDeploymentId.trim(),a.teamId)))return}else{if(!(b=(await c(a.vercelToken,a.projectId,a.teamId,{state:"READY",limit:5})).find(a=>r(a))))return;b.aliases?.length||(b=await d(a.vercelToken,b.id,a.teamId))}let e=function(a){let b=s(a.deploymentUrl),c=(a.aliases??[]).map(a=>s(a)).filter(Boolean),d=c.filter(a=>a!==b&&!function(a){let b=s(a);return/^.+-[a-z0-9]{8,}-.+\.vercel\.app$/i.test(b)}(a));if(d.length>0){let a=d.find(a=>!a.endsWith(".vercel.app"))??[...d].sort((a,b)=>a.length-b.length)[0];return{host:a,source:"stable_alias",stableAlias:a}}let e=c.find(a=>a!==b);return e?{host:e,source:"stable_alias",stableAlias:e}:{host:b,source:"latest_ready_deployment"}}({deploymentUrl:b.url,aliases:b.aliases});return{productionUrl:`https://${e.host}`,webhookUrl:function(a){let b=a.replace(/^https?:\/\//,"").replace(/\/$/,"");return`https://${b}/api/linear-webhook`}(e.host),deploymentId:b.id,deploymentUrl:b.url,source:e.source,stableAlias:e.stableAlias,readyState:b.readyState,state:b.state}}async function u(a,b,c,d){let e=new URLSearchParams({projectId:b,target:"production",limit:String(d?.limit??5)});return d?.state?.trim()&&e.set("state",d.state.trim()),((await k(a,`/v6/deployments?${e.toString()}`,{teamId:c})).deployments??[]).map(a=>({id:a.uid,url:a.url,state:a.state,readyState:a.readyState,aliases:a.alias??[]}))}async function v(a,b,c){let d=await k(a,`/v13/deployments/${b}`,{teamId:c});return{id:d.uid??d.id??b,url:d.url,state:d.state,readyState:d.readyState,aliases:d.alias??[]}}async function w(a,b){let c=await k(a,"/v13/deployments",{method:"POST",teamId:b.teamId,body:JSON.stringify({name:b.projectName.trim(),deploymentId:b.sourceDeploymentId,target:"production"})});return{id:c.uid??c.id??b.sourceDeploymentId,url:c.url,state:c.state,readyState:c.readyState}}async function x(a,b){let c=b.existingEnv?.id??b.existingEnvId,d=b.existingEnv?.type,f=i(b.key);if(c){var g;let f=`/v9/projects/${b.projectId}/env/${c}`,h=new URL(`${e}${f}`);b.teamId&&h.searchParams.set("teamId",b.teamId);let i=await fetch(h,{method:"PATCH",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({value:(g={value:b.value,existingEnv:b.existingEnv}).value,target:g.existingEnv?.target?.length?g.existingEnv.target:["production"]})});if(!i.ok){let a=await i.text(),c=j({key:b.key,existingType:d??"encrypted",status:i.status,body:a});if(c)throw c;throw Error(`Vercel API ${i.status} on ${f}: ${a.slice(0,200)}`)}return}let h=`/v10/projects/${b.projectId}/env`,k=new URL(`${e}${h}`);b.teamId&&k.searchParams.set("teamId",b.teamId);let l=await fetch(k,{method:"POST",headers:{Authorization:`Bearer ${a.trim()}`,"Content-Type":"application/json"},body:JSON.stringify({key:b.key,value:b.value,type:f,target:["production"]})});if(!l.ok){let a=await l.text(),c=j({key:b.key,existingType:f,status:l.status,body:a});if(c)throw c;throw Error(`Vercel API ${l.status} on ${h}: ${a.slice(0,200)}`)}}async function y(a){try{let b=await fetch(a,{method:"GET",redirect:"manual"}),c=b.headers.get("location")??"";if((302===b.status||307===b.status||308===b.status)&&/vercel\.com\/sso-api/i.test(c))return{reachable:!1,statusCode:b.status,reason:"protection_redirect"};if(405===b.status)return{reachable:!0,statusCode:b.status};if(404===b.status||401===b.status||403===b.status||b.status>=500)return{reachable:!1,statusCode:b.status};if(b.status>=200&&b.status<400)return{reachable:!0,statusCode:b.status};return{reachable:!1,statusCode:b.status}}catch{return{reachable:!1}}}function z(a){let b=new Set(a.map(a=>a.key));return Object.fromEntries(d.P$.map(a=>[a,b.has(a)?"present":"missing"]))}function A(a,b){let c=b.trim().toLowerCase();return a.find(a=>a.slug.toLowerCase()===c)}function B(a,b){let c=b.trim().toLowerCase();return a.find(a=>a.name.toLowerCase()===c)}},75365:(a,b,c)=>{c.d(b,{P$:()=>d,ck:()=>e,s5:()=>g,vC:()=>f});let d=["LINEAR_WEBHOOK_SECRET","GITHUB_DISPATCH_TOKEN","HARNESS_TEAM_KEY"],e=["GITHUB_DISPATCH_REPOSITORY","GITHUB_DISPATCH_EVENT_TYPE","LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_MS"],f={GITHUB_DISPATCH_REPOSITORY:"weston-uribe/agentic-product-development-harness",GITHUB_DISPATCH_EVENT_TYPE:"linear_issue_status_changed",LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_MS:"60000"};function g(a){let b={LINEAR_WEBHOOK_SECRET:a.requiredEnvPresence?.LINEAR_WEBHOOK_SECRET??"missing",GITHUB_DISPATCH_TOKEN:a.requiredEnvPresence?.GITHUB_DISPATCH_TOKEN??"missing",HARNESS_TEAM_KEY:a.requiredEnvPresence?.HARNESS_TEAM_KEY??"missing"},c=[];for(let[d,e]of(a.projectId||c.push("Select the Vercel bridge project."),a.productionUrl||c.push("Resolve the Vercel production URL for the bridge project."),a.endpointReachable||c.push("Verify /api/linear-webhook is reachable on the production URL."),Object.entries(b)))"missing"===e&&c.push(`Vercel production env var ${d} is missing.`);a.linearWebhookVerified||c.push("Verify the Linear Issue webhook points at the Vercel bridge URL."),a.signedProbeVerified||c.push("Signed webhook delivery verification has not passed against production."),a.deploymentRedeployRequired&&c.push("Redeploy Vercel production after env var changes, then retry signed verification.");let d=0===c.length&&!!a.projectId&&!!a.productionUrl&&!!a.endpointReachable&&!0===a.linearWebhookVerified&&!0===a.signedProbeVerified&&!0!==a.deploymentRedeployRequired;return{projectSelected:!!a.projectId,productionUrl:a.productionUrl,webhookUrl:a.webhookUrl,endpointReachable:!!a.endpointReachable,requiredEnvPresence:b,linearWebhookVerified:!!a.linearWebhookVerified,signedProbeVerified:!!a.signedProbeVerified,deploymentRedeployRequired:!!a.deploymentRedeployRequired,manualComplete:!!a.manualComplete,ready:d,blockers:c}}},83954:(a,b,c)=>{c.d(b,{Re:()=>i,Vq:()=>h});var d=c(73024),e=c(76760),f=c.n(e);c(73136);var g=c(58885);function h(a=process.cwd()){let b=process.env.HARNESS_REPO_ROOT?.trim();if(b)return f().resolve(b);let c=process.env.P_DEV_HOME?.trim();if(c)return f().resolve(c);let e=f().resolve(a);for(;;){let a=f().join(e,"package.json");if((0,d.existsSync)(a))try{let b=(0,d.readFileSync)(a,"utf8");if("agentic-product-development-harness"===JSON.parse(b).name)return e}catch{}let b=f().dirname(e);if(b===e)break;e=b}throw Error(`Could not resolve harness repo root from ${a}. Set HARNESS_REPO_ROOT or run harness:gui from the repo.`)}function i(a){(0,g.N)(a);let b=process.env.HARNESS_CONFIG_PATH?.trim();b&&!f().isAbsolute(b)&&(process.env.HARNESS_CONFIG_PATH=f().resolve(a,b))}},84998:(a,b,c)=>{c.d(b,{bm:()=>i,gr:()=>f,it:()=>j,ym:()=>k});var d=c(76760),e=c.n(d);let f=".env.local",g=".harness",h=e().join(g,"config.example.json"),i=e().join(g,"config.local.json"),j=".harness/config.local.json";function k(a){let b=a??process.cwd();return{cwd:b,envExample:e().join(b,".env.example"),envLocal:e().join(b,f),harnessDir:e().join(b,g),configExample:e().join(b,h),configLocal:e().join(b,i)}}},87285:(a,b,c)=>{c.d(b,{HF:()=>n,Hn:()=>k,Ol:()=>p,Um:()=>i,W:()=>o,X_:()=>r,_b:()=>l,ed:()=>j,lL:()=>q});var d=c(51455),e=c(57362),f=c(84998);let g=["HARNESS_CONFIG_PATH","GITHUB_DISPATCH_REPOSITORY","GITHUB_DISPATCH_REPOSITORY_ID","LINEAR_API_KEY","CURSOR_API_KEY","GITHUB_TOKEN","VERCEL_TOKEN"];async function h(a){try{return await (0,d.access)(a),!0}catch{return!1}}function i(a){let b={},c={HARNESS_CONFIG_PATH:!1,GITHUB_DISPATCH_REPOSITORY:!1,GITHUB_DISPATCH_REPOSITORY_ID:!1,LINEAR_API_KEY:!1,CURSOR_API_KEY:!1,GITHUB_TOKEN:!1,VERCEL_TOKEN:!1};for(let d of a.split("\n")){let a=d.trim();if(!a||a.startsWith("#"))continue;let e=a.indexOf("=");if(-1===e)continue;let f=a.slice(0,e).trim(),g=a.slice(e+1).trim();f in c?(b[f]=g,g.length>0&&(c[f]=!0)):"LINEAR_WEBHOOK_SECRET"===f&&(b[f]=g)}return{values:b,presence:c}}async function j(a){return await h(a.envLocal)?(0,d.readFile)(a.envLocal,"utf8"):null}async function k(a){let b=await j(a);return null===b?null:i(b)}function l(a,b){let c={harnessConfigPath:b.harnessConfigPath?.trim()||a?.values.HARNESS_CONFIG_PATH||f.it,githubDispatchRepository:b.githubDispatchRepository?.trim()||a?.values.GITHUB_DISPATCH_REPOSITORY||void 0,githubDispatchRepositoryId:b.githubDispatchRepositoryId?.trim()||a?.values.GITHUB_DISPATCH_REPOSITORY_ID||void 0};for(let[d,e]of Object.entries({linearApiKey:"LINEAR_API_KEY",cursorApiKey:"CURSOR_API_KEY",githubToken:"GITHUB_TOKEN",vercelToken:"VERCEL_TOKEN"})){let f=b[d]?.trim();f?c[d]=f:a?.values[e]&&(c[d]=a.values[e])}return c}function m(a){return{HARNESS_CONFIG_PATH:a.harnessConfigPath??f.it,GITHUB_DISPATCH_REPOSITORY:a.githubDispatchRepository??"",GITHUB_DISPATCH_REPOSITORY_ID:a.githubDispatchRepositoryId??"",LINEAR_API_KEY:a.linearApiKey??"",CURSOR_API_KEY:a.cursorApiKey??"",GITHUB_TOKEN:a.githubToken??"",VERCEL_TOKEN:a.vercelToken??""}}function n(a,b){if(null===a){let a=m(b);return`# Operator local setup — generated by harness setup core
6
6
  # Do not commit .env.local (gitignored).
7
7
 
8
8
  # --- Harness managed keys ---