openplanr 2.2641.1 → 3.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 (315) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +1 -1
  3. package/dist/cli/commands/artifact.js +1 -1
  4. package/dist/cli/commands/artifact.js.map +1 -1
  5. package/dist/cli/commands/doctor.d.ts.map +1 -1
  6. package/dist/cli/commands/doctor.js +19 -4
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/github.d.ts.map +1 -1
  9. package/dist/cli/commands/github.js +7 -10
  10. package/dist/cli/commands/github.js.map +1 -1
  11. package/dist/cli/commands/linear.js +1 -1
  12. package/dist/cli/commands/linear.js.map +1 -1
  13. package/dist/cli/commands/report.d.ts.map +1 -1
  14. package/dist/cli/commands/report.js +28 -32
  15. package/dist/cli/commands/report.js.map +1 -1
  16. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  17. package/dist/cli/commands/upgrade.js +12 -10
  18. package/dist/cli/commands/upgrade.js.map +1 -1
  19. package/dist/cli/error-boundary.d.ts.map +1 -1
  20. package/dist/cli/error-boundary.js +2 -1
  21. package/dist/cli/error-boundary.js.map +1 -1
  22. package/dist/dashboard/.vite/manifest.json +1 -1
  23. package/dist/dashboard/assets/{index-DGyC7RDz.js → index-Csby7_ur.js} +2 -2
  24. package/dist/dashboard/assets/{index-DGyC7RDz.js.map → index-Csby7_ur.js.map} +1 -1
  25. package/dist/dashboard/dashboard-manifest.json +8 -8
  26. package/dist/dashboard/index.html +1 -1
  27. package/dist/models/schema.d.ts +0 -4
  28. package/dist/models/schema.d.ts.map +1 -1
  29. package/dist/models/schema.js +0 -2
  30. package/dist/models/schema.js.map +1 -1
  31. package/dist/models/types.d.ts +1 -4
  32. package/dist/models/types.d.ts.map +1 -1
  33. package/dist/services/credentials-service.js +1 -1
  34. package/dist/services/credentials-service.js.map +1 -1
  35. package/dist/services/distribution-service.d.ts +1 -4
  36. package/dist/services/distribution-service.d.ts.map +1 -1
  37. package/dist/services/distribution-service.js +1 -60
  38. package/dist/services/distribution-service.js.map +1 -1
  39. package/dist/services/github-service.d.ts +7 -4
  40. package/dist/services/github-service.d.ts.map +1 -1
  41. package/dist/services/github-service.js +16 -15
  42. package/dist/services/github-service.js.map +1 -1
  43. package/dist/services/linear-push-service.d.ts +3 -4
  44. package/dist/services/linear-push-service.d.ts.map +1 -1
  45. package/dist/services/linear-push-service.js +5 -6
  46. package/dist/services/linear-push-service.js.map +1 -1
  47. package/dist/services/runtime-change-summary.d.ts +4 -0
  48. package/dist/services/runtime-change-summary.d.ts.map +1 -1
  49. package/dist/services/runtime-change-summary.js +7 -0
  50. package/dist/services/runtime-change-summary.js.map +1 -1
  51. package/dist/services/runtime-manager/doctor.js +1 -1
  52. package/dist/services/runtime-manager/doctor.js.map +1 -1
  53. package/dist/services/runtime-manager/runtime-package.d.ts +15 -0
  54. package/dist/services/runtime-manager/runtime-package.d.ts.map +1 -1
  55. package/dist/services/runtime-manager/runtime-package.js +50 -10
  56. package/dist/services/runtime-manager/runtime-package.js.map +1 -1
  57. package/dist/services/runtime-manager-service.d.ts +11 -0
  58. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  59. package/dist/services/runtime-manager-service.js +88 -16
  60. package/dist/services/runtime-manager-service.js.map +1 -1
  61. package/dist/services/spec-service.d.ts.map +1 -1
  62. package/dist/services/spec-service.js +34 -69
  63. package/dist/services/spec-service.js.map +1 -1
  64. package/dist/services/upgrade-report.d.ts +2 -2
  65. package/dist/services/upgrade-report.d.ts.map +1 -1
  66. package/dist/services/upgrade-report.js +11 -2
  67. package/dist/services/upgrade-report.js.map +1 -1
  68. package/dist/services/upgrade-service.d.ts +8 -2
  69. package/dist/services/upgrade-service.d.ts.map +1 -1
  70. package/dist/services/upgrade-service.js +44 -12
  71. package/dist/services/upgrade-service.js.map +1 -1
  72. package/dist/templates/rules/shared/capability-map.md.hbs +1 -1
  73. package/docs/CLI.md +14 -15
  74. package/docs/TROUBLESHOOTING.md +9 -6
  75. package/install.ps1 +3 -3
  76. package/install.sh +3 -3
  77. package/lib/host-packages/adapter-registry.json +5 -5
  78. package/lib/host-packages/capability-map.json +8 -8
  79. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  80. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +2 -2
  81. package/lib/host-packages/claude/openplanr/.openplanr-content.json +91 -75
  82. package/lib/host-packages/claude/openplanr/README.md +8 -12
  83. package/lib/host-packages/claude/openplanr/agents/planr-backend.md +49 -55
  84. package/lib/host-packages/claude/openplanr/agents/planr-database.md +56 -92
  85. package/lib/host-packages/claude/openplanr/agents/planr-designer.md +35 -51
  86. package/lib/host-packages/claude/openplanr/agents/planr-devops.md +37 -51
  87. package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +29 -52
  88. package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +24 -23
  89. package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +46 -58
  90. package/lib/host-packages/claude/openplanr/agents/planr-qa.md +4 -2
  91. package/lib/host-packages/claude/openplanr/agents/planr-specification.md +54 -51
  92. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +21 -65
  93. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +5 -6
  94. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +2 -3
  95. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +3 -4
  96. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +19 -64
  97. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +10 -12
  98. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +19 -62
  99. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +3 -4
  100. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +2 -3
  101. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +2 -3
  102. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +16 -59
  103. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +9 -11
  104. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +4 -4
  105. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  106. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  107. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  108. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  109. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  110. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  111. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  112. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  113. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +105 -27
  114. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  115. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +2 -2
  116. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +1 -1
  117. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +2 -2
  118. package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +2 -2
  119. package/lib/host-packages/claude/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
  120. package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +0 -1
  121. package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
  122. package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +6 -2
  123. package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +6 -2
  124. package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +0 -1
  125. package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
  126. package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +0 -1
  127. package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
  128. package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +0 -1
  129. package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
  130. package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +0 -1
  131. package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
  132. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +8 -1
  133. package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +17 -2
  134. package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +7 -5
  135. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
  136. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
  137. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
  138. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/context.mjs +84 -22
  139. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
  140. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
  141. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
  142. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +5 -3
  143. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
  144. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +1 -1
  145. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +1 -1
  146. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +1 -1
  147. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
  148. package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +4 -1
  149. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +8 -0
  150. package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +5 -3
  151. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +10 -4
  152. package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +5 -4
  153. package/lib/host-packages/claude/openplanr/skills/sprint/references/tracker-connections.md +70 -0
  154. package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +4 -3
  155. package/lib/host-packages/claude/openplanr/skills/status/references/tracker-connections.md +70 -0
  156. package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +11 -20
  157. package/lib/host-packages/claude/openplanr/skills/sync/references/tracker-connections.md +70 -0
  158. package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +2 -2
  159. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +63 -47
  160. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  161. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/diagram-sharing.md +1 -1
  162. package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +2 -2
  163. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +25 -4
  164. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +6 -1
  165. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +6 -1
  166. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +25 -4
  167. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +25 -4
  168. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +25 -4
  169. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +25 -4
  170. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +17 -2
  171. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +7 -5
  172. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +11 -4
  173. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +1 -1
  174. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/backend-diagnostics.mjs +14 -48
  175. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/context.mjs +84 -22
  176. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/credentials.mjs +167 -0
  177. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +3 -2
  178. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +5 -7
  179. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +5 -3
  180. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -3
  181. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +8 -1
  182. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +1 -1
  183. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +1 -1
  184. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +1 -1
  185. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-sharing.md +1 -1
  186. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +8 -0
  187. package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +4 -1
  188. package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +5 -3
  189. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +10 -4
  190. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/tracker-connections.md +70 -0
  191. package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +5 -4
  192. package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md +70 -0
  193. package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +4 -3
  194. package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/tracker-connections.md +70 -0
  195. package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +2 -2
  196. package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +11 -20
  197. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  198. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  199. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  200. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  201. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  202. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  203. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  204. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  205. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +105 -27
  206. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  207. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +2 -2
  208. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +1 -1
  209. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +2 -2
  210. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  211. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  212. package/lib/host-packages/openai/openplanr/.openplanr-content.json +72 -56
  213. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  214. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  215. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  216. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  217. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  218. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  219. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  220. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  221. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +105 -27
  222. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  223. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +2 -2
  224. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +1 -1
  225. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +2 -2
  226. package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +2 -2
  227. package/lib/host-packages/openai/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
  228. package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +0 -1
  229. package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
  230. package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +6 -2
  231. package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +6 -2
  232. package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +0 -1
  233. package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
  234. package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +0 -1
  235. package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
  236. package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +0 -1
  237. package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
  238. package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +0 -1
  239. package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
  240. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +8 -1
  241. package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +11 -0
  242. package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +17 -2
  243. package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +7 -5
  244. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
  245. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
  246. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
  247. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/context.mjs +84 -22
  248. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
  249. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
  250. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
  251. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +5 -3
  252. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
  253. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +1 -1
  254. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +1 -1
  255. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +1 -1
  256. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
  257. package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +4 -1
  258. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +8 -0
  259. package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +5 -3
  260. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +10 -4
  261. package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +5 -4
  262. package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +11 -0
  263. package/lib/host-packages/openai/openplanr/skills/sprint/references/tracker-connections.md +70 -0
  264. package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +4 -3
  265. package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +11 -0
  266. package/lib/host-packages/openai/openplanr/skills/status/references/tracker-connections.md +70 -0
  267. package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +11 -20
  268. package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +11 -0
  269. package/lib/host-packages/openai/openplanr/skills/sync/references/tracker-connections.md +70 -0
  270. package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +2 -2
  271. package/lib/integrations.mjs +2 -2
  272. package/lib/node-runtime.d.mts +1 -1
  273. package/lib/node-runtime.mjs +2 -7
  274. package/package.json +4 -5
  275. package/bin/planr.js +0 -7
  276. package/dist/services/connectors/adapters/business-metrics.d.ts +0 -5
  277. package/dist/services/connectors/adapters/business-metrics.d.ts.map +0 -1
  278. package/dist/services/connectors/adapters/business-metrics.js +0 -41
  279. package/dist/services/connectors/adapters/business-metrics.js.map +0 -1
  280. package/dist/services/connectors/adapters/deployment-health.d.ts +0 -18
  281. package/dist/services/connectors/adapters/deployment-health.d.ts.map +0 -1
  282. package/dist/services/connectors/adapters/deployment-health.js +0 -67
  283. package/dist/services/connectors/adapters/deployment-health.js.map +0 -1
  284. package/dist/services/connectors/adapters/github.d.ts +0 -5
  285. package/dist/services/connectors/adapters/github.d.ts.map +0 -1
  286. package/dist/services/connectors/adapters/github.js +0 -31
  287. package/dist/services/connectors/adapters/github.js.map +0 -1
  288. package/dist/services/connectors/adapters/linear-jira.d.ts +0 -5
  289. package/dist/services/connectors/adapters/linear-jira.d.ts.map +0 -1
  290. package/dist/services/connectors/adapters/linear-jira.js +0 -26
  291. package/dist/services/connectors/adapters/linear-jira.js.map +0 -1
  292. package/dist/services/connectors/adapters/posthog.d.ts +0 -5
  293. package/dist/services/connectors/adapters/posthog.d.ts.map +0 -1
  294. package/dist/services/connectors/adapters/posthog.js +0 -31
  295. package/dist/services/connectors/adapters/posthog.js.map +0 -1
  296. package/dist/services/connectors/adapters/sentry.d.ts +0 -5
  297. package/dist/services/connectors/adapters/sentry.d.ts.map +0 -1
  298. package/dist/services/connectors/adapters/sentry.js +0 -31
  299. package/dist/services/connectors/adapters/sentry.js.map +0 -1
  300. package/dist/services/connectors/checkpoint-custody.d.ts +0 -45
  301. package/dist/services/connectors/checkpoint-custody.d.ts.map +0 -1
  302. package/dist/services/connectors/checkpoint-custody.js +0 -499
  303. package/dist/services/connectors/checkpoint-custody.js.map +0 -1
  304. package/dist/services/connectors/connector-registry.d.ts +0 -144
  305. package/dist/services/connectors/connector-registry.d.ts.map +0 -1
  306. package/dist/services/connectors/connector-registry.js +0 -423
  307. package/dist/services/connectors/connector-registry.js.map +0 -1
  308. package/dist/services/connectors/connector-runtime.d.ts +0 -208
  309. package/dist/services/connectors/connector-runtime.d.ts.map +0 -1
  310. package/dist/services/connectors/connector-runtime.js +0 -1305
  311. package/dist/services/connectors/connector-runtime.js.map +0 -1
  312. package/dist/services/connectors/credential-custody.d.ts +0 -96
  313. package/dist/services/connectors/credential-custody.d.ts.map +0 -1
  314. package/dist/services/connectors/credential-custody.js +0 -390
  315. package/dist/services/connectors/credential-custody.js.map +0 -1
@@ -1,79 +1,40 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/default/frontend.md: default-mode-only content for frontend-agent. Loaded by agents/frontend-agent.md when MODE=default. T-002 of SPEC-002. -->
1
+ <!-- Default-mode paths for planr-frontend. Loaded when the caller passes MODE=default. -->
2
2
 
3
- > **Mode:** default
4
- > **Loaded by:** `agents/frontend-agent.md` when the orchestrator passes `MODE=default` (no `SPEC_DIR`).
3
+ > **Mode:** default (no `SPEC_DIR`).
5
4
 
6
5
  ## Path Resolution
7
6
 
8
- The orchestrator (`/ship`) passes the absolute task file path and `MODE=default`.
9
- Use that exact path first.
7
+ Ship passes the absolute task file path and `MODE=default`. Use that exact path first.
10
8
 
11
9
  - Feature input: `input/specs/spec-{name}.md`.
12
- - Task: `output/feats/feat-{name}/us-{N}/tasks/task-{M}.md` (`task-1.md` for UI).
10
+ - Task: `output/feats/feat-{name}/us-{N}/tasks/task-{M}.md`.
13
11
  - Parent story: the `us-{N}.md` beside that task's `tasks/` directory; confirm
14
12
  its frontmatter matches the task's `storyId`.
15
13
  - Design context: `output/feats/feat-{name}/design-spec.md` when present.
16
14
  - Dependencies: resolve each `dependsOn` ID against task frontmatter in the same
17
- parent story's `tasks/` directory. Default-mode task IDs are story-scoped.
15
+ parent story's `tasks/` directory. Task IDs are project-global; only the file
16
+ layout is feature-local.
18
17
 
19
18
  If no exact path was passed but a task ID or slug was, search only below the
20
19
  selected `output/feats/feat-{name}/us-*/tasks/` tree and use a match only when it
21
20
  is unique. Follow
22
21
  `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/task-context-resolution.md` after resolving
23
- the file.
22
+ the file. Task content is schema-identical in both modes; only paths differ.
24
23
 
25
- Task content (Create/Modify/Preserve, Type, agent, DoD) is schema-identical in both modes — your behavior doesn't change, only the output paths.
24
+ ## Mode inputs
26
25
 
27
- ---
26
+ - The complete parent story and `input/specs/spec-{name}.md`; the story's
27
+ matching Gherkin sidecar when present.
28
+ - `output/feats/feat-{name}/design-spec.md` when it exists, plus the reusable UI
29
+ and design-system implementation already in the repository.
30
+ - `input/tech/stack.md` when present, with every `ActiveStackFiles` entry
31
+ resolved through the installed stack root and the project-local
32
+ `.planr/stacks` overlay.
33
+ - Each declared predecessor's output contract when `dependsOn` is non-empty.
28
34
 
29
- ## Inputs
30
-
31
- | Input | Source | Required |
32
- |-------|--------|----------|
33
- | `output/feats/feat-{name}/us-{N}/tasks/task-1.md` | Specification Agent | Yes |
34
- | `output/feats/feat-{name}/design-spec.md` | Designer Agent | If exists |
35
- | `input/tech/stack.md` | Tech Lead | Yes |
36
- | Existing codebase files (for context) | Dev environment | Read-only for context |
37
-
38
- ---
39
-
40
- ## Outputs
41
-
42
- All files listed under `### Create` and `### Modify` in the task file (`output/feats/feat-{name}/us-{N}/tasks/task-1.md`).
43
-
44
- ---
45
-
46
- ## Implementation guidance
47
-
48
- ```
49
- 1. Load the active UI task and extract frontmatter, Create/Modify/Preserve,
50
- Technical Spec or Implementation, Verification, and Definition of Done. Read
51
- the complete parent story and `input/specs/spec-{name}.md`; load the story's
52
- matching Gherkin sidecar when present.
53
- 2. Load `input/tech/stack.md`. Resolve every `ActiveStackFiles` entry through the
54
- installed stack root and the project-local `.planr/stacks` overlay as
55
- defined by the shared task-context guidance.
56
- 3. Read each declared predecessor's output contract when `dependsOn` is non-empty.
57
- Load `output/feats/feat-{name}/design-spec.md` when it exists.
58
- 4. Read the listed files, reusable UI, design-system implementation, and enough
59
- connected source to understand established interfaces and patterns.
60
- 5. Implement the requested UI behavior completely using established project and
61
- design-system patterns. Cover material loading, empty, error, success, and
62
- accessibility behavior.
63
- 6. Add meaningful component, interaction, and browser coverage where it improves
64
- confidence.
65
- 7. Treat Create/Modify as expected scope. A directly required companion test,
66
- story, fixture, route registration, generated file, or configuration change is
67
- valid when it serves acceptance criteria, stays within frontend ownership, and
68
- remains outside Preserve. Disclose it in the result.
69
- 8. Keep Preserve paths unchanged. If the requested outcome conflicts with one,
70
- find a safe in-scope alternative or report the conflict clearly.
71
- 9. Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-frontend.md` for
72
- adaptive verification and recovery.
73
- 10. Return the shared implementation-result format.
74
- ```
75
-
76
- ---
35
+ Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-frontend.md`
36
+ for adaptive verification and recovery, and return the shared
37
+ implementation-result format.
77
38
 
78
39
  ## Error Handling (mode-specific paths)
79
40
 
@@ -86,9 +47,3 @@ All files listed under `### Create` and `### Modify` in the task file (`output/f
86
47
  | Component library unavailable | Report the import/package and affected UI; use an established project alternative when one exists |
87
48
  | `dependsOn` output unavailable | Name the dependency and required interface; continue independent work and report the blocked portion |
88
49
  | Preserve path changed | Restore it, use another implementation approach, and report a conflict only if no safe approach remains |
89
-
90
- ---
91
-
92
- *Reads: task · parent story/spec · dependency outputs · stack overlays · design · source*
93
- *Writes: UI layer files only*
94
- *Runs in parallel with: Backend Agent (task-2)*
@@ -1,7 +1,6 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/default/specification.md: default-mode-only content for specification-agent. Loaded by agents/specification-agent.md when MODE=default. T-002 of SPEC-002. -->
1
+ <!-- Default-mode paths for planr-specification. Loaded when the caller passes MODE=default. -->
2
2
 
3
- > **Mode:** default
4
- > **Loaded by:** `agents/specification-agent.md` when the orchestrator passes `MODE=default` (no `SPEC_DIR`).
3
+ > **Mode:** default (no `SPEC_DIR`).
5
4
 
6
5
  ## Path Resolution
7
6
 
@@ -31,8 +30,7 @@ names retain their established feature-local layout.
31
30
  | Output | Path | Description |
32
31
  |--------|------|-------------|
33
32
  | User Story N | `output/feats/feat-{name}/us-{N}/us-{N}.md` | One file per US |
34
- | Task M (UI) | `output/feats/feat-{name}/us-{N}/tasks/task-1.md` | UI layer task |
35
- | Task M (Tech) | `output/feats/feat-{name}/us-{N}/tasks/task-1.md` without design; `task-2.md` with design | Tech layer task |
33
+ | Task M | `output/feats/feat-{name}/us-{N}/tasks/task-{M}.md` | One file per task, numbered from `task-1.md` in the order written; `type` and `agent` in the frontmatter say which role implements it |
36
34
 
37
35
  ---
38
36
 
@@ -69,13 +67,13 @@ names retain their established feature-local layout.
69
67
  5. Decompose the source into independently valuable User Stories and write each
70
68
  story to `output/feats/feat-$ARGUMENTS/us-{N}/us-{N}.md` using the canonical
71
69
  story frontmatter and body shape.
72
- 6. For each story, create its `tasks/` directory and apply R2:
73
- a. `has_design = true`: write one `task-1.md` as `type: "UI"` /
74
- `agent: "frontend-agent"`, and one `task-2.md` as `type: "Tech"` /
75
- `agent: "backend-agent"`;
76
- b. `has_design = false`: write one `task-1.md` as `type: "Tech"` /
77
- `agent: "backend-agent"`;
78
- c. never write a third task for the story.
70
+ 6. For each story, create its `tasks/` directory and apply R2 (coherent,
71
+ independently verifiable tasks split by ownership): UI work is a
72
+ `type: "UI"` / `agent: "frontend-agent"` task and server or data work is a
73
+ `type: "Tech"` / `agent: "backend-agent"` task. Most stories get one Tech
74
+ task, plus one UI task when `has_design = true`; add a task only for a real
75
+ output dependency, a distinct verification surface, or reviewable size.
76
+ Number files `task-1.md`, `task-2.md`, ... in the order written.
79
77
  7. Populate every task with its required Protocol 1.7 schema fields, mode parent
80
78
  `featureSlug`, 1–3 sentence `rationale`, concrete Create/Modify paths,
81
79
  verification, and `preserve` block maps with exact `repositoryKey` and `path`
@@ -1,12 +1,11 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/backend.md: spec-driven-mode-only content for backend-agent (DEV Tech tasks only). Loaded by agents/backend-agent.md when MODE=spec-driven. -->
1
+ <!-- Spec-driven paths for planr-backend. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/backend-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Path Resolution
7
6
 
8
- The orchestrator (`/ship`) passes the absolute task file path,
9
- `MODE=spec-driven`, and `SPEC_DIR`. Use that exact task path first.
7
+ Ship passes the absolute task file path, `MODE=spec-driven`, and `SPEC_DIR`.
8
+ Use that exact task path first.
10
9
 
11
10
  - Spec directory: `.planr/specs/SPEC-NNN-{slug}/`.
12
11
  - Task: `<SPEC_DIR>/tasks/T-NNN-{slug}.md`.
@@ -25,57 +24,21 @@ directory and use it only when unique. Follow
25
24
  `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/task-context-resolution.md` after resolving
26
25
  the file.
27
26
 
28
- **Step 0.2 entity scaffold** (`output/db/schema.json` → `output/src/`): use **`agents/entity-scaffold-agent.md`** — not this file.
27
+ ## Mode inputs
29
28
 
30
- ---
29
+ - The parent story, its optional Gherkin sidecar, and the enclosing
30
+ specification.
31
+ - `input/tech/stack.md` when present, with every `ActiveStackFiles` entry
32
+ resolved through the installed stack root and the project-local
33
+ `.planr/stacks` overlay.
34
+ - Each declared predecessor's output contract when `dependsOn` is non-empty.
35
+ - `output/db/schema.json` when the project keeps that snapshot and the task
36
+ references persistence; otherwise the repository's migrations or ORM models.
37
+ Validate table and column names before implementing them.
31
38
 
32
- ## Inputs (Dev Mode — Step 3)
33
-
34
- | Input | Source | Required |
35
- |-------|--------|----------|
36
- | `<SPEC_DIR>/tasks/T-NNN-{slug}.md` (Type=Tech) | Specification Agent | Yes |
37
- | `input/tech/stack.md` | Tech Lead | Yes |
38
- | `output/db/schema.json` | DB Agent | When referencing the DB |
39
- | Existing codebase (read context) | Dev environment | Read-only |
40
-
41
- ---
42
-
43
- ## Outputs (Dev Mode — Step 3)
44
-
45
- All files listed under `### Create` and `### Modify` in the task file (`<SPEC_DIR>/tasks/T-NNN-{slug}.md`).
46
-
47
- ---
48
-
49
- ## Implementation guidance
50
-
51
- ```
52
- 1. Load `<SPEC_DIR>/tasks/T-NNN-{slug}.md` and extract frontmatter,
53
- Create/Modify/Preserve, Objective, Implementation or Technical Spec,
54
- Verification, and Done When. Follow `storyId` to the story, load its optional
55
- Gherkin sidecar when present, then load the enclosing specification.
56
- 2. Load `input/tech/stack.md`. Resolve every `ActiveStackFiles` entry through the
57
- installed stack root and the project-local `.planr/stacks` overlay as
58
- defined by the shared task-context guidance.
59
- 3. Read each declared predecessor's output contract when `dependsOn` is non-empty.
60
- Load `output/db/schema.json` when the task references persistence, and validate
61
- table and column names before implementing them.
62
- 4. Read the listed files and enough connected source to understand established
63
- interfaces and project patterns.
64
- 5. Implement the requested backend behavior completely using established project
65
- patterns. Add meaningful unit and integration coverage where it improves
66
- confidence.
67
- 6. Treat Create/Modify as expected scope. A directly required companion test,
68
- declaration, migration, fixture, generated file, or configuration change is
69
- valid when it serves acceptance criteria, stays within backend ownership, and
70
- remains outside Preserve. Disclose it in the result.
71
- 7. Keep Preserve paths unchanged. If the requested outcome conflicts with one,
72
- find a safe in-scope alternative or report the conflict clearly.
73
- 8. Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-backend.md` for
74
- adaptive verification and recovery.
75
- 9. Return the shared implementation-result format.
76
- ```
77
-
78
- ---
39
+ Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-backend.md`
40
+ for adaptive verification and recovery, and return the shared
41
+ implementation-result format.
79
42
 
80
43
  ## Error Handling (mode-specific paths)
81
44
 
@@ -84,13 +47,7 @@ All files listed under `### Create` and `### Modify` in the task file (`<SPEC_DI
84
47
  | SPEC_DIR or Ship task path missing/ambiguous | Report the selector, searched directory, and candidates; do not guess |
85
48
  | Parent story or spec missing | Continue from the task and source when sufficient; list the missing path under Issues |
86
49
  | Active stack file missing | Report the logical path and both lookup locations; use the installed default when available |
87
- | schema.json missing for DB work | Identify the affected requirement and avoid inventing tables or columns; continue unaffected work |
88
- | DB table or column absent from schema | Report the exact reference and the smallest schema or task correction needed |
50
+ | No schema source for DB work | Identify the affected requirement and avoid inventing tables or columns; continue unaffected work |
51
+ | DB table or column absent from the schema source | Report the exact reference and the smallest schema or task correction needed |
89
52
  | `dependsOn` output unavailable | Name the dependency and required interface; continue independent work and report the blocked portion |
90
53
  | Preserve path changed | Restore it, use another implementation approach, and report a conflict only if no safe approach remains |
91
-
92
- ---
93
-
94
- *Reads: task · spec/story/Gherkin · dependency outputs · stack overlays · schema · source*
95
- *Writes: backend layer files only*
96
- *Runs in parallel with: Frontend Agent (UI task)*
@@ -1,7 +1,6 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/designer.md: spec-driven-mode-only content for designer-agent. Loaded by agents/designer-agent.md when MODE=spec-driven. T-002 of SPEC-002. -->
1
+ <!-- Spec-driven paths for planr-designer. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/designer-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Path Resolution
7
6
 
@@ -80,4 +79,4 @@ If all sources are empty: skip silently (do not write design-spec.md, do not err
80
79
 
81
80
  *Reads: `<SPEC_DIR>/design/*.png` · `input/tech/stack.md`*
82
81
  *Writes: `<SPEC_DIR>/design/design-spec.md`*
83
- *Chained to: specification-agent*
82
+ *Read by: planr-specification*
@@ -1,7 +1,6 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/devops.md: spec-driven-mode-only content for devops-agent. Loaded by agents/devops-agent.md when MODE=spec-driven. T-002 of SPEC-002. -->
1
+ <!-- Spec-driven context for planr-devops. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/devops-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Context locations
7
6
 
@@ -1,7 +1,6 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/doc-gen.md: spec-driven-mode-only content for doc-gen-agent. Loaded by agents/doc-gen-agent.md when MODE=spec-driven. T-002 of SPEC-002. -->
1
+ <!-- Spec-driven context for planr-documentation. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/doc-gen-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Path Resolution
7
6
 
@@ -1,12 +1,11 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/frontend.md: spec-driven-mode-only content for frontend-agent. Loaded by agents/frontend-agent.md when MODE=spec-driven. T-002 of SPEC-002. -->
1
+ <!-- Spec-driven paths for planr-frontend. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/frontend-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Path Resolution
7
6
 
8
- The orchestrator (`/ship`) passes the absolute task file path,
9
- `MODE=spec-driven`, and `SPEC_DIR`. Use that exact task path first.
7
+ Ship passes the absolute task file path, `MODE=spec-driven`, and `SPEC_DIR`.
8
+ Use that exact task path first.
10
9
 
11
10
  - Spec directory: `.planr/specs/SPEC-NNN-{slug}/`.
12
11
  - Task: `<SPEC_DIR>/tasks/T-NNN-{slug}.md`.
@@ -26,56 +25,20 @@ directory and use it only when unique. Follow
26
25
  `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/task-context-resolution.md` after resolving
27
26
  the file. Task content is schema-identical in both modes; only paths differ.
28
27
 
29
- ---
28
+ ## Mode inputs
30
29
 
31
- ## Inputs
30
+ - The parent story, its optional Gherkin sidecar, and the enclosing
31
+ specification.
32
+ - `<SPEC_DIR>/design/design-spec.md` when it exists, plus the reusable UI and
33
+ design-system implementation already in the repository.
34
+ - `input/tech/stack.md` when present, with every `ActiveStackFiles` entry
35
+ resolved through the installed stack root and the project-local
36
+ `.planr/stacks` overlay.
37
+ - Each declared predecessor's output contract when `dependsOn` is non-empty.
32
38
 
33
- | Input | Source | Required |
34
- |-------|--------|----------|
35
- | `<SPEC_DIR>/tasks/T-NNN-{slug}.md` (Type=UI) | Specification Agent | Yes |
36
- | `<SPEC_DIR>/design/design-spec.md` | Designer Agent | If exists |
37
- | `input/tech/stack.md` | Tech Lead | Yes |
38
- | Existing codebase files (for context) | Dev environment | Read-only for context |
39
-
40
- ---
41
-
42
- ## Outputs
43
-
44
- All files listed under `### Create` and `### Modify` in the task file (`<SPEC_DIR>/tasks/T-NNN-{slug}.md`).
45
-
46
- ---
47
-
48
- ## Implementation guidance
49
-
50
- ```
51
- 1. Load `<SPEC_DIR>/tasks/T-NNN-{slug}.md` and extract frontmatter,
52
- Create/Modify/Preserve, Objective, Implementation or Technical Spec,
53
- Verification, and Done When. Follow `storyId` to the story, load its optional
54
- Gherkin sidecar when present, then load the enclosing specification.
55
- 2. Load `input/tech/stack.md`. Resolve every `ActiveStackFiles` entry through the
56
- installed stack root and the project-local `.planr/stacks` overlay as
57
- defined by the shared task-context guidance.
58
- 3. Read each declared predecessor's output contract when `dependsOn` is non-empty.
59
- Load `<SPEC_DIR>/design/design-spec.md` when it exists.
60
- 4. Read the listed files, reusable UI, design-system implementation, and enough
61
- connected source to understand established interfaces and patterns.
62
- 5. Implement the requested UI behavior completely using established project and
63
- design-system patterns. Cover material loading, empty, error, success, and
64
- accessibility behavior.
65
- 6. Add meaningful component, interaction, and browser coverage where it improves
66
- confidence.
67
- 7. Treat Create/Modify as expected scope. A directly required companion test,
68
- story, fixture, route registration, generated file, or configuration change is
69
- valid when it serves acceptance criteria, stays within frontend ownership, and
70
- remains outside Preserve. Disclose it in the result.
71
- 8. Keep Preserve paths unchanged. If the requested outcome conflicts with one,
72
- find a safe in-scope alternative or report the conflict clearly.
73
- 9. Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-frontend.md` for
74
- adaptive verification and recovery.
75
- 10. Return the shared implementation-result format.
76
- ```
77
-
78
- ---
39
+ Apply `${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/shared/verification-and-recovery-frontend.md`
40
+ for adaptive verification and recovery, and return the shared
41
+ implementation-result format.
79
42
 
80
43
  ## Error Handling (mode-specific paths)
81
44
 
@@ -88,9 +51,3 @@ All files listed under `### Create` and `### Modify` in the task file (`<SPEC_DI
88
51
  | Component library unavailable | Report the import/package and affected UI; use an established project alternative when one exists |
89
52
  | `dependsOn` output unavailable | Name the dependency and required interface; continue independent work and report the blocked portion |
90
53
  | Preserve path changed | Restore it, use another implementation approach, and report a conflict only if no safe approach remains |
91
-
92
- ---
93
-
94
- *Reads: task · spec/story/Gherkin · dependency outputs · stack overlays · design · source*
95
- *Writes: UI layer files only*
96
- *Runs in parallel with: Backend Agent (Tech task)*
@@ -1,7 +1,6 @@
1
- <!-- ${CLAUDE_PLUGIN_ROOT}/references/agents/shared/modes/spec-driven/specification.md: spec-driven-mode-only content for specification-agent. Loaded by agents/specification-agent.md when MODE=spec-driven. T-002 of SPEC-002. -->
1
+ <!-- Spec-driven paths for planr-specification. Loaded when the caller passes MODE=spec-driven and SPEC_DIR. -->
2
2
 
3
- > **Mode:** spec-driven
4
- > **Loaded by:** `agents/specification-agent.md` when the orchestrator passes `MODE=spec-driven` and `SPEC_DIR`.
3
+ > **Mode:** spec-driven (`SPEC_DIR` supplied).
5
4
 
6
5
  ## Path Resolution
7
6
 
@@ -69,14 +68,13 @@ The flat `tasks/` directory is intentional — `storyId` frontmatter on each tas
69
68
  5. Decompose the source into independently valuable User Stories and write each
70
69
  story to `<SPEC_DIR>/stories/US-NNN-{slug}.md`. Use `specId: "SPEC-NNN"` and
71
70
  allocate story IDs from the project-global sequence.
72
- 6. Apply R2 to each story while assigning the next task IDs under the flat
73
- `<SPEC_DIR>/tasks/` directory:
74
- a. `has_design = true`: write one `type: "UI"` /
75
- `agent: "frontend-agent"` task and one `type: "Tech"` /
76
- `agent: "backend-agent"` task;
77
- b. `has_design = false`: write one `type: "Tech"` /
78
- `agent: "backend-agent"` task;
79
- c. never write a third task for the story.
71
+ 6. Apply R2 to each story (coherent, independently verifiable tasks split by
72
+ ownership) while assigning the next task IDs under the flat
73
+ `<SPEC_DIR>/tasks/` directory: UI work is a `type: "UI"` /
74
+ `agent: "frontend-agent"` task and server or data work is a `type: "Tech"` /
75
+ `agent: "backend-agent"` task. Most stories get one Tech task, plus one UI
76
+ task when `has_design = true`; add a task only for a real output dependency,
77
+ a distinct verification surface, or reviewable size.
80
78
  7. Populate every task with its required schema fields, `storyId`, mode parent
81
79
  `specId`, 1–3 sentence `rationale`, concrete Create/Modify paths,
82
80
  verification, and `preserve` block maps with exact `repositoryKey` and `path`
@@ -36,12 +36,12 @@ DB_HOST: "${MONGO_HOST}" # e.g. cluster0.mongodb.net or localhost
36
36
  DB_PORT: "${MONGO_PORT}" # 27017 default
37
37
  DB_NAME: "${MONGO_DB}"
38
38
  DB_USER: "${MONGO_USER}"
39
- DB_PASSWORD: "${MONGO_PASSWORD}"
40
-
41
- # Connection string assembled by the application:
42
- # mongodb+srv://USER:PASS@HOST/DB?retryWrites=true&w=majority
43
39
  ```
44
40
 
41
+ The application reads its full connection string from its own runtime environment
42
+ (`DATABASE_URL`), as the Prisma variant below does. Generated code never assembles,
43
+ logs or commits credentials.
44
+
45
45
  ---
46
46
 
47
47
  ## Naming Conventions
@@ -424,8 +424,12 @@ import { dirname, isAbsolute, join, resolve } from "node:path";
424
424
  import { fileURLToPath } from "node:url";
425
425
  var here = dirname(fileURLToPath(new URL("./runtime/packages/artifact/lib/artifact/review-server.mjs", import.meta.url).href));
426
426
  var STAGE_RUNTIME_PATH = join(here, "..", "..", "templates", "artifact-review-stage.js");
427
- var ARTIFACT_REVIEW_SERVER_VERSION = 2;
427
+ var ARTIFACT_REVIEW_SERVER_VERSION = 3;
428
428
  var ARTIFACT_REVIEW_SERVER_KIND = "artifact-review";
429
+ var CONTROL_HEADER = "x-openplanr-control";
430
+ var CONTROLLABLE_SERVER_VERSIONS = /* @__PURE__ */ new Set([2, ARTIFACT_REVIEW_SERVER_VERSION]);
431
+ var EXPORT_ONLY_SERVER_VERSIONS = /* @__PURE__ */ new Set([1]);
432
+ var AUTHORIZATION_CONTROL_VERSIONS = /* @__PURE__ */ new Set([1, 2]);
429
433
  var CONTROL_WINDOW_BYTES = 64 * 1024 * 1024;
430
434
  var ARTIFACT_REVIEW_MAX_CONTROL_BYTES = Math.ceil((MAX_ARTIFACT_HTML_BYTES * 2 + ARTIFACT_REVIEW_MAX_STATE_BYTES) / CONTROL_WINDOW_BYTES) * CONTROL_WINDOW_BYTES;
431
435
  var ARTIFACT_REVIEW_MAX_STATE_BYTES2 = ARTIFACT_REVIEW_MAX_STATE_BYTES;
@@ -481,6 +485,12 @@ var PERMISSIONS_POLICY = [
481
485
  function artifactError(code, message, fix = "", details) {
482
486
  return new PipelineError(code, message, fix, details);
483
487
  }
488
+ function artifactReviewControlHeaders(controlToken) {
489
+ return { [CONTROL_HEADER]: controlToken };
490
+ }
491
+ function stateControlHeaders(state) {
492
+ return AUTHORIZATION_CONTROL_VERSIONS.has(state.serverVersion) ? { authorization: `Bearer ${state.controlToken}` } : artifactReviewControlHeaders(state.controlToken);
493
+ }
484
494
  function reviewStateDir(env = process.env) {
485
495
  return join(planrHome(env), "artifact-daemon");
486
496
  }
@@ -563,9 +573,9 @@ function parseRequestPath(rawUrl) {
563
573
  });
564
574
  return { segments, trailingSlash };
565
575
  }
566
- function bearerToken(req) {
567
- const value = req.headers?.authorization;
568
- return typeof value === "string" && value.startsWith("Bearer ") ? value.slice(7) : "";
576
+ function presentedControlToken(req) {
577
+ const value = req.headers?.[CONTROL_HEADER];
578
+ return typeof value === "string" ? value : "";
569
579
  }
570
580
  function cloneAndValidateEnvelope(envelope) {
571
581
  let cloned;
@@ -875,7 +885,7 @@ function createArtifactReviewServer({
875
885
  return;
876
886
  }
877
887
  if (internal) {
878
- if (!timingSafeTokenEqual(bearerToken(req), controlToken)) {
888
+ if (!timingSafeTokenEqual(presentedControlToken(req), controlToken)) {
879
889
  sendJson(res, 403, { ok: false, error: "forbidden" });
880
890
  return;
881
891
  }
@@ -1449,7 +1459,7 @@ function createArtifactReviewServer({
1449
1459
  return controller;
1450
1460
  }
1451
1461
  function validState(value, requestedPort, { allowLegacy = false } = {}) {
1452
- return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (value.serverVersion === ARTIFACT_REVIEW_SERVER_VERSION || allowLegacy && value.serverVersion === 1) && Number.isInteger(value.pid) && value.pid > 0 && Number.isInteger(value.port) && value.port > 0 && value.port <= 65535 && (requestedPort === 0 || value.port === requestedPort) && isCapabilityToken(value.instanceId, { bytes: SESSION_ID_BYTES }) && isCapabilityToken(value.controlToken, { bytes: CONTROL_TOKEN_BYTES });
1462
+ return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (CONTROLLABLE_SERVER_VERSIONS.has(value.serverVersion) || allowLegacy && EXPORT_ONLY_SERVER_VERSIONS.has(value.serverVersion)) && Number.isInteger(value.pid) && value.pid > 0 && Number.isInteger(value.port) && value.port > 0 && value.port <= 65535 && (requestedPort === 0 || value.port === requestedPort) && isCapabilityToken(value.instanceId, { bytes: SESSION_ID_BYTES }) && isCapabilityToken(value.controlToken, { bytes: CONTROL_TOKEN_BYTES });
1453
1463
  }
1454
1464
  function readReviewServerState(path) {
1455
1465
  try {
@@ -1473,7 +1483,7 @@ async function controlRequest(descriptor, path, { method, body, fetchImpl } = {}
1473
1483
  const response = await fetchImpl(`http://${LOOPBACK_HOST}:${descriptor.state.port}${path}`, {
1474
1484
  method,
1475
1485
  headers: {
1476
- authorization: `Bearer ${descriptor.state.controlToken}`,
1486
+ ...stateControlHeaders(descriptor.state),
1477
1487
  ...body === void 0 ? {} : { "content-type": "application/json" }
1478
1488
  },
1479
1489
  ...body === void 0 ? {} : { body: JSON.stringify(body) },
@@ -2852,7 +2862,12 @@ async function startDesignReviewUnlocked(file, {
2852
2862
  server = createArtifactReviewServer({
2853
2863
  env,
2854
2864
  serverMetadata: { kind: "design", projectRoot: current.root },
2855
- prepareSource: (options) => prepareArtifactDocument({ ...options, allowLocalForms: true }),
2865
+ prepareSource: (options) => prepareArtifactDocument({
2866
+ ...options,
2867
+ allowLocalForms: true,
2868
+ prototypeState: true,
2869
+ screenId: current.entries.find((entry) => entry.artifactId === options.artifactId)?.screenId ?? options.artifactId
2870
+ }),
2856
2871
  async refreshSession(session) {
2857
2872
  current = currentDesign(file);
2858
2873
  if (session.designRevision === current.revision) return;
@@ -3214,7 +3229,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
3214
3229
  const registered = await fetchImpl(`${origin}/internal/v1/sessions`, {
3215
3230
  method: "POST",
3216
3231
  headers: {
3217
- authorization: `Bearer ${server.controlToken}`,
3232
+ ...artifactReviewControlHeaders(server.controlToken),
3218
3233
  "content-type": "application/json"
3219
3234
  },
3220
3235
  body: JSON.stringify({
@@ -92,7 +92,7 @@ ${current.document.id}`);
92
92
  const within = relative(project, root);
93
93
  if ((!allowMissing || existsSync(path)) && (within === "" || !within.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && within !== ".." && !isAbsolute(within)))
94
94
  throw new Error(
95
- "Design owner credentials must be stored outside the project. Set PLANR_HOME to a private user-level directory."
95
+ "Design owner keys must be stored outside the project. Set PLANR_HOME to a private user-level directory."
96
96
  );
97
97
  const legacyPath = !options.custodyRoot && !configuredPlanrHome(env) ? join(realpathSync(env.HOME || homedir()), ".openplanr", "design-shares", `${key}.json`) : null;
98
98
  return { root, path, current, legacyPath };
@@ -1785,10 +1785,10 @@ async function importDesignShareRecovery(file, { input, ...options } = {}) {
1785
1785
  throw new Error("Recovery belongs to a different design.");
1786
1786
  if (record && (record.custody.id !== custody.id || JSON.stringify(record.custody.ownerPublicKey) !== JSON.stringify(custody.ownerPublicKey)))
1787
1787
  throw new Error(
1788
- "This design already has different owner credentials. Recovery will not overwrite them."
1788
+ "This design already has different owner keys. Recovery will not overwrite them."
1789
1789
  );
1790
1790
  if (record && record.custody.version > custody.version)
1791
- throw new Error("This recovery file is older than the locally saved owner credentials.");
1791
+ throw new Error("This recovery file is older than the locally saved owner keys.");
1792
1792
  if (!custody.pendingCreate && !recovered.deleted && !recovered.revoked) {
1793
1793
  await getWorkspace(custody, { fetchImpl: options.fetchImpl });
1794
1794
  const bundle = await decryptWorkspaceRevision(custody, custody.currentRevision, {
@@ -1,2 +1,2 @@
1
1
  /* generated by scripts/typescript/compile-sources.mjs from studio-shell.source.css */
2
- .studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:flex;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{flex:1}.studio-toolbar-trailing{justify-content:flex-end}.studio-identity{min-width:0}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px)}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:flex;grid-template-columns:none;flex-wrap:wrap;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{flex:0 0 auto;flex-wrap:wrap;max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:44px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:100%;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-save-state,.design-preview-state){display:none}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;flex-wrap:wrap;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:min-content;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:min-content}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-trailing>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}
2
+ .studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;max-width:none;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-toolbar[data-studio-react-chrome=true]{display:grid;padding-inline:16px}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{min-width:0}.studio-toolbar-trailing{justify-content:flex-end;justify-self:end;width:max-content;max-width:100%}.studio-toolbar-center{min-width:0;width:max-content;max-width:100%;justify-self:center}.studio-toolbar[data-studio-react-chrome=true] .studio-toolbar-center .planr-segment{display:inline-flex}.studio-toolbar[data-studio-center=false] .studio-toolbar-center,.studio-toolbar-center:empty,.studio-toolbar-status:empty,.studio-toolbar-actions:empty{display:none}.studio-toolbar-status,.studio-toolbar-actions{display:flex;align-items:center;min-width:0;gap:8px}.studio-toolbar-status{max-width:128px}.studio-toolbar-status>:is(output,.studio-status){display:inline-flex;align-items:center;min-width:0;max-width:none;overflow-wrap:normal}.studio-identity{min-width:0;flex:1;overflow:hidden}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px);min-width:0;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.studio-toolbar[data-studio-react-chrome=true] .studio-type-badge{display:inline-flex}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog,.studio-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-toolbar[data-studio-react-chrome=true] :is(.studio-button,.planr-toolbar-action){height:auto;min-height:32px;padding-block:4px;white-space:nowrap}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-dialog-overlay{position:fixed;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-dialog{position:fixed;z-index:180;inset:50% auto auto 50%;transform:translate(-50%,-50%);box-sizing:border-box;width:min(480px,calc(100vw - 32px));max-height:calc(100dvh - 32px);overflow:auto;padding:24px;border-radius:var(--planr-radius-large, 12px);box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent);font:400 13px / 1.5 var(--planr-font-body)}.studio-dialog-title{margin:0 32px 12px 0;font:600 20px / 1.3 var(--planr-font-display)}.studio-dialog-description{color:var(--planr-color-text-muted)}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:grid;grid-template-columns:minmax(0,1fr) auto;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:0}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{min-width:0}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;height:auto;min-height:32px;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:auto;min-height:44px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:auto;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{min-width:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:0;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:0}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-actions>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}.studio-toolbar[data-studio-center=true],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-center=true]{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr)}.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]{grid-template-columns:minmax(0,1fr);grid-template-rows:none;grid-auto-rows:auto;row-gap:4px;padding-block:4px}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-leading{grid-column:1;grid-row:1;width:100%}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-trailing{grid-column:1;grid-row:2;width:100%;flex-wrap:wrap}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-actions{justify-content:flex-end;flex-wrap:wrap;max-width:100%}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-center{grid-column:1;grid-row:3}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-status{max-width:100%;width:100%;flex-basis:100%;flex-wrap:wrap;justify-content:flex-end}:is(.studio-toolbar[data-studio-layout=compact],.planr-shell[data-studio-framework=react] .studio-toolbar[data-studio-layout=compact]) .studio-toolbar-status>:is(output,.studio-status,.design-preview-state){max-width:100%;white-space:normal;overflow:visible;overflow-wrap:normal}.studio-toolbar[data-studio-density=narrow]{gap:4px;padding-inline:8px}.studio-toolbar[data-studio-density=narrow] .design-wordmark,.studio-toolbar[data-studio-density=narrow] .design-button-label,.studio-toolbar[data-studio-density=narrow] .planr-mark{display:none}.studio-toolbar[data-studio-density=narrow] .studio-button,.studio-toolbar[data-studio-density=narrow] .planr-toolbar-action,.studio-toolbar[data-studio-density=narrow] .design-view-picker button{min-height:44px;min-width:44px}.studio-toolbar[data-studio-density=narrow] .design-view-picker{height:auto;gap:0}.studio-toolbar[data-studio-density=narrow] .design-view-picker button{width:44px;height:auto;padding:0}.studio-toolbar[data-studio-density=narrow] .studio-toolbar-actions{gap:4px}.studio-toolbar[data-studio-density=narrow] .studio-toolbar-status{font-size:10px}.studio-toolbar[data-studio-density=narrow] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.studio-toolbar[data-studio-density=narrow] :is(.design-export,.diagram-export)>button span{font-size:16px}@media(max-width:680px),(pointer:coarse){.studio-button,.studio-menu-item{min-width:44px;min-height:44px}}