openplanr 1.25.3 → 2.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 (1738) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/CONTRIBUTING.md +33 -0
  3. package/README.md +154 -131
  4. package/dist/cli/commands/artifact.d.ts.map +1 -1
  5. package/dist/cli/commands/artifact.js +214 -30
  6. package/dist/cli/commands/artifact.js.map +1 -1
  7. package/dist/cli/commands/backlog.d.ts +1 -21
  8. package/dist/cli/commands/backlog.d.ts.map +1 -1
  9. package/dist/cli/commands/backlog.js +1 -428
  10. package/dist/cli/commands/backlog.js.map +1 -1
  11. package/dist/cli/commands/company.d.ts +3 -0
  12. package/dist/cli/commands/company.d.ts.map +1 -0
  13. package/dist/cli/commands/company.js +173 -0
  14. package/dist/cli/commands/company.js.map +1 -0
  15. package/dist/cli/commands/config-deterministic.d.ts +3 -0
  16. package/dist/cli/commands/config-deterministic.d.ts.map +1 -0
  17. package/dist/cli/commands/config-deterministic.js +88 -0
  18. package/dist/cli/commands/config-deterministic.js.map +1 -0
  19. package/dist/cli/commands/dashboard.d.ts +3 -0
  20. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  21. package/dist/cli/commands/dashboard.js +36 -0
  22. package/dist/cli/commands/dashboard.js.map +1 -0
  23. package/dist/cli/commands/diagram/index.d.ts +3 -0
  24. package/dist/cli/commands/diagram/index.d.ts.map +1 -0
  25. package/dist/cli/commands/diagram/index.js +73 -0
  26. package/dist/cli/commands/diagram/index.js.map +1 -0
  27. package/dist/cli/commands/diagram/presentation.d.ts +4 -0
  28. package/dist/cli/commands/diagram/presentation.d.ts.map +1 -0
  29. package/dist/cli/commands/diagram/presentation.js +38 -0
  30. package/dist/cli/commands/diagram/presentation.js.map +1 -0
  31. package/dist/cli/commands/doctor.d.ts.map +1 -1
  32. package/dist/cli/commands/doctor.js +1 -11
  33. package/dist/cli/commands/doctor.js.map +1 -1
  34. package/dist/cli/commands/epic.d.ts +1 -9
  35. package/dist/cli/commands/epic.d.ts.map +1 -1
  36. package/dist/cli/commands/epic.js +1 -259
  37. package/dist/cli/commands/epic.js.map +1 -1
  38. package/dist/cli/commands/feature.d.ts +1 -8
  39. package/dist/cli/commands/feature.d.ts.map +1 -1
  40. package/dist/cli/commands/feature.js +1 -220
  41. package/dist/cli/commands/feature.js.map +1 -1
  42. package/dist/cli/commands/groups/delivery.d.ts +3 -0
  43. package/dist/cli/commands/groups/delivery.d.ts.map +1 -0
  44. package/dist/cli/commands/groups/delivery.js +13 -0
  45. package/dist/cli/commands/groups/delivery.js.map +1 -0
  46. package/dist/cli/commands/groups/foundation.d.ts +3 -0
  47. package/dist/cli/commands/groups/foundation.d.ts.map +1 -0
  48. package/dist/cli/commands/groups/foundation.js +11 -0
  49. package/dist/cli/commands/groups/foundation.js.map +1 -0
  50. package/dist/cli/commands/groups/intelligence.d.ts +3 -0
  51. package/dist/cli/commands/groups/intelligence.d.ts.map +1 -0
  52. package/dist/cli/commands/groups/intelligence.js +19 -0
  53. package/dist/cli/commands/groups/intelligence.js.map +1 -0
  54. package/dist/cli/commands/groups/operations.d.ts +3 -0
  55. package/dist/cli/commands/groups/operations.d.ts.map +1 -0
  56. package/dist/cli/commands/groups/operations.js +17 -0
  57. package/dist/cli/commands/groups/operations.js.map +1 -0
  58. package/dist/cli/commands/groups/planning.d.ts +3 -0
  59. package/dist/cli/commands/groups/planning.d.ts.map +1 -0
  60. package/dist/cli/commands/groups/planning.js +25 -0
  61. package/dist/cli/commands/groups/planning.js.map +1 -0
  62. package/dist/cli/commands/index.d.ts +4 -0
  63. package/dist/cli/commands/index.d.ts.map +1 -0
  64. package/dist/cli/commands/index.js +14 -0
  65. package/dist/cli/commands/index.js.map +1 -0
  66. package/dist/cli/commands/init-deterministic.d.ts +3 -0
  67. package/dist/cli/commands/init-deterministic.d.ts.map +1 -0
  68. package/dist/cli/commands/init-deterministic.js +40 -0
  69. package/dist/cli/commands/init-deterministic.js.map +1 -0
  70. package/dist/cli/commands/land.d.ts +15 -0
  71. package/dist/cli/commands/land.d.ts.map +1 -0
  72. package/dist/cli/commands/land.js +176 -0
  73. package/dist/cli/commands/land.js.map +1 -0
  74. package/dist/cli/commands/operate/input.d.ts +54 -0
  75. package/dist/cli/commands/operate/input.d.ts.map +1 -0
  76. package/dist/cli/commands/operate/input.js +98 -0
  77. package/dist/cli/commands/operate/input.js.map +1 -0
  78. package/dist/cli/commands/operate/registrars/assignments.d.ts +5 -0
  79. package/dist/cli/commands/operate/registrars/assignments.d.ts.map +1 -0
  80. package/dist/cli/commands/operate/registrars/assignments.js +167 -0
  81. package/dist/cli/commands/operate/registrars/assignments.js.map +1 -0
  82. package/dist/cli/commands/operate/registrars/catalog.d.ts +4 -0
  83. package/dist/cli/commands/operate/registrars/catalog.d.ts.map +1 -0
  84. package/dist/cli/commands/operate/registrars/catalog.js +12 -0
  85. package/dist/cli/commands/operate/registrars/catalog.js.map +1 -0
  86. package/dist/cli/commands/operate/registrars/contracts.d.ts +41 -0
  87. package/dist/cli/commands/operate/registrars/contracts.d.ts.map +1 -0
  88. package/dist/cli/commands/operate/registrars/contracts.js +2 -0
  89. package/dist/cli/commands/operate/registrars/contracts.js.map +1 -0
  90. package/dist/cli/commands/operate/registrars/dashboard.d.ts +4 -0
  91. package/dist/cli/commands/operate/registrars/dashboard.d.ts.map +1 -0
  92. package/dist/cli/commands/operate/registrars/dashboard.js +26 -0
  93. package/dist/cli/commands/operate/registrars/dashboard.js.map +1 -0
  94. package/dist/cli/commands/operate/registrars/dispatch.d.ts +7 -0
  95. package/dist/cli/commands/operate/registrars/dispatch.d.ts.map +1 -0
  96. package/dist/cli/commands/operate/registrars/dispatch.js +55 -0
  97. package/dist/cli/commands/operate/registrars/dispatch.js.map +1 -0
  98. package/dist/cli/commands/operate/registrars/experience.d.ts +4 -0
  99. package/dist/cli/commands/operate/registrars/experience.d.ts.map +1 -0
  100. package/dist/cli/commands/operate/registrars/experience.js +93 -0
  101. package/dist/cli/commands/operate/registrars/experience.js.map +1 -0
  102. package/dist/cli/commands/operate/registrars/index.d.ts +5 -0
  103. package/dist/cli/commands/operate/registrars/index.d.ts.map +1 -0
  104. package/dist/cli/commands/operate/registrars/index.js +28 -0
  105. package/dist/cli/commands/operate/registrars/index.js.map +1 -0
  106. package/dist/cli/commands/operate/registrars/lifecycle.d.ts +4 -0
  107. package/dist/cli/commands/operate/registrars/lifecycle.d.ts.map +1 -0
  108. package/dist/cli/commands/operate/registrars/lifecycle.js +46 -0
  109. package/dist/cli/commands/operate/registrars/lifecycle.js.map +1 -0
  110. package/dist/cli/commands/operate/registrars/measurement.d.ts +4 -0
  111. package/dist/cli/commands/operate/registrars/measurement.d.ts.map +1 -0
  112. package/dist/cli/commands/operate/registrars/measurement.js +122 -0
  113. package/dist/cli/commands/operate/registrars/measurement.js.map +1 -0
  114. package/dist/cli/commands/operate/registrars/note-validation.d.ts +6 -0
  115. package/dist/cli/commands/operate/registrars/note-validation.d.ts.map +1 -0
  116. package/dist/cli/commands/operate/registrars/note-validation.js +103 -0
  117. package/dist/cli/commands/operate/registrars/note-validation.js.map +1 -0
  118. package/dist/cli/commands/operate/registrars/planning.d.ts +4 -0
  119. package/dist/cli/commands/operate/registrars/planning.d.ts.map +1 -0
  120. package/dist/cli/commands/operate/registrars/planning.js +41 -0
  121. package/dist/cli/commands/operate/registrars/planning.js.map +1 -0
  122. package/dist/cli/commands/operate/registrars/recovery.d.ts +4 -0
  123. package/dist/cli/commands/operate/registrars/recovery.d.ts.map +1 -0
  124. package/dist/cli/commands/operate/registrars/recovery.js +65 -0
  125. package/dist/cli/commands/operate/registrars/recovery.js.map +1 -0
  126. package/dist/cli/commands/operate/registrars/reviews.d.ts +4 -0
  127. package/dist/cli/commands/operate/registrars/reviews.d.ts.map +1 -0
  128. package/dist/cli/commands/operate/registrars/reviews.js +83 -0
  129. package/dist/cli/commands/operate/registrars/reviews.js.map +1 -0
  130. package/dist/cli/commands/operate/registration.d.ts +4 -0
  131. package/dist/cli/commands/operate/registration.d.ts.map +1 -0
  132. package/dist/cli/commands/operate/registration.js +3 -0
  133. package/dist/cli/commands/operate/registration.js.map +1 -0
  134. package/dist/cli/commands/operate/render.d.ts +19 -0
  135. package/dist/cli/commands/operate/render.d.ts.map +1 -0
  136. package/dist/cli/commands/operate/render.js +201 -0
  137. package/dist/cli/commands/operate/render.js.map +1 -0
  138. package/dist/cli/commands/operate.d.ts +58 -13
  139. package/dist/cli/commands/operate.d.ts.map +1 -1
  140. package/dist/cli/commands/operate.js +169 -984
  141. package/dist/cli/commands/operate.js.map +1 -1
  142. package/dist/cli/commands/planning-artifacts.d.ts +10 -0
  143. package/dist/cli/commands/planning-artifacts.d.ts.map +1 -0
  144. package/dist/cli/commands/planning-artifacts.js +350 -0
  145. package/dist/cli/commands/planning-artifacts.js.map +1 -0
  146. package/dist/cli/commands/quick/interaction.d.ts +8 -0
  147. package/dist/cli/commands/quick/interaction.d.ts.map +1 -0
  148. package/dist/cli/commands/quick/interaction.js +8 -0
  149. package/dist/cli/commands/quick/interaction.js.map +1 -0
  150. package/dist/cli/commands/quick/project.d.ts +8 -0
  151. package/dist/cli/commands/quick/project.d.ts.map +1 -0
  152. package/dist/cli/commands/quick/project.js +8 -0
  153. package/dist/cli/commands/quick/project.js.map +1 -0
  154. package/dist/cli/commands/quick.d.ts +1 -29
  155. package/dist/cli/commands/quick.d.ts.map +1 -1
  156. package/dist/cli/commands/quick.js +1 -337
  157. package/dist/cli/commands/quick.js.map +1 -1
  158. package/dist/cli/commands/rules.js +1 -1
  159. package/dist/cli/commands/rules.js.map +1 -1
  160. package/dist/cli/commands/setup.d.ts.map +1 -1
  161. package/dist/cli/commands/setup.js +40 -18
  162. package/dist/cli/commands/setup.js.map +1 -1
  163. package/dist/cli/commands/spec.d.ts +6 -4
  164. package/dist/cli/commands/spec.d.ts.map +1 -1
  165. package/dist/cli/commands/spec.js +166 -174
  166. package/dist/cli/commands/spec.js.map +1 -1
  167. package/dist/cli/commands/sprint.d.ts +1 -8
  168. package/dist/cli/commands/sprint.d.ts.map +1 -1
  169. package/dist/cli/commands/sprint.js +1 -522
  170. package/dist/cli/commands/sprint.js.map +1 -1
  171. package/dist/cli/commands/story/interaction.d.ts +7 -0
  172. package/dist/cli/commands/story/interaction.d.ts.map +1 -0
  173. package/dist/cli/commands/story/interaction.js +7 -0
  174. package/dist/cli/commands/story/interaction.js.map +1 -0
  175. package/dist/cli/commands/story/project.d.ts +10 -0
  176. package/dist/cli/commands/story/project.d.ts.map +1 -0
  177. package/dist/cli/commands/story/project.js +10 -0
  178. package/dist/cli/commands/story/project.js.map +1 -0
  179. package/dist/cli/commands/story.d.ts +1 -8
  180. package/dist/cli/commands/story.d.ts.map +1 -1
  181. package/dist/cli/commands/story.js +1 -358
  182. package/dist/cli/commands/story.js.map +1 -1
  183. package/dist/cli/commands/task.d.ts +1 -9
  184. package/dist/cli/commands/task.d.ts.map +1 -1
  185. package/dist/cli/commands/task.js +1 -351
  186. package/dist/cli/commands/task.js.map +1 -1
  187. package/dist/cli/error-boundary.d.ts +29 -0
  188. package/dist/cli/error-boundary.d.ts.map +1 -0
  189. package/dist/cli/error-boundary.js +103 -0
  190. package/dist/cli/error-boundary.js.map +1 -0
  191. package/dist/cli/helpers/bulk-checkbox-update.d.ts +1 -1
  192. package/dist/cli/helpers/bulk-checkbox-update.js +1 -1
  193. package/dist/cli/index.js +38 -113
  194. package/dist/cli/index.js.map +1 -1
  195. package/dist/dashboard/.vite/manifest.json +68 -0
  196. package/dist/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  197. package/dist/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  198. package/dist/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  199. package/dist/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  200. package/dist/dashboard/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
  201. package/dist/dashboard/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
  202. package/dist/dashboard/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
  203. package/dist/dashboard/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
  204. package/dist/dashboard/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
  205. package/dist/dashboard/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
  206. package/dist/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  207. package/dist/dashboard/assets/index-Bk8DyO_2.css +1 -0
  208. package/dist/dashboard/assets/index-zeygL5iu.js +557 -0
  209. package/dist/dashboard/assets/index-zeygL5iu.js.map +1 -0
  210. package/dist/dashboard/dashboard-manifest.json +84 -0
  211. package/dist/dashboard/index.html +13 -0
  212. package/dist/generators/base-generator.d.ts +2 -0
  213. package/dist/generators/base-generator.d.ts.map +1 -1
  214. package/dist/generators/base-generator.js +8 -0
  215. package/dist/generators/base-generator.js.map +1 -1
  216. package/dist/generators/claude-generator.d.ts.map +1 -1
  217. package/dist/generators/claude-generator.js +12 -14
  218. package/dist/generators/claude-generator.js.map +1 -1
  219. package/dist/generators/codex-generator.d.ts.map +1 -1
  220. package/dist/generators/codex-generator.js +7 -7
  221. package/dist/generators/codex-generator.js.map +1 -1
  222. package/dist/generators/cursor-generator.d.ts.map +1 -1
  223. package/dist/generators/cursor-generator.js +11 -30
  224. package/dist/generators/cursor-generator.js.map +1 -1
  225. package/dist/models/schema.d.ts +0 -23
  226. package/dist/models/schema.d.ts.map +1 -1
  227. package/dist/models/schema.js +0 -7
  228. package/dist/models/schema.js.map +1 -1
  229. package/dist/models/types.d.ts +3 -14
  230. package/dist/models/types.d.ts.map +1 -1
  231. package/dist/services/artifact-pipeline-service.d.ts +99 -1
  232. package/dist/services/artifact-pipeline-service.d.ts.map +1 -1
  233. package/dist/services/artifact-pipeline-service.js +681 -4
  234. package/dist/services/artifact-pipeline-service.js.map +1 -1
  235. package/dist/services/canonical-json.d.ts +3 -0
  236. package/dist/services/canonical-json.d.ts.map +1 -0
  237. package/dist/services/canonical-json.js +71 -0
  238. package/dist/services/canonical-json.js.map +1 -0
  239. package/dist/services/claude-plugin-service.d.ts +6 -1
  240. package/dist/services/claude-plugin-service.d.ts.map +1 -1
  241. package/dist/services/claude-plugin-service.js +184 -12
  242. package/dist/services/claude-plugin-service.js.map +1 -1
  243. package/dist/services/codex-plugin-service.d.ts +30 -0
  244. package/dist/services/codex-plugin-service.d.ts.map +1 -0
  245. package/dist/services/codex-plugin-service.js +195 -0
  246. package/dist/services/codex-plugin-service.js.map +1 -0
  247. package/dist/services/company-auth-service.d.ts +70 -0
  248. package/dist/services/company-auth-service.d.ts.map +1 -0
  249. package/dist/services/company-auth-service.js +720 -0
  250. package/dist/services/company-auth-service.js.map +1 -0
  251. package/dist/services/company-auth-store.d.ts +22 -0
  252. package/dist/services/company-auth-store.d.ts.map +1 -0
  253. package/dist/services/company-auth-store.js +158 -0
  254. package/dist/services/company-auth-store.js.map +1 -0
  255. package/dist/services/company-common.d.ts +9 -0
  256. package/dist/services/company-common.d.ts.map +1 -0
  257. package/dist/services/company-common.js +35 -0
  258. package/dist/services/company-common.js.map +1 -0
  259. package/dist/services/company-sync-service.d.ts +214 -0
  260. package/dist/services/company-sync-service.d.ts.map +1 -0
  261. package/dist/services/company-sync-service.js +1299 -0
  262. package/dist/services/company-sync-service.js.map +1 -0
  263. package/dist/services/connectors/adapters/business-metrics.d.ts +5 -0
  264. package/dist/services/connectors/adapters/business-metrics.d.ts.map +1 -0
  265. package/dist/services/connectors/adapters/business-metrics.js +41 -0
  266. package/dist/services/connectors/adapters/business-metrics.js.map +1 -0
  267. package/dist/services/connectors/adapters/deployment-health.d.ts +18 -0
  268. package/dist/services/connectors/adapters/deployment-health.d.ts.map +1 -0
  269. package/dist/services/connectors/adapters/deployment-health.js +67 -0
  270. package/dist/services/connectors/adapters/deployment-health.js.map +1 -0
  271. package/dist/services/connectors/adapters/github.d.ts +5 -0
  272. package/dist/services/connectors/adapters/github.d.ts.map +1 -0
  273. package/dist/services/connectors/adapters/github.js +31 -0
  274. package/dist/services/connectors/adapters/github.js.map +1 -0
  275. package/dist/services/connectors/adapters/linear-jira.d.ts +5 -0
  276. package/dist/services/connectors/adapters/linear-jira.d.ts.map +1 -0
  277. package/dist/services/connectors/adapters/linear-jira.js +26 -0
  278. package/dist/services/connectors/adapters/linear-jira.js.map +1 -0
  279. package/dist/services/connectors/adapters/posthog.d.ts +5 -0
  280. package/dist/services/connectors/adapters/posthog.d.ts.map +1 -0
  281. package/dist/services/connectors/adapters/posthog.js +31 -0
  282. package/dist/services/connectors/adapters/posthog.js.map +1 -0
  283. package/dist/services/connectors/adapters/sentry.d.ts +5 -0
  284. package/dist/services/connectors/adapters/sentry.d.ts.map +1 -0
  285. package/dist/services/connectors/adapters/sentry.js +31 -0
  286. package/dist/services/connectors/adapters/sentry.js.map +1 -0
  287. package/dist/services/connectors/checkpoint-custody.d.ts +45 -0
  288. package/dist/services/connectors/checkpoint-custody.d.ts.map +1 -0
  289. package/dist/services/connectors/checkpoint-custody.js +496 -0
  290. package/dist/services/connectors/checkpoint-custody.js.map +1 -0
  291. package/dist/services/connectors/connector-registry.d.ts +144 -0
  292. package/dist/services/connectors/connector-registry.d.ts.map +1 -0
  293. package/dist/services/connectors/connector-registry.js +423 -0
  294. package/dist/services/connectors/connector-registry.js.map +1 -0
  295. package/dist/services/connectors/connector-runtime.d.ts +200 -0
  296. package/dist/services/connectors/connector-runtime.d.ts.map +1 -0
  297. package/dist/services/connectors/connector-runtime.js +1297 -0
  298. package/dist/services/connectors/connector-runtime.js.map +1 -0
  299. package/dist/services/connectors/credential-custody.d.ts +96 -0
  300. package/dist/services/connectors/credential-custody.d.ts.map +1 -0
  301. package/dist/services/connectors/credential-custody.js +390 -0
  302. package/dist/services/connectors/credential-custody.js.map +1 -0
  303. package/dist/services/credential-backends.d.ts +11 -1
  304. package/dist/services/credential-backends.d.ts.map +1 -1
  305. package/dist/services/credential-backends.js +104 -21
  306. package/dist/services/credential-backends.js.map +1 -1
  307. package/dist/services/credential-write-lock.d.ts +8 -0
  308. package/dist/services/credential-write-lock.d.ts.map +1 -0
  309. package/dist/services/credential-write-lock.js +104 -0
  310. package/dist/services/credential-write-lock.js.map +1 -0
  311. package/dist/services/credentials-service.d.ts +8 -2
  312. package/dist/services/credentials-service.d.ts.map +1 -1
  313. package/dist/services/credentials-service.js +66 -21
  314. package/dist/services/credentials-service.js.map +1 -1
  315. package/dist/services/deprecation-notices.d.ts +2 -2
  316. package/dist/services/deprecation-notices.d.ts.map +1 -1
  317. package/dist/services/deprecation-notices.js +2 -2
  318. package/dist/services/deprecation-notices.js.map +1 -1
  319. package/dist/services/design-artifact-service.d.ts +37 -0
  320. package/dist/services/design-artifact-service.d.ts.map +1 -0
  321. package/dist/services/design-artifact-service.js +94 -0
  322. package/dist/services/design-artifact-service.js.map +1 -0
  323. package/dist/services/diagram-artifact-service.d.ts +12 -0
  324. package/dist/services/diagram-artifact-service.d.ts.map +1 -0
  325. package/dist/services/diagram-artifact-service.js +41 -0
  326. package/dist/services/diagram-artifact-service.js.map +1 -0
  327. package/dist/services/diagram-pipeline-service.d.ts +125 -0
  328. package/dist/services/diagram-pipeline-service.d.ts.map +1 -0
  329. package/dist/services/diagram-pipeline-service.js +329 -0
  330. package/dist/services/diagram-pipeline-service.js.map +1 -0
  331. package/dist/services/gherkin-service.d.ts +3 -0
  332. package/dist/services/gherkin-service.d.ts.map +1 -0
  333. package/dist/services/gherkin-service.js +9 -0
  334. package/dist/services/gherkin-service.js.map +1 -0
  335. package/dist/services/graph-service.d.ts.map +1 -1
  336. package/dist/services/graph-service.js +6 -4
  337. package/dist/services/graph-service.js.map +1 -1
  338. package/dist/services/landing/landing-service.d.ts +42 -0
  339. package/dist/services/landing/landing-service.d.ts.map +1 -0
  340. package/dist/services/landing/landing-service.js +197 -0
  341. package/dist/services/landing/landing-service.js.map +1 -0
  342. package/dist/services/landing/operation-registry.d.ts +56 -0
  343. package/dist/services/landing/operation-registry.d.ts.map +1 -0
  344. package/dist/services/landing/operation-registry.js +165 -0
  345. package/dist/services/landing/operation-registry.js.map +1 -0
  346. package/dist/services/landing/receipt-custody.d.ts +48 -0
  347. package/dist/services/landing/receipt-custody.d.ts.map +1 -0
  348. package/dist/services/landing/receipt-custody.js +375 -0
  349. package/dist/services/landing/receipt-custody.js.map +1 -0
  350. package/dist/services/linear/constants.d.ts.map +1 -1
  351. package/dist/services/linear/constants.js +2 -6
  352. package/dist/services/linear/constants.js.map +1 -1
  353. package/dist/services/linear/task-status-aggregation.d.ts +1 -1
  354. package/dist/services/linear/task-status-aggregation.js +1 -1
  355. package/dist/services/linear-pull-service.d.ts.map +1 -1
  356. package/dist/services/linear-pull-service.js +7 -30
  357. package/dist/services/linear-pull-service.js.map +1 -1
  358. package/dist/services/linear-push-service.d.ts.map +1 -1
  359. package/dist/services/linear-push-service.js +4 -5
  360. package/dist/services/linear-push-service.js.map +1 -1
  361. package/dist/services/migration-registry.d.ts +0 -19
  362. package/dist/services/migration-registry.d.ts.map +1 -1
  363. package/dist/services/migration-registry.js +18 -32
  364. package/dist/services/migration-registry.js.map +1 -1
  365. package/dist/services/operate/assignment-lifecycle-service.d.ts +135 -0
  366. package/dist/services/operate/assignment-lifecycle-service.d.ts.map +1 -0
  367. package/dist/services/operate/assignment-lifecycle-service.js +113 -0
  368. package/dist/services/operate/assignment-lifecycle-service.js.map +1 -0
  369. package/dist/services/operate/assignment-packet-service.d.ts +79 -0
  370. package/dist/services/operate/assignment-packet-service.d.ts.map +1 -0
  371. package/dist/services/operate/assignment-packet-service.js +1030 -0
  372. package/dist/services/operate/assignment-packet-service.js.map +1 -0
  373. package/dist/services/operate/client/governance.d.ts +4 -0
  374. package/dist/services/operate/client/governance.d.ts.map +1 -0
  375. package/dist/services/operate/client/governance.js +3 -0
  376. package/dist/services/operate/client/governance.js.map +1 -0
  377. package/dist/services/operate/client/lifecycle.d.ts +18 -0
  378. package/dist/services/operate/client/lifecycle.d.ts.map +1 -0
  379. package/dist/services/operate/client/lifecycle.js +15 -0
  380. package/dist/services/operate/client/lifecycle.js.map +1 -0
  381. package/dist/services/operate/client/runtime.d.ts +13 -0
  382. package/dist/services/operate/client/runtime.d.ts.map +1 -0
  383. package/dist/services/operate/client/runtime.js +11 -0
  384. package/dist/services/operate/client/runtime.js.map +1 -0
  385. package/dist/services/operate/client-error.d.ts +9 -0
  386. package/dist/services/operate/client-error.d.ts.map +1 -0
  387. package/dist/services/operate/client-error.js +14 -0
  388. package/dist/services/operate/client-error.js.map +1 -0
  389. package/dist/services/operate/client.d.ts +415 -0
  390. package/dist/services/operate/client.d.ts.map +1 -0
  391. package/dist/services/operate/client.js +2432 -0
  392. package/dist/services/operate/client.js.map +1 -0
  393. package/dist/services/operate/command-gateway.d.ts +152 -0
  394. package/dist/services/operate/command-gateway.d.ts.map +1 -0
  395. package/dist/services/operate/command-gateway.js +883 -0
  396. package/dist/services/operate/command-gateway.js.map +1 -0
  397. package/dist/services/operate/composition.d.ts +421 -0
  398. package/dist/services/operate/composition.d.ts.map +1 -0
  399. package/dist/services/operate/composition.js +394 -0
  400. package/dist/services/operate/composition.js.map +1 -0
  401. package/dist/services/operate/cycle-lifecycle-service.d.ts +35 -0
  402. package/dist/services/operate/cycle-lifecycle-service.d.ts.map +1 -0
  403. package/dist/services/operate/cycle-lifecycle-service.js +427 -0
  404. package/dist/services/operate/cycle-lifecycle-service.js.map +1 -0
  405. package/dist/services/operate/delivery-evidence.d.ts +34 -0
  406. package/dist/services/operate/delivery-evidence.d.ts.map +1 -0
  407. package/dist/services/operate/delivery-evidence.js +666 -0
  408. package/dist/services/operate/delivery-evidence.js.map +1 -0
  409. package/dist/services/operate/domain-catalog-service.d.ts +24 -0
  410. package/dist/services/operate/domain-catalog-service.d.ts.map +1 -0
  411. package/dist/services/operate/domain-catalog-service.js +99 -0
  412. package/dist/services/operate/domain-catalog-service.js.map +1 -0
  413. package/dist/services/operate/experience-read-service.d.ts +64 -0
  414. package/dist/services/operate/experience-read-service.d.ts.map +1 -0
  415. package/dist/services/operate/experience-read-service.js +109 -0
  416. package/dist/services/operate/experience-read-service.js.map +1 -0
  417. package/dist/services/operate/governed-action-service.d.ts +80 -0
  418. package/dist/services/operate/governed-action-service.d.ts.map +1 -0
  419. package/dist/services/operate/governed-action-service.js +497 -0
  420. package/dist/services/operate/governed-action-service.js.map +1 -0
  421. package/dist/services/operate/identity-contract.d.ts +3 -0
  422. package/dist/services/operate/identity-contract.d.ts.map +1 -0
  423. package/dist/services/operate/identity-contract.js +6 -0
  424. package/dist/services/operate/identity-contract.js.map +1 -0
  425. package/dist/services/operate/measurement-schedule-service.d.ts +81 -0
  426. package/dist/services/operate/measurement-schedule-service.d.ts.map +1 -0
  427. package/dist/services/operate/measurement-schedule-service.js +461 -0
  428. package/dist/services/operate/measurement-schedule-service.js.map +1 -0
  429. package/dist/services/operate/path-custody.d.ts +16 -0
  430. package/dist/services/operate/path-custody.d.ts.map +1 -0
  431. package/dist/services/operate/path-custody.js +120 -0
  432. package/dist/services/operate/path-custody.js.map +1 -0
  433. package/dist/services/operate/pinned-legacy-replay-runner.d.ts +9 -0
  434. package/dist/services/operate/pinned-legacy-replay-runner.d.ts.map +1 -0
  435. package/dist/services/operate/pinned-legacy-replay-runner.js +441 -0
  436. package/dist/services/operate/pinned-legacy-replay-runner.js.map +1 -0
  437. package/dist/services/operate/planning-bridge.d.ts +28 -0
  438. package/dist/services/operate/planning-bridge.d.ts.map +1 -0
  439. package/dist/services/operate/planning-bridge.js +341 -0
  440. package/dist/services/operate/planning-bridge.js.map +1 -0
  441. package/dist/services/operate/planning-handoff-gateway.d.ts +47 -0
  442. package/dist/services/operate/planning-handoff-gateway.d.ts.map +1 -0
  443. package/dist/services/operate/planning-handoff-gateway.js +169 -0
  444. package/dist/services/operate/planning-handoff-gateway.js.map +1 -0
  445. package/dist/services/operate/planning-handoff-service.d.ts +38 -0
  446. package/dist/services/operate/planning-handoff-service.d.ts.map +1 -0
  447. package/dist/services/operate/planning-handoff-service.js +304 -0
  448. package/dist/services/operate/planning-handoff-service.js.map +1 -0
  449. package/dist/services/operate/project-transaction-lock.d.ts +6 -0
  450. package/dist/services/operate/project-transaction-lock.d.ts.map +1 -0
  451. package/dist/services/operate/project-transaction-lock.js +146 -0
  452. package/dist/services/operate/project-transaction-lock.js.map +1 -0
  453. package/dist/services/operate/recovery-service.d.ts +16 -0
  454. package/dist/services/operate/recovery-service.d.ts.map +1 -0
  455. package/dist/services/operate/recovery-service.js +59 -0
  456. package/dist/services/operate/recovery-service.js.map +1 -0
  457. package/dist/services/operate/replay-safe-retry-service.d.ts +21 -0
  458. package/dist/services/operate/replay-safe-retry-service.d.ts.map +1 -0
  459. package/dist/services/operate/replay-safe-retry-service.js +66 -0
  460. package/dist/services/operate/replay-safe-retry-service.js.map +1 -0
  461. package/dist/services/operate/repository-read-service.d.ts +13 -0
  462. package/dist/services/operate/repository-read-service.d.ts.map +1 -0
  463. package/dist/services/operate/repository-read-service.js +153 -0
  464. package/dist/services/operate/repository-read-service.js.map +1 -0
  465. package/dist/services/operate/review-lifecycle-service.d.ts +50 -0
  466. package/dist/services/operate/review-lifecycle-service.d.ts.map +1 -0
  467. package/dist/services/operate/review-lifecycle-service.js +63 -0
  468. package/dist/services/operate/review-lifecycle-service.js.map +1 -0
  469. package/dist/services/operate/review-read-gateway.d.ts +21 -0
  470. package/dist/services/operate/review-read-gateway.d.ts.map +1 -0
  471. package/dist/services/operate/review-read-gateway.js +119 -0
  472. package/dist/services/operate/review-read-gateway.js.map +1 -0
  473. package/dist/services/operate/screened-evidence-service.d.ts +24 -0
  474. package/dist/services/operate/screened-evidence-service.d.ts.map +1 -0
  475. package/dist/services/operate/screened-evidence-service.js +186 -0
  476. package/dist/services/operate/screened-evidence-service.js.map +1 -0
  477. package/dist/services/operate/search-hit-contract.d.ts +11 -0
  478. package/dist/services/operate/search-hit-contract.d.ts.map +1 -0
  479. package/dist/services/operate/search-hit-contract.js +29 -0
  480. package/dist/services/operate/search-hit-contract.js.map +1 -0
  481. package/dist/services/operate/session-capability.d.ts +61 -0
  482. package/dist/services/operate/session-capability.d.ts.map +1 -0
  483. package/dist/services/operate/session-capability.js +124 -0
  484. package/dist/services/operate/session-capability.js.map +1 -0
  485. package/dist/services/operate/spec-operating-origin-service.d.ts +60 -0
  486. package/dist/services/operate/spec-operating-origin-service.d.ts.map +1 -0
  487. package/dist/services/operate/spec-operating-origin-service.js +401 -0
  488. package/dist/services/operate/spec-operating-origin-service.js.map +1 -0
  489. package/dist/services/operate/storage-layout.d.ts +82 -0
  490. package/dist/services/operate/storage-layout.d.ts.map +1 -0
  491. package/dist/services/operate/storage-layout.js +1244 -0
  492. package/dist/services/operate/storage-layout.js.map +1 -0
  493. package/dist/services/operate/storage-migration-service.d.ts +15 -0
  494. package/dist/services/operate/storage-migration-service.d.ts.map +1 -0
  495. package/dist/services/operate/storage-migration-service.js +27 -0
  496. package/dist/services/operate/storage-migration-service.js.map +1 -0
  497. package/dist/services/operate/store.d.ts +132 -0
  498. package/dist/services/operate/store.d.ts.map +1 -0
  499. package/dist/services/operate/store.js +1344 -0
  500. package/dist/services/operate/store.js.map +1 -0
  501. package/dist/services/pipeline-package-service.d.ts +93 -2
  502. package/dist/services/pipeline-package-service.d.ts.map +1 -1
  503. package/dist/services/pipeline-package-service.js +867 -7
  504. package/dist/services/pipeline-package-service.js.map +1 -1
  505. package/dist/services/planning-id-service.d.ts +8 -0
  506. package/dist/services/planning-id-service.d.ts.map +1 -0
  507. package/dist/services/planning-id-service.js +114 -0
  508. package/dist/services/planning-id-service.js.map +1 -0
  509. package/dist/services/provenance-service.d.ts +33 -1
  510. package/dist/services/provenance-service.d.ts.map +1 -1
  511. package/dist/services/provenance-service.js +104 -8
  512. package/dist/services/provenance-service.js.map +1 -1
  513. package/dist/services/runtime-manager/doctor.d.ts +22 -0
  514. package/dist/services/runtime-manager/doctor.d.ts.map +1 -0
  515. package/dist/services/runtime-manager/doctor.js +74 -0
  516. package/dist/services/runtime-manager/doctor.js.map +1 -0
  517. package/dist/services/runtime-manager/global-state.d.ts +47 -0
  518. package/dist/services/runtime-manager/global-state.d.ts.map +1 -0
  519. package/dist/services/runtime-manager/global-state.js +59 -0
  520. package/dist/services/runtime-manager/global-state.js.map +1 -0
  521. package/dist/services/runtime-manager/install-plan.d.ts +37 -0
  522. package/dist/services/runtime-manager/install-plan.d.ts.map +1 -0
  523. package/dist/services/runtime-manager/install-plan.js +91 -0
  524. package/dist/services/runtime-manager/install-plan.js.map +1 -0
  525. package/dist/services/runtime-manager/inventory.d.ts +29 -0
  526. package/dist/services/runtime-manager/inventory.d.ts.map +1 -0
  527. package/dist/services/runtime-manager/inventory.js +46 -0
  528. package/dist/services/runtime-manager/inventory.js.map +1 -0
  529. package/dist/services/runtime-manager-service.d.ts +16 -71
  530. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  531. package/dist/services/runtime-manager-service.js +1288 -505
  532. package/dist/services/runtime-manager-service.js.map +1 -1
  533. package/dist/services/spec-service.d.ts +213 -39
  534. package/dist/services/spec-service.d.ts.map +1 -1
  535. package/dist/services/spec-service.js +938 -171
  536. package/dist/services/spec-service.js.map +1 -1
  537. package/dist/services/template-service.d.ts.map +1 -1
  538. package/dist/services/template-service.js +1 -0
  539. package/dist/services/template-service.js.map +1 -1
  540. package/dist/templates/quick/quick-task.md.hbs +6 -0
  541. package/dist/templates/rules/claude/CLAUDE.md.hbs +3 -111
  542. package/dist/templates/rules/codex/AGENTS.md.hbs +2 -92
  543. package/dist/templates/rules/cursor/create-task-list.mdc.hbs +1 -1
  544. package/dist/templates/rules/cursor/implement-task-list.mdc.hbs +5 -83
  545. package/dist/templates/rules/cursor/openplanr.mdc.hbs +12 -0
  546. package/dist/templates/rules/shared/host-native-guidance.md.hbs +12 -0
  547. package/dist/templates/rules/shared/implementation-guidance.md.hbs +44 -0
  548. package/dist/templates/spec/spec-shaped.md.hbs +66 -22
  549. package/dist/templates/spec/spec.md.hbs +46 -23
  550. package/dist/templates/spec/story.md.hbs +15 -4
  551. package/dist/templates/spec/task.md.hbs +53 -5
  552. package/dist/utils/constants.d.ts +1 -1
  553. package/dist/utils/constants.js +1 -1
  554. package/dist/utils/logger.d.ts +0 -3
  555. package/dist/utils/logger.d.ts.map +1 -1
  556. package/dist/utils/logger.js +0 -6
  557. package/dist/utils/logger.js.map +1 -1
  558. package/docs/ARTIFACT_REVIEW.md +110 -0
  559. package/docs/CLI.md +1228 -0
  560. package/docs/CROSS_RUNTIME_SETUP.md +168 -0
  561. package/docs/TROUBLESHOOTING.md +227 -0
  562. package/lib/dashboard-verifier.d.mts +29 -0
  563. package/lib/dashboard-verifier.mjs +307 -0
  564. package/lib/host-packages/adapter-registry.json +44 -0
  565. package/lib/host-packages/claude/.claude-plugin/marketplace.json +20 -0
  566. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +9 -0
  567. package/lib/host-packages/claude/openplanr/.openplanr-content.json +1179 -0
  568. package/lib/host-packages/claude/openplanr/agents/planr-backend.md +66 -0
  569. package/lib/host-packages/claude/openplanr/agents/planr-database.md +165 -0
  570. package/lib/host-packages/claude/openplanr/agents/planr-designer.md +57 -0
  571. package/lib/host-packages/claude/openplanr/agents/planr-devops.md +57 -0
  572. package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +63 -0
  573. package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +29 -0
  574. package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +69 -0
  575. package/lib/host-packages/claude/openplanr/agents/planr-qa.md +162 -0
  576. package/lib/host-packages/claude/openplanr/agents/planr-specification.md +124 -0
  577. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +93 -0
  578. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +90 -0
  579. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +55 -0
  580. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +67 -0
  581. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +94 -0
  582. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/qa.md +17 -0
  583. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +111 -0
  584. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/contract-create-modify-preserve.md +17 -0
  585. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-craft-rubric.md +51 -0
  586. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-principles.md +43 -0
  587. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-spec-template.md +88 -0
  588. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/task-context-resolution.md +60 -0
  589. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-backend.md +26 -0
  590. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-frontend.md +27 -0
  591. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +96 -0
  592. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +83 -0
  593. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +55 -0
  594. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +67 -0
  595. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +96 -0
  596. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/qa.md +17 -0
  597. package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +112 -0
  598. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/backend/nestjs.md +130 -0
  599. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +122 -0
  600. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/prisma.md +155 -0
  601. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/devops/docker-compose.md +140 -0
  602. package/lib/host-packages/claude/openplanr/references/pipeline/stacks/frontend/nextjs.md +123 -0
  603. package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +54 -0
  604. package/lib/host-packages/claude/openplanr/skills/artifact/openplanr.skill.json +48 -0
  605. package/lib/host-packages/claude/openplanr/skills/artifact/references/company-review.md +18 -0
  606. package/lib/host-packages/claude/openplanr/skills/artifact/references/design-sharing.md +51 -0
  607. package/lib/host-packages/claude/openplanr/skills/browser-qa/SKILL.md +34 -0
  608. package/lib/host-packages/claude/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
  609. package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +47 -0
  610. package/lib/host-packages/claude/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
  611. package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
  612. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
  613. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
  614. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
  615. package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
  616. package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +101 -0
  617. package/lib/host-packages/claude/openplanr/skills/chair-review/openplanr.skill.json +70 -0
  618. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
  619. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
  620. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
  621. package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
  622. package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +86 -0
  623. package/lib/host-packages/claude/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
  624. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
  625. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
  626. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
  627. package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
  628. package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +46 -0
  629. package/lib/host-packages/claude/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
  630. package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
  631. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
  632. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
  633. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
  634. package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
  635. package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +45 -0
  636. package/lib/host-packages/claude/openplanr/skills/coo-review/openplanr.skill.json +81 -0
  637. package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
  638. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
  639. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
  640. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
  641. package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
  642. package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +48 -0
  643. package/lib/host-packages/claude/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
  644. package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
  645. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
  646. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
  647. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
  648. package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
  649. package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +47 -0
  650. package/lib/host-packages/claude/openplanr/skills/cto-review/openplanr.skill.json +81 -0
  651. package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
  652. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
  653. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
  654. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
  655. package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
  656. package/lib/host-packages/claude/openplanr/skills/dashboard/SKILL.md +20 -0
  657. package/lib/host-packages/claude/openplanr/skills/dashboard/openplanr.skill.json +26 -0
  658. package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +73 -0
  659. package/lib/host-packages/claude/openplanr/skills/design/openplanr.skill.json +466 -0
  660. package/lib/host-packages/claude/openplanr/skills/design/references/craft.md +68 -0
  661. package/lib/host-packages/claude/openplanr/skills/design/references/design-spec-template.md +88 -0
  662. package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +33 -0
  663. package/lib/host-packages/claude/openplanr/skills/design/references/discovery.md +53 -0
  664. package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +105 -0
  665. package/lib/host-packages/claude/openplanr/skills/design/references/handoff.md +47 -0
  666. package/lib/host-packages/claude/openplanr/skills/design/references/review.md +88 -0
  667. package/lib/host-packages/claude/openplanr/skills/design/references/team-review.md +131 -0
  668. package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +93 -0
  669. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +306 -0
  670. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
  671. package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
  672. package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +17323 -0
  673. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
  674. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
  675. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  676. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  677. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  678. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  679. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  680. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  681. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  682. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
  683. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  684. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  685. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  686. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  687. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  688. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  689. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  690. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  691. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  692. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  693. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  694. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  695. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  696. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  697. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  698. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  699. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  700. package/lib/host-packages/claude/openplanr/skills/design-loop/SKILL.md +58 -0
  701. package/lib/host-packages/claude/openplanr/skills/design-loop/openplanr.skill.json +466 -0
  702. package/lib/host-packages/claude/openplanr/skills/design-loop/references/craft.md +68 -0
  703. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
  704. package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +33 -0
  705. package/lib/host-packages/claude/openplanr/skills/design-loop/references/discovery.md +53 -0
  706. package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +105 -0
  707. package/lib/host-packages/claude/openplanr/skills/design-loop/references/handoff.md +47 -0
  708. package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +88 -0
  709. package/lib/host-packages/claude/openplanr/skills/design-loop/references/team-review.md +131 -0
  710. package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +93 -0
  711. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
  712. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
  713. package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
  714. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
  715. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
  716. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
  717. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  718. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  719. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  720. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  721. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  722. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  723. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  724. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  725. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  726. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  727. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  728. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  729. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  730. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  731. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  732. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  733. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  734. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  735. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  736. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  737. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  738. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  739. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  740. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  741. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  742. package/lib/host-packages/claude/openplanr/skills/design-review/SKILL.md +54 -0
  743. package/lib/host-packages/claude/openplanr/skills/design-review/openplanr.skill.json +466 -0
  744. package/lib/host-packages/claude/openplanr/skills/design-review/references/craft.md +68 -0
  745. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-spec-template.md +88 -0
  746. package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +33 -0
  747. package/lib/host-packages/claude/openplanr/skills/design-review/references/discovery.md +53 -0
  748. package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +105 -0
  749. package/lib/host-packages/claude/openplanr/skills/design-review/references/handoff.md +47 -0
  750. package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +88 -0
  751. package/lib/host-packages/claude/openplanr/skills/design-review/references/team-review.md +131 -0
  752. package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +93 -0
  753. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
  754. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
  755. package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
  756. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +17323 -0
  757. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
  758. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
  759. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  760. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  761. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  762. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  763. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  764. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  765. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  766. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
  767. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  768. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  769. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  770. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  771. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  772. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  773. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  774. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  775. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  776. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  777. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  778. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  779. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  780. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  781. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  782. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  783. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  784. package/lib/host-packages/claude/openplanr/skills/diagram/SKILL.md +65 -0
  785. package/lib/host-packages/claude/openplanr/skills/diagram/openplanr.skill.json +59 -0
  786. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-document.md +86 -0
  787. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
  788. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
  789. package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +40 -0
  790. package/lib/host-packages/claude/openplanr/skills/doctor/openplanr.skill.json +37 -0
  791. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +106 -0
  792. package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +31 -0
  793. package/lib/host-packages/claude/openplanr/skills/investigate/openplanr.skill.json +26 -0
  794. package/lib/host-packages/claude/openplanr/skills/land/SKILL.md +33 -0
  795. package/lib/host-packages/claude/openplanr/skills/land/openplanr.skill.json +26 -0
  796. package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +181 -0
  797. package/lib/host-packages/claude/openplanr/skills/operate/openplanr.skill.json +70 -0
  798. package/lib/host-packages/claude/openplanr/skills/operate/scripts/errors.mjs +8 -0
  799. package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
  800. package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
  801. package/lib/host-packages/claude/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
  802. package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +106 -0
  803. package/lib/host-packages/claude/openplanr/skills/plan/openplanr.skill.json +389 -0
  804. package/lib/host-packages/claude/openplanr/skills/plan/references/artifact-contract.md +39 -0
  805. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
  806. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
  807. package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
  808. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +17323 -0
  809. package/lib/host-packages/claude/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
  810. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
  811. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
  812. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  813. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  814. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  815. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  816. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  817. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  818. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  819. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
  820. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  821. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  822. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  823. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  824. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  825. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  826. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  827. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  828. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  829. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  830. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  831. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  832. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  833. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  834. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  835. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  836. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  837. package/lib/host-packages/claude/openplanr/skills/plan-review/SKILL.md +39 -0
  838. package/lib/host-packages/claude/openplanr/skills/plan-review/openplanr.skill.json +26 -0
  839. package/lib/host-packages/claude/openplanr/skills/release/SKILL.md +180 -0
  840. package/lib/host-packages/claude/openplanr/skills/release/assets/changelog-template.md +18 -0
  841. package/lib/host-packages/claude/openplanr/skills/release/assets/profile-template.md +45 -0
  842. package/lib/host-packages/claude/openplanr/skills/release/openplanr.skill.json +92 -0
  843. package/lib/host-packages/claude/openplanr/skills/release/references/cadence.md +92 -0
  844. package/lib/host-packages/claude/openplanr/skills/release/references/release-notes.md +127 -0
  845. package/lib/host-packages/claude/openplanr/skills/release/references/schemes.md +103 -0
  846. package/lib/host-packages/claude/openplanr/skills/release/scripts/collect_changes.sh +85 -0
  847. package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +80 -0
  848. package/lib/host-packages/claude/openplanr/skills/ship/openplanr.skill.json +48 -0
  849. package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +14 -0
  850. package/lib/host-packages/claude/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
  851. package/lib/host-packages/claude/openplanr/skills/spec/SKILL.md +53 -0
  852. package/lib/host-packages/claude/openplanr/skills/spec/openplanr.skill.json +37 -0
  853. package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +32 -0
  854. package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +21 -0
  855. package/lib/host-packages/claude/openplanr/skills/status/openplanr.skill.json +26 -0
  856. package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +30 -0
  857. package/lib/host-packages/claude/openplanr/skills/sync/openplanr.skill.json +37 -0
  858. package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +230 -0
  859. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +939 -0
  860. package/lib/host-packages/cursor/openplanr/manifest.json +32 -0
  861. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/company-review.md +18 -0
  862. package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/design-sharing.md +51 -0
  863. package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +53 -0
  864. package/lib/host-packages/cursor/openplanr/rules/planr-browser-qa.mdc +34 -0
  865. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +111 -0
  866. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/errors.mjs +8 -0
  867. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-contract.mjs +438 -0
  868. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-note.mjs +595 -0
  869. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/validate-note.mjs +31 -0
  870. package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review.mdc +45 -0
  871. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/errors.mjs +8 -0
  872. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-contract.mjs +438 -0
  873. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-note.mjs +595 -0
  874. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/validate-note.mjs +31 -0
  875. package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +99 -0
  876. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/errors.mjs +8 -0
  877. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-contract.mjs +438 -0
  878. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-note.mjs +595 -0
  879. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/validate-note.mjs +31 -0
  880. package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +84 -0
  881. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +111 -0
  882. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/errors.mjs +8 -0
  883. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-contract.mjs +438 -0
  884. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-note.mjs +595 -0
  885. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/validate-note.mjs +31 -0
  886. package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review.mdc +44 -0
  887. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +111 -0
  888. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/errors.mjs +8 -0
  889. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-contract.mjs +438 -0
  890. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-note.mjs +595 -0
  891. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/validate-note.mjs +31 -0
  892. package/lib/host-packages/cursor/openplanr/rules/planr-coo-review.mdc +43 -0
  893. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +111 -0
  894. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/errors.mjs +8 -0
  895. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-contract.mjs +438 -0
  896. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-note.mjs +595 -0
  897. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/validate-note.mjs +31 -0
  898. package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review.mdc +46 -0
  899. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +111 -0
  900. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/errors.mjs +8 -0
  901. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-contract.mjs +438 -0
  902. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-note.mjs +595 -0
  903. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/validate-note.mjs +31 -0
  904. package/lib/host-packages/cursor/openplanr/rules/planr-cto-review.mdc +45 -0
  905. package/lib/host-packages/cursor/openplanr/rules/planr-dashboard.mdc +19 -0
  906. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/craft.md +68 -0
  907. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-spec-template.md +88 -0
  908. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +33 -0
  909. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/discovery.md +53 -0
  910. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +105 -0
  911. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/handoff.md +47 -0
  912. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +88 -0
  913. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/team-review.md +131 -0
  914. package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +93 -0
  915. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +306 -0
  916. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-context.schema.json +191 -0
  917. package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-handoff.schema.json +407 -0
  918. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +17323 -0
  919. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/entities.txt +13 -0
  920. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/parse5.txt +21 -0
  921. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  922. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  923. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  924. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  925. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  926. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  927. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  928. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +115 -0
  929. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  930. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  931. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  932. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  933. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  934. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  935. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  936. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  937. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  938. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  939. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  940. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  941. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  942. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  943. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  944. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  945. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  946. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/craft.md +68 -0
  947. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-spec-template.md +88 -0
  948. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +33 -0
  949. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/discovery.md +53 -0
  950. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +105 -0
  951. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/handoff.md +47 -0
  952. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +88 -0
  953. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/team-review.md +131 -0
  954. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +93 -0
  955. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +306 -0
  956. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-context.schema.json +191 -0
  957. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-handoff.schema.json +407 -0
  958. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +17323 -0
  959. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/entities.txt +13 -0
  960. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/parse5.txt +21 -0
  961. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  962. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  963. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  964. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  965. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  966. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  967. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  968. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  969. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  970. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  971. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  972. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  973. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  974. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  975. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  976. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  977. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  978. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  979. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  980. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  981. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  982. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  983. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  984. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  985. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  986. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop.mdc +57 -0
  987. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/craft.md +68 -0
  988. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-spec-template.md +88 -0
  989. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +33 -0
  990. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/discovery.md +53 -0
  991. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +105 -0
  992. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/handoff.md +47 -0
  993. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +88 -0
  994. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/team-review.md +131 -0
  995. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +93 -0
  996. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +306 -0
  997. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-context.schema.json +191 -0
  998. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-handoff.schema.json +407 -0
  999. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +17323 -0
  1000. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/entities.txt +13 -0
  1001. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/parse5.txt +21 -0
  1002. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1003. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1004. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1005. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1006. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1007. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1008. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1009. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +115 -0
  1010. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1011. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1012. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1013. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1014. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1015. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1016. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1017. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1018. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1019. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1020. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1021. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1022. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1023. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1024. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1025. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1026. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1027. package/lib/host-packages/cursor/openplanr/rules/planr-design-review.mdc +53 -0
  1028. package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +72 -0
  1029. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-document.md +86 -0
  1030. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-fidelity.md +19 -0
  1031. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-intent-to-ir.md +22 -0
  1032. package/lib/host-packages/cursor/openplanr/rules/planr-diagram.mdc +64 -0
  1033. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +106 -0
  1034. package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +39 -0
  1035. package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +31 -0
  1036. package/lib/host-packages/cursor/openplanr/rules/planr-land.mdc +32 -0
  1037. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/errors.mjs +8 -0
  1038. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-contract.mjs +438 -0
  1039. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-note.mjs +595 -0
  1040. package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/validate-note.mjs +31 -0
  1041. package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +180 -0
  1042. package/lib/host-packages/cursor/openplanr/rules/planr-plan/references/artifact-contract.md +39 -0
  1043. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +306 -0
  1044. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-context.schema.json +191 -0
  1045. package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-handoff.schema.json +407 -0
  1046. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +17323 -0
  1047. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/planning-ids.mjs +120 -0
  1048. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/entities.txt +13 -0
  1049. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/parse5.txt +21 -0
  1050. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1051. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1052. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1053. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1054. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1055. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1056. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1057. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +115 -0
  1058. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1059. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1060. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1061. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1062. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1063. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1064. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1065. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1066. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1067. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1068. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1069. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1070. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1071. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1072. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1073. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1074. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1075. package/lib/host-packages/cursor/openplanr/rules/planr-plan-review.mdc +38 -0
  1076. package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +105 -0
  1077. package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/changelog-template.md +18 -0
  1078. package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/profile-template.md +45 -0
  1079. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/cadence.md +92 -0
  1080. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/release-notes.md +127 -0
  1081. package/lib/host-packages/cursor/openplanr/rules/planr-release/references/schemes.md +103 -0
  1082. package/lib/host-packages/cursor/openplanr/rules/planr-release/scripts/collect_changes.sh +85 -0
  1083. package/lib/host-packages/cursor/openplanr/rules/planr-release.mdc +179 -0
  1084. package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +14 -0
  1085. package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/discover-verification.mjs +107 -0
  1086. package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +79 -0
  1087. package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +32 -0
  1088. package/lib/host-packages/cursor/openplanr/rules/planr-spec.mdc +52 -0
  1089. package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +20 -0
  1090. package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +230 -0
  1091. package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +29 -0
  1092. package/lib/host-packages/openai/.claude-plugin/marketplace.json +19 -0
  1093. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +10 -0
  1094. package/lib/host-packages/openai/openplanr/.openplanr-content.json +1139 -0
  1095. package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +54 -0
  1096. package/lib/host-packages/openai/openplanr/skills/artifact/agents/openai.yaml +6 -0
  1097. package/lib/host-packages/openai/openplanr/skills/artifact/openplanr.skill.json +48 -0
  1098. package/lib/host-packages/openai/openplanr/skills/artifact/references/company-review.md +18 -0
  1099. package/lib/host-packages/openai/openplanr/skills/artifact/references/design-sharing.md +51 -0
  1100. package/lib/host-packages/openai/openplanr/skills/browser-qa/SKILL.md +34 -0
  1101. package/lib/host-packages/openai/openplanr/skills/browser-qa/agents/openai.yaml +6 -0
  1102. package/lib/host-packages/openai/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
  1103. package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +47 -0
  1104. package/lib/host-packages/openai/openplanr/skills/ceo-review/agents/openai.yaml +6 -0
  1105. package/lib/host-packages/openai/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
  1106. package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
  1107. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
  1108. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
  1109. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
  1110. package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
  1111. package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +101 -0
  1112. package/lib/host-packages/openai/openplanr/skills/chair-review/agents/openai.yaml +6 -0
  1113. package/lib/host-packages/openai/openplanr/skills/chair-review/openplanr.skill.json +70 -0
  1114. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
  1115. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
  1116. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
  1117. package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
  1118. package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +86 -0
  1119. package/lib/host-packages/openai/openplanr/skills/challenger-review/agents/openai.yaml +6 -0
  1120. package/lib/host-packages/openai/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
  1121. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
  1122. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
  1123. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
  1124. package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
  1125. package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +46 -0
  1126. package/lib/host-packages/openai/openplanr/skills/cmo-review/agents/openai.yaml +6 -0
  1127. package/lib/host-packages/openai/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
  1128. package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
  1129. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
  1130. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
  1131. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
  1132. package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
  1133. package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +45 -0
  1134. package/lib/host-packages/openai/openplanr/skills/coo-review/agents/openai.yaml +6 -0
  1135. package/lib/host-packages/openai/openplanr/skills/coo-review/openplanr.skill.json +81 -0
  1136. package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
  1137. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
  1138. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
  1139. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
  1140. package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
  1141. package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +48 -0
  1142. package/lib/host-packages/openai/openplanr/skills/cpo-review/agents/openai.yaml +6 -0
  1143. package/lib/host-packages/openai/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
  1144. package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
  1145. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
  1146. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
  1147. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
  1148. package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
  1149. package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +47 -0
  1150. package/lib/host-packages/openai/openplanr/skills/cto-review/agents/openai.yaml +6 -0
  1151. package/lib/host-packages/openai/openplanr/skills/cto-review/openplanr.skill.json +81 -0
  1152. package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
  1153. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
  1154. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
  1155. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
  1156. package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
  1157. package/lib/host-packages/openai/openplanr/skills/dashboard/SKILL.md +20 -0
  1158. package/lib/host-packages/openai/openplanr/skills/dashboard/agents/openai.yaml +6 -0
  1159. package/lib/host-packages/openai/openplanr/skills/dashboard/openplanr.skill.json +26 -0
  1160. package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +73 -0
  1161. package/lib/host-packages/openai/openplanr/skills/design/agents/openai.yaml +6 -0
  1162. package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +466 -0
  1163. package/lib/host-packages/openai/openplanr/skills/design/references/craft.md +68 -0
  1164. package/lib/host-packages/openai/openplanr/skills/design/references/design-spec-template.md +88 -0
  1165. package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +33 -0
  1166. package/lib/host-packages/openai/openplanr/skills/design/references/discovery.md +53 -0
  1167. package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +105 -0
  1168. package/lib/host-packages/openai/openplanr/skills/design/references/handoff.md +47 -0
  1169. package/lib/host-packages/openai/openplanr/skills/design/references/review.md +88 -0
  1170. package/lib/host-packages/openai/openplanr/skills/design/references/team-review.md +131 -0
  1171. package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +93 -0
  1172. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +306 -0
  1173. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
  1174. package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
  1175. package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +17323 -0
  1176. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
  1177. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
  1178. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1179. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1180. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1181. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1182. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1183. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1184. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1185. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
  1186. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1187. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1188. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1189. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1190. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1191. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1192. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1193. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1194. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1195. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1196. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1197. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1198. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1199. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1200. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1201. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1202. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1203. package/lib/host-packages/openai/openplanr/skills/design-loop/SKILL.md +58 -0
  1204. package/lib/host-packages/openai/openplanr/skills/design-loop/agents/openai.yaml +6 -0
  1205. package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +466 -0
  1206. package/lib/host-packages/openai/openplanr/skills/design-loop/references/craft.md +68 -0
  1207. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
  1208. package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +33 -0
  1209. package/lib/host-packages/openai/openplanr/skills/design-loop/references/discovery.md +53 -0
  1210. package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +105 -0
  1211. package/lib/host-packages/openai/openplanr/skills/design-loop/references/handoff.md +47 -0
  1212. package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +88 -0
  1213. package/lib/host-packages/openai/openplanr/skills/design-loop/references/team-review.md +131 -0
  1214. package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +93 -0
  1215. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
  1216. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
  1217. package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
  1218. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
  1219. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
  1220. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
  1221. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1222. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1223. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1224. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1225. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1226. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1227. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1228. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
  1229. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1230. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1231. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1232. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1233. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1234. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1235. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1236. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1237. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1238. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1239. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1240. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1241. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1242. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1243. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1244. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1245. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1246. package/lib/host-packages/openai/openplanr/skills/design-review/SKILL.md +54 -0
  1247. package/lib/host-packages/openai/openplanr/skills/design-review/agents/openai.yaml +6 -0
  1248. package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +466 -0
  1249. package/lib/host-packages/openai/openplanr/skills/design-review/references/craft.md +68 -0
  1250. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-spec-template.md +88 -0
  1251. package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +33 -0
  1252. package/lib/host-packages/openai/openplanr/skills/design-review/references/discovery.md +53 -0
  1253. package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +105 -0
  1254. package/lib/host-packages/openai/openplanr/skills/design-review/references/handoff.md +47 -0
  1255. package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +88 -0
  1256. package/lib/host-packages/openai/openplanr/skills/design-review/references/team-review.md +131 -0
  1257. package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +93 -0
  1258. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
  1259. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
  1260. package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
  1261. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +17323 -0
  1262. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
  1263. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
  1264. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1265. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1266. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1267. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1268. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1269. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1270. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1271. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
  1272. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1273. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1274. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1275. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1276. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1277. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1278. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1279. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1280. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1281. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1282. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1283. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1284. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1285. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1286. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1287. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1288. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1289. package/lib/host-packages/openai/openplanr/skills/diagram/SKILL.md +65 -0
  1290. package/lib/host-packages/openai/openplanr/skills/diagram/agents/openai.yaml +6 -0
  1291. package/lib/host-packages/openai/openplanr/skills/diagram/openplanr.skill.json +59 -0
  1292. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-document.md +86 -0
  1293. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
  1294. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
  1295. package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +40 -0
  1296. package/lib/host-packages/openai/openplanr/skills/doctor/agents/openai.yaml +6 -0
  1297. package/lib/host-packages/openai/openplanr/skills/doctor/openplanr.skill.json +37 -0
  1298. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +106 -0
  1299. package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +31 -0
  1300. package/lib/host-packages/openai/openplanr/skills/investigate/agents/openai.yaml +6 -0
  1301. package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +26 -0
  1302. package/lib/host-packages/openai/openplanr/skills/land/SKILL.md +33 -0
  1303. package/lib/host-packages/openai/openplanr/skills/land/agents/openai.yaml +6 -0
  1304. package/lib/host-packages/openai/openplanr/skills/land/openplanr.skill.json +26 -0
  1305. package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +181 -0
  1306. package/lib/host-packages/openai/openplanr/skills/operate/agents/openai.yaml +6 -0
  1307. package/lib/host-packages/openai/openplanr/skills/operate/openplanr.skill.json +70 -0
  1308. package/lib/host-packages/openai/openplanr/skills/operate/scripts/errors.mjs +8 -0
  1309. package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
  1310. package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
  1311. package/lib/host-packages/openai/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
  1312. package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +106 -0
  1313. package/lib/host-packages/openai/openplanr/skills/plan/agents/openai.yaml +6 -0
  1314. package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +389 -0
  1315. package/lib/host-packages/openai/openplanr/skills/plan/references/artifact-contract.md +39 -0
  1316. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
  1317. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
  1318. package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
  1319. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +17323 -0
  1320. package/lib/host-packages/openai/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
  1321. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
  1322. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
  1323. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
  1324. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
  1325. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
  1326. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
  1327. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
  1328. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
  1329. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
  1330. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
  1331. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
  1332. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
  1333. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
  1334. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
  1335. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
  1336. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
  1337. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
  1338. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
  1339. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
  1340. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
  1341. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
  1342. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
  1343. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
  1344. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
  1345. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
  1346. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
  1347. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
  1348. package/lib/host-packages/openai/openplanr/skills/plan-review/SKILL.md +39 -0
  1349. package/lib/host-packages/openai/openplanr/skills/plan-review/agents/openai.yaml +6 -0
  1350. package/lib/host-packages/openai/openplanr/skills/plan-review/openplanr.skill.json +26 -0
  1351. package/lib/host-packages/openai/openplanr/skills/release/SKILL.md +180 -0
  1352. package/lib/host-packages/openai/openplanr/skills/release/agents/openai.yaml +6 -0
  1353. package/lib/host-packages/openai/openplanr/skills/release/assets/changelog-template.md +18 -0
  1354. package/lib/host-packages/openai/openplanr/skills/release/assets/profile-template.md +45 -0
  1355. package/lib/host-packages/openai/openplanr/skills/release/openplanr.skill.json +92 -0
  1356. package/lib/host-packages/openai/openplanr/skills/release/references/cadence.md +92 -0
  1357. package/lib/host-packages/openai/openplanr/skills/release/references/release-notes.md +127 -0
  1358. package/lib/host-packages/openai/openplanr/skills/release/references/schemes.md +103 -0
  1359. package/lib/host-packages/openai/openplanr/skills/release/scripts/collect_changes.sh +85 -0
  1360. package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +80 -0
  1361. package/lib/host-packages/openai/openplanr/skills/ship/agents/openai.yaml +6 -0
  1362. package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +48 -0
  1363. package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +14 -0
  1364. package/lib/host-packages/openai/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
  1365. package/lib/host-packages/openai/openplanr/skills/spec/SKILL.md +53 -0
  1366. package/lib/host-packages/openai/openplanr/skills/spec/agents/openai.yaml +6 -0
  1367. package/lib/host-packages/openai/openplanr/skills/spec/openplanr.skill.json +37 -0
  1368. package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +32 -0
  1369. package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +21 -0
  1370. package/lib/host-packages/openai/openplanr/skills/status/agents/openai.yaml +6 -0
  1371. package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +26 -0
  1372. package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +30 -0
  1373. package/lib/host-packages/openai/openplanr/skills/sync/agents/openai.yaml +6 -0
  1374. package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +37 -0
  1375. package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +230 -0
  1376. package/lib/integrations.d.mts +43 -0
  1377. package/lib/integrations.mjs +230 -0
  1378. package/lib/skill-runtime/errors.mjs +8 -0
  1379. package/lib/skill-runtime/operate-review-contract.mjs +438 -0
  1380. package/lib/skill-runtime/operate-review-note.mjs +595 -0
  1381. package/package.json +56 -18
  1382. package/dist/ai/codebase/context-builder.d.ts +0 -50
  1383. package/dist/ai/codebase/context-builder.d.ts.map +0 -1
  1384. package/dist/ai/codebase/context-builder.js +0 -281
  1385. package/dist/ai/codebase/context-builder.js.map +0 -1
  1386. package/dist/ai/codebase/file-reader.d.ts +0 -22
  1387. package/dist/ai/codebase/file-reader.d.ts.map +0 -1
  1388. package/dist/ai/codebase/file-reader.js +0 -144
  1389. package/dist/ai/codebase/file-reader.js.map +0 -1
  1390. package/dist/ai/codebase/index.d.ts +0 -7
  1391. package/dist/ai/codebase/index.d.ts.map +0 -1
  1392. package/dist/ai/codebase/index.js +0 -7
  1393. package/dist/ai/codebase/index.js.map +0 -1
  1394. package/dist/ai/codebase/pattern-rules.d.ts +0 -28
  1395. package/dist/ai/codebase/pattern-rules.d.ts.map +0 -1
  1396. package/dist/ai/codebase/pattern-rules.js +0 -186
  1397. package/dist/ai/codebase/pattern-rules.js.map +0 -1
  1398. package/dist/ai/codebase/rules-reader.d.ts +0 -14
  1399. package/dist/ai/codebase/rules-reader.d.ts.map +0 -1
  1400. package/dist/ai/codebase/rules-reader.js +0 -25
  1401. package/dist/ai/codebase/rules-reader.js.map +0 -1
  1402. package/dist/ai/codebase/stack-detector.d.ts +0 -18
  1403. package/dist/ai/codebase/stack-detector.d.ts.map +0 -1
  1404. package/dist/ai/codebase/stack-detector.js +0 -173
  1405. package/dist/ai/codebase/stack-detector.js.map +0 -1
  1406. package/dist/ai/codebase/tree-generator.d.ts +0 -8
  1407. package/dist/ai/codebase/tree-generator.d.ts.map +0 -1
  1408. package/dist/ai/codebase/tree-generator.js +0 -84
  1409. package/dist/ai/codebase/tree-generator.js.map +0 -1
  1410. package/dist/ai/errors.d.ts +0 -22
  1411. package/dist/ai/errors.d.ts.map +0 -1
  1412. package/dist/ai/errors.js +0 -72
  1413. package/dist/ai/errors.js.map +0 -1
  1414. package/dist/ai/index.d.ts +0 -11
  1415. package/dist/ai/index.d.ts.map +0 -1
  1416. package/dist/ai/index.js +0 -10
  1417. package/dist/ai/index.js.map +0 -1
  1418. package/dist/ai/prompts/prompt-builder.d.ts +0 -134
  1419. package/dist/ai/prompts/prompt-builder.d.ts.map +0 -1
  1420. package/dist/ai/prompts/prompt-builder.js +0 -295
  1421. package/dist/ai/prompts/prompt-builder.js.map +0 -1
  1422. package/dist/ai/prompts/system-prompts.d.ts +0 -41
  1423. package/dist/ai/prompts/system-prompts.d.ts.map +0 -1
  1424. package/dist/ai/prompts/system-prompts.js +0 -512
  1425. package/dist/ai/prompts/system-prompts.js.map +0 -1
  1426. package/dist/ai/provider-factory.d.ts +0 -10
  1427. package/dist/ai/provider-factory.d.ts.map +0 -1
  1428. package/dist/ai/provider-factory.js +0 -49
  1429. package/dist/ai/provider-factory.js.map +0 -1
  1430. package/dist/ai/providers/anthropic-provider.d.ts +0 -24
  1431. package/dist/ai/providers/anthropic-provider.d.ts.map +0 -1
  1432. package/dist/ai/providers/anthropic-provider.js +0 -97
  1433. package/dist/ai/providers/anthropic-provider.js.map +0 -1
  1434. package/dist/ai/providers/ollama-provider.d.ts +0 -13
  1435. package/dist/ai/providers/ollama-provider.d.ts.map +0 -1
  1436. package/dist/ai/providers/ollama-provider.js +0 -16
  1437. package/dist/ai/providers/ollama-provider.js.map +0 -1
  1438. package/dist/ai/providers/openai-provider.d.ts +0 -19
  1439. package/dist/ai/providers/openai-provider.d.ts.map +0 -1
  1440. package/dist/ai/providers/openai-provider.js +0 -84
  1441. package/dist/ai/providers/openai-provider.js.map +0 -1
  1442. package/dist/ai/schemas/ai-response-schemas.d.ts +0 -340
  1443. package/dist/ai/schemas/ai-response-schemas.d.ts.map +0 -1
  1444. package/dist/ai/schemas/ai-response-schemas.js +0 -278
  1445. package/dist/ai/schemas/ai-response-schemas.js.map +0 -1
  1446. package/dist/ai/types.d.ts +0 -76
  1447. package/dist/ai/types.d.ts.map +0 -1
  1448. package/dist/ai/types.js +0 -49
  1449. package/dist/ai/types.js.map +0 -1
  1450. package/dist/ai/validation/index.d.ts +0 -2
  1451. package/dist/ai/validation/index.d.ts.map +0 -1
  1452. package/dist/ai/validation/index.js +0 -2
  1453. package/dist/ai/validation/index.js.map +0 -1
  1454. package/dist/ai/validation/task-validator.d.ts +0 -37
  1455. package/dist/ai/validation/task-validator.d.ts.map +0 -1
  1456. package/dist/ai/validation/task-validator.js +0 -81
  1457. package/dist/ai/validation/task-validator.js.map +0 -1
  1458. package/dist/cli/commands/config.d.ts +0 -8
  1459. package/dist/cli/commands/config.d.ts.map +0 -1
  1460. package/dist/cli/commands/config.js +0 -224
  1461. package/dist/cli/commands/config.js.map +0 -1
  1462. package/dist/cli/commands/estimate.d.ts +0 -3
  1463. package/dist/cli/commands/estimate.d.ts.map +0 -1
  1464. package/dist/cli/commands/estimate.js +0 -368
  1465. package/dist/cli/commands/estimate.js.map +0 -1
  1466. package/dist/cli/commands/init.d.ts +0 -9
  1467. package/dist/cli/commands/init.d.ts.map +0 -1
  1468. package/dist/cli/commands/init.js +0 -166
  1469. package/dist/cli/commands/init.js.map +0 -1
  1470. package/dist/cli/commands/pipeline.d.ts +0 -3
  1471. package/dist/cli/commands/pipeline.d.ts.map +0 -1
  1472. package/dist/cli/commands/pipeline.js +0 -59
  1473. package/dist/cli/commands/pipeline.js.map +0 -1
  1474. package/dist/cli/commands/plan.d.ts +0 -15
  1475. package/dist/cli/commands/plan.d.ts.map +0 -1
  1476. package/dist/cli/commands/plan.js +0 -444
  1477. package/dist/cli/commands/plan.js.map +0 -1
  1478. package/dist/cli/commands/refine.d.ts +0 -10
  1479. package/dist/cli/commands/refine.d.ts.map +0 -1
  1480. package/dist/cli/commands/refine.js +0 -226
  1481. package/dist/cli/commands/refine.js.map +0 -1
  1482. package/dist/cli/commands/revise.d.ts +0 -24
  1483. package/dist/cli/commands/revise.d.ts.map +0 -1
  1484. package/dist/cli/commands/revise.js +0 -572
  1485. package/dist/cli/commands/revise.js.map +0 -1
  1486. package/dist/cli/helpers/task-creation.d.ts +0 -89
  1487. package/dist/cli/helpers/task-creation.d.ts.map +0 -1
  1488. package/dist/cli/helpers/task-creation.js +0 -139
  1489. package/dist/cli/helpers/task-creation.js.map +0 -1
  1490. package/dist/services/ai-service.d.ts +0 -77
  1491. package/dist/services/ai-service.d.ts.map +0 -1
  1492. package/dist/services/ai-service.js +0 -241
  1493. package/dist/services/ai-service.js.map +0 -1
  1494. package/dist/services/artifact-gathering.d.ts +0 -55
  1495. package/dist/services/artifact-gathering.d.ts.map +0 -1
  1496. package/dist/services/artifact-gathering.js +0 -147
  1497. package/dist/services/artifact-gathering.js.map +0 -1
  1498. package/dist/services/operate/advisors.d.ts +0 -625
  1499. package/dist/services/operate/advisors.d.ts.map +0 -1
  1500. package/dist/services/operate/advisors.js +0 -1545
  1501. package/dist/services/operate/advisors.js.map +0 -1
  1502. package/dist/services/operate/artifact-route-generation.d.ts +0 -111
  1503. package/dist/services/operate/artifact-route-generation.d.ts.map +0 -1
  1504. package/dist/services/operate/artifact-route-generation.js +0 -460
  1505. package/dist/services/operate/artifact-route-generation.js.map +0 -1
  1506. package/dist/services/operate/artifacts.d.ts +0 -66
  1507. package/dist/services/operate/artifacts.d.ts.map +0 -1
  1508. package/dist/services/operate/artifacts.js +0 -336
  1509. package/dist/services/operate/artifacts.js.map +0 -1
  1510. package/dist/services/operate/cadence.d.ts +0 -50
  1511. package/dist/services/operate/cadence.d.ts.map +0 -1
  1512. package/dist/services/operate/cadence.js +0 -56
  1513. package/dist/services/operate/cadence.js.map +0 -1
  1514. package/dist/services/operate/canonical.d.ts +0 -18
  1515. package/dist/services/operate/canonical.d.ts.map +0 -1
  1516. package/dist/services/operate/canonical.js +0 -157
  1517. package/dist/services/operate/canonical.js.map +0 -1
  1518. package/dist/services/operate/citation-resolution.d.ts +0 -161
  1519. package/dist/services/operate/citation-resolution.d.ts.map +0 -1
  1520. package/dist/services/operate/citation-resolution.js +0 -593
  1521. package/dist/services/operate/citation-resolution.js.map +0 -1
  1522. package/dist/services/operate/completion.d.ts +0 -80
  1523. package/dist/services/operate/completion.d.ts.map +0 -1
  1524. package/dist/services/operate/completion.js +0 -279
  1525. package/dist/services/operate/completion.js.map +0 -1
  1526. package/dist/services/operate/config.d.ts +0 -154
  1527. package/dist/services/operate/config.d.ts.map +0 -1
  1528. package/dist/services/operate/config.js +0 -791
  1529. package/dist/services/operate/config.js.map +0 -1
  1530. package/dist/services/operate/consolidation.d.ts +0 -18
  1531. package/dist/services/operate/consolidation.d.ts.map +0 -1
  1532. package/dist/services/operate/consolidation.js +0 -539
  1533. package/dist/services/operate/consolidation.js.map +0 -1
  1534. package/dist/services/operate/context-research.d.ts +0 -84
  1535. package/dist/services/operate/context-research.d.ts.map +0 -1
  1536. package/dist/services/operate/context-research.js +0 -448
  1537. package/dist/services/operate/context-research.js.map +0 -1
  1538. package/dist/services/operate/decision-brief.d.ts +0 -237
  1539. package/dist/services/operate/decision-brief.d.ts.map +0 -1
  1540. package/dist/services/operate/decision-brief.js +0 -368
  1541. package/dist/services/operate/decision-brief.js.map +0 -1
  1542. package/dist/services/operate/doctor.d.ts +0 -85
  1543. package/dist/services/operate/doctor.d.ts.map +0 -1
  1544. package/dist/services/operate/doctor.js +0 -1070
  1545. package/dist/services/operate/doctor.js.map +0 -1
  1546. package/dist/services/operate/drafts.d.ts +0 -48
  1547. package/dist/services/operate/drafts.d.ts.map +0 -1
  1548. package/dist/services/operate/drafts.js +0 -398
  1549. package/dist/services/operate/drafts.js.map +0 -1
  1550. package/dist/services/operate/engine.d.ts +0 -151
  1551. package/dist/services/operate/engine.d.ts.map +0 -1
  1552. package/dist/services/operate/engine.js +0 -1896
  1553. package/dist/services/operate/engine.js.map +0 -1
  1554. package/dist/services/operate/event-store.d.ts +0 -113
  1555. package/dist/services/operate/event-store.d.ts.map +0 -1
  1556. package/dist/services/operate/event-store.js +0 -384
  1557. package/dist/services/operate/event-store.js.map +0 -1
  1558. package/dist/services/operate/evidence-cache.d.ts +0 -41
  1559. package/dist/services/operate/evidence-cache.d.ts.map +0 -1
  1560. package/dist/services/operate/evidence-cache.js +0 -193
  1561. package/dist/services/operate/evidence-cache.js.map +0 -1
  1562. package/dist/services/operate/evidence-import.d.ts +0 -40
  1563. package/dist/services/operate/evidence-import.d.ts.map +0 -1
  1564. package/dist/services/operate/evidence-import.js +0 -340
  1565. package/dist/services/operate/evidence-import.js.map +0 -1
  1566. package/dist/services/operate/evidence.d.ts +0 -21
  1567. package/dist/services/operate/evidence.d.ts.map +0 -1
  1568. package/dist/services/operate/evidence.js +0 -20
  1569. package/dist/services/operate/evidence.js.map +0 -1
  1570. package/dist/services/operate/ids.d.ts +0 -7
  1571. package/dist/services/operate/ids.d.ts.map +0 -1
  1572. package/dist/services/operate/ids.js +0 -23
  1573. package/dist/services/operate/ids.js.map +0 -1
  1574. package/dist/services/operate/index.d.ts +0 -16
  1575. package/dist/services/operate/index.d.ts.map +0 -1
  1576. package/dist/services/operate/index.js +0 -1864
  1577. package/dist/services/operate/index.js.map +0 -1
  1578. package/dist/services/operate/integrity.d.ts +0 -81
  1579. package/dist/services/operate/integrity.d.ts.map +0 -1
  1580. package/dist/services/operate/integrity.js +0 -152
  1581. package/dist/services/operate/integrity.js.map +0 -1
  1582. package/dist/services/operate/interaction/action-service.d.ts +0 -34
  1583. package/dist/services/operate/interaction/action-service.d.ts.map +0 -1
  1584. package/dist/services/operate/interaction/action-service.js +0 -103
  1585. package/dist/services/operate/interaction/action-service.js.map +0 -1
  1586. package/dist/services/operate/interaction/answer-service.d.ts +0 -40
  1587. package/dist/services/operate/interaction/answer-service.d.ts.map +0 -1
  1588. package/dist/services/operate/interaction/answer-service.js +0 -317
  1589. package/dist/services/operate/interaction/answer-service.js.map +0 -1
  1590. package/dist/services/operate/interaction/charter-suggestions.d.ts +0 -29
  1591. package/dist/services/operate/interaction/charter-suggestions.d.ts.map +0 -1
  1592. package/dist/services/operate/interaction/charter-suggestions.js +0 -104
  1593. package/dist/services/operate/interaction/charter-suggestions.js.map +0 -1
  1594. package/dist/services/operate/interaction/confirmation-service.d.ts +0 -30
  1595. package/dist/services/operate/interaction/confirmation-service.d.ts.map +0 -1
  1596. package/dist/services/operate/interaction/confirmation-service.js +0 -78
  1597. package/dist/services/operate/interaction/confirmation-service.js.map +0 -1
  1598. package/dist/services/operate/interaction/initialization-replay.d.ts +0 -9
  1599. package/dist/services/operate/interaction/initialization-replay.d.ts.map +0 -1
  1600. package/dist/services/operate/interaction/initialization-replay.js +0 -64
  1601. package/dist/services/operate/interaction/initialization-replay.js.map +0 -1
  1602. package/dist/services/operate/interaction/question-engine.d.ts +0 -41
  1603. package/dist/services/operate/interaction/question-engine.d.ts.map +0 -1
  1604. package/dist/services/operate/interaction/question-engine.js +0 -434
  1605. package/dist/services/operate/interaction/question-engine.js.map +0 -1
  1606. package/dist/services/operate/interaction/question-registry.d.ts +0 -52
  1607. package/dist/services/operate/interaction/question-registry.d.ts.map +0 -1
  1608. package/dist/services/operate/interaction/question-registry.js +0 -305
  1609. package/dist/services/operate/interaction/question-registry.js.map +0 -1
  1610. package/dist/services/operate/interaction/session-service.d.ts +0 -55
  1611. package/dist/services/operate/interaction/session-service.d.ts.map +0 -1
  1612. package/dist/services/operate/interaction/session-service.js +0 -304
  1613. package/dist/services/operate/interaction/session-service.js.map +0 -1
  1614. package/dist/services/operate/interaction/terminal-renderer.d.ts +0 -19
  1615. package/dist/services/operate/interaction/terminal-renderer.d.ts.map +0 -1
  1616. package/dist/services/operate/interaction/terminal-renderer.js +0 -124
  1617. package/dist/services/operate/interaction/terminal-renderer.js.map +0 -1
  1618. package/dist/services/operate/journal.d.ts +0 -34
  1619. package/dist/services/operate/journal.d.ts.map +0 -1
  1620. package/dist/services/operate/journal.js +0 -235
  1621. package/dist/services/operate/journal.js.map +0 -1
  1622. package/dist/services/operate/legacy-import-service.d.ts +0 -58
  1623. package/dist/services/operate/legacy-import-service.d.ts.map +0 -1
  1624. package/dist/services/operate/legacy-import-service.js +0 -922
  1625. package/dist/services/operate/legacy-import-service.js.map +0 -1
  1626. package/dist/services/operate/lifecycle-driver.d.ts +0 -309
  1627. package/dist/services/operate/lifecycle-driver.d.ts.map +0 -1
  1628. package/dist/services/operate/lifecycle-driver.js +0 -434
  1629. package/dist/services/operate/lifecycle-driver.js.map +0 -1
  1630. package/dist/services/operate/lifecycle.d.ts +0 -96
  1631. package/dist/services/operate/lifecycle.d.ts.map +0 -1
  1632. package/dist/services/operate/lifecycle.js +0 -596
  1633. package/dist/services/operate/lifecycle.js.map +0 -1
  1634. package/dist/services/operate/lock-service.d.ts +0 -37
  1635. package/dist/services/operate/lock-service.d.ts.map +0 -1
  1636. package/dist/services/operate/lock-service.js +0 -215
  1637. package/dist/services/operate/lock-service.js.map +0 -1
  1638. package/dist/services/operate/maintenance.d.ts +0 -139
  1639. package/dist/services/operate/maintenance.d.ts.map +0 -1
  1640. package/dist/services/operate/maintenance.js +0 -2200
  1641. package/dist/services/operate/maintenance.js.map +0 -1
  1642. package/dist/services/operate/migration.d.ts +0 -68
  1643. package/dist/services/operate/migration.d.ts.map +0 -1
  1644. package/dist/services/operate/migration.js +0 -243
  1645. package/dist/services/operate/migration.js.map +0 -1
  1646. package/dist/services/operate/mission-dispatch.d.ts +0 -271
  1647. package/dist/services/operate/mission-dispatch.d.ts.map +0 -1
  1648. package/dist/services/operate/mission-dispatch.js +0 -590
  1649. package/dist/services/operate/mission-dispatch.js.map +0 -1
  1650. package/dist/services/operate/outcomes.d.ts +0 -48
  1651. package/dist/services/operate/outcomes.d.ts.map +0 -1
  1652. package/dist/services/operate/outcomes.js +0 -312
  1653. package/dist/services/operate/outcomes.js.map +0 -1
  1654. package/dist/services/operate/pipeline-handoff.d.ts +0 -138
  1655. package/dist/services/operate/pipeline-handoff.d.ts.map +0 -1
  1656. package/dist/services/operate/pipeline-handoff.js +0 -175
  1657. package/dist/services/operate/pipeline-handoff.js.map +0 -1
  1658. package/dist/services/operate/profile-migration.d.ts +0 -69
  1659. package/dist/services/operate/profile-migration.d.ts.map +0 -1
  1660. package/dist/services/operate/profile-migration.js +0 -462
  1661. package/dist/services/operate/profile-migration.js.map +0 -1
  1662. package/dist/services/operate/projection-persistence.d.ts +0 -126
  1663. package/dist/services/operate/projection-persistence.d.ts.map +0 -1
  1664. package/dist/services/operate/projection-persistence.js +0 -752
  1665. package/dist/services/operate/projection-persistence.js.map +0 -1
  1666. package/dist/services/operate/projection.d.ts +0 -37
  1667. package/dist/services/operate/projection.d.ts.map +0 -1
  1668. package/dist/services/operate/projection.js +0 -209
  1669. package/dist/services/operate/projection.js.map +0 -1
  1670. package/dist/services/operate/protocol.d.ts +0 -86
  1671. package/dist/services/operate/protocol.d.ts.map +0 -1
  1672. package/dist/services/operate/protocol.js +0 -76
  1673. package/dist/services/operate/protocol.js.map +0 -1
  1674. package/dist/services/operate/read-only-providers.d.ts +0 -76
  1675. package/dist/services/operate/read-only-providers.d.ts.map +0 -1
  1676. package/dist/services/operate/read-only-providers.js +0 -421
  1677. package/dist/services/operate/read-only-providers.js.map +0 -1
  1678. package/dist/services/operate/redaction.d.ts +0 -74
  1679. package/dist/services/operate/redaction.d.ts.map +0 -1
  1680. package/dist/services/operate/redaction.js +0 -406
  1681. package/dist/services/operate/redaction.js.map +0 -1
  1682. package/dist/services/operate/reducer.d.ts +0 -10
  1683. package/dist/services/operate/reducer.d.ts.map +0 -1
  1684. package/dist/services/operate/reducer.js +0 -11
  1685. package/dist/services/operate/reducer.js.map +0 -1
  1686. package/dist/services/operate/report-html.d.ts +0 -32
  1687. package/dist/services/operate/report-html.d.ts.map +0 -1
  1688. package/dist/services/operate/report-html.js +0 -289
  1689. package/dist/services/operate/report-html.js.map +0 -1
  1690. package/dist/services/operate/reports.d.ts +0 -72
  1691. package/dist/services/operate/reports.d.ts.map +0 -1
  1692. package/dist/services/operate/reports.js +0 -481
  1693. package/dist/services/operate/reports.js.map +0 -1
  1694. package/dist/services/operate/routes.d.ts +0 -133
  1695. package/dist/services/operate/routes.d.ts.map +0 -1
  1696. package/dist/services/operate/routes.js +0 -1577
  1697. package/dist/services/operate/routes.js.map +0 -1
  1698. package/dist/services/operate/scratch.d.ts +0 -81
  1699. package/dist/services/operate/scratch.d.ts.map +0 -1
  1700. package/dist/services/operate/scratch.js +0 -190
  1701. package/dist/services/operate/scratch.js.map +0 -1
  1702. package/dist/services/operate/shipment-observer.d.ts +0 -14
  1703. package/dist/services/operate/shipment-observer.d.ts.map +0 -1
  1704. package/dist/services/operate/shipment-observer.js +0 -320
  1705. package/dist/services/operate/shipment-observer.js.map +0 -1
  1706. package/dist/services/operate/stalled-item-service.d.ts +0 -18
  1707. package/dist/services/operate/stalled-item-service.d.ts.map +0 -1
  1708. package/dist/services/operate/stalled-item-service.js +0 -121
  1709. package/dist/services/operate/stalled-item-service.js.map +0 -1
  1710. package/dist/services/operate/subprocess-env.d.ts +0 -4
  1711. package/dist/services/operate/subprocess-env.d.ts.map +0 -1
  1712. package/dist/services/operate/subprocess-env.js +0 -45
  1713. package/dist/services/operate/subprocess-env.js.map +0 -1
  1714. package/dist/services/operate/types.d.ts +0 -1064
  1715. package/dist/services/operate/types.d.ts.map +0 -1
  1716. package/dist/services/operate/types.js +0 -27
  1717. package/dist/services/operate/types.js.map +0 -1
  1718. package/dist/services/operate/workspace.d.ts +0 -76
  1719. package/dist/services/operate/workspace.d.ts.map +0 -1
  1720. package/dist/services/operate/workspace.js +0 -350
  1721. package/dist/services/operate/workspace.js.map +0 -1
  1722. package/dist/services/revise-service.d.ts +0 -115
  1723. package/dist/services/revise-service.d.ts.map +0 -1
  1724. package/dist/services/revise-service.js +0 -294
  1725. package/dist/services/revise-service.js.map +0 -1
  1726. package/dist/templates/rules/claude/planr-pipeline.md.hbs +0 -69
  1727. package/dist/templates/rules/codex/_pipeline-section.md.hbs +0 -154
  1728. package/dist/templates/rules/cursor/agents/backend-agent.md +0 -299
  1729. package/dist/templates/rules/cursor/agents/db-agent.md +0 -163
  1730. package/dist/templates/rules/cursor/agents/designer-agent.md +0 -219
  1731. package/dist/templates/rules/cursor/agents/devops-agent.md +0 -197
  1732. package/dist/templates/rules/cursor/agents/doc-gen-agent.md +0 -203
  1733. package/dist/templates/rules/cursor/agents/frontend-agent.md +0 -220
  1734. package/dist/templates/rules/cursor/agents/qa-agent.md +0 -170
  1735. package/dist/templates/rules/cursor/agents/specification-agent.md +0 -282
  1736. package/dist/templates/rules/cursor/planr-pipeline-plan.mdc.hbs +0 -196
  1737. package/dist/templates/rules/cursor/planr-pipeline-ship.mdc.hbs +0 -246
  1738. package/dist/templates/rules/cursor/planr-pipeline.mdc.hbs +0 -134
@@ -1,17 +1,36 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  import { createHash } from 'node:crypto';
3
- import { existsSync, readFileSync } from 'node:fs';
4
- import { copyFile, mkdir, open, readFile, rename, rm, unlink, writeFile } from 'node:fs/promises';
3
+ import { existsSync, constants as fsConstants, lstatSync, readdirSync, readFileSync, realpathSync, } from 'node:fs';
4
+ import { mkdir, open, readFile, rename, rm, unlink, writeFile } from 'node:fs/promises';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
7
8
  import { spliceManagedBlock } from '../utils/splice-managed-block.js';
8
- import { applyClaudePluginIntegration, inspectClaudePluginIntegration, OPENPLANR_SKILLS_VERSION, } from './claude-plugin-service.js';
9
- import { diagnoseOperatingBoard } from './operate/doctor.js';
10
- import { purgeAbandonedOperatingScratch } from './operate/maintenance.js';
11
- import { listAbandonedOperatingScratch, } from './operate/scratch.js';
12
- import { resolveOperatingPaths } from './operate/workspace.js';
9
+ import { applyBundledClaudePluginIntegration, inspectBundledClaudePluginIntegration, } from './claude-plugin-service.js';
10
+ import { applyCodexPluginIntegration, inspectCodexPluginIntegration, } from './codex-plugin-service.js';
13
11
  import { resolvePipelinePackage } from './pipeline-package-service.js';
14
12
  import { readOpenPlanrVersion } from './provenance-service.js';
13
+ import { classifyComponentDrift as classifyRuntimeComponentDrift, diagnoseManagedRuntimeFiles, diagnoseRuntimeProvenance, } from './runtime-manager/doctor.js';
14
+ import { migrateLegacyGlobalRuntimeState, } from './runtime-manager/global-state.js';
15
+ import { inventoryManagedSkillFiles, planCodexUserBundleTransition, } from './runtime-manager/install-plan.js';
16
+ import { detectInstalledRuntimes, inspectRuntimeProjectContext, listInstalledRuntimeAdapters, } from './runtime-manager/inventory.js';
17
+ export { classifyComponentDrift } from './runtime-manager/doctor.js';
18
+ const RETIRED_CURSOR_WORKFLOW_RULES = [
19
+ 'planr-pipeline.mdc',
20
+ 'planr-pipeline-plan.mdc',
21
+ 'planr-pipeline-ship.mdc',
22
+ ];
23
+ const RETIRED_CURSOR_AGENT_RULES = [
24
+ 'backend-agent.md',
25
+ 'db-agent.md',
26
+ 'designer-agent.md',
27
+ 'devops-agent.md',
28
+ 'doc-gen-agent.md',
29
+ 'entity-scaffold-agent.md',
30
+ 'frontend-agent.md',
31
+ 'qa-agent.md',
32
+ 'specification-agent.md',
33
+ ];
15
34
  export class RuntimeManagerError extends Error {
16
35
  code;
17
36
  recovery;
@@ -25,40 +44,6 @@ export class RuntimeManagerError extends Error {
25
44
  return { ok: false, code: this.code, problem: this.message, recovery: this.recovery };
26
45
  }
27
46
  }
28
- const executable = {
29
- 'claude-code': 'claude',
30
- codex: 'codex',
31
- cursor: 'cursor',
32
- };
33
- const skillNames = [
34
- 'planr-plan',
35
- 'planr-design',
36
- 'planr-ship',
37
- 'planr-dashboard',
38
- 'planr-sync',
39
- 'planr-doctor',
40
- 'planr-artifact',
41
- 'planr-operate',
42
- ];
43
- /**
44
- * FR5: derive an installed command/skill name from the persisted prefix choice.
45
- * `bare` strips the leading `planr-` namespace (`planr-plan` → `plan`); `namespaced`
46
- * keeps today's names verbatim, so an install that never opts in is byte-identical
47
- * to before this toggle existed.
48
- */
49
- function applyCommandPrefix(name, commandPrefix) {
50
- return commandPrefix === 'bare' && name.startsWith('planr-') ? name.slice('planr-'.length) : name;
51
- }
52
- /**
53
- * Rewrite only the frontmatter `name:` line of a copied Codex skill so its embedded
54
- * identifier matches the bare install directory. The match is anchored to the line
55
- * start and consumes the whole `planr-…` name, so a `planr-` mention elsewhere in the
56
- * body is never touched; a non-global replace only rewrites the first (frontmatter)
57
- * line.
58
- */
59
- function rewriteSkillFrontmatterName(content, installName) {
60
- return content.replace(/^name:[ \t]*planr-[\w-]+[ \t]*$/mu, `name: ${installName}`);
61
- }
62
47
  function hash(value) {
63
48
  return createHash('sha256').update(value).digest('hex');
64
49
  }
@@ -75,8 +60,19 @@ function managedBlockBytes(content, marker = 'runtime') {
75
60
  function ownershipHash(content, kind, marker) {
76
61
  return hash(kind === 'managed-block' ? managedBlockBytes(content, marker) : content);
77
62
  }
63
+ function canonicalProjectPath(projectDir) {
64
+ const resolved = path.resolve(projectDir);
65
+ try {
66
+ return realpathSync(resolved);
67
+ }
68
+ catch (cause) {
69
+ if (cause.code === 'ENOENT')
70
+ return resolved;
71
+ throw cause;
72
+ }
73
+ }
78
74
  function projectKey(projectDir) {
79
- return hash(path.resolve(projectDir)).slice(0, 16);
75
+ return hash(canonicalProjectPath(projectDir)).slice(0, 16);
80
76
  }
81
77
  export function runtimeRoot() {
82
78
  return path.join(userHome(), '.planr', 'runtime');
@@ -87,38 +83,451 @@ function userHome() {
87
83
  function statePath() {
88
84
  return path.join(runtimeRoot(), 'state.json');
89
85
  }
90
- function detectCommand(command) {
91
- const result = spawnSync(command, ['--version'], { encoding: 'utf8', windowsHide: true });
92
- return !result.error && result.status === 0;
86
+ function codexSkillsRoot() {
87
+ return path.join(userHome(), '.codex', 'skills');
93
88
  }
94
- export function inspectProjectContext(projectDir) {
95
- const resolved = path.resolve(projectDir);
96
- if (existsSync(path.join(resolved, '.planr', 'config.json'))) {
97
- return { valid: true, path: resolved, reason: 'planr' };
89
+ function backupsRoot() {
90
+ return path.join(userHome(), '.planr', 'backups');
91
+ }
92
+ function projectBackupsRoot(projectDir) {
93
+ return path.join(backupsRoot(), projectKey(projectDir));
94
+ }
95
+ function pathIsWithin(candidate, root) {
96
+ const relative = path.relative(path.resolve(root), path.resolve(candidate));
97
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
98
+ }
99
+ function assertApprovedTargetCustody(target, approvedRoot, anchor, code, label) {
100
+ const selected = path.resolve(target);
101
+ const root = path.resolve(approvedRoot);
102
+ const boundary = path.resolve(anchor);
103
+ if (!pathIsWithin(selected, root) || !pathIsWithin(root, boundary)) {
104
+ throw new RuntimeManagerError(code, `${label} target ${selected} leaves its approved root ${root}.`, 'Restore valid runtime ownership state and keep managed targets inside the exact approved bundle root.');
105
+ }
106
+ let canonicalBoundary;
107
+ try {
108
+ const boundaryMetadata = lstatSync(boundary);
109
+ if (boundaryMetadata.isSymbolicLink() || !boundaryMetadata.isDirectory())
110
+ throw new Error('invalid boundary');
111
+ canonicalBoundary = realpathSync(boundary);
112
+ }
113
+ catch (cause) {
114
+ if (cause.code === 'ENOENT')
115
+ return;
116
+ throw new RuntimeManagerError(code, `${label} boundary ${boundary} is unavailable, non-directory, or symbolic.`, 'Use one real user/project root and replace symbolic managed-root parents before retrying.');
117
+ }
118
+ let current = boundary;
119
+ const segments = path.relative(boundary, selected).split(path.sep).filter(Boolean);
120
+ for (const [index, segment] of segments.entries()) {
121
+ current = path.join(current, segment);
122
+ let metadata;
123
+ try {
124
+ metadata = lstatSync(current);
125
+ }
126
+ catch (cause) {
127
+ if (cause.code === 'ENOENT')
128
+ return;
129
+ throw cause;
130
+ }
131
+ if (metadata.isSymbolicLink()) {
132
+ throw new RuntimeManagerError(code, `${label} target ${selected} traverses symbolic component ${current}.`, 'Replace symbolic managed-root parents with real directories before retrying.');
133
+ }
134
+ const isLeaf = index === segments.length - 1;
135
+ if (!isLeaf && !metadata.isDirectory()) {
136
+ throw new RuntimeManagerError(code, `${label} target ${selected} traverses non-directory component ${current}.`, 'Repair the managed bundle root before retrying.');
137
+ }
138
+ const canonical = realpathSync(current);
139
+ if (canonical !== canonicalBoundary &&
140
+ !canonical.startsWith(`${canonicalBoundary}${path.sep}`)) {
141
+ throw new RuntimeManagerError(code, `${label} target ${selected} escapes its canonical boundary.`, 'Repair the managed bundle root before retrying.');
142
+ }
143
+ }
144
+ }
145
+ function assertMutableOwnedTarget(target, projectDir, code) {
146
+ if (pathIsWithin(target, runtimeRoot())) {
147
+ assertApprovedTargetCustody(target, runtimeRoot(), userHome(), code, 'Global runtime ownership');
148
+ return;
149
+ }
150
+ if (pathIsWithin(target, codexSkillsRoot())) {
151
+ assertApprovedTargetCustody(target, codexSkillsRoot(), userHome(), code, 'Global Codex bundle ownership');
152
+ return;
153
+ }
154
+ if (pathIsWithin(target, projectDir)) {
155
+ assertApprovedTargetCustody(target, projectDir, projectDir, code, 'Project runtime ownership');
156
+ return;
157
+ }
158
+ throw new RuntimeManagerError(code, `Managed mutation target ${path.resolve(target)} is outside every approved runtime root.`, 'Restore a valid ownership/backup manifest before retrying.');
159
+ }
160
+ function assertBackupDirectoryCustody(selected, projectDir, code, requireExisting = false) {
161
+ const directory = path.resolve(selected);
162
+ const approvedRoot = path.resolve(projectBackupsRoot(projectDir));
163
+ if (path.dirname(directory) !== approvedRoot) {
164
+ throw new RuntimeManagerError(code, `Runtime backup ${directory} is not one direct child of ${approvedRoot}.`, 'Select only the exact project backup created by OpenPlanr.');
165
+ }
166
+ assertApprovedTargetCustody(directory, approvedRoot, userHome(), code, 'Runtime backup');
167
+ if (requireExisting) {
168
+ let metadata;
169
+ try {
170
+ metadata = lstatSync(directory);
171
+ }
172
+ catch {
173
+ throw new RuntimeManagerError(code, `Runtime backup ${directory} is unavailable.`);
174
+ }
175
+ if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
176
+ throw new RuntimeManagerError(code, `Runtime backup ${directory} is not one real directory.`);
177
+ }
178
+ }
179
+ return directory;
180
+ }
181
+ function backupEntryPath(directory, index, target) {
182
+ return path.join(directory, 'files', `${String(index).padStart(3, '0')}-${path.basename(target)}`);
183
+ }
184
+ function backupManifestIdentity(manifest) {
185
+ return `sha256:${hash(JSON.stringify({
186
+ schemaVersion: manifest.schemaVersion,
187
+ projectDir: manifest.projectDir,
188
+ createdAt: manifest.createdAt,
189
+ files: manifest.files.map(({ target, backup, existed, beforeHash, afterHash }) => ({
190
+ target,
191
+ existed,
192
+ ...(backup ? { backup } : {}),
193
+ ...(beforeHash ? { beforeHash } : {}),
194
+ ...(path.resolve(target) === path.resolve(statePath())
195
+ ? {}
196
+ : { expectedAfterHash: afterHash ?? null }),
197
+ })),
198
+ }))}`;
199
+ }
200
+ function assertClosedBackupManifest(value, directory, projectDir, code, requireFinalStateHash = false) {
201
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
202
+ throw new RuntimeManagerError(code, 'Runtime backup manifest is not one closed object.');
203
+ }
204
+ const manifest = value;
205
+ if (JSON.stringify(Object.keys(manifest).sort()) !==
206
+ JSON.stringify(['createdAt', 'files', 'projectDir', 'schemaVersion']) ||
207
+ manifest.schemaVersion !== '1.0.0' ||
208
+ typeof manifest.projectDir !== 'string' ||
209
+ canonicalProjectPath(manifest.projectDir) !== canonicalProjectPath(projectDir) ||
210
+ typeof manifest.createdAt !== 'string' ||
211
+ manifest.createdAt.length > 64 ||
212
+ Number.isNaN(Date.parse(manifest.createdAt)) ||
213
+ !Array.isArray(manifest.files) ||
214
+ manifest.files.length > 10_000) {
215
+ throw new RuntimeManagerError(code, 'Runtime backup manifest identity is invalid.');
98
216
  }
99
- const git = spawnSync('git', ['rev-parse', '--is-inside-work-tree'], {
100
- cwd: resolved,
101
- encoding: 'utf8',
102
- windowsHide: true,
217
+ const seenTargets = new Set();
218
+ const files = manifest.files.map((candidate, index) => {
219
+ if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate)) {
220
+ throw new RuntimeManagerError(code, 'Runtime backup manifest contains a non-object entry.');
221
+ }
222
+ const entry = candidate;
223
+ const keys = Object.keys(entry).sort();
224
+ if (keys.some((key) => !['afterHash', 'backup', 'beforeHash', 'existed', 'target'].includes(key)) ||
225
+ !keys.includes('existed') ||
226
+ !keys.includes('target') ||
227
+ typeof entry.target !== 'string' ||
228
+ path.resolve(entry.target) !== entry.target ||
229
+ typeof entry.existed !== 'boolean' ||
230
+ (entry.afterHash !== undefined &&
231
+ (typeof entry.afterHash !== 'string' || !/^[a-f0-9]{64}$/u.test(entry.afterHash)))) {
232
+ throw new RuntimeManagerError(code, 'Runtime backup manifest entry is invalid.');
233
+ }
234
+ assertMutableOwnedTarget(entry.target, projectDir, code);
235
+ if (seenTargets.has(entry.target)) {
236
+ throw new RuntimeManagerError(code, `Runtime backup repeats target ${entry.target}.`);
237
+ }
238
+ seenTargets.add(entry.target);
239
+ if (entry.existed) {
240
+ const expected = backupEntryPath(directory, index, entry.target);
241
+ if (typeof entry.backup !== 'string' ||
242
+ path.resolve(entry.backup) !== expected ||
243
+ typeof entry.beforeHash !== 'string' ||
244
+ !/^[a-f0-9]{64}$/u.test(entry.beforeHash)) {
245
+ throw new RuntimeManagerError(code, `Runtime backup source for ${entry.target} is not exactly bound to its manifest slot.`);
246
+ }
247
+ assertApprovedTargetCustody(entry.backup, path.join(directory, 'files'), directory, code, 'Runtime backup file');
248
+ }
249
+ else if (entry.backup !== undefined || entry.beforeHash !== undefined) {
250
+ throw new RuntimeManagerError(code, `Runtime backup records bytes for absent target ${entry.target}.`);
251
+ }
252
+ return {
253
+ target: entry.target,
254
+ existed: entry.existed,
255
+ ...(typeof entry.backup === 'string' ? { backup: entry.backup } : {}),
256
+ ...(typeof entry.beforeHash === 'string' ? { beforeHash: entry.beforeHash } : {}),
257
+ ...(typeof entry.afterHash === 'string' ? { afterHash: entry.afterHash } : {}),
258
+ };
103
259
  });
104
- if (!git.error && git.status === 0 && git.stdout.trim() === 'true') {
105
- return { valid: true, path: resolved, reason: 'git' };
260
+ const stateEntries = files.filter((entry) => path.resolve(entry.target) === path.resolve(statePath()));
261
+ if (files.length === 0 || stateEntries.length !== 1) {
262
+ throw new RuntimeManagerError(code, 'Runtime backup manifest must bind exactly one global ownership-state target.');
263
+ }
264
+ const [stateEntry] = stateEntries;
265
+ if ((requireFinalStateHash && !stateEntry.afterHash) ||
266
+ (!stateEntry.existed && files.every((entry) => entry === stateEntry))) {
267
+ throw new RuntimeManagerError(code, 'Runtime backup manifest does not bind one complete setup transition.');
268
+ }
269
+ return {
270
+ schemaVersion: '1.0.0',
271
+ projectDir: manifest.projectDir,
272
+ createdAt: manifest.createdAt,
273
+ files,
274
+ };
275
+ }
276
+ function assertClosedBackupTree(directory, manifest, projectDir, code) {
277
+ assertBackupDirectoryCustody(directory, projectDir, code, true);
278
+ const expectedFiles = new Set([
279
+ path.join(directory, 'migration-manifest.json'),
280
+ ...manifest.files.flatMap((entry) => (entry.backup ? [entry.backup] : [])),
281
+ ].map((entry) => path.resolve(entry)));
282
+ const actualFiles = new Set();
283
+ const walk = (current) => {
284
+ assertApprovedTargetCustody(current, directory, userHome(), code, 'Runtime backup tree');
285
+ for (const entry of readdirSync(current, { withFileTypes: true })) {
286
+ const absolute = path.join(current, entry.name);
287
+ const metadata = lstatSync(absolute);
288
+ if (metadata.isSymbolicLink() || (!metadata.isDirectory() && !metadata.isFile())) {
289
+ throw new RuntimeManagerError(code, `Runtime backup tree contains an unsupported entry at ${absolute}.`);
290
+ }
291
+ if (metadata.isDirectory())
292
+ walk(absolute);
293
+ else
294
+ actualFiles.add(path.resolve(absolute));
295
+ }
296
+ };
297
+ walk(directory);
298
+ if (actualFiles.size !== expectedFiles.size ||
299
+ [...actualFiles].some((entry) => !expectedFiles.has(entry))) {
300
+ throw new RuntimeManagerError(code, 'Runtime backup tree does not exactly match its closed manifest.');
301
+ }
302
+ }
303
+ async function readCustodiedRegularFile(target, custody, code, label, maxBytes = 64 * 1024 * 1024) {
304
+ custody();
305
+ let handle;
306
+ try {
307
+ handle = await open(target, fsConstants.O_RDONLY | (fsConstants.O_NOFOLLOW ?? 0));
308
+ }
309
+ catch (cause) {
310
+ throw new RuntimeManagerError(code, `${label} ${target} cannot be opened as a real file: ${cause instanceof Error ? cause.message : String(cause)}`);
311
+ }
312
+ try {
313
+ const metadata = await handle.stat();
314
+ if (!metadata.isFile() || metadata.size > maxBytes) {
315
+ throw new RuntimeManagerError(code, `${label} ${target} is not one bounded regular file.`);
316
+ }
317
+ const bytes = await handle.readFile();
318
+ custody();
319
+ return bytes;
320
+ }
321
+ finally {
322
+ await handle.close();
323
+ }
324
+ }
325
+ async function readBackupEntryBytes(directory, entry, _projectDir, code) {
326
+ if (!entry.backup || !entry.beforeHash) {
327
+ throw new RuntimeManagerError(code, `Runtime backup for ${entry.target} has no byte custody.`);
328
+ }
329
+ const bytes = await readCustodiedRegularFile(entry.backup, () => assertApprovedTargetCustody(entry.backup, path.join(directory, 'files'), directory, code, 'Runtime backup file'), code, 'Runtime backup file');
330
+ if (hash(bytes) !== entry.beforeHash) {
331
+ throw new RuntimeManagerError(code, `Runtime backup bytes for ${entry.target} do not match their recorded hash.`);
332
+ }
333
+ return bytes;
334
+ }
335
+ function assertUserOwnedTarget(file, runtime, code = 'E_RUNTIME_STATE_INVALID') {
336
+ if (pathIsWithin(file.target, runtimeRoot())) {
337
+ assertApprovedTargetCustody(file.target, runtimeRoot(), userHome(), code, 'Global runtime ownership');
338
+ return;
339
+ }
340
+ if (runtime === 'codex' && pathIsWithin(file.target, codexSkillsRoot())) {
341
+ assertApprovedTargetCustody(file.target, codexSkillsRoot(), userHome(), code, 'Global Codex bundle ownership');
342
+ return;
343
+ }
344
+ throw new RuntimeManagerError(code, `Global ${runtime} ownership target ${path.resolve(file.target)} is outside every approved bundle root.`, 'Restore valid global ownership state before setup, rollback, retirement, or removal.');
345
+ }
346
+ function assertActionCustody(actions, projectDir) {
347
+ for (const action of actions) {
348
+ if (action.scope === 'user') {
349
+ assertUserOwnedTarget(action, action.runtime, 'E_MIGRATION_CONFLICT');
350
+ }
351
+ else {
352
+ assertApprovedTargetCustody(action.target, projectDir, projectDir, 'E_MIGRATION_CONFLICT', 'Project runtime ownership');
353
+ }
354
+ }
355
+ }
356
+ function assertRuntimeStateCustody(state) {
357
+ for (const runtime of ['claude-code', 'codex', 'cursor']) {
358
+ for (const file of state.userBundles?.[runtime]?.ownedFiles ?? []) {
359
+ assertUserOwnedTarget(file, runtime);
360
+ }
361
+ }
362
+ for (const project of Object.values(state.projects)) {
363
+ for (const file of project.ownedFiles) {
364
+ const runtime = file.runtime;
365
+ if (file.scope === 'user' || (runtime !== 'core' && isUserOwnedFile(file, runtime))) {
366
+ assertUserOwnedTarget(file, runtime);
367
+ }
368
+ else {
369
+ assertApprovedTargetCustody(file.target, project.projectDir, project.projectDir, 'E_RUNTIME_STATE_INVALID', 'Project runtime ownership');
370
+ }
371
+ }
372
+ }
373
+ }
374
+ function assertRuntimeStateValue(value, code = 'E_RUNTIME_STATE_INVALID', allowLegacyProjectKeys = false) {
375
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
376
+ throw new RuntimeManagerError(code, 'Runtime ownership state is not one closed object.');
106
377
  }
107
- return { valid: false, path: resolved, reason: 'none' };
378
+ const state = value;
379
+ if (Object.keys(state).some((key) => !['projects', 'schemaVersion', 'userBundles'].includes(key)) ||
380
+ !['1.0.0', '2.0.0'].includes(String(state.schemaVersion)) ||
381
+ state.projects === null ||
382
+ typeof state.projects !== 'object' ||
383
+ Array.isArray(state.projects) ||
384
+ (state.userBundles !== undefined &&
385
+ (state.userBundles === null ||
386
+ typeof state.userBundles !== 'object' ||
387
+ Array.isArray(state.userBundles)))) {
388
+ throw new RuntimeManagerError(code, 'Runtime ownership state identity is invalid.');
389
+ }
390
+ const legacyProjectKeysAllowed = allowLegacyProjectKeys && state.schemaVersion === '1.0.0';
391
+ const runtimeIds = new Set(['claude-code', 'codex', 'cursor']);
392
+ const assertOwnedFile = (candidate) => {
393
+ if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate))
394
+ return false;
395
+ const file = candidate;
396
+ return (Object.keys(file).every((key) => ['hash', 'kind', 'marker', 'runtime', 'scope', 'target'].includes(key)) &&
397
+ ['claude-code', 'codex', 'core', 'cursor'].includes(String(file.runtime)) &&
398
+ ['file', 'managed-block'].includes(String(file.kind)) &&
399
+ (file.scope === undefined || ['user', 'project'].includes(String(file.scope))) &&
400
+ (file.marker === undefined || typeof file.marker === 'string') &&
401
+ typeof file.target === 'string' &&
402
+ path.resolve(file.target) === file.target &&
403
+ typeof file.hash === 'string' &&
404
+ /^[a-f0-9]{64}$/u.test(file.hash));
405
+ };
406
+ const canonicalProjects = new Set();
407
+ for (const [key, project] of Object.entries(state.projects)) {
408
+ if (project === null || typeof project !== 'object' || Array.isArray(project)) {
409
+ throw new RuntimeManagerError(code, 'Runtime project ownership record is invalid.');
410
+ }
411
+ const record = project;
412
+ const canonicalProject = typeof record.projectDir === 'string' ? canonicalProjectPath(record.projectDir) : '';
413
+ if (Object.keys(record).some((key) => ![
414
+ 'activeRuntime',
415
+ 'backupDir',
416
+ 'backupManifestHash',
417
+ 'commandPrefix',
418
+ 'ownedFiles',
419
+ 'projectDir',
420
+ 'runtimeScopes',
421
+ 'runtimes',
422
+ 'skillModes',
423
+ 'updatedAt',
424
+ ].includes(key)) ||
425
+ typeof record.projectDir !== 'string' ||
426
+ path.resolve(record.projectDir) !== record.projectDir ||
427
+ (!legacyProjectKeysAllowed && key !== projectKey(canonicalProject)) ||
428
+ canonicalProjects.has(canonicalProject) ||
429
+ typeof record.updatedAt !== 'string' ||
430
+ !Array.isArray(record.runtimes) ||
431
+ record.runtimes.some((runtime) => !runtimeIds.has(runtime)) ||
432
+ !Array.isArray(record.ownedFiles) ||
433
+ record.ownedFiles.some((file) => !assertOwnedFile(file)) ||
434
+ (record.backupDir !== undefined && typeof record.backupDir !== 'string') ||
435
+ (record.backupManifestHash !== undefined &&
436
+ (typeof record.backupManifestHash !== 'string' ||
437
+ !/^sha256:[a-f0-9]{64}$/u.test(record.backupManifestHash))) ||
438
+ (record.commandPrefix !== undefined &&
439
+ !['bare', 'namespaced'].includes(String(record.commandPrefix))) ||
440
+ (record.skillModes !== undefined &&
441
+ (record.skillModes === null ||
442
+ typeof record.skillModes !== 'object' ||
443
+ Array.isArray(record.skillModes) ||
444
+ Object.entries(record.skillModes).some(([runtime, mode]) => !runtimeIds.has(runtime) ||
445
+ !['direct', 'unified-plugin', 'project-rule'].includes(String(mode))))) ||
446
+ (record.activeRuntime !== undefined && !runtimeIds.has(record.activeRuntime))) {
447
+ throw new RuntimeManagerError(code, 'Runtime project ownership record is invalid.');
448
+ }
449
+ canonicalProjects.add(canonicalProject);
450
+ }
451
+ const bundles = (state.userBundles ?? {});
452
+ if (Object.keys(bundles).some((runtime) => !runtimeIds.has(runtime))) {
453
+ throw new RuntimeManagerError(code, 'Runtime global ownership bundle identity is invalid.');
454
+ }
455
+ for (const [runtime, candidate] of Object.entries(bundles)) {
456
+ if (candidate === null || typeof candidate !== 'object' || Array.isArray(candidate)) {
457
+ throw new RuntimeManagerError(code, 'Runtime global ownership bundle is invalid.');
458
+ }
459
+ const bundle = candidate;
460
+ if (Object.keys(bundle).some((key) => ![
461
+ 'commandPrefix',
462
+ 'installMode',
463
+ 'ownedFiles',
464
+ 'pipelineVersion',
465
+ 'runtime',
466
+ 'scope',
467
+ 'updatedAt',
468
+ ].includes(key)) ||
469
+ bundle.runtime !== runtime ||
470
+ bundle.scope !== 'user' ||
471
+ typeof bundle.updatedAt !== 'string' ||
472
+ typeof bundle.pipelineVersion !== 'string' ||
473
+ !['bare', 'namespaced'].includes(String(bundle.commandPrefix)) ||
474
+ (bundle.installMode !== undefined &&
475
+ !['direct', 'unified-plugin', 'project-rule'].includes(String(bundle.installMode))) ||
476
+ !Array.isArray(bundle.ownedFiles) ||
477
+ bundle.ownedFiles.some((file) => !assertOwnedFile(file))) {
478
+ throw new RuntimeManagerError(code, 'Runtime global ownership bundle is invalid.');
479
+ }
480
+ }
481
+ const decoded = value;
482
+ assertRuntimeStateCustody(decoded);
483
+ return decoded;
484
+ }
485
+ function isUserOwnedFile(file, runtime) {
486
+ if (file.scope)
487
+ return file.scope === 'user';
488
+ if (pathIsWithin(file.target, runtimeRoot()))
489
+ return true;
490
+ return runtime === 'codex' && pathIsWithin(file.target, codexSkillsRoot());
491
+ }
492
+ function projectUsesUserRuntime(project, runtime) {
493
+ if (!project.runtimes.includes(runtime))
494
+ return false;
495
+ const recorded = project.runtimeScopes?.[runtime];
496
+ if (recorded)
497
+ return recorded === 'user' || recorded === 'both';
498
+ return project.ownedFiles.some((file) => file.runtime === runtime && isUserOwnedFile(file, runtime));
499
+ }
500
+ function assertRequestedProjectBinding(projectDir, key, project) {
501
+ const canonical = canonicalProjectPath(projectDir);
502
+ if (key !== projectKey(canonical) || canonicalProjectPath(project.projectDir) !== canonical) {
503
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Runtime ownership state is bound to a different canonical project.', 'Repair the project ownership record before preview, rollback, removal, or cleanup.');
504
+ }
505
+ }
506
+ function inferLegacyCodexPrefix(project) {
507
+ if (!projectUsesUserRuntime(project, 'codex'))
508
+ return undefined;
509
+ if (project.commandPrefix)
510
+ return project.commandPrefix;
511
+ const roots = project.ownedFiles
512
+ .filter((file) => file.runtime === 'codex' && pathIsWithin(file.target, codexSkillsRoot()))
513
+ .map((file) => path.relative(codexSkillsRoot(), file.target).split(path.sep)[0])
514
+ .filter(Boolean);
515
+ if (roots.length === 0)
516
+ return 'namespaced';
517
+ const modes = new Set(roots.map((name) => (name.startsWith('planr-') ? 'namespaced' : 'bare')));
518
+ if (modes.size !== 1) {
519
+ throw new RuntimeManagerError('E_RUNTIME_PREFIX_CONFLICT', `Legacy Codex ownership for ${project.projectDir} mixes bare and namespaced skill targets.`, 'Choose one global Codex prefix, move the other skill tree aside, and rerun setup.');
520
+ }
521
+ return [...modes][0];
522
+ }
523
+ export function inspectProjectContext(projectDir) {
524
+ return inspectRuntimeProjectContext(projectDir);
108
525
  }
109
526
  export function detectRuntimes() {
110
- return Object.keys(executable).map((runtime) => ({
111
- runtime,
112
- installed: detectCommand(executable[runtime]),
113
- command: executable[runtime],
114
- }));
527
+ return detectInstalledRuntimes();
115
528
  }
116
529
  export function listRuntimeAdapters() {
117
- const pipeline = resolvePipelinePackage(false);
118
- if (!pipeline)
119
- return [];
120
- const registry = JSON.parse(readFileSync(pipeline.adapterRegistryPath, 'utf8'));
121
- return registry.adapters.map((adapter) => structuredClone(adapter));
530
+ return listInstalledRuntimeAdapters();
122
531
  }
123
532
  function assertNodeVersion() {
124
533
  const major = Number(process.versions.node.split('.')[0]);
@@ -148,20 +557,54 @@ function chooseRuntimes(choice) {
148
557
  return detected;
149
558
  }
150
559
  function readRegistry() {
151
- const pipeline = resolvePipelinePackage();
152
- if (!pipeline)
153
- throw new RuntimeManagerError('E_PIPELINE_NOT_INSTALLED', 'Pipeline missing.');
560
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
561
+ const registryPath = path.join(root, 'lib', 'host-packages', 'adapter-registry.json');
562
+ if (!existsSync(registryPath)) {
563
+ throw new RuntimeManagerError('E_HOST_PACKAGE_MISSING', 'The OpenPlanr host-package inventory is missing.', 'Reinstall the OpenPlanr utility CLI or run the workspace skill generator.');
564
+ }
565
+ const document = JSON.parse(readFileSync(registryPath, 'utf8'));
154
566
  return {
155
- root: pipeline.root,
156
- version: pipeline.version,
157
- registry: JSON.parse(readFileSync(pipeline.adapterRegistryPath, 'utf8')),
567
+ root,
568
+ version: document.pipelineVersion,
569
+ pluginVersion: document.pluginVersion,
570
+ registry: document,
158
571
  };
159
572
  }
160
- function managedContent(text) {
161
- return text
162
- .replace(/^<!-- openplanr:runtime:start -->\s*/m, '')
163
- .replace(/\s*<!-- openplanr:runtime:end -->\s*$/m, '')
164
- .trim();
573
+ function bundledHostRoot(host) {
574
+ const cliRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
575
+ const root = path.join(cliRoot, 'lib', 'host-packages', host);
576
+ if (!existsSync(root) || lstatSync(root).isSymbolicLink() || !lstatSync(root).isDirectory()) {
577
+ throw new RuntimeManagerError('E_HOST_PACKAGE_MISSING', `The bundled ${host} OpenPlanr package is missing or unsafe.`, 'Reinstall the OpenPlanr utility CLI or run the workspace skill generator.');
578
+ }
579
+ return root;
580
+ }
581
+ function bundledSkillAssets(runtime) {
582
+ if (runtime === 'cursor') {
583
+ const rulesRoot = path.join(bundledHostRoot('cursor'), 'openplanr', 'rules');
584
+ return inventoryRegularFiles(rulesRoot).map((absolutePath) => {
585
+ const relativePath = path.relative(rulesRoot, absolutePath);
586
+ const first = relativePath.split(path.sep)[0];
587
+ const skillId = first.endsWith('.mdc') ? first.slice(0, -'.mdc'.length) : first;
588
+ return {
589
+ skillId,
590
+ targetName: skillId,
591
+ relativePath,
592
+ content: readFileSync(absolutePath),
593
+ };
594
+ });
595
+ }
596
+ const host = runtime === 'claude-code' ? 'claude' : 'openai';
597
+ const skillsRoot = path.join(bundledHostRoot(host), 'openplanr', 'skills');
598
+ return inventoryRegularFiles(skillsRoot).map((absolutePath) => {
599
+ const sourcePath = path.relative(skillsRoot, absolutePath);
600
+ const [skillId, ...segments] = sourcePath.split(path.sep);
601
+ return {
602
+ skillId,
603
+ targetName: skillId,
604
+ relativePath: segments.join(path.sep),
605
+ content: readFileSync(absolutePath),
606
+ };
607
+ });
165
608
  }
166
609
  function actionBytes(action) {
167
610
  if (action.kind === 'file')
@@ -190,10 +633,28 @@ function normalizeInstallScope(adapter, requested) {
190
633
  }
191
634
  function inferRuntimeScope(files, runtime) {
192
635
  const owned = files.filter((file) => file.runtime === runtime);
193
- const hasUser = owned.some((file) => file.scope === 'user' || (!file.scope && file.target.startsWith(runtimeRoot())));
194
- const hasProject = owned.some((file) => file.scope === 'project' || (!file.scope && !file.target.startsWith(runtimeRoot())));
636
+ const hasUser = owned.some((file) => isUserOwnedFile(file, runtime));
637
+ const hasProject = owned.some((file) => !isUserOwnedFile(file, runtime));
195
638
  return hasUser && hasProject ? 'both' : hasUser ? 'user' : 'project';
196
639
  }
640
+ function skillInstallMode(runtime, options) {
641
+ if (runtime === 'claude-code')
642
+ return 'unified-plugin';
643
+ if (runtime === 'cursor')
644
+ return 'project-rule';
645
+ return options.skillMode ?? (options.scope === 'project' ? 'project-rule' : 'direct');
646
+ }
647
+ function skillInstallModes(runtimes, options) {
648
+ return Object.fromEntries(runtimes.map((runtime) => [runtime, skillInstallMode(runtime, options)]));
649
+ }
650
+ function runtimeLockManifestDigest(input) {
651
+ return `sha256:${hash(JSON.stringify({
652
+ protocol: input.protocolVersion,
653
+ pipelineVersion: input.pipelineVersion,
654
+ adapters: input.adapters,
655
+ ...(input.skillModes ? { skillModes: input.skillModes } : {}),
656
+ }))}`;
657
+ }
197
658
  function buildRuntimeLock(options, runtimes, runtimeScopes, registry, pipelineVersion) {
198
659
  const adapters = runtimes.map((runtime) => {
199
660
  const adapter = registry.adapters.find((entry) => entry.id === runtime);
@@ -207,17 +668,18 @@ function buildRuntimeLock(options, runtimes, runtimeScopes, registry, pipelineVe
207
668
  installScope,
208
669
  };
209
670
  });
210
- const digestInput = JSON.stringify({
211
- protocol: registry.protocolVersion,
212
- pipelineVersion,
213
- adapters,
214
- });
671
+ const skillModes = skillInstallModes(runtimes, options);
215
672
  const components = {
216
673
  cli: options.cliVersion,
217
674
  pipeline: pipelineVersion,
218
- skills: OPENPLANR_SKILLS_VERSION,
675
+ skills: readRegistry().pluginVersion,
219
676
  };
220
- const manifestDigest = `sha256:${hash(digestInput)}`;
677
+ const manifestDigest = runtimeLockManifestDigest({
678
+ protocolVersion: registry.protocolVersion,
679
+ pipelineVersion,
680
+ adapters,
681
+ skillModes,
682
+ });
221
683
  const lockPath = path.join(options.projectDir, '.planr', 'runtime-lock.json');
222
684
  if (existsSync(lockPath)) {
223
685
  try {
@@ -240,12 +702,13 @@ function buildRuntimeLock(options, runtimes, runtimeScopes, registry, pipelineVe
240
702
  protocolVersion: registry.protocolVersion,
241
703
  components,
242
704
  adapters,
705
+ skillModes,
243
706
  }, null, 2)}\n`);
244
707
  }
245
- function buildActions(options, runtimes, runtimeScopes, commandPrefix) {
708
+ function buildActions(options, runtimes, runtimeScopes) {
246
709
  if (options.minimal)
247
710
  return [];
248
- const { root, version, registry } = readRegistry();
711
+ const { version, registry } = readRegistry();
249
712
  if (options.version && options.version !== version) {
250
713
  throw new RuntimeManagerError('E_VERSION_UNAVAILABLE', `Installed pipeline ${version} does not match requested ${options.version}.`, `Install planr-pipeline@${options.version} and rerun setup.`);
251
714
  }
@@ -257,21 +720,36 @@ function buildActions(options, runtimes, runtimeScopes, commandPrefix) {
257
720
  const scope = normalizeInstallScope(adapter, runtimeScopes[runtime] ?? options.scope ?? 'user');
258
721
  const installUser = (scope === 'user' || scope === 'both') && adapter.installScopes.includes('user');
259
722
  const installProject = (scope === 'project' || scope === 'both') && adapter.installScopes.includes('project');
723
+ let skillAssets;
724
+ try {
725
+ skillAssets = bundledSkillAssets(runtime);
726
+ }
727
+ catch (cause) {
728
+ throw new RuntimeManagerError('E_SKILL_DISTRIBUTION_INVALID', `The generated ${runtime} skill distribution is invalid: ${cause instanceof Error ? cause.message : String(cause)}`, 'Reinstall the OpenPlanr utility CLI or regenerate the host packages.');
729
+ }
260
730
  if (installUser) {
261
731
  if (runtime === 'codex') {
262
- for (const name of skillNames) {
263
- const installName = applyCommandPrefix(name, commandPrefix);
264
- const source = readFileSync(path.join(root, 'adapters', 'codex', 'skills', name, 'SKILL.md'));
265
- const content = installName === name
266
- ? source
267
- : Buffer.from(rewriteSkillFrontmatterName(source.toString('utf8'), installName));
732
+ const mode = skillInstallMode(runtime, options);
733
+ if (mode === 'direct') {
734
+ for (const asset of skillAssets) {
735
+ actions.push({
736
+ runtime,
737
+ scope: 'user',
738
+ target: path.join(userHome(), '.codex', 'skills', asset.targetName, asset.relativePath),
739
+ content: asset.content,
740
+ kind: 'file',
741
+ description: `Install Codex skill asset ${asset.targetName}/${asset.relativePath}`,
742
+ });
743
+ }
744
+ }
745
+ if (mode !== 'project-rule') {
268
746
  actions.push({
269
747
  runtime,
270
748
  scope: 'user',
271
- target: path.join(userHome(), '.codex', 'skills', installName, 'SKILL.md'),
272
- content,
749
+ target: path.join(runtimeRoot(), 'install-modes', 'codex.json'),
750
+ content: Buffer.from(`${JSON.stringify({ schemaVersion: '1.0.0', runtime, mode, sourceVersion: version }, null, 2)}\n`),
273
751
  kind: 'file',
274
- description: `Install Codex skill ${installName}`,
752
+ description: `Record Codex ${mode} skill installation mode`,
275
753
  });
276
754
  }
277
755
  }
@@ -286,60 +764,55 @@ function buildActions(options, runtimes, runtimeScopes, commandPrefix) {
286
764
  }
287
765
  if (installProject) {
288
766
  if (runtime === 'codex') {
289
- actions.push({
290
- runtime,
291
- scope: 'project',
292
- target: path.join(options.projectDir, 'AGENTS.md'),
293
- content: Buffer.from(managedContent(readFileSync(path.join(root, 'adapters', 'codex', 'project-guidance.md'), 'utf8'))),
294
- kind: 'managed-block',
295
- marker: 'pipeline',
296
- description: 'Update concise Codex project policy',
297
- });
767
+ for (const asset of skillAssets) {
768
+ actions.push({
769
+ runtime,
770
+ scope: 'project',
771
+ target: path.join(options.projectDir, '.agents', 'skills', asset.targetName, asset.relativePath),
772
+ content: asset.content,
773
+ kind: 'file',
774
+ custody: 'professional-skill',
775
+ description: `Install project Codex skill asset ${asset.targetName}/${asset.relativePath}`,
776
+ });
777
+ }
298
778
  }
299
779
  else if (runtime === 'cursor') {
300
- // Cursor rules carry the equivalent prefix adjustment: the installed target
301
- // basename is derived through `applyCommandPrefix` while the read path stays
302
- // the canonical pipeline source. The current rule set uses the product name
303
- // (`openplanr…`), not per-verb `planr-` command names, so this is a no-op for
304
- // today's files and only takes effect for any future `planr-`-prefixed rule.
305
- actions.push({
306
- runtime,
307
- scope: 'project',
308
- target: path.join(options.projectDir, '.cursor', 'rules', `${applyCommandPrefix('openplanr', commandPrefix)}.mdc`),
309
- content: readFileSync(path.join(root, 'adapters', 'cursor', 'rules', 'openplanr.mdc')),
310
- kind: 'file',
311
- description: 'Install portable Cursor project rule',
312
- });
313
- actions.push({
314
- runtime,
315
- scope: 'project',
316
- target: path.join(options.projectDir, '.cursor', 'rules', `${applyCommandPrefix('openplanr-operate', commandPrefix)}.mdc`),
317
- content: readFileSync(path.join(root, 'adapters', 'cursor', 'rules', 'openplanr-operate.mdc')),
318
- kind: 'file',
319
- description: 'Install Cursor Operating Board rule',
320
- });
321
- const roleRegistry = JSON.parse(readFileSync(path.join(root, 'registry', 'roles.json'), 'utf8'));
322
- for (const role of roleRegistry.roles) {
780
+ for (const asset of skillAssets) {
323
781
  actions.push({
324
782
  runtime,
325
783
  scope: 'project',
326
- target: path.join(options.projectDir, '.cursor', 'rules', 'openplanr-roles', `${applyCommandPrefix(role.id, commandPrefix)}.md`),
327
- content: Buffer.from(`# ${role.id}\n\nCapability tier: \`${role.capability}\`\nPhase: \`${role.phase}\`\nActivation: \`${role.activation}\`\n\n- ${role.writeBoundary}\n`),
784
+ target: path.join(options.projectDir, '.cursor', 'rules', 'openplanr', asset.relativePath),
785
+ content: asset.content,
328
786
  kind: 'file',
329
- description: `Install Cursor role ${role.id}`,
787
+ custody: 'professional-skill',
788
+ description: `Install Cursor rule asset ${asset.relativePath}`,
330
789
  });
331
790
  }
332
791
  }
333
792
  else {
334
- actions.push({
335
- runtime,
336
- scope: 'project',
337
- target: path.join(options.projectDir, 'CLAUDE.md'),
338
- content: Buffer.from('Use the native planr-pipeline plugin for PLAN, Design, SHIP, dashboard, sync, and doctor. Portable procedures and deterministic state are supplied by planr-pipeline. PLAN and SHIP remain separate user actions.'),
339
- kind: 'managed-block',
340
- marker: 'pipeline',
341
- description: 'Update Claude Code project policy',
342
- });
793
+ for (const asset of skillAssets) {
794
+ actions.push({
795
+ runtime,
796
+ scope: 'project',
797
+ target: path.join(options.projectDir, '.claude', 'skills', asset.targetName, asset.relativePath),
798
+ content: asset.content,
799
+ kind: 'file',
800
+ custody: 'professional-skill',
801
+ description: `Install project Claude skill asset ${asset.targetName}/${asset.relativePath}`,
802
+ });
803
+ }
804
+ const agentsRoot = path.join(bundledHostRoot('claude'), 'openplanr', 'agents');
805
+ for (const absolutePath of inventoryRegularFiles(agentsRoot)) {
806
+ const relativePath = path.relative(agentsRoot, absolutePath);
807
+ actions.push({
808
+ runtime,
809
+ scope: 'project',
810
+ target: path.join(options.projectDir, '.claude', 'agents', relativePath),
811
+ content: readFileSync(absolutePath),
812
+ kind: 'file',
813
+ description: `Install project Claude role agent ${relativePath}`,
814
+ });
815
+ }
343
816
  }
344
817
  }
345
818
  }
@@ -363,27 +836,136 @@ function operationFor(action) {
363
836
  return 'create';
364
837
  return hash(readFileSync(action.target)) === hash(actionBytes(action)) ? 'unchanged' : 'update';
365
838
  }
366
- async function loadState() {
367
- try {
368
- return JSON.parse(await readFile(statePath(), 'utf8'));
839
+ function isRetiredGeneratedCursorRule(target, content) {
840
+ const source = content.toString('utf8');
841
+ const parent = path.basename(path.dirname(target));
842
+ if (parent === 'agents') {
843
+ const [header, provenance] = source.split(/\r?\n/u);
844
+ return (header ===
845
+ '> **Cursor adapter — synthesized from planr-pipeline.** Agent role system prompt (body-only). Used by `/cursor/rules/planr-pipeline.mdc` for Composer subagent dispatch.' &&
846
+ provenance.startsWith('> Source: `planr-pipeline/agents/'));
369
847
  }
370
- catch {
371
- return { schemaVersion: '1.0.0', projects: {} };
848
+ const generatedFooter = source.trimEnd().split(/\r?\n/u).at(-1) ?? '';
849
+ const deprecatedAlias = '---\ndescription: Deprecated OpenPlanr pipeline alias\nalwaysApply: false\n---\n\nThis compatibility alias is deprecated. Use the portable `openplanr.mdc` rule.\n';
850
+ return ((generatedFooter.startsWith('*Generated by `planr rules generate --target cursor --scope pipeline`.') &&
851
+ generatedFooter.endsWith('*')) ||
852
+ source === deprecatedAlias);
853
+ }
854
+ function planRetiredCursorProjectRules(projectDir, runtimes, runtimeScopes) {
855
+ if (!runtimes.includes('cursor') ||
856
+ !['project', 'both'].includes(runtimeScopes.cursor ?? 'project')) {
857
+ return [];
372
858
  }
859
+ const rulesRoot = path.join(projectDir, '.cursor', 'rules');
860
+ const candidates = [
861
+ ...RETIRED_CURSOR_WORKFLOW_RULES.map((name) => path.join(rulesRoot, name)),
862
+ ...RETIRED_CURSOR_AGENT_RULES.map((name) => path.join(rulesRoot, 'agents', name)),
863
+ ];
864
+ return candidates.flatMap((target) => {
865
+ if (!existsSync(target))
866
+ return [];
867
+ const metadata = lstatSync(target);
868
+ if (metadata.isSymbolicLink() || !metadata.isFile()) {
869
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Retired Cursor workflow path is not one regular generated file: ${target}.`, 'Move the foreign path aside and rerun setup.');
870
+ }
871
+ const content = readFileSync(target);
872
+ if (!isRetiredGeneratedCursorRule(target, content))
873
+ return [];
874
+ return [
875
+ {
876
+ runtime: 'cursor',
877
+ scope: 'project',
878
+ target,
879
+ content,
880
+ kind: 'file',
881
+ description: 'Retire an unreachable generated Cursor workflow copy',
882
+ },
883
+ ];
884
+ });
885
+ }
886
+ function inventoryRegularFiles(root) {
887
+ return inventoryManagedSkillFiles(root, (message, recovery) => {
888
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', message, recovery);
889
+ });
890
+ }
891
+ function planUserBundleTransition(state, actions) {
892
+ const existing = state.userBundles?.codex?.ownedFiles ?? [];
893
+ return planCodexUserBundleTransition({
894
+ actions,
895
+ existing,
896
+ skillsRoot: codexSkillsRoot(),
897
+ pathIsWithin,
898
+ assertUserOwnedTarget,
899
+ ownershipHash,
900
+ hash,
901
+ actionBytes,
902
+ conflict: (message, recovery) => {
903
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', message, recovery);
904
+ },
905
+ });
373
906
  }
374
907
  /**
375
- * FR5: resolve the effective command-naming choice for a setup run. An explicit
376
- * `--prefix`/`--no-prefix` (`options.prefix` is a boolean) wins and is what gets
377
- * persisted; when the flag is omitted (`undefined`) the previously persisted choice
378
- * is read back from on-disk state, defaulting to `namespaced` for a project with no
379
- * prior record. This is what makes the choice survive across separate invocations
380
- * and upgrades without ever silently renaming what the user types.
908
+ * Applies the Codex bundle's adopt-only-if-identical ownership rule to the four
909
+ * project-scoped Cursor professional assets. Unknown bytes are user-owned, while
910
+ * recorded assets may advance only when their current bytes still match state.
381
911
  */
912
+ function assertCursorProfessionalSkillTransition(state, projectDir, actions) {
913
+ const desired = actions.filter((action) => action.runtime === 'cursor' &&
914
+ action.scope === 'project' &&
915
+ action.custody === 'professional-skill');
916
+ if (desired.length === 0)
917
+ return;
918
+ const tracked = new Map((state.projects[projectKey(projectDir)]?.ownedFiles ?? [])
919
+ .filter((file) => file.runtime === 'cursor')
920
+ .map((file) => [path.resolve(file.target), file]));
921
+ for (const action of desired) {
922
+ assertMutableOwnedTarget(action.target, projectDir, 'E_MIGRATION_CONFLICT');
923
+ if (!existsSync(action.target))
924
+ continue;
925
+ const metadata = lstatSync(action.target);
926
+ if (metadata.isSymbolicLink() || !metadata.isFile()) {
927
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to replace non-file Cursor professional skill target ${action.target}.`, 'Preserve or move the existing entry outside the managed Cursor rules directory before rerunning setup.');
928
+ }
929
+ const currentHash = ownershipHash(readFileSync(action.target), action.kind, action.marker);
930
+ const owned = tracked.get(path.resolve(action.target));
931
+ if (owned) {
932
+ if (currentHash !== owned.hash) {
933
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to replace modified managed Cursor professional skill ${action.target}.`, 'Preserve the modified file or restore the last managed bytes before rerunning setup.');
934
+ }
935
+ continue;
936
+ }
937
+ const expectedHash = ownershipHash(actionBytes(action), action.kind, action.marker);
938
+ if (currentHash !== expectedHash) {
939
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to overwrite unknown Cursor professional skill bytes at ${action.target}.`, 'Move the user-owned file aside or explicitly reconcile it before rerunning setup.');
940
+ }
941
+ }
942
+ }
943
+ async function loadState() {
944
+ assertApprovedTargetCustody(statePath(), runtimeRoot(), userHome(), 'E_RUNTIME_STATE_INVALID', 'Runtime ownership state');
945
+ try {
946
+ const state = assertRuntimeStateValue(JSON.parse(await readFile(statePath(), 'utf8')), 'E_RUNTIME_STATE_INVALID', true);
947
+ migrateLegacyGlobalRuntimeState(state, {
948
+ inferRuntimeScope,
949
+ inferLegacyCodexPrefix,
950
+ isUserOwnedFile,
951
+ projectKey,
952
+ conflict: (code, message, recovery) => {
953
+ throw new RuntimeManagerError(code, message, recovery);
954
+ },
955
+ });
956
+ return assertRuntimeStateValue(state);
957
+ }
958
+ catch (error) {
959
+ if (error.code === 'ENOENT') {
960
+ return { schemaVersion: '2.0.0', projects: {}, userBundles: {} };
961
+ }
962
+ if (error instanceof RuntimeManagerError)
963
+ throw error;
964
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', `Runtime ownership state is invalid: ${error instanceof Error ? error.message : String(error)}`, 'Restore the recorded state backup before running setup again.');
965
+ }
966
+ }
382
967
  async function resolveCommandPrefix(options) {
383
- if (options.prefix !== undefined)
384
- return options.prefix ? 'namespaced' : 'bare';
385
- const state = await loadState();
386
- return state.projects[projectKey(options.projectDir)]?.commandPrefix ?? 'namespaced';
968
+ return skillInstallMode('codex', options) === 'direct' ? 'bare' : 'namespaced';
387
969
  }
388
970
  async function atomicWrite(target, content) {
389
971
  await mkdir(path.dirname(target), { recursive: true });
@@ -393,34 +975,75 @@ async function atomicWrite(target, content) {
393
975
  }
394
976
  async function createBackup(projectDir, actions) {
395
977
  const stamp = new Date().toISOString().replaceAll(':', '-');
396
- const dir = path.join(userHome(), '.planr', 'backups', projectKey(projectDir), stamp);
978
+ const dir = assertBackupDirectoryCustody(path.join(projectBackupsRoot(projectDir), stamp), projectDir, 'E_BACKUP_FAILED');
397
979
  const manifest = {
398
980
  schemaVersion: '1.0.0',
399
981
  projectDir: path.resolve(projectDir),
400
982
  createdAt: new Date().toISOString(),
401
983
  files: [],
402
984
  };
403
- await mkdir(dir, { recursive: true });
985
+ await mkdir(dir, { recursive: true, mode: 0o700 });
986
+ assertBackupDirectoryCustody(dir, projectDir, 'E_BACKUP_FAILED', true);
404
987
  for (const [index, action] of actions.entries()) {
988
+ assertMutableOwnedTarget(action.target, projectDir, 'E_MIGRATION_CONFLICT');
405
989
  const entry = { target: action.target, existed: existsSync(action.target) };
406
990
  if (entry.existed) {
407
- const backup = path.join(dir, 'files', `${String(index).padStart(3, '0')}-${path.basename(action.target)}`);
408
- await mkdir(path.dirname(backup), { recursive: true });
409
- await copyFile(action.target, backup);
991
+ const backup = backupEntryPath(dir, index, action.target);
992
+ const bytes = await readCustodiedRegularFile(action.target, () => assertMutableOwnedTarget(action.target, projectDir, 'E_MIGRATION_CONFLICT'), 'E_BACKUP_FAILED', 'Managed setup source');
993
+ assertApprovedTargetCustody(backup, path.join(dir, 'files'), dir, 'E_BACKUP_FAILED', 'Runtime backup file');
994
+ await mkdir(path.dirname(backup), { recursive: true, mode: 0o700 });
995
+ assertApprovedTargetCustody(path.dirname(backup), path.join(dir, 'files'), dir, 'E_BACKUP_FAILED', 'Runtime backup files directory');
996
+ await atomicWrite(backup, bytes);
997
+ assertApprovedTargetCustody(backup, path.join(dir, 'files'), dir, 'E_BACKUP_FAILED', 'Runtime backup file');
410
998
  entry.backup = backup;
411
- entry.beforeHash = hash(await readFile(action.target));
999
+ entry.beforeHash = hash(bytes);
412
1000
  }
413
1001
  manifest.files.push(entry);
414
1002
  }
415
- await atomicWrite(path.join(dir, 'migration-manifest.json'), Buffer.from(`${JSON.stringify(manifest, null, 2)}\n`));
1003
+ const manifestPath = path.join(dir, 'migration-manifest.json');
1004
+ assertApprovedTargetCustody(manifestPath, dir, userHome(), 'E_BACKUP_FAILED', 'Runtime backup manifest');
1005
+ await atomicWrite(manifestPath, Buffer.from(`${JSON.stringify(manifest, null, 2)}\n`));
1006
+ assertClosedBackupTree(dir, assertClosedBackupManifest(manifest, dir, projectDir, 'E_BACKUP_FAILED'), projectDir, 'E_BACKUP_FAILED');
416
1007
  return { dir, manifest };
417
1008
  }
1009
+ async function restoreBackup(backup) {
1010
+ const directory = assertBackupDirectoryCustody(backup.dir, backup.manifest.projectDir, 'E_RUNTIME_STATE_INVALID', true);
1011
+ const manifest = assertClosedBackupManifest(backup.manifest, directory, backup.manifest.projectDir, 'E_RUNTIME_STATE_INVALID');
1012
+ assertClosedBackupTree(directory, manifest, backup.manifest.projectDir, 'E_RUNTIME_STATE_INVALID');
1013
+ const restoreBytes = new Map();
1014
+ for (const entry of manifest.files) {
1015
+ assertMutableOwnedTarget(entry.target, manifest.projectDir, 'E_RUNTIME_STATE_INVALID');
1016
+ if (entry.existed) {
1017
+ restoreBytes.set(entry.target, await readBackupEntryBytes(directory, entry, manifest.projectDir, 'E_RUNTIME_STATE_INVALID'));
1018
+ }
1019
+ }
1020
+ const restored = [];
1021
+ for (const entry of [...manifest.files].reverse()) {
1022
+ if (entry.existed && entry.backup) {
1023
+ const bytes = restoreBytes.get(entry.target);
1024
+ if (!bytes)
1025
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Backup preflight lost validated bytes.');
1026
+ await mkdir(path.dirname(entry.target), { recursive: true });
1027
+ assertMutableOwnedTarget(entry.target, manifest.projectDir, 'E_RUNTIME_STATE_INVALID');
1028
+ await atomicWrite(entry.target, bytes);
1029
+ }
1030
+ else if (existsSync(entry.target)) {
1031
+ await unlink(entry.target);
1032
+ }
1033
+ restored.push(entry.target);
1034
+ }
1035
+ return restored;
1036
+ }
418
1037
  export async function previewSetup(options) {
419
1038
  assertNodeVersion();
420
1039
  const scope = options.scope ?? 'user';
421
1040
  if (!['user', 'project', 'both'].includes(scope)) {
422
1041
  throw new RuntimeManagerError('E_SCOPE_INVALID', `Install scope "${options.scope}" is invalid.`, 'Choose user, project, or both.');
423
1042
  }
1043
+ if (options.skillMode &&
1044
+ !['direct', 'unified-plugin', 'project-rule'].includes(options.skillMode)) {
1045
+ throw new RuntimeManagerError('E_SKILL_MODE_INVALID', `Skill installation mode "${options.skillMode}" is invalid.`, 'Choose direct, unified-plugin, or project-rule.');
1046
+ }
424
1047
  const projectContext = inspectProjectContext(options.projectDir);
425
1048
  if ((scope === 'project' || scope === 'both') && !projectContext.valid) {
426
1049
  throw new RuntimeManagerError('E_PROJECT_CONTEXT_REQUIRED', `Project-scoped setup requires a Git worktree or initialized OpenPlanr project; ${projectContext.path} is neither.`, 'Change into a project, run `planr init`, or use `planr setup --scope user`.');
@@ -467,17 +1090,39 @@ export async function previewSetup(options) {
467
1090
  throw new RuntimeManagerError('E_ADAPTER_MISSING', `Adapter ${runtime} is absent.`);
468
1091
  runtimeScopes[runtime] = normalizeInstallScope(adapter, runtimeScopes[runtime] ?? options.scope ?? 'user');
469
1092
  }
1093
+ if (runtimes.includes('codex')) {
1094
+ const codexScope = runtimeScopes.codex ?? scope;
1095
+ const mode = skillInstallMode('codex', options);
1096
+ if (mode === 'project-rule' && !['project', 'both'].includes(codexScope)) {
1097
+ throw new RuntimeManagerError('E_SKILL_MODE_SCOPE', 'Codex project-rule mode requires project or both scope.', 'Use --scope project or --scope both.');
1098
+ }
1099
+ if (mode !== 'project-rule' && !['user', 'both'].includes(codexScope)) {
1100
+ throw new RuntimeManagerError('E_SKILL_MODE_SCOPE', `Codex ${mode} mode requires user or both scope.`, 'Use --scope user or --scope both.');
1101
+ }
1102
+ }
470
1103
  }
471
1104
  const commandPrefix = await resolveCommandPrefix(options);
472
- const actions = buildActions(options, runtimes, runtimeScopes, commandPrefix);
1105
+ const actions = buildActions(options, runtimes, runtimeScopes);
1106
+ assertActionCustody(actions, options.projectDir);
1107
+ const retiredProjectRules = planRetiredCursorProjectRules(options.projectDir, runtimes, runtimeScopes);
1108
+ const needsTransitionState = runtimes.includes('codex') ||
1109
+ actions.some((action) => (action.runtime === 'codex' && action.scope === 'user') ||
1110
+ action.custody === 'professional-skill');
1111
+ const transitionState = needsTransitionState ? await loadState() : undefined;
1112
+ if (transitionState) {
1113
+ assertCursorProfessionalSkillTransition(transitionState, options.projectDir, actions);
1114
+ }
1115
+ const userBundleTransition = runtimes.includes('codex')
1116
+ ? planUserBundleTransition(transitionState, actions)
1117
+ : { retired: [] };
473
1118
  const manageClaudePlugins = options.manageExternalRuntimes !== false &&
474
1119
  !options.minimal &&
475
1120
  runtimes.includes('claude-code') &&
476
1121
  ['user', 'both'].includes(runtimeScopes['claude-code'] ?? scope) &&
477
1122
  (Boolean(options.claudeCommandRunner) ||
478
1123
  detectRuntimes().some((runtime) => runtime.runtime === 'claude-code' && runtime.installed));
479
- const claudeInspection = manageClaudePlugins && pipeline
480
- ? inspectClaudePluginIntegration(pipeline.version, options.claudeCommandRunner)
1124
+ const claudeInspection = manageClaudePlugins
1125
+ ? inspectBundledClaudePluginIntegration(bundledHostRoot('claude'), options.claudeCommandRunner)
481
1126
  : undefined;
482
1127
  const runtimeDiagnostics = [];
483
1128
  if (claudeInspection) {
@@ -512,11 +1157,63 @@ export async function previewSetup(options) {
512
1157
  });
513
1158
  }
514
1159
  }
1160
+ const codexMode = runtimes.includes('codex') ? skillInstallMode('codex', options) : undefined;
1161
+ const previousCodexMode = transitionState?.userBundles?.codex?.installMode ??
1162
+ (transitionState?.userBundles?.codex ? 'direct' : undefined) ??
1163
+ transitionState?.projects[projectKey(options.projectDir)]?.skillModes?.codex;
1164
+ const manageCodexPlugin = Boolean(codexMode &&
1165
+ options.manageExternalRuntimes !== false &&
1166
+ (detectRuntimes().some((runtime) => runtime.runtime === 'codex' && runtime.installed) ||
1167
+ options.codexCommandRunner));
1168
+ const codexInspection = manageCodexPlugin
1169
+ ? inspectCodexPluginIntegration(bundledHostRoot('openai'), codexMode, previousCodexMode, options.codexCommandRunner)
1170
+ : undefined;
1171
+ if (codexInspection) {
1172
+ if (codexInspection.error) {
1173
+ runtimeDiagnostics.push({
1174
+ runtime: 'codex',
1175
+ status: 'fail',
1176
+ message: `Codex plugin state could not be inspected: ${codexInspection.error}`,
1177
+ fix: 'Repair the Codex marketplace state, then rerun planr setup --dry-run.',
1178
+ });
1179
+ }
1180
+ else if (codexInspection.duplicates.length > 0) {
1181
+ runtimeDiagnostics.push({
1182
+ runtime: 'codex',
1183
+ status: 'warn',
1184
+ message: `Duplicate OpenPlanr Codex plugin discovery detected: ${codexInspection.duplicates.join(', ')}`,
1185
+ fix: 'Remove or disable the unrelated duplicate after confirming which installation should remain active.',
1186
+ });
1187
+ }
1188
+ else if (codexInspection.ready) {
1189
+ runtimeDiagnostics.push({
1190
+ runtime: 'codex',
1191
+ status: 'pass',
1192
+ message: `Codex ${codexMode} discovery is current`,
1193
+ });
1194
+ }
1195
+ else if (codexInspection.operations.length > 0) {
1196
+ runtimeDiagnostics.push({
1197
+ runtime: 'codex',
1198
+ status: 'warn',
1199
+ message: `Codex will switch to ${codexMode} discovery after confirmation`,
1200
+ });
1201
+ }
1202
+ }
1203
+ if (userBundleTransition.retired.length > 0 && previousCodexMode !== codexMode) {
1204
+ runtimeDiagnostics.push({
1205
+ runtime: 'codex',
1206
+ status: 'warn',
1207
+ message: `${userBundleTransition.retired.length} manifest-owned direct Codex asset(s) will be retired`,
1208
+ fix: 'Rerun with --replace-managed after reviewing this dry-run.',
1209
+ });
1210
+ }
515
1211
  return {
516
1212
  ok: true,
517
1213
  dryRun: Boolean(options.dryRun),
518
1214
  minimal: Boolean(options.minimal),
519
1215
  commandPrefix,
1216
+ skillModes: skillInstallModes(runtimes, options),
520
1217
  runtimes,
521
1218
  runtimeScopes,
522
1219
  scope,
@@ -529,14 +1226,33 @@ export async function previewSetup(options) {
529
1226
  .map((item) => item.runtime),
530
1227
  scopeIncompatibleRuntimes,
531
1228
  projectContext,
532
- actions: actions.map((action) => ({
533
- runtime: action.runtime,
534
- scope: action.scope,
535
- target: action.target,
536
- operation: operationFor(action),
537
- description: action.description,
538
- })),
539
- runtimeOperations: claudeInspection?.operations ?? [],
1229
+ actions: [
1230
+ ...actions.map((action) => ({
1231
+ runtime: action.runtime,
1232
+ scope: action.scope,
1233
+ target: action.target,
1234
+ operation: operationFor(action),
1235
+ description: action.description,
1236
+ })),
1237
+ ...retiredProjectRules.map((action) => ({
1238
+ runtime: action.runtime,
1239
+ scope: action.scope,
1240
+ target: action.target,
1241
+ operation: 'retire',
1242
+ description: action.description,
1243
+ })),
1244
+ ...userBundleTransition.retired.map((file) => ({
1245
+ runtime: file.runtime,
1246
+ scope: file.scope ?? 'user',
1247
+ target: file.target,
1248
+ operation: 'retire',
1249
+ description: 'Retire a previously owned global Codex skill asset',
1250
+ })),
1251
+ ],
1252
+ runtimeOperations: [
1253
+ ...(claudeInspection?.operations ?? []),
1254
+ ...(codexInspection?.operations ?? []),
1255
+ ],
540
1256
  runtimeDiagnostics,
541
1257
  };
542
1258
  }
@@ -544,6 +1260,7 @@ export async function applySetup(options) {
544
1260
  const preview = await previewSetup(options);
545
1261
  if (options.dryRun || options.minimal)
546
1262
  return preview;
1263
+ assertApprovedTargetCustody(runtimeRoot(), runtimeRoot(), userHome(), 'E_MIGRATION_CONFLICT', 'Global runtime root');
547
1264
  await mkdir(runtimeRoot(), { recursive: true });
548
1265
  const lockPath = path.join(runtimeRoot(), 'setup.lock');
549
1266
  let lockHandle;
@@ -553,22 +1270,69 @@ export async function applySetup(options) {
553
1270
  catch {
554
1271
  throw new RuntimeManagerError('E_SETUP_BUSY', 'Another OpenPlanr setup or migration is already running.', 'Wait for it to finish. If no process is running, remove the verified stale setup lock.');
555
1272
  }
1273
+ let backup;
556
1274
  try {
557
1275
  const commandPrefix = await resolveCommandPrefix(options);
558
- const actions = buildActions(options, preview.runtimes, preview.runtimeScopes, commandPrefix);
1276
+ const actions = buildActions(options, preview.runtimes, preview.runtimeScopes);
1277
+ assertActionCustody(actions, options.projectDir);
1278
+ const retiredProjectRules = planRetiredCursorProjectRules(options.projectDir, preview.runtimes, preview.runtimeScopes);
1279
+ const state = await loadState();
1280
+ const previousCodexMode = state.userBundles?.codex?.installMode ??
1281
+ (state.userBundles?.codex ? 'direct' : undefined) ??
1282
+ state.projects[projectKey(options.projectDir)]?.skillModes?.codex;
1283
+ assertCursorProfessionalSkillTransition(state, options.projectDir, actions);
1284
+ const transition = preview.runtimes.includes('codex')
1285
+ ? planUserBundleTransition(state, actions)
1286
+ : { retired: [] };
1287
+ const replacesPlugin = preview.runtimeOperations.some((operation) => operation.runtime === 'codex' && operation.kind === 'remove');
1288
+ const replacesClaudePlugin = preview.runtimeOperations.some((operation) => operation.runtime === 'claude-code' && operation.kind === 'remove');
1289
+ const desiredCodexMode = preview.skillModes.codex;
1290
+ const changesInstallMode = Boolean(previousCodexMode && desiredCodexMode && previousCodexMode !== desiredCodexMode);
1291
+ if (((changesInstallMode && transition.retired.length > 0) ||
1292
+ replacesPlugin ||
1293
+ replacesClaudePlugin) &&
1294
+ !options.replaceManaged) {
1295
+ throw new RuntimeManagerError('E_INSTALL_MODE_CONFLICT', 'Changing OpenPlanr discovery mode would retire existing OpenPlanr-managed content.', 'Review planr setup --dry-run, then rerun with --replace-managed to replace only OpenPlanr-owned content.');
1296
+ }
559
1297
  const changed = actions.filter((action) => operationFor(action) !== 'unchanged');
560
- let backup;
561
- if (changed.length > 0) {
562
- try {
563
- backup = await createBackup(options.projectDir, changed);
564
- }
565
- catch (cause) {
566
- throw new RuntimeManagerError('E_BACKUP_FAILED', `Could not create byte-for-byte migration backup: ${cause instanceof Error ? cause.message : String(cause)}`, 'No setup files were changed. Fix backup permissions and rerun setup.');
567
- }
1298
+ const retirementActions = transition.retired.map((file) => ({
1299
+ runtime: file.runtime,
1300
+ scope: 'user',
1301
+ target: file.target,
1302
+ content: Buffer.alloc(0),
1303
+ kind: file.kind,
1304
+ marker: file.marker,
1305
+ description: 'Retire a previously owned global Codex skill asset',
1306
+ }));
1307
+ const stateAction = {
1308
+ runtime: 'core',
1309
+ scope: 'user',
1310
+ target: statePath(),
1311
+ content: Buffer.alloc(0),
1312
+ kind: 'file',
1313
+ description: 'Update global runtime ownership state',
1314
+ };
1315
+ const backupTargets = [
1316
+ ...changed,
1317
+ ...retirementActions,
1318
+ ...retiredProjectRules,
1319
+ stateAction,
1320
+ ].filter((action, index, list) => list.findIndex((candidate) => candidate.target === action.target) === index);
1321
+ try {
1322
+ backup = await createBackup(options.projectDir, backupTargets);
1323
+ }
1324
+ catch (cause) {
1325
+ throw new RuntimeManagerError('E_BACKUP_FAILED', `Could not create byte-for-byte setup backup: ${cause instanceof Error ? cause.message : String(cause)}`, 'No setup files were changed. Fix backup permissions and rerun setup.');
1326
+ }
1327
+ try {
568
1328
  const owned = [];
569
1329
  for (const action of actions) {
570
1330
  const content = actionBytes(action);
571
- await atomicWrite(action.target, content);
1331
+ if (operationFor(action) !== 'unchanged')
1332
+ await atomicWrite(action.target, content);
1333
+ if (hash(readFileSync(action.target)) !== hash(content)) {
1334
+ throw new RuntimeManagerError('E_SETUP_VERIFY_FAILED', `Installed bytes failed verification at ${action.target}.`);
1335
+ }
572
1336
  owned.push({
573
1337
  runtime: action.runtime,
574
1338
  scope: action.scope,
@@ -577,65 +1341,118 @@ export async function applySetup(options) {
577
1341
  marker: action.marker,
578
1342
  hash: ownershipHash(content, action.kind, action.marker),
579
1343
  });
580
- const backupEntry = backup.manifest.files.find((entry) => entry.target === action.target);
581
- if (backupEntry)
582
- backupEntry.afterHash = hash(content);
1344
+ const entry = backup.manifest.files.find((candidate) => candidate.target === action.target);
1345
+ if (entry)
1346
+ entry.afterHash = hash(content);
1347
+ }
1348
+ for (const retired of transition.retired) {
1349
+ assertUserOwnedTarget(retired, 'codex', 'E_RUNTIME_STATE_INVALID');
1350
+ if (existsSync(retired.target))
1351
+ await unlink(retired.target);
1352
+ }
1353
+ for (const retired of retiredProjectRules) {
1354
+ assertMutableOwnedTarget(retired.target, options.projectDir, 'E_MIGRATION_CONFLICT');
1355
+ if (!existsSync(retired.target))
1356
+ continue;
1357
+ const metadata = lstatSync(retired.target);
1358
+ if (metadata.isSymbolicLink() ||
1359
+ !metadata.isFile() ||
1360
+ hash(readFileSync(retired.target)) !== hash(retired.content)) {
1361
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Retired Cursor workflow bytes changed during setup: ${retired.target}.`, 'The setup transaction restored the pre-setup bytes; inspect the file and rerun.');
1362
+ }
1363
+ await unlink(retired.target);
1364
+ }
1365
+ const updatedAt = new Date().toISOString();
1366
+ state.schemaVersion = '2.0.0';
1367
+ state.userBundles ??= {};
1368
+ for (const runtime of preview.runtimes) {
1369
+ const userOwned = owned.filter((file) => file.runtime === runtime && file.scope === 'user');
1370
+ if (userOwned.length === 0) {
1371
+ if (runtime === 'codex' && transition.retired.length > 0)
1372
+ delete state.userBundles.codex;
1373
+ continue;
1374
+ }
1375
+ state.userBundles[runtime] = {
1376
+ runtime,
1377
+ scope: 'user',
1378
+ updatedAt,
1379
+ pipelineVersion: preview.pipelineVersion ?? 'planning-only',
1380
+ commandPrefix: runtime === 'codex' ? commandPrefix : 'namespaced',
1381
+ installMode: preview.skillModes[runtime],
1382
+ ownedFiles: userOwned,
1383
+ };
583
1384
  }
584
- await atomicWrite(path.join(backup.dir, 'migration-manifest.json'), Buffer.from(`${JSON.stringify(backup.manifest, null, 2)}\n`));
585
- const state = await loadState();
586
1385
  state.projects[projectKey(options.projectDir)] = {
587
1386
  projectDir: path.resolve(options.projectDir),
588
- updatedAt: new Date().toISOString(),
1387
+ updatedAt,
589
1388
  backupDir: backup.dir,
1389
+ backupManifestHash: backupManifestIdentity(backup.manifest),
590
1390
  runtimes: preview.runtimes,
591
1391
  runtimeScopes: preview.runtimeScopes,
592
- commandPrefix,
1392
+ skillModes: preview.skillModes,
593
1393
  ...(preview.runtimes.length === 1 ? { activeRuntime: preview.runtimes[0] } : {}),
594
- ownedFiles: owned,
1394
+ ownedFiles: owned.filter((file) => file.scope === 'project'),
595
1395
  };
596
- await atomicWrite(statePath(), Buffer.from(`${JSON.stringify(state, null, 2)}\n`));
597
- }
598
- let appliedRuntimeOperations;
599
- let restartRequired = false;
600
- if (preview.runtimeOperations.length > 0 && preview.pipelineVersion) {
601
- const inspection = inspectClaudePluginIntegration(preview.pipelineVersion, options.claudeCommandRunner);
602
- if (inspection.error) {
603
- throw new RuntimeManagerError('E_CLAUDE_PLUGIN_INSPECTION_FAILED', `Could not inspect Claude plugins: ${inspection.error}`, 'Update Claude Code, then rerun `planr setup --runtime claude --scope user`.');
604
- }
605
- try {
606
- const result = applyClaudePluginIntegration(preview.pipelineVersion, inspection, options.claudeCommandRunner);
1396
+ const stateBytes = Buffer.from(`${JSON.stringify(state, null, 2)}\n`);
1397
+ await atomicWrite(statePath(), stateBytes);
1398
+ const stateBackup = backup.manifest.files.find((entry) => entry.target === statePath());
1399
+ if (stateBackup)
1400
+ stateBackup.afterHash = hash(stateBytes);
1401
+ const backupManifestPath = path.join(backup.dir, 'migration-manifest.json');
1402
+ assertApprovedTargetCustody(backupManifestPath, backup.dir, userHome(), 'E_RUNTIME_STATE_INVALID', 'Runtime backup manifest');
1403
+ await atomicWrite(backupManifestPath, Buffer.from(`${JSON.stringify(backup.manifest, null, 2)}\n`));
1404
+ assertClosedBackupTree(backup.dir, assertClosedBackupManifest(backup.manifest, backup.dir, options.projectDir, 'E_RUNTIME_STATE_INVALID', true), options.projectDir, 'E_RUNTIME_STATE_INVALID');
1405
+ let appliedRuntimeOperations;
1406
+ let restartRequired = false;
1407
+ const claudeOperations = preview.runtimeOperations.filter((operation) => operation.runtime === 'claude-code');
1408
+ if (claudeOperations.length > 0) {
1409
+ const inspection = inspectBundledClaudePluginIntegration(bundledHostRoot('claude'), options.claudeCommandRunner);
1410
+ if (inspection.error) {
1411
+ throw new RuntimeManagerError('E_CLAUDE_PLUGIN_INSPECTION_FAILED', `Could not inspect Claude plugins: ${inspection.error}`);
1412
+ }
1413
+ let result;
1414
+ try {
1415
+ result = applyBundledClaudePluginIntegration(bundledHostRoot('claude'), inspection, options.claudeCommandRunner);
1416
+ }
1417
+ catch (cause) {
1418
+ throw new RuntimeManagerError('E_CLAUDE_PLUGIN_UPDATE_FAILED', cause instanceof Error ? cause.message : String(cause));
1419
+ }
607
1420
  appliedRuntimeOperations = result.operations;
608
1421
  restartRequired = result.restartRequired;
609
1422
  }
610
- catch (cause) {
611
- const detail = cause instanceof Error ? cause.message : String(cause);
612
- // `setup` is the install path for every runtime, so a mid-apply plugin
613
- // failure must never leave the owned files written earlier in this same
614
- // call in a half-migrated state a rerun cannot tell apart from a fresh
615
- // install. Those writes happened under `backup`; restore them from it
616
- // before surfacing the failure, and name every restored path so the
617
- // report states plainly what was undone. When nothing was written yet
618
- // (`backup` undefined) there is nothing to restore — throw unchanged.
619
- if (backup) {
620
- let restored;
621
- try {
622
- ({ restored } = await rollbackRuntime(options.projectDir, backup.dir));
623
- }
624
- catch (rollbackCause) {
625
- const rollbackDetail = rollbackCause instanceof Error ? rollbackCause.message : String(rollbackCause);
626
- throw new RuntimeManagerError('E_CLAUDE_PLUGIN_UPDATE_FAILED', `Claude plugin update failed: ${detail}`, `Automatic restore from ${backup.dir} also failed (${rollbackDetail}); the OpenPlanr files written this run may be partially applied. Restore them from that backup, then run \`planr runtime update claude --scope user\`.`);
627
- }
628
- throw new RuntimeManagerError('E_CLAUDE_PLUGIN_UPDATE_FAILED', `Claude plugin update failed: ${detail}`, `Restored ${restored.length} file(s) to their pre-setup state: ${restored.join(', ')}. Run \`planr runtime update claude --scope user\` after checking Claude Code marketplace access, then rerun setup.`);
1423
+ const codexOperations = preview.runtimeOperations.filter((operation) => operation.runtime === 'codex');
1424
+ if (codexOperations.length > 0) {
1425
+ const inspection = inspectCodexPluginIntegration(bundledHostRoot('openai'), preview.skillModes.codex ?? 'direct', previousCodexMode, options.codexCommandRunner);
1426
+ if (inspection.error)
1427
+ throw new RuntimeManagerError('E_CODEX_PLUGIN_INSPECTION_FAILED', inspection.error);
1428
+ try {
1429
+ const result = applyCodexPluginIntegration(bundledHostRoot('openai'), inspection, options.codexCommandRunner);
1430
+ appliedRuntimeOperations = [...(appliedRuntimeOperations ?? []), ...result.operations];
1431
+ restartRequired ||= result.restartRequired;
1432
+ }
1433
+ catch (cause) {
1434
+ throw new RuntimeManagerError('E_CODEX_PLUGIN_UPDATE_FAILED', cause instanceof Error ? cause.message : String(cause));
629
1435
  }
630
- throw new RuntimeManagerError('E_CLAUDE_PLUGIN_UPDATE_FAILED', `Claude plugin update failed: ${detail}`, 'Run `planr runtime update claude --scope user` after checking Claude Code marketplace access.');
631
1436
  }
1437
+ return {
1438
+ ...preview,
1439
+ backupDir: backup.dir,
1440
+ ...(appliedRuntimeOperations ? { appliedRuntimeOperations } : {}),
1441
+ restartRequired,
1442
+ };
1443
+ }
1444
+ catch (cause) {
1445
+ let restored;
1446
+ try {
1447
+ restored = await restoreBackup(backup);
1448
+ }
1449
+ catch (rollbackCause) {
1450
+ throw new RuntimeManagerError('E_SETUP_ROLLBACK_FAILED', `Setup failed and automatic restore also failed: ${rollbackCause instanceof Error ? rollbackCause.message : String(rollbackCause)}`, `Restore the exact previous files from ${backup.dir}.`);
1451
+ }
1452
+ const detail = cause instanceof Error ? cause.message : String(cause);
1453
+ const causeCode = cause?.code;
1454
+ throw new RuntimeManagerError(typeof causeCode === 'string' ? causeCode : 'E_SETUP_TRANSACTION_FAILED', detail, `Restored ${restored.length} file(s) to their exact pre-setup bytes: ${restored.join(', ')}.`);
632
1455
  }
633
- return {
634
- ...preview,
635
- ...(backup ? { backupDir: backup.dir } : {}),
636
- ...(appliedRuntimeOperations ? { appliedRuntimeOperations } : {}),
637
- restartRequired,
638
- };
639
1456
  }
640
1457
  finally {
641
1458
  await lockHandle.close();
@@ -653,42 +1470,132 @@ function removeManagedBlock(existing, marker) {
653
1470
  }
654
1471
  export async function rollbackRuntime(projectDir, backupDir) {
655
1472
  const state = await loadState();
656
- const project = state.projects[projectKey(projectDir)];
657
- const selected = backupDir ?? project?.backupDir;
658
- if (!selected)
1473
+ const key = projectKey(projectDir);
1474
+ const project = state.projects[key];
1475
+ const recorded = project?.backupDir;
1476
+ const selected = backupDir ?? recorded;
1477
+ if (!selected || !recorded)
659
1478
  throw new RuntimeManagerError('E_ROLLBACK_NOT_FOUND', 'No runtime backup is recorded for this project.');
660
- const manifest = JSON.parse(await readFile(path.join(selected, 'migration-manifest.json'), 'utf8'));
1479
+ assertRequestedProjectBinding(projectDir, key, project);
1480
+ if (path.resolve(selected) !== path.resolve(recorded)) {
1481
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'The selected runtime backup is not the exact backup recorded for this project.', 'Use the current project-owned backup recorded by OpenPlanr.');
1482
+ }
1483
+ const directory = assertBackupDirectoryCustody(selected, projectDir, 'E_RUNTIME_STATE_INVALID', true);
1484
+ const manifestPath = path.join(directory, 'migration-manifest.json');
1485
+ const manifestBytes = await readCustodiedRegularFile(manifestPath, () => assertApprovedTargetCustody(manifestPath, directory, userHome(), 'E_RUNTIME_STATE_INVALID', 'Runtime backup manifest'), 'E_RUNTIME_STATE_INVALID', 'Runtime backup manifest', 4 * 1024 * 1024);
1486
+ let manifestValue;
1487
+ try {
1488
+ manifestValue = JSON.parse(manifestBytes.toString('utf8'));
1489
+ }
1490
+ catch {
1491
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Runtime backup manifest is not valid JSON.');
1492
+ }
1493
+ const manifest = assertClosedBackupManifest(manifestValue, directory, projectDir, 'E_RUNTIME_STATE_INVALID', true);
1494
+ if (project.backupManifestHash !== backupManifestIdentity(manifest)) {
1495
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'The selected runtime backup no longer matches its recorded manifest identity.', 'Use the exact unmodified backup created by the recorded setup transaction.');
1496
+ }
1497
+ assertClosedBackupTree(directory, manifest, projectDir, 'E_RUNTIME_STATE_INVALID');
1498
+ const restoreBytes = new Map();
1499
+ for (const entry of manifest.files) {
1500
+ assertMutableOwnedTarget(entry.target, projectDir, 'E_RUNTIME_STATE_INVALID');
1501
+ if (entry.existed) {
1502
+ restoreBytes.set(entry.target, await readBackupEntryBytes(directory, entry, projectDir, 'E_RUNTIME_STATE_INVALID'));
1503
+ }
1504
+ }
661
1505
  const restored = [];
662
1506
  const retainedShared = [];
663
- const key = projectKey(projectDir);
1507
+ const stateEntry = manifest.files.find((entry) => path.resolve(entry.target) === path.resolve(statePath()));
1508
+ if (!stateEntry?.afterHash) {
1509
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Runtime backup has no final ownership-state hash.');
1510
+ }
1511
+ // Global ownership state may legitimately advance when another project reuses
1512
+ // the same user bundle. The current state was already structurally decoded,
1513
+ // target-confined, and used to authenticate this project's manifest identity;
1514
+ // rollback therefore merges it instead of requiring stale raw state bytes.
1515
+ let previousState;
1516
+ if (stateEntry?.existed && stateEntry.backup) {
1517
+ const previousStateBytes = restoreBytes.get(stateEntry.target);
1518
+ if (!previousStateBytes) {
1519
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Backup preflight lost the validated ownership-state bytes.');
1520
+ }
1521
+ try {
1522
+ previousState = assertRuntimeStateValue(JSON.parse(previousStateBytes.toString('utf8')));
1523
+ }
1524
+ catch (cause) {
1525
+ if (cause instanceof RuntimeManagerError)
1526
+ throw cause;
1527
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Backed-up runtime ownership state is not valid JSON.');
1528
+ }
1529
+ }
1530
+ const bundleRuntimeByTarget = new Map();
1531
+ for (const source of [state, previousState]) {
1532
+ for (const runtime of ['claude-code', 'codex', 'cursor']) {
1533
+ for (const file of source?.userBundles?.[runtime]?.ownedFiles ?? []) {
1534
+ bundleRuntimeByTarget.set(path.resolve(file.target), runtime);
1535
+ }
1536
+ }
1537
+ }
1538
+ const otherProjectUsesUserRuntime = (runtime) => Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key && projectUsesUserRuntime(otherProject, runtime));
664
1539
  const sharedTargets = new Set(manifest.files
665
- .filter((entry) => Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key &&
666
- otherProject.ownedFiles.some((owned) => owned.target === entry.target)))
1540
+ .filter((entry) => {
1541
+ const bundleRuntime = bundleRuntimeByTarget.get(path.resolve(entry.target));
1542
+ return ((bundleRuntime !== undefined && otherProjectUsesUserRuntime(bundleRuntime)) ||
1543
+ Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key &&
1544
+ otherProject.ownedFiles.some((owned) => owned.target === entry.target)));
1545
+ })
667
1546
  .map((entry) => entry.target));
668
1547
  for (const entry of manifest.files) {
669
- if (!sharedTargets.has(entry.target) &&
670
- !entry.existed &&
671
- existsSync(entry.target) &&
672
- entry.afterHash &&
673
- hash(await readFile(entry.target)) !== entry.afterHash) {
674
- throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to remove modified file ${entry.target}.`, 'Restore it manually or choose a different backup.');
1548
+ if (path.resolve(entry.target) === path.resolve(statePath()) || sharedTargets.has(entry.target))
1549
+ continue;
1550
+ const targetExists = existsSync(entry.target);
1551
+ const targetChanged = entry.afterHash
1552
+ ? !targetExists || hash(await readFile(entry.target)) !== entry.afterHash
1553
+ : targetExists;
1554
+ if (targetChanged) {
1555
+ throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to restore changed file ${entry.target}.`, 'Restore it manually or choose a different backup.');
675
1556
  }
676
1557
  }
677
- for (const entry of manifest.files) {
1558
+ for (const entry of [...manifest.files].reverse()) {
1559
+ if (path.resolve(entry.target) === path.resolve(statePath()))
1560
+ continue;
678
1561
  if (sharedTargets.has(entry.target)) {
679
1562
  retainedShared.push(entry.target);
680
1563
  continue;
681
1564
  }
682
1565
  if (entry.existed && entry.backup) {
1566
+ const bytes = restoreBytes.get(entry.target);
1567
+ if (!bytes)
1568
+ throw new RuntimeManagerError('E_RUNTIME_STATE_INVALID', 'Backup preflight lost validated bytes.');
683
1569
  await mkdir(path.dirname(entry.target), { recursive: true });
684
- await copyFile(entry.backup, entry.target);
1570
+ assertMutableOwnedTarget(entry.target, projectDir, 'E_RUNTIME_STATE_INVALID');
1571
+ await atomicWrite(entry.target, bytes);
685
1572
  }
686
1573
  else if (existsSync(entry.target)) {
687
1574
  await unlink(entry.target);
688
1575
  }
689
1576
  restored.push(entry.target);
690
1577
  }
691
- delete state.projects[key];
1578
+ const affectedRuntimes = new Set([
1579
+ ...(project?.runtimes ?? []),
1580
+ ...[...bundleRuntimeByTarget.entries()]
1581
+ .filter(([target]) => manifest.files.some((entry) => path.resolve(entry.target) === target))
1582
+ .map(([, runtime]) => runtime),
1583
+ ]);
1584
+ state.userBundles ??= {};
1585
+ for (const runtime of affectedRuntimes) {
1586
+ if (otherProjectUsesUserRuntime(runtime))
1587
+ continue;
1588
+ const previous = previousState?.userBundles?.[runtime];
1589
+ if (previous)
1590
+ state.userBundles[runtime] = previous;
1591
+ else
1592
+ delete state.userBundles[runtime];
1593
+ }
1594
+ const previousProject = previousState?.projects?.[key];
1595
+ if (previousProject)
1596
+ state.projects[key] = previousProject;
1597
+ else
1598
+ delete state.projects[key];
692
1599
  await atomicWrite(statePath(), Buffer.from(`${JSON.stringify(state, null, 2)}\n`));
693
1600
  return { ok: true, restored, retainedShared };
694
1601
  }
@@ -698,17 +1605,22 @@ export async function removeRuntime(runtime, projectDir) {
698
1605
  const project = state.projects[key];
699
1606
  if (!project)
700
1607
  throw new RuntimeManagerError('E_RUNTIME_STATE_MISSING', 'No managed runtime installation is recorded for this project.');
1608
+ assertRequestedProjectBinding(projectDir, key, project);
701
1609
  const removed = [];
702
1610
  const retainedShared = [];
703
1611
  const runtimeFiles = project.ownedFiles.filter((file) => file.runtime === runtime);
704
- const sharedTargets = new Set(runtimeFiles
705
- .filter((file) => Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key &&
706
- otherProject.ownedFiles.some((owned) => owned.runtime === runtime && owned.target === file.target)))
1612
+ const globalFiles = state.userBundles?.[runtime]?.ownedFiles ?? [];
1613
+ const hasOtherUserOwner = Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key && projectUsesUserRuntime(otherProject, runtime));
1614
+ const removalFiles = [...runtimeFiles, ...globalFiles];
1615
+ const sharedTargets = new Set(removalFiles
1616
+ .filter((file) => (hasOtherUserOwner && globalFiles.some((global) => global.target === file.target)) ||
1617
+ Object.entries(state.projects).some(([otherKey, otherProject]) => otherKey !== key &&
1618
+ otherProject.ownedFiles.some((owned) => owned.runtime === runtime && owned.target === file.target)))
707
1619
  .map((file) => file.target));
708
1620
  const lockFile = project.ownedFiles.find((file) => file.runtime === 'core' && file.target.endsWith('runtime-lock.json'));
709
1621
  // Validate every owned byte before mutating anything so a late conflict cannot
710
1622
  // leave the installation half-removed.
711
- for (const file of runtimeFiles) {
1623
+ for (const file of removalFiles) {
712
1624
  if (!existsSync(file.target) || sharedTargets.has(file.target))
713
1625
  continue;
714
1626
  const current = await readFile(file.target);
@@ -729,7 +1641,7 @@ export async function removeRuntime(runtime, projectDir) {
729
1641
  throw new RuntimeManagerError('E_MIGRATION_CONFLICT', `Refusing to update invalid runtime lock ${lockFile.target}.`, 'Repair or roll back the runtime lock before removing the adapter.');
730
1642
  }
731
1643
  }
732
- for (const file of runtimeFiles) {
1644
+ for (const file of removalFiles) {
733
1645
  if (!existsSync(file.target))
734
1646
  continue;
735
1647
  if (sharedTargets.has(file.target)) {
@@ -745,14 +1657,20 @@ export async function removeRuntime(runtime, projectDir) {
745
1657
  }
746
1658
  removed.push(file.target);
747
1659
  }
1660
+ if (!hasOtherUserOwner && state.userBundles)
1661
+ delete state.userBundles[runtime];
748
1662
  project.ownedFiles = project.ownedFiles.filter((file) => file.runtime !== runtime);
749
1663
  project.runtimes = project.runtimes.filter((item) => item !== runtime);
750
1664
  if (project.runtimeScopes)
751
1665
  delete project.runtimeScopes[runtime];
1666
+ if (project.skillModes)
1667
+ delete project.skillModes[runtime];
752
1668
  project.activeRuntime = project.runtimes.length === 1 ? project.runtimes[0] : undefined;
753
1669
  project.updatedAt = new Date().toISOString();
754
1670
  if (lockFile && lock) {
755
1671
  lock.adapters = lock.adapters.filter((adapter) => adapter.runtime !== runtime);
1672
+ if (lock.skillModes)
1673
+ delete lock.skillModes[runtime];
756
1674
  if (lock.adapters.length === 0) {
757
1675
  await unlink(lockFile.target);
758
1676
  project.ownedFiles = project.ownedFiles.filter((file) => file !== lockFile);
@@ -760,11 +1678,12 @@ export async function removeRuntime(runtime, projectDir) {
760
1678
  }
761
1679
  else {
762
1680
  lock.generatedAt = new Date().toISOString();
763
- lock.manifestDigest = `sha256:${hash(JSON.stringify({
764
- protocol: lock.protocolVersion,
1681
+ lock.manifestDigest = runtimeLockManifestDigest({
1682
+ protocolVersion: lock.protocolVersion,
765
1683
  pipelineVersion: lock.components.pipeline,
766
1684
  adapters: lock.adapters,
767
- }))}`;
1685
+ skillModes: lock.skillModes,
1686
+ });
768
1687
  const content = Buffer.from(`${JSON.stringify(lock, null, 2)}\n`);
769
1688
  await atomicWrite(lockFile.target, content);
770
1689
  lockFile.hash = hash(content);
@@ -783,52 +1702,32 @@ function homeProjectRecord(state) {
783
1702
  }
784
1703
  export async function previewHomeProjectCleanup() {
785
1704
  const state = await loadState();
1705
+ const key = projectKey(userHome());
786
1706
  const project = homeProjectRecord(state);
787
- if (!project || path.resolve(project.projectDir) !== path.resolve(userHome()))
1707
+ if (!project || canonicalProjectPath(project.projectDir) !== canonicalProjectPath(userHome()))
788
1708
  return [];
1709
+ assertRequestedProjectBinding(userHome(), key, project);
789
1710
  return project.ownedFiles.filter((file) => file.scope === 'project').map((file) => file.target);
790
1711
  }
791
1712
  export async function managedRuntimesForProject(projectDir) {
792
1713
  const state = await loadState();
793
- return [...(state.projects[projectKey(projectDir)]?.runtimes ?? [])];
1714
+ const key = projectKey(projectDir);
1715
+ const project = state.projects[key];
1716
+ if (project)
1717
+ assertRequestedProjectBinding(projectDir, key, project);
1718
+ return [...(project?.runtimes ?? [])];
794
1719
  }
795
1720
  export function isOpenPlanrHome(projectDir) {
796
- return path.resolve(projectDir) === path.resolve(userHome());
797
- }
798
- /**
799
- * FR7 (SPEC-005): the `doctor --fix` view of OpenPlanr-owned scratch that a
800
- * session left behind without finalizing. Reuses the machine-local operate root
801
- * that `runtimeDoctor` already diagnoses (`<home>/.planr`) so the preview and the
802
- * warning name the same abandoned cycles. This is a read: it lists ONLY scratch a
803
- * valid `openplanr-operate-scratch` ownership manifest confirms this project wrote
804
- * and whose lease window has lapsed — never an unrelated file that merely landed
805
- * under the scratch root.
806
- */
807
- export async function previewAbandonedOperateScratch(projectDir) {
808
- const paths = resolveOperatingPaths(projectDir, { localRoot: path.join(userHome(), '.planr') });
809
- return listAbandonedOperatingScratch(paths);
810
- }
811
- /**
812
- * FR7 (SPEC-005): the `doctor --fix` repair for abandoned OpenPlanr-owned scratch.
813
- * Delegates to the single owned-only cleanup (`purgeAbandonedOperatingScratch`)
814
- * that `planr operate cache purge` also calls — there is no second cleanup path.
815
- * It removes ONLY scratch a valid ownership manifest confirms this project wrote
816
- * whose lease has lapsed, and never broadens to anything else found under the
817
- * scratch tree, so a false positive can never delete a user's unrelated data.
818
- */
819
- export async function purgeAbandonedOperateScratch(projectDir) {
820
- return purgeAbandonedOperatingScratch({
821
- projectRoot: projectDir,
822
- localRoot: path.join(userHome(), '.planr'),
823
- });
1721
+ return canonicalProjectPath(projectDir) === canonicalProjectPath(userHome());
824
1722
  }
825
1723
  export async function cleanupHomeProjectInstall() {
826
1724
  const state = await loadState();
827
1725
  const key = projectKey(userHome());
828
1726
  const project = state.projects[key];
829
- if (!project || path.resolve(project.projectDir) !== path.resolve(userHome())) {
1727
+ if (!project || canonicalProjectPath(project.projectDir) !== canonicalProjectPath(userHome())) {
830
1728
  return { ok: true, removed: [] };
831
1729
  }
1730
+ assertRequestedProjectBinding(userHome(), key, project);
832
1731
  const projectFiles = project.ownedFiles.filter((file) => file.scope === 'project');
833
1732
  for (const file of projectFiles) {
834
1733
  if (!existsSync(file.target))
@@ -873,34 +1772,6 @@ export async function cleanupHomeProjectInstall() {
873
1772
  await atomicWrite(statePath(), Buffer.from(`${JSON.stringify(state, null, 2)}\n`));
874
1773
  return { ok: true, removed };
875
1774
  }
876
- /**
877
- * The single warn-vs-fail classification for a drifted component tuple.
878
- *
879
- * `doctor`'s runtime-lock diagnostic and `planr upgrade status`
880
- * (`reconcileInstalledTuple`) both call this, so the
881
- * `upgradeOnlyDrift`-versus-`genuineDrift` distinction (SPEC-006 FR3) is
882
- * defined once rather than re-derived. A CLI that merely trails an upgrade
883
- * (`upgradeOnlyDrift`) is a `warn`; a genuinely incompatible tuple
884
- * (`incompatibleDrift`, doctor's digest/adapter drift) is a `fail`; any other
885
- * drift with no explaining CLI advance is also a `fail`.
886
- *
887
- * The math is a literal extraction of the former inline block, so every
888
- * pre-existing `runtime-manager-service.test.ts` assertion is the proof the
889
- * behaviour was preserved.
890
- */
891
- export function classifyComponentDrift(input) {
892
- const drift = input.componentDrift || input.incompatibleDrift;
893
- const genuineDrift = input.incompatibleDrift;
894
- const upgradeOnlyDrift = drift && !genuineDrift && input.cliDrift;
895
- const status = genuineDrift
896
- ? 'fail'
897
- : upgradeOnlyDrift
898
- ? 'warn'
899
- : drift
900
- ? 'fail'
901
- : 'pass';
902
- return { drift, genuineDrift, upgradeOnlyDrift, status };
903
- }
904
1775
  export async function runtimeDoctor(projectDir, options = {}) {
905
1776
  const diagnostics = [];
906
1777
  const repairs = [];
@@ -934,36 +1805,61 @@ export async function runtimeDoctor(projectDir, options = {}) {
934
1805
  diagnostics.push({
935
1806
  code: 'pipeline-package',
936
1807
  status: pipeline ? 'pass' : 'warn',
937
- message: pipeline ? `planr-pipeline ${pipeline.version}` : 'Planning-only installation',
938
- ...(!pipeline ? { fix: 'Install openplanr without omitting optional dependencies.' } : {}),
1808
+ message: pipeline
1809
+ ? `Optional deterministic pipeline utilities ${pipeline.version}`
1810
+ : 'Optional deterministic pipeline utilities are not installed',
1811
+ ...(!pipeline
1812
+ ? { fix: 'Install optional dependencies only if you need pipeline utilities.' }
1813
+ : {}),
939
1814
  });
940
- if (pipeline) {
941
- const registry = listRuntimeAdapters();
942
- for (const adapter of registry) {
943
- const detected = detectedRuntimes.find((entry) => entry.runtime === adapter.id)?.installed;
944
- const configured = installed?.runtimes.includes(adapter.id) ?? false;
945
- if (!detected && !configured)
946
- continue;
947
- const mode = adapter.capabilities?.interactiveQuestions;
948
- diagnostics.push({
949
- code: `runtime-interaction-${adapter.id}`,
950
- status: mode ? 'pass' : 'fail',
951
- message: mode
952
- ? `${adapter.id} declares ${mode} guided questions with native chat → terminal → handoff fallback`
953
- : `${adapter.id} does not declare a guided interaction capability`,
954
- ...(!mode
955
- ? { fix: 'Install the exact compatible planr-pipeline release and rerun setup.' }
956
- : {}),
957
- });
958
- }
1815
+ const registry = listRuntimeAdapters();
1816
+ for (const adapter of registry) {
1817
+ const detected = detectedRuntimes.find((entry) => entry.runtime === adapter.id)?.installed;
1818
+ const configured = installed?.runtimes.includes(adapter.id) ?? false;
1819
+ if (!detected && !configured)
1820
+ continue;
1821
+ const mode = adapter.capabilities?.interactiveQuestions;
1822
+ diagnostics.push({
1823
+ code: `runtime-interaction-${adapter.id}`,
1824
+ status: mode ? 'pass' : 'fail',
1825
+ message: mode
1826
+ ? `${adapter.id} uses ${mode} host-native questions`
1827
+ : `${adapter.id} does not declare a host-native question capability`,
1828
+ ...(!mode ? { fix: 'Reinstall the OpenPlanr utility CLI host package.' } : {}),
1829
+ });
1830
+ }
1831
+ try {
1832
+ const counts = {
1833
+ claude: new Set(bundledSkillAssets('claude-code').map(({ skillId }) => skillId)).size,
1834
+ codex: new Set(bundledSkillAssets('codex').map(({ skillId }) => skillId)).size,
1835
+ cursor: new Set(bundledSkillAssets('cursor').map(({ skillId }) => skillId)).size,
1836
+ };
1837
+ const uniqueCounts = new Set(Object.values(counts));
1838
+ const current = uniqueCounts.size === 1 && counts.claude > 0;
1839
+ diagnostics.push({
1840
+ code: 'host-skill-packages',
1841
+ status: current ? 'pass' : 'fail',
1842
+ message: current
1843
+ ? `Claude Code, Codex, and Cursor each expose all ${counts.claude} host-native skills`
1844
+ : `Host skill package membership drifted (${JSON.stringify(counts)})`,
1845
+ ...(!current ? { fix: 'Reinstall the CLI or regenerate its host packages.' } : {}),
1846
+ });
1847
+ }
1848
+ catch (cause) {
1849
+ diagnostics.push({
1850
+ code: 'host-skill-packages',
1851
+ status: 'fail',
1852
+ message: cause instanceof Error ? cause.message : String(cause),
1853
+ fix: 'Reinstall the CLI or regenerate its host packages.',
1854
+ });
959
1855
  }
960
1856
  const claudeManagedAtUserScope = Object.values(state.projects).some((project) => project.runtimes.includes('claude-code') &&
961
1857
  ['user', 'both'].includes(project.runtimeScopes?.['claude-code'] ??
962
1858
  inferRuntimeScope(project.ownedFiles, 'claude-code')));
963
1859
  const claudeDetected = Boolean(options.claudeCommandRunner) ||
964
1860
  (detectedRuntimes.find((runtime) => runtime.runtime === 'claude-code')?.installed ?? false);
965
- if (pipeline && claudeDetected && claudeManagedAtUserScope) {
966
- const inspection = inspectClaudePluginIntegration(pipeline.version, options.claudeCommandRunner);
1861
+ if (claudeDetected && claudeManagedAtUserScope) {
1862
+ const inspection = inspectBundledClaudePluginIntegration(bundledHostRoot('claude'), options.claudeCommandRunner);
967
1863
  if (inspection.error) {
968
1864
  diagnostics.push({
969
1865
  code: 'runtime-claude-plugins',
@@ -996,7 +1892,7 @@ export async function runtimeDoctor(projectDir, options = {}) {
996
1892
  code: 'runtime-claude-legacy-plugin',
997
1893
  status: 'warn',
998
1894
  message: `Legacy Claude plugin installation detected: ${inspection.legacyPluginIds.join(', ')}`,
999
- fix: 'Verify `openplanr@openplanr`, then remove the legacy plugin from Claude Code.',
1895
+ fix: 'Verify `planr@openplanr-local`, then remove the legacy plugin from Claude Code.',
1000
1896
  });
1001
1897
  }
1002
1898
  }
@@ -1028,12 +1924,13 @@ export async function runtimeDoctor(projectDir, options = {}) {
1028
1924
  const cliDrift = value.components?.cli !== cliVersion;
1029
1925
  const componentDrift = cliDrift ||
1030
1926
  (pipeline && value.components?.pipeline !== pipeline.version) ||
1031
- value.components?.skills !== OPENPLANR_SKILLS_VERSION;
1032
- const expectedDigest = `sha256:${hash(JSON.stringify({
1033
- protocol: value.protocolVersion,
1927
+ value.components?.skills !== readRegistry().pluginVersion;
1928
+ const expectedDigest = runtimeLockManifestDigest({
1929
+ protocolVersion: value.protocolVersion,
1034
1930
  pipelineVersion: value.components?.pipeline,
1035
1931
  adapters: value.adapters,
1036
- }))}`;
1932
+ skillModes: value.skillModes,
1933
+ });
1037
1934
  const digestDrift = value.manifestDigest !== expectedDigest;
1038
1935
  const registry = listRuntimeAdapters();
1039
1936
  const adapterDrift = (value.adapters ?? []).some((locked) => {
@@ -1044,7 +1941,7 @@ export async function runtimeDoctor(projectDir, options = {}) {
1044
1941
  });
1045
1942
  // FR11: an OpenPlanr upgrade advances the CLI version the lock recorded.
1046
1943
  // When the CLI component trails the installed build and nothing that
1047
- // governs Operating Board dispatch (runtime adapters, manifest digest)
1944
+ // governs runtime dispatch (runtime adapters, manifest digest)
1048
1945
  // diverged, the lock is simply behind an expected upgrade — surface it as
1049
1946
  // an informational `warn`, not a `fail` implying the board is broken. A
1050
1947
  // digest/adapter drift, or a component drift that does not include the CLI
@@ -1053,7 +1950,7 @@ export async function runtimeDoctor(projectDir, options = {}) {
1053
1950
  // helper so `planr upgrade status` reuses this exact distinction (SPEC-006
1054
1951
  // FR3) rather than re-deriving it; a digest/adapter drift is doctor's
1055
1952
  // flavour of an incompatible tuple.
1056
- const { drift, genuineDrift, upgradeOnlyDrift, status } = classifyComponentDrift({
1953
+ const { drift, genuineDrift, upgradeOnlyDrift, status } = classifyRuntimeComponentDrift({
1057
1954
  cliDrift,
1058
1955
  componentDrift: Boolean(componentDrift),
1059
1956
  incompatibleDrift: digestDrift || adapterDrift,
@@ -1064,7 +1961,7 @@ export async function runtimeDoctor(projectDir, options = {}) {
1064
1961
  message: genuineDrift
1065
1962
  ? `Runtime lock drift detected (components: ${componentDrift}, digest: ${digestDrift}, adapters: ${adapterDrift})`
1066
1963
  : upgradeOnlyDrift
1067
- ? `Runtime lock component versions trail an OpenPlanr upgrade (components: ${componentDrift}); this is expected after upgrading and does not affect Operating Board execution`
1964
+ ? `Runtime lock component versions trail an OpenPlanr upgrade (components: ${componentDrift}); this is expected after upgrading and does not affect runtime execution`
1068
1965
  : drift
1069
1966
  ? `Runtime lock drift detected (components: ${componentDrift}, digest: ${digestDrift}, adapters: ${adapterDrift})`
1070
1967
  : 'Project runtime lock matches installed component versions',
@@ -1104,143 +2001,60 @@ export async function runtimeDoctor(projectDir, options = {}) {
1104
2001
  ...(stateDrift ? { fix: 'Run `planr setup --dry-run`, then approve the repair.' } : {}),
1105
2002
  });
1106
2003
  }
1107
- const conflicts = [];
1108
- const missing = [];
1109
- for (const file of installed.ownedFiles) {
1110
- if (!existsSync(file.target))
1111
- missing.push(file.target);
1112
- else if (ownershipHash(readFileSync(file.target), file.kind, file.marker) !== file.hash)
1113
- conflicts.push(file.target);
1114
- }
2004
+ }
2005
+ else if (lockedAdapters?.length) {
1115
2006
  diagnostics.push({
1116
- code: conflicts.length ? 'migration-conflict' : 'managed-files',
1117
- status: conflicts.length ? 'fail' : missing.length ? 'warn' : 'pass',
1118
- message: conflicts.length
1119
- ? `${conflicts.length} managed file(s) changed outside setup`
1120
- : missing.length
1121
- ? `${missing.length} managed file(s) are missing`
1122
- : 'Managed runtime files match recorded ownership hashes',
1123
- ...(conflicts.length || missing.length
1124
- ? { fix: 'Run `planr setup --dry-run`, then explicitly approve repair or rollback.' }
1125
- : {}),
2007
+ code: 'runtime-state-missing',
2008
+ status: 'warn',
2009
+ message: 'The project has a runtime lock but this machine has no managed adapter state',
2010
+ fix: 'Run `planr setup` to install the locked runtime adapters on this machine.',
1126
2011
  });
1127
- const installedSkills = installed.ownedFiles.filter((file) => file.runtime === 'codex' && file.target.endsWith(`${path.sep}SKILL.md`));
1128
- if (installedSkills.length > 0) {
1129
- const supported = new Set(['artifact', 'doctor', 'operate', 'pipeline']);
1130
- const violations = [];
1131
- for (const skill of installedSkills) {
1132
- if (!existsSync(skill.target))
1133
- continue;
1134
- const content = readFileSync(skill.target, 'utf8');
1135
- if (/`planr-pipeline\s+[^`]+`/u.test(content)) {
1136
- violations.push(`${skill.target}: invokes planr-pipeline directly`);
1137
- }
1138
- for (const match of content.matchAll(/`planr\s+([a-z][\w-]*)(?:\s|`)/gu)) {
1139
- if (!supported.has(match[1])) {
1140
- violations.push(`${skill.target}: unknown planr command ${match[1]}`);
1141
- }
1142
- }
1143
- }
1144
- diagnostics.push({
1145
- code: 'skill-commands',
1146
- status: violations.length > 0 ? 'fail' : 'pass',
1147
- message: violations.length > 0
1148
- ? `${violations.length} installed skill command reference(s) are invalid`
1149
- : 'Installed Codex skills reference public planr commands only',
1150
- ...(violations.length > 0
1151
- ? { fix: 'Run `planr setup --runtime codex --scope user` to refresh managed skills.' }
1152
- : {}),
1153
- });
1154
- }
1155
- // FR5: locate the operate skill by the name the installer actually wrote, derived
1156
- // from the same persisted prefix through the same helper. A `--no-prefix` install
1157
- // lives at `.codex/skills/operate/SKILL.md`, not the namespaced literal; without
1158
- // this the find misses the bare install, so the content contract below never runs
1159
- // while doctor still reports ok. The default keeps namespaced installs unchanged.
1160
- const operateSkillName = applyCommandPrefix('planr-operate', installed.commandPrefix ?? 'namespaced');
1161
- const operateSkill = installedSkills.find((skill) => path.basename(path.dirname(skill.target)) === operateSkillName);
1162
- if (installed.runtimes.includes('codex') && !operateSkill) {
1163
- diagnostics.push({
1164
- code: 'operate-skill',
1165
- status: 'warn',
1166
- message: `The installed Codex adapter is missing the ${operateSkillName} skill`,
1167
- fix: 'Run `planr setup --runtime codex --scope user` to install the managed skill.',
1168
- });
1169
- }
1170
- else if (operateSkill && existsSync(operateSkill.target)) {
1171
- const content = readFileSync(operateSkill.target, 'utf8');
1172
- const valid = new RegExp(String.raw `^name:\s*${operateSkillName}$`, 'mu').test(content) &&
1173
- /`planr operate(?:\s|`)/u.test(content) &&
1174
- /# Planr Operate — Codex-native workflow/u.test(content) &&
1175
- /planr operate inspect --json/u.test(content) &&
1176
- /bare `\$planr-operate`/u.test(content) &&
1177
- /Never dump a questionnaire/u.test(content) &&
1178
- /compact context review/u.test(content) &&
1179
- /If the user says “find it from the project,” continue investigating/u.test(content) &&
1180
- /`status`, `report`, `context show`/u.test(content) &&
1181
- /operating-advisor-response@1\.4/u.test(content) &&
1182
- /CEO, CTO, CPO, CMO, COO, then \[Chair\]/u.test(content) &&
1183
- /runtimeBinding: required/u.test(content) &&
1184
- /crossRuntimeFallback: false/u.test(content) &&
1185
- /harness prepare\|record\|finalize\|resume\|cancel/u.test(content) &&
1186
- /Never invoke another vendor runtime/u.test(content) &&
1187
- !/`planr-pipeline\s+[^`]+`/u.test(content) &&
1188
- /Never deploy, publish, spend, contact customers/u.test(content);
1189
- diagnostics.push({
1190
- code: 'operate-skill',
1191
- status: valid ? 'pass' : 'fail',
1192
- message: valid
1193
- ? `Installed ${operateSkillName} skill references the public CLI and preserves the SHIP boundary`
1194
- : `Installed ${operateSkillName} skill does not satisfy the functional command contract`,
1195
- ...(!valid
1196
- ? { fix: 'Run `planr setup --runtime codex --scope user` to refresh the managed skill.' }
1197
- : {}),
1198
- });
1199
- }
1200
- const cursorOperateRule = installed.ownedFiles.find((file) => file.runtime === 'cursor' && path.basename(file.target) === 'openplanr-operate.mdc');
1201
- if (installed.runtimes.includes('cursor') && !cursorOperateRule) {
2012
+ }
2013
+ const globallyOwned = Object.values(state.userBundles ?? {}).flatMap((bundle) => bundle?.ownedFiles ?? []);
2014
+ const managedFiles = [
2015
+ ...(installed?.ownedFiles ?? []),
2016
+ ...globallyOwned.filter((file, index, files) => files.findIndex((candidate) => candidate.target === file.target) === index),
2017
+ ];
2018
+ const managedFileDiagnostic = diagnoseManagedRuntimeFiles(managedFiles, ownershipHash);
2019
+ if (managedFileDiagnostic)
2020
+ diagnostics.push(managedFileDiagnostic);
2021
+ const codexBundle = state.userBundles?.codex;
2022
+ if (detectRuntimes().some((runtime) => runtime.runtime === 'codex' && runtime.installed)) {
2023
+ const configuredMode = codexBundle?.installMode ?? installed?.skillModes?.codex ?? 'direct';
2024
+ const inspection = inspectCodexPluginIntegration(bundledHostRoot('openai'), configuredMode, configuredMode);
2025
+ const directSkillFiles = codexBundle?.ownedFiles.filter((file) => pathIsWithin(file.target, codexSkillsRoot()))
2026
+ .length ?? 0;
2027
+ if (inspection.error) {
1202
2028
  diagnostics.push({
1203
- code: 'operate-cursor-rule',
2029
+ code: 'runtime-codex-plugin',
1204
2030
  status: 'warn',
1205
- message: 'The installed Cursor adapter is missing the Operating Board rule',
1206
- fix: 'Run `planr setup --runtime cursor --scope project` to install the managed rule.',
2031
+ message: `Codex plugin state could not be inspected: ${inspection.error}`,
2032
+ fix: 'Run `planr setup --runtime codex --dry-run` for an exact repair preview.',
1207
2033
  });
1208
2034
  }
1209
- else if (cursorOperateRule && existsSync(cursorOperateRule.target)) {
1210
- const content = readFileSync(cursorOperateRule.target, 'utf8');
1211
- const valid = /# OpenPlanr Operate — Cursor-native workflow/u.test(content) &&
1212
- /planr operate inspect\s+--json/u.test(content) &&
1213
- /one complete Cursor-bound cycle/u.test(content) &&
1214
- /Never dump a questionnaire/u.test(content) &&
1215
- /v1\.4 response/u.test(content) &&
1216
- /runtimeBinding: required/u.test(content) &&
1217
- /crossRuntimeFallback: false/u.test(content) &&
1218
- /internal `harness` lifecycle invisibly/u.test(content) &&
1219
- /Never invoke another vendor runtime/u.test(content) &&
1220
- !/`planr-pipeline\s+[^`]+`/u.test(content) &&
1221
- /do not approve, accept, apply, PLAN, SHIP/u.test(content);
2035
+ else {
1222
2036
  diagnostics.push({
1223
- code: 'operate-cursor-rule',
1224
- status: valid ? 'pass' : 'fail',
1225
- message: valid
1226
- ? 'Installed Cursor Operating Board rule references the public CLI and preserves the SHIP boundary'
1227
- : 'Installed Cursor Operating Board rule does not satisfy the functional command contract',
1228
- ...(!valid
1229
- ? {
1230
- fix: 'Run `planr setup --runtime cursor --scope project` to refresh the managed rule.',
1231
- }
1232
- : {}),
2037
+ code: 'runtime-codex-install-mode',
2038
+ status: inspection.ready ? 'pass' : 'warn',
2039
+ message: inspection.ready
2040
+ ? `Codex ${configuredMode} discovery is current`
2041
+ : `Codex ${configuredMode} discovery has ${inspection.operations.length} pending repair operation(s)`,
2042
+ ...(inspection.ready
2043
+ ? {}
2044
+ : {
2045
+ fix: 'Run `planr setup --runtime codex --dry-run`, then apply the reviewed repair.',
2046
+ }),
1233
2047
  });
2048
+ if ((directSkillFiles > 0 && inspection.installed) || inspection.duplicates.length > 0) {
2049
+ diagnostics.push({
2050
+ code: 'runtime-codex-duplicate-discovery',
2051
+ status: 'warn',
2052
+ message: `Codex has duplicate OpenPlanr discovery ownership${inspection.duplicates.length ? `: ${inspection.duplicates.join(', ')}` : ' across direct skills and the unified plugin'}`,
2053
+ fix: 'Choose direct or unified-plugin mode, preview setup, and use --replace-managed only for manifest-owned content.',
2054
+ });
2055
+ }
1234
2056
  }
1235
2057
  }
1236
- else if (lockedAdapters?.length) {
1237
- diagnostics.push({
1238
- code: 'runtime-state-missing',
1239
- status: 'warn',
1240
- message: 'The project has a runtime lock but this machine has no managed adapter state',
1241
- fix: 'Run `planr setup` to install the locked runtime adapters on this machine.',
1242
- });
1243
- }
1244
2058
  const accidentalHomeFiles = await previewHomeProjectCleanup();
1245
2059
  if (accidentalHomeFiles.length > 0) {
1246
2060
  diagnostics.push({
@@ -1250,40 +2064,9 @@ export async function runtimeDoctor(projectDir, options = {}) {
1250
2064
  fix: 'Run `planr doctor --fix` to preview and remove only recorded OpenPlanr-owned project content.',
1251
2065
  });
1252
2066
  }
1253
- const provenancePath = path.join(projectDir, '.planr', 'provenance.jsonl');
1254
- if (existsSync(provenancePath)) {
1255
- const invalidLines = [];
1256
- const lines = readFileSync(provenancePath, 'utf8').split(/\r?\n/);
1257
- for (const [index, line] of lines.entries()) {
1258
- if (!line.trim())
1259
- continue;
1260
- try {
1261
- const event = JSON.parse(line);
1262
- if (!event.event_id || !event.producer?.product)
1263
- invalidLines.push(index + 1);
1264
- }
1265
- catch {
1266
- invalidLines.push(index + 1);
1267
- }
1268
- }
1269
- diagnostics.push({
1270
- code: invalidLines.length ? 'provenance-invalid' : 'provenance',
1271
- status: invalidLines.length ? 'fail' : 'pass',
1272
- message: invalidLines.length
1273
- ? `Provenance contains invalid event lines: ${invalidLines.join(', ')}`
1274
- : 'Provenance is append-only JSONL with identifiable producers',
1275
- ...(invalidLines.length
1276
- ? {
1277
- fix: 'Repair the invalid bytes, then explicitly append a recovery event. Doctor will not invent history.',
1278
- }
1279
- : {}),
1280
- });
1281
- }
1282
- diagnostics.push(...(await diagnoseOperatingBoard({
1283
- projectRoot: projectDir,
1284
- localRoot: path.join(userHome(), '.planr'),
1285
- pipelineVersion: pipeline?.version,
1286
- })));
2067
+ const provenanceDiagnostic = diagnoseRuntimeProvenance(projectDir);
2068
+ if (provenanceDiagnostic)
2069
+ diagnostics.push(provenanceDiagnostic);
1287
2070
  if (pipeline) {
1288
2071
  const result = spawnSync(process.execPath, [
1289
2072
  path.join(pipeline.root, 'scripts', 'doctor.mjs'),
@@ -1315,7 +2098,7 @@ export async function runtimeDoctor(projectDir, options = {}) {
1315
2098
  code: 'pipeline-doctor-unavailable',
1316
2099
  status: 'warn',
1317
2100
  message: 'The pipeline doctor did not return valid JSON',
1318
- fix: 'Run `planr pipeline doctor` for direct diagnostics.',
2101
+ fix: 'Run `planr doctor` for direct diagnostics.',
1319
2102
  });
1320
2103
  }
1321
2104
  }