openplanr 2.2639.4 → 2.2640.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cli/commands/github.d.ts.map +1 -1
  3. package/dist/cli/commands/github.js +4 -3
  4. package/dist/cli/commands/github.js.map +1 -1
  5. package/dist/dashboard/.vite/manifest.json +1 -1
  6. package/dist/dashboard/assets/{index-p83hrHZD.js → index-9DLb9EO5.js} +2 -2
  7. package/dist/dashboard/assets/{index-p83hrHZD.js.map → index-9DLb9EO5.js.map} +1 -1
  8. package/dist/dashboard/dashboard-manifest.json +13 -13
  9. package/dist/dashboard/index.html +1 -1
  10. package/dist/models/schema.d.ts.map +1 -1
  11. package/dist/models/schema.js +24 -1
  12. package/dist/models/schema.js.map +1 -1
  13. package/dist/services/artifact-service.js +2 -2
  14. package/dist/services/artifact-service.js.map +1 -1
  15. package/dist/services/github-service.d.ts +6 -4
  16. package/dist/services/github-service.d.ts.map +1 -1
  17. package/dist/services/github-service.js +7 -2
  18. package/dist/services/github-service.js.map +1 -1
  19. package/dist/services/id-service.d.ts +4 -1
  20. package/dist/services/id-service.d.ts.map +1 -1
  21. package/dist/services/id-service.js +28 -15
  22. package/dist/services/id-service.js.map +1 -1
  23. package/dist/services/landing/receipt-custody.d.ts.map +1 -1
  24. package/dist/services/landing/receipt-custody.js +2 -0
  25. package/dist/services/landing/receipt-custody.js.map +1 -1
  26. package/dist/services/report-linter-service.d.ts.map +1 -1
  27. package/dist/services/report-linter-service.js +2 -4
  28. package/dist/services/report-linter-service.js.map +1 -1
  29. package/docs/CLI.md +2 -0
  30. package/lib/host-packages/adapter-registry.json +5 -5
  31. package/lib/host-packages/capability-map.json +1 -1
  32. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  33. package/lib/host-packages/claude/openplanr/.claude-plugin/icon.svg +11 -0
  34. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +8 -3
  35. package/lib/host-packages/claude/openplanr/.openplanr-content.json +160 -28
  36. package/lib/host-packages/claude/openplanr/README.md +4 -3
  37. package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +1 -1
  38. package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +1 -1
  39. package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +1 -1
  40. package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +1 -1
  41. package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +1 -1
  42. package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +1 -1
  43. package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +1 -1
  44. package/lib/host-packages/claude/openplanr/skills/design/openplanr.skill.json +88 -0
  45. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-artifact-shell.mjs +2506 -0
  46. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-document.mjs +3674 -0
  47. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-entities.mjs +489 -0
  48. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-parse5-parser.mjs +3970 -0
  49. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-parse5-tokenizer.mjs +3501 -0
  50. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-review-handoff.mjs +4408 -0
  51. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-sandbox-guards.mjs +1073 -0
  52. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-share.mjs +2127 -0
  53. package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +83 -21459
  54. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  55. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  56. package/lib/host-packages/claude/openplanr/skills/design-loop/openplanr.skill.json +88 -0
  57. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-artifact-shell.mjs +2506 -0
  58. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-document.mjs +3674 -0
  59. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-entities.mjs +489 -0
  60. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-parse5-parser.mjs +3970 -0
  61. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-parse5-tokenizer.mjs +3501 -0
  62. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-review-handoff.mjs +4408 -0
  63. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-sandbox-guards.mjs +1073 -0
  64. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-share.mjs +2127 -0
  65. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +83 -21459
  66. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  67. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  68. package/lib/host-packages/claude/openplanr/skills/design-review/openplanr.skill.json +88 -0
  69. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-artifact-shell.mjs +2506 -0
  70. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-document.mjs +3674 -0
  71. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-entities.mjs +489 -0
  72. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-parse5-parser.mjs +3970 -0
  73. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-parse5-tokenizer.mjs +3501 -0
  74. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-review-handoff.mjs +4408 -0
  75. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-sandbox-guards.mjs +1073 -0
  76. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-share.mjs +2127 -0
  77. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +83 -21459
  78. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  79. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  80. package/lib/host-packages/claude/openplanr/skills/plan/openplanr.skill.json +88 -0
  81. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-artifact-shell.mjs +2506 -0
  82. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-document.mjs +3674 -0
  83. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-entities.mjs +489 -0
  84. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-parse5-parser.mjs +3970 -0
  85. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-parse5-tokenizer.mjs +3501 -0
  86. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-review-handoff.mjs +4408 -0
  87. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-sandbox-guards.mjs +1073 -0
  88. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-share.mjs +2127 -0
  89. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +83 -21459
  90. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  91. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  92. package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +17 -6
  93. package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +7 -104
  94. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +144 -16
  95. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  96. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-artifact-shell.mjs +2506 -0
  97. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-document.mjs +3674 -0
  98. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-entities.mjs +489 -0
  99. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-parse5-parser.mjs +3970 -0
  100. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-parse5-tokenizer.mjs +3501 -0
  101. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-review-handoff.mjs +4408 -0
  102. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-sandbox-guards.mjs +1073 -0
  103. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-share.mjs +2127 -0
  104. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +83 -21459
  105. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  106. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +1 -1
  107. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-artifact-shell.mjs +2506 -0
  108. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-document.mjs +3674 -0
  109. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-entities.mjs +489 -0
  110. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-parse5-parser.mjs +3970 -0
  111. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-parse5-tokenizer.mjs +3501 -0
  112. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-review-handoff.mjs +4408 -0
  113. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-sandbox-guards.mjs +1073 -0
  114. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-share.mjs +2127 -0
  115. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +83 -21459
  116. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  117. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  118. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-artifact-shell.mjs +2506 -0
  119. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-document.mjs +3674 -0
  120. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-entities.mjs +489 -0
  121. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-parse5-parser.mjs +3970 -0
  122. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-parse5-tokenizer.mjs +3501 -0
  123. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-review-handoff.mjs +4408 -0
  124. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-sandbox-guards.mjs +1073 -0
  125. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-share.mjs +2127 -0
  126. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +83 -21459
  127. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  128. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +1 -1
  129. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-artifact-shell.mjs +2506 -0
  130. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-document.mjs +3674 -0
  131. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-entities.mjs +489 -0
  132. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-parse5-parser.mjs +3970 -0
  133. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-parse5-tokenizer.mjs +3501 -0
  134. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-review-handoff.mjs +4408 -0
  135. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-sandbox-guards.mjs +1073 -0
  136. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-share.mjs +2127 -0
  137. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +83 -21459
  138. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  139. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +1 -1
  140. package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +7 -104
  141. package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +17 -6
  142. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  143. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +3 -2
  144. package/lib/host-packages/openai/openplanr/.openplanr-content.json +155 -27
  145. package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +1 -1
  146. package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +1 -1
  147. package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +1 -1
  148. package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +1 -1
  149. package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +1 -1
  150. package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +1 -1
  151. package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +1 -1
  152. package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +88 -0
  153. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-artifact-shell.mjs +2506 -0
  154. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-document.mjs +3674 -0
  155. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-entities.mjs +489 -0
  156. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-parse5-parser.mjs +3970 -0
  157. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-parse5-tokenizer.mjs +3501 -0
  158. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-review-handoff.mjs +4408 -0
  159. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-sandbox-guards.mjs +1073 -0
  160. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-share.mjs +2127 -0
  161. package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +83 -21459
  162. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  163. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  164. package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +88 -0
  165. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-artifact-shell.mjs +2506 -0
  166. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-document.mjs +3674 -0
  167. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-entities.mjs +489 -0
  168. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-parse5-parser.mjs +3970 -0
  169. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-parse5-tokenizer.mjs +3501 -0
  170. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-review-handoff.mjs +4408 -0
  171. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-sandbox-guards.mjs +1073 -0
  172. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-share.mjs +2127 -0
  173. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +83 -21459
  174. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  175. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  176. package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +88 -0
  177. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-artifact-shell.mjs +2506 -0
  178. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-document.mjs +3674 -0
  179. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-entities.mjs +489 -0
  180. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-parse5-parser.mjs +3970 -0
  181. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-parse5-tokenizer.mjs +3501 -0
  182. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-review-handoff.mjs +4408 -0
  183. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-sandbox-guards.mjs +1073 -0
  184. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-share.mjs +2127 -0
  185. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +83 -21459
  186. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  187. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  188. package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +88 -0
  189. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-artifact-shell.mjs +2506 -0
  190. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-document.mjs +3674 -0
  191. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-entities.mjs +489 -0
  192. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-parse5-parser.mjs +3970 -0
  193. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-parse5-tokenizer.mjs +3501 -0
  194. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-review-handoff.mjs +4408 -0
  195. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-sandbox-guards.mjs +1073 -0
  196. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-share.mjs +2127 -0
  197. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +83 -21459
  198. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1 -0
  199. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  200. package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +17 -6
  201. package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +7 -104
  202. package/lib/integrations.d.mts +0 -10
  203. package/lib/integrations.mjs +7 -104
  204. package/package.json +2 -2
@@ -1885,6 +1885,7 @@ ${fence}`;
1885
1885
  if (saving || !available()) return;
1886
1886
  saving = true;
1887
1887
  try {
1888
+ await studio.flush();
1888
1889
  for (const [pinId, category] of Object.entries(outbox)) {
1889
1890
  const body = {
1890
1891
  action: "category",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
@@ -7,16 +7,27 @@ license: MIT
7
7
  # Planr Sync
8
8
 
9
9
  Reconcile local planning artifacts and, when requested, GitHub or Linear state.
10
- Reason about conflicts in this active session; deterministic mapping and transport
11
- may use a host connector or the packaged [sync helper](scripts/sync.mjs). The optional
12
- OpenPlanr CLI is never required by the skill.
10
+ Reason about conflicts in this active session; deterministic mapping and GitHub
11
+ transport may use a host connector or the packaged [sync helper](scripts/sync.mjs).
12
+ Local and GitHub work never require the OpenPlanr CLI.
13
13
 
14
14
  Resolution order:
15
15
 
16
16
  1. use a host-native GitHub or Linear connector when available;
17
- 2. otherwise use the packaged deterministic helper;
18
- 3. optionally use the equivalent `planr github`, `planr linear`, or `planr sync`
19
- terminal utility when the user has installed it.
17
+ 2. otherwise, for GitHub, use the packaged deterministic helper;
18
+ 3. otherwise, for Linear, use the `planr linear` terminal utility when the user has
19
+ installed it; `planr github` and `planr sync` are optional equivalents for the rest.
20
+
21
+ Linear through the CLI:
22
+
23
+ - the user runs `planr linear init` in a terminal once; it prompts for a personal
24
+ access token, which the CLI stores;
25
+ - audit with `planr linear sync --dry-run`, which reads Linear without writing;
26
+ - before a real `planr linear sync`, ask how conflicts should resolve and pass
27
+ `--on-conflict local` or `--on-conflict linear`; without a prompt it favors Linear;
28
+ - `planr linear push <artifact-id>` creates or updates Linear issues; preview with
29
+ `--dry-run`. Quick tasks and backlog items need `linear.standaloneProjectId` in the
30
+ project config when no terminal prompt is available.
20
31
 
21
32
  Audit is read-only by default. Apply local changes only when the request asks for
22
33
  reconciliation, and push remote changes only when the request asks for external
@@ -7,7 +7,6 @@ import { fileURLToPath } from 'node:url';
7
7
  import { promisify } from 'node:util';
8
8
 
9
9
  const execFileAsync = promisify(execFile);
10
- const LINEAR_ENDPOINT = 'https://api.linear.app/graphql';
11
10
  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;
12
11
  const LINEAR_IDENTIFIER = /^[A-Z][A-Z0-9]+-\d+$/u;
13
12
 
@@ -102,100 +101,6 @@ export async function executeGitHubOperations(
102
101
  return { provider: 'github', applied: true, results };
103
102
  }
104
103
 
105
- async function linearRequest(query, variables, token, fetchImpl = fetch) {
106
- if (!token)
107
- throw new IntegrationError('E_LINEAR_CREDENTIAL', 'Linear credentials are unavailable.');
108
- let response;
109
- let payload;
110
- try {
111
- response = await fetchImpl(LINEAR_ENDPOINT, {
112
- method: 'POST',
113
- headers: { authorization: token, 'content-type': 'application/json' },
114
- body: JSON.stringify({ query, variables }),
115
- });
116
- payload = await response.json();
117
- } catch (error) {
118
- throw new IntegrationError('E_LINEAR_API', 'Linear synchronization transport failed.', {
119
- cause: String(error?.message ?? error),
120
- });
121
- }
122
- if (!response.ok || !payload || typeof payload !== 'object' || payload.errors?.length) {
123
- throw new IntegrationError('E_LINEAR_API', 'Linear rejected the synchronization request.', {
124
- status: response.status,
125
- errors: payload?.errors,
126
- });
127
- }
128
- return payload.data;
129
- }
130
-
131
- function requireLinearMutationResult(data, field) {
132
- const result = data?.[field];
133
- const issue = result?.issue;
134
- if (
135
- result?.success !== true ||
136
- !issue ||
137
- typeof issue.id !== 'string' ||
138
- typeof issue.identifier !== 'string' ||
139
- typeof issue.url !== 'string'
140
- ) {
141
- throw new IntegrationError(
142
- 'E_LINEAR_API',
143
- `Linear ${field} did not confirm a successful issue mutation.`,
144
- {
145
- field,
146
- success: result?.success ?? null,
147
- },
148
- );
149
- }
150
- return issue;
151
- }
152
-
153
- export async function inspectLinear({ token = process.env.PLANR_LINEAR_TOKEN } = {}) {
154
- const data = await linearRequest('query OpenPlanrViewer { viewer { id name email } }', {}, token);
155
- return { provider: 'linear', viewer: data.viewer };
156
- }
157
-
158
- export async function executeLinearOperations(
159
- operations,
160
- { token = process.env.PLANR_LINEAR_TOKEN, apply = false } = {},
161
- ) {
162
- if (!Array.isArray(operations))
163
- throw new IntegrationError('E_SYNC_INPUT', 'Linear operations must be an array.');
164
- if (!apply) return { provider: 'linear', applied: false, operations };
165
- const results = [];
166
- for (const operation of operations) {
167
- if (operation.action === 'create' && operation.teamId) {
168
- const data = await linearRequest(
169
- 'mutation OpenPlanrCreate($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier url } } }',
170
- {
171
- input: { teamId: operation.teamId, title: operation.title, description: operation.body },
172
- },
173
- token,
174
- );
175
- results.push({ action: 'create', ...requireLinearMutationResult(data, 'issueCreate') });
176
- continue;
177
- }
178
- if (operation.action === 'update' && isLikelyLinearIssueId(operation.id)) {
179
- const data = await linearRequest(
180
- 'mutation OpenPlanrUpdate($id: String!, $input: IssueUpdateInput!) { issueUpdate(id: $id, input: $input) { success issue { id identifier url } } }',
181
- {
182
- id: operation.id,
183
- input: { title: operation.title, description: operation.body, stateId: operation.state },
184
- },
185
- token,
186
- );
187
- results.push({ action: 'update', ...requireLinearMutationResult(data, 'issueUpdate') });
188
- continue;
189
- }
190
- throw new IntegrationError(
191
- 'E_SYNC_OPERATION',
192
- 'Unsupported Linear synchronization operation.',
193
- { operation },
194
- );
195
- }
196
- return { provider: 'linear', applied: true, results };
197
- }
198
-
199
104
  async function readJsonInput(value, stdin) {
200
105
  if (value) return JSON.parse(await readFile(resolve(value), 'utf8'));
201
106
  let bytes = '';
@@ -226,7 +131,7 @@ function parseArgs(argv) {
226
131
 
227
132
  export async function runPortableSync(
228
133
  argv = process.argv.slice(2),
229
- { cwd = process.cwd(), env = process.env, stdin = process.stdin, stdout = process.stdout } = {},
134
+ { cwd = process.cwd(), stdin = process.stdin, stdout = process.stdout } = {},
230
135
  ) {
231
136
  const args = parseArgs(argv);
232
137
  let result;
@@ -238,17 +143,15 @@ export async function runPortableSync(
238
143
  cwd,
239
144
  apply: args.apply,
240
145
  });
241
- } else if (args.provider === 'linear' && args.action === 'inspect') {
242
- result = await inspectLinear({ token: env.PLANR_LINEAR_TOKEN });
243
- } else if (args.provider === 'linear' && args.action === 'sync') {
244
- result = await executeLinearOperations(await readJsonInput(args.input, stdin), {
245
- token: env.PLANR_LINEAR_TOKEN,
246
- apply: args.apply,
247
- });
146
+ } else if (args.provider === 'linear') {
147
+ throw new IntegrationError(
148
+ 'E_SYNC_USAGE',
149
+ 'Linear synchronization runs through a Linear connector or the planr CLI (planr linear push, planr linear sync).',
150
+ );
248
151
  } else {
249
152
  throw new IntegrationError(
250
153
  'E_SYNC_USAGE',
251
- 'Usage: sync.mjs <local|github|linear> <inspect|sync> [--input path] [--apply]',
154
+ 'Usage: sync.mjs <local|github> <inspect|sync> [--input path] [--apply]',
252
155
  );
253
156
  }
254
157
  stdout.write(`${JSON.stringify(result, null, 2)}\n`);
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "manifest.json",
11
- "digest": "sha256:b7e3882512c92061168832f7ab3abfc7fece7b9dd3bc1b8deeba395452e37c51"
11
+ "digest": "sha256:093b371ba4c633cc73d7e465246928be9f445bf0399682712181f6d1f9593684"
12
12
  },
13
13
  {
14
14
  "path": "rules/planr-artifact.mdc",
@@ -242,9 +242,41 @@
242
242
  "path": "rules/planr-design-loop/schemas/design-review-handoff.schema.json",
243
243
  "digest": "sha256:402b25238f93f8269b98697bf77fa11dda1fd284f44e41d73cdb813f5244a4e0"
244
244
  },
245
+ {
246
+ "path": "rules/planr-design-loop/scripts/design-artifact-shell.mjs",
247
+ "digest": "sha256:9245a86f8e3f20f6ec4c705d1364d2d6d3e639b34a7d41162769a0f490dd39df"
248
+ },
249
+ {
250
+ "path": "rules/planr-design-loop/scripts/design-document.mjs",
251
+ "digest": "sha256:7e15b9f9e9afd29be2a2558fad9e57b5df85e494a586180d5afe23015cdbcfb7"
252
+ },
253
+ {
254
+ "path": "rules/planr-design-loop/scripts/design-entities.mjs",
255
+ "digest": "sha256:376ec35d0f184deac31b639f2c0918e6b0f165e19984ed1c89ba2cfad6af9b80"
256
+ },
257
+ {
258
+ "path": "rules/planr-design-loop/scripts/design-parse5-parser.mjs",
259
+ "digest": "sha256:a9bfeecae4d31155a6935455c82ea8348da25f8585216b531d00c6599b8196e4"
260
+ },
261
+ {
262
+ "path": "rules/planr-design-loop/scripts/design-parse5-tokenizer.mjs",
263
+ "digest": "sha256:f655474fb8d0bed732f01ace5b67102f849b73cb40831a57f1fb7b61180fbde9"
264
+ },
265
+ {
266
+ "path": "rules/planr-design-loop/scripts/design-review-handoff.mjs",
267
+ "digest": "sha256:1d04e0d821738f3934fb3fbd314b161fb557f4459cf2da2d1921c99d27d7d861"
268
+ },
269
+ {
270
+ "path": "rules/planr-design-loop/scripts/design-sandbox-guards.mjs",
271
+ "digest": "sha256:dcc7aa1971da47018a198bfe7520c05e3e5ba21fe2d9c8fffcaad882ded5bbbb"
272
+ },
273
+ {
274
+ "path": "rules/planr-design-loop/scripts/design-share.mjs",
275
+ "digest": "sha256:b10d7ce9cdb3eb48b9aca803e4d2ecc4f8e477e91f4a0c6a3ae17a1f7985aa06"
276
+ },
245
277
  {
246
278
  "path": "rules/planr-design-loop/scripts/design.mjs",
247
- "digest": "sha256:1fd130d914dd6b84992007fcf300b6083e04ee3983beaf1718cd1866a26b4d7a"
279
+ "digest": "sha256:ab33412cab749120e07359983f85bcb64038026844c06ff9f464c4f371d6d6ca"
248
280
  },
249
281
  {
250
282
  "path": "rules/planr-design-loop/scripts/runtime/notices/entities.txt",
@@ -280,11 +312,11 @@
280
312
  },
281
313
  {
282
314
  "path": "rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.js",
283
- "digest": "sha256:8e0ae7d5ddbb058f4b3f7a0876ce8259dd247358c40ce666763e9001b3bc5338"
315
+ "digest": "sha256:85f8b084457aaa172025fb878b64059782cb976f72451b207c7bc40e8c982bb8"
284
316
  },
285
317
  {
286
318
  "path": "rules/planr-design-loop/scripts/runtime/packages/protocol/package.json",
287
- "digest": "sha256:344e2118724b905e310c4919e9515ff326641f84819202921af871388bd7ea53"
319
+ "digest": "sha256:931a50e413656f4dcd95db2451b5fc63c985b13494b4b01b492d8292529f4fcb"
288
320
  },
289
321
  {
290
322
  "path": "rules/planr-design-loop/scripts/runtime/packages/protocol/registries/artifact-theme.json",
@@ -418,9 +450,41 @@
418
450
  "path": "rules/planr-design-review/schemas/design-review-handoff.schema.json",
419
451
  "digest": "sha256:402b25238f93f8269b98697bf77fa11dda1fd284f44e41d73cdb813f5244a4e0"
420
452
  },
453
+ {
454
+ "path": "rules/planr-design-review/scripts/design-artifact-shell.mjs",
455
+ "digest": "sha256:9245a86f8e3f20f6ec4c705d1364d2d6d3e639b34a7d41162769a0f490dd39df"
456
+ },
457
+ {
458
+ "path": "rules/planr-design-review/scripts/design-document.mjs",
459
+ "digest": "sha256:7e15b9f9e9afd29be2a2558fad9e57b5df85e494a586180d5afe23015cdbcfb7"
460
+ },
461
+ {
462
+ "path": "rules/planr-design-review/scripts/design-entities.mjs",
463
+ "digest": "sha256:376ec35d0f184deac31b639f2c0918e6b0f165e19984ed1c89ba2cfad6af9b80"
464
+ },
465
+ {
466
+ "path": "rules/planr-design-review/scripts/design-parse5-parser.mjs",
467
+ "digest": "sha256:a9bfeecae4d31155a6935455c82ea8348da25f8585216b531d00c6599b8196e4"
468
+ },
469
+ {
470
+ "path": "rules/planr-design-review/scripts/design-parse5-tokenizer.mjs",
471
+ "digest": "sha256:f655474fb8d0bed732f01ace5b67102f849b73cb40831a57f1fb7b61180fbde9"
472
+ },
473
+ {
474
+ "path": "rules/planr-design-review/scripts/design-review-handoff.mjs",
475
+ "digest": "sha256:1d04e0d821738f3934fb3fbd314b161fb557f4459cf2da2d1921c99d27d7d861"
476
+ },
477
+ {
478
+ "path": "rules/planr-design-review/scripts/design-sandbox-guards.mjs",
479
+ "digest": "sha256:dcc7aa1971da47018a198bfe7520c05e3e5ba21fe2d9c8fffcaad882ded5bbbb"
480
+ },
481
+ {
482
+ "path": "rules/planr-design-review/scripts/design-share.mjs",
483
+ "digest": "sha256:b10d7ce9cdb3eb48b9aca803e4d2ecc4f8e477e91f4a0c6a3ae17a1f7985aa06"
484
+ },
421
485
  {
422
486
  "path": "rules/planr-design-review/scripts/design.mjs",
423
- "digest": "sha256:1fd130d914dd6b84992007fcf300b6083e04ee3983beaf1718cd1866a26b4d7a"
487
+ "digest": "sha256:ab33412cab749120e07359983f85bcb64038026844c06ff9f464c4f371d6d6ca"
424
488
  },
425
489
  {
426
490
  "path": "rules/planr-design-review/scripts/runtime/notices/entities.txt",
@@ -456,11 +520,11 @@
456
520
  },
457
521
  {
458
522
  "path": "rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.js",
459
- "digest": "sha256:8e0ae7d5ddbb058f4b3f7a0876ce8259dd247358c40ce666763e9001b3bc5338"
523
+ "digest": "sha256:85f8b084457aaa172025fb878b64059782cb976f72451b207c7bc40e8c982bb8"
460
524
  },
461
525
  {
462
526
  "path": "rules/planr-design-review/scripts/runtime/packages/protocol/package.json",
463
- "digest": "sha256:344e2118724b905e310c4919e9515ff326641f84819202921af871388bd7ea53"
527
+ "digest": "sha256:931a50e413656f4dcd95db2451b5fc63c985b13494b4b01b492d8292529f4fcb"
464
528
  },
465
529
  {
466
530
  "path": "rules/planr-design-review/scripts/runtime/packages/protocol/registries/artifact-theme.json",
@@ -594,9 +658,41 @@
594
658
  "path": "rules/planr-design/schemas/design-review-handoff.schema.json",
595
659
  "digest": "sha256:402b25238f93f8269b98697bf77fa11dda1fd284f44e41d73cdb813f5244a4e0"
596
660
  },
661
+ {
662
+ "path": "rules/planr-design/scripts/design-artifact-shell.mjs",
663
+ "digest": "sha256:9245a86f8e3f20f6ec4c705d1364d2d6d3e639b34a7d41162769a0f490dd39df"
664
+ },
665
+ {
666
+ "path": "rules/planr-design/scripts/design-document.mjs",
667
+ "digest": "sha256:7e15b9f9e9afd29be2a2558fad9e57b5df85e494a586180d5afe23015cdbcfb7"
668
+ },
669
+ {
670
+ "path": "rules/planr-design/scripts/design-entities.mjs",
671
+ "digest": "sha256:376ec35d0f184deac31b639f2c0918e6b0f165e19984ed1c89ba2cfad6af9b80"
672
+ },
673
+ {
674
+ "path": "rules/planr-design/scripts/design-parse5-parser.mjs",
675
+ "digest": "sha256:a9bfeecae4d31155a6935455c82ea8348da25f8585216b531d00c6599b8196e4"
676
+ },
677
+ {
678
+ "path": "rules/planr-design/scripts/design-parse5-tokenizer.mjs",
679
+ "digest": "sha256:f655474fb8d0bed732f01ace5b67102f849b73cb40831a57f1fb7b61180fbde9"
680
+ },
681
+ {
682
+ "path": "rules/planr-design/scripts/design-review-handoff.mjs",
683
+ "digest": "sha256:1d04e0d821738f3934fb3fbd314b161fb557f4459cf2da2d1921c99d27d7d861"
684
+ },
685
+ {
686
+ "path": "rules/planr-design/scripts/design-sandbox-guards.mjs",
687
+ "digest": "sha256:dcc7aa1971da47018a198bfe7520c05e3e5ba21fe2d9c8fffcaad882ded5bbbb"
688
+ },
689
+ {
690
+ "path": "rules/planr-design/scripts/design-share.mjs",
691
+ "digest": "sha256:b10d7ce9cdb3eb48b9aca803e4d2ecc4f8e477e91f4a0c6a3ae17a1f7985aa06"
692
+ },
597
693
  {
598
694
  "path": "rules/planr-design/scripts/design.mjs",
599
- "digest": "sha256:1fd130d914dd6b84992007fcf300b6083e04ee3983beaf1718cd1866a26b4d7a"
695
+ "digest": "sha256:ab33412cab749120e07359983f85bcb64038026844c06ff9f464c4f371d6d6ca"
600
696
  },
601
697
  {
602
698
  "path": "rules/planr-design/scripts/runtime/notices/entities.txt",
@@ -632,11 +728,11 @@
632
728
  },
633
729
  {
634
730
  "path": "rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.js",
635
- "digest": "sha256:8e0ae7d5ddbb058f4b3f7a0876ce8259dd247358c40ce666763e9001b3bc5338"
731
+ "digest": "sha256:85f8b084457aaa172025fb878b64059782cb976f72451b207c7bc40e8c982bb8"
636
732
  },
637
733
  {
638
734
  "path": "rules/planr-design/scripts/runtime/packages/protocol/package.json",
639
- "digest": "sha256:344e2118724b905e310c4919e9515ff326641f84819202921af871388bd7ea53"
735
+ "digest": "sha256:931a50e413656f4dcd95db2451b5fc63c985b13494b4b01b492d8292529f4fcb"
640
736
  },
641
737
  {
642
738
  "path": "rules/planr-design/scripts/runtime/packages/protocol/registries/artifact-theme.json",
@@ -802,9 +898,41 @@
802
898
  "path": "rules/planr-plan/schemas/design-review-handoff.schema.json",
803
899
  "digest": "sha256:402b25238f93f8269b98697bf77fa11dda1fd284f44e41d73cdb813f5244a4e0"
804
900
  },
901
+ {
902
+ "path": "rules/planr-plan/scripts/design-artifact-shell.mjs",
903
+ "digest": "sha256:9245a86f8e3f20f6ec4c705d1364d2d6d3e639b34a7d41162769a0f490dd39df"
904
+ },
905
+ {
906
+ "path": "rules/planr-plan/scripts/design-document.mjs",
907
+ "digest": "sha256:7e15b9f9e9afd29be2a2558fad9e57b5df85e494a586180d5afe23015cdbcfb7"
908
+ },
909
+ {
910
+ "path": "rules/planr-plan/scripts/design-entities.mjs",
911
+ "digest": "sha256:376ec35d0f184deac31b639f2c0918e6b0f165e19984ed1c89ba2cfad6af9b80"
912
+ },
913
+ {
914
+ "path": "rules/planr-plan/scripts/design-parse5-parser.mjs",
915
+ "digest": "sha256:a9bfeecae4d31155a6935455c82ea8348da25f8585216b531d00c6599b8196e4"
916
+ },
917
+ {
918
+ "path": "rules/planr-plan/scripts/design-parse5-tokenizer.mjs",
919
+ "digest": "sha256:f655474fb8d0bed732f01ace5b67102f849b73cb40831a57f1fb7b61180fbde9"
920
+ },
921
+ {
922
+ "path": "rules/planr-plan/scripts/design-review-handoff.mjs",
923
+ "digest": "sha256:1d04e0d821738f3934fb3fbd314b161fb557f4459cf2da2d1921c99d27d7d861"
924
+ },
925
+ {
926
+ "path": "rules/planr-plan/scripts/design-sandbox-guards.mjs",
927
+ "digest": "sha256:dcc7aa1971da47018a198bfe7520c05e3e5ba21fe2d9c8fffcaad882ded5bbbb"
928
+ },
929
+ {
930
+ "path": "rules/planr-plan/scripts/design-share.mjs",
931
+ "digest": "sha256:b10d7ce9cdb3eb48b9aca803e4d2ecc4f8e477e91f4a0c6a3ae17a1f7985aa06"
932
+ },
805
933
  {
806
934
  "path": "rules/planr-plan/scripts/design.mjs",
807
- "digest": "sha256:1fd130d914dd6b84992007fcf300b6083e04ee3983beaf1718cd1866a26b4d7a"
935
+ "digest": "sha256:ab33412cab749120e07359983f85bcb64038026844c06ff9f464c4f371d6d6ca"
808
936
  },
809
937
  {
810
938
  "path": "rules/planr-plan/scripts/planning-ids.mjs",
@@ -844,11 +972,11 @@
844
972
  },
845
973
  {
846
974
  "path": "rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.js",
847
- "digest": "sha256:8e0ae7d5ddbb058f4b3f7a0876ce8259dd247358c40ce666763e9001b3bc5338"
975
+ "digest": "sha256:85f8b084457aaa172025fb878b64059782cb976f72451b207c7bc40e8c982bb8"
848
976
  },
849
977
  {
850
978
  "path": "rules/planr-plan/scripts/runtime/packages/protocol/package.json",
851
- "digest": "sha256:344e2118724b905e310c4919e9515ff326641f84819202921af871388bd7ea53"
979
+ "digest": "sha256:931a50e413656f4dcd95db2451b5fc63c985b13494b4b01b492d8292529f4fcb"
852
980
  },
853
981
  {
854
982
  "path": "rules/planr-plan/scripts/runtime/packages/protocol/registries/artifact-theme.json",
@@ -1004,12 +1132,12 @@
1004
1132
  },
1005
1133
  {
1006
1134
  "path": "rules/planr-sync.mdc",
1007
- "digest": "sha256:e48f085feb6eddade1ce4ec3c61d46da536780ebfcb2159f9719b6ced6284fcf"
1135
+ "digest": "sha256:81a59f2c726e53d987105982f8aa334a7e34006ad0c6dd6520537e032e9b7e40"
1008
1136
  },
1009
1137
  {
1010
1138
  "path": "rules/planr-sync/scripts/sync.mjs",
1011
- "digest": "sha256:42fb430add6e96c73a8d1c5ea5df7a6ce0bdffc20b9c375eff9333c6c741b308"
1139
+ "digest": "sha256:005397d703d8df70f346a789d15c665a44329449418b39e807bb0dff927153da"
1012
1140
  }
1013
1141
  ],
1014
- "contentDigest": "sha256:18ebc9b760500ddf4527f4520a39d867c47f74aa3ba597b49642b37dbd2c880f"
1142
+ "contentDigest": "sha256:7c55cf0211b90504db48631acb137211e170a2d5fad2ec03720cd4fd2898faae"
1015
1143
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "2.2639.4",
3
+ "version": "2.2640.0",
4
4
  "ruleCount": 27,
5
5
  "rules": [
6
6
  "rules/planr-artifact.mdc",