openplanr 2.2641.1 → 2.2641.2

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 (245) hide show
  1. package/CHANGELOG.md +21 -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/github.d.ts.map +1 -1
  6. package/dist/cli/commands/github.js +7 -10
  7. package/dist/cli/commands/github.js.map +1 -1
  8. package/dist/cli/commands/linear.js +1 -1
  9. package/dist/cli/commands/linear.js.map +1 -1
  10. package/dist/cli/commands/report.d.ts.map +1 -1
  11. package/dist/cli/commands/report.js +28 -32
  12. package/dist/cli/commands/report.js.map +1 -1
  13. package/dist/dashboard/.vite/manifest.json +1 -1
  14. package/dist/dashboard/assets/{index-DGyC7RDz.js → index-DI_TKz9J.js} +2 -2
  15. package/dist/dashboard/assets/{index-DGyC7RDz.js.map → index-DI_TKz9J.js.map} +1 -1
  16. package/dist/dashboard/dashboard-manifest.json +8 -8
  17. package/dist/dashboard/index.html +1 -1
  18. package/dist/models/schema.d.ts +0 -4
  19. package/dist/models/schema.d.ts.map +1 -1
  20. package/dist/models/schema.js +0 -2
  21. package/dist/models/schema.js.map +1 -1
  22. package/dist/models/types.d.ts +1 -4
  23. package/dist/models/types.d.ts.map +1 -1
  24. package/dist/services/credentials-service.js +1 -1
  25. package/dist/services/credentials-service.js.map +1 -1
  26. package/dist/services/distribution-service.d.ts +1 -4
  27. package/dist/services/distribution-service.d.ts.map +1 -1
  28. package/dist/services/distribution-service.js +1 -60
  29. package/dist/services/distribution-service.js.map +1 -1
  30. package/dist/services/github-service.d.ts +7 -4
  31. package/dist/services/github-service.d.ts.map +1 -1
  32. package/dist/services/github-service.js +16 -15
  33. package/dist/services/github-service.js.map +1 -1
  34. package/dist/services/linear-push-service.d.ts +3 -4
  35. package/dist/services/linear-push-service.d.ts.map +1 -1
  36. package/dist/services/linear-push-service.js +5 -6
  37. package/dist/services/linear-push-service.js.map +1 -1
  38. package/dist/services/spec-service.d.ts.map +1 -1
  39. package/dist/services/spec-service.js +34 -69
  40. package/dist/services/spec-service.js.map +1 -1
  41. package/dist/templates/rules/shared/capability-map.md.hbs +1 -1
  42. package/docs/CLI.md +10 -14
  43. package/lib/host-packages/adapter-registry.json +5 -5
  44. package/lib/host-packages/capability-map.json +8 -8
  45. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  46. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
  47. package/lib/host-packages/claude/openplanr/.openplanr-content.json +80 -64
  48. package/lib/host-packages/claude/openplanr/README.md +8 -12
  49. package/lib/host-packages/claude/openplanr/agents/planr-backend.md +49 -55
  50. package/lib/host-packages/claude/openplanr/agents/planr-database.md +56 -92
  51. package/lib/host-packages/claude/openplanr/agents/planr-designer.md +35 -51
  52. package/lib/host-packages/claude/openplanr/agents/planr-devops.md +37 -51
  53. package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +29 -52
  54. package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +24 -23
  55. package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +46 -58
  56. package/lib/host-packages/claude/openplanr/agents/planr-qa.md +4 -2
  57. package/lib/host-packages/claude/openplanr/agents/planr-specification.md +54 -51
  58. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +21 -65
  59. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +5 -6
  60. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +2 -3
  61. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +3 -4
  62. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +19 -64
  63. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +10 -12
  64. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +19 -62
  65. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +3 -4
  66. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +2 -3
  67. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +2 -3
  68. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +16 -59
  69. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +9 -11
  70. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +4 -4
  71. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  72. package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  73. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  74. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  75. package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  76. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +1 -1
  77. package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  78. package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +2 -2
  79. package/lib/host-packages/claude/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
  80. package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +0 -1
  81. package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
  82. package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +6 -2
  83. package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +6 -2
  84. package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +0 -1
  85. package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
  86. package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +0 -1
  87. package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
  88. package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +0 -1
  89. package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
  90. package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +0 -1
  91. package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
  92. package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +7 -0
  93. package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +16 -1
  94. package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +7 -5
  95. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
  96. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
  97. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
  98. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/context.mjs +84 -22
  99. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
  100. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
  101. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
  102. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
  103. package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
  104. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
  105. package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +5 -3
  106. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +8 -2
  107. package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +5 -4
  108. package/lib/host-packages/claude/openplanr/skills/sprint/references/tracker-connections.md +70 -0
  109. package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +4 -3
  110. package/lib/host-packages/claude/openplanr/skills/status/references/tracker-connections.md +70 -0
  111. package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +11 -20
  112. package/lib/host-packages/claude/openplanr/skills/sync/references/tracker-connections.md +70 -0
  113. package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +2 -2
  114. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +52 -36
  115. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  116. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/diagram-sharing.md +1 -1
  117. package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +2 -2
  118. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +25 -4
  119. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +6 -1
  120. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +6 -1
  121. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +25 -4
  122. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +25 -4
  123. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +25 -4
  124. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +25 -4
  125. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +16 -1
  126. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +7 -5
  127. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +11 -4
  128. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +1 -1
  129. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/backend-diagnostics.mjs +14 -48
  130. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/context.mjs +84 -22
  131. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/credentials.mjs +167 -0
  132. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +3 -2
  133. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +5 -7
  134. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +2 -0
  135. package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -3
  136. package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +7 -0
  137. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-sharing.md +1 -1
  138. package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +5 -3
  139. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +8 -2
  140. package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/tracker-connections.md +70 -0
  141. package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +5 -4
  142. package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md +70 -0
  143. package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +4 -3
  144. package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/tracker-connections.md +70 -0
  145. package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +2 -2
  146. package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +11 -20
  147. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  148. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  149. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  150. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  151. package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  152. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +1 -1
  153. package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  154. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  155. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  156. package/lib/host-packages/openai/openplanr/.openplanr-content.json +61 -45
  157. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +24 -9
  158. package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +3 -3
  159. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
  160. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
  161. package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
  162. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +1 -1
  163. package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
  164. package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +2 -2
  165. package/lib/host-packages/openai/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
  166. package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +0 -1
  167. package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
  168. package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +6 -2
  169. package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +6 -2
  170. package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +0 -1
  171. package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
  172. package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +0 -1
  173. package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
  174. package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +0 -1
  175. package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
  176. package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +0 -1
  177. package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
  178. package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +7 -0
  179. package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +11 -0
  180. package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +16 -1
  181. package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +7 -5
  182. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
  183. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
  184. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
  185. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/context.mjs +84 -22
  186. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
  187. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
  188. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
  189. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
  190. package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
  191. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
  192. package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +5 -3
  193. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +8 -2
  194. package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +5 -4
  195. package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +11 -0
  196. package/lib/host-packages/openai/openplanr/skills/sprint/references/tracker-connections.md +70 -0
  197. package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +4 -3
  198. package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +11 -0
  199. package/lib/host-packages/openai/openplanr/skills/status/references/tracker-connections.md +70 -0
  200. package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +11 -20
  201. package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +11 -0
  202. package/lib/host-packages/openai/openplanr/skills/sync/references/tracker-connections.md +70 -0
  203. package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +2 -2
  204. package/lib/integrations.mjs +2 -2
  205. package/package.json +2 -2
  206. package/dist/services/connectors/adapters/business-metrics.d.ts +0 -5
  207. package/dist/services/connectors/adapters/business-metrics.d.ts.map +0 -1
  208. package/dist/services/connectors/adapters/business-metrics.js +0 -41
  209. package/dist/services/connectors/adapters/business-metrics.js.map +0 -1
  210. package/dist/services/connectors/adapters/deployment-health.d.ts +0 -18
  211. package/dist/services/connectors/adapters/deployment-health.d.ts.map +0 -1
  212. package/dist/services/connectors/adapters/deployment-health.js +0 -67
  213. package/dist/services/connectors/adapters/deployment-health.js.map +0 -1
  214. package/dist/services/connectors/adapters/github.d.ts +0 -5
  215. package/dist/services/connectors/adapters/github.d.ts.map +0 -1
  216. package/dist/services/connectors/adapters/github.js +0 -31
  217. package/dist/services/connectors/adapters/github.js.map +0 -1
  218. package/dist/services/connectors/adapters/linear-jira.d.ts +0 -5
  219. package/dist/services/connectors/adapters/linear-jira.d.ts.map +0 -1
  220. package/dist/services/connectors/adapters/linear-jira.js +0 -26
  221. package/dist/services/connectors/adapters/linear-jira.js.map +0 -1
  222. package/dist/services/connectors/adapters/posthog.d.ts +0 -5
  223. package/dist/services/connectors/adapters/posthog.d.ts.map +0 -1
  224. package/dist/services/connectors/adapters/posthog.js +0 -31
  225. package/dist/services/connectors/adapters/posthog.js.map +0 -1
  226. package/dist/services/connectors/adapters/sentry.d.ts +0 -5
  227. package/dist/services/connectors/adapters/sentry.d.ts.map +0 -1
  228. package/dist/services/connectors/adapters/sentry.js +0 -31
  229. package/dist/services/connectors/adapters/sentry.js.map +0 -1
  230. package/dist/services/connectors/checkpoint-custody.d.ts +0 -45
  231. package/dist/services/connectors/checkpoint-custody.d.ts.map +0 -1
  232. package/dist/services/connectors/checkpoint-custody.js +0 -499
  233. package/dist/services/connectors/checkpoint-custody.js.map +0 -1
  234. package/dist/services/connectors/connector-registry.d.ts +0 -144
  235. package/dist/services/connectors/connector-registry.d.ts.map +0 -1
  236. package/dist/services/connectors/connector-registry.js +0 -423
  237. package/dist/services/connectors/connector-registry.js.map +0 -1
  238. package/dist/services/connectors/connector-runtime.d.ts +0 -208
  239. package/dist/services/connectors/connector-runtime.d.ts.map +0 -1
  240. package/dist/services/connectors/connector-runtime.js +0 -1305
  241. package/dist/services/connectors/connector-runtime.js.map +0 -1
  242. package/dist/services/connectors/credential-custody.d.ts +0 -96
  243. package/dist/services/connectors/credential-custody.d.ts.map +0 -1
  244. package/dist/services/connectors/credential-custody.js +0 -390
  245. package/dist/services/connectors/credential-custody.js.map +0 -1
@@ -78,8 +78,14 @@ Write stories and tasks directly in the repository's active planning mode.
78
78
  deleted ID. The packaged [planning ID helper](planr-plan/scripts/planning-ids.mjs) may
79
79
  inspect or reserve IDs; it never generates content.
80
80
  - Give each story stable acceptance IDs starting at `AC-001`.
81
- - Create one Tech task when no design surface applies; create one UI and one
82
- Tech task when it does. Never exceed two tasks for one story.
81
+ - Split each story into tasks that are coherent and independently verifiable.
82
+ Separate by ownership first: UI work is a `UI` task for the frontend role and
83
+ server, data, or integration work is a `Tech` task for the backend role.
84
+ Within one owner, split further only for a real output dependency, a distinct
85
+ verification surface, or reviewable size. Most stories need one Tech task,
86
+ plus one UI task when a design surface applies; never fragment one coherent
87
+ change into tasks that cannot be verified alone, and never fold unrelated work
88
+ into one task.
83
89
  - Map every acceptance ID through `acceptanceRefs` and name it with a concrete
84
90
  verification statement under `## Test Requirements`.
85
91
  - Set `reviewRisks` and `browserSurfaces` from repository evidence; use empty
@@ -0,0 +1,70 @@
1
+ # GitHub and Linear connections
2
+
3
+ These skills store and read no GitHub or Linear credentials. Remote steps run through a
4
+ connection the host already has; the planning files stay the source of truth.
5
+
6
+ ## Use the host's connection
7
+
8
+ - **Linear:** the host's Linear connection, whose tools read, create and update issues.
9
+ - **GitHub:** the host's GitHub connection, or the GitHub CLI when
10
+ `gh auth status --hostname github.com` succeeds.
11
+
12
+ Never ask the user for a token, read one from the environment or a file, or put one in a
13
+ command, URL or file.
14
+
15
+ ## When a connection is missing
16
+
17
+ Finish the local work first. Then report the remote step as not run and give the one
18
+ line for the current host:
19
+
20
+ | Host | Linear | GitHub |
21
+ | --- | --- | --- |
22
+ | Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
23
+ | Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
24
+ | Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
25
+
26
+ Ask the user to try again once connected; never retry the remote step on your own.
27
+
28
+ ## Status mapping
29
+
30
+ | Local status | Linear workflow state | GitHub issue |
31
+ | --- | --- | --- |
32
+ | `planning`, `pending` | Unstarted (for example Todo) | open |
33
+ | `in-progress` | Started (for example In Progress) | open |
34
+ | `done` | Completed (for example Done) | closed |
35
+ | Backlog `open` | Backlog, else Unstarted | open |
36
+ | Backlog `closed` | Completed | closed |
37
+ | Backlog `promoted` | Leave as it is | Leave as it is |
38
+
39
+ When reading state back, write only a status the item's type allows. A backlog item takes
40
+ `open` or `closed` and keeps `promoted`.
41
+
42
+ - Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
43
+ `in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
44
+ and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
45
+ task files keep their status.
46
+ - A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
47
+ `in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
48
+ stay as they are.
49
+
50
+ ## Links
51
+
52
+ A linked item records its tracker identity in frontmatter. Update a linked item through
53
+ that identity instead of creating another, and record the identity of everything you
54
+ create.
55
+
56
+ - **GitHub:** each item is one issue, recorded as `githubIssue`.
57
+ - **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
58
+ create:
59
+ - An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
60
+ `linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
61
+ it is a milestone in an existing project (`linearMilestoneId`) or a team label
62
+ (`linearLabelId`) instead, and every issue under it carries that milestone
63
+ (`linearProjectMilestoneId`) or label (`linearLabelIds`).
64
+ - A feature, quick task or backlog item is one issue (`linearIssueId`,
65
+ `linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
66
+ issue (`linearParentIssueId`).
67
+ - All task files of one feature share one task-list issue: a sub-issue of the feature's
68
+ issue whose checklist merges every task file, recorded in each task file. Its state is
69
+ Completed when every task file is `done`, Unstarted when every one is `pending`, and
70
+ Started otherwise.
@@ -35,7 +35,7 @@ capability; it never blocks the run. Name every degraded input in `Issues`.
35
35
  | Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
36
36
  | Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `openplanr sprint diff` is possible | First run, no diff |
37
37
  | Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
38
- | Linear or GitHub connector | Push statuses on approval, read PR state | Local files only; report the external step as not run |
38
+ | Linear or GitHub connection ([tracker connections](planr-sprint/references/tracker-connections.md)) | Update linked issues on approval, read PR state | Local files only; report the external step as not run and name the connection to add |
39
39
 
40
40
  ## Step 0: Frame the run
41
41
 
@@ -134,9 +134,10 @@ openplanr sprint apply SPRINT-NNN --dry-run # show the status and prior
134
134
  openplanr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
135
135
  ```
136
136
 
137
- Where a connector is configured, push each changed item afterwards
138
- (`openplanr linear push <id>`, `openplanr github push <id>`) and report the ones that
139
- were not pushed. When the CLI is unavailable, apply the same status changes with
137
+ Then update the issue linked to each changed item through the host's Linear or
138
+ GitHub connection, with the status mapping in
139
+ [tracker connections](planr-sprint/references/tracker-connections.md), and report the items that
140
+ were not updated. When the CLI is unavailable, apply the same status changes with
140
141
  the repository's own vocabulary and commit them with the same message.
141
142
 
142
143
  Close a finished sprint with `openplanr sprint close SPRINT-NNN`; it records the
@@ -0,0 +1,70 @@
1
+ # GitHub and Linear connections
2
+
3
+ These skills store and read no GitHub or Linear credentials. Remote steps run through a
4
+ connection the host already has; the planning files stay the source of truth.
5
+
6
+ ## Use the host's connection
7
+
8
+ - **Linear:** the host's Linear connection, whose tools read, create and update issues.
9
+ - **GitHub:** the host's GitHub connection, or the GitHub CLI when
10
+ `gh auth status --hostname github.com` succeeds.
11
+
12
+ Never ask the user for a token, read one from the environment or a file, or put one in a
13
+ command, URL or file.
14
+
15
+ ## When a connection is missing
16
+
17
+ Finish the local work first. Then report the remote step as not run and give the one
18
+ line for the current host:
19
+
20
+ | Host | Linear | GitHub |
21
+ | --- | --- | --- |
22
+ | Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
23
+ | Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
24
+ | Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
25
+
26
+ Ask the user to try again once connected; never retry the remote step on your own.
27
+
28
+ ## Status mapping
29
+
30
+ | Local status | Linear workflow state | GitHub issue |
31
+ | --- | --- | --- |
32
+ | `planning`, `pending` | Unstarted (for example Todo) | open |
33
+ | `in-progress` | Started (for example In Progress) | open |
34
+ | `done` | Completed (for example Done) | closed |
35
+ | Backlog `open` | Backlog, else Unstarted | open |
36
+ | Backlog `closed` | Completed | closed |
37
+ | Backlog `promoted` | Leave as it is | Leave as it is |
38
+
39
+ When reading state back, write only a status the item's type allows. A backlog item takes
40
+ `open` or `closed` and keeps `promoted`.
41
+
42
+ - Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
43
+ `in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
44
+ and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
45
+ task files keep their status.
46
+ - A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
47
+ `in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
48
+ stay as they are.
49
+
50
+ ## Links
51
+
52
+ A linked item records its tracker identity in frontmatter. Update a linked item through
53
+ that identity instead of creating another, and record the identity of everything you
54
+ create.
55
+
56
+ - **GitHub:** each item is one issue, recorded as `githubIssue`.
57
+ - **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
58
+ create:
59
+ - An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
60
+ `linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
61
+ it is a milestone in an existing project (`linearMilestoneId`) or a team label
62
+ (`linearLabelId`) instead, and every issue under it carries that milestone
63
+ (`linearProjectMilestoneId`) or label (`linearLabelIds`).
64
+ - A feature, quick task or backlog item is one issue (`linearIssueId`,
65
+ `linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
66
+ issue (`linearParentIssueId`).
67
+ - All task files of one feature share one task-list issue: a sub-issue of the feature's
68
+ issue whose checklist merges every task file, recorded in each task file. Its state is
69
+ Completed when every task file is `done`, Unstarted when every one is `pending`, and
70
+ Started otherwise.
@@ -10,9 +10,10 @@ planning artifacts, task statuses, dependency graph, current branch, and relevan
10
10
  runtime markers directly. Use the optional deterministic `openplanr status --json`
11
11
  utility when available, but do not require it or a semantic subprocess.
12
12
 
13
- Add GitHub or Linear lookups only when the user requests live remote state. Keep
14
- local results useful when credentials or connectors are unavailable. Report
15
- counts, ready and blocked work, dependency problems, and the most useful next
13
+ Add GitHub or Linear lookups only when the user requests live remote state, through
14
+ the host's connections as described in [tracker connections](planr-status/references/tracker-connections.md).
15
+ Keep local results useful when a connection is unavailable, and name the one to add.
16
+ Report counts, ready and blocked work, dependency problems, and the most useful next
16
17
  action. Do not repair artifacts, start Plan or Ship, or change lifecycle state.
17
18
 
18
19
  When the OpenPlanr dashboard is running (`planr-dashboard`), the same delivery
@@ -0,0 +1,70 @@
1
+ # GitHub and Linear connections
2
+
3
+ These skills store and read no GitHub or Linear credentials. Remote steps run through a
4
+ connection the host already has; the planning files stay the source of truth.
5
+
6
+ ## Use the host's connection
7
+
8
+ - **Linear:** the host's Linear connection, whose tools read, create and update issues.
9
+ - **GitHub:** the host's GitHub connection, or the GitHub CLI when
10
+ `gh auth status --hostname github.com` succeeds.
11
+
12
+ Never ask the user for a token, read one from the environment or a file, or put one in a
13
+ command, URL or file.
14
+
15
+ ## When a connection is missing
16
+
17
+ Finish the local work first. Then report the remote step as not run and give the one
18
+ line for the current host:
19
+
20
+ | Host | Linear | GitHub |
21
+ | --- | --- | --- |
22
+ | Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
23
+ | Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
24
+ | Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
25
+
26
+ Ask the user to try again once connected; never retry the remote step on your own.
27
+
28
+ ## Status mapping
29
+
30
+ | Local status | Linear workflow state | GitHub issue |
31
+ | --- | --- | --- |
32
+ | `planning`, `pending` | Unstarted (for example Todo) | open |
33
+ | `in-progress` | Started (for example In Progress) | open |
34
+ | `done` | Completed (for example Done) | closed |
35
+ | Backlog `open` | Backlog, else Unstarted | open |
36
+ | Backlog `closed` | Completed | closed |
37
+ | Backlog `promoted` | Leave as it is | Leave as it is |
38
+
39
+ When reading state back, write only a status the item's type allows. A backlog item takes
40
+ `open` or `closed` and keeps `promoted`.
41
+
42
+ - Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
43
+ `in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
44
+ and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
45
+ task files keep their status.
46
+ - A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
47
+ `in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
48
+ stay as they are.
49
+
50
+ ## Links
51
+
52
+ A linked item records its tracker identity in frontmatter. Update a linked item through
53
+ that identity instead of creating another, and record the identity of everything you
54
+ create.
55
+
56
+ - **GitHub:** each item is one issue, recorded as `githubIssue`.
57
+ - **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
58
+ create:
59
+ - An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
60
+ `linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
61
+ it is a milestone in an existing project (`linearMilestoneId`) or a team label
62
+ (`linearLabelId`) instead, and every issue under it carries that milestone
63
+ (`linearProjectMilestoneId`) or label (`linearLabelIds`).
64
+ - A feature, quick task or backlog item is one issue (`linearIssueId`,
65
+ `linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
66
+ issue (`linearParentIssueId`).
67
+ - All task files of one feature share one task-list issue: a sub-issue of the feature's
68
+ issue whose checklist merges every task file, recorded in each task file. Its state is
69
+ Completed when every task file is `done`, Unstarted when every one is `pending`, and
70
+ Started otherwise.
@@ -5,7 +5,7 @@ import { access, readFile } from 'node:fs/promises';
5
5
  import { resolve } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { promisify } from 'node:util';
8
- import { CLI_COMMAND, PLANNING_FOLDER } from './names.mjs';
8
+ import { PLANNING_FOLDER } from './names.mjs';
9
9
 
10
10
  const execFileAsync = promisify(execFile);
11
11
  const LINEAR_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
@@ -147,7 +147,7 @@ export async function runPortableSync(
147
147
  } else if (args.provider === 'linear') {
148
148
  throw new IntegrationError(
149
149
  'E_SYNC_USAGE',
150
- `Linear synchronization runs through a Linear connector or the ${CLI_COMMAND} CLI (${CLI_COMMAND} linear push, ${CLI_COMMAND} linear sync).`,
150
+ "Linear synchronization runs through the host's Linear connection.",
151
151
  );
152
152
  } else {
153
153
  throw new IntegrationError(
@@ -6,31 +6,22 @@ alwaysApply: false
6
6
  # OpenPlanr Sync
7
7
 
8
8
  Reconcile local planning artifacts and, when requested, GitHub or Linear state.
9
- Reason about conflicts in this active session; deterministic mapping and GitHub
10
- transport may use a host connector or the packaged [sync helper](planr-sync/scripts/sync.mjs).
11
- Local and GitHub work never require the OpenPlanr CLI.
9
+ Reason about conflicts in this active session. Local and GitHub work never require
10
+ the OpenPlanr CLI.
12
11
 
13
- Resolution order:
12
+ Remote steps run through the host's own connections, as described in
13
+ [tracker connections](planr-sync/references/tracker-connections.md), which also holds the status
14
+ mapping and what to tell the user when a connection is missing:
14
15
 
15
- 1. use a host-native GitHub or Linear connector when available;
16
- 2. otherwise, for GitHub, use the packaged deterministic helper;
17
- 3. otherwise, for Linear, use the `openplanr linear` terminal utility when the user has
18
- installed it; `openplanr github` and `openplanr sync` are optional equivalents for the rest.
19
-
20
- Linear through the CLI:
21
-
22
- - the user runs `openplanr linear init` in a terminal once; it prompts for a personal
23
- access token, which the CLI stores;
24
- - audit with `openplanr linear sync --dry-run`, which reads Linear without writing;
25
- - before a real `openplanr linear sync`, ask how conflicts should resolve and pass
26
- `--on-conflict local` or `--on-conflict linear`; without a prompt it favors Linear;
27
- - `openplanr linear push <artifact-id>` creates or updates Linear issues; preview with
28
- `--dry-run`. Quick tasks and backlog items need `linear.standaloneProjectId` in the
29
- project config when no terminal prompt is available.
16
+ - GitHub: the host's GitHub connection, or, when the GitHub CLI is signed in, the
17
+ packaged [sync helper](planr-sync/scripts/sync.mjs), which creates and edits issues through `gh`;
18
+ close or reopen an issue with `gh issue close` or `gh issue reopen`. `openplanr github`
19
+ is an optional equivalent; `openplanr sync` only repairs local cross-references.
20
+ - Linear: the host's Linear connection.
30
21
 
31
22
  Audit is read-only by default. Apply local changes only when the request asks for
32
23
  reconciliation, and push remote changes only when the request asks for external
33
- synchronization. If credentials are unavailable, complete local reconciliation
24
+ synchronization. If a connection is unavailable, complete local reconciliation
34
25
  and report only the external step that could not run.
35
26
 
36
27
  ## Return
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/design",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Canonical OpenPlanr design helpers and design-loop engine",
@@ -46,8 +46,8 @@
46
46
  "node": ">=20.19.0"
47
47
  },
48
48
  "dependencies": {
49
- "@openplanr/artifact": "0.6.4",
50
- "@openplanr/protocol": "0.10.2"
49
+ "@openplanr/artifact": "0.6.5",
50
+ "@openplanr/protocol": "0.10.3"
51
51
  },
52
52
  "scripts": {
53
53
  "test": "node --test --test-concurrency=2 tests/*.test.mjs",
@@ -1,4 +1,4 @@
1
- /* Trusted local adapter. Owner credentials never enter this runtime. */
1
+ /* Trusted local adapter. Owner keys never enter this runtime. */
2
2
  (() => {
3
3
  'use strict';
4
4
  const options = globalThis.__OPENPLANR_DESIGN_STUDIO_OPTIONS__ || {};
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -2551,7 +2551,7 @@ ${current.document.id}`);
2551
2551
  const within = relative3(project, root);
2552
2552
  if ((!allowMissing || existsSync4(path)) && (within === "" || !within.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && within !== ".." && !isAbsolute3(within)))
2553
2553
  throw new Error(
2554
- "Design owner credentials must be stored outside the project. Set PLANR_HOME to a private user-level directory."
2554
+ "Design owner keys must be stored outside the project. Set PLANR_HOME to a private user-level directory."
2555
2555
  );
2556
2556
  const legacyPath = !options.custodyRoot && !configuredPlanrHome(env) ? join7(realpathSync4(env.HOME || homedir3()), ".openplanr", "design-shares", `${key}.json`) : null;
2557
2557
  return { root, path, current, legacyPath };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.10.2",
3
+ "version": "0.10.3",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -4,14 +4,14 @@
4
4
  "name": "OpenPlanr"
5
5
  },
6
6
  "metadata": {
7
- "version": "2.2641.1",
7
+ "version": "2.2641.2",
8
8
  "description": "Generated local OpenPlanr package."
9
9
  },
10
10
  "plugins": [
11
11
  {
12
12
  "name": "planr",
13
13
  "source": "./openplanr",
14
- "version": "2.2641.1",
14
+ "version": "2.2641.2",
15
15
  "description": "Close the loop from intent to delivery. Plan, design, build, review, and operate from durable context in your repository.",
16
16
  "strict": true
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "planr",
3
- "version": "2.2641.1",
3
+ "version": "2.2641.2",
4
4
  "description": "Close the loop from intent to delivery. Plan, design, build, review, and operate from durable context in your repository.",
5
5
  "author": {
6
6
  "name": "OpenPlanr",