openplanr 2.2641.2 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/cli/commands/doctor.d.ts.map +1 -1
  3. package/dist/cli/commands/doctor.js +19 -4
  4. package/dist/cli/commands/doctor.js.map +1 -1
  5. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  6. package/dist/cli/commands/upgrade.js +15 -11
  7. package/dist/cli/commands/upgrade.js.map +1 -1
  8. package/dist/cli/error-boundary.d.ts.map +1 -1
  9. package/dist/cli/error-boundary.js +2 -1
  10. package/dist/cli/error-boundary.js.map +1 -1
  11. package/dist/dashboard/.vite/manifest.json +1 -1
  12. package/dist/dashboard/assets/{index-DI_TKz9J.js → index-n08LJ6bK.js} +2 -2
  13. package/dist/dashboard/assets/{index-DI_TKz9J.js.map → index-n08LJ6bK.js.map} +1 -1
  14. package/dist/dashboard/dashboard-manifest.json +8 -8
  15. package/dist/dashboard/index.html +1 -1
  16. package/dist/services/claude-plugin-service.d.ts +9 -0
  17. package/dist/services/claude-plugin-service.d.ts.map +1 -1
  18. package/dist/services/claude-plugin-service.js +12 -0
  19. package/dist/services/claude-plugin-service.js.map +1 -1
  20. package/dist/services/runtime-change-summary.d.ts +4 -0
  21. package/dist/services/runtime-change-summary.d.ts.map +1 -1
  22. package/dist/services/runtime-change-summary.js +7 -0
  23. package/dist/services/runtime-change-summary.js.map +1 -1
  24. package/dist/services/runtime-manager/doctor.js +1 -1
  25. package/dist/services/runtime-manager/doctor.js.map +1 -1
  26. package/dist/services/runtime-manager/runtime-package.d.ts +15 -0
  27. package/dist/services/runtime-manager/runtime-package.d.ts.map +1 -1
  28. package/dist/services/runtime-manager/runtime-package.js +50 -10
  29. package/dist/services/runtime-manager/runtime-package.js.map +1 -1
  30. package/dist/services/runtime-manager-service.d.ts +11 -0
  31. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  32. package/dist/services/runtime-manager-service.js +88 -16
  33. package/dist/services/runtime-manager-service.js.map +1 -1
  34. package/dist/services/upgrade-report.d.ts +2 -2
  35. package/dist/services/upgrade-report.d.ts.map +1 -1
  36. package/dist/services/upgrade-report.js +14 -2
  37. package/dist/services/upgrade-report.js.map +1 -1
  38. package/dist/services/upgrade-service.d.ts +22 -2
  39. package/dist/services/upgrade-service.d.ts.map +1 -1
  40. package/dist/services/upgrade-service.js +108 -20
  41. package/dist/services/upgrade-service.js.map +1 -1
  42. package/docs/CLI.md +4 -1
  43. package/docs/TROUBLESHOOTING.md +9 -6
  44. package/install.ps1 +3 -3
  45. package/install.sh +3 -3
  46. package/lib/host-packages/adapter-registry.json +5 -5
  47. package/lib/host-packages/capability-map.json +1 -1
  48. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  49. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +2 -2
  50. package/lib/host-packages/claude/openplanr/.openplanr-content.json +21 -21
  51. package/lib/host-packages/claude/openplanr/README.md +1 -1
  52. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  53. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  54. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  55. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  56. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  57. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  58. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  59. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  60. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  61. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +1 -1
  62. package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +1 -1
  63. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +3 -3
  64. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +1 -1
  65. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +1 -1
  66. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +1 -1
  67. package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +4 -1
  68. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +8 -0
  69. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +2 -2
  70. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +20 -20
  71. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  72. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +1 -1
  73. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +3 -3
  74. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +1 -1
  75. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +1 -1
  76. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +1 -1
  77. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +1 -1
  78. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +8 -0
  79. package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +4 -1
  80. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +2 -2
  81. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  82. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  83. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  84. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  85. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  86. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  87. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  88. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  89. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  90. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  91. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  92. package/lib/host-packages/openai/openplanr/.openplanr-content.json +20 -20
  93. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
  94. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -4
  95. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css +14 -4
  96. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +14 -5
  97. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +28 -0
  98. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js +238 -68
  99. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +6 -6
  100. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
  101. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
  102. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +1 -1
  103. package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +1 -1
  104. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +3 -3
  105. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +1 -1
  106. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +1 -1
  107. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +1 -1
  108. package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +4 -1
  109. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +8 -0
  110. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +2 -2
  111. package/lib/node-runtime.d.mts +1 -1
  112. package/lib/node-runtime.mjs +2 -7
  113. package/package.json +5 -6
  114. package/bin/planr.js +0 -7
@@ -12,7 +12,7 @@
12
12
  },
13
13
  {
14
14
  "path": "manifest.json",
15
- "digest": "sha256:91af96f4bfd4d7c892d90ae531e9c00d3c00e48f4f8eb270ca172cb22ce41609"
15
+ "digest": "sha256:88a81a0ac3186a2647ad0ed0be1219bd6538d4cde06531e4a9f86679ada9dbba"
16
16
  },
17
17
  {
18
18
  "path": "rules/planr-artifact.mdc",
@@ -116,7 +116,7 @@
116
116
  },
117
117
  {
118
118
  "path": "rules/planr-delegate.mdc",
119
- "digest": "sha256:5a76e244433fad6ba51b4cb79154e7da4590962ff2199bd5e8d7e3fe35e0ac3d"
119
+ "digest": "sha256:4a44b4094f6ec174abe2eae83b38aeaf1a21c2e626612e557de4be0ddb9c513c"
120
120
  },
121
121
  {
122
122
  "path": "rules/planr-delegate/references/adapter-protocol.md",
@@ -124,7 +124,7 @@
124
124
  },
125
125
  {
126
126
  "path": "rules/planr-delegate/references/capsule-contract.md",
127
- "digest": "sha256:9bd80db920018a43cecc02f4996d65d5eb54a121fce6caa3c9198cb0ca01bf6a"
127
+ "digest": "sha256:22e5daac9ad9cb0951222fef4d0f45ae35de4a6b7ee2b47d660cc6b672188fff"
128
128
  },
129
129
  {
130
130
  "path": "rules/planr-delegate/references/integration-review.md",
@@ -228,7 +228,7 @@
228
228
  },
229
229
  {
230
230
  "path": "rules/planr-delegate/scripts/run-preparation.mjs",
231
- "digest": "sha256:dbc03621c77946ad77e97db84d826714d2fe75eccd15963756791b1439b46589"
231
+ "digest": "sha256:746630b00e1c252cae6dd7e78cde4b2d6c65e75f1ef19a092111e1e4de5152e3"
232
232
  },
233
233
  {
234
234
  "path": "rules/planr-delegate/scripts/run-record.mjs",
@@ -276,7 +276,7 @@
276
276
  },
277
277
  {
278
278
  "path": "rules/planr-design-loop/references/utilities.md",
279
- "digest": "sha256:df4414af1974d8268af25cfb33ce27d967e0a7f0ca29e75de82b91f3dacf2543"
279
+ "digest": "sha256:cedeae549cda5434a768846dc3d83a1baddfa74940276485db6fba1c649301b5"
280
280
  },
281
281
  {
282
282
  "path": "rules/planr-design-loop/schemas/design-document.schema.json",
@@ -332,7 +332,7 @@
332
332
  },
333
333
  {
334
334
  "path": "rules/planr-design-review/references/utilities.md",
335
- "digest": "sha256:df4414af1974d8268af25cfb33ce27d967e0a7f0ca29e75de82b91f3dacf2543"
335
+ "digest": "sha256:cedeae549cda5434a768846dc3d83a1baddfa74940276485db6fba1c649301b5"
336
336
  },
337
337
  {
338
338
  "path": "rules/planr-design-review/schemas/design-document.schema.json",
@@ -388,7 +388,7 @@
388
388
  },
389
389
  {
390
390
  "path": "rules/planr-design/references/utilities.md",
391
- "digest": "sha256:df4414af1974d8268af25cfb33ce27d967e0a7f0ca29e75de82b91f3dacf2543"
391
+ "digest": "sha256:cedeae549cda5434a768846dc3d83a1baddfa74940276485db6fba1c649301b5"
392
392
  },
393
393
  {
394
394
  "path": "rules/planr-design/schemas/design-document.schema.json",
@@ -428,11 +428,11 @@
428
428
  },
429
429
  {
430
430
  "path": "rules/planr-doctor.mdc",
431
- "digest": "sha256:d6e90240f79ca233f31cd90ad2ea61ea62d069c523322fa42ffa61d01aeea792"
431
+ "digest": "sha256:328ce5775b54d9b7f7c23bc6be9082004c3f734f5a78c5522b4feb66b31ce377"
432
432
  },
433
433
  {
434
434
  "path": "rules/planr-doctor/references/upgrade.md",
435
- "digest": "sha256:7370954450db1bac591d4f90b58df9022f6edac5b32d05051f93dbd35b0e35b9"
435
+ "digest": "sha256:b137e82d63ceeecef4e5c1cac72acbaaa2edbc29798214507ab9613d16088fde"
436
436
  },
437
437
  {
438
438
  "path": "rules/planr-investigate.mdc",
@@ -460,7 +460,7 @@
460
460
  },
461
461
  {
462
462
  "path": "rules/planr-plan.mdc",
463
- "digest": "sha256:fc5cca02f9aa4b1b799381b7fba4fbbd98ccf3f0ed86704a4bec4c72d2970201"
463
+ "digest": "sha256:952f63ebe7ad028043e1c25e12737f2e56db6216efa09346fd6bd14f071a5223"
464
464
  },
465
465
  {
466
466
  "path": "rules/planr-plan/references/artifact-contract.md",
@@ -684,7 +684,7 @@
684
684
  },
685
685
  {
686
686
  "path": "runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css",
687
- "digest": "sha256:4449fbe06d25ae0ad9b2faf15a4558f1c6fc8506d357e785dfdbc8befe69df59"
687
+ "digest": "sha256:514295a7c32cf8359385de2cdf8369aa41ccc6b119c93daad757182099067661"
688
688
  },
689
689
  {
690
690
  "path": "runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json",
@@ -724,11 +724,11 @@
724
724
  },
725
725
  {
726
726
  "path": "runtime/design/scripts/runtime/packages/design/package.json",
727
- "digest": "sha256:b3d397b4bb27c37799f143ee6a83c7000f3d1a38aba3e321778ed6cc8916d702"
727
+ "digest": "sha256:f1bd16719287e54ade15a9d4e6f889dd3385b6f1a8bf851332992533475cf3b5"
728
728
  },
729
729
  {
730
730
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/enhancements.css",
731
- "digest": "sha256:df58a7ee4ffcadac780d3170abbeb00cfecb1f42db692ba62eb6f66a251bd0ea"
731
+ "digest": "sha256:bdb55a9464e96fba112aad73354d54b6ccb8ac5d9bc100a90b51df4633ff11f7"
732
732
  },
733
733
  {
734
734
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/handoff-center.css",
@@ -744,11 +744,11 @@
744
744
  },
745
745
  {
746
746
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.css",
747
- "digest": "sha256:c9291e20366315b23c73e920ec5426d4c33d0880863d39650d4c535956984b1c"
747
+ "digest": "sha256:75ca0c3036d5c281e60a4155765ad8c2e9373bd39d34d4facebfe9bf26278c88"
748
748
  },
749
749
  {
750
750
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json",
751
- "digest": "sha256:268b66e770a35e3f5606a4c7b44f6fb6bd5659c15d1813f7421781ef3e9bcf99"
751
+ "digest": "sha256:fb0d23636597168f9f139c21ce9c5af63e225ad765231b1f0b7c2af2675d8cb6"
752
752
  },
753
753
  {
754
754
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js",
@@ -796,7 +796,7 @@
796
796
  },
797
797
  {
798
798
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js",
799
- "digest": "sha256:c40392e1328eb17f9d0a778d1f20e44118731d7c6a0a25f0aa731304a86994a0"
799
+ "digest": "sha256:9e2ac3d6b99028c7335aacf548f9e04fdf709d15f889db3e35bbebc389631000"
800
800
  },
801
801
  {
802
802
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js",
@@ -812,7 +812,7 @@
812
812
  },
813
813
  {
814
814
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-studio-shell.js",
815
- "digest": "sha256:a84049d6a41dd3f655e85a4a39e4874a4c7f6f2013ad9d8c192d22a7082bf407"
815
+ "digest": "sha256:81af29a6a5a15fd4f0ef41fc48e1eca63c30b3745fd1d92830ba83f7cf2ba603"
816
816
  },
817
817
  {
818
818
  "path": "runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js",
@@ -820,7 +820,7 @@
820
820
  },
821
821
  {
822
822
  "path": "runtime/design/scripts/runtime/packages/protocol/package.json",
823
- "digest": "sha256:037b4f8f4fd2f1db03d5106ec974e250502d1a4ce39a018e668ab7e07d93de43"
823
+ "digest": "sha256:ad2e601d993087146fcd4d049ddd1cf7e06f7102eb178e2c65017624a2252393"
824
824
  },
825
825
  {
826
826
  "path": "runtime/design/scripts/runtime/packages/protocol/registries/artifact-theme.json",
@@ -940,12 +940,12 @@
940
940
  },
941
941
  {
942
942
  "path": "runtime/plan/scripts/runtime/packages/protocol/package.json",
943
- "digest": "sha256:037b4f8f4fd2f1db03d5106ec974e250502d1a4ce39a018e668ab7e07d93de43"
943
+ "digest": "sha256:ad2e601d993087146fcd4d049ddd1cf7e06f7102eb178e2c65017624a2252393"
944
944
  },
945
945
  {
946
946
  "path": "runtime/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json",
947
947
  "digest": "sha256:b4db7b75b694c2aef2a37be2128e4635302f3473e09236aa1f37a33dcf3590b4"
948
948
  }
949
949
  ],
950
- "contentDigest": "sha256:4c78d40a2139af7d2f90e73b16712070822c1ba9e08cdd0d18bf01daab75f421"
950
+ "contentDigest": "sha256:39df236c01e03df234b336a8ffd951ed7330e3d5f84695f3083b98fb46c21c6d"
951
951
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "2.2641.2",
3
+ "version": "3.0.1",
4
4
  "ruleCount": 28,
5
5
  "rules": [
6
6
  "rules/planr-artifact.mdc",
@@ -1,6 +1,6 @@
1
1
  # Delegation context capsule v1
2
2
 
3
- `context.mjs` is an internal, Node 20+ package resource. It gathers **work context** only. It does not select a profile, grant a writable path, launch an agent, or authorize publication. The orchestrator must show `previewContextCapsule` alongside the selected writable repository, native engine/model selection, configuration trust and known provider or native-managed routing before dispatch.
3
+ `context.mjs` is an internal, Node 22+ package resource. It gathers **work context** only. It does not select a profile, grant a writable path, launch an agent, or authorize publication. The orchestrator must show `previewContextCapsule` alongside the selected writable repository, native engine/model selection, configuration trust and known provider or native-managed routing before dispatch.
4
4
 
5
5
  ## API
6
6
 
@@ -58,7 +58,7 @@ async function inspectWorktreeDependencies(worktreePath) {
58
58
  }
59
59
 
60
60
  export async function probeDelegateHost({ repositoryRoot, env = process.env } = {}) {
61
- const nodeReady = Number(process.versions.node.split('.')[0]) >= 20;
61
+ const nodeReady = Number(process.versions.node.split('.')[0]) >= 22;
62
62
  const options = {
63
63
  env: { PATH: env.PATH, HOME: env.HOME, USER: env.USER, TMPDIR: env.TMPDIR },
64
64
  cwd: repositoryRoot,
@@ -128,7 +128,7 @@ export async function probeDelegateHost({ repositoryRoot, env = process.env } =
128
128
  }
129
129
  return {
130
130
  ready: nodeReady && gitReady,
131
- node: { ready: nodeReady, minimumMajor: 20 },
131
+ node: { ready: nodeReady, minimumMajor: 22 },
132
132
  git: { ready: gitReady, ...(gitDiagnostic ? { diagnostic: gitDiagnostic } : {}) },
133
133
  repository,
134
134
  engines,
@@ -167,7 +167,7 @@ export async function prepareDelegateRun({
167
167
  if (!host.ready || !host.repository?.ready)
168
168
  throw new DelegateRunError(
169
169
  'E_DELEGATE_PREREQUISITE',
170
- 'Node 20+, Git, and a repository with a commit are required before task collection.',
170
+ 'Node 22+, Git, and a repository with a commit are required before task collection.',
171
171
  null,
172
172
  host,
173
173
  );
@@ -15,7 +15,7 @@ Ordinary implementation remains with `planr-ship`.
15
15
  Resolve [runner.mjs](planr-delegate/scripts/runner.mjs) from this installed skill. Call it through
16
16
  Node as `node <installed-skill>/scripts/runner.mjs <action>`, with one JSON object
17
17
  on stdin. Alternatively, include `action` in that object and omit the command-line
18
- action; conflicting actions are rejected. `probe` discovers Node 20+, Git, installed
18
+ action; conflicting actions are rejected. `probe` discovers Node 22+, Git, installed
19
19
  CLIs and optional profiles; an OpenPlanr checkout or public CLI command is not
20
20
  needed. Reuse normal signed-in authentication. Preserve selection precedence:
21
21
  explicit engine/profile, saved choice, then a sole compatible native choice; ask
@@ -2,7 +2,7 @@
2
2
 
3
3
  Run the linked design helper from the skill entrypoint relative to the skill's
4
4
  directory. It contains deterministic operations and all required assets. It needs
5
- Node 20 or later, with no global CLI, provider credentials or runtime downloads.
5
+ Node.js 22.13 or later, with no global CLI, provider credentials or runtime downloads.
6
6
  Use `--help` to inspect the installed command interface before writing documents
7
7
  or invoking operations; the installed contract is authoritative.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Run the linked design helper from the skill entrypoint relative to the skill's
4
4
  directory. It contains deterministic operations and all required assets. It needs
5
- Node 20 or later, with no global CLI, provider credentials or runtime downloads.
5
+ Node.js 22.13 or later, with no global CLI, provider credentials or runtime downloads.
6
6
  Use `--help` to inspect the installed command interface before writing documents
7
7
  or invoking operations; the installed contract is authoritative.
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Run the linked design helper from the skill entrypoint relative to the skill's
4
4
  directory. It contains deterministic operations and all required assets. It needs
5
- Node 20 or later, with no global CLI, provider credentials or runtime downloads.
5
+ Node.js 22.13 or later, with no global CLI, provider credentials or runtime downloads.
6
6
  Use `--help` to inspect the installed command interface before writing documents
7
7
  or invoking operations; the installed contract is authoritative.
8
8
 
@@ -52,6 +52,10 @@ Shape (the fields this skill reads):
52
52
  - `upgrade-available` or `incompatible` → act. First **record the `installed`
53
53
  block as the before state** — the honest diff at the end depends on it. When
54
54
  only `nextSteps` is non-empty, skip to step 3.
55
+ - `agents-behind` → the CLI is current and a coding agent's OpenPlanr install
56
+ needs updating. Record the `installed` block, then skip to step 3.
57
+ - `aligned` with non-empty `nextSteps` → the versions match, but an install needs
58
+ the `openplanr doctor` commands listed. Skip to step 3.
55
59
 
56
60
  ## 2. Upgrade the CLI and obtain the next steps
57
61
 
@@ -90,6 +94,10 @@ this file.** Other shapes:
90
94
  `openplanr upgrade status --json` and use its `nextSteps`.
91
95
  - An `openplanr doctor` command: planning that agent's update failed, and `detail`
92
96
  says why. Relay it and run `openplanr doctor --json`.
97
+ - An `openplanr doctor --fix` command: a file in that agent's runtime package was
98
+ changed outside OpenPlanr, and `detail` names it. Run it, show the user the
99
+ repair preview, and rerun it with `--yes` only after they confirm. The changed
100
+ files are backed up before they are replaced.
93
101
 
94
102
  `pluginHalfCommands` repeats the commands for older readers; read `nextSteps`.
95
103
 
@@ -36,7 +36,10 @@ skill's job, then reporting what actually changed — never what was merely
36
36
  attempted.
37
37
 
38
38
  1. **Decide.** Run `openplanr upgrade status --json` and read `status`. If it is
39
- `aligned` or `unknown`, there is nothing to drive — report it and stop.
39
+ `aligned` or `unknown` with empty `nextSteps`, there is nothing to drive —
40
+ report it and stop. If it is `agents-behind`, or `aligned` with `nextSteps`,
41
+ the CLI is already current: run its `nextSteps` commands in order, as step 3
42
+ describes, without upgrading the CLI.
40
43
  Record the reported `installed` versions; that is the before state.
41
44
  2. **Own half, prescribe half.** If `status` is `upgrade-available` or
42
45
  `incompatible`, confirm with the user (this upgrades the npm CLI), then run
@@ -117,8 +117,8 @@ instead of repeating every path in chat.
117
117
  - **Checks:** frontmatter, ID and acceptance coverage checks actually performed.
118
118
  - **Issues:** unresolved inputs or material assumptions, with their impact and recovery step; omit when empty.
119
119
  - **Next:** the exact ready task selector and a copy-ready host-native
120
- invocation such as `$planr-ship T-NNN` (Codex/ChatGPT) or
121
- `/planr-ship T-NNN` (Claude Code).
120
+ invocation such as `/planr:ship T-NNN` (Claude Code), `$planr:ship T-NNN`
121
+ (Codex/ChatGPT) or the `planr-ship` rule (Cursor).
122
122
 
123
123
  Mention the planning layout or consulted lenses only when they explain a material
124
124
  choice. Different summary wording never requires another planning run.
@@ -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;min-height: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}}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar{grid-template-columns:minmax(0,1fr) auto auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .planr-title-block strong{max-width:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-leading{grid-column:1;grid-row:1}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-center{display:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-secondary{grid-column:3;grid-row:1;display:flex;align-items:center;gap:4px;min-width:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-trailing{grid-column:2;grid-row:1;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .studio-toolbar-actions{flex-wrap:nowrap}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar .de-icon-button{min-width:44px;min-height:44px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar button,.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar a{border-radius:8px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar button svg,.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar a svg{width:18px;height:18px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar [data-action=outline]{background:transparent;border-color:transparent}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact]{grid-template-columns:minmax(0,1fr) auto;gap:0 8px;padding-block:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-leading{grid-column:1;grid-row:1;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-trailing{grid-column:2;grid-row:1;flex-wrap:nowrap;width:auto}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-secondary{grid-column:1 / -1;grid-row:2;border-top:0;padding-top:0}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .de-save-state{display:inline-block;flex:1;max-width:none;overflow:visible;white-space:normal;font-size:12px;line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .planr-brand{flex:1}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .de-title{max-width:none;font-size:14px;font-weight:600;line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-type-badge{font-size:10px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact] .studio-toolbar-actions{flex-wrap:nowrap}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]){position:relative;isolation:isolate;min-width:44px;min-height:44px;padding:0;border-color:transparent;background:transparent;box-shadow:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem])::before{content:"";position:absolute;z-index:-1;inset:6px;border:1px solid transparent;border-radius:8px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):is(:hover,[aria-expanded=true],[aria-pressed=true])::before{background:var(--de-raised);border-color:var(--de-rule)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:not(:disabled)::before{background:var(--de-primary);border-color:var(--de-primary)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:hover:not(:disabled)::before{background:var(--de-primary-hover);border-color:var(--de-primary-hover)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]).de-primary:disabled::before{background:var(--de-raised);border-color:var(--de-rule)}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):focus-visible{outline:none}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] :is(.de-icon-button,button:has(>svg),a:has(>svg)):not([role=menuitem]):focus-visible::before{outline:2px solid var(--de-primary);outline-offset:1px}.planr-diagram-editor[data-studio-framework=react] .diagram-authoring-toolbar[data-studio-layout=compact][data-studio-density=narrow] .de-save-state{font-size:11px}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/design",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Canonical OpenPlanr design helpers and design-loop engine",
@@ -43,11 +43,11 @@
43
43
  "LICENSE"
44
44
  ],
45
45
  "engines": {
46
- "node": ">=20.19.0"
46
+ "node": ">=22.13.0"
47
47
  },
48
48
  "dependencies": {
49
- "@openplanr/artifact": "0.6.5",
50
- "@openplanr/protocol": "0.10.3"
49
+ "@openplanr/artifact": "0.6.7",
50
+ "@openplanr/protocol": "0.12.0"
51
51
  },
52
52
  "scripts": {
53
53
  "test": "node --test --test-concurrency=2 tests/*.test.mjs",
@@ -267,8 +267,13 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
267
267
 
268
268
  /* A shared sizing contract keeps captions, tools and service status from
269
269
  overlapping. It belongs to the shell; iframe documents inherit none of it. */
270
- [data-design-studio] .design-stage-context { height:var(--design-stage-context-height); }
271
- [data-design-studio] .planr-shell:not([data-design-presentation="true"]) .planr-stage-scroll { inset-block-start:var(--design-stage-context-height); }
270
+ [data-design-studio] .design-stage-context { height:auto; min-height:var(--design-stage-context-height); flex-wrap:wrap; }
271
+ [data-design-studio] .design-stage-context > div:first-child { flex:1 1 220px; max-width:100%; }
272
+ [data-design-studio] .design-stage-context > .design-stage-actions { flex:0 1 auto; flex-wrap:wrap; max-width:100%; }
273
+ [data-design-studio] .design-frame-picker { min-width:0; max-width:100%; }
274
+ [data-design-studio] .design-frame-picker select { min-width:0; flex:1 1 auto; appearance:none; line-height:1.3; min-height:32px; padding-inline-end:26px; background-image:linear-gradient(45deg,transparent 50%,var(--planr-color-text) 50%),linear-gradient(135deg,var(--planr-color-text) 50%,transparent 50%); background-position:calc(100% - 12px) 50%,calc(100% - 8px) 50%; background-size:4px 4px; background-repeat:no-repeat; }
275
+ [data-design-studio] .design-guidance > summary { height:auto; min-height:30px; padding-block:4px; line-height:1.3; white-space:nowrap; }
276
+ [data-design-studio] .planr-shell:not([data-design-presentation="true"]) .planr-stage-scroll { inset-block-start:var(--design-stage-context-measured-height,var(--design-stage-context-height)); }
272
277
  [data-design-studio] .planr-shell[data-design-view="prototype"]:not([data-design-presentation="true"]) .planr-stage-scroll { bottom:calc(var(--design-tools-space) + var(--design-status-space)); }
273
278
  [data-design-studio] .planr-shell[data-design-view="walkthrough"]:not([data-design-presentation="true"]) .planr-stage-scroll { bottom:calc(var(--design-tools-space) + var(--design-caption-height) + var(--design-status-space)); }
274
279
  [data-design-studio] .design-walkthrough-caption { height:var(--design-caption-height); min-height:var(--design-caption-height); max-height:var(--design-caption-height); bottom:var(--design-status-space); }
@@ -286,14 +291,14 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
286
291
  font-size:var(--design-type-control); line-height:1.4; min-height:var(--design-touch-target);
287
292
  min-width:0; max-width:100%; border-radius:8px; padding:10px 12px; scroll-margin-block:16px;
288
293
  }
289
- :root[data-design-studio] body select { height:var(--design-touch-target); }
294
+ :root[data-design-studio] body select { height:auto; min-height:var(--design-touch-target); }
290
295
  :root[data-design-studio] body :is(button:not(.planr-pin):not(.design-minimap-close),.design-export > summary,.design-tools-menu > summary,.design-guidance > summary) {
291
296
  min-height:var(--design-touch-target); min-width:var(--design-touch-target); touch-action:manipulation;
292
297
  }
293
298
  :root[data-design-studio] body :is(.design-dialog-close,.design-nav-close,.planr-rail-close,.planr-composer-header button) {
294
299
  width:var(--design-touch-target); height:var(--design-touch-target); flex-basis:var(--design-touch-target);
295
300
  }
296
- :root[data-design-studio] .design-canvas-tools button { height:var(--design-touch-target); white-space:nowrap; }
301
+ :root[data-design-studio] .design-canvas-tools button { height:auto; min-height:var(--design-touch-target); white-space:nowrap; }
297
302
  :root[data-design-studio] :is(.design-dialog-content,.design-inspector,.planr-thread-comment,.planr-reply) { font-size:var(--design-type-body); }
298
303
  :root[data-design-studio] :is(.design-profile-form > label,.planr-annotation-composer label,.planr-identity label,.design-profile-form legend) { font-size:var(--design-type-label); }
299
304
  :root[data-design-studio] :is(.design-muted,.design-profile-form > .design-muted,.design-dialog-status) { font-size:var(--design-type-label); }
@@ -365,6 +370,11 @@ html[data-design-theme="light"] .design-export > div { box-shadow:0 12px 30px #1
365
370
  :root[data-design-studio] .planr-shell { height:var(--design-frozen-shell-height,100%); }
366
371
  :root[data-design-studio] .design-toolbar { grid-template-columns:auto minmax(0,1fr) auto; grid-template-rows:52px; padding:0 max(8px,env(safe-area-inset-right,0px)) 0 max(8px,env(safe-area-inset-left,0px)); }
367
372
  :root[data-design-studio] .design-toolbar .planr-brand { display:none; }
373
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] { grid-template-columns:auto minmax(0,1fr); }
374
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-leading { grid-column:1; grid-row:1; width:auto; }
375
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-trailing { grid-column:2; grid-row:1; width:auto; flex-wrap:nowrap; }
376
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-center { grid-column:1 / -1; grid-row:2; }
377
+ :root[data-design-studio] .planr-shell[data-studio-framework="react"] .design-toolbar[data-studio-layout="compact"] .studio-toolbar-status { width:auto; flex-basis:auto; max-width:128px; }
368
378
  :root[data-design-studio] .design-toolbar-trailing { grid-column:3; }
369
379
  :root[data-design-studio] .design-view-picker { grid-column:2; grid-row:1; }
370
380
  :root[data-design-studio] .design-stage-context { flex-wrap:nowrap; padding:4px 12px; }
@@ -506,6 +506,11 @@
506
506
  transform: translateX(-50%);
507
507
  display: flex;
508
508
  align-items: center;
509
+ flex-wrap: wrap;
510
+ justify-content: center;
511
+ width: max-content;
512
+ max-width: calc(100% - 32px);
513
+ box-sizing: border-box;
509
514
  gap: 2px;
510
515
  padding: 4px;
511
516
  border: 1px solid var(--planr-color-rule);
@@ -514,22 +519,26 @@
514
519
  box-shadow: 0 8px 28px #0006;
515
520
  }
516
521
  .design-canvas-tools button {
517
- height: 28px;
522
+ height: auto;
523
+ min-height: 28px;
518
524
  min-width: 28px;
519
- padding: 0 8px;
525
+ flex: none;
526
+ padding: 4px 8px;
520
527
  border: 0;
521
528
  border-radius: 4px;
522
529
  background: transparent;
523
530
  font-size: 11px;
531
+ line-height: 1.3;
532
+ white-space: nowrap;
524
533
  cursor: pointer;
525
534
  }
526
535
  .design-canvas-tools [data-design-zoom="reset"] {
527
- flex: 0 0 56px;
528
- width: 56px;
536
+ flex: 0 0 auto;
537
+ width: auto;
529
538
  min-width: 56px;
530
539
  font-variant-numeric: tabular-nums;
531
540
  }
532
- .design-interaction-picker { height:30px; padding:0; border:0; background:transparent; }
541
+ .design-interaction-picker { height:auto; min-height:30px; flex:none; padding:0; border:0; background:transparent; }
533
542
  .design-interaction-picker button { display:flex; align-items:center; gap:6px; }
534
543
  .design-interaction-picker .design-button-label { display:none; }
535
544
  .design-canvas-tools .design-interaction-picker button[aria-pressed="true"] { background:var(--planr-color-raised); color:var(--planr-color-primary); }
@@ -2307,6 +2307,33 @@ ${fence}`;
2307
2307
  );
2308
2308
  content.append(value, reason, save);
2309
2309
  }
2310
+ function installStageContextGeometry() {
2311
+ const context = q(".design-stage-context", root);
2312
+ if (!context) return;
2313
+ let frame = 0;
2314
+ const measure = () => {
2315
+ frame = 0;
2316
+ if (disposed) return;
2317
+ const height = Math.ceil(context.getBoundingClientRect().height);
2318
+ const value = `${height}px`;
2319
+ if (height && root.style.getPropertyValue("--design-stage-context-measured-height") !== value)
2320
+ root.style.setProperty("--design-stage-context-measured-height", value);
2321
+ };
2322
+ const schedule = () => {
2323
+ if (!frame && !disposed) frame = requestAnimationFrame(measure);
2324
+ };
2325
+ const observer = typeof ResizeObserver === "function" ? new ResizeObserver(schedule) : null;
2326
+ observer?.observe(context);
2327
+ on(window, "resize", schedule);
2328
+ on(root, "planr:design-render", schedule);
2329
+ void document.fonts?.ready.then(schedule);
2330
+ measure();
2331
+ destroyers.push(() => {
2332
+ observer?.disconnect();
2333
+ cancelAnimationFrame(frame);
2334
+ root.style.removeProperty("--design-stage-context-measured-height");
2335
+ });
2336
+ }
2310
2337
  function installCanvas() {
2311
2338
  const tools = q(".design-canvas-tools");
2312
2339
  const more = node("details", "", { class: "design-tools-menu" });
@@ -3494,6 +3521,7 @@ ${fence}`;
3494
3521
  installComposerCategory();
3495
3522
  installInspector();
3496
3523
  installCanvas();
3524
+ installStageContextGeometry();
3497
3525
  installThumbnails();
3498
3526
  installPersonalDrafts();
3499
3527
  about(true);