openplanr 3.2.0 → 3.4.0

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 (411) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/cli/commands/artifact-design-share.d.ts +9 -0
  3. package/dist/cli/commands/artifact-design-share.d.ts.map +1 -0
  4. package/dist/cli/commands/artifact-design-share.js +200 -0
  5. package/dist/cli/commands/artifact-design-share.js.map +1 -0
  6. package/dist/cli/commands/artifact.d.ts.map +1 -1
  7. package/dist/cli/commands/artifact.js +5 -18
  8. package/dist/cli/commands/artifact.js.map +1 -1
  9. package/dist/cli/commands/ship.d.ts.map +1 -1
  10. package/dist/cli/commands/ship.js +2 -0
  11. package/dist/cli/commands/ship.js.map +1 -1
  12. package/dist/cli/commands/spec.d.ts +2 -1
  13. package/dist/cli/commands/spec.d.ts.map +1 -1
  14. package/dist/cli/commands/spec.js +45 -5
  15. package/dist/cli/commands/spec.js.map +1 -1
  16. package/dist/dashboard/.vite/manifest.json +2 -2
  17. package/dist/dashboard/assets/index-Cv4Vwhuw.css +2 -0
  18. package/dist/dashboard/assets/index-CvQAlBy3.js +75 -0
  19. package/dist/dashboard/assets/index-CvQAlBy3.js.map +1 -0
  20. package/dist/dashboard/dashboard-manifest.json +14 -14
  21. package/dist/dashboard/index.html +2 -2
  22. package/dist/services/claude-plugin-service.d.ts +5 -0
  23. package/dist/services/claude-plugin-service.d.ts.map +1 -1
  24. package/dist/services/claude-plugin-service.js +18 -2
  25. package/dist/services/claude-plugin-service.js.map +1 -1
  26. package/dist/services/codex-plugin-service.d.ts.map +1 -1
  27. package/dist/services/codex-plugin-service.js +11 -3
  28. package/dist/services/codex-plugin-service.js.map +1 -1
  29. package/dist/services/design-artifact-service.d.ts +20 -1
  30. package/dist/services/design-artifact-service.d.ts.map +1 -1
  31. package/dist/services/design-artifact-service.js +137 -18
  32. package/dist/services/design-artifact-service.js.map +1 -1
  33. package/dist/services/runtime-manager/codex-discovery.d.ts +1 -3
  34. package/dist/services/runtime-manager/codex-discovery.d.ts.map +1 -1
  35. package/dist/services/runtime-manager/codex-discovery.js +3 -16
  36. package/dist/services/runtime-manager/codex-discovery.js.map +1 -1
  37. package/dist/services/runtime-manager/doctor.d.ts +25 -0
  38. package/dist/services/runtime-manager/doctor.d.ts.map +1 -1
  39. package/dist/services/runtime-manager/doctor.js +480 -0
  40. package/dist/services/runtime-manager/doctor.js.map +1 -1
  41. package/dist/services/runtime-manager/errors.d.ts +12 -0
  42. package/dist/services/runtime-manager/errors.d.ts.map +1 -0
  43. package/dist/services/runtime-manager/errors.js +14 -0
  44. package/dist/services/runtime-manager/errors.js.map +1 -0
  45. package/dist/services/runtime-manager/global-state.d.ts +7 -0
  46. package/dist/services/runtime-manager/global-state.d.ts.map +1 -1
  47. package/dist/services/runtime-manager/global-state.js +116 -0
  48. package/dist/services/runtime-manager/global-state.js.map +1 -1
  49. package/dist/services/runtime-manager/host-version-probe.d.ts +8 -0
  50. package/dist/services/runtime-manager/host-version-probe.d.ts.map +1 -0
  51. package/dist/services/runtime-manager/host-version-probe.js +14 -0
  52. package/dist/services/runtime-manager/host-version-probe.js.map +1 -0
  53. package/dist/services/runtime-manager/install-plan.d.ts +25 -0
  54. package/dist/services/runtime-manager/install-plan.d.ts.map +1 -1
  55. package/dist/services/runtime-manager/install-plan.js +305 -0
  56. package/dist/services/runtime-manager/install-plan.js.map +1 -1
  57. package/dist/services/runtime-manager/inventory.d.ts +6 -0
  58. package/dist/services/runtime-manager/inventory.d.ts.map +1 -1
  59. package/dist/services/runtime-manager/inventory.js +16 -1
  60. package/dist/services/runtime-manager/inventory.js.map +1 -1
  61. package/dist/services/runtime-manager/legacy-adapters.d.ts +9 -0
  62. package/dist/services/runtime-manager/legacy-adapters.d.ts.map +1 -0
  63. package/dist/services/runtime-manager/legacy-adapters.js +187 -0
  64. package/dist/services/runtime-manager/legacy-adapters.js.map +1 -0
  65. package/dist/services/runtime-manager/paths.d.ts +18 -0
  66. package/dist/services/runtime-manager/paths.d.ts.map +1 -0
  67. package/dist/services/runtime-manager/paths.js +83 -0
  68. package/dist/services/runtime-manager/paths.js.map +1 -0
  69. package/dist/services/runtime-manager/runtime-package.d.ts +21 -0
  70. package/dist/services/runtime-manager/runtime-package.d.ts.map +1 -1
  71. package/dist/services/runtime-manager/runtime-package.js +77 -0
  72. package/dist/services/runtime-manager/runtime-package.js.map +1 -1
  73. package/dist/services/runtime-manager/storage.d.ts +47 -0
  74. package/dist/services/runtime-manager/storage.d.ts.map +1 -0
  75. package/dist/services/runtime-manager/storage.js +604 -0
  76. package/dist/services/runtime-manager/storage.js.map +1 -0
  77. package/dist/services/runtime-manager-service.d.ts +7 -17
  78. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  79. package/dist/services/runtime-manager-service.js +32 -1695
  80. package/dist/services/runtime-manager-service.js.map +1 -1
  81. package/dist/services/ship-checks/contract.d.ts +15 -1
  82. package/dist/services/ship-checks/contract.d.ts.map +1 -1
  83. package/dist/services/ship-checks/contract.js +1 -1
  84. package/dist/services/ship-checks/contract.js.map +1 -1
  85. package/dist/services/ship-checks/coverage.d.ts +4 -0
  86. package/dist/services/ship-checks/coverage.d.ts.map +1 -0
  87. package/dist/services/ship-checks/coverage.js +113 -0
  88. package/dist/services/ship-checks/coverage.js.map +1 -0
  89. package/dist/services/ship-checks/discover.d.ts.map +1 -1
  90. package/dist/services/ship-checks/discover.js +5 -1
  91. package/dist/services/ship-checks/discover.js.map +1 -1
  92. package/dist/services/ship-checks/package-contents.d.ts +4 -0
  93. package/dist/services/ship-checks/package-contents.d.ts.map +1 -0
  94. package/dist/services/ship-checks/package-contents.js +91 -0
  95. package/dist/services/ship-checks/package-contents.js.map +1 -0
  96. package/dist/services/ship-checks/packages.d.ts +2 -0
  97. package/dist/services/ship-checks/packages.d.ts.map +1 -1
  98. package/dist/services/ship-checks/packages.js +4 -0
  99. package/dist/services/ship-checks/packages.js.map +1 -1
  100. package/dist/services/ship-checks/scope.js +2 -1
  101. package/dist/services/ship-checks/scope.js.map +1 -1
  102. package/dist/services/spec-service.d.ts +18 -0
  103. package/dist/services/spec-service.d.ts.map +1 -1
  104. package/dist/services/spec-service.js +174 -9
  105. package/dist/services/spec-service.js.map +1 -1
  106. package/dist/templates/spec/spec-shaped.md.hbs +1 -1
  107. package/dist/templates/spec/spec.md.hbs +2 -2
  108. package/dist/utils/splice-managed-block.js +1 -1
  109. package/dist/utils/splice-managed-block.js.map +1 -1
  110. package/docs/CLI.md +86 -2
  111. package/lib/host-packages/adapter-registry.json +5 -5
  112. package/lib/host-packages/capability-map.json +3 -3
  113. package/lib/host-packages/claude/.claude-plugin/marketplace.json +3 -3
  114. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +6 -6
  115. package/lib/host-packages/claude/openplanr/.openplanr-content.json +94 -146
  116. package/lib/host-packages/claude/openplanr/README.md +12 -12
  117. package/lib/host-packages/claude/openplanr/agents/planr-qa.md +5 -3
  118. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/task-context-resolution.md +4 -4
  119. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-artifact-shell.mjs +2 -4
  120. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-document.mjs +110 -25
  121. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +851 -57
  122. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review-state-store.mjs +45 -0
  123. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +65 -74
  124. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -1
  125. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share-cli-bridge.mjs +321 -0
  126. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-d707e49b.mjs +1652 -0
  127. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs → claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-9f6918b0.mjs} +537 -5
  128. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-design-support-0bac378d.mjs +137 -0
  129. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design.mjs +374 -61
  130. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -59
  131. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +138 -133
  132. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +1 -5608
  133. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-artifact-review-ui.js +2568 -0
  134. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +10 -74
  135. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  136. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +8 -2
  137. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +2 -2
  138. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +5 -5
  139. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +72 -2
  140. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +14 -7
  141. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +71 -34
  142. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +28 -14
  143. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +12 -12
  144. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  145. package/lib/host-packages/{openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.20.0 → claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0}/design-document.schema.json +131 -4
  146. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
  147. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +616 -4775
  148. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +219 -424
  149. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  150. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +2 -1
  151. package/lib/host-packages/claude/openplanr/skills/delegate/references/integration-review.md +26 -20
  152. package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +25 -1
  153. package/lib/host-packages/claude/openplanr/skills/delegate/references/run-handoff.md +2 -2
  154. package/lib/host-packages/claude/openplanr/skills/delegate/references/worktree-custody.md +17 -9
  155. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +15 -3
  156. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/codex.mjs +38 -2
  157. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +5 -0
  158. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/custody.mjs +217 -10
  159. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/handoff.mjs +1080 -0
  160. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integrate.mjs +96 -201
  161. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integration-files.mjs +3 -382
  162. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +29 -12
  163. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +11 -0
  164. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-execution.mjs +1 -1
  165. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-lifecycle.mjs +14 -10
  166. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +4 -0
  167. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -2
  168. package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +17 -2
  169. package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +60 -2
  170. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +23 -7
  171. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +131 -4
  172. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +17 -2
  173. package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +60 -2
  174. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +23 -7
  175. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +131 -4
  176. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +17 -2
  177. package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +60 -2
  178. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +23 -7
  179. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +131 -4
  180. package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +2 -1
  181. package/lib/host-packages/claude/openplanr/skills/investigate/references/fail-first.md +40 -0
  182. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +21 -11
  183. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +131 -4
  184. package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +51 -18
  185. package/lib/host-packages/claude/openplanr/skills/ship/references/fail-first.md +40 -0
  186. package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +7 -3
  187. package/lib/host-packages/claude/openplanr/skills/spec/SKILL.md +6 -0
  188. package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +3 -1
  189. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +91 -143
  190. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  191. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/integration-review.md +26 -20
  192. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +25 -1
  193. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/run-handoff.md +2 -2
  194. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/worktree-custody.md +17 -9
  195. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +15 -3
  196. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/codex.mjs +38 -2
  197. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +5 -0
  198. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/custody.mjs +217 -10
  199. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/handoff.mjs +1080 -0
  200. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integrate.mjs +96 -201
  201. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integration-files.mjs +3 -382
  202. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +29 -12
  203. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +11 -0
  204. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-execution.mjs +1 -1
  205. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-lifecycle.mjs +14 -10
  206. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +4 -0
  207. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -2
  208. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +2 -1
  209. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +17 -2
  210. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +60 -2
  211. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +23 -7
  212. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +131 -4
  213. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +17 -2
  214. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +60 -2
  215. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +23 -7
  216. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +131 -4
  217. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +17 -2
  218. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +60 -2
  219. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +23 -7
  220. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +131 -4
  221. package/lib/host-packages/cursor/openplanr/rules/planr-investigate/references/fail-first.md +40 -0
  222. package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +2 -1
  223. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +131 -4
  224. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +21 -11
  225. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/fail-first.md +40 -0
  226. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +7 -3
  227. package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +51 -18
  228. package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +3 -1
  229. package/lib/host-packages/cursor/openplanr/rules/planr-spec.mdc +6 -0
  230. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-artifact-shell.mjs +2 -4
  231. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-document.mjs +110 -25
  232. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +851 -57
  233. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review-state-store.mjs +45 -0
  234. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +65 -74
  235. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -1
  236. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share-cli-bridge.mjs +321 -0
  237. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-d707e49b.mjs +1652 -0
  238. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/{design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs → design-shared-artifact-support-protocol-contracts-9f6918b0.mjs} +537 -5
  239. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-design-support-0bac378d.mjs +137 -0
  240. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design.mjs +374 -61
  241. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -59
  242. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +138 -133
  243. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +1 -5608
  244. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-artifact-review-ui.js +2568 -0
  245. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +10 -74
  246. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  247. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +8 -2
  248. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +2 -2
  249. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +5 -5
  250. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +72 -2
  251. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +14 -7
  252. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +71 -34
  253. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +28 -14
  254. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +12 -12
  255. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  256. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/{v1.20.0 → v1.22.0}/design-document.schema.json +131 -4
  257. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
  258. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +616 -4775
  259. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +219 -424
  260. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  261. package/lib/host-packages/openai/.claude-plugin/marketplace.json +3 -3
  262. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +2 -2
  263. package/lib/host-packages/openai/openplanr/.openplanr-content.json +98 -150
  264. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-artifact-shell.mjs +2 -4
  265. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-document.mjs +110 -25
  266. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +851 -57
  267. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review-state-store.mjs +45 -0
  268. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +65 -74
  269. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-home.mjs +0 -1
  270. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share-cli-bridge.mjs +321 -0
  271. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-d707e49b.mjs +1652 -0
  272. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs → openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-9f6918b0.mjs} +537 -5
  273. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-design-support-0bac378d.mjs +137 -0
  274. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design.mjs +374 -61
  275. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -59
  276. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +138 -133
  277. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +1 -5608
  278. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-artifact-review-ui.js +2568 -0
  279. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +10 -74
  280. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  281. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +8 -2
  282. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +2 -2
  283. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +5 -5
  284. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +72 -2
  285. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +14 -7
  286. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +71 -34
  287. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +28 -14
  288. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +12 -12
  289. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  290. package/lib/host-packages/{claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.20.0 → openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0}/design-document.schema.json +131 -4
  291. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
  292. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +616 -4775
  293. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +219 -424
  294. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  295. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +2 -1
  296. package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +1 -1
  297. package/lib/host-packages/openai/openplanr/skills/delegate/references/integration-review.md +26 -20
  298. package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +25 -1
  299. package/lib/host-packages/openai/openplanr/skills/delegate/references/run-handoff.md +2 -2
  300. package/lib/host-packages/openai/openplanr/skills/delegate/references/worktree-custody.md +17 -9
  301. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +15 -3
  302. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/codex.mjs +38 -2
  303. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +5 -0
  304. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/custody.mjs +217 -10
  305. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/handoff.mjs +1080 -0
  306. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integrate.mjs +96 -201
  307. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integration-files.mjs +3 -382
  308. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +29 -12
  309. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +11 -0
  310. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-execution.mjs +1 -1
  311. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-lifecycle.mjs +14 -10
  312. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +4 -0
  313. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -2
  314. package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +17 -2
  315. package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +60 -2
  316. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +23 -7
  317. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +131 -4
  318. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +17 -2
  319. package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +60 -2
  320. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +23 -7
  321. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +131 -4
  322. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +17 -2
  323. package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +60 -2
  324. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +23 -7
  325. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +131 -4
  326. package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +2 -1
  327. package/lib/host-packages/openai/openplanr/skills/investigate/agents/openai.yaml +1 -1
  328. package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +12 -1
  329. package/lib/host-packages/openai/openplanr/skills/investigate/references/fail-first.md +40 -0
  330. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +21 -11
  331. package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +1 -1
  332. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +131 -4
  333. package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +51 -18
  334. package/lib/host-packages/openai/openplanr/skills/ship/agents/openai.yaml +1 -1
  335. package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +12 -1
  336. package/lib/host-packages/openai/openplanr/skills/ship/references/fail-first.md +40 -0
  337. package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +7 -3
  338. package/lib/host-packages/openai/openplanr/skills/spec/SKILL.md +6 -0
  339. package/lib/host-packages/openai/openplanr/skills/spec/openplanr.skill.json +1 -1
  340. package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +3 -1
  341. package/lib/json-schema.mjs +4 -0
  342. package/package.json +16 -16
  343. package/dist/dashboard/assets/index-BU5fzjyz.css +0 -1
  344. package/dist/dashboard/assets/index-L8qtwqv6.js +0 -572
  345. package/dist/dashboard/assets/index-L8qtwqv6.js.map +0 -1
  346. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  347. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  348. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  349. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  350. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  351. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs +0 -24
  352. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  353. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1020
  354. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  355. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5778
  356. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  357. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  358. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  359. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  360. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  361. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  362. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  363. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  364. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  365. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  366. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  367. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/integration-transaction.mjs +0 -958
  368. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/integration-transaction.mjs +0 -958
  369. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  370. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  371. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  372. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  373. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  374. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs +0 -24
  375. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  376. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1020
  377. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  378. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5778
  379. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  380. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  381. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  382. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  383. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  384. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  385. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  386. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  387. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  388. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  389. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  390. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +0 -555
  391. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-compression.mjs +0 -4180
  392. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-encrypted-workspace-client.mjs +0 -647
  393. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-owner-custody.mjs +0 -129
  394. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-resource-pack.mjs +0 -698
  395. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-runtime-support-6774fd3d5d02.mjs +0 -24
  396. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +0 -1993
  397. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +0 -1020
  398. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-75a938cc.mjs +0 -222
  399. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs +0 -5778
  400. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-upload-spool.mjs +0 -198
  401. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/04-compression.js +0 -4175
  402. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/05-artifact-sharing.js +0 -65
  403. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +0 -1755
  404. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/07-artifact-sharing.js +0 -62
  405. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +0 -2633
  406. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +0 -49
  407. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +0 -108
  408. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +0 -170
  409. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +0 -97
  410. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +0 -56
  411. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/integration-transaction.mjs +0 -958
@@ -1,8 +1,3 @@
1
- import {
2
- LARGE_OBJECT_LIMITS,
3
- validateJson
4
- } from "./design-shared-protocol-contracts-b5f28f94.mjs";
5
-
6
1
  // packages/protocol/src/errors.mjs
7
2
  var ARTIFACT_ERROR_CODES = Object.freeze({
8
3
  INPUT_INVALID: "E_ARTIFACT_INPUT_INVALID",
@@ -116,11 +111,547 @@ function resolveArtifactHtml(envelope, artifactOrId) {
116
111
  // packages/artifact/lib/artifact/envelope.mjs
117
112
  import { createHash } from "node:crypto";
118
113
 
114
+ // packages/protocol/src/large-object-limits.mjs
115
+ var LARGE_OBJECT_LIMITS = Object.freeze({
116
+ uniqueHtmlBytes: 100 * 1024 * 1024,
117
+ decodedBytes: 128 * 1024 * 1024,
118
+ catalogBytes: 8 * 1024 * 1024,
119
+ manifestBytes: 64 * 1024,
120
+ chunkBytes: 1024 * 1024,
121
+ chunkPlaintextBytes: 1024 * 1024 - 16,
122
+ chunks: 129,
123
+ ciphertextBytes: 128 * 1024 * 1024 + 129 * 16,
124
+ sources: 256,
125
+ views: 4096,
126
+ resources: 1024,
127
+ eventBytes: 256 * 1024,
128
+ eventPageBytes: 1024 * 1024,
129
+ eventPageCount: 100
130
+ });
131
+
119
132
  // packages/artifact/lib/artifact/internal/schema-loader.mjs
120
133
  import { fileURLToPath as __planrAssetFile } from "node:url";
121
134
  import { readFileSync } from "node:fs";
122
135
  import { createRequire } from "node:module";
123
136
  import { dirname, join } from "node:path";
137
+
138
+ // packages/protocol/src/json-schema.mjs
139
+ var typeOf = (v) => {
140
+ if (v === null) return "null";
141
+ if (Array.isArray(v)) return "array";
142
+ if (Number.isInteger(v)) return "integer";
143
+ if (typeof v === "number") return "number";
144
+ return typeof v;
145
+ };
146
+ var matchesType = (v, t) => {
147
+ if (t === "integer") return Number.isInteger(v);
148
+ if (t === "number") return typeof v === "number";
149
+ if (t === "string") return typeof v === "string";
150
+ if (t === "boolean") return typeof v === "boolean";
151
+ if (t === "null") return v === null;
152
+ if (t === "array") return Array.isArray(v);
153
+ if (t === "object") return v !== null && typeof v === "object" && !Array.isArray(v);
154
+ return false;
155
+ };
156
+ var FORMAT_DATE = /^\d{4}-\d{2}-\d{2}$/;
157
+ var FORMAT_DATETIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
158
+ var SUPPORTED_FORMATS = /* @__PURE__ */ new Set(["date", "date-time"]);
159
+ var ANNOTATION_KEYWORDS = [
160
+ "$schema",
161
+ "$id",
162
+ "$defs",
163
+ "$comment",
164
+ "title",
165
+ "description",
166
+ "default",
167
+ "examples",
168
+ "deprecated",
169
+ "readOnly",
170
+ "writeOnly"
171
+ ];
172
+ var VALIDATION_KEYWORDS = [
173
+ "$ref",
174
+ "type",
175
+ "const",
176
+ "enum",
177
+ "minLength",
178
+ "maxLength",
179
+ "pattern",
180
+ "format",
181
+ "minimum",
182
+ "maximum",
183
+ "exclusiveMinimum",
184
+ "minItems",
185
+ "maxItems",
186
+ "prefixItems",
187
+ "items",
188
+ "uniqueItems",
189
+ "contains",
190
+ "minContains",
191
+ "maxContains",
192
+ "required",
193
+ "properties",
194
+ "propertyNames",
195
+ "additionalProperties",
196
+ "maxProperties",
197
+ "dependentRequired",
198
+ "unevaluatedProperties",
199
+ "oneOf",
200
+ "anyOf",
201
+ "allOf",
202
+ "if",
203
+ "then",
204
+ "else",
205
+ "not"
206
+ ];
207
+ var KNOWN_KEYWORDS = /* @__PURE__ */ new Set([...ANNOTATION_KEYWORDS, ...VALIDATION_KEYWORDS]);
208
+ var TYPE_NAMES = /* @__PURE__ */ new Set(["array", "boolean", "integer", "null", "number", "object", "string"]);
209
+ var isSchema = (value) => typeof value === "boolean" || value !== null && typeof value === "object" && !Array.isArray(value);
210
+ var isPlainObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
211
+ var isCount = (value) => Number.isSafeInteger(value) && value >= 0;
212
+ var isUniqueStrings = (value) => Array.isArray(value) && value.every((item) => typeof item === "string") && new Set(value).size === value.length;
213
+ var isSchemaArray = (value) => Array.isArray(value) && value.length > 0 && value.every(isSchema);
214
+ var isSchemaMap = (value) => isPlainObject(value) && Object.values(value).every(isSchema);
215
+ var compiledPatterns = /* @__PURE__ */ new Map();
216
+ var MAX_COMPILED_PATTERNS = 1024;
217
+ var tryCompilePattern = (source) => {
218
+ try {
219
+ return new RegExp(source);
220
+ } catch (error) {
221
+ if (error instanceof SyntaxError) return null;
222
+ throw error;
223
+ }
224
+ };
225
+ var compilePattern = (source) => {
226
+ if (!compiledPatterns.has(source)) {
227
+ if (compiledPatterns.size >= MAX_COMPILED_PATTERNS) compiledPatterns.clear();
228
+ compiledPatterns.set(source, tryCompilePattern(source));
229
+ }
230
+ return compiledPatterns.get(source) ?? null;
231
+ };
232
+ var describeValue = (value) => {
233
+ const text = String(JSON.stringify(value));
234
+ return text.length > 80 ? `${text.slice(0, 77)}...` : text;
235
+ };
236
+ var KEYWORD_SHAPES = {
237
+ $ref: ["a string", (value) => typeof value === "string"],
238
+ $defs: ["an object of schemas", isSchemaMap],
239
+ type: [
240
+ "a type name or a non-empty array of unique type names",
241
+ (value) => typeof value === "string" && TYPE_NAMES.has(value) || isUniqueStrings(value) && value.length > 0 && value.every((name) => TYPE_NAMES.has(name))
242
+ ],
243
+ enum: ["an array", Array.isArray],
244
+ minLength: ["a non-negative integer", isCount],
245
+ maxLength: ["a non-negative integer", isCount],
246
+ pattern: [
247
+ "a valid regular expression string",
248
+ (value) => typeof value === "string" && compilePattern(value) !== null
249
+ ],
250
+ minimum: ["a finite number", Number.isFinite],
251
+ maximum: ["a finite number", Number.isFinite],
252
+ exclusiveMinimum: ["a finite number", Number.isFinite],
253
+ minItems: ["a non-negative integer", isCount],
254
+ maxItems: ["a non-negative integer", isCount],
255
+ prefixItems: ["a non-empty array of schemas", isSchemaArray],
256
+ items: ["a schema", isSchema],
257
+ uniqueItems: ["a boolean", (value) => typeof value === "boolean"],
258
+ contains: ["a schema", isSchema],
259
+ minContains: ["a non-negative integer", isCount],
260
+ maxContains: ["a non-negative integer", isCount],
261
+ required: ["an array of unique strings", isUniqueStrings],
262
+ properties: ["an object of schemas", isSchemaMap],
263
+ propertyNames: ["a schema", isSchema],
264
+ additionalProperties: ["a schema", isSchema],
265
+ maxProperties: ["a non-negative integer", isCount],
266
+ dependentRequired: [
267
+ "an object of unique string arrays",
268
+ (value) => isPlainObject(value) && Object.values(value).every(isUniqueStrings)
269
+ ],
270
+ unevaluatedProperties: ["a schema", isSchema],
271
+ oneOf: ["a non-empty array of schemas", isSchemaArray],
272
+ anyOf: ["a non-empty array of schemas", isSchemaArray],
273
+ allOf: ["a non-empty array of schemas", isSchemaArray],
274
+ if: ["a schema", isSchema],
275
+ then: ["a schema", isSchema],
276
+ else: ["a schema", isSchema],
277
+ not: ["a schema", isSchema]
278
+ };
279
+ function resolveJsonPointer(root, reference) {
280
+ if (reference === "#") return root;
281
+ if (!reference.startsWith("#/")) return null;
282
+ return reference.slice(2).split("/").map((part) => part.replaceAll("~1", "/").replaceAll("~0", "~")).reduce((value, part) => value?.[part], root);
283
+ }
284
+ var wellFormedSchemas = /* @__PURE__ */ new WeakSet();
285
+ var isFrozenNode = (schema) => Object.isFrozen(schema) && Object.values(schema).every(Object.isFrozen) && (!isPlainObject(schema.dependentRequired) || Object.values(schema.dependentRequired).every(Object.isFrozen));
286
+ var checkSchemaNode = (schema, path, context) => {
287
+ if (wellFormedSchemas.has(schema) || context.checkedSchemas.has(schema)) return;
288
+ context.checkedSchemas.add(schema);
289
+ const errorCount = context.schemaErrors.length;
290
+ for (const keyword of Object.keys(schema)) {
291
+ if (!KNOWN_KEYWORDS.has(keyword) && !keyword.startsWith("x-")) {
292
+ context.schemaErrors.push({
293
+ path,
294
+ rule: "unsupported-keyword",
295
+ detail: `schema keyword '${keyword}' is not supported by this validator`
296
+ });
297
+ }
298
+ }
299
+ if (Object.hasOwn(schema, "format") && !SUPPORTED_FORMATS.has(schema.format)) {
300
+ context.schemaErrors.push({
301
+ path,
302
+ rule: "unsupported-format",
303
+ detail: `schema format ${JSON.stringify(schema.format)} is not supported by this validator`
304
+ });
305
+ }
306
+ for (const [keyword, [expected, isValid]] of Object.entries(KEYWORD_SHAPES)) {
307
+ if (Object.hasOwn(schema, keyword) && !isValid(schema[keyword])) {
308
+ context.schemaErrors.push({
309
+ path,
310
+ rule: "schema",
311
+ detail: `schema keyword '${keyword}' must be ${expected}, got ${describeValue(schema[keyword])}`
312
+ });
313
+ }
314
+ }
315
+ if (context.schemaErrors.length === errorCount && isFrozenNode(schema)) {
316
+ wellFormedSchemas.add(schema);
317
+ }
318
+ };
319
+ var reportReference = (schema, path, detail, context) => {
320
+ if (context.reportedReferences.has(schema)) return;
321
+ context.reportedReferences.add(schema);
322
+ context.schemaErrors.push({ path, rule: "$ref", detail });
323
+ };
324
+ var validateNode = (value, schema, path, errs, context) => {
325
+ const evaluated = /* @__PURE__ */ new Set();
326
+ if (schema === true) return evaluated;
327
+ if (schema === false) {
328
+ errs.push({ path, rule: "schema:false", detail: "value not allowed" });
329
+ return evaluated;
330
+ }
331
+ if (!isSchema(schema)) return evaluated;
332
+ checkSchemaNode(schema, path, context);
333
+ if (typeof schema?.$ref === "string") {
334
+ const reference = schema.$ref;
335
+ let resolved;
336
+ let nextRoot = context.rootSchema;
337
+ let resolvedBase = context.base;
338
+ if (reference.startsWith("#")) {
339
+ resolved = resolveJsonPointer(context.rootSchema, reference);
340
+ } else if (typeof context.resolveRef === "function") {
341
+ const result = context.resolveRef(reference, { base: context.base });
342
+ resolved = result?.schema ?? result;
343
+ nextRoot = result?.rootSchema ?? resolved;
344
+ resolvedBase = result?.base ?? resolved?.$id ?? context.base;
345
+ }
346
+ if (!isSchema(resolved)) {
347
+ const detail = resolved === void 0 || resolved === null ? `could not resolve schema reference ${reference}` : `schema reference ${reference} resolved to ${typeOf(resolved)}, not a schema`;
348
+ reportReference(schema, path, detail, context);
349
+ return evaluated;
350
+ }
351
+ const referenceKey = `${path} ${context.base ?? "<root>"}:${reference}`;
352
+ if (context.referenceStack.includes(referenceKey)) {
353
+ reportReference(schema, path, `circular schema reference ${reference}`, context);
354
+ return evaluated;
355
+ }
356
+ const referenced = validateNode(value, resolved, path, errs, {
357
+ ...context,
358
+ rootSchema: nextRoot,
359
+ base: resolvedBase,
360
+ referenceStack: [...context.referenceStack, referenceKey]
361
+ });
362
+ for (const key of referenced) evaluated.add(key);
363
+ }
364
+ if (schema.type !== void 0) {
365
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
366
+ if (!types.some((t) => matchesType(value, t))) {
367
+ errs.push({
368
+ path,
369
+ rule: "type",
370
+ detail: `expected ${types.join("|")}, got ${typeOf(value)}`
371
+ });
372
+ return evaluated;
373
+ }
374
+ }
375
+ if (schema.const !== void 0) {
376
+ if (value !== schema.const) {
377
+ errs.push({
378
+ path,
379
+ rule: "const",
380
+ detail: `expected ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`
381
+ });
382
+ }
383
+ }
384
+ if (Array.isArray(schema.enum)) {
385
+ if (!schema.enum.includes(value)) {
386
+ errs.push({
387
+ path,
388
+ rule: "enum",
389
+ detail: `value ${JSON.stringify(value)} not in enum [${schema.enum.map((x) => JSON.stringify(x)).join(", ")}]`
390
+ });
391
+ }
392
+ }
393
+ if (typeof value === "string") {
394
+ if (typeof schema.minLength === "number" && value.length < schema.minLength) {
395
+ errs.push({
396
+ path,
397
+ rule: "minLength",
398
+ detail: `length ${value.length} < ${schema.minLength}`
399
+ });
400
+ }
401
+ if (typeof schema.maxLength === "number" && value.length > schema.maxLength) {
402
+ errs.push({
403
+ path,
404
+ rule: "maxLength",
405
+ detail: `length ${value.length} > ${schema.maxLength}`
406
+ });
407
+ }
408
+ const pattern = typeof schema.pattern === "string" ? compilePattern(schema.pattern) : null;
409
+ if (pattern && !pattern.test(value)) {
410
+ errs.push({
411
+ path,
412
+ rule: "pattern",
413
+ detail: `value ${JSON.stringify(value)} does not match /${schema.pattern}/`
414
+ });
415
+ }
416
+ if (typeof schema.format === "string") {
417
+ if (schema.format === "date" && !FORMAT_DATE.test(value)) {
418
+ errs.push({
419
+ path,
420
+ rule: "format:date",
421
+ detail: `value ${JSON.stringify(value)} is not YYYY-MM-DD`
422
+ });
423
+ } else if (schema.format === "date-time" && !FORMAT_DATETIME.test(value)) {
424
+ errs.push({
425
+ path,
426
+ rule: "format:date-time",
427
+ detail: `value ${JSON.stringify(value)} is not ISO 8601 date-time`
428
+ });
429
+ }
430
+ }
431
+ }
432
+ if (typeof value === "number") {
433
+ if (typeof schema.minimum === "number" && value < schema.minimum) {
434
+ errs.push({ path, rule: "minimum", detail: `value ${value} < ${schema.minimum}` });
435
+ }
436
+ if (typeof schema.maximum === "number" && value > schema.maximum) {
437
+ errs.push({ path, rule: "maximum", detail: `value ${value} > ${schema.maximum}` });
438
+ }
439
+ if (typeof schema.exclusiveMinimum === "number" && value <= schema.exclusiveMinimum) {
440
+ errs.push({
441
+ path,
442
+ rule: "exclusiveMinimum",
443
+ detail: `value ${value} <= ${schema.exclusiveMinimum}`
444
+ });
445
+ }
446
+ }
447
+ if (Array.isArray(value)) {
448
+ if (typeof schema.minItems === "number" && value.length < schema.minItems) {
449
+ errs.push({ path, rule: "minItems", detail: `length ${value.length} < ${schema.minItems}` });
450
+ }
451
+ if (typeof schema.maxItems === "number" && value.length > schema.maxItems) {
452
+ errs.push({ path, rule: "maxItems", detail: `length ${value.length} > ${schema.maxItems}` });
453
+ }
454
+ const prefixLength = Array.isArray(schema.prefixItems) ? schema.prefixItems.length : 0;
455
+ if (prefixLength > 0) {
456
+ for (let i = 0; i < Math.min(value.length, prefixLength); i++) {
457
+ validateNode(value[i], schema.prefixItems[i], `${path}[${i}]`, errs, context);
458
+ }
459
+ }
460
+ if (schema.items !== void 0) {
461
+ for (let i = prefixLength; i < value.length; i++) {
462
+ validateNode(value[i], schema.items, `${path}[${i}]`, errs, context);
463
+ }
464
+ }
465
+ if (schema.uniqueItems === true) {
466
+ const seen = /* @__PURE__ */ new Set();
467
+ for (const item of value) {
468
+ const key = JSON.stringify(item);
469
+ if (seen.has(key)) {
470
+ errs.push({ path, rule: "uniqueItems", detail: `duplicate item ${key}` });
471
+ break;
472
+ }
473
+ seen.add(key);
474
+ }
475
+ }
476
+ if (schema.contains !== void 0) {
477
+ let matches = 0;
478
+ for (let index = 0; index < value.length; index += 1) {
479
+ const containedErrors = [];
480
+ validateNode(value[index], schema.contains, `${path}[${index}]`, containedErrors, context);
481
+ if (containedErrors.length === 0) matches += 1;
482
+ }
483
+ const minimum = Number.isSafeInteger(schema.minContains) ? schema.minContains : 1;
484
+ const maximum = Number.isSafeInteger(schema.maxContains) ? schema.maxContains : null;
485
+ if (matches < minimum) {
486
+ errs.push({
487
+ path,
488
+ rule: "contains",
489
+ detail: `matched ${matches} contained items; expected at least ${minimum}`
490
+ });
491
+ }
492
+ if (maximum !== null && matches > maximum) {
493
+ errs.push({
494
+ path,
495
+ rule: "contains",
496
+ detail: `matched ${matches} contained items; expected at most ${maximum}`
497
+ });
498
+ }
499
+ }
500
+ }
501
+ if (value !== null && typeof value === "object" && !Array.isArray(value)) {
502
+ if (Array.isArray(schema.required)) {
503
+ for (const req of schema.required) {
504
+ if (!Object.hasOwn(value, req)) {
505
+ errs.push({ path, rule: "required", detail: `missing required property '${req}'` });
506
+ }
507
+ }
508
+ }
509
+ if (typeof schema.maxProperties === "number" && Object.keys(value).length > schema.maxProperties) {
510
+ errs.push({
511
+ path,
512
+ rule: "maxProperties",
513
+ detail: `property count ${Object.keys(value).length} > ${schema.maxProperties}`
514
+ });
515
+ }
516
+ if (schema.dependentRequired !== null && typeof schema.dependentRequired === "object") {
517
+ for (const [trigger, dependencies] of Object.entries(schema.dependentRequired)) {
518
+ if (!Object.hasOwn(value, trigger) || !Array.isArray(dependencies)) continue;
519
+ for (const dependency of dependencies) {
520
+ if (!Object.hasOwn(value, dependency)) {
521
+ errs.push({
522
+ path,
523
+ rule: "dependentRequired",
524
+ detail: `property '${trigger}' requires property '${dependency}'`
525
+ });
526
+ }
527
+ }
528
+ }
529
+ }
530
+ const props = schema.properties || {};
531
+ for (const [k, v] of Object.entries(value)) {
532
+ if (schema.propertyNames !== void 0)
533
+ validateNode(k, schema.propertyNames, `${path}.${k}`, errs, context);
534
+ if (Object.hasOwn(props, k)) evaluated.add(k);
535
+ else if (schema.additionalProperties !== void 0) evaluated.add(k);
536
+ if (!Object.hasOwn(props, k)) {
537
+ if (schema.additionalProperties === false) {
538
+ errs.push({ path, rule: "additionalProperties", detail: `unknown property '${k}'` });
539
+ } else if (schema.additionalProperties === true || schema.additionalProperties !== null && typeof schema.additionalProperties === "object") {
540
+ validateNode(v, schema.additionalProperties, `${path}.${k}`, errs, context);
541
+ }
542
+ }
543
+ }
544
+ for (const [k, v] of Object.entries(value)) {
545
+ if (Object.hasOwn(props, k)) validateNode(v, props[k], `${path}.${k}`, errs, context);
546
+ }
547
+ }
548
+ if (Array.isArray(schema.oneOf)) {
549
+ let matched = 0;
550
+ for (const sub of schema.oneOf) {
551
+ const e = [];
552
+ const branch = validateNode(value, sub, path, e, context);
553
+ if (e.length === 0) {
554
+ matched++;
555
+ for (const key of branch) evaluated.add(key);
556
+ }
557
+ }
558
+ if (matched !== 1) {
559
+ const titles = schema.oneOf.map((s) => s.title || "(unnamed)").join(" | ");
560
+ errs.push({
561
+ path,
562
+ rule: "oneOf",
563
+ detail: `matched ${matched}/${schema.oneOf.length} branches (expected exactly 1). Branches: ${titles}`
564
+ });
565
+ }
566
+ }
567
+ if (Array.isArray(schema.anyOf)) {
568
+ let matched = 0;
569
+ for (const sub of schema.anyOf) {
570
+ const candidateErrors = [];
571
+ const branch = validateNode(value, sub, path, candidateErrors, context);
572
+ if (candidateErrors.length === 0) {
573
+ matched += 1;
574
+ for (const key of branch) evaluated.add(key);
575
+ }
576
+ }
577
+ if (matched === 0) {
578
+ const titles = schema.anyOf.map((sub) => sub.title || "(unnamed)").join(" | ");
579
+ errs.push({
580
+ path,
581
+ rule: "anyOf",
582
+ detail: `matched 0/${schema.anyOf.length} branches (expected at least 1). Branches: ${titles}`
583
+ });
584
+ }
585
+ }
586
+ if (Array.isArray(schema.allOf)) {
587
+ for (const sub of schema.allOf) {
588
+ for (const key of validateNode(value, sub, path, errs, context)) evaluated.add(key);
589
+ }
590
+ }
591
+ if (schema.if !== void 0) {
592
+ const conditionErrors = [];
593
+ const condition = validateNode(value, schema.if, path, conditionErrors, context);
594
+ const passed = conditionErrors.length === 0;
595
+ if (passed) for (const key of condition) evaluated.add(key);
596
+ const branch = passed ? schema.then : schema.else;
597
+ if (branch !== void 0) {
598
+ const branchErrors = [];
599
+ const branchEvaluated = validateNode(value, branch, path, branchErrors, context);
600
+ errs.push(...branchErrors);
601
+ if (branchErrors.length === 0) for (const key of branchEvaluated) evaluated.add(key);
602
+ }
603
+ }
604
+ if (schema.not !== void 0) {
605
+ const e = [];
606
+ validateNode(value, schema.not, path, e, context);
607
+ if (e.length === 0) {
608
+ errs.push({ path, rule: "not", detail: "value matched a forbidden subschema" });
609
+ }
610
+ }
611
+ if (schema.unevaluatedProperties !== void 0 && value !== null && typeof value === "object" && !Array.isArray(value)) {
612
+ for (const [k, v] of Object.entries(value)) {
613
+ if (evaluated.has(k)) continue;
614
+ if (schema.unevaluatedProperties === false) {
615
+ errs.push({ path, rule: "unevaluatedProperties", detail: `unevaluated property '${k}'` });
616
+ } else {
617
+ validateNode(v, schema.unevaluatedProperties, `${path}.${k}`, errs, context);
618
+ }
619
+ evaluated.add(k);
620
+ }
621
+ }
622
+ return evaluated;
623
+ };
624
+ var validateJson = (value, schema, {
625
+ resolveRef,
626
+ base = (
627
+ /** @type {{ $id?: string } | null | undefined} */
628
+ schema?.$id ?? null
629
+ )
630
+ } = {}) => {
631
+ const errs = [];
632
+ const schemaErrors = [];
633
+ if (!isSchema(schema)) {
634
+ return [
635
+ {
636
+ path: "$",
637
+ rule: "schema",
638
+ detail: `expected a schema object or boolean, got ${typeOf(schema)}`
639
+ }
640
+ ];
641
+ }
642
+ validateNode(value, schema, "$", errs, {
643
+ rootSchema: schema,
644
+ resolveRef,
645
+ base,
646
+ referenceStack: [],
647
+ schemaErrors,
648
+ checkedSchemas: /* @__PURE__ */ new WeakSet(),
649
+ reportedReferences: /* @__PURE__ */ new WeakSet()
650
+ });
651
+ return [...schemaErrors, ...errs];
652
+ };
653
+
654
+ // packages/artifact/lib/artifact/internal/schema-loader.mjs
124
655
  var require2 = createRequire(new URL("./runtime/packages/artifact/lib/artifact/internal/schema-loader.mjs", import.meta.url).href);
125
656
  var protocolPackageRoot = dirname(__planrAssetFile(new URL("./runtime/packages/protocol/package.json", import.meta.url)));
126
657
  var SCHEMAS_ROOT = join(protocolPackageRoot, "schemas");
@@ -496,6 +1027,7 @@ export {
496
1027
  ARTIFACT_MAX_SOURCES,
497
1028
  ARTIFACT_MAX_VIEWS,
498
1029
  resolveArtifactHtml,
1030
+ validateJson,
499
1031
  MAX_ARTIFACT_HTML_BYTES,
500
1032
  canonicalSerialize,
501
1033
  digestArtifactEnvelope,
@@ -0,0 +1,137 @@
1
+ import {
2
+ isProcessAlive
3
+ } from "./design-loopback-server.mjs";
4
+
5
+ // packages/design/lib/design/document-state.mjs
6
+ import { createHash, randomUUID } from "node:crypto";
7
+ import {
8
+ chmodSync,
9
+ closeSync,
10
+ lstatSync,
11
+ mkdirSync,
12
+ openSync,
13
+ readFileSync,
14
+ realpathSync,
15
+ renameSync,
16
+ rmSync,
17
+ writeFileSync
18
+ } from "node:fs";
19
+ import { dirname, join, resolve } from "node:path";
20
+ var hash = (value) => createHash("sha256").update(value).digest("hex");
21
+ var json = (value) => `${JSON.stringify(value, null, 2)}
22
+ `;
23
+ function readJson(path, fallback = void 0) {
24
+ try {
25
+ return JSON.parse(readFileSync(path, "utf8"));
26
+ } catch (error) {
27
+ if (error.code === "ENOENT" && fallback !== void 0) return fallback;
28
+ throw error;
29
+ }
30
+ }
31
+ function atomicJson(path, value, { mode } = {}) {
32
+ atomicBytes(path, json(value), mode);
33
+ }
34
+ function atomicBytes(path, bytes, mode) {
35
+ mkdirSync(dirname(path), { recursive: true });
36
+ const temporary = `${path}.${randomUUID()}.tmp`;
37
+ try {
38
+ writeFileSync(temporary, bytes, { mode: 384, flag: "wx" });
39
+ if (mode !== void 0) chmodSync(temporary, mode);
40
+ renameSync(temporary, path);
41
+ } finally {
42
+ rmSync(temporary, { force: true });
43
+ }
44
+ }
45
+ function recoverDesignPublication(root, { ownsRenderLock = false } = {}) {
46
+ const journalPath = join(root, ".design/publication.json");
47
+ let journal = readJson(journalPath, null);
48
+ if (!journal) return;
49
+ const lockPath = join(root, ".design/render.lock");
50
+ let recoveryOwner;
51
+ if (!ownsRenderLock) {
52
+ const lock = readJson(lockPath, null);
53
+ if (lock && isProcessAlive(lock.pid)) return;
54
+ if (lock) rmSync(lockPath, { force: true });
55
+ recoveryOwner = randomUUID();
56
+ let descriptor;
57
+ try {
58
+ descriptor = openSync(lockPath, "wx", 384);
59
+ writeFileSync(
60
+ descriptor,
61
+ json({ pid: process.pid, owner: recoveryOwner, createdAt: Date.now() })
62
+ );
63
+ } catch (error) {
64
+ if (error.code === "EEXIST") return;
65
+ throw error;
66
+ } finally {
67
+ if (descriptor !== void 0) closeSync(descriptor);
68
+ }
69
+ }
70
+ try {
71
+ journal = readJson(journalPath, null);
72
+ if (!journal) return;
73
+ const pointer = readJson(join(root, ".design/current.json"), null);
74
+ const manifestPath = join(root, "finalized.json");
75
+ if (pointer?.revision === journal.revision) atomicJson(manifestPath, journal.manifest);
76
+ else if ((pointer?.revision ?? null) === journal.previousRevision) {
77
+ if (journal.previousManifest === null) rmSync(manifestPath, { force: true });
78
+ else atomicBytes(manifestPath, Buffer.from(journal.previousManifest, "base64"));
79
+ } else if (pointer?.revision && /^[a-f0-9]{64}$/u.test(pointer.revision)) {
80
+ atomicJson(
81
+ manifestPath,
82
+ readJson(join(root, ".design/revisions", pointer.revision, "render.json")).manifest
83
+ );
84
+ } else
85
+ throw new Error("Design publication recovery could not identify the committed revision.");
86
+ rmSync(journalPath, { force: true });
87
+ } finally {
88
+ if (recoveryOwner && readJson(lockPath, null)?.owner === recoveryOwner)
89
+ rmSync(lockPath, { force: true });
90
+ }
91
+ }
92
+ function designSpecPath(root) {
93
+ return /(?:^|\/)output\/feats\/feat-[^/]+\/design$/u.test(root.replaceAll("\\", "/")) ? join(dirname(root), "design-spec.md") : join(root, "design-spec.md");
94
+ }
95
+ function currentDesign(file, { recoverPublication = true } = {}) {
96
+ const root = realpathSync(dirname(resolve(file)));
97
+ if (recoverPublication) recoverDesignPublication(root);
98
+ else {
99
+ try {
100
+ lstatSync(join(root, ".design/publication.json"));
101
+ throw Object.assign(
102
+ new Error(
103
+ "Design publication state is pending or needs recovery. Finish or recover it with the Design utility; repair or restore an invalid .design/publication.json before retrying Plan handoff inspection."
104
+ ),
105
+ { code: "E_DESIGN_PUBLICATION_PENDING", statusCode: 409 }
106
+ );
107
+ } catch (error) {
108
+ if (error.code !== "ENOENT") throw error;
109
+ }
110
+ }
111
+ const pointer = readJson(join(root, ".design/current.json"), null);
112
+ if (!pointer || !/^[a-f0-9]{64}$/u.test(pointer.revision))
113
+ throw new Error("Design has no completed render. Run the render utility first.");
114
+ const directory = join(root, ".design/revisions", pointer.revision);
115
+ const prepared = readJson(join(directory, "render.json"));
116
+ return {
117
+ ...prepared,
118
+ root,
119
+ directory,
120
+ file: resolve(file),
121
+ verification: readJson(join(root, ".design/verification", `${pointer.revision}.json`), {
122
+ status: "unverified",
123
+ revision: pointer.revision
124
+ })
125
+ };
126
+ }
127
+
128
+ export {
129
+ hash,
130
+ json,
131
+ readJson,
132
+ atomicJson,
133
+ atomicBytes,
134
+ recoverDesignPublication,
135
+ designSpecPath,
136
+ currentDesign
137
+ };