openplanr 1.25.3 → 2.0.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 (1738) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/CONTRIBUTING.md +33 -0
  3. package/README.md +154 -131
  4. package/dist/cli/commands/artifact.d.ts.map +1 -1
  5. package/dist/cli/commands/artifact.js +214 -30
  6. package/dist/cli/commands/artifact.js.map +1 -1
  7. package/dist/cli/commands/backlog.d.ts +1 -21
  8. package/dist/cli/commands/backlog.d.ts.map +1 -1
  9. package/dist/cli/commands/backlog.js +1 -428
  10. package/dist/cli/commands/backlog.js.map +1 -1
  11. package/dist/cli/commands/company.d.ts +3 -0
  12. package/dist/cli/commands/company.d.ts.map +1 -0
  13. package/dist/cli/commands/company.js +173 -0
  14. package/dist/cli/commands/company.js.map +1 -0
  15. package/dist/cli/commands/config-deterministic.d.ts +3 -0
  16. package/dist/cli/commands/config-deterministic.d.ts.map +1 -0
  17. package/dist/cli/commands/config-deterministic.js +88 -0
  18. package/dist/cli/commands/config-deterministic.js.map +1 -0
  19. package/dist/cli/commands/dashboard.d.ts +3 -0
  20. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  21. package/dist/cli/commands/dashboard.js +36 -0
  22. package/dist/cli/commands/dashboard.js.map +1 -0
  23. package/dist/cli/commands/diagram/index.d.ts +3 -0
  24. package/dist/cli/commands/diagram/index.d.ts.map +1 -0
  25. package/dist/cli/commands/diagram/index.js +73 -0
  26. package/dist/cli/commands/diagram/index.js.map +1 -0
  27. package/dist/cli/commands/diagram/presentation.d.ts +4 -0
  28. package/dist/cli/commands/diagram/presentation.d.ts.map +1 -0
  29. package/dist/cli/commands/diagram/presentation.js +38 -0
  30. package/dist/cli/commands/diagram/presentation.js.map +1 -0
  31. package/dist/cli/commands/doctor.d.ts.map +1 -1
  32. package/dist/cli/commands/doctor.js +1 -11
  33. package/dist/cli/commands/doctor.js.map +1 -1
  34. package/dist/cli/commands/epic.d.ts +1 -9
  35. package/dist/cli/commands/epic.d.ts.map +1 -1
  36. package/dist/cli/commands/epic.js +1 -259
  37. package/dist/cli/commands/epic.js.map +1 -1
  38. package/dist/cli/commands/feature.d.ts +1 -8
  39. package/dist/cli/commands/feature.d.ts.map +1 -1
  40. package/dist/cli/commands/feature.js +1 -220
  41. package/dist/cli/commands/feature.js.map +1 -1
  42. package/dist/cli/commands/groups/delivery.d.ts +3 -0
  43. package/dist/cli/commands/groups/delivery.d.ts.map +1 -0
  44. package/dist/cli/commands/groups/delivery.js +13 -0
  45. package/dist/cli/commands/groups/delivery.js.map +1 -0
  46. package/dist/cli/commands/groups/foundation.d.ts +3 -0
  47. package/dist/cli/commands/groups/foundation.d.ts.map +1 -0
  48. package/dist/cli/commands/groups/foundation.js +11 -0
  49. package/dist/cli/commands/groups/foundation.js.map +1 -0
  50. package/dist/cli/commands/groups/intelligence.d.ts +3 -0
  51. package/dist/cli/commands/groups/intelligence.d.ts.map +1 -0
  52. package/dist/cli/commands/groups/intelligence.js +19 -0
  53. package/dist/cli/commands/groups/intelligence.js.map +1 -0
  54. package/dist/cli/commands/groups/operations.d.ts +3 -0
  55. package/dist/cli/commands/groups/operations.d.ts.map +1 -0
  56. package/dist/cli/commands/groups/operations.js +17 -0
  57. package/dist/cli/commands/groups/operations.js.map +1 -0
  58. package/dist/cli/commands/groups/planning.d.ts +3 -0
  59. package/dist/cli/commands/groups/planning.d.ts.map +1 -0
  60. package/dist/cli/commands/groups/planning.js +25 -0
  61. package/dist/cli/commands/groups/planning.js.map +1 -0
  62. package/dist/cli/commands/index.d.ts +4 -0
  63. package/dist/cli/commands/index.d.ts.map +1 -0
  64. package/dist/cli/commands/index.js +14 -0
  65. package/dist/cli/commands/index.js.map +1 -0
  66. package/dist/cli/commands/init-deterministic.d.ts +3 -0
  67. package/dist/cli/commands/init-deterministic.d.ts.map +1 -0
  68. package/dist/cli/commands/init-deterministic.js +40 -0
  69. package/dist/cli/commands/init-deterministic.js.map +1 -0
  70. package/dist/cli/commands/land.d.ts +15 -0
  71. package/dist/cli/commands/land.d.ts.map +1 -0
  72. package/dist/cli/commands/land.js +176 -0
  73. package/dist/cli/commands/land.js.map +1 -0
  74. package/dist/cli/commands/operate/input.d.ts +54 -0
  75. package/dist/cli/commands/operate/input.d.ts.map +1 -0
  76. package/dist/cli/commands/operate/input.js +98 -0
  77. package/dist/cli/commands/operate/input.js.map +1 -0
  78. package/dist/cli/commands/operate/registrars/assignments.d.ts +5 -0
  79. package/dist/cli/commands/operate/registrars/assignments.d.ts.map +1 -0
  80. package/dist/cli/commands/operate/registrars/assignments.js +167 -0
  81. package/dist/cli/commands/operate/registrars/assignments.js.map +1 -0
  82. package/dist/cli/commands/operate/registrars/catalog.d.ts +4 -0
  83. package/dist/cli/commands/operate/registrars/catalog.d.ts.map +1 -0
  84. package/dist/cli/commands/operate/registrars/catalog.js +12 -0
  85. package/dist/cli/commands/operate/registrars/catalog.js.map +1 -0
  86. package/dist/cli/commands/operate/registrars/contracts.d.ts +41 -0
  87. package/dist/cli/commands/operate/registrars/contracts.d.ts.map +1 -0
  88. package/dist/cli/commands/operate/registrars/contracts.js +2 -0
  89. package/dist/cli/commands/operate/registrars/contracts.js.map +1 -0
  90. package/dist/cli/commands/operate/registrars/dashboard.d.ts +4 -0
  91. package/dist/cli/commands/operate/registrars/dashboard.d.ts.map +1 -0
  92. package/dist/cli/commands/operate/registrars/dashboard.js +26 -0
  93. package/dist/cli/commands/operate/registrars/dashboard.js.map +1 -0
  94. package/dist/cli/commands/operate/registrars/dispatch.d.ts +7 -0
  95. package/dist/cli/commands/operate/registrars/dispatch.d.ts.map +1 -0
  96. package/dist/cli/commands/operate/registrars/dispatch.js +55 -0
  97. package/dist/cli/commands/operate/registrars/dispatch.js.map +1 -0
  98. package/dist/cli/commands/operate/registrars/experience.d.ts +4 -0
  99. package/dist/cli/commands/operate/registrars/experience.d.ts.map +1 -0
  100. package/dist/cli/commands/operate/registrars/experience.js +93 -0
  101. package/dist/cli/commands/operate/registrars/experience.js.map +1 -0
  102. package/dist/cli/commands/operate/registrars/index.d.ts +5 -0
  103. package/dist/cli/commands/operate/registrars/index.d.ts.map +1 -0
  104. package/dist/cli/commands/operate/registrars/index.js +28 -0
  105. package/dist/cli/commands/operate/registrars/index.js.map +1 -0
  106. package/dist/cli/commands/operate/registrars/lifecycle.d.ts +4 -0
  107. package/dist/cli/commands/operate/registrars/lifecycle.d.ts.map +1 -0
  108. package/dist/cli/commands/operate/registrars/lifecycle.js +46 -0
  109. package/dist/cli/commands/operate/registrars/lifecycle.js.map +1 -0
  110. package/dist/cli/commands/operate/registrars/measurement.d.ts +4 -0
  111. package/dist/cli/commands/operate/registrars/measurement.d.ts.map +1 -0
  112. package/dist/cli/commands/operate/registrars/measurement.js +122 -0
  113. package/dist/cli/commands/operate/registrars/measurement.js.map +1 -0
  114. package/dist/cli/commands/operate/registrars/note-validation.d.ts +6 -0
  115. package/dist/cli/commands/operate/registrars/note-validation.d.ts.map +1 -0
  116. package/dist/cli/commands/operate/registrars/note-validation.js +103 -0
  117. package/dist/cli/commands/operate/registrars/note-validation.js.map +1 -0
  118. package/dist/cli/commands/operate/registrars/planning.d.ts +4 -0
  119. package/dist/cli/commands/operate/registrars/planning.d.ts.map +1 -0
  120. package/dist/cli/commands/operate/registrars/planning.js +41 -0
  121. package/dist/cli/commands/operate/registrars/planning.js.map +1 -0
  122. package/dist/cli/commands/operate/registrars/recovery.d.ts +4 -0
  123. package/dist/cli/commands/operate/registrars/recovery.d.ts.map +1 -0
  124. package/dist/cli/commands/operate/registrars/recovery.js +65 -0
  125. package/dist/cli/commands/operate/registrars/recovery.js.map +1 -0
  126. package/dist/cli/commands/operate/registrars/reviews.d.ts +4 -0
  127. package/dist/cli/commands/operate/registrars/reviews.d.ts.map +1 -0
  128. package/dist/cli/commands/operate/registrars/reviews.js +83 -0
  129. package/dist/cli/commands/operate/registrars/reviews.js.map +1 -0
  130. package/dist/cli/commands/operate/registration.d.ts +4 -0
  131. package/dist/cli/commands/operate/registration.d.ts.map +1 -0
  132. package/dist/cli/commands/operate/registration.js +3 -0
  133. package/dist/cli/commands/operate/registration.js.map +1 -0
  134. package/dist/cli/commands/operate/render.d.ts +19 -0
  135. package/dist/cli/commands/operate/render.d.ts.map +1 -0
  136. package/dist/cli/commands/operate/render.js +201 -0
  137. package/dist/cli/commands/operate/render.js.map +1 -0
  138. package/dist/cli/commands/operate.d.ts +58 -13
  139. package/dist/cli/commands/operate.d.ts.map +1 -1
  140. package/dist/cli/commands/operate.js +169 -984
  141. package/dist/cli/commands/operate.js.map +1 -1
  142. package/dist/cli/commands/planning-artifacts.d.ts +10 -0
  143. package/dist/cli/commands/planning-artifacts.d.ts.map +1 -0
  144. package/dist/cli/commands/planning-artifacts.js +350 -0
  145. package/dist/cli/commands/planning-artifacts.js.map +1 -0
  146. package/dist/cli/commands/quick/interaction.d.ts +8 -0
  147. package/dist/cli/commands/quick/interaction.d.ts.map +1 -0
  148. package/dist/cli/commands/quick/interaction.js +8 -0
  149. package/dist/cli/commands/quick/interaction.js.map +1 -0
  150. package/dist/cli/commands/quick/project.d.ts +8 -0
  151. package/dist/cli/commands/quick/project.d.ts.map +1 -0
  152. package/dist/cli/commands/quick/project.js +8 -0
  153. package/dist/cli/commands/quick/project.js.map +1 -0
  154. package/dist/cli/commands/quick.d.ts +1 -29
  155. package/dist/cli/commands/quick.d.ts.map +1 -1
  156. package/dist/cli/commands/quick.js +1 -337
  157. package/dist/cli/commands/quick.js.map +1 -1
  158. package/dist/cli/commands/rules.js +1 -1
  159. package/dist/cli/commands/rules.js.map +1 -1
  160. package/dist/cli/commands/setup.d.ts.map +1 -1
  161. package/dist/cli/commands/setup.js +40 -18
  162. package/dist/cli/commands/setup.js.map +1 -1
  163. package/dist/cli/commands/spec.d.ts +6 -4
  164. package/dist/cli/commands/spec.d.ts.map +1 -1
  165. package/dist/cli/commands/spec.js +166 -174
  166. package/dist/cli/commands/spec.js.map +1 -1
  167. package/dist/cli/commands/sprint.d.ts +1 -8
  168. package/dist/cli/commands/sprint.d.ts.map +1 -1
  169. package/dist/cli/commands/sprint.js +1 -522
  170. package/dist/cli/commands/sprint.js.map +1 -1
  171. package/dist/cli/commands/story/interaction.d.ts +7 -0
  172. package/dist/cli/commands/story/interaction.d.ts.map +1 -0
  173. package/dist/cli/commands/story/interaction.js +7 -0
  174. package/dist/cli/commands/story/interaction.js.map +1 -0
  175. package/dist/cli/commands/story/project.d.ts +10 -0
  176. package/dist/cli/commands/story/project.d.ts.map +1 -0
  177. package/dist/cli/commands/story/project.js +10 -0
  178. package/dist/cli/commands/story/project.js.map +1 -0
  179. package/dist/cli/commands/story.d.ts +1 -8
  180. package/dist/cli/commands/story.d.ts.map +1 -1
  181. package/dist/cli/commands/story.js +1 -358
  182. package/dist/cli/commands/story.js.map +1 -1
  183. package/dist/cli/commands/task.d.ts +1 -9
  184. package/dist/cli/commands/task.d.ts.map +1 -1
  185. package/dist/cli/commands/task.js +1 -351
  186. package/dist/cli/commands/task.js.map +1 -1
  187. package/dist/cli/error-boundary.d.ts +29 -0
  188. package/dist/cli/error-boundary.d.ts.map +1 -0
  189. package/dist/cli/error-boundary.js +103 -0
  190. package/dist/cli/error-boundary.js.map +1 -0
  191. package/dist/cli/helpers/bulk-checkbox-update.d.ts +1 -1
  192. package/dist/cli/helpers/bulk-checkbox-update.js +1 -1
  193. package/dist/cli/index.js +38 -113
  194. package/dist/cli/index.js.map +1 -1
  195. package/dist/dashboard/.vite/manifest.json +68 -0
  196. package/dist/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  197. package/dist/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  198. package/dist/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  199. package/dist/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  200. package/dist/dashboard/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  201. package/dist/dashboard/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  202. package/dist/dashboard/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  203. package/dist/dashboard/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  204. package/dist/dashboard/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  205. package/dist/dashboard/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  206. package/dist/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  207. package/dist/dashboard/assets/index-Bk8DyO_2.css +1 -0
  208. package/dist/dashboard/assets/index-zeygL5iu.js +557 -0
  209. package/dist/dashboard/assets/index-zeygL5iu.js.map +1 -0
  210. package/dist/dashboard/dashboard-manifest.json +84 -0
  211. package/dist/dashboard/index.html +13 -0
  212. package/dist/generators/base-generator.d.ts +2 -0
  213. package/dist/generators/base-generator.d.ts.map +1 -1
  214. package/dist/generators/base-generator.js +8 -0
  215. package/dist/generators/base-generator.js.map +1 -1
  216. package/dist/generators/claude-generator.d.ts.map +1 -1
  217. package/dist/generators/claude-generator.js +12 -14
  218. package/dist/generators/claude-generator.js.map +1 -1
  219. package/dist/generators/codex-generator.d.ts.map +1 -1
  220. package/dist/generators/codex-generator.js +7 -7
  221. package/dist/generators/codex-generator.js.map +1 -1
  222. package/dist/generators/cursor-generator.d.ts.map +1 -1
  223. package/dist/generators/cursor-generator.js +11 -30
  224. package/dist/generators/cursor-generator.js.map +1 -1
  225. package/dist/models/schema.d.ts +0 -23
  226. package/dist/models/schema.d.ts.map +1 -1
  227. package/dist/models/schema.js +0 -7
  228. package/dist/models/schema.js.map +1 -1
  229. package/dist/models/types.d.ts +3 -14
  230. package/dist/models/types.d.ts.map +1 -1
  231. package/dist/services/artifact-pipeline-service.d.ts +99 -1
  232. package/dist/services/artifact-pipeline-service.d.ts.map +1 -1
  233. package/dist/services/artifact-pipeline-service.js +681 -4
  234. package/dist/services/artifact-pipeline-service.js.map +1 -1
  235. package/dist/services/canonical-json.d.ts +3 -0
  236. package/dist/services/canonical-json.d.ts.map +1 -0
  237. package/dist/services/canonical-json.js +71 -0
  238. package/dist/services/canonical-json.js.map +1 -0
  239. package/dist/services/claude-plugin-service.d.ts +6 -1
  240. package/dist/services/claude-plugin-service.d.ts.map +1 -1
  241. package/dist/services/claude-plugin-service.js +184 -12
  242. package/dist/services/claude-plugin-service.js.map +1 -1
  243. package/dist/services/codex-plugin-service.d.ts +30 -0
  244. package/dist/services/codex-plugin-service.d.ts.map +1 -0
  245. package/dist/services/codex-plugin-service.js +195 -0
  246. package/dist/services/codex-plugin-service.js.map +1 -0
  247. package/dist/services/company-auth-service.d.ts +70 -0
  248. package/dist/services/company-auth-service.d.ts.map +1 -0
  249. package/dist/services/company-auth-service.js +720 -0
  250. package/dist/services/company-auth-service.js.map +1 -0
  251. package/dist/services/company-auth-store.d.ts +22 -0
  252. package/dist/services/company-auth-store.d.ts.map +1 -0
  253. package/dist/services/company-auth-store.js +158 -0
  254. package/dist/services/company-auth-store.js.map +1 -0
  255. package/dist/services/company-common.d.ts +9 -0
  256. package/dist/services/company-common.d.ts.map +1 -0
  257. package/dist/services/company-common.js +35 -0
  258. package/dist/services/company-common.js.map +1 -0
  259. package/dist/services/company-sync-service.d.ts +214 -0
  260. package/dist/services/company-sync-service.d.ts.map +1 -0
  261. package/dist/services/company-sync-service.js +1299 -0
  262. package/dist/services/company-sync-service.js.map +1 -0
  263. package/dist/services/connectors/adapters/business-metrics.d.ts +5 -0
  264. package/dist/services/connectors/adapters/business-metrics.d.ts.map +1 -0
  265. package/dist/services/connectors/adapters/business-metrics.js +41 -0
  266. package/dist/services/connectors/adapters/business-metrics.js.map +1 -0
  267. package/dist/services/connectors/adapters/deployment-health.d.ts +18 -0
  268. package/dist/services/connectors/adapters/deployment-health.d.ts.map +1 -0
  269. package/dist/services/connectors/adapters/deployment-health.js +67 -0
  270. package/dist/services/connectors/adapters/deployment-health.js.map +1 -0
  271. package/dist/services/connectors/adapters/github.d.ts +5 -0
  272. package/dist/services/connectors/adapters/github.d.ts.map +1 -0
  273. package/dist/services/connectors/adapters/github.js +31 -0
  274. package/dist/services/connectors/adapters/github.js.map +1 -0
  275. package/dist/services/connectors/adapters/linear-jira.d.ts +5 -0
  276. package/dist/services/connectors/adapters/linear-jira.d.ts.map +1 -0
  277. package/dist/services/connectors/adapters/linear-jira.js +26 -0
  278. package/dist/services/connectors/adapters/linear-jira.js.map +1 -0
  279. package/dist/services/connectors/adapters/posthog.d.ts +5 -0
  280. package/dist/services/connectors/adapters/posthog.d.ts.map +1 -0
  281. package/dist/services/connectors/adapters/posthog.js +31 -0
  282. package/dist/services/connectors/adapters/posthog.js.map +1 -0
  283. package/dist/services/connectors/adapters/sentry.d.ts +5 -0
  284. package/dist/services/connectors/adapters/sentry.d.ts.map +1 -0
  285. package/dist/services/connectors/adapters/sentry.js +31 -0
  286. package/dist/services/connectors/adapters/sentry.js.map +1 -0
  287. package/dist/services/connectors/checkpoint-custody.d.ts +45 -0
  288. package/dist/services/connectors/checkpoint-custody.d.ts.map +1 -0
  289. package/dist/services/connectors/checkpoint-custody.js +496 -0
  290. package/dist/services/connectors/checkpoint-custody.js.map +1 -0
  291. package/dist/services/connectors/connector-registry.d.ts +144 -0
  292. package/dist/services/connectors/connector-registry.d.ts.map +1 -0
  293. package/dist/services/connectors/connector-registry.js +423 -0
  294. package/dist/services/connectors/connector-registry.js.map +1 -0
  295. package/dist/services/connectors/connector-runtime.d.ts +200 -0
  296. package/dist/services/connectors/connector-runtime.d.ts.map +1 -0
  297. package/dist/services/connectors/connector-runtime.js +1297 -0
  298. package/dist/services/connectors/connector-runtime.js.map +1 -0
  299. package/dist/services/connectors/credential-custody.d.ts +96 -0
  300. package/dist/services/connectors/credential-custody.d.ts.map +1 -0
  301. package/dist/services/connectors/credential-custody.js +390 -0
  302. package/dist/services/connectors/credential-custody.js.map +1 -0
  303. package/dist/services/credential-backends.d.ts +11 -1
  304. package/dist/services/credential-backends.d.ts.map +1 -1
  305. package/dist/services/credential-backends.js +104 -21
  306. package/dist/services/credential-backends.js.map +1 -1
  307. package/dist/services/credential-write-lock.d.ts +8 -0
  308. package/dist/services/credential-write-lock.d.ts.map +1 -0
  309. package/dist/services/credential-write-lock.js +104 -0
  310. package/dist/services/credential-write-lock.js.map +1 -0
  311. package/dist/services/credentials-service.d.ts +8 -2
  312. package/dist/services/credentials-service.d.ts.map +1 -1
  313. package/dist/services/credentials-service.js +66 -21
  314. package/dist/services/credentials-service.js.map +1 -1
  315. package/dist/services/deprecation-notices.d.ts +2 -2
  316. package/dist/services/deprecation-notices.d.ts.map +1 -1
  317. package/dist/services/deprecation-notices.js +2 -2
  318. package/dist/services/deprecation-notices.js.map +1 -1
  319. package/dist/services/design-artifact-service.d.ts +37 -0
  320. package/dist/services/design-artifact-service.d.ts.map +1 -0
  321. package/dist/services/design-artifact-service.js +94 -0
  322. package/dist/services/design-artifact-service.js.map +1 -0
  323. package/dist/services/diagram-artifact-service.d.ts +12 -0
  324. package/dist/services/diagram-artifact-service.d.ts.map +1 -0
  325. package/dist/services/diagram-artifact-service.js +41 -0
  326. package/dist/services/diagram-artifact-service.js.map +1 -0
  327. package/dist/services/diagram-pipeline-service.d.ts +125 -0
  328. package/dist/services/diagram-pipeline-service.d.ts.map +1 -0
  329. package/dist/services/diagram-pipeline-service.js +329 -0
  330. package/dist/services/diagram-pipeline-service.js.map +1 -0
  331. package/dist/services/gherkin-service.d.ts +3 -0
  332. package/dist/services/gherkin-service.d.ts.map +1 -0
  333. package/dist/services/gherkin-service.js +9 -0
  334. package/dist/services/gherkin-service.js.map +1 -0
  335. package/dist/services/graph-service.d.ts.map +1 -1
  336. package/dist/services/graph-service.js +6 -4
  337. package/dist/services/graph-service.js.map +1 -1
  338. package/dist/services/landing/landing-service.d.ts +42 -0
  339. package/dist/services/landing/landing-service.d.ts.map +1 -0
  340. package/dist/services/landing/landing-service.js +197 -0
  341. package/dist/services/landing/landing-service.js.map +1 -0
  342. package/dist/services/landing/operation-registry.d.ts +56 -0
  343. package/dist/services/landing/operation-registry.d.ts.map +1 -0
  344. package/dist/services/landing/operation-registry.js +165 -0
  345. package/dist/services/landing/operation-registry.js.map +1 -0
  346. package/dist/services/landing/receipt-custody.d.ts +48 -0
  347. package/dist/services/landing/receipt-custody.d.ts.map +1 -0
  348. package/dist/services/landing/receipt-custody.js +375 -0
  349. package/dist/services/landing/receipt-custody.js.map +1 -0
  350. package/dist/services/linear/constants.d.ts.map +1 -1
  351. package/dist/services/linear/constants.js +2 -6
  352. package/dist/services/linear/constants.js.map +1 -1
  353. package/dist/services/linear/task-status-aggregation.d.ts +1 -1
  354. package/dist/services/linear/task-status-aggregation.js +1 -1
  355. package/dist/services/linear-pull-service.d.ts.map +1 -1
  356. package/dist/services/linear-pull-service.js +7 -30
  357. package/dist/services/linear-pull-service.js.map +1 -1
  358. package/dist/services/linear-push-service.d.ts.map +1 -1
  359. package/dist/services/linear-push-service.js +4 -5
  360. package/dist/services/linear-push-service.js.map +1 -1
  361. package/dist/services/migration-registry.d.ts +0 -19
  362. package/dist/services/migration-registry.d.ts.map +1 -1
  363. package/dist/services/migration-registry.js +18 -32
  364. package/dist/services/migration-registry.js.map +1 -1
  365. package/dist/services/operate/assignment-lifecycle-service.d.ts +135 -0
  366. package/dist/services/operate/assignment-lifecycle-service.d.ts.map +1 -0
  367. package/dist/services/operate/assignment-lifecycle-service.js +113 -0
  368. package/dist/services/operate/assignment-lifecycle-service.js.map +1 -0
  369. package/dist/services/operate/assignment-packet-service.d.ts +79 -0
  370. package/dist/services/operate/assignment-packet-service.d.ts.map +1 -0
  371. package/dist/services/operate/assignment-packet-service.js +1030 -0
  372. package/dist/services/operate/assignment-packet-service.js.map +1 -0
  373. package/dist/services/operate/client/governance.d.ts +4 -0
  374. package/dist/services/operate/client/governance.d.ts.map +1 -0
  375. package/dist/services/operate/client/governance.js +3 -0
  376. package/dist/services/operate/client/governance.js.map +1 -0
  377. package/dist/services/operate/client/lifecycle.d.ts +18 -0
  378. package/dist/services/operate/client/lifecycle.d.ts.map +1 -0
  379. package/dist/services/operate/client/lifecycle.js +15 -0
  380. package/dist/services/operate/client/lifecycle.js.map +1 -0
  381. package/dist/services/operate/client/runtime.d.ts +13 -0
  382. package/dist/services/operate/client/runtime.d.ts.map +1 -0
  383. package/dist/services/operate/client/runtime.js +11 -0
  384. package/dist/services/operate/client/runtime.js.map +1 -0
  385. package/dist/services/operate/client-error.d.ts +9 -0
  386. package/dist/services/operate/client-error.d.ts.map +1 -0
  387. package/dist/services/operate/client-error.js +14 -0
  388. package/dist/services/operate/client-error.js.map +1 -0
  389. package/dist/services/operate/client.d.ts +415 -0
  390. package/dist/services/operate/client.d.ts.map +1 -0
  391. package/dist/services/operate/client.js +2432 -0
  392. package/dist/services/operate/client.js.map +1 -0
  393. package/dist/services/operate/command-gateway.d.ts +152 -0
  394. package/dist/services/operate/command-gateway.d.ts.map +1 -0
  395. package/dist/services/operate/command-gateway.js +883 -0
  396. package/dist/services/operate/command-gateway.js.map +1 -0
  397. package/dist/services/operate/composition.d.ts +421 -0
  398. package/dist/services/operate/composition.d.ts.map +1 -0
  399. package/dist/services/operate/composition.js +394 -0
  400. package/dist/services/operate/composition.js.map +1 -0
  401. package/dist/services/operate/cycle-lifecycle-service.d.ts +35 -0
  402. package/dist/services/operate/cycle-lifecycle-service.d.ts.map +1 -0
  403. package/dist/services/operate/cycle-lifecycle-service.js +427 -0
  404. package/dist/services/operate/cycle-lifecycle-service.js.map +1 -0
  405. package/dist/services/operate/delivery-evidence.d.ts +34 -0
  406. package/dist/services/operate/delivery-evidence.d.ts.map +1 -0
  407. package/dist/services/operate/delivery-evidence.js +666 -0
  408. package/dist/services/operate/delivery-evidence.js.map +1 -0
  409. package/dist/services/operate/domain-catalog-service.d.ts +24 -0
  410. package/dist/services/operate/domain-catalog-service.d.ts.map +1 -0
  411. package/dist/services/operate/domain-catalog-service.js +99 -0
  412. package/dist/services/operate/domain-catalog-service.js.map +1 -0
  413. package/dist/services/operate/experience-read-service.d.ts +64 -0
  414. package/dist/services/operate/experience-read-service.d.ts.map +1 -0
  415. package/dist/services/operate/experience-read-service.js +109 -0
  416. package/dist/services/operate/experience-read-service.js.map +1 -0
  417. package/dist/services/operate/governed-action-service.d.ts +80 -0
  418. package/dist/services/operate/governed-action-service.d.ts.map +1 -0
  419. package/dist/services/operate/governed-action-service.js +497 -0
  420. package/dist/services/operate/governed-action-service.js.map +1 -0
  421. package/dist/services/operate/identity-contract.d.ts +3 -0
  422. package/dist/services/operate/identity-contract.d.ts.map +1 -0
  423. package/dist/services/operate/identity-contract.js +6 -0
  424. package/dist/services/operate/identity-contract.js.map +1 -0
  425. package/dist/services/operate/measurement-schedule-service.d.ts +81 -0
  426. package/dist/services/operate/measurement-schedule-service.d.ts.map +1 -0
  427. package/dist/services/operate/measurement-schedule-service.js +461 -0
  428. package/dist/services/operate/measurement-schedule-service.js.map +1 -0
  429. package/dist/services/operate/path-custody.d.ts +16 -0
  430. package/dist/services/operate/path-custody.d.ts.map +1 -0
  431. package/dist/services/operate/path-custody.js +120 -0
  432. package/dist/services/operate/path-custody.js.map +1 -0
  433. package/dist/services/operate/pinned-legacy-replay-runner.d.ts +9 -0
  434. package/dist/services/operate/pinned-legacy-replay-runner.d.ts.map +1 -0
  435. package/dist/services/operate/pinned-legacy-replay-runner.js +441 -0
  436. package/dist/services/operate/pinned-legacy-replay-runner.js.map +1 -0
  437. package/dist/services/operate/planning-bridge.d.ts +28 -0
  438. package/dist/services/operate/planning-bridge.d.ts.map +1 -0
  439. package/dist/services/operate/planning-bridge.js +341 -0
  440. package/dist/services/operate/planning-bridge.js.map +1 -0
  441. package/dist/services/operate/planning-handoff-gateway.d.ts +47 -0
  442. package/dist/services/operate/planning-handoff-gateway.d.ts.map +1 -0
  443. package/dist/services/operate/planning-handoff-gateway.js +169 -0
  444. package/dist/services/operate/planning-handoff-gateway.js.map +1 -0
  445. package/dist/services/operate/planning-handoff-service.d.ts +38 -0
  446. package/dist/services/operate/planning-handoff-service.d.ts.map +1 -0
  447. package/dist/services/operate/planning-handoff-service.js +304 -0
  448. package/dist/services/operate/planning-handoff-service.js.map +1 -0
  449. package/dist/services/operate/project-transaction-lock.d.ts +6 -0
  450. package/dist/services/operate/project-transaction-lock.d.ts.map +1 -0
  451. package/dist/services/operate/project-transaction-lock.js +146 -0
  452. package/dist/services/operate/project-transaction-lock.js.map +1 -0
  453. package/dist/services/operate/recovery-service.d.ts +16 -0
  454. package/dist/services/operate/recovery-service.d.ts.map +1 -0
  455. package/dist/services/operate/recovery-service.js +59 -0
  456. package/dist/services/operate/recovery-service.js.map +1 -0
  457. package/dist/services/operate/replay-safe-retry-service.d.ts +21 -0
  458. package/dist/services/operate/replay-safe-retry-service.d.ts.map +1 -0
  459. package/dist/services/operate/replay-safe-retry-service.js +66 -0
  460. package/dist/services/operate/replay-safe-retry-service.js.map +1 -0
  461. package/dist/services/operate/repository-read-service.d.ts +13 -0
  462. package/dist/services/operate/repository-read-service.d.ts.map +1 -0
  463. package/dist/services/operate/repository-read-service.js +153 -0
  464. package/dist/services/operate/repository-read-service.js.map +1 -0
  465. package/dist/services/operate/review-lifecycle-service.d.ts +50 -0
  466. package/dist/services/operate/review-lifecycle-service.d.ts.map +1 -0
  467. package/dist/services/operate/review-lifecycle-service.js +63 -0
  468. package/dist/services/operate/review-lifecycle-service.js.map +1 -0
  469. package/dist/services/operate/review-read-gateway.d.ts +21 -0
  470. package/dist/services/operate/review-read-gateway.d.ts.map +1 -0
  471. package/dist/services/operate/review-read-gateway.js +119 -0
  472. package/dist/services/operate/review-read-gateway.js.map +1 -0
  473. package/dist/services/operate/screened-evidence-service.d.ts +24 -0
  474. package/dist/services/operate/screened-evidence-service.d.ts.map +1 -0
  475. package/dist/services/operate/screened-evidence-service.js +186 -0
  476. package/dist/services/operate/screened-evidence-service.js.map +1 -0
  477. package/dist/services/operate/search-hit-contract.d.ts +11 -0
  478. package/dist/services/operate/search-hit-contract.d.ts.map +1 -0
  479. package/dist/services/operate/search-hit-contract.js +29 -0
  480. package/dist/services/operate/search-hit-contract.js.map +1 -0
  481. package/dist/services/operate/session-capability.d.ts +61 -0
  482. package/dist/services/operate/session-capability.d.ts.map +1 -0
  483. package/dist/services/operate/session-capability.js +124 -0
  484. package/dist/services/operate/session-capability.js.map +1 -0
  485. package/dist/services/operate/spec-operating-origin-service.d.ts +60 -0
  486. package/dist/services/operate/spec-operating-origin-service.d.ts.map +1 -0
  487. package/dist/services/operate/spec-operating-origin-service.js +401 -0
  488. package/dist/services/operate/spec-operating-origin-service.js.map +1 -0
  489. package/dist/services/operate/storage-layout.d.ts +82 -0
  490. package/dist/services/operate/storage-layout.d.ts.map +1 -0
  491. package/dist/services/operate/storage-layout.js +1244 -0
  492. package/dist/services/operate/storage-layout.js.map +1 -0
  493. package/dist/services/operate/storage-migration-service.d.ts +15 -0
  494. package/dist/services/operate/storage-migration-service.d.ts.map +1 -0
  495. package/dist/services/operate/storage-migration-service.js +27 -0
  496. package/dist/services/operate/storage-migration-service.js.map +1 -0
  497. package/dist/services/operate/store.d.ts +132 -0
  498. package/dist/services/operate/store.d.ts.map +1 -0
  499. package/dist/services/operate/store.js +1344 -0
  500. package/dist/services/operate/store.js.map +1 -0
  501. package/dist/services/pipeline-package-service.d.ts +93 -2
  502. package/dist/services/pipeline-package-service.d.ts.map +1 -1
  503. package/dist/services/pipeline-package-service.js +867 -7
  504. package/dist/services/pipeline-package-service.js.map +1 -1
  505. package/dist/services/planning-id-service.d.ts +8 -0
  506. package/dist/services/planning-id-service.d.ts.map +1 -0
  507. package/dist/services/planning-id-service.js +114 -0
  508. package/dist/services/planning-id-service.js.map +1 -0
  509. package/dist/services/provenance-service.d.ts +33 -1
  510. package/dist/services/provenance-service.d.ts.map +1 -1
  511. package/dist/services/provenance-service.js +104 -8
  512. package/dist/services/provenance-service.js.map +1 -1
  513. package/dist/services/runtime-manager/doctor.d.ts +22 -0
  514. package/dist/services/runtime-manager/doctor.d.ts.map +1 -0
  515. package/dist/services/runtime-manager/doctor.js +74 -0
  516. package/dist/services/runtime-manager/doctor.js.map +1 -0
  517. package/dist/services/runtime-manager/global-state.d.ts +47 -0
  518. package/dist/services/runtime-manager/global-state.d.ts.map +1 -0
  519. package/dist/services/runtime-manager/global-state.js +59 -0
  520. package/dist/services/runtime-manager/global-state.js.map +1 -0
  521. package/dist/services/runtime-manager/install-plan.d.ts +37 -0
  522. package/dist/services/runtime-manager/install-plan.d.ts.map +1 -0
  523. package/dist/services/runtime-manager/install-plan.js +91 -0
  524. package/dist/services/runtime-manager/install-plan.js.map +1 -0
  525. package/dist/services/runtime-manager/inventory.d.ts +29 -0
  526. package/dist/services/runtime-manager/inventory.d.ts.map +1 -0
  527. package/dist/services/runtime-manager/inventory.js +46 -0
  528. package/dist/services/runtime-manager/inventory.js.map +1 -0
  529. package/dist/services/runtime-manager-service.d.ts +16 -71
  530. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  531. package/dist/services/runtime-manager-service.js +1288 -505
  532. package/dist/services/runtime-manager-service.js.map +1 -1
  533. package/dist/services/spec-service.d.ts +213 -39
  534. package/dist/services/spec-service.d.ts.map +1 -1
  535. package/dist/services/spec-service.js +938 -171
  536. package/dist/services/spec-service.js.map +1 -1
  537. package/dist/services/template-service.d.ts.map +1 -1
  538. package/dist/services/template-service.js +1 -0
  539. package/dist/services/template-service.js.map +1 -1
  540. package/dist/templates/quick/quick-task.md.hbs +6 -0
  541. package/dist/templates/rules/claude/CLAUDE.md.hbs +3 -111
  542. package/dist/templates/rules/codex/AGENTS.md.hbs +2 -92
  543. package/dist/templates/rules/cursor/create-task-list.mdc.hbs +1 -1
  544. package/dist/templates/rules/cursor/implement-task-list.mdc.hbs +5 -83
  545. package/dist/templates/rules/cursor/openplanr.mdc.hbs +12 -0
  546. package/dist/templates/rules/shared/host-native-guidance.md.hbs +12 -0
  547. package/dist/templates/rules/shared/implementation-guidance.md.hbs +44 -0
  548. package/dist/templates/spec/spec-shaped.md.hbs +66 -22
  549. package/dist/templates/spec/spec.md.hbs +46 -23
  550. package/dist/templates/spec/story.md.hbs +15 -4
  551. package/dist/templates/spec/task.md.hbs +53 -5
  552. package/dist/utils/constants.d.ts +1 -1
  553. package/dist/utils/constants.js +1 -1
  554. package/dist/utils/logger.d.ts +0 -3
  555. package/dist/utils/logger.d.ts.map +1 -1
  556. package/dist/utils/logger.js +0 -6
  557. package/dist/utils/logger.js.map +1 -1
  558. package/docs/ARTIFACT_REVIEW.md +110 -0
  559. package/docs/CLI.md +1216 -0
  560. package/docs/CROSS_RUNTIME_SETUP.md +168 -0
  561. package/docs/TROUBLESHOOTING.md +227 -0
  562. package/lib/dashboard-verifier.d.mts +29 -0
  563. package/lib/dashboard-verifier.mjs +307 -0
  564. package/lib/host-packages/adapter-registry.json +44 -0
  565. package/lib/host-packages/claude/.claude-plugin/marketplace.json +20 -0
  566. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +9 -0
  567. package/lib/host-packages/claude/openplanr/.openplanr-content.json +1179 -0
  568. package/lib/host-packages/claude/openplanr/agents/planr-backend.md +66 -0
  569. package/lib/host-packages/claude/openplanr/agents/planr-database.md +165 -0
  570. package/lib/host-packages/claude/openplanr/agents/planr-designer.md +57 -0
  571. package/lib/host-packages/claude/openplanr/agents/planr-devops.md +57 -0
  572. package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +63 -0
  573. package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +29 -0
  574. package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +69 -0
  575. package/lib/host-packages/claude/openplanr/agents/planr-qa.md +162 -0
  576. package/lib/host-packages/claude/openplanr/agents/planr-specification.md +124 -0
  577. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +93 -0
  578. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +90 -0
  579. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +55 -0
  580. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +67 -0
  581. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +94 -0
  582. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/qa.md +17 -0
  583. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +111 -0
  584. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/contract-create-modify-preserve.md +17 -0
  585. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-craft-rubric.md +51 -0
  586. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-principles.md +43 -0
  587. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-spec-template.md +88 -0
  588. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/task-context-resolution.md +60 -0
  589. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-backend.md +26 -0
  590. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-frontend.md +27 -0
  591. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +96 -0
  592. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +83 -0
  593. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +55 -0
  594. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +67 -0
  595. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +96 -0
  596. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/qa.md +17 -0
  597. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +112 -0
  598. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/backend/nestjs.md +130 -0
  599. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +122 -0
  600. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/prisma.md +155 -0
  601. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/devops/docker-compose.md +140 -0
  602. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/frontend/nextjs.md +123 -0
  603. package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +54 -0
  604. package/lib/host-packages/claude/openplanr/skills/artifact/openplanr.skill.json +48 -0
  605. package/lib/host-packages/claude/openplanr/skills/artifact/references/company-review.md +18 -0
  606. package/lib/host-packages/claude/openplanr/skills/artifact/references/design-sharing.md +51 -0
  607. package/lib/host-packages/claude/openplanr/skills/browser-qa/SKILL.md +34 -0
  608. package/lib/host-packages/claude/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
  609. package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +47 -0
  610. package/lib/host-packages/claude/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
  611. package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
  612. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
  613. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
  614. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
  615. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
  616. package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +101 -0
  617. package/lib/host-packages/claude/openplanr/skills/chair-review/openplanr.skill.json +70 -0
  618. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
  619. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
  620. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
  621. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
  622. package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +86 -0
  623. package/lib/host-packages/claude/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
  624. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
  625. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
  626. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
  627. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
  628. package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +46 -0
  629. package/lib/host-packages/claude/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
  630. package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
  631. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
  632. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
  633. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
  634. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
  635. package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +45 -0
  636. package/lib/host-packages/claude/openplanr/skills/coo-review/openplanr.skill.json +81 -0
  637. package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
  638. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
  639. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
  640. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
  641. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
  642. package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +48 -0
  643. package/lib/host-packages/claude/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
  644. package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
  645. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
  646. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
  647. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
  648. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
  649. package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +47 -0
  650. package/lib/host-packages/claude/openplanr/skills/cto-review/openplanr.skill.json +81 -0
  651. package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
  652. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
  653. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
  654. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
  655. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
  656. package/lib/host-packages/claude/openplanr/skills/dashboard/SKILL.md +20 -0
  657. package/lib/host-packages/claude/openplanr/skills/dashboard/openplanr.skill.json +26 -0
  658. package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +73 -0
  659. package/lib/host-packages/claude/openplanr/skills/design/openplanr.skill.json +466 -0
  660. package/lib/host-packages/claude/openplanr/skills/design/references/craft.md +68 -0
  661. package/lib/host-packages/claude/openplanr/skills/design/references/design-spec-template.md +88 -0
  662. package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +33 -0
  663. package/lib/host-packages/claude/openplanr/skills/design/references/discovery.md +53 -0
  664. package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +105 -0
  665. package/lib/host-packages/claude/openplanr/skills/design/references/handoff.md +47 -0
  666. package/lib/host-packages/claude/openplanr/skills/design/references/review.md +88 -0
  667. package/lib/host-packages/claude/openplanr/skills/design/references/team-review.md +131 -0
  668. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +93 -0
  669. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +306 -0
  670. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
  671. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
  672. package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +17323 -0
  673. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
  674. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
  675. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  676. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  677. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  678. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  679. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  680. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  681. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  682. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
  683. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  684. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  685. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  686. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  687. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  688. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  689. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  690. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  691. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  692. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  693. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  694. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  695. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  696. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  697. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  698. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  699. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  700. package/lib/host-packages/claude/openplanr/skills/design-loop/SKILL.md +58 -0
  701. package/lib/host-packages/claude/openplanr/skills/design-loop/openplanr.skill.json +466 -0
  702. package/lib/host-packages/claude/openplanr/skills/design-loop/references/craft.md +68 -0
  703. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
  704. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +33 -0
  705. package/lib/host-packages/claude/openplanr/skills/design-loop/references/discovery.md +53 -0
  706. package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +105 -0
  707. package/lib/host-packages/claude/openplanr/skills/design-loop/references/handoff.md +47 -0
  708. package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +88 -0
  709. package/lib/host-packages/claude/openplanr/skills/design-loop/references/team-review.md +131 -0
  710. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +93 -0
  711. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
  712. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
  713. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
  714. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
  715. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
  716. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
  717. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  718. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  719. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  720. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  721. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  722. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  723. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  724. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  725. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  726. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  727. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  728. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  729. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  730. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  731. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  732. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  733. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  734. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  735. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  736. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  737. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  738. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  739. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  740. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  741. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  742. package/lib/host-packages/claude/openplanr/skills/design-review/SKILL.md +54 -0
  743. package/lib/host-packages/claude/openplanr/skills/design-review/openplanr.skill.json +466 -0
  744. package/lib/host-packages/claude/openplanr/skills/design-review/references/craft.md +68 -0
  745. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-spec-template.md +88 -0
  746. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +33 -0
  747. package/lib/host-packages/claude/openplanr/skills/design-review/references/discovery.md +53 -0
  748. package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +105 -0
  749. package/lib/host-packages/claude/openplanr/skills/design-review/references/handoff.md +47 -0
  750. package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +88 -0
  751. package/lib/host-packages/claude/openplanr/skills/design-review/references/team-review.md +131 -0
  752. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +93 -0
  753. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
  754. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
  755. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
  756. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +17323 -0
  757. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
  758. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
  759. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  760. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  761. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  762. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  763. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  764. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  765. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  766. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
  767. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  768. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  769. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  770. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  771. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  772. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  773. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  774. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  775. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  776. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  777. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  778. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  779. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  780. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  781. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  782. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  783. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  784. package/lib/host-packages/claude/openplanr/skills/diagram/SKILL.md +65 -0
  785. package/lib/host-packages/claude/openplanr/skills/diagram/openplanr.skill.json +59 -0
  786. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-document.md +86 -0
  787. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
  788. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
  789. package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +40 -0
  790. package/lib/host-packages/claude/openplanr/skills/doctor/openplanr.skill.json +37 -0
  791. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +106 -0
  792. package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +31 -0
  793. package/lib/host-packages/claude/openplanr/skills/investigate/openplanr.skill.json +26 -0
  794. package/lib/host-packages/claude/openplanr/skills/land/SKILL.md +33 -0
  795. package/lib/host-packages/claude/openplanr/skills/land/openplanr.skill.json +26 -0
  796. package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +181 -0
  797. package/lib/host-packages/claude/openplanr/skills/operate/openplanr.skill.json +70 -0
  798. package/lib/host-packages/claude/openplanr/skills/operate/scripts/errors.mjs +8 -0
  799. package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
  800. package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
  801. package/lib/host-packages/claude/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
  802. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +106 -0
  803. package/lib/host-packages/claude/openplanr/skills/plan/openplanr.skill.json +389 -0
  804. package/lib/host-packages/claude/openplanr/skills/plan/references/artifact-contract.md +39 -0
  805. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
  806. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
  807. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
  808. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +17323 -0
  809. package/lib/host-packages/claude/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
  810. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
  811. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
  812. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  813. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  814. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  815. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  816. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  817. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  818. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  819. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
  820. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  821. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  822. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  823. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  824. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  825. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  826. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  827. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  828. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  829. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  830. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  831. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  832. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  833. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  834. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  835. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  836. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  837. package/lib/host-packages/claude/openplanr/skills/plan-review/SKILL.md +39 -0
  838. package/lib/host-packages/claude/openplanr/skills/plan-review/openplanr.skill.json +26 -0
  839. package/lib/host-packages/claude/openplanr/skills/release/SKILL.md +180 -0
  840. package/lib/host-packages/claude/openplanr/skills/release/assets/changelog-template.md +18 -0
  841. package/lib/host-packages/claude/openplanr/skills/release/assets/profile-template.md +45 -0
  842. package/lib/host-packages/claude/openplanr/skills/release/openplanr.skill.json +92 -0
  843. package/lib/host-packages/claude/openplanr/skills/release/references/cadence.md +92 -0
  844. package/lib/host-packages/claude/openplanr/skills/release/references/release-notes.md +127 -0
  845. package/lib/host-packages/claude/openplanr/skills/release/references/schemes.md +103 -0
  846. package/lib/host-packages/claude/openplanr/skills/release/scripts/collect_changes.sh +85 -0
  847. package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +80 -0
  848. package/lib/host-packages/claude/openplanr/skills/ship/openplanr.skill.json +48 -0
  849. package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +14 -0
  850. package/lib/host-packages/claude/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
  851. package/lib/host-packages/claude/openplanr/skills/spec/SKILL.md +53 -0
  852. package/lib/host-packages/claude/openplanr/skills/spec/openplanr.skill.json +37 -0
  853. package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +32 -0
  854. package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +21 -0
  855. package/lib/host-packages/claude/openplanr/skills/status/openplanr.skill.json +26 -0
  856. package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +30 -0
  857. package/lib/host-packages/claude/openplanr/skills/sync/openplanr.skill.json +37 -0
  858. package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +230 -0
  859. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +939 -0
  860. package/lib/host-packages/cursor/openplanr/manifest.json +32 -0
  861. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/company-review.md +18 -0
  862. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/design-sharing.md +51 -0
  863. package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +53 -0
  864. package/lib/host-packages/cursor/openplanr/rules/planr-browser-qa.mdc +34 -0
  865. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +111 -0
  866. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/errors.mjs +8 -0
  867. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-contract.mjs +438 -0
  868. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-note.mjs +595 -0
  869. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/validate-note.mjs +31 -0
  870. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review.mdc +45 -0
  871. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/errors.mjs +8 -0
  872. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-contract.mjs +438 -0
  873. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-note.mjs +595 -0
  874. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/validate-note.mjs +31 -0
  875. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +99 -0
  876. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/errors.mjs +8 -0
  877. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-contract.mjs +438 -0
  878. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-note.mjs +595 -0
  879. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/validate-note.mjs +31 -0
  880. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +84 -0
  881. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +111 -0
  882. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/errors.mjs +8 -0
  883. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-contract.mjs +438 -0
  884. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-note.mjs +595 -0
  885. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/validate-note.mjs +31 -0
  886. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review.mdc +44 -0
  887. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +111 -0
  888. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/errors.mjs +8 -0
  889. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-contract.mjs +438 -0
  890. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-note.mjs +595 -0
  891. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/validate-note.mjs +31 -0
  892. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review.mdc +43 -0
  893. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +111 -0
  894. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/errors.mjs +8 -0
  895. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-contract.mjs +438 -0
  896. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-note.mjs +595 -0
  897. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/validate-note.mjs +31 -0
  898. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review.mdc +46 -0
  899. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +111 -0
  900. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/errors.mjs +8 -0
  901. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-contract.mjs +438 -0
  902. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-note.mjs +595 -0
  903. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/validate-note.mjs +31 -0
  904. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review.mdc +45 -0
  905. package/lib/host-packages/cursor/openplanr/rules/planr-dashboard.mdc +19 -0
  906. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/craft.md +68 -0
  907. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-spec-template.md +88 -0
  908. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +33 -0
  909. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/discovery.md +53 -0
  910. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +105 -0
  911. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/handoff.md +47 -0
  912. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +88 -0
  913. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/team-review.md +131 -0
  914. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +93 -0
  915. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +306 -0
  916. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-context.schema.json +191 -0
  917. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-handoff.schema.json +407 -0
  918. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +17323 -0
  919. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/entities.txt +13 -0
  920. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/parse5.txt +21 -0
  921. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  922. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  923. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  924. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  925. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  926. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  927. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  928. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +115 -0
  929. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  930. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  931. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  932. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  933. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  934. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  935. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  936. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  937. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  938. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  939. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  940. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  941. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  942. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  943. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  944. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  945. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  946. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/craft.md +68 -0
  947. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-spec-template.md +88 -0
  948. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +33 -0
  949. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/discovery.md +53 -0
  950. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +105 -0
  951. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/handoff.md +47 -0
  952. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +88 -0
  953. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/team-review.md +131 -0
  954. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +93 -0
  955. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +306 -0
  956. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-context.schema.json +191 -0
  957. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-handoff.schema.json +407 -0
  958. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +17323 -0
  959. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/entities.txt +13 -0
  960. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/parse5.txt +21 -0
  961. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  962. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  963. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  964. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  965. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  966. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  967. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  968. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  969. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  970. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  971. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  972. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  973. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  974. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  975. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  976. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  977. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  978. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  979. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  980. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  981. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  982. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  983. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  984. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  985. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  986. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop.mdc +57 -0
  987. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/craft.md +68 -0
  988. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-spec-template.md +88 -0
  989. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +33 -0
  990. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/discovery.md +53 -0
  991. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +105 -0
  992. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/handoff.md +47 -0
  993. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +88 -0
  994. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/team-review.md +131 -0
  995. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +93 -0
  996. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +306 -0
  997. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-context.schema.json +191 -0
  998. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-handoff.schema.json +407 -0
  999. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +17323 -0
  1000. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/entities.txt +13 -0
  1001. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/parse5.txt +21 -0
  1002. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1003. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1004. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1005. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1006. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1007. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1008. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1009. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +115 -0
  1010. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1011. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1012. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1013. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1014. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1015. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1016. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1017. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1018. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1019. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1020. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1021. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1022. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1023. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1024. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1025. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1026. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1027. package/lib/host-packages/cursor/openplanr/rules/planr-design-review.mdc +53 -0
  1028. package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +72 -0
  1029. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-document.md +86 -0
  1030. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-fidelity.md +19 -0
  1031. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-intent-to-ir.md +22 -0
  1032. package/lib/host-packages/cursor/openplanr/rules/planr-diagram.mdc +64 -0
  1033. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +106 -0
  1034. package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +39 -0
  1035. package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +31 -0
  1036. package/lib/host-packages/cursor/openplanr/rules/planr-land.mdc +32 -0
  1037. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/errors.mjs +8 -0
  1038. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-contract.mjs +438 -0
  1039. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-note.mjs +595 -0
  1040. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/validate-note.mjs +31 -0
  1041. package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +180 -0
  1042. package/lib/host-packages/cursor/openplanr/rules/planr-plan/references/artifact-contract.md +39 -0
  1043. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +306 -0
  1044. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-context.schema.json +191 -0
  1045. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-handoff.schema.json +407 -0
  1046. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +17323 -0
  1047. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/planning-ids.mjs +120 -0
  1048. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/entities.txt +13 -0
  1049. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/parse5.txt +21 -0
  1050. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1051. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1052. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1053. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1054. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1055. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1056. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1057. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +115 -0
  1058. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1059. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1060. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1061. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1062. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1063. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1064. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1065. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1066. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1067. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1068. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1069. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1070. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1071. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1072. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1073. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1074. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1075. package/lib/host-packages/cursor/openplanr/rules/planr-plan-review.mdc +38 -0
  1076. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +105 -0
  1077. package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/changelog-template.md +18 -0
  1078. package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/profile-template.md +45 -0
  1079. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/cadence.md +92 -0
  1080. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/release-notes.md +127 -0
  1081. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/schemes.md +103 -0
  1082. package/lib/host-packages/cursor/openplanr/rules/planr-release/scripts/collect_changes.sh +85 -0
  1083. package/lib/host-packages/cursor/openplanr/rules/planr-release.mdc +179 -0
  1084. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +14 -0
  1085. package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/discover-verification.mjs +107 -0
  1086. package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +79 -0
  1087. package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +32 -0
  1088. package/lib/host-packages/cursor/openplanr/rules/planr-spec.mdc +52 -0
  1089. package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +20 -0
  1090. package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +230 -0
  1091. package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +29 -0
  1092. package/lib/host-packages/openai/.claude-plugin/marketplace.json +19 -0
  1093. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +10 -0
  1094. package/lib/host-packages/openai/openplanr/.openplanr-content.json +1139 -0
  1095. package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +54 -0
  1096. package/lib/host-packages/openai/openplanr/skills/artifact/agents/openai.yaml +6 -0
  1097. package/lib/host-packages/openai/openplanr/skills/artifact/openplanr.skill.json +48 -0
  1098. package/lib/host-packages/openai/openplanr/skills/artifact/references/company-review.md +18 -0
  1099. package/lib/host-packages/openai/openplanr/skills/artifact/references/design-sharing.md +51 -0
  1100. package/lib/host-packages/openai/openplanr/skills/browser-qa/SKILL.md +34 -0
  1101. package/lib/host-packages/openai/openplanr/skills/browser-qa/agents/openai.yaml +6 -0
  1102. package/lib/host-packages/openai/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
  1103. package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +47 -0
  1104. package/lib/host-packages/openai/openplanr/skills/ceo-review/agents/openai.yaml +6 -0
  1105. package/lib/host-packages/openai/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
  1106. package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
  1107. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
  1108. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
  1109. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
  1110. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
  1111. package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +101 -0
  1112. package/lib/host-packages/openai/openplanr/skills/chair-review/agents/openai.yaml +6 -0
  1113. package/lib/host-packages/openai/openplanr/skills/chair-review/openplanr.skill.json +70 -0
  1114. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
  1115. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
  1116. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
  1117. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
  1118. package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +86 -0
  1119. package/lib/host-packages/openai/openplanr/skills/challenger-review/agents/openai.yaml +6 -0
  1120. package/lib/host-packages/openai/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
  1121. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
  1122. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
  1123. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
  1124. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
  1125. package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +46 -0
  1126. package/lib/host-packages/openai/openplanr/skills/cmo-review/agents/openai.yaml +6 -0
  1127. package/lib/host-packages/openai/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
  1128. package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
  1129. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
  1130. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
  1131. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
  1132. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
  1133. package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +45 -0
  1134. package/lib/host-packages/openai/openplanr/skills/coo-review/agents/openai.yaml +6 -0
  1135. package/lib/host-packages/openai/openplanr/skills/coo-review/openplanr.skill.json +81 -0
  1136. package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
  1137. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
  1138. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
  1139. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
  1140. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
  1141. package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +48 -0
  1142. package/lib/host-packages/openai/openplanr/skills/cpo-review/agents/openai.yaml +6 -0
  1143. package/lib/host-packages/openai/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
  1144. package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
  1145. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
  1146. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
  1147. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
  1148. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
  1149. package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +47 -0
  1150. package/lib/host-packages/openai/openplanr/skills/cto-review/agents/openai.yaml +6 -0
  1151. package/lib/host-packages/openai/openplanr/skills/cto-review/openplanr.skill.json +81 -0
  1152. package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
  1153. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
  1154. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
  1155. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
  1156. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
  1157. package/lib/host-packages/openai/openplanr/skills/dashboard/SKILL.md +20 -0
  1158. package/lib/host-packages/openai/openplanr/skills/dashboard/agents/openai.yaml +6 -0
  1159. package/lib/host-packages/openai/openplanr/skills/dashboard/openplanr.skill.json +26 -0
  1160. package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +73 -0
  1161. package/lib/host-packages/openai/openplanr/skills/design/agents/openai.yaml +6 -0
  1162. package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +466 -0
  1163. package/lib/host-packages/openai/openplanr/skills/design/references/craft.md +68 -0
  1164. package/lib/host-packages/openai/openplanr/skills/design/references/design-spec-template.md +88 -0
  1165. package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +33 -0
  1166. package/lib/host-packages/openai/openplanr/skills/design/references/discovery.md +53 -0
  1167. package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +105 -0
  1168. package/lib/host-packages/openai/openplanr/skills/design/references/handoff.md +47 -0
  1169. package/lib/host-packages/openai/openplanr/skills/design/references/review.md +88 -0
  1170. package/lib/host-packages/openai/openplanr/skills/design/references/team-review.md +131 -0
  1171. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +93 -0
  1172. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +306 -0
  1173. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
  1174. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
  1175. package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +17323 -0
  1176. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
  1177. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
  1178. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1179. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1180. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1181. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1182. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1183. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1184. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1185. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
  1186. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1187. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1188. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1189. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1190. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1191. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1192. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1193. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1194. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1195. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1196. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1197. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1198. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1199. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1200. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1201. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1202. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1203. package/lib/host-packages/openai/openplanr/skills/design-loop/SKILL.md +58 -0
  1204. package/lib/host-packages/openai/openplanr/skills/design-loop/agents/openai.yaml +6 -0
  1205. package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +466 -0
  1206. package/lib/host-packages/openai/openplanr/skills/design-loop/references/craft.md +68 -0
  1207. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
  1208. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +33 -0
  1209. package/lib/host-packages/openai/openplanr/skills/design-loop/references/discovery.md +53 -0
  1210. package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +105 -0
  1211. package/lib/host-packages/openai/openplanr/skills/design-loop/references/handoff.md +47 -0
  1212. package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +88 -0
  1213. package/lib/host-packages/openai/openplanr/skills/design-loop/references/team-review.md +131 -0
  1214. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +93 -0
  1215. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
  1216. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
  1217. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
  1218. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
  1219. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
  1220. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
  1221. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1222. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1223. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1224. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1225. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1226. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1227. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1228. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  1229. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1230. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1231. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1232. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1233. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1234. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1235. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1236. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1237. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1238. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1239. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1240. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1241. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1242. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1243. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1244. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1245. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1246. package/lib/host-packages/openai/openplanr/skills/design-review/SKILL.md +54 -0
  1247. package/lib/host-packages/openai/openplanr/skills/design-review/agents/openai.yaml +6 -0
  1248. package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +466 -0
  1249. package/lib/host-packages/openai/openplanr/skills/design-review/references/craft.md +68 -0
  1250. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-spec-template.md +88 -0
  1251. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +33 -0
  1252. package/lib/host-packages/openai/openplanr/skills/design-review/references/discovery.md +53 -0
  1253. package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +105 -0
  1254. package/lib/host-packages/openai/openplanr/skills/design-review/references/handoff.md +47 -0
  1255. package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +88 -0
  1256. package/lib/host-packages/openai/openplanr/skills/design-review/references/team-review.md +131 -0
  1257. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +93 -0
  1258. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
  1259. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
  1260. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
  1261. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +17323 -0
  1262. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
  1263. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
  1264. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1265. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1266. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1267. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1268. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1269. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1270. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1271. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
  1272. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1273. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1274. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1275. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1276. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1277. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1278. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1279. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1280. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1281. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1282. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1283. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1284. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1285. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1286. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1287. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1288. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1289. package/lib/host-packages/openai/openplanr/skills/diagram/SKILL.md +65 -0
  1290. package/lib/host-packages/openai/openplanr/skills/diagram/agents/openai.yaml +6 -0
  1291. package/lib/host-packages/openai/openplanr/skills/diagram/openplanr.skill.json +59 -0
  1292. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-document.md +86 -0
  1293. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
  1294. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
  1295. package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +40 -0
  1296. package/lib/host-packages/openai/openplanr/skills/doctor/agents/openai.yaml +6 -0
  1297. package/lib/host-packages/openai/openplanr/skills/doctor/openplanr.skill.json +37 -0
  1298. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +106 -0
  1299. package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +31 -0
  1300. package/lib/host-packages/openai/openplanr/skills/investigate/agents/openai.yaml +6 -0
  1301. package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +26 -0
  1302. package/lib/host-packages/openai/openplanr/skills/land/SKILL.md +33 -0
  1303. package/lib/host-packages/openai/openplanr/skills/land/agents/openai.yaml +6 -0
  1304. package/lib/host-packages/openai/openplanr/skills/land/openplanr.skill.json +26 -0
  1305. package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +181 -0
  1306. package/lib/host-packages/openai/openplanr/skills/operate/agents/openai.yaml +6 -0
  1307. package/lib/host-packages/openai/openplanr/skills/operate/openplanr.skill.json +70 -0
  1308. package/lib/host-packages/openai/openplanr/skills/operate/scripts/errors.mjs +8 -0
  1309. package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
  1310. package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
  1311. package/lib/host-packages/openai/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
  1312. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +106 -0
  1313. package/lib/host-packages/openai/openplanr/skills/plan/agents/openai.yaml +6 -0
  1314. package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +389 -0
  1315. package/lib/host-packages/openai/openplanr/skills/plan/references/artifact-contract.md +39 -0
  1316. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
  1317. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
  1318. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
  1319. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +17323 -0
  1320. package/lib/host-packages/openai/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
  1321. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
  1322. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
  1323. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1324. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1325. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1326. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1327. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1328. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1329. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1330. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
  1331. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1332. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1333. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1334. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1335. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1336. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1337. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1338. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1339. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1340. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1341. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1342. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1343. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1344. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1345. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1346. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1347. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1348. package/lib/host-packages/openai/openplanr/skills/plan-review/SKILL.md +39 -0
  1349. package/lib/host-packages/openai/openplanr/skills/plan-review/agents/openai.yaml +6 -0
  1350. package/lib/host-packages/openai/openplanr/skills/plan-review/openplanr.skill.json +26 -0
  1351. package/lib/host-packages/openai/openplanr/skills/release/SKILL.md +180 -0
  1352. package/lib/host-packages/openai/openplanr/skills/release/agents/openai.yaml +6 -0
  1353. package/lib/host-packages/openai/openplanr/skills/release/assets/changelog-template.md +18 -0
  1354. package/lib/host-packages/openai/openplanr/skills/release/assets/profile-template.md +45 -0
  1355. package/lib/host-packages/openai/openplanr/skills/release/openplanr.skill.json +92 -0
  1356. package/lib/host-packages/openai/openplanr/skills/release/references/cadence.md +92 -0
  1357. package/lib/host-packages/openai/openplanr/skills/release/references/release-notes.md +127 -0
  1358. package/lib/host-packages/openai/openplanr/skills/release/references/schemes.md +103 -0
  1359. package/lib/host-packages/openai/openplanr/skills/release/scripts/collect_changes.sh +85 -0
  1360. package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +80 -0
  1361. package/lib/host-packages/openai/openplanr/skills/ship/agents/openai.yaml +6 -0
  1362. package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +48 -0
  1363. package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +14 -0
  1364. package/lib/host-packages/openai/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
  1365. package/lib/host-packages/openai/openplanr/skills/spec/SKILL.md +53 -0
  1366. package/lib/host-packages/openai/openplanr/skills/spec/agents/openai.yaml +6 -0
  1367. package/lib/host-packages/openai/openplanr/skills/spec/openplanr.skill.json +37 -0
  1368. package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +32 -0
  1369. package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +21 -0
  1370. package/lib/host-packages/openai/openplanr/skills/status/agents/openai.yaml +6 -0
  1371. package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +26 -0
  1372. package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +30 -0
  1373. package/lib/host-packages/openai/openplanr/skills/sync/agents/openai.yaml +6 -0
  1374. package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +37 -0
  1375. package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +230 -0
  1376. package/lib/integrations.d.mts +43 -0
  1377. package/lib/integrations.mjs +230 -0
  1378. package/lib/skill-runtime/errors.mjs +8 -0
  1379. package/lib/skill-runtime/operate-review-contract.mjs +438 -0
  1380. package/lib/skill-runtime/operate-review-note.mjs +595 -0
  1381. package/package.json +56 -18
  1382. package/dist/ai/codebase/context-builder.d.ts +0 -50
  1383. package/dist/ai/codebase/context-builder.d.ts.map +0 -1
  1384. package/dist/ai/codebase/context-builder.js +0 -281
  1385. package/dist/ai/codebase/context-builder.js.map +0 -1
  1386. package/dist/ai/codebase/file-reader.d.ts +0 -22
  1387. package/dist/ai/codebase/file-reader.d.ts.map +0 -1
  1388. package/dist/ai/codebase/file-reader.js +0 -144
  1389. package/dist/ai/codebase/file-reader.js.map +0 -1
  1390. package/dist/ai/codebase/index.d.ts +0 -7
  1391. package/dist/ai/codebase/index.d.ts.map +0 -1
  1392. package/dist/ai/codebase/index.js +0 -7
  1393. package/dist/ai/codebase/index.js.map +0 -1
  1394. package/dist/ai/codebase/pattern-rules.d.ts +0 -28
  1395. package/dist/ai/codebase/pattern-rules.d.ts.map +0 -1
  1396. package/dist/ai/codebase/pattern-rules.js +0 -186
  1397. package/dist/ai/codebase/pattern-rules.js.map +0 -1
  1398. package/dist/ai/codebase/rules-reader.d.ts +0 -14
  1399. package/dist/ai/codebase/rules-reader.d.ts.map +0 -1
  1400. package/dist/ai/codebase/rules-reader.js +0 -25
  1401. package/dist/ai/codebase/rules-reader.js.map +0 -1
  1402. package/dist/ai/codebase/stack-detector.d.ts +0 -18
  1403. package/dist/ai/codebase/stack-detector.d.ts.map +0 -1
  1404. package/dist/ai/codebase/stack-detector.js +0 -173
  1405. package/dist/ai/codebase/stack-detector.js.map +0 -1
  1406. package/dist/ai/codebase/tree-generator.d.ts +0 -8
  1407. package/dist/ai/codebase/tree-generator.d.ts.map +0 -1
  1408. package/dist/ai/codebase/tree-generator.js +0 -84
  1409. package/dist/ai/codebase/tree-generator.js.map +0 -1
  1410. package/dist/ai/errors.d.ts +0 -22
  1411. package/dist/ai/errors.d.ts.map +0 -1
  1412. package/dist/ai/errors.js +0 -72
  1413. package/dist/ai/errors.js.map +0 -1
  1414. package/dist/ai/index.d.ts +0 -11
  1415. package/dist/ai/index.d.ts.map +0 -1
  1416. package/dist/ai/index.js +0 -10
  1417. package/dist/ai/index.js.map +0 -1
  1418. package/dist/ai/prompts/prompt-builder.d.ts +0 -134
  1419. package/dist/ai/prompts/prompt-builder.d.ts.map +0 -1
  1420. package/dist/ai/prompts/prompt-builder.js +0 -295
  1421. package/dist/ai/prompts/prompt-builder.js.map +0 -1
  1422. package/dist/ai/prompts/system-prompts.d.ts +0 -41
  1423. package/dist/ai/prompts/system-prompts.d.ts.map +0 -1
  1424. package/dist/ai/prompts/system-prompts.js +0 -512
  1425. package/dist/ai/prompts/system-prompts.js.map +0 -1
  1426. package/dist/ai/provider-factory.d.ts +0 -10
  1427. package/dist/ai/provider-factory.d.ts.map +0 -1
  1428. package/dist/ai/provider-factory.js +0 -49
  1429. package/dist/ai/provider-factory.js.map +0 -1
  1430. package/dist/ai/providers/anthropic-provider.d.ts +0 -24
  1431. package/dist/ai/providers/anthropic-provider.d.ts.map +0 -1
  1432. package/dist/ai/providers/anthropic-provider.js +0 -97
  1433. package/dist/ai/providers/anthropic-provider.js.map +0 -1
  1434. package/dist/ai/providers/ollama-provider.d.ts +0 -13
  1435. package/dist/ai/providers/ollama-provider.d.ts.map +0 -1
  1436. package/dist/ai/providers/ollama-provider.js +0 -16
  1437. package/dist/ai/providers/ollama-provider.js.map +0 -1
  1438. package/dist/ai/providers/openai-provider.d.ts +0 -19
  1439. package/dist/ai/providers/openai-provider.d.ts.map +0 -1
  1440. package/dist/ai/providers/openai-provider.js +0 -84
  1441. package/dist/ai/providers/openai-provider.js.map +0 -1
  1442. package/dist/ai/schemas/ai-response-schemas.d.ts +0 -340
  1443. package/dist/ai/schemas/ai-response-schemas.d.ts.map +0 -1
  1444. package/dist/ai/schemas/ai-response-schemas.js +0 -278
  1445. package/dist/ai/schemas/ai-response-schemas.js.map +0 -1
  1446. package/dist/ai/types.d.ts +0 -76
  1447. package/dist/ai/types.d.ts.map +0 -1
  1448. package/dist/ai/types.js +0 -49
  1449. package/dist/ai/types.js.map +0 -1
  1450. package/dist/ai/validation/index.d.ts +0 -2
  1451. package/dist/ai/validation/index.d.ts.map +0 -1
  1452. package/dist/ai/validation/index.js +0 -2
  1453. package/dist/ai/validation/index.js.map +0 -1
  1454. package/dist/ai/validation/task-validator.d.ts +0 -37
  1455. package/dist/ai/validation/task-validator.d.ts.map +0 -1
  1456. package/dist/ai/validation/task-validator.js +0 -81
  1457. package/dist/ai/validation/task-validator.js.map +0 -1
  1458. package/dist/cli/commands/config.d.ts +0 -8
  1459. package/dist/cli/commands/config.d.ts.map +0 -1
  1460. package/dist/cli/commands/config.js +0 -224
  1461. package/dist/cli/commands/config.js.map +0 -1
  1462. package/dist/cli/commands/estimate.d.ts +0 -3
  1463. package/dist/cli/commands/estimate.d.ts.map +0 -1
  1464. package/dist/cli/commands/estimate.js +0 -368
  1465. package/dist/cli/commands/estimate.js.map +0 -1
  1466. package/dist/cli/commands/init.d.ts +0 -9
  1467. package/dist/cli/commands/init.d.ts.map +0 -1
  1468. package/dist/cli/commands/init.js +0 -166
  1469. package/dist/cli/commands/init.js.map +0 -1
  1470. package/dist/cli/commands/pipeline.d.ts +0 -3
  1471. package/dist/cli/commands/pipeline.d.ts.map +0 -1
  1472. package/dist/cli/commands/pipeline.js +0 -59
  1473. package/dist/cli/commands/pipeline.js.map +0 -1
  1474. package/dist/cli/commands/plan.d.ts +0 -15
  1475. package/dist/cli/commands/plan.d.ts.map +0 -1
  1476. package/dist/cli/commands/plan.js +0 -444
  1477. package/dist/cli/commands/plan.js.map +0 -1
  1478. package/dist/cli/commands/refine.d.ts +0 -10
  1479. package/dist/cli/commands/refine.d.ts.map +0 -1
  1480. package/dist/cli/commands/refine.js +0 -226
  1481. package/dist/cli/commands/refine.js.map +0 -1
  1482. package/dist/cli/commands/revise.d.ts +0 -24
  1483. package/dist/cli/commands/revise.d.ts.map +0 -1
  1484. package/dist/cli/commands/revise.js +0 -572
  1485. package/dist/cli/commands/revise.js.map +0 -1
  1486. package/dist/cli/helpers/task-creation.d.ts +0 -89
  1487. package/dist/cli/helpers/task-creation.d.ts.map +0 -1
  1488. package/dist/cli/helpers/task-creation.js +0 -139
  1489. package/dist/cli/helpers/task-creation.js.map +0 -1
  1490. package/dist/services/ai-service.d.ts +0 -77
  1491. package/dist/services/ai-service.d.ts.map +0 -1
  1492. package/dist/services/ai-service.js +0 -241
  1493. package/dist/services/ai-service.js.map +0 -1
  1494. package/dist/services/artifact-gathering.d.ts +0 -55
  1495. package/dist/services/artifact-gathering.d.ts.map +0 -1
  1496. package/dist/services/artifact-gathering.js +0 -147
  1497. package/dist/services/artifact-gathering.js.map +0 -1
  1498. package/dist/services/operate/advisors.d.ts +0 -625
  1499. package/dist/services/operate/advisors.d.ts.map +0 -1
  1500. package/dist/services/operate/advisors.js +0 -1545
  1501. package/dist/services/operate/advisors.js.map +0 -1
  1502. package/dist/services/operate/artifact-route-generation.d.ts +0 -111
  1503. package/dist/services/operate/artifact-route-generation.d.ts.map +0 -1
  1504. package/dist/services/operate/artifact-route-generation.js +0 -460
  1505. package/dist/services/operate/artifact-route-generation.js.map +0 -1
  1506. package/dist/services/operate/artifacts.d.ts +0 -66
  1507. package/dist/services/operate/artifacts.d.ts.map +0 -1
  1508. package/dist/services/operate/artifacts.js +0 -336
  1509. package/dist/services/operate/artifacts.js.map +0 -1
  1510. package/dist/services/operate/cadence.d.ts +0 -50
  1511. package/dist/services/operate/cadence.d.ts.map +0 -1
  1512. package/dist/services/operate/cadence.js +0 -56
  1513. package/dist/services/operate/cadence.js.map +0 -1
  1514. package/dist/services/operate/canonical.d.ts +0 -18
  1515. package/dist/services/operate/canonical.d.ts.map +0 -1
  1516. package/dist/services/operate/canonical.js +0 -157
  1517. package/dist/services/operate/canonical.js.map +0 -1
  1518. package/dist/services/operate/citation-resolution.d.ts +0 -161
  1519. package/dist/services/operate/citation-resolution.d.ts.map +0 -1
  1520. package/dist/services/operate/citation-resolution.js +0 -593
  1521. package/dist/services/operate/citation-resolution.js.map +0 -1
  1522. package/dist/services/operate/completion.d.ts +0 -80
  1523. package/dist/services/operate/completion.d.ts.map +0 -1
  1524. package/dist/services/operate/completion.js +0 -279
  1525. package/dist/services/operate/completion.js.map +0 -1
  1526. package/dist/services/operate/config.d.ts +0 -154
  1527. package/dist/services/operate/config.d.ts.map +0 -1
  1528. package/dist/services/operate/config.js +0 -791
  1529. package/dist/services/operate/config.js.map +0 -1
  1530. package/dist/services/operate/consolidation.d.ts +0 -18
  1531. package/dist/services/operate/consolidation.d.ts.map +0 -1
  1532. package/dist/services/operate/consolidation.js +0 -539
  1533. package/dist/services/operate/consolidation.js.map +0 -1
  1534. package/dist/services/operate/context-research.d.ts +0 -84
  1535. package/dist/services/operate/context-research.d.ts.map +0 -1
  1536. package/dist/services/operate/context-research.js +0 -448
  1537. package/dist/services/operate/context-research.js.map +0 -1
  1538. package/dist/services/operate/decision-brief.d.ts +0 -237
  1539. package/dist/services/operate/decision-brief.d.ts.map +0 -1
  1540. package/dist/services/operate/decision-brief.js +0 -368
  1541. package/dist/services/operate/decision-brief.js.map +0 -1
  1542. package/dist/services/operate/doctor.d.ts +0 -85
  1543. package/dist/services/operate/doctor.d.ts.map +0 -1
  1544. package/dist/services/operate/doctor.js +0 -1070
  1545. package/dist/services/operate/doctor.js.map +0 -1
  1546. package/dist/services/operate/drafts.d.ts +0 -48
  1547. package/dist/services/operate/drafts.d.ts.map +0 -1
  1548. package/dist/services/operate/drafts.js +0 -398
  1549. package/dist/services/operate/drafts.js.map +0 -1
  1550. package/dist/services/operate/engine.d.ts +0 -151
  1551. package/dist/services/operate/engine.d.ts.map +0 -1
  1552. package/dist/services/operate/engine.js +0 -1896
  1553. package/dist/services/operate/engine.js.map +0 -1
  1554. package/dist/services/operate/event-store.d.ts +0 -113
  1555. package/dist/services/operate/event-store.d.ts.map +0 -1
  1556. package/dist/services/operate/event-store.js +0 -384
  1557. package/dist/services/operate/event-store.js.map +0 -1
  1558. package/dist/services/operate/evidence-cache.d.ts +0 -41
  1559. package/dist/services/operate/evidence-cache.d.ts.map +0 -1
  1560. package/dist/services/operate/evidence-cache.js +0 -193
  1561. package/dist/services/operate/evidence-cache.js.map +0 -1
  1562. package/dist/services/operate/evidence-import.d.ts +0 -40
  1563. package/dist/services/operate/evidence-import.d.ts.map +0 -1
  1564. package/dist/services/operate/evidence-import.js +0 -340
  1565. package/dist/services/operate/evidence-import.js.map +0 -1
  1566. package/dist/services/operate/evidence.d.ts +0 -21
  1567. package/dist/services/operate/evidence.d.ts.map +0 -1
  1568. package/dist/services/operate/evidence.js +0 -20
  1569. package/dist/services/operate/evidence.js.map +0 -1
  1570. package/dist/services/operate/ids.d.ts +0 -7
  1571. package/dist/services/operate/ids.d.ts.map +0 -1
  1572. package/dist/services/operate/ids.js +0 -23
  1573. package/dist/services/operate/ids.js.map +0 -1
  1574. package/dist/services/operate/index.d.ts +0 -16
  1575. package/dist/services/operate/index.d.ts.map +0 -1
  1576. package/dist/services/operate/index.js +0 -1864
  1577. package/dist/services/operate/index.js.map +0 -1
  1578. package/dist/services/operate/integrity.d.ts +0 -81
  1579. package/dist/services/operate/integrity.d.ts.map +0 -1
  1580. package/dist/services/operate/integrity.js +0 -152
  1581. package/dist/services/operate/integrity.js.map +0 -1
  1582. package/dist/services/operate/interaction/action-service.d.ts +0 -34
  1583. package/dist/services/operate/interaction/action-service.d.ts.map +0 -1
  1584. package/dist/services/operate/interaction/action-service.js +0 -103
  1585. package/dist/services/operate/interaction/action-service.js.map +0 -1
  1586. package/dist/services/operate/interaction/answer-service.d.ts +0 -40
  1587. package/dist/services/operate/interaction/answer-service.d.ts.map +0 -1
  1588. package/dist/services/operate/interaction/answer-service.js +0 -317
  1589. package/dist/services/operate/interaction/answer-service.js.map +0 -1
  1590. package/dist/services/operate/interaction/charter-suggestions.d.ts +0 -29
  1591. package/dist/services/operate/interaction/charter-suggestions.d.ts.map +0 -1
  1592. package/dist/services/operate/interaction/charter-suggestions.js +0 -104
  1593. package/dist/services/operate/interaction/charter-suggestions.js.map +0 -1
  1594. package/dist/services/operate/interaction/confirmation-service.d.ts +0 -30
  1595. package/dist/services/operate/interaction/confirmation-service.d.ts.map +0 -1
  1596. package/dist/services/operate/interaction/confirmation-service.js +0 -78
  1597. package/dist/services/operate/interaction/confirmation-service.js.map +0 -1
  1598. package/dist/services/operate/interaction/initialization-replay.d.ts +0 -9
  1599. package/dist/services/operate/interaction/initialization-replay.d.ts.map +0 -1
  1600. package/dist/services/operate/interaction/initialization-replay.js +0 -64
  1601. package/dist/services/operate/interaction/initialization-replay.js.map +0 -1
  1602. package/dist/services/operate/interaction/question-engine.d.ts +0 -41
  1603. package/dist/services/operate/interaction/question-engine.d.ts.map +0 -1
  1604. package/dist/services/operate/interaction/question-engine.js +0 -434
  1605. package/dist/services/operate/interaction/question-engine.js.map +0 -1
  1606. package/dist/services/operate/interaction/question-registry.d.ts +0 -52
  1607. package/dist/services/operate/interaction/question-registry.d.ts.map +0 -1
  1608. package/dist/services/operate/interaction/question-registry.js +0 -305
  1609. package/dist/services/operate/interaction/question-registry.js.map +0 -1
  1610. package/dist/services/operate/interaction/session-service.d.ts +0 -55
  1611. package/dist/services/operate/interaction/session-service.d.ts.map +0 -1
  1612. package/dist/services/operate/interaction/session-service.js +0 -304
  1613. package/dist/services/operate/interaction/session-service.js.map +0 -1
  1614. package/dist/services/operate/interaction/terminal-renderer.d.ts +0 -19
  1615. package/dist/services/operate/interaction/terminal-renderer.d.ts.map +0 -1
  1616. package/dist/services/operate/interaction/terminal-renderer.js +0 -124
  1617. package/dist/services/operate/interaction/terminal-renderer.js.map +0 -1
  1618. package/dist/services/operate/journal.d.ts +0 -34
  1619. package/dist/services/operate/journal.d.ts.map +0 -1
  1620. package/dist/services/operate/journal.js +0 -235
  1621. package/dist/services/operate/journal.js.map +0 -1
  1622. package/dist/services/operate/legacy-import-service.d.ts +0 -58
  1623. package/dist/services/operate/legacy-import-service.d.ts.map +0 -1
  1624. package/dist/services/operate/legacy-import-service.js +0 -922
  1625. package/dist/services/operate/legacy-import-service.js.map +0 -1
  1626. package/dist/services/operate/lifecycle-driver.d.ts +0 -309
  1627. package/dist/services/operate/lifecycle-driver.d.ts.map +0 -1
  1628. package/dist/services/operate/lifecycle-driver.js +0 -434
  1629. package/dist/services/operate/lifecycle-driver.js.map +0 -1
  1630. package/dist/services/operate/lifecycle.d.ts +0 -96
  1631. package/dist/services/operate/lifecycle.d.ts.map +0 -1
  1632. package/dist/services/operate/lifecycle.js +0 -596
  1633. package/dist/services/operate/lifecycle.js.map +0 -1
  1634. package/dist/services/operate/lock-service.d.ts +0 -37
  1635. package/dist/services/operate/lock-service.d.ts.map +0 -1
  1636. package/dist/services/operate/lock-service.js +0 -215
  1637. package/dist/services/operate/lock-service.js.map +0 -1
  1638. package/dist/services/operate/maintenance.d.ts +0 -139
  1639. package/dist/services/operate/maintenance.d.ts.map +0 -1
  1640. package/dist/services/operate/maintenance.js +0 -2200
  1641. package/dist/services/operate/maintenance.js.map +0 -1
  1642. package/dist/services/operate/migration.d.ts +0 -68
  1643. package/dist/services/operate/migration.d.ts.map +0 -1
  1644. package/dist/services/operate/migration.js +0 -243
  1645. package/dist/services/operate/migration.js.map +0 -1
  1646. package/dist/services/operate/mission-dispatch.d.ts +0 -271
  1647. package/dist/services/operate/mission-dispatch.d.ts.map +0 -1
  1648. package/dist/services/operate/mission-dispatch.js +0 -590
  1649. package/dist/services/operate/mission-dispatch.js.map +0 -1
  1650. package/dist/services/operate/outcomes.d.ts +0 -48
  1651. package/dist/services/operate/outcomes.d.ts.map +0 -1
  1652. package/dist/services/operate/outcomes.js +0 -312
  1653. package/dist/services/operate/outcomes.js.map +0 -1
  1654. package/dist/services/operate/pipeline-handoff.d.ts +0 -138
  1655. package/dist/services/operate/pipeline-handoff.d.ts.map +0 -1
  1656. package/dist/services/operate/pipeline-handoff.js +0 -175
  1657. package/dist/services/operate/pipeline-handoff.js.map +0 -1
  1658. package/dist/services/operate/profile-migration.d.ts +0 -69
  1659. package/dist/services/operate/profile-migration.d.ts.map +0 -1
  1660. package/dist/services/operate/profile-migration.js +0 -462
  1661. package/dist/services/operate/profile-migration.js.map +0 -1
  1662. package/dist/services/operate/projection-persistence.d.ts +0 -126
  1663. package/dist/services/operate/projection-persistence.d.ts.map +0 -1
  1664. package/dist/services/operate/projection-persistence.js +0 -752
  1665. package/dist/services/operate/projection-persistence.js.map +0 -1
  1666. package/dist/services/operate/projection.d.ts +0 -37
  1667. package/dist/services/operate/projection.d.ts.map +0 -1
  1668. package/dist/services/operate/projection.js +0 -209
  1669. package/dist/services/operate/projection.js.map +0 -1
  1670. package/dist/services/operate/protocol.d.ts +0 -86
  1671. package/dist/services/operate/protocol.d.ts.map +0 -1
  1672. package/dist/services/operate/protocol.js +0 -76
  1673. package/dist/services/operate/protocol.js.map +0 -1
  1674. package/dist/services/operate/read-only-providers.d.ts +0 -76
  1675. package/dist/services/operate/read-only-providers.d.ts.map +0 -1
  1676. package/dist/services/operate/read-only-providers.js +0 -421
  1677. package/dist/services/operate/read-only-providers.js.map +0 -1
  1678. package/dist/services/operate/redaction.d.ts +0 -74
  1679. package/dist/services/operate/redaction.d.ts.map +0 -1
  1680. package/dist/services/operate/redaction.js +0 -406
  1681. package/dist/services/operate/redaction.js.map +0 -1
  1682. package/dist/services/operate/reducer.d.ts +0 -10
  1683. package/dist/services/operate/reducer.d.ts.map +0 -1
  1684. package/dist/services/operate/reducer.js +0 -11
  1685. package/dist/services/operate/reducer.js.map +0 -1
  1686. package/dist/services/operate/report-html.d.ts +0 -32
  1687. package/dist/services/operate/report-html.d.ts.map +0 -1
  1688. package/dist/services/operate/report-html.js +0 -289
  1689. package/dist/services/operate/report-html.js.map +0 -1
  1690. package/dist/services/operate/reports.d.ts +0 -72
  1691. package/dist/services/operate/reports.d.ts.map +0 -1
  1692. package/dist/services/operate/reports.js +0 -481
  1693. package/dist/services/operate/reports.js.map +0 -1
  1694. package/dist/services/operate/routes.d.ts +0 -133
  1695. package/dist/services/operate/routes.d.ts.map +0 -1
  1696. package/dist/services/operate/routes.js +0 -1577
  1697. package/dist/services/operate/routes.js.map +0 -1
  1698. package/dist/services/operate/scratch.d.ts +0 -81
  1699. package/dist/services/operate/scratch.d.ts.map +0 -1
  1700. package/dist/services/operate/scratch.js +0 -190
  1701. package/dist/services/operate/scratch.js.map +0 -1
  1702. package/dist/services/operate/shipment-observer.d.ts +0 -14
  1703. package/dist/services/operate/shipment-observer.d.ts.map +0 -1
  1704. package/dist/services/operate/shipment-observer.js +0 -320
  1705. package/dist/services/operate/shipment-observer.js.map +0 -1
  1706. package/dist/services/operate/stalled-item-service.d.ts +0 -18
  1707. package/dist/services/operate/stalled-item-service.d.ts.map +0 -1
  1708. package/dist/services/operate/stalled-item-service.js +0 -121
  1709. package/dist/services/operate/stalled-item-service.js.map +0 -1
  1710. package/dist/services/operate/subprocess-env.d.ts +0 -4
  1711. package/dist/services/operate/subprocess-env.d.ts.map +0 -1
  1712. package/dist/services/operate/subprocess-env.js +0 -45
  1713. package/dist/services/operate/subprocess-env.js.map +0 -1
  1714. package/dist/services/operate/types.d.ts +0 -1064
  1715. package/dist/services/operate/types.d.ts.map +0 -1
  1716. package/dist/services/operate/types.js +0 -27
  1717. package/dist/services/operate/types.js.map +0 -1
  1718. package/dist/services/operate/workspace.d.ts +0 -76
  1719. package/dist/services/operate/workspace.d.ts.map +0 -1
  1720. package/dist/services/operate/workspace.js +0 -350
  1721. package/dist/services/operate/workspace.js.map +0 -1
  1722. package/dist/services/revise-service.d.ts +0 -115
  1723. package/dist/services/revise-service.d.ts.map +0 -1
  1724. package/dist/services/revise-service.js +0 -294
  1725. package/dist/services/revise-service.js.map +0 -1
  1726. package/dist/templates/rules/claude/planr-pipeline.md.hbs +0 -69
  1727. package/dist/templates/rules/codex/_pipeline-section.md.hbs +0 -154
  1728. package/dist/templates/rules/cursor/agents/backend-agent.md +0 -299
  1729. package/dist/templates/rules/cursor/agents/db-agent.md +0 -163
  1730. package/dist/templates/rules/cursor/agents/designer-agent.md +0 -219
  1731. package/dist/templates/rules/cursor/agents/devops-agent.md +0 -197
  1732. package/dist/templates/rules/cursor/agents/doc-gen-agent.md +0 -203
  1733. package/dist/templates/rules/cursor/agents/frontend-agent.md +0 -220
  1734. package/dist/templates/rules/cursor/agents/qa-agent.md +0 -170
  1735. package/dist/templates/rules/cursor/agents/specification-agent.md +0 -282
  1736. package/dist/templates/rules/cursor/planr-pipeline-plan.mdc.hbs +0 -196
  1737. package/dist/templates/rules/cursor/planr-pipeline-ship.mdc.hbs +0 -246
  1738. package/dist/templates/rules/cursor/planr-pipeline.mdc.hbs +0 -134
@@ -0,0 +1,805 @@
1
+ /* Review experience. Trusted shell UI only; authored screens remain opaque sandboxes.
2
+ * Adapter hooks: loadExperience, listRevisions, loadRevision, prepareComparisonSource,
3
+ * loadHandoff, updateHandoff, updateReviewMetadata. All hooks are optional and fail visibly.
4
+ */
5
+ (() => {
6
+ 'use strict';
7
+ // A removed, still-downloading runtime belongs to a canceled opening.
8
+ if (document.currentScript && !document.currentScript.isConnected) return;
9
+ const payloadNode = document.getElementById('planr-design-studio-payload');
10
+ if (!payloadNode) return;
11
+ const payload = JSON.parse(payloadNode.textContent);
12
+ const design = payload.document;
13
+ const q = (selector, parent = document) => parent.querySelector(selector);
14
+ const qa = (selector, parent = document) => [...parent.querySelectorAll(selector)];
15
+ const node = (tag, text = '', attrs = {}) => {
16
+ const value = document.createElement(tag);
17
+ if (text) value.textContent = text;
18
+ for (const [key, entry] of Object.entries(attrs)) if (entry !== undefined && entry !== null && entry !== false) value.setAttribute(key, entry);
19
+ return value;
20
+ };
21
+ const button = (text, action, attrs = {}) => { const value = node('button', text, { type: 'button', ...attrs }); value.addEventListener('click', action); return value; };
22
+ const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
23
+ const options = () => globalThis.__OPENPLANR_DESIGN_STUDIO_OPTIONS__ || {};
24
+ const scope = `openplanr.experience.${location.pathname.startsWith('/d/') ? location.pathname : design.id}`;
25
+ const read = (key, fallback) => { try { return JSON.parse(localStorage.getItem(`${scope}.${key}`)) ?? fallback; } catch { return fallback; } };
26
+ const write = (key, value) => { try { localStorage.setItem(`${scope}.${key}`, JSON.stringify(value)); } catch { /* Personal preferences remain usable in memory. */ } };
27
+ const avatarColors = [
28
+ ['teal', 'Teal', '#0f766e'], ['blue', 'Blue', '#1d4ed8'], ['violet', 'Violet', '#6d28d9'],
29
+ ['rose', 'Rose', '#be185d'], ['amber', 'Amber', '#a16207'], ['slate', 'Slate', '#475569'],
30
+ ];
31
+ const colorFor = value => [...String(value)].reduce((n, char) => (n * 31 + char.codePointAt(0)) >>> 0, 0) % avatarColors.length;
32
+ const normalizedProfile = value => ({ name: typeof value?.name === 'string' ? value.name.trim().slice(0, 160) : '', color: avatarColors.some(([key]) => key === value?.color) ? value.color : avatarColors[colorFor(value?.name || '')][0] });
33
+ let profile = normalizedProfile(read('profile', null)), themePreference = 'dark';
34
+ try { const saved = localStorage.getItem('openplanr.design.theme'); if (['dark', 'light', 'system'].includes(saved)) themePreference = saved; } catch {}
35
+ const systemTheme = typeof matchMedia === 'function' ? matchMedia('(prefers-color-scheme: light)') : null;
36
+ const applyTheme = () => {
37
+ const resolved = themePreference === 'system' ? (systemTheme?.matches ? 'light' : 'dark') : themePreference;
38
+ if (stage?.getState().theme !== resolved) stage?.dispatch({ type:'set-theme',theme:resolved });
39
+ Object.assign(document.documentElement.dataset, { planrTheme: resolved, designTheme: resolved, designThemePreference: themePreference });
40
+ for (const value of qa('[data-design-theme-choice]')) value.value = themePreference;
41
+ options().onThemeChange?.({ preference: themePreference, resolved });
42
+ };
43
+ const setTheme = value => {
44
+ if (!['dark', 'light', 'system'].includes(value)) return;
45
+ themePreference = value; try { localStorage.setItem('openplanr.design.theme', value); } catch {}
46
+ applyTheme();
47
+ };
48
+ const select = (label, values, initial) => {
49
+ const value = node('select', '', { 'aria-label': label });
50
+ for (const [id, text] of values) value.append(node('option', text, { value: id }));
51
+ value.value = initial; return value;
52
+ };
53
+ let studio, stage, root, rail, experience, activeDialog, railTab = 'review', inspectorEnabled = false;
54
+ let metadata = { version: 0, categories: {}, dispositions: {} };
55
+ let destroyers = [], disposed = false;
56
+ const on = (target, name, callback, config) => { target.addEventListener(name, callback, config); destroyers.push(() => target.removeEventListener(name, callback, config)); };
57
+ const revision = () => experience?.revision || studio.getRevision() || payload.revision;
58
+ const reviewerAudience = () => options().audience === 'reviewer' || location.pathname.startsWith('/d/');
59
+ const commentTypes = [['question','Question','Ask for clarification'], ['suggestion','Suggestion','Offer an optional improvement'], ['change-request','Request change','Ask for a specific change'], ['blocker','Blocker','Must be addressed before proceeding']];
60
+ const categoryLabel = value => commentTypes.find(([id]) => id === value)?.[1] || ({ fix:'Fix', improve:'Improve' })[value] || value;
61
+ const owner = () => experience?.capabilities?.owner === true || experience?.owner === true;
62
+ const state = () => studio.getState();
63
+ const entry = (screenId = state().screenId) => payload.entries.find(item => item.screenId === screenId && item.variantId === state().variantId && item.frameId === state().frameId);
64
+ const pinScope = pin => { const reviewId = pin.reviewId || stage.review.getState().review?.reviewId; const revisionId = pin.revisionId || (reviewId?.startsWith('shared-') ? reviewId.slice(7) : undefined); return { ...(reviewId ? {reviewId}:{}), ...(revisionId ? {revisionId}:{}) }; };
65
+ const pinMetadata = pin => { const value = pinScope(pin); return metadata.byRevision?.[value.revisionId || value.reviewId] || metadata; };
66
+ let toastTimer;
67
+ function announce(text, error = false) {
68
+ let value = q('[data-experience-status]');
69
+ if (!value) { value = node('div', '', { class: 'design-experience-status', 'data-experience-status': '', role: 'status', 'aria-live': 'polite' }); root.append(value); }
70
+ value.textContent = text; value.dataset.error = String(error); value.hidden = false;
71
+ clearTimeout(toastTimer); toastTimer = setTimeout(() => { value.hidden = true; }, error ? 12000 : 6500);
72
+ }
73
+ async function request(name, urlName, input) {
74
+ if (typeof options()[name] === 'function') return options()[name](input);
75
+ const url = options()[urlName];
76
+ if (!url) throw new Error('This action is unavailable in this viewer. Open the attached local review to continue.');
77
+ const response = await fetch(url, { cache: 'no-store', credentials: 'same-origin', ...(input === undefined ? {} : { method: 'POST', headers: { 'content-type': 'application/json', 'x-openplanr-design': '1' }, body: JSON.stringify(input) }) });
78
+ const result = await response.json();
79
+ if (!response.ok || result.ok === false) throw new Error(result.error || 'The request could not be saved. Retry after reconnecting.');
80
+ return result;
81
+ }
82
+ function modal(title, className = '', onDismiss) {
83
+ activeDialog?.dismiss?.();
84
+ const opener = document.activeElement;
85
+ if (q('[data-design-notes]')?.open) q('[data-design-close-notes]')?.click();
86
+ const dialog = node('dialog', '', { class: `design-experience-dialog ${className}`, 'aria-label': title });
87
+ const head = node('header'); head.append(node('h2', title));
88
+ const dismiss = () => { if (!disposed) onDismiss?.(); dialog.close(); dialog.remove(); if (activeDialog === dialog) activeDialog = null; opener?.isConnected && opener.focus({ preventScroll:true }); };
89
+ dialog.dismiss = dismiss;
90
+ head.append(button('×', dismiss, { 'aria-label': `Close ${title.toLowerCase()}`, class: 'design-dialog-close' }));
91
+ const content = node('div', '', { class: 'design-dialog-content' }); dialog.append(head, content);
92
+ const status = node('p', '', { role: 'status', 'aria-live': 'polite', class: 'design-dialog-status' }); dialog.append(status);
93
+ dialog.addEventListener('cancel', event => { event.preventDefault(); dismiss(); });
94
+ dialog.addEventListener('keydown', event => { event.stopPropagation(); });
95
+ dialog.addEventListener('click', event => { const r = dialog.getBoundingClientRect(); if (event.target === dialog && (event.clientX < r.left || event.clientX > r.right || event.clientY < r.top || event.clientY > r.bottom)) dismiss(); });
96
+ document.body.append(dialog); activeDialog = dialog; dialog.showModal();
97
+ return { dialog, content, status, dismiss };
98
+ }
99
+ function about(auto = false) {
100
+ if (auto && (read('welcomed', false) || !location.pathname.startsWith('/d/'))) return;
101
+ const dialog = modal('Welcome to this review', 'design-welcome', () => write('welcomed', true));
102
+ const { content, dismiss } = dialog;
103
+ dialog.dialog.dataset.designWelcomeStep = 'intro';
104
+ const intro = node('div');
105
+ content.append(node('div', 'OpenPlanr · Design review', { class: 'design-eyebrow' }), node('h3', design.title));
106
+ const brief = experience?.reviewContext?.brief || payload.reviewContext?.brief;
107
+ content.append(node('p', brief?.purpose || 'Explore this design and leave feedback on the screens that matter to you.'));
108
+ if (brief?.audience) content.append(node('p', `For ${brief.audience}`, { class: 'design-muted' }));
109
+ if (brief?.requests?.length) { content.append(node('h4', 'What we need your feedback on')); const list = node('ul'); for (const text of brief.requests) list.append(node('li', text)); content.append(list); }
110
+ content.append(node('p', 'Use Review to add a comment. Your navigation and canvas arrangement are personal.', { class: 'design-muted' }));
111
+ const start = (view) => { dismiss(); studio.setView(view); if (view === 'walkthrough') studio.selectScreen(design.screenOrder[0]); studio.setPanels({ navOpen: false, reviewOpen: false }); studio.fit(); };
112
+ const actions = node('div', '', { class: 'design-dialog-actions' });
113
+ const next = view => {
114
+ while (content.firstChild) intro.append(content.firstChild);
115
+ renderProfile(dialog, { continueAction: () => start(view), back: () => { content.replaceChildren(...intro.childNodes); dialog.dialog.dataset.designWelcomeStep = 'intro'; dialog.dialog.setAttribute('aria-label','Welcome to this review'); q('h2',dialog.dialog).textContent = 'Welcome to this review'; actions.querySelector('button')?.focus(); } });
116
+ };
117
+ actions.append(button('Start walkthrough', () => next('walkthrough'), { class: 'design-primary' }), button('Explore freely', () => next('canvas'))); content.append(actions);
118
+ }
119
+ function avatar(author, { color, large = false } = {}) {
120
+ const name = author?.name || 'Reviewer';
121
+ const identity = stage?.review.getState().identity;
122
+ const own = typeof options().isOwnReviewAuthor === 'function' ? options().isOwnReviewAuthor(author) : author?.id && identity?.id ? author.id === identity.id : !author?.id && !identity?.id && name === identity?.name;
123
+ const key = color || (own ? profile.color : avatarColors[colorFor(author?.id || name)][0]);
124
+ const chosen = avatarColors.find(([id]) => id === key) || avatarColors[0];
125
+ const initials = name.trim().split(/\s+/u).slice(0,2).map(part => [...part][0] || '').join('').toLocaleUpperCase();
126
+ const value = node('span', initials || 'R', { class: `design-avatar${large ? ' design-avatar-large' : ''}`, 'aria-hidden': 'true', 'data-avatar-color': chosen[0] });
127
+ value.style.setProperty('--design-avatar-color', chosen[2]); return value;
128
+ }
129
+ function themeChoice() {
130
+ const wrapper = node('label', 'Appearance', { class: 'design-theme-field' });
131
+ const choice = select('Studio theme', [['dark','Dark'],['light','Light'],['system','System']], themePreference);
132
+ choice.title = 'Board appearance only. Product screens keep their own theme.';
133
+ choice.setAttribute('aria-description', choice.title);
134
+ choice.dataset.designThemeChoice = ''; choice.addEventListener('change', () => setTheme(choice.value)); wrapper.append(choice); return wrapper;
135
+ }
136
+ let notifiedProfile;
137
+ function profileChanged() {
138
+ for (const value of qa('[data-design-profile-button]')) {
139
+ value.replaceChildren(avatar(profile, { color: profile.color }), node('span', profile.name || 'Reviewer profile'));
140
+ value.title = profile.name ? `Edit profile for ${profile.name}` : 'Set up your reviewer profile';
141
+ }
142
+ const identityBlock=q('.planr-identity'); if (identityBlock && reviewerAudience()) identityBlock.hidden=Boolean(profile.name);
143
+ const next = JSON.stringify(profile);
144
+ if (profile.name && next !== notifiedProfile) { notifiedProfile = next; options().onProfileChange?.({ ...profile }); }
145
+ updateFilters();
146
+ }
147
+ function saveProfile(next) {
148
+ profile = normalizedProfile(next); write('profile', profile);
149
+ const identity = stage.review.getState().identity;
150
+ stage.review.setIdentity({ ...(identity?.id ? { id: identity.id } : {}), name: profile.name });
151
+ profileChanged();
152
+ }
153
+ function renderProfile(dialog, { continueAction = dialog.dismiss, back } = {}) {
154
+ const { content, status } = dialog;
155
+ dialog.dialog.dataset.designWelcomeStep = 'profile'; dialog.dialog.setAttribute('aria-label','Your reviewer profile'); q('h2',dialog.dialog).textContent = 'Your reviewer profile';
156
+ content.replaceChildren();
157
+ content.append(node('p', 'Choose how your comments appear. You can change this later.', { class: 'design-muted' }));
158
+ const form = node('form', '', { class: 'design-profile-form' });
159
+ const preview = node('div', '', { class: 'design-profile-preview' });
160
+ const draft = { ...profile };
161
+ const refresh = () => { preview.replaceChildren(avatar(draft, { color: draft.color, large: true }), node('strong', draft.name.trim() || 'Your name')); };
162
+ const label = node('label', 'Reviewer name');
163
+ const name = node('input', '', { type: 'text', name: 'reviewer-name', autocomplete: 'nickname', enterkeyhint:'done', maxlength: '160', required: '', 'aria-label': 'Reviewer name', placeholder: 'How should the team know you?' });
164
+ name.value = draft.name; name.addEventListener('input', () => { draft.name = name.value; name.setCustomValidity(''); refresh(); }); label.append(name);
165
+ const palette = node('fieldset', '', { class: 'design-avatar-palette' }); palette.append(node('legend', 'Avatar color'));
166
+ for (const [key, title, color] of avatarColors) {
167
+ const option = node('label', '', { class: 'design-avatar-option' });
168
+ const radio = node('input', '', { type: 'radio', name: 'avatar-color', value: key, 'aria-label': title }); radio.checked = draft.color === key;
169
+ const swatch = node('span', '', { 'aria-hidden': 'true' }); swatch.style.setProperty('--design-avatar-color',color);
170
+ radio.addEventListener('change', () => { if (radio.checked) { draft.color = key; refresh(); } });
171
+ option.append(radio,swatch,node('span',title)); palette.append(option);
172
+ }
173
+ form.append(preview,label,palette,node('p','Your name is shared with comments. Your avatar color is a personal preference saved in this browser.',{class:'design-muted'}),themeChoice());
174
+ const actions = node('div', '', { class: 'design-dialog-actions' });
175
+ const submit = node('button', back ? 'Continue to review' : 'Save profile', { type:'submit',class:'design-primary' });
176
+ actions.append(submit);
177
+ if (back) actions.append(button('Browse first', continueAction),button('Back',back));
178
+ else actions.append(button('Cancel',dialog.dismiss));
179
+ form.append(actions);content.append(form);refresh();
180
+ form.addEventListener('submit', event => {
181
+ event.preventDefault();
182
+ if (!draft.name.trim()) { name.setCustomValidity('Enter a name, or choose Browse first.'); name.reportValidity(); return; }
183
+ try { saveProfile(draft); continueAction(); } catch (error) { status.textContent = error.message; }
184
+ });
185
+ // Opening the profile step must not also open a phone keyboard and move
186
+ // the page. The person chooses when to type; desktop retains direct focus.
187
+ if (window.matchMedia?.('(pointer:coarse), (max-width:680px)').matches) {
188
+ const title = q('h2',dialog.dialog); title.tabIndex = -1; title.focus({ preventScroll:true });
189
+ } else name.focus({ preventScroll:true });
190
+ content.scrollTop = 0;
191
+ }
192
+ function editProfile() { renderProfile(modal('Your reviewer profile', 'design-profile')); }
193
+ function installMobileViewport() {
194
+ const html = document.documentElement;
195
+ const mobile = window.matchMedia?.('(pointer:coarse), (max-width:680px)');
196
+ if (!mobile) return;
197
+ let pending = 0, width = innerWidth;
198
+ const clear = () => {
199
+ delete root.dataset.designKeyboard;
200
+ root.style.removeProperty('--design-frozen-shell-height');
201
+ html.style.removeProperty('--design-visible-height');
202
+ html.style.removeProperty('--design-visible-top');
203
+ };
204
+ const update = () => {
205
+ pending = 0;
206
+ const active = document.activeElement;
207
+ const editing = mobile.matches && active?.matches('input:not([type="radio"]):not([type="checkbox"]):not([type="hidden"]),textarea,select');
208
+ if (!editing) { clear(); return; }
209
+ if (!root.dataset.designKeyboard || width !== innerWidth) {
210
+ root.style.removeProperty('--design-frozen-shell-height');
211
+ root.style.setProperty('--design-frozen-shell-height',`${root.getBoundingClientRect().height}px`);
212
+ root.dataset.designKeyboard = 'true'; width = innerWidth;
213
+ }
214
+ const visual = window.visualViewport;
215
+ // Browser pinch zoom remains native. Never resize/reposition the layout
216
+ // to counteract a person's zoom, which would create a scale feedback loop.
217
+ if (visual && Math.abs(visual.scale - 1) < .01) {
218
+ html.style.setProperty('--design-visible-height',`${Math.max(1,visual.height)}px`);
219
+ html.style.setProperty('--design-visible-top',`${Math.max(0,visual.offsetTop)}px`);
220
+ }
221
+ };
222
+ const schedule = () => { if (!pending) pending = requestAnimationFrame(update); };
223
+ on(document,'focusin',update); on(document,'focusout',schedule);
224
+ on(window,'resize',schedule);
225
+ if (window.visualViewport) { on(window.visualViewport,'resize',schedule); on(window.visualViewport,'scroll',schedule); }
226
+ destroyers.push(() => { cancelAnimationFrame(pending); clear(); });
227
+ }
228
+ function installProfileAndTheme() {
229
+ applyTheme();
230
+ if (systemTheme?.addEventListener) on(systemTheme,'change',() => { if (themePreference === 'system') applyTheme(); });
231
+ const identity = stage.review.getState().identity;
232
+ if (identity?.name) profile = normalizedProfile({ ...profile,name:identity.name });
233
+ else if (profile.name) stage.review.setIdentity({ name:profile.name });
234
+ const footer = node('div','',{class:'design-personal-settings'});
235
+ footer.append(button('',editProfile,{'data-design-profile-button':'','aria-label':'Edit reviewer profile',class:'design-profile-button'}),themeChoice());
236
+ q('.design-nav-footer').before(footer);
237
+ destroyers.push(stage.review.controller.subscribe((state, change) => {
238
+ if (change.type !== 'identity') return;
239
+ profile = normalizedProfile({ ...profile,name:state.identity?.name || '' }); write('profile',profile); profileChanged();
240
+ }));
241
+ profileChanged();
242
+ }
243
+ function installPersonalDrafts() {
244
+ // Shared reviews already persist drafts through their authenticated host.
245
+ if (location.pathname.startsWith('/d/')) return;
246
+ const key = `review-drafts.${payload.revision || studio.getRevision() || 'unpublished'}`;
247
+ const restore = () => { const saved = read(key,null); if (saved) { try { stage.review.restoreDrafts?.(saved); } catch { /* Invalid personal storage must not block the studio. */ } } };
248
+ restore(); on(root,'planr:design-ready',restore,{once:true});
249
+ on(root,'planr:artifact-review-draft-change',event => { if (event.detail?.reviewOf) write(key,event.detail); });
250
+ on(window,'pagehide',() => { const snapshot = stage.review.snapshotDrafts?.(); if (snapshot?.reviewOf) write(key,snapshot); });
251
+ }
252
+ function installReadability() {
253
+ const widths = read('widths', { left: 240, right: 336 });
254
+ const apply = () => { root.style.setProperty('--design-nav-width', `${clamp(widths.left, 200, 360)}px`); root.style.setProperty('--planr-review-rail-width', `${clamp(widths.right, 300, 480)}px`); };
255
+ apply();
256
+ for (const [side, panel, min, max] of [['left', q('.design-navigator'), 200, 360], ['right', rail, 300, 480]]) {
257
+ const handle = node('div', '', { class: `design-resize-handle design-resize-${side}`, role: 'separator', tabindex: '0', 'aria-orientation': 'vertical', 'aria-label': `Resize ${side === 'left' ? 'screens' : 'review'} sidebar`, 'aria-valuemin': String(min), 'aria-valuemax': String(max), 'aria-valuenow': String(widths[side]) });
258
+ panel.append(handle);
259
+ const set = value => { widths[side] = clamp(value, min, max); apply(); handle.setAttribute('aria-valuenow', String(Math.round(widths[side]))); write('widths', widths); };
260
+ let drag;
261
+ on(handle, 'pointerdown', event => { if (event.button !== 0) return; drag = { start: event.clientX, width: widths[side], id: event.pointerId }; handle.setPointerCapture(event.pointerId); event.preventDefault(); root.dataset.designResizing = 'true'; });
262
+ on(handle, 'pointermove', event => { if (drag?.id === event.pointerId) set(drag.width + (event.clientX - drag.start) * (side === 'left' ? 1 : -1)); });
263
+ for (const name of ['pointerup', 'pointercancel']) on(handle, name, () => { drag = null; delete root.dataset.designResizing; });
264
+ on(handle, 'keydown', event => { if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return; event.preventDefault(); const delta = (event.key === 'ArrowRight' ? 1 : -1) * (side === 'left' ? 1 : -1) * (event.shiftKey ? 40 : 8); set(event.key === 'Home' ? min : event.key === 'End' ? max : widths[side] + delta); });
265
+ on(handle, 'dblclick', () => set(side === 'left' ? 240 : 336));
266
+ }
267
+ }
268
+ function installThumbnails() {
269
+ // Phones use numbered navigation: styled DOM/SVG captures can briefly
270
+ // multiply the memory occupied by a live product document.
271
+ if (stage.frameBudget) return;
272
+ const cache = new Map(), queue = [], queued = new Set(); let running = false, ready = false;
273
+ const paintable = current => {
274
+ const frame = stage.getFrame(current.artifactId);
275
+ return state().navOpen && frame && !frame.closest('.planr-artifact-panel')?.hidden && frame.getClientRects().length > 0;
276
+ };
277
+ const renderThumb = async (screenButton) => {
278
+ const current = entry(screenButton.dataset.designScreen); if (!current) return;
279
+ const fingerprint = (experience?.fingerprints || payload.fingerprints)?.find(item => item.screenId === current.screenId && item.frameId === current.frameId && item.variantId === current.variantId);
280
+ const key = `${fingerprint?.contentDigest || revision()}:${current.artifactId}`; const target = q('.design-thumbnail', screenButton);
281
+ if (cache.has(key)) { target.replaceChildren(cache.get(key).cloneNode()); return; }
282
+ if (!paintable(current)) return;
283
+ if (queued.has(key)) return; queued.add(key); queue.push({ current, key, target }); await pump();
284
+ };
285
+ const pump = async () => {
286
+ if (running || !ready || disposed) return; running = true;
287
+ while (queue.length && !disposed) {
288
+ const { current, key, target } = queue.shift();
289
+ try {
290
+ if (!paintable(current)) continue;
291
+ const result = await stage.getFrame(current.artifactId)?.__openPlanrBridge?.thumbnail?.();
292
+ if (typeof result?.dataUrl !== 'string' || !/^data:image\/png;base64,/u.test(result.dataUrl) || result.dataUrl.length > 360000) continue;
293
+ const img = node('img', '', { src: result.dataUrl, alt: '', loading: 'lazy' }); cache.set(key, img);
294
+ if (entry(current.screenId)?.artifactId === current.artifactId) target.replaceChildren(img.cloneNode());
295
+ } catch { /* The labelled screen button remains usable when capture is unavailable. */ }
296
+ finally { queued.delete(key); }
297
+ await new Promise(resolve => setTimeout(resolve, 50));
298
+ }
299
+ running = false;
300
+ };
301
+ const screenButtons = qa('[data-design-screen]');
302
+ for (const screenButton of screenButtons) {
303
+ const preview = node('span', '', { class: 'design-thumbnail', 'aria-hidden': 'true' }); preview.append(node('span', screenButton.querySelector('.design-screen-number')?.textContent || '')); screenButton.prepend(preview);
304
+ }
305
+ const visible = new Set();
306
+ const observer = typeof IntersectionObserver === 'function' ? new IntersectionObserver(records => { for (const record of records) { if (record.isIntersecting) { visible.add(record.target); void renderThumb(record.target); } else visible.delete(record.target); } }, { root: q('.design-screen-list'), rootMargin: '120px' }) : null;
307
+ if (observer) { screenButtons.forEach(item => observer.observe(item)); destroyers.push(() => observer.disconnect()); }
308
+ else screenButtons.slice(0, 6).forEach(item => visible.add(item));
309
+ let signature = '', scheduled;
310
+ const schedule = () => {
311
+ if (scheduled || disposed) return;
312
+ scheduled = requestAnimationFrame(() => { scheduled = null; for (const target of visible) void renderThumb(target); void pump(); });
313
+ };
314
+ // Journey views hide inactive frames. Retry only when a presentation change can
315
+ // make a frame paintable, after layout; camera motion never creates retry loops.
316
+ on(root, 'planr:design-render', () => { const current = state(); const next = `${current.view}:${current.screenId}:${current.variantId}:${current.frameId}:${current.navOpen}`; if (next !== signature) { signature = next; schedule(); } });
317
+ destroyers.push(() => cancelAnimationFrame(scheduled));
318
+ const start = () => { ready = true; schedule(); };
319
+ on(root, 'planr:design-ready', start); if (stage.getState().status === 'ready') setTimeout(start, 200);
320
+ }
321
+ let updateFilters = () => {};
322
+ function categoryPicker(initial, onChange) {
323
+ const group = node('div','',{class:'design-category-picker',role:'radiogroup','aria-label':'Comment type'});
324
+ const field = node('input','',{type:'hidden','data-planr-draft-key':'category'}); field.value=initial; group.append(field);
325
+ const sync = () => {
326
+ for (const value of qa('[role="radio"]',group)) { const selected=value.dataset.designCategory===field.value; value.setAttribute('aria-checked',String(selected)); value.tabIndex=selected || (!commentTypes.some(([id])=>id===field.value) && value===q('[role="radio"]',group)) ? 0 : -1; }
327
+ onChange?.(field.value);
328
+ };
329
+ for (const [id,label,hint] of commentTypes) {
330
+ const choice=button(label,()=>{field.value=id;field.dispatchEvent(new Event('change',{bubbles:true}));},{role:'radio','aria-label':label,'data-design-category':id,title:hint,'aria-description':hint}); group.append(choice);
331
+ }
332
+ group.addEventListener('keydown',event=>{if (!['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','Home','End'].includes(event.key)) return;event.preventDefault();const buttons=qa('[role="radio"]',group),index=buttons.indexOf(event.target);const next=event.key==='Home'?0:event.key==='End'?buttons.length-1:(index+(event.key==='ArrowLeft'||event.key==='ArrowUp'?-1:1)+buttons.length)%buttons.length;buttons[next].click();buttons[next].focus();});
333
+ field.addEventListener('change',sync); sync(); return {group,field};
334
+ }
335
+ function installComposerCategory() {
336
+ let pending = null, saving = false, retry;
337
+ const outbox = read(`categories.${revision()}`, {});
338
+ const available = () => typeof options().updateReviewMetadata === 'function' || (owner() && (options().handoffUrl || options().updateHandoff));
339
+ const flush = async () => {
340
+ if (saving || !available()) return; saving = true;
341
+ try {
342
+ for (const [pinId, category] of Object.entries(outbox)) {
343
+ const body = { action: 'category', pinId, category, revision: revision(), version: metadata.version || 0, ...pinScope({}) };
344
+ const result = options().updateReviewMetadata ? await options().updateReviewMetadata(body) : await request('updateHandoff', 'handoffUrl', body);
345
+ metadata = result.metadata || { ...metadata, categories: { ...metadata.categories, [pinId]: category } };
346
+ delete outbox[pinId]; write(`categories.${revision()}`, outbox); updateFilters();
347
+ }
348
+ } catch { announce('Comment saved. Its type is waiting to sync. Retry when your connection is available.', true); }
349
+ finally { saving = false; if (retry) retry.hidden = !Object.keys(outbox).length; }
350
+ };
351
+ on(root, 'planr:artifact-annotation-draft', () => {
352
+ const composer = q('[data-planr-annotation-composer]'); if (!composer || q('[data-planr-draft-key="category"]', composer) || !available()) return;
353
+ const picker = q('[role="radiogroup"]', composer); picker.hidden = true;
354
+ const {group,field:category} = categoryPicker('suggestion', value => { const intent = { question:'question',suggestion:'improve','change-request':'fix',blocker:'fix' }[value] || 'improve'; q(`[data-planr-intent="${intent}"]`, picker).click(); });
355
+ const label = node('div', '', { class: 'design-composer-category' }); label.append(node('span','Comment type'),group); picker.after(label);
356
+ q('[data-planr-composer-comment]',composer).placeholder='Describe your feedback for this area…';
357
+ composer.addEventListener('submit', () => { if (!q('[data-planr-composer-comment]', composer).value.trim() || !q('[data-planr-composer-identity]', composer).value.trim()) { pending = null; return; } pending = { ids: new Set((stage.review.getState().review?.pins || []).map(item => item.id)), category: category.value }; }, { capture: true });
358
+ });
359
+ on(root, 'planr:artifact-review-change', event => {
360
+ if (pending) { const pin = event.detail?.pins?.find(item => !pending.ids.has(item.id)); if (pin) { outbox[pin.id] = pending.category; metadata.categories = { ...metadata.categories, [pin.id]: pending.category }; write(`categories.${revision()}`, outbox); pending = null; queueMicrotask(() => { updateFilters(); void flush(); }); } }
361
+ });
362
+ on(window, 'online', flush);
363
+ on(document, 'openplanr:design-experience-changed', flush);
364
+ retry = button('Retry pending categories', flush, { class: 'design-text-button' });
365
+ retry.hidden = !Object.keys(outbox).length; q('[data-design-review-filters]').append(retry);
366
+ on(root, 'planr:artifact-review-change', () => { retry.hidden = !Object.keys(outbox).length; });
367
+ }
368
+ function installReview() {
369
+ const controls = node('div', '', { class: 'design-review-filters', 'data-design-review-filters': '' });
370
+ const row = node('div', '', { class: 'design-filter-row' });
371
+ const scopeFilter = select('Review scope', [['screen', 'This screen'], ['all', 'All screens']], 'screen');
372
+ const statusFilter = select('Review status', [['open', 'Open'], ['resolved', 'Resolved'], ['all', 'All statuses']], 'open');
373
+ row.append(scopeFilter, statusFilter);
374
+ const search = node('input', '', { type: 'search', placeholder: 'Search comments', 'aria-label': 'Search comments' });
375
+ const type = select('Comment type', [['all', 'All types'], ['question', 'Questions'], ['suggestion', 'Suggestions'], ['change-request','Change requests'], ['blocker', 'Blockers'], ['fix', 'Fixes']], 'all');
376
+ const unreadOnly = node('input', '', { type: 'checkbox' }); const unreadLabel = node('label', '', { class: 'design-unread-toggle' }); const unreadCount = node('span', 'Unread only'); unreadLabel.append(unreadOnly, unreadCount);
377
+ const secondary = node('div', '', { class: 'design-filter-row' }); secondary.append(type, unreadLabel);
378
+ controls.append(row, search, secondary, button('Export reviews', exportReviews, {class:'design-review-export'})); q('.design-comment-action').after(controls);
379
+ const seen = read(`seen.${revision()}`, {});
380
+ const activity = pin => [pin.updatedAt, pin.createdAt, ...(pin.replies || []).map(reply => reply.createdAt)].filter(Boolean).sort().at(-1) || '';
381
+ const unread = pin => (seen[pin.id] || '') < activity(pin);
382
+ const category = pin => pinMetadata(pin).categories?.[pin.id] || (pin.intent === 'improve' ? 'suggestion' : pin.intent);
383
+ const filter = pin => {
384
+ const identity = payload.entries.find(value => value.artifactId === pin.artifactId);
385
+ const screenId = pin.anchor?.screen || identity?.screenId;
386
+ return (scopeFilter.value === 'all' || screenId === state().screenId) && (statusFilter.value === 'all' || (statusFilter.value === 'resolved' ? pin.status === 'resolved' : pin.status !== 'resolved')) && (type.value === 'all' || category(pin) === type.value) && (!unreadOnly.checked || unread(pin)) && (!search.value.trim() || [pin.comment, pin.author.name, ...(pin.replies || []).flatMap(reply => [reply.comment, reply.author.name])].join(' ').toLowerCase().includes(search.value.trim().toLowerCase()));
387
+ };
388
+ const label = pin => categoryLabel(category(pin));
389
+ const decorate = ({ element, pin }) => {
390
+ q('.planr-review-byline',element)?.prepend(avatar(pin.author));
391
+ qa('.planr-reply',element).forEach(reply => { const author=pin.replies?.find(item => item.id === reply.dataset.planrReplyId)?.author; if(author) q('header',reply).prepend(avatar(author)); });
392
+ element.dataset.designCategory=category(pin);
393
+ const badge=q('.planr-intent',element); badge.dataset.designCategory=category(pin);
394
+ const section = node('div', '', { class: 'design-thread-triage' });
395
+ const canCategorize = (typeof options().updateReviewMetadata === 'function' || (owner() && (options().handoffUrl || options().updateHandoff))) && (typeof options().canCategorizePin !== 'function' || options().canCategorizePin(pin.id));
396
+ if (canCategorize) {
397
+ const edit=button(label(pin), async () => {
398
+ const {content,status,dismiss}=modal('Comment type');
399
+ content.append(node('p',pin.comment,{class:'design-edit-comment-excerpt'}));
400
+ let save;
401
+ const {group,field}=categoryPicker(category(pin),()=>{if(save)save.disabled=false;});content.append(group);
402
+ save=button('Save type',async()=>{save.disabled=true;try {
403
+ const body={action:'category',pinId:pin.id,category:field.value,revision:revision(),version:metadata.version||0,...pinScope(pin)};
404
+ const result=options().updateReviewMetadata?await options().updateReviewMetadata(body):await request('updateHandoff','handoffUrl',body);
405
+ metadata=result.metadata||{...metadata,categories:{...metadata.categories,[pin.id]:field.value}};updateFilters();dismiss();
406
+ }catch(error){status.textContent=error.message;}finally{save.disabled=false;}},{class:'design-primary'});
407
+ save.disabled=!commentTypes.some(([id])=>id===field.value);
408
+ const actions=node('div','',{class:'design-dialog-actions'});actions.append(button('Cancel',dismiss),save);content.append(actions);
409
+ },{class:'design-category-badge','data-design-category':category(pin),'aria-label':`Change comment type: ${label(pin)}`,title:'Change comment type'});
410
+ badge.replaceWith(edit);
411
+ }
412
+ const disposition = pinMetadata(pin).dispositions?.[pin.id];
413
+ if (disposition) section.append(node('span', `${disposition.disposition}${disposition.reason ? ` · ${disposition.reason}` : ''}`, { class: 'design-disposition' }));
414
+ if (owner()) section.append(button('Disposition', () => editDisposition(pin), { class: 'design-small-button' }));
415
+ if (section.childNodes.length) element.append(section);
416
+ };
417
+ const colorPins = () => { if(disposed)return; const colors=new Map((stage.review.getState().review?.pins || []).map(pin=>[pin.id,category(pin)])); for(const marker of qa('[data-planr-pin-id]')) { const value=colors.get(marker.dataset.planrPinId);if(value && marker.dataset.designCategory!==value) marker.dataset.designCategory=value; } };
418
+ const updateUnread = () => { const count = (stage.review.getState().review?.pins || []).filter(unread).length; unreadCount.textContent = `Unread · ${count}`; };
419
+ updateFilters = () => { if(disposed)return; updateUnread(); stage.review.setPresentation?.({ compact:true, pageSize:40, filterKey:JSON.stringify([scopeFilter.value,statusFilter.value,type.value,unreadOnly.checked,search.value,state().screenId]), filterPin: filter, describePin: pin => ({ intentLabel: label(pin), unread: unread(pin) }), decorateThread: decorate, emptyMessage: 'No comments match these filters.', onThreadOpen: (pinId) => { const pin = stage.review.getState().review?.pins.find(item => item.id === pinId); if (pin && unread(pin)) { seen[pinId] = activity(pin); write(`seen.${revision()}`, seen); const thread = qa('[data-planr-pin-id]').find(value => value.dataset.planrPinId === pinId); thread?.removeAttribute('data-planr-unread'); updateUnread(); } } }); colorPins(); };
420
+ on(root, 'planr:artifact-review-change', () => { updateUnread(); queueMicrotask(colorPins); });
421
+ for (const value of [scopeFilter, statusFilter, type, unreadOnly]) on(value, 'change', updateFilters);
422
+ on(search, 'input', updateFilters);
423
+ let currentScreen = state().screenId;
424
+ on(root, 'planr:design-render', () => { if (currentScreen !== state().screenId) { currentScreen = state().screenId; updateFilters(); } });
425
+ updateFilters(); colorPins();
426
+ on(document,'planr:design-experience-change',()=>queueMicrotask(colorPins));
427
+ }
428
+ function exportReviews() {
429
+ const {content,status,dialog}=modal('Export reviews');
430
+ const canLoad=typeof options().loadReviewExport==='function';
431
+ const scopeChoice=select('Review export scope', canLoad ? [['current','Current revision'],['all','All revisions']] : [['current','Current revision']], 'current');
432
+ content.append(node('p','Download comments and replies with their original screen, frame, timestamps and pin coordinates. This does not approve or resolve feedback.'),scopeChoice);
433
+ const actions=node('div','',{class:'design-dialog-actions'});
434
+ let preparing=false;
435
+ const download=async(format)=>{
436
+ if(preparing)return;preparing=true;
437
+ for(const value of actions.querySelectorAll('button'))value.disabled=true;
438
+ scopeChoice.disabled=true;status.textContent='Preparing review history…';
439
+ try {
440
+ if(Object.keys(read(`categories.${revision()}`,{})).length)throw Error('A comment type is still waiting to save. Reconnect and retry after it finishes.');
441
+ const tools=globalThis.OpenPlanrDesignReviewExport;
442
+ if(!tools)throw Error('Review export is unavailable. Reload this review and try again.');
443
+ if(canLoad && !reviewerAudience()){await studio.flush();if(studio.getSaveState().dirty)throw Error('Changes are still waiting to save. Reconnect and retry.');}
444
+ const snapshot=canLoad?await options().loadReviewExport({scope:scopeChoice.value}):tools.createDesignReviewExport({bundle:{document:design,entries:payload.entries,revision:revision()},revisionId:revision(),review:stage.review.getState().review,metadata,historyComplete:!experience?.loadingHistory,olderPagesLoading:Boolean(experience?.loadingHistory),generatedAt:new Date().toISOString()});
445
+ if(!dialog.isConnected)return;
446
+ const text=tools.serializeDesignReviewExport(snapshot,format),url=URL.createObjectURL(new Blob([text],{type:format==='json'?'application/json':'text/markdown;charset=utf-8'}));
447
+ const link=node('a','',{href:url,download:`design-review-${scopeChoice.value}.${format==='json'?'json':'md'}`});
448
+ document.body.append(link);link.click();link.remove();setTimeout(()=>URL.revokeObjectURL(url),10000);
449
+ status.textContent=`Exported ${snapshot.summary.threads} comments and ${snapshot.summary.replies} replies.${snapshot.completeness.historyComplete?'':' Some history is unavailable; the export identifies this.'}`;
450
+ }catch(error){status.textContent=`Could not export reviews: ${error.message} Try the download again.`;}
451
+ finally{preparing=false;for(const value of actions.querySelectorAll('button'))value.disabled=false;scopeChoice.disabled=false;}
452
+ };
453
+ actions.append(button('Download Markdown',()=>void download('markdown'),{class:'design-primary'}),button('Download JSON',()=>void download('json')));content.append(actions);
454
+ }
455
+ async function editDisposition(pin) {
456
+ const { content, status } = modal('Review disposition');
457
+ const current = pinMetadata(pin).dispositions?.[pin.id];
458
+ content.append(node('p', pin.comment));
459
+ const value = select('Disposition', [['accepted', 'Accept for implementation'], ['deferred', 'Defer'], ['rejected', 'Decline']], current?.disposition || 'accepted');
460
+ const reason = node('textarea', '', { 'aria-label': 'Disposition reason', placeholder: 'Explain the decision', maxlength: '8192' }); reason.value = current?.reason || '';
461
+ const save = button('Save disposition', async () => {
462
+ save.disabled = true;
463
+ try { const result = await request('updateHandoff', 'handoffUrl', { action: 'disposition', revision: revision(), version: metadata.version || 0, pinId: pin.id, disposition: value.value, reason: reason.value.trim(), ...pinScope(pin) }); metadata = result.metadata || metadata; updateFilters(); status.textContent = 'Disposition saved. Original feedback is unchanged.'; }
464
+ catch (error) { status.textContent = error.message; } finally { save.disabled = false; }
465
+ }, { class: 'design-primary' }); content.append(value, reason, save);
466
+ }
467
+ function installCanvas() {
468
+ const tools = q('.design-canvas-tools');
469
+ const more = node('details', '', { class: 'design-tools-menu' }); more.append(node('summary', 'More', { 'aria-label': 'More canvas controls' }));
470
+ const list = node('div');
471
+ list.append(button('Fit selection', () => { studio.fitSelection(); more.open = false; }, { 'aria-keyshortcuts': 'Shift+2' }));
472
+ let minimapOpen = read('minimap', design.screens.length > 6);
473
+ const toggleMap = button('Minimap', () => { minimapOpen = !minimapOpen; write('minimap', minimapOpen); draw(); more.open = false; }, { 'aria-pressed': String(minimapOpen) }); list.append(toggleMap);
474
+ const presentation = button('Present fullscreen', () => { void fullscreen(); more.open = false; }); list.append(presentation);
475
+ list.append(button('Keyboard shortcuts', () => { shortcuts(); more.open = false; }, { 'aria-keyshortcuts': '?' }), button('Reviewer profile', () => { editProfile(); more.open = false; }), button('About this review', () => { about(); more.open = false; })); more.append(list); tools.append(more);
476
+ const map = node('div', '', { class: 'design-minimap', 'aria-label': 'Canvas minimap' });
477
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('viewBox', '0 0 200 128'); svg.setAttribute('aria-label', 'Canvas overview');
478
+ const close = button('×', () => { minimapOpen = false; write('minimap', false); draw(); }, { class: 'design-minimap-close', 'aria-label': 'Close minimap' }); map.append(svg, close); q('.planr-stage').append(map);
479
+ const scroll = q('.planr-stage-scroll'); let geometry = null, scheduled = false;
480
+ const mapBoards = new Map();
481
+ const viewportRect = document.createElementNS(svg.namespaceURI, 'rect');
482
+ viewportRect.setAttribute('class', 'design-minimap-viewport'); viewportRect.setAttribute('pointer-events', 'none'); svg.append(viewportRect);
483
+ const attribute = (element, name, value) => { if (element.getAttribute(name) !== String(value)) element.setAttribute(name, String(value)); };
484
+ function draw() {
485
+ const current = state(); toggleMap.hidden = current.view !== 'canvas';
486
+ q('summary',more).setAttribute('aria-label', current.view === 'canvas' ? 'More canvas controls' : 'More screen controls');
487
+ map.hidden = current.view !== 'canvas' || !minimapOpen || root.dataset.designPresentation === 'true'; toggleMap.setAttribute('aria-pressed', String(minimapOpen)); if (map.hidden) return;
488
+ const boards = payload.entries.filter(item => !stage.getPanel(item.artifactId)?.hidden).map(item => { const panel = stage.getPanel(item.artifactId), frame = design.frames.find(value => value.id === item.frameId); return { ...item, x: parseFloat(panel.style.left) || 0, y: parseFloat(panel.style.top) || 0, width: frame.width, height: frame.height }; });
489
+ if (!boards.length) return;
490
+ const viewport = { x: -current.camera.x / current.zoom, y: -current.camera.y / current.zoom, width: scroll.clientWidth / current.zoom, height: scroll.clientHeight / current.zoom };
491
+ // Board bounds are independent of the camera. Including the viewport in
492
+ // these bounds made every zoom shrink/recenter the whole overview.
493
+ const minX = Math.min(...boards.map(item => item.x)), minY = Math.min(...boards.map(item => item.y));
494
+ const width = Math.max(...boards.map(item => item.x + item.width)) - minX, height = Math.max(...boards.map(item => item.y + item.height)) - minY;
495
+ const scale = Math.min(184 / Math.max(1, width), 112 / Math.max(1, height));
496
+ const offsetX = (200 - width * scale) / 2, offsetY = (128 - height * scale) / 2;
497
+ geometry = { minX, minY, scale, viewport, offsetX, offsetY };
498
+ const place = (element, box) => { for (const [key, value] of Object.entries({ x: offsetX + (box.x - minX) * scale, y: offsetY + (box.y - minY) * scale, width: Math.max(1, box.width * scale), height: Math.max(1, box.height * scale) })) attribute(element,key,value); };
499
+ const visible = new Set(boards.map(board => board.artifactId));
500
+ for (const [id, value] of mapBoards) if (!visible.has(id)) { value.remove(); mapBoards.delete(id); }
501
+ for (const board of boards) {
502
+ let value = mapBoards.get(board.artifactId);
503
+ if (!value) {
504
+ value = document.createElementNS(svg.namespaceURI, 'rect');
505
+ for (const [key, entry] of Object.entries({ class:'design-minimap-board', 'data-map-artifact':board.artifactId, role:'button', tabindex:'0', 'aria-label':`Focus ${design.screens.find(item => item.id === board.screenId).title}, ${board.frameId}` })) attribute(value,key,entry);
506
+ mapBoards.set(board.artifactId,value); svg.insertBefore(value,viewportRect);
507
+ }
508
+ place(value,board);
509
+ }
510
+ place(viewportRect,viewport);
511
+ }
512
+ const schedule = () => { if (!scheduled) { scheduled = true; requestAnimationFrame(() => { scheduled = false; draw(); }); } };
513
+ on(root, 'planr:design-render', schedule); on(root, 'planr:design-camera', schedule); on(window, 'resize', schedule);
514
+ let dragging = false;
515
+ const move = event => { if (!geometry) return; const bounds = svg.getBoundingClientRect(); const x = (event.clientX - bounds.left) * 200 / bounds.width, y = (event.clientY - bounds.top) * 128 / bounds.height; const worldX = geometry.minX + (x - geometry.offsetX) / geometry.scale, worldY = geometry.minY + (y - geometry.offsetY) / geometry.scale; studio.setCamera({ x: scroll.clientWidth / 2 - worldX * state().zoom, y: scroll.clientHeight / 2 - worldY * state().zoom }); };
516
+ on(svg, 'pointerdown', event => { event.preventDefault(); dragging = true; svg.setPointerCapture(event.pointerId); move(event); });
517
+ on(svg, 'pointermove', event => { if (dragging) move(event); }); for (const type of ['pointerup', 'pointercancel']) on(svg, type, () => { dragging = false; });
518
+ on(svg, 'keydown', event => { if (!['Enter', ' '].includes(event.key)) return; const selected = payload.entries.find(item => item.artifactId === event.target.dataset.mapArtifact); if (selected) { event.preventDefault(); studio.selectEntry(selected); studio.fitSelection(); } });
519
+ on(root, 'dblclick', event => { const header = event.target.closest('[data-design-drag]'); if (header && state().view === 'canvas') { event.preventDefault(); studio.selectEntry(payload.entries.find(item => item.artifactId === header.dataset.designDrag)); studio.fitSelection(); } });
520
+ let chrome = null, focusBeforePresentation = null;
521
+ const restore = () => {
522
+ if (!chrome) return;
523
+ const snapshot = chrome; chrome = null; root.dataset.designRestoring = 'true'; delete root.dataset.designPresentation;
524
+ studio.restorePresentation(snapshot); presentation.textContent = 'Present fullscreen'; exit.hidden = true;
525
+ requestAnimationFrame(() => requestAnimationFrame(() => { if (disposed) return; studio.restorePresentation(snapshot); delete root.dataset.designRestoring; const hiddenMenu = focusBeforePresentation?.closest('details:not([open])'); const target = hiddenMenu ? q('summary',hiddenMenu) : focusBeforePresentation?.isConnected && focusBeforePresentation.getClientRects().length ? focusBeforePresentation : q('summary',more); target?.focus(); schedule(); }));
526
+ };
527
+ const exit = button('Exit presentation', async () => { if (document.fullscreenElement) await document.exitFullscreen().catch(() => {}); restore(); }, { class: 'design-exit-presentation', hidden: '' }); root.append(exit);
528
+ const settlePresentation = async () => {
529
+ // Fullscreen and panel collapse both change the stage's containing block.
530
+ // Measuring in the click task can observe a zero/intermediate viewport and
531
+ // leave the selected artboard at the minimum zoom, outside the visible area.
532
+ await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
533
+ if (!chrome || root.dataset.designPresentation !== 'true' || disposed) return;
534
+ if (state().view === 'canvas') studio.fitSelection({ save: false });
535
+ else studio.fit({ save: false });
536
+ schedule();
537
+ };
538
+ async function fullscreen() {
539
+ if (chrome) { await exit.click(); return; }
540
+ chrome = state(); focusBeforePresentation = document.activeElement; root.dataset.designPresentation = 'true'; inspector(false); studio.setPanels({ navOpen: false, reviewOpen: false }, { save: false }); presentation.textContent = 'Exit presentation'; exit.hidden = false;
541
+ if (root.requestFullscreen) { try { await root.requestFullscreen(); } catch { announce('Presentation view is ready. Fullscreen is unavailable in this browser.'); } }
542
+ await settlePresentation();
543
+ }
544
+ on(document, 'fullscreenchange', () => { if (!document.fullscreenElement) restore(); });
545
+ on(document, 'keydown', event => { if (event.key === 'Escape' && chrome && !activeDialog) { event.preventDefault(); restore(); return; } if (event.target.closest('input,textarea,select,[contenteditable="true"]') || activeDialog) return; if (event.shiftKey && ['1', '!'].includes(event.key)) { event.preventDefault(); studio.fit(); } else if (event.shiftKey && ['2', '@'].includes(event.key)) { event.preventDefault(); studio.fitSelection(); } else if (event.key === '?') { event.preventDefault(); shortcuts(); } });
546
+ draw();
547
+ }
548
+ function shortcuts() {
549
+ const { content } = modal('Keyboard shortcuts'); const table = node('dl', '', { class: 'design-shortcuts' });
550
+ for (const [key, description] of [['I', 'Interact with the product'], ['C', 'Annotate the design'], ['H', 'Select the Pan tool'], ['Space + drag', 'Temporarily pan, then return to the selected tool'], ['Middle mouse / trackpad', 'Move around the canvas from anywhere'], ['Ctrl / ⌘ + wheel', 'Zoom around the pointer'], ['Shift + 1', 'Fit all artboards'], ['Shift + 2', 'Fit the selected artboard'], ['Double-click artboard title', 'Focus an artboard'], ['Arrows on artboard title', 'Move artboard · hold Shift for larger steps'], ['← / → in walkthrough', 'Previous / next screen'], ['Escape', 'Leave Pan or Inspect; dismiss notes, dialogs or presentation'], ['?', 'Show these shortcuts']]) table.append(node('dt', key), node('dd', description)); content.append(table);
551
+ }
552
+ let inspectContent, reviewTabs, inspectOverlays = [], inspectedTarget = null;
553
+ function inspector(enabled) {
554
+ if (enabled && payload.staticArtifacts?.includes(entry()?.artifactId)) { announce('This screen is a static reference. Read its authored guidance; component internals are not available.'); enabled = false; }
555
+ studio.setTool(enabled ? 'inspect' : 'interact');
556
+ }
557
+ function applyInspector(enabled) {
558
+ inspectorEnabled = enabled; root.dataset.designInspect = String(enabled);
559
+ if (enabled) studio.setPanels({ reviewOpen: true });
560
+ for (const overlay of inspectOverlays) overlay.hidden = !enabled;
561
+ const picker = q('[data-design-inspect-mode]'); picker?.setAttribute('aria-pressed', String(enabled));
562
+ const selectControl = q('[data-design-inspect-start]'); if (selectControl) { selectControl.textContent = enabled ? 'Stop selecting elements' : 'Select an element'; selectControl.setAttribute('aria-pressed', String(enabled)); }
563
+ }
564
+ function installInspector() {
565
+ if (reviewerAudience()) return;
566
+ const reviewBody = node('section', '', { class: 'design-review-panel', id: 'design-review-panel', role: 'tabpanel', 'aria-labelledby': 'design-review-tab' });
567
+ for (const child of [...rail.children]) if (child.tagName !== 'HEADER' && !child.classList.contains('design-resize-handle')) reviewBody.append(child);
568
+ rail.append(reviewBody);
569
+ reviewTabs = node('div', '', { class: 'design-rail-tabs', role: 'tablist', 'aria-label': 'Sidebar content' });
570
+ const reviewButton = button('Review', () => switchRail('review'), { role: 'tab', 'aria-selected': 'true', 'aria-controls': 'design-review-panel', id: 'design-review-tab' });
571
+ const inspectButton = button('Inspect', () => switchRail('inspect'), { role: 'tab', 'aria-selected': 'false', 'aria-controls': 'design-inspect-panel', id: 'design-inspect-tab', tabindex: '-1' }); reviewTabs.append(reviewButton, inspectButton); rail.querySelector('header').after(reviewTabs);
572
+ inspectContent = node('section', '', { class: 'design-inspector', id: 'design-inspect-panel', role: 'tabpanel', 'aria-labelledby': 'design-inspect-tab', hidden: '' }); rail.append(inspectContent);
573
+ const picker = button('Inspect', () => { switchRail('inspect'); inspector(!inspectorEnabled); }, { 'data-design-inspect-mode': '', 'aria-pressed': 'false', title: 'Inspect a product element without activating it' }); q('.design-interaction-picker').append(picker);
574
+ on(reviewTabs, 'keydown', event => { if (['ArrowLeft', 'ArrowRight'].includes(event.key)) { event.preventDefault(); switchRail(railTab === 'review' ? 'inspect' : 'review'); q('[aria-selected="true"]', reviewTabs).focus(); } });
575
+ const selectTarget = async (value, overlay, point) => {
576
+ const bridge = stage.getFrame(value.artifactId)?.__openPlanrBridge;
577
+ try { const result = point ? await bridge?.inspectAt?.(point.x, point.y) : await bridge?.inspect?.(value); if (!result) throw new Error('Element inspection is unavailable for this screen. Authored implementation guidance is available below.'); renderInspector(result); if (overlay && result.rect) { let highlight = q('.design-inspect-highlight', overlay); if (!highlight) { highlight = node('span', '', { class: 'design-inspect-highlight' }); overlay.append(highlight); } Object.assign(highlight.style, { left: `${result.rect.x}px`, top: `${result.rect.y}px`, width: `${result.rect.width}px`, height: `${result.rect.height}px` }); } }
578
+ catch (error) { announce(error.message, true); }
579
+ };
580
+ for (const value of payload.entries) {
581
+ const panel = stage.getPanel(value.artifactId), frame = stage.getFrame(value.artifactId);
582
+ const overlay = node('div', '', { class: 'design-inspect-overlay', role: 'button', tabindex: '0', 'aria-label': `Inspect elements in ${design.screens.find(item => item.id === value.screenId).title}`, hidden: '' }); q('.planr-frame', panel).append(overlay); inspectOverlays.push(overlay);
583
+ on(overlay, 'pointerdown', event => { event.preventDefault(); event.stopPropagation(); });
584
+ on(overlay, 'click', event => { event.preventDefault(); event.stopPropagation(); const rect = frame.getBoundingClientRect(), viewport = design.frames.find(item => item.id === value.frameId); studio.selectEntry(value); void selectTarget(value, overlay, { x: clamp((event.clientX - rect.left) * viewport.width / rect.width, 0, viewport.width), y: clamp((event.clientY - rect.top) * viewport.height / rect.height, 0, viewport.height) }); });
585
+ on(overlay, 'keydown', event => { if (event.key === 'Escape') { inspector(false); reviewButton.focus(); } else if (event.key === 'Enter') { event.preventDefault(); const first = design.screens.find(item => item.id === value.screenId)?.anchors?.[0]; if (first) void selectTarget({ ...value, planrId: first, screen: value.screenId }); else announce('This screen has no named element anchors. Use pointer inspection or read the screen guidance.'); } });
586
+ }
587
+ on(root, 'planr:design-tool-change', event => applyInspector(event.detail.tool === 'inspect'));
588
+ const selection = () => `${state().screenId}:${state().frameId}:${state().variantId}`;
589
+ let selected = selection(); on(root, 'planr:design-render', () => { if (inspectorEnabled) for (const value of payload.entries) stage.getFrame(value.artifactId).tabIndex = -1; if (selected !== selection()) { selected = selection(); inspectedTarget = null; if (payload.staticArtifacts?.includes(entry()?.artifactId)) inspector(false); if (railTab === 'inspect') renderInspector(); } });
590
+ renderInspector();
591
+ }
592
+ function switchRail(tab) {
593
+ if (!inspectContent) return;
594
+ railTab = tab; root.dataset.designRailTab = tab; inspectContent.hidden = tab !== 'inspect'; q('#design-review-panel').hidden = tab !== 'review'; studio.setPanels({ reviewOpen: true });
595
+ qa('[role="tab"]', reviewTabs).forEach(value => { const selected = value.textContent.toLowerCase() === tab; value.setAttribute('aria-selected', String(selected)); value.tabIndex = selected ? 0 : -1; });
596
+ if (tab === 'review') inspector(false); else renderInspector();
597
+ }
598
+ function renderInspector(computed = inspectedTarget) {
599
+ if (!inspectContent) return;
600
+ inspectedTarget = computed;
601
+ const expanded = new Set(qa('details[open]', inspectContent).map(value => value.querySelector('summary')?.textContent));
602
+ inspectContent.replaceChildren();
603
+ inspectContent.append(node('p', 'Read-only implementation guidance', { class: 'design-eyebrow' }), node('h3', design.screens.find(item => item.id === state().screenId)?.title || 'Screen'));
604
+ const inspectToggle = button(inspectorEnabled ? 'Stop selecting elements' : 'Select an element', () => { inspector(!inspectorEnabled); renderInspector(computed); }, { class: 'design-primary', 'data-design-inspect-start':'', 'aria-pressed': String(inspectorEnabled) }); inspectContent.append(inspectToggle);
605
+ if (payload.staticArtifacts?.includes(entry()?.artifactId)) { inspectToggle.disabled = true; inspectContent.append(node('p', 'Static reference · depicted component internals are unavailable. The guidance below is authored separately.', {class:'design-muted'})); }
606
+ if (computed) {
607
+ const asset = ['IMG','SVG','CANVAS','IMAGE'].includes(String(computed.tagName).toUpperCase());
608
+ const detail = node('details', '', { open: '' }); detail.append(node('summary', `${asset ? 'Asset properties' : 'Computed'} · ${computed.tagName || 'element'}`));
609
+ const values = node('dl', '', { class: 'design-inspect-values' });
610
+ for (const [key, value] of Object.entries(computed.rect || {})) values.append(node('dt', key), node('dd', `${Math.round(value * 100) / 100}px`));
611
+ if (computed.anchor?.planrId) values.append(node('dt', 'Anchor'), node('dd', computed.anchor.planrId));
612
+ for (const [key, value] of Object.entries(computed.styles || {})) values.append(node('dt', key), node('dd', String(value)));
613
+ for (const [key, value] of Object.entries(computed.accessibility || {})) if (value !== null && value !== '') values.append(node('dt', key), node('dd', String(value)));
614
+ detail.append(values, node('p', asset ? 'This is an image or vector asset. Its depicted component internals cannot be inspected. Use authored implementation guidance below.' : 'Computed in this frame. These values describe the current render, not a reusable component contract.', { class: 'design-muted' })); inspectContent.append(detail);
615
+ }
616
+ const implementation = (experience?.reviewContext || payload.reviewContext)?.implementation || {};
617
+ const section = (title, values, renderValue) => { const detail = node('details'); detail.append(node('summary', title)); if (!values?.length) detail.append(node('p', 'Not documented for this design yet.', { class: 'design-muted' })); else values.forEach(value => detail.append(renderValue(value))); inspectContent.append(detail); };
618
+ section('Authored tokens', implementation.tokens, value => { const line = node('div', '', { class: 'design-token' }); line.append(node('strong', value.name), node('code', value.value)); if (value.description) line.append(node('p', value.description)); return line; });
619
+ section('Components & states', implementation.components?.filter(value => !value.screenIds?.length || value.screenIds.includes(state().screenId)), value => { const group = node('div', '', { class: 'design-component-guide' }); group.append(node('h4', value.name)); if (value.notes) group.append(node('p', value.notes)); for (const item of value.states || []) group.append(node('p', `${item.name}: ${item.description || ''}`)); if (value.responsive) group.append(node('p', `Responsive: ${value.responsive}`)); if (value.accessibility) group.append(node('p', `Accessibility: ${value.accessibility}`)); return group; });
620
+ section('Responsive rules', implementation.responsive, text => node('p', text)); section('Accessibility requirements', implementation.accessibility, text => node('p', text));
621
+ const screen = design.screens.find(value => value.id === state().screenId); if (screen.description) { const detail = node('details'); detail.append(node('summary', 'Screen notes'), node('p', screen.description)); inspectContent.append(detail); }
622
+ for (const detail of qa('details', inspectContent)) if (expanded.has(detail.querySelector('summary')?.textContent)) detail.open = true;
623
+ }
624
+ async function history() {
625
+ const { content, status, dialog } = modal('Revision history', 'design-history'); status.textContent = 'Loading published revisions…';
626
+ try {
627
+ const value = await request('listRevisions', 'revisionsUrl'); const revisions = Array.isArray(value) ? value : value.revisions || [];
628
+ status.textContent = ''; if (!revisions.length) { content.append(node('p', 'This design has no earlier published revisions yet.')); return; }
629
+ content.append(node('p', 'Compare published content. Comments stay attached to the revision where they were made.', { class: 'design-muted' }));
630
+ if (revisions.length > 1) content.append(button('Compare latest revisions', () => compareRevisions(), {class:'design-primary'}));
631
+ for (const [index, item] of revisions.entries()) { const id = item.revision || item.id; const card = node('article', '', { class: 'design-revision-item' }); card.append(node('strong', `${index === 0 ? 'Latest · ' : ''}${item.createdAt ? new Date(item.createdAt).toLocaleString() : id.slice(0, 12)}`)); if (item.summary) card.append(node('p', item.summary)); card.append(node('code', id.slice(0, 12)));
632
+ const previous = revisions[index + 1];
633
+ if (item.fingerprints?.length && previous?.fingerprints?.length) {
634
+ const diffs = screenDifferences(previous.fingerprints, item.fingerprints); const changed = Object.values(diffs).filter(value => value !== 'Unchanged');
635
+ card.append(node('span', changed.length ? `${changed.length} screens changed · ${[...new Set(changed)].join(', ')}` : 'Design unchanged · runtime or publication only', {class:'design-revision-badge'}));
636
+ } else if (previous) card.append(node('span', 'Rendered-output comparison available', {class:'design-revision-badge'}));
637
+ if (revisions.length > 1) card.append(button('Compare with current', () => compareRevisions(id, value.currentRevision || revisions[0].revision || revisions[0].id), { disabled: id === (value.currentRevision || revisions[0].revision || revisions[0].id) ? '' : undefined }));
638
+ content.append(card);
639
+ }
640
+ if (!dialog.isConnected) return;
641
+ } catch (error) { status.textContent = error.message; content.append(button('Retry', history)); }
642
+ }
643
+ async function loadRevision(id) { return options().loadRevision ? options().loadRevision(id) : request('loadRevision', 'revisionsUrl', { revision: id }); }
644
+ function screenDifferences(before, after) {
645
+ const ids = [...new Set([...before, ...after].map(item => item.screenId))];
646
+ const signature = (items, field) => JSON.stringify(items.map(item => [`${item.variantId}:${item.frameId}`, item[field]]).sort((a,b)=>a[0].localeCompare(b[0])));
647
+ return Object.fromEntries(ids.map(id => {
648
+ const a = before.filter(item=>item.screenId===id), b = after.filter(item=>item.screenId===id);
649
+ return [id, !a.length ? 'Added' : !b.length ? 'Removed' : signature(a,'contentDigest') !== signature(b,'contentDigest') ? 'Changed' : signature(a,'guidanceDigest') !== signature(b,'guidanceDigest') ? 'Notes' : 'Unchanged'];
650
+ }));
651
+ }
652
+ let badgeRevision = null;
653
+ async function updateScreenBadges() {
654
+ if (badgeRevision === revision() || !(options().revisionsUrl || options().listRevisions)) return;
655
+ badgeRevision = revision();
656
+ try {
657
+ const value = options().listRevisions ? await options().listRevisions({brief:true}) : await request('listRevisions','revisionsUrl'); const revisions = Array.isArray(value) ? value : value.revisions || [];
658
+ const index = Math.max(0,revisions.findIndex(item => (item.revision || item.id) === revision())); const previous = revisions[index+1];
659
+ if (!previous) return;
660
+ const old = previous.fingerprints?.length ? previous : await loadRevision(previous.revision || previous.id);
661
+ const current = experience?.fingerprints || payload.fingerprints;
662
+ if (!old.fingerprints?.length || !current?.length || disposed) return;
663
+ const differences = screenDifferences(old.fingerprints,current);
664
+ for (const screen of qa('[data-design-screen]')) { q('.design-screen-change',screen)?.remove(); const change = differences[screen.dataset.designScreen]; if (change && change !== 'Unchanged') screen.append(node('span',change,{class:'design-screen-change'})); }
665
+ } catch { /* History retains an explicit retry state without blocking the current design. */ badgeRevision = null; }
666
+ }
667
+ async function compareRevisions(beforeId, afterId) {
668
+ const { content, status, dialog } = modal('Compare revisions', 'design-comparison'); status.textContent = 'Loading both revisions…';
669
+ const observers = []; let pairSerial = 0, renderSerial = 0;
670
+ dialog.addEventListener('close', () => observers.splice(0).forEach(value => value.disconnect()));
671
+ try {
672
+ const history = await request('listRevisions', 'revisionsUrl');
673
+ const revisions = Array.isArray(history) ? history : history.revisions || [];
674
+ if (!revisions.length) { status.textContent = 'No published revisions are available for comparison.'; return; }
675
+ afterId ||= history.currentRevision || revisions[0].revision || revisions[0].id;
676
+ beforeId ||= revisions.find(item => (item.revision || item.id) !== afterId)?.revision || revisions.find(item => (item.revision || item.id) !== afterId)?.id || afterId;
677
+ const revisionChoices = revisions.map(item => [item.revision || item.id, `${item.createdAt ? new Date(item.createdAt).toLocaleString() : 'Revision'} · ${(item.revision || item.id).slice(0,8)}`]);
678
+ const beforeSelect = select('Before revision', revisionChoices, beforeId), afterSelect = select('After revision', revisionChoices, afterId);
679
+ const revisionsRow = node('div', '', { class: 'design-comparison-controls' });
680
+ for (const [title, field] of [['Before', beforeSelect], ['After', afterSelect]]) { const label = node('label', title); label.append(field); revisionsRow.append(label); } content.append(revisionsRow);
681
+ const screenSelect = select('Comparison screen', [], ''), frameSelect = select('Comparison frame', [], ''), variantSelect = select('Comparison direction', [], '');
682
+ const controls = node('div', '', { class: 'design-comparison-controls' }); controls.append(screenSelect, frameSelect, variantSelect); content.append(controls);
683
+ const summary = node('p', '', { class: 'design-comparison-summary' }), boards = node('div', '', { class: 'design-comparison-boards' }); content.append(summary, boards);
684
+ let before, after;
685
+ const choices = (field, values, fallback) => { const current = field.value || fallback; field.replaceChildren(...values.map(([id, text]) => node('option', text, { value: id }))); field.value = values.some(([id]) => id === current) ? current : values[0]?.[0] || ''; };
686
+ const title = id => after.design.screens.find(item => item.id === id)?.title || before.design.screens.find(item => item.id === id)?.title || id;
687
+ const render = async () => {
688
+ const attempt = ++renderSerial; observers.splice(0).forEach(value => value.disconnect()); boards.replaceChildren(); status.textContent = 'Preparing isolated previews…';
689
+ const selectedScreen = screenSelect.value, selectedFrame = frameSelect.value, selectedVariant = variantSelect.value;
690
+ const matches = item => item.screenId === selectedScreen && item.frameId === selectedFrame && item.variantId === selectedVariant;
691
+ const a = before.fingerprints?.find(matches), b = after.fingerprints?.find(matches);
692
+ const beforeEntry = before.entries.find(matches), afterEntry = after.entries.find(matches);
693
+ summary.textContent = !beforeEntry ? 'Added screen, frame or direction' : !afterEntry ? 'Removed screen, frame or direction' : !a || !b ? 'Rendered-output comparison · authored source fingerprints are unavailable for this revision' : a.contentDigest !== b.contentDigest ? 'Product design changed' : a.guidanceDigest !== b.guidanceDigest ? 'Guidance changed · product design unchanged' : 'Product design and guidance unchanged · publication or studio runtime only';
694
+ const windows = [];
695
+ for (const [name, bundle, id, selectedEntry] of [['Before', before, beforeSelect.value, beforeEntry], ['After', after, afterSelect.value, afterEntry]]) {
696
+ const card = node('section', '', { class: 'design-comparison-card', 'aria-label': `${name} revision` }); card.append(node('h3', `${name} · ${id.slice(0,8)}`)); boards.append(card);
697
+ if (!selectedEntry) { card.append(node('p', 'This screen, direction or frame does not exist in this revision.', { class: 'design-comparison-missing' })); continue; }
698
+ const artifact = bundle.envelope.artifacts.find(item => item.id === selectedEntry.artifactId);
699
+ let source = bundle.comparisonSources?.[artifact.id];
700
+ if (!source && typeof options().prepareComparisonSource === 'function') source = await options().prepareComparisonSource({ artifact, revision: id });
701
+ if (attempt !== renderSerial || !dialog.isConnected) return;
702
+ if (typeof source !== 'string') { card.append(node('p', 'Isolated comparison is unavailable in this host. The current design remains usable.', { class: 'design-comparison-missing' })); continue; }
703
+ const viewport = artifact.viewport || bundle.design.frames.find(item => item.id === selectedFrame);
704
+ const windowNode = node('div', '', { class: 'design-comparison-window', tabindex: '0', 'aria-label': `Scroll ${name.toLowerCase()} preview` });
705
+ const scaled = node('div', '', { class: 'design-comparison-scaled' });
706
+ const iframe = node('iframe', '', { sandbox: 'allow-scripts allow-forms', referrerpolicy: 'no-referrer', title: `${name}: ${title(selectedScreen)}`, tabindex: '-1' });
707
+ iframe.srcdoc = source; iframe.style.width = `${viewport.width}px`; iframe.style.height = `${viewport.height}px`; scaled.append(iframe); windowNode.append(scaled); card.append(windowNode); windows.push(windowNode);
708
+ const comments = (bundle.review?.pins || bundle.envelope.review?.pins || []).filter(pin => pin.artifactId === artifact.id);
709
+ const commentList = node('details'); commentList.append(node('summary', `${comments.length} comments on this revision`));
710
+ for (const [index,pin] of comments.entries()) {
711
+ const quote = node('p', `${pin.author?.name || 'Reviewer'}: ${pin.comment}`); quote.id = `compare-${name}-${index}`; commentList.append(quote);
712
+ const marker = button(String(index + 1), () => { commentList.open = true; quote.scrollIntoView({block:'nearest'}); }, {class:'design-comparison-pin', 'aria-label': `Read ${name.toLowerCase()} comment ${index+1}`});
713
+ marker.style.left = `${pin.region.x*100}%`; marker.style.top = `${pin.region.y*100}%`; scaled.append(marker);
714
+ }
715
+ if (comments.length) card.append(commentList);
716
+ const fit = () => { const ratio = Math.min(1, windowNode.clientWidth / viewport.width); iframe.style.transform = `scale(${ratio})`; scaled.style.height = `${viewport.height * ratio}px`; };
717
+ requestAnimationFrame(fit); if (typeof ResizeObserver === 'function') { const observer = new ResizeObserver(fit); observer.observe(windowNode); observers.push(observer); }
718
+ const notes = bundle.design.screens.find(item=>item.id===selectedScreen)?.description; if (notes) { const detail=node('details');detail.append(node('summary','Notes on this revision'),node('p',notes));card.append(detail); }
719
+ }
720
+ let scrolling = false;
721
+ for (const windowNode of windows) windowNode.addEventListener('scroll', () => { if (scrolling) return; scrolling = true; for (const other of windows) if (other !== windowNode) other.scrollTop = (windowNode.scrollTop / Math.max(1,windowNode.scrollHeight - windowNode.clientHeight)) * Math.max(0,other.scrollHeight - other.clientHeight); requestAnimationFrame(()=>{scrolling=false;}); });
722
+ status.textContent = 'Read-only comparison · scrolling is synchronized. Return to the design to interact or comment.';
723
+ };
724
+ const loadPair = async () => {
725
+ const attempt=++pairSerial; status.textContent='Loading revisions…';
726
+ try {
727
+ const pair=await Promise.all([loadRevision(beforeSelect.value),loadRevision(afterSelect.value)]); if (attempt!==pairSerial || !dialog.isConnected)return;[before,after]=pair;
728
+ const ids=[...new Set([...after.design.screenOrder,...before.design.screenOrder])];choices(screenSelect,ids.map(id=>[id,title(id)]),state().screenId);
729
+ const frames=[...new Map([...after.design.frames,...before.design.frames].map(item=>[item.id,item])).values()];choices(frameSelect,frames.map(item=>[item.id,item.label]),state().frameId);
730
+ const variants=[...new Map([...after.design.variants,...before.design.variants].filter(item=>item.status==='ready').map(item=>[item.id,item])).values()];choices(variantSelect,variants.map(item=>[item.id,item.label]),state().variantId);
731
+ await render();
732
+ } catch(error){status.textContent=error.message;}
733
+ };
734
+ for (const field of [beforeSelect,afterSelect]) field.addEventListener('change',()=>void loadPair());
735
+ for (const field of [screenSelect,frameSelect,variantSelect]) field.addEventListener('change',()=>void render().catch(error=>{status.textContent=error.message;}));
736
+ await loadPair();
737
+ } catch (error) { status.textContent = error.message; content.append(button('Retry comparison', () => compareRevisions(beforeId, afterId))); }
738
+ }
739
+ async function handoff() {
740
+ const { content, status } = modal('Review handoff', 'design-handoff'); status.textContent = 'Loading review decisions…'; let response;
741
+ const render = () => {
742
+ content.replaceChildren(); const draft = response.draft;
743
+ content.append(node('p', 'Turn accepted feedback into a proposed implementation brief. Approval records your decision; Plan remains a separate invocation.', { class: 'design-muted' }));
744
+ if (!draft) { content.append(button('Generate proposed handoff', () => act({ action: 'draft', version: 0 }), { class: 'design-primary' })); return; }
745
+ content.append(node('p', response.current ? (draft.status === 'approved' ? 'Approved for this design and feedback snapshot.' : 'Ready for your review.') : 'Outdated: the design or feedback changed. Regenerate before approval.', { class: 'design-handoff-state' }));
746
+ const title = node('label', 'Summary'); const summary = node('textarea', '', { 'aria-label': 'Handoff summary', maxlength: '16384' }); summary.value = draft.content.summary || ''; title.append(summary); content.append(title);
747
+ const fields = {};
748
+ for (const [key, title] of [['agreedChanges', 'Accepted changes'], ['openQuestions', 'Unresolved questions & blockers'], ['deferred', 'Deferred'], ['rejected', 'Declined']]) {
749
+ const group = node('section'); group.append(node('h3', title)); fields[key] = [];
750
+ if (!(draft.content[key] || []).length) group.append(node('p', 'None recorded.', { class: 'design-muted' }));
751
+ for (const item of draft.content[key] || []) { const field = node('textarea', '', { 'aria-label': `${title}: ${item.pinId || 'note'}`, maxlength: '8192' }); field.value = item.refinement || ''; fields[key].push({ field, item }); group.append(node('blockquote', item.text, { class: 'design-review-quote' }), node('label', 'Implementation refinement'), field); if (item.pinId) group.append(button(`View comment ${item.pinId.slice(0, 8)}`, () => { activeDialog?.dismiss(); const currentReview = stage.review.getState().review; if ((item.revisionId && item.revisionId !== revision()) || (item.reviewOf && item.reviewOf !== currentReview?.reviewOf) || (item.reviewId && item.reviewId !== currentReview?.reviewId)) { void history(); announce('This source comment belongs to another review snapshot. Inspect its original revision; it has not been relocated.'); return; } const pin = currentReview?.pins.find(value => value.id === item.pinId); if (pin) { const value = payload.entries.find(value => value.artifactId === pin.artifactId); if (value) studio.selectEntry(value); stage.review.selectPin?.(pin.id); studio.setPanels({ reviewOpen: true }); } else announce('This comment belongs to an earlier revision. Open revision history to inspect it.'); }, { class: 'design-text-button' })); }
752
+ content.append(group);
753
+ }
754
+ let edited = false;
755
+ const actions = node('div', '', { class: 'design-dialog-actions' });
756
+ const save = button('Save draft', () => act({ action: 'update', version: draft.version, content: { ...draft.content, summary: summary.value, ...Object.fromEntries(Object.entries(fields).map(([key, items]) => [key, items.map(({ field, item }) => ({ ...item, refinement: field.value }))])) } }));
757
+ const approve = button('Approve handoff', () => act({ action: 'approve', version: draft.version, contentHash: draft.contentHash }), { class: 'design-primary' }); approve.disabled = !response.current || draft.status === 'approved';
758
+ for (const input of qa('textarea', content)) input.addEventListener('input', () => { edited = true; approve.disabled = true; status.textContent = 'Save your edits before approving.'; });
759
+ const regenerate = button('Regenerate from reviews', () => { if (!edited || window.confirm('Replace your unsaved handoff edits with current review decisions?')) void act({ action: 'draft', version: draft.version }); }); actions.append(save, approve, regenerate); content.append(actions);
760
+ if (draft.markdown) content.append(button('Copy handoff', async () => { try { await navigator.clipboard.writeText(draft.markdown); status.textContent = 'Handoff copied.'; } catch { const output = node('textarea', '', { 'aria-label': 'Copy handoff Markdown', readonly: '' }); output.value = draft.markdown; content.append(output); output.focus(); output.select(); } }));
761
+ };
762
+ const act = async input => {
763
+ const previousDisabled = new Map(qa('button', content).map(value => [value,value.disabled]));
764
+ qa('button', content).forEach(value => { value.disabled = true; }); status.textContent = 'Saving…';
765
+ try { response = await request('updateHandoff', 'handoffUrl', { ...input, revision: revision() }); if (response.metadata) metadata = response.metadata; render(); status.textContent = input.action === 'approve' ? 'Handoff approved. Invoke Plan separately when you are ready.' : 'Draft saved.'; updateFilters(); }
766
+ catch (error) { status.textContent = error.message; for (const [value,disabled] of previousDisabled) if (value.isConnected) value.disabled = disabled; }
767
+ };
768
+ try { response = await request('loadHandoff', 'handoffUrl'); if (response.metadata) metadata = response.metadata; render(); status.textContent = ''; }
769
+ catch (error) { status.textContent = error.message; content.append(button('Retry', handoff)); }
770
+ }
771
+ async function refreshExperience() {
772
+ const previousContext = JSON.stringify(experience?.reviewContext || payload.reviewContext);
773
+ try { experience = await request('loadExperience', 'experienceUrl'); metadata = experience.metadata || metadata; }
774
+ catch { experience = { reviewContext: payload.reviewContext, capabilities: { owner: Boolean(options().handoffUrl), revisions: Boolean(options().revisionsUrl || options().listRevisions), handoff: Boolean(options().handoffUrl || options().updateHandoff) } }; }
775
+ if (disposed) return;
776
+ updateFilters(); if (previousContext !== JSON.stringify(experience?.reviewContext || payload.reviewContext)) renderInspector();
777
+ let actionBar = q('.design-experience-actions'); if (!actionBar) { actionBar = node('div', '', { class: 'design-experience-actions' }); q('.design-nav-footer').before(actionBar); }
778
+ const signature = `${owner()}:${Boolean(experience.capabilities?.revisions || options().listRevisions || options().revisionsUrl)}:${Boolean(options().handoffUrl || options().updateHandoff)}`;
779
+ if (actionBar.dataset.signature !== signature) {
780
+ actionBar.dataset.signature = signature; actionBar.replaceChildren(button('About this review', () => about()));
781
+ if (experience.capabilities?.revisions || options().listRevisions || options().revisionsUrl) actionBar.append(button('Revision history', history));
782
+ if (owner() && (options().handoffUrl || options().updateHandoff)) actionBar.append(button('Prepare handoff', handoff));
783
+ }
784
+ void updateScreenBadges();
785
+ }
786
+ function mount() {
787
+ studio = window.__openPlanrDesignStudio; stage = window.__openPlanrArtifactStage; root = q('.planr-shell'); rail = q('.planr-review-rail');
788
+ root.dataset.designAudience=reviewerAudience() ? 'reviewer' : 'owner';
789
+ if (reviewerAudience()) for (const value of qa('.design-direction-review,[data-design-verification],.planr-decision-slot')) value.hidden=true;
790
+ installMobileViewport(); installProfileAndTheme(); installReadability(); installReview(); installComposerCategory(); installInspector(); installCanvas(); installThumbnails(); installPersonalDrafts();
791
+ // The published payload already contains the authorized introduction. Show
792
+ // it before any asynchronous metadata refresh can expose the board first.
793
+ about(true);
794
+ options().onExperienceReady?.();
795
+ void refreshExperience();
796
+ on(document, 'planr:design-experience-change', event => { if (event.detail?.metadata) { metadata = event.detail.metadata; updateFilters(); } if (event.detail?.reviewContext) { experience = { ...experience, reviewContext: event.detail.reviewContext }; renderInspector(); } });
797
+ on(document, 'openplanr:design-experience-changed', () => { void refreshExperience(); });
798
+ const dispose = () => { disposed = true; activeDialog?.dismiss(); for (const remove of destroyers.splice(0)) remove(); clearTimeout(toastTimer); };
799
+ on(window, 'pagehide', dispose); on(root, 'planr:design-destroy', dispose);
800
+ window.__openPlanrDesignExperience = Object.freeze({ about, profile:editProfile, setTheme, history, compare: compareRevisions, handoff, refresh: refreshExperience, getState: () => ({ railTab, inspectorEnabled, profile:{...profile}, theme:themePreference, metadata: structuredClone(metadata) }) });
801
+ }
802
+ const started = Date.now();
803
+ function boot() { if (document.getElementById('planr-design-studio-payload') !== payloadNode) return; if (window.__openPlanrDesignStudio && window.__openPlanrArtifactStage) mount(); else if (Date.now() - started < 15000) setTimeout(boot, 30); }
804
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true }); else boot();
805
+ })();