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.
- package/CHANGELOG.md +75 -0
- package/CONTRIBUTING.md +33 -0
- package/README.md +154 -131
- package/dist/cli/commands/artifact.d.ts.map +1 -1
- package/dist/cli/commands/artifact.js +214 -30
- package/dist/cli/commands/artifact.js.map +1 -1
- package/dist/cli/commands/backlog.d.ts +1 -21
- package/dist/cli/commands/backlog.d.ts.map +1 -1
- package/dist/cli/commands/backlog.js +1 -428
- package/dist/cli/commands/backlog.js.map +1 -1
- package/dist/cli/commands/company.d.ts +3 -0
- package/dist/cli/commands/company.d.ts.map +1 -0
- package/dist/cli/commands/company.js +173 -0
- package/dist/cli/commands/company.js.map +1 -0
- package/dist/cli/commands/config-deterministic.d.ts +3 -0
- package/dist/cli/commands/config-deterministic.d.ts.map +1 -0
- package/dist/cli/commands/config-deterministic.js +88 -0
- package/dist/cli/commands/config-deterministic.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +36 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/diagram/index.d.ts +3 -0
- package/dist/cli/commands/diagram/index.d.ts.map +1 -0
- package/dist/cli/commands/diagram/index.js +73 -0
- package/dist/cli/commands/diagram/index.js.map +1 -0
- package/dist/cli/commands/diagram/presentation.d.ts +4 -0
- package/dist/cli/commands/diagram/presentation.d.ts.map +1 -0
- package/dist/cli/commands/diagram/presentation.js +38 -0
- package/dist/cli/commands/diagram/presentation.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +1 -11
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/epic.d.ts +1 -9
- package/dist/cli/commands/epic.d.ts.map +1 -1
- package/dist/cli/commands/epic.js +1 -259
- package/dist/cli/commands/epic.js.map +1 -1
- package/dist/cli/commands/feature.d.ts +1 -8
- package/dist/cli/commands/feature.d.ts.map +1 -1
- package/dist/cli/commands/feature.js +1 -220
- package/dist/cli/commands/feature.js.map +1 -1
- package/dist/cli/commands/groups/delivery.d.ts +3 -0
- package/dist/cli/commands/groups/delivery.d.ts.map +1 -0
- package/dist/cli/commands/groups/delivery.js +13 -0
- package/dist/cli/commands/groups/delivery.js.map +1 -0
- package/dist/cli/commands/groups/foundation.d.ts +3 -0
- package/dist/cli/commands/groups/foundation.d.ts.map +1 -0
- package/dist/cli/commands/groups/foundation.js +11 -0
- package/dist/cli/commands/groups/foundation.js.map +1 -0
- package/dist/cli/commands/groups/intelligence.d.ts +3 -0
- package/dist/cli/commands/groups/intelligence.d.ts.map +1 -0
- package/dist/cli/commands/groups/intelligence.js +19 -0
- package/dist/cli/commands/groups/intelligence.js.map +1 -0
- package/dist/cli/commands/groups/operations.d.ts +3 -0
- package/dist/cli/commands/groups/operations.d.ts.map +1 -0
- package/dist/cli/commands/groups/operations.js +17 -0
- package/dist/cli/commands/groups/operations.js.map +1 -0
- package/dist/cli/commands/groups/planning.d.ts +3 -0
- package/dist/cli/commands/groups/planning.d.ts.map +1 -0
- package/dist/cli/commands/groups/planning.js +25 -0
- package/dist/cli/commands/groups/planning.js.map +1 -0
- package/dist/cli/commands/index.d.ts +4 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +14 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init-deterministic.d.ts +3 -0
- package/dist/cli/commands/init-deterministic.d.ts.map +1 -0
- package/dist/cli/commands/init-deterministic.js +40 -0
- package/dist/cli/commands/init-deterministic.js.map +1 -0
- package/dist/cli/commands/land.d.ts +15 -0
- package/dist/cli/commands/land.d.ts.map +1 -0
- package/dist/cli/commands/land.js +176 -0
- package/dist/cli/commands/land.js.map +1 -0
- package/dist/cli/commands/operate/input.d.ts +54 -0
- package/dist/cli/commands/operate/input.d.ts.map +1 -0
- package/dist/cli/commands/operate/input.js +98 -0
- package/dist/cli/commands/operate/input.js.map +1 -0
- package/dist/cli/commands/operate/registrars/assignments.d.ts +5 -0
- package/dist/cli/commands/operate/registrars/assignments.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/assignments.js +167 -0
- package/dist/cli/commands/operate/registrars/assignments.js.map +1 -0
- package/dist/cli/commands/operate/registrars/catalog.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/catalog.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/catalog.js +12 -0
- package/dist/cli/commands/operate/registrars/catalog.js.map +1 -0
- package/dist/cli/commands/operate/registrars/contracts.d.ts +41 -0
- package/dist/cli/commands/operate/registrars/contracts.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/contracts.js +2 -0
- package/dist/cli/commands/operate/registrars/contracts.js.map +1 -0
- package/dist/cli/commands/operate/registrars/dashboard.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/dashboard.js +26 -0
- package/dist/cli/commands/operate/registrars/dashboard.js.map +1 -0
- package/dist/cli/commands/operate/registrars/dispatch.d.ts +7 -0
- package/dist/cli/commands/operate/registrars/dispatch.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/dispatch.js +55 -0
- package/dist/cli/commands/operate/registrars/dispatch.js.map +1 -0
- package/dist/cli/commands/operate/registrars/experience.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/experience.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/experience.js +93 -0
- package/dist/cli/commands/operate/registrars/experience.js.map +1 -0
- package/dist/cli/commands/operate/registrars/index.d.ts +5 -0
- package/dist/cli/commands/operate/registrars/index.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/index.js +28 -0
- package/dist/cli/commands/operate/registrars/index.js.map +1 -0
- package/dist/cli/commands/operate/registrars/lifecycle.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/lifecycle.js +46 -0
- package/dist/cli/commands/operate/registrars/lifecycle.js.map +1 -0
- package/dist/cli/commands/operate/registrars/measurement.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/measurement.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/measurement.js +122 -0
- package/dist/cli/commands/operate/registrars/measurement.js.map +1 -0
- package/dist/cli/commands/operate/registrars/note-validation.d.ts +6 -0
- package/dist/cli/commands/operate/registrars/note-validation.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/note-validation.js +103 -0
- package/dist/cli/commands/operate/registrars/note-validation.js.map +1 -0
- package/dist/cli/commands/operate/registrars/planning.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/planning.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/planning.js +41 -0
- package/dist/cli/commands/operate/registrars/planning.js.map +1 -0
- package/dist/cli/commands/operate/registrars/recovery.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/recovery.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/recovery.js +65 -0
- package/dist/cli/commands/operate/registrars/recovery.js.map +1 -0
- package/dist/cli/commands/operate/registrars/reviews.d.ts +4 -0
- package/dist/cli/commands/operate/registrars/reviews.d.ts.map +1 -0
- package/dist/cli/commands/operate/registrars/reviews.js +83 -0
- package/dist/cli/commands/operate/registrars/reviews.js.map +1 -0
- package/dist/cli/commands/operate/registration.d.ts +4 -0
- package/dist/cli/commands/operate/registration.d.ts.map +1 -0
- package/dist/cli/commands/operate/registration.js +3 -0
- package/dist/cli/commands/operate/registration.js.map +1 -0
- package/dist/cli/commands/operate/render.d.ts +19 -0
- package/dist/cli/commands/operate/render.d.ts.map +1 -0
- package/dist/cli/commands/operate/render.js +201 -0
- package/dist/cli/commands/operate/render.js.map +1 -0
- package/dist/cli/commands/operate.d.ts +58 -13
- package/dist/cli/commands/operate.d.ts.map +1 -1
- package/dist/cli/commands/operate.js +169 -984
- package/dist/cli/commands/operate.js.map +1 -1
- package/dist/cli/commands/planning-artifacts.d.ts +10 -0
- package/dist/cli/commands/planning-artifacts.d.ts.map +1 -0
- package/dist/cli/commands/planning-artifacts.js +350 -0
- package/dist/cli/commands/planning-artifacts.js.map +1 -0
- package/dist/cli/commands/quick/interaction.d.ts +8 -0
- package/dist/cli/commands/quick/interaction.d.ts.map +1 -0
- package/dist/cli/commands/quick/interaction.js +8 -0
- package/dist/cli/commands/quick/interaction.js.map +1 -0
- package/dist/cli/commands/quick/project.d.ts +8 -0
- package/dist/cli/commands/quick/project.d.ts.map +1 -0
- package/dist/cli/commands/quick/project.js +8 -0
- package/dist/cli/commands/quick/project.js.map +1 -0
- package/dist/cli/commands/quick.d.ts +1 -29
- package/dist/cli/commands/quick.d.ts.map +1 -1
- package/dist/cli/commands/quick.js +1 -337
- package/dist/cli/commands/quick.js.map +1 -1
- package/dist/cli/commands/rules.js +1 -1
- package/dist/cli/commands/rules.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +40 -18
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +6 -4
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +166 -174
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts +1 -8
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +1 -522
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/story/interaction.d.ts +7 -0
- package/dist/cli/commands/story/interaction.d.ts.map +1 -0
- package/dist/cli/commands/story/interaction.js +7 -0
- package/dist/cli/commands/story/interaction.js.map +1 -0
- package/dist/cli/commands/story/project.d.ts +10 -0
- package/dist/cli/commands/story/project.d.ts.map +1 -0
- package/dist/cli/commands/story/project.js +10 -0
- package/dist/cli/commands/story/project.js.map +1 -0
- package/dist/cli/commands/story.d.ts +1 -8
- package/dist/cli/commands/story.d.ts.map +1 -1
- package/dist/cli/commands/story.js +1 -358
- package/dist/cli/commands/story.js.map +1 -1
- package/dist/cli/commands/task.d.ts +1 -9
- package/dist/cli/commands/task.d.ts.map +1 -1
- package/dist/cli/commands/task.js +1 -351
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/error-boundary.d.ts +29 -0
- package/dist/cli/error-boundary.d.ts.map +1 -0
- package/dist/cli/error-boundary.js +103 -0
- package/dist/cli/error-boundary.js.map +1 -0
- package/dist/cli/helpers/bulk-checkbox-update.d.ts +1 -1
- package/dist/cli/helpers/bulk-checkbox-update.js +1 -1
- package/dist/cli/index.js +38 -113
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +68 -0
- package/dist/dashboard/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/dashboard/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/dashboard/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/dashboard/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-cyrillic-ext-wght-normal-X_5orZeX.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-cyrillic-wght-normal-DiZS0aHC.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-latin-ext-wght-normal-Bwz-egvJ.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-latin-wght-normal-XN7g48iV.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-symbols2-wght-normal-CO5SzqOn.woff2 +0 -0
- package/dist/dashboard/assets/geist-mono-vietnamese-wght-normal-DadHysG0.woff2 +0 -0
- package/dist/dashboard/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/dashboard/assets/index-Bk8DyO_2.css +1 -0
- package/dist/dashboard/assets/index-zeygL5iu.js +557 -0
- package/dist/dashboard/assets/index-zeygL5iu.js.map +1 -0
- package/dist/dashboard/dashboard-manifest.json +84 -0
- package/dist/dashboard/index.html +13 -0
- package/dist/generators/base-generator.d.ts +2 -0
- package/dist/generators/base-generator.d.ts.map +1 -1
- package/dist/generators/base-generator.js +8 -0
- package/dist/generators/base-generator.js.map +1 -1
- package/dist/generators/claude-generator.d.ts.map +1 -1
- package/dist/generators/claude-generator.js +12 -14
- package/dist/generators/claude-generator.js.map +1 -1
- package/dist/generators/codex-generator.d.ts.map +1 -1
- package/dist/generators/codex-generator.js +7 -7
- package/dist/generators/codex-generator.js.map +1 -1
- package/dist/generators/cursor-generator.d.ts.map +1 -1
- package/dist/generators/cursor-generator.js +11 -30
- package/dist/generators/cursor-generator.js.map +1 -1
- package/dist/models/schema.d.ts +0 -23
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +0 -7
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +3 -14
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/artifact-pipeline-service.d.ts +99 -1
- package/dist/services/artifact-pipeline-service.d.ts.map +1 -1
- package/dist/services/artifact-pipeline-service.js +681 -4
- package/dist/services/artifact-pipeline-service.js.map +1 -1
- package/dist/services/canonical-json.d.ts +3 -0
- package/dist/services/canonical-json.d.ts.map +1 -0
- package/dist/services/canonical-json.js +71 -0
- package/dist/services/canonical-json.js.map +1 -0
- package/dist/services/claude-plugin-service.d.ts +6 -1
- package/dist/services/claude-plugin-service.d.ts.map +1 -1
- package/dist/services/claude-plugin-service.js +184 -12
- package/dist/services/claude-plugin-service.js.map +1 -1
- package/dist/services/codex-plugin-service.d.ts +30 -0
- package/dist/services/codex-plugin-service.d.ts.map +1 -0
- package/dist/services/codex-plugin-service.js +195 -0
- package/dist/services/codex-plugin-service.js.map +1 -0
- package/dist/services/company-auth-service.d.ts +70 -0
- package/dist/services/company-auth-service.d.ts.map +1 -0
- package/dist/services/company-auth-service.js +720 -0
- package/dist/services/company-auth-service.js.map +1 -0
- package/dist/services/company-auth-store.d.ts +22 -0
- package/dist/services/company-auth-store.d.ts.map +1 -0
- package/dist/services/company-auth-store.js +158 -0
- package/dist/services/company-auth-store.js.map +1 -0
- package/dist/services/company-common.d.ts +9 -0
- package/dist/services/company-common.d.ts.map +1 -0
- package/dist/services/company-common.js +35 -0
- package/dist/services/company-common.js.map +1 -0
- package/dist/services/company-sync-service.d.ts +214 -0
- package/dist/services/company-sync-service.d.ts.map +1 -0
- package/dist/services/company-sync-service.js +1299 -0
- package/dist/services/company-sync-service.js.map +1 -0
- package/dist/services/connectors/adapters/business-metrics.d.ts +5 -0
- package/dist/services/connectors/adapters/business-metrics.d.ts.map +1 -0
- package/dist/services/connectors/adapters/business-metrics.js +41 -0
- package/dist/services/connectors/adapters/business-metrics.js.map +1 -0
- package/dist/services/connectors/adapters/deployment-health.d.ts +18 -0
- package/dist/services/connectors/adapters/deployment-health.d.ts.map +1 -0
- package/dist/services/connectors/adapters/deployment-health.js +67 -0
- package/dist/services/connectors/adapters/deployment-health.js.map +1 -0
- package/dist/services/connectors/adapters/github.d.ts +5 -0
- package/dist/services/connectors/adapters/github.d.ts.map +1 -0
- package/dist/services/connectors/adapters/github.js +31 -0
- package/dist/services/connectors/adapters/github.js.map +1 -0
- package/dist/services/connectors/adapters/linear-jira.d.ts +5 -0
- package/dist/services/connectors/adapters/linear-jira.d.ts.map +1 -0
- package/dist/services/connectors/adapters/linear-jira.js +26 -0
- package/dist/services/connectors/adapters/linear-jira.js.map +1 -0
- package/dist/services/connectors/adapters/posthog.d.ts +5 -0
- package/dist/services/connectors/adapters/posthog.d.ts.map +1 -0
- package/dist/services/connectors/adapters/posthog.js +31 -0
- package/dist/services/connectors/adapters/posthog.js.map +1 -0
- package/dist/services/connectors/adapters/sentry.d.ts +5 -0
- package/dist/services/connectors/adapters/sentry.d.ts.map +1 -0
- package/dist/services/connectors/adapters/sentry.js +31 -0
- package/dist/services/connectors/adapters/sentry.js.map +1 -0
- package/dist/services/connectors/checkpoint-custody.d.ts +45 -0
- package/dist/services/connectors/checkpoint-custody.d.ts.map +1 -0
- package/dist/services/connectors/checkpoint-custody.js +496 -0
- package/dist/services/connectors/checkpoint-custody.js.map +1 -0
- package/dist/services/connectors/connector-registry.d.ts +144 -0
- package/dist/services/connectors/connector-registry.d.ts.map +1 -0
- package/dist/services/connectors/connector-registry.js +423 -0
- package/dist/services/connectors/connector-registry.js.map +1 -0
- package/dist/services/connectors/connector-runtime.d.ts +200 -0
- package/dist/services/connectors/connector-runtime.d.ts.map +1 -0
- package/dist/services/connectors/connector-runtime.js +1297 -0
- package/dist/services/connectors/connector-runtime.js.map +1 -0
- package/dist/services/connectors/credential-custody.d.ts +96 -0
- package/dist/services/connectors/credential-custody.d.ts.map +1 -0
- package/dist/services/connectors/credential-custody.js +390 -0
- package/dist/services/connectors/credential-custody.js.map +1 -0
- package/dist/services/credential-backends.d.ts +11 -1
- package/dist/services/credential-backends.d.ts.map +1 -1
- package/dist/services/credential-backends.js +104 -21
- package/dist/services/credential-backends.js.map +1 -1
- package/dist/services/credential-write-lock.d.ts +8 -0
- package/dist/services/credential-write-lock.d.ts.map +1 -0
- package/dist/services/credential-write-lock.js +104 -0
- package/dist/services/credential-write-lock.js.map +1 -0
- package/dist/services/credentials-service.d.ts +8 -2
- package/dist/services/credentials-service.d.ts.map +1 -1
- package/dist/services/credentials-service.js +66 -21
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/deprecation-notices.d.ts +2 -2
- package/dist/services/deprecation-notices.d.ts.map +1 -1
- package/dist/services/deprecation-notices.js +2 -2
- package/dist/services/deprecation-notices.js.map +1 -1
- package/dist/services/design-artifact-service.d.ts +37 -0
- package/dist/services/design-artifact-service.d.ts.map +1 -0
- package/dist/services/design-artifact-service.js +94 -0
- package/dist/services/design-artifact-service.js.map +1 -0
- package/dist/services/diagram-artifact-service.d.ts +12 -0
- package/dist/services/diagram-artifact-service.d.ts.map +1 -0
- package/dist/services/diagram-artifact-service.js +41 -0
- package/dist/services/diagram-artifact-service.js.map +1 -0
- package/dist/services/diagram-pipeline-service.d.ts +125 -0
- package/dist/services/diagram-pipeline-service.d.ts.map +1 -0
- package/dist/services/diagram-pipeline-service.js +329 -0
- package/dist/services/diagram-pipeline-service.js.map +1 -0
- package/dist/services/gherkin-service.d.ts +3 -0
- package/dist/services/gherkin-service.d.ts.map +1 -0
- package/dist/services/gherkin-service.js +9 -0
- package/dist/services/gherkin-service.js.map +1 -0
- package/dist/services/graph-service.d.ts.map +1 -1
- package/dist/services/graph-service.js +6 -4
- package/dist/services/graph-service.js.map +1 -1
- package/dist/services/landing/landing-service.d.ts +42 -0
- package/dist/services/landing/landing-service.d.ts.map +1 -0
- package/dist/services/landing/landing-service.js +197 -0
- package/dist/services/landing/landing-service.js.map +1 -0
- package/dist/services/landing/operation-registry.d.ts +56 -0
- package/dist/services/landing/operation-registry.d.ts.map +1 -0
- package/dist/services/landing/operation-registry.js +165 -0
- package/dist/services/landing/operation-registry.js.map +1 -0
- package/dist/services/landing/receipt-custody.d.ts +48 -0
- package/dist/services/landing/receipt-custody.d.ts.map +1 -0
- package/dist/services/landing/receipt-custody.js +375 -0
- package/dist/services/landing/receipt-custody.js.map +1 -0
- package/dist/services/linear/constants.d.ts.map +1 -1
- package/dist/services/linear/constants.js +2 -6
- package/dist/services/linear/constants.js.map +1 -1
- package/dist/services/linear/task-status-aggregation.d.ts +1 -1
- package/dist/services/linear/task-status-aggregation.js +1 -1
- package/dist/services/linear-pull-service.d.ts.map +1 -1
- package/dist/services/linear-pull-service.js +7 -30
- package/dist/services/linear-pull-service.js.map +1 -1
- package/dist/services/linear-push-service.d.ts.map +1 -1
- package/dist/services/linear-push-service.js +4 -5
- package/dist/services/linear-push-service.js.map +1 -1
- package/dist/services/migration-registry.d.ts +0 -19
- package/dist/services/migration-registry.d.ts.map +1 -1
- package/dist/services/migration-registry.js +18 -32
- package/dist/services/migration-registry.js.map +1 -1
- package/dist/services/operate/assignment-lifecycle-service.d.ts +135 -0
- package/dist/services/operate/assignment-lifecycle-service.d.ts.map +1 -0
- package/dist/services/operate/assignment-lifecycle-service.js +113 -0
- package/dist/services/operate/assignment-lifecycle-service.js.map +1 -0
- package/dist/services/operate/assignment-packet-service.d.ts +79 -0
- package/dist/services/operate/assignment-packet-service.d.ts.map +1 -0
- package/dist/services/operate/assignment-packet-service.js +1030 -0
- package/dist/services/operate/assignment-packet-service.js.map +1 -0
- package/dist/services/operate/client/governance.d.ts +4 -0
- package/dist/services/operate/client/governance.d.ts.map +1 -0
- package/dist/services/operate/client/governance.js +3 -0
- package/dist/services/operate/client/governance.js.map +1 -0
- package/dist/services/operate/client/lifecycle.d.ts +18 -0
- package/dist/services/operate/client/lifecycle.d.ts.map +1 -0
- package/dist/services/operate/client/lifecycle.js +15 -0
- package/dist/services/operate/client/lifecycle.js.map +1 -0
- package/dist/services/operate/client/runtime.d.ts +13 -0
- package/dist/services/operate/client/runtime.d.ts.map +1 -0
- package/dist/services/operate/client/runtime.js +11 -0
- package/dist/services/operate/client/runtime.js.map +1 -0
- package/dist/services/operate/client-error.d.ts +9 -0
- package/dist/services/operate/client-error.d.ts.map +1 -0
- package/dist/services/operate/client-error.js +14 -0
- package/dist/services/operate/client-error.js.map +1 -0
- package/dist/services/operate/client.d.ts +415 -0
- package/dist/services/operate/client.d.ts.map +1 -0
- package/dist/services/operate/client.js +2432 -0
- package/dist/services/operate/client.js.map +1 -0
- package/dist/services/operate/command-gateway.d.ts +152 -0
- package/dist/services/operate/command-gateway.d.ts.map +1 -0
- package/dist/services/operate/command-gateway.js +883 -0
- package/dist/services/operate/command-gateway.js.map +1 -0
- package/dist/services/operate/composition.d.ts +421 -0
- package/dist/services/operate/composition.d.ts.map +1 -0
- package/dist/services/operate/composition.js +394 -0
- package/dist/services/operate/composition.js.map +1 -0
- package/dist/services/operate/cycle-lifecycle-service.d.ts +35 -0
- package/dist/services/operate/cycle-lifecycle-service.d.ts.map +1 -0
- package/dist/services/operate/cycle-lifecycle-service.js +427 -0
- package/dist/services/operate/cycle-lifecycle-service.js.map +1 -0
- package/dist/services/operate/delivery-evidence.d.ts +34 -0
- package/dist/services/operate/delivery-evidence.d.ts.map +1 -0
- package/dist/services/operate/delivery-evidence.js +666 -0
- package/dist/services/operate/delivery-evidence.js.map +1 -0
- package/dist/services/operate/domain-catalog-service.d.ts +24 -0
- package/dist/services/operate/domain-catalog-service.d.ts.map +1 -0
- package/dist/services/operate/domain-catalog-service.js +99 -0
- package/dist/services/operate/domain-catalog-service.js.map +1 -0
- package/dist/services/operate/experience-read-service.d.ts +64 -0
- package/dist/services/operate/experience-read-service.d.ts.map +1 -0
- package/dist/services/operate/experience-read-service.js +109 -0
- package/dist/services/operate/experience-read-service.js.map +1 -0
- package/dist/services/operate/governed-action-service.d.ts +80 -0
- package/dist/services/operate/governed-action-service.d.ts.map +1 -0
- package/dist/services/operate/governed-action-service.js +497 -0
- package/dist/services/operate/governed-action-service.js.map +1 -0
- package/dist/services/operate/identity-contract.d.ts +3 -0
- package/dist/services/operate/identity-contract.d.ts.map +1 -0
- package/dist/services/operate/identity-contract.js +6 -0
- package/dist/services/operate/identity-contract.js.map +1 -0
- package/dist/services/operate/measurement-schedule-service.d.ts +81 -0
- package/dist/services/operate/measurement-schedule-service.d.ts.map +1 -0
- package/dist/services/operate/measurement-schedule-service.js +461 -0
- package/dist/services/operate/measurement-schedule-service.js.map +1 -0
- package/dist/services/operate/path-custody.d.ts +16 -0
- package/dist/services/operate/path-custody.d.ts.map +1 -0
- package/dist/services/operate/path-custody.js +120 -0
- package/dist/services/operate/path-custody.js.map +1 -0
- package/dist/services/operate/pinned-legacy-replay-runner.d.ts +9 -0
- package/dist/services/operate/pinned-legacy-replay-runner.d.ts.map +1 -0
- package/dist/services/operate/pinned-legacy-replay-runner.js +441 -0
- package/dist/services/operate/pinned-legacy-replay-runner.js.map +1 -0
- package/dist/services/operate/planning-bridge.d.ts +28 -0
- package/dist/services/operate/planning-bridge.d.ts.map +1 -0
- package/dist/services/operate/planning-bridge.js +341 -0
- package/dist/services/operate/planning-bridge.js.map +1 -0
- package/dist/services/operate/planning-handoff-gateway.d.ts +47 -0
- package/dist/services/operate/planning-handoff-gateway.d.ts.map +1 -0
- package/dist/services/operate/planning-handoff-gateway.js +169 -0
- package/dist/services/operate/planning-handoff-gateway.js.map +1 -0
- package/dist/services/operate/planning-handoff-service.d.ts +38 -0
- package/dist/services/operate/planning-handoff-service.d.ts.map +1 -0
- package/dist/services/operate/planning-handoff-service.js +304 -0
- package/dist/services/operate/planning-handoff-service.js.map +1 -0
- package/dist/services/operate/project-transaction-lock.d.ts +6 -0
- package/dist/services/operate/project-transaction-lock.d.ts.map +1 -0
- package/dist/services/operate/project-transaction-lock.js +146 -0
- package/dist/services/operate/project-transaction-lock.js.map +1 -0
- package/dist/services/operate/recovery-service.d.ts +16 -0
- package/dist/services/operate/recovery-service.d.ts.map +1 -0
- package/dist/services/operate/recovery-service.js +59 -0
- package/dist/services/operate/recovery-service.js.map +1 -0
- package/dist/services/operate/replay-safe-retry-service.d.ts +21 -0
- package/dist/services/operate/replay-safe-retry-service.d.ts.map +1 -0
- package/dist/services/operate/replay-safe-retry-service.js +66 -0
- package/dist/services/operate/replay-safe-retry-service.js.map +1 -0
- package/dist/services/operate/repository-read-service.d.ts +13 -0
- package/dist/services/operate/repository-read-service.d.ts.map +1 -0
- package/dist/services/operate/repository-read-service.js +153 -0
- package/dist/services/operate/repository-read-service.js.map +1 -0
- package/dist/services/operate/review-lifecycle-service.d.ts +50 -0
- package/dist/services/operate/review-lifecycle-service.d.ts.map +1 -0
- package/dist/services/operate/review-lifecycle-service.js +63 -0
- package/dist/services/operate/review-lifecycle-service.js.map +1 -0
- package/dist/services/operate/review-read-gateway.d.ts +21 -0
- package/dist/services/operate/review-read-gateway.d.ts.map +1 -0
- package/dist/services/operate/review-read-gateway.js +119 -0
- package/dist/services/operate/review-read-gateway.js.map +1 -0
- package/dist/services/operate/screened-evidence-service.d.ts +24 -0
- package/dist/services/operate/screened-evidence-service.d.ts.map +1 -0
- package/dist/services/operate/screened-evidence-service.js +186 -0
- package/dist/services/operate/screened-evidence-service.js.map +1 -0
- package/dist/services/operate/search-hit-contract.d.ts +11 -0
- package/dist/services/operate/search-hit-contract.d.ts.map +1 -0
- package/dist/services/operate/search-hit-contract.js +29 -0
- package/dist/services/operate/search-hit-contract.js.map +1 -0
- package/dist/services/operate/session-capability.d.ts +61 -0
- package/dist/services/operate/session-capability.d.ts.map +1 -0
- package/dist/services/operate/session-capability.js +124 -0
- package/dist/services/operate/session-capability.js.map +1 -0
- package/dist/services/operate/spec-operating-origin-service.d.ts +60 -0
- package/dist/services/operate/spec-operating-origin-service.d.ts.map +1 -0
- package/dist/services/operate/spec-operating-origin-service.js +401 -0
- package/dist/services/operate/spec-operating-origin-service.js.map +1 -0
- package/dist/services/operate/storage-layout.d.ts +82 -0
- package/dist/services/operate/storage-layout.d.ts.map +1 -0
- package/dist/services/operate/storage-layout.js +1244 -0
- package/dist/services/operate/storage-layout.js.map +1 -0
- package/dist/services/operate/storage-migration-service.d.ts +15 -0
- package/dist/services/operate/storage-migration-service.d.ts.map +1 -0
- package/dist/services/operate/storage-migration-service.js +27 -0
- package/dist/services/operate/storage-migration-service.js.map +1 -0
- package/dist/services/operate/store.d.ts +132 -0
- package/dist/services/operate/store.d.ts.map +1 -0
- package/dist/services/operate/store.js +1344 -0
- package/dist/services/operate/store.js.map +1 -0
- package/dist/services/pipeline-package-service.d.ts +93 -2
- package/dist/services/pipeline-package-service.d.ts.map +1 -1
- package/dist/services/pipeline-package-service.js +867 -7
- package/dist/services/pipeline-package-service.js.map +1 -1
- package/dist/services/planning-id-service.d.ts +8 -0
- package/dist/services/planning-id-service.d.ts.map +1 -0
- package/dist/services/planning-id-service.js +114 -0
- package/dist/services/planning-id-service.js.map +1 -0
- package/dist/services/provenance-service.d.ts +33 -1
- package/dist/services/provenance-service.d.ts.map +1 -1
- package/dist/services/provenance-service.js +104 -8
- package/dist/services/provenance-service.js.map +1 -1
- package/dist/services/runtime-manager/doctor.d.ts +22 -0
- package/dist/services/runtime-manager/doctor.d.ts.map +1 -0
- package/dist/services/runtime-manager/doctor.js +74 -0
- package/dist/services/runtime-manager/doctor.js.map +1 -0
- package/dist/services/runtime-manager/global-state.d.ts +47 -0
- package/dist/services/runtime-manager/global-state.d.ts.map +1 -0
- package/dist/services/runtime-manager/global-state.js +59 -0
- package/dist/services/runtime-manager/global-state.js.map +1 -0
- package/dist/services/runtime-manager/install-plan.d.ts +37 -0
- package/dist/services/runtime-manager/install-plan.d.ts.map +1 -0
- package/dist/services/runtime-manager/install-plan.js +91 -0
- package/dist/services/runtime-manager/install-plan.js.map +1 -0
- package/dist/services/runtime-manager/inventory.d.ts +29 -0
- package/dist/services/runtime-manager/inventory.d.ts.map +1 -0
- package/dist/services/runtime-manager/inventory.js +46 -0
- package/dist/services/runtime-manager/inventory.js.map +1 -0
- package/dist/services/runtime-manager-service.d.ts +16 -71
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +1288 -505
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/dist/services/spec-service.d.ts +213 -39
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +938 -171
- package/dist/services/spec-service.js.map +1 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +1 -0
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/quick/quick-task.md.hbs +6 -0
- package/dist/templates/rules/claude/CLAUDE.md.hbs +3 -111
- package/dist/templates/rules/codex/AGENTS.md.hbs +2 -92
- package/dist/templates/rules/cursor/create-task-list.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/implement-task-list.mdc.hbs +5 -83
- package/dist/templates/rules/cursor/openplanr.mdc.hbs +12 -0
- package/dist/templates/rules/shared/host-native-guidance.md.hbs +12 -0
- package/dist/templates/rules/shared/implementation-guidance.md.hbs +44 -0
- package/dist/templates/spec/spec-shaped.md.hbs +66 -22
- package/dist/templates/spec/spec.md.hbs +46 -23
- package/dist/templates/spec/story.md.hbs +15 -4
- package/dist/templates/spec/task.md.hbs +53 -5
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/logger.d.ts +0 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -6
- package/dist/utils/logger.js.map +1 -1
- package/docs/ARTIFACT_REVIEW.md +110 -0
- package/docs/CLI.md +1228 -0
- package/docs/CROSS_RUNTIME_SETUP.md +168 -0
- package/docs/TROUBLESHOOTING.md +227 -0
- package/lib/dashboard-verifier.d.mts +29 -0
- package/lib/dashboard-verifier.mjs +307 -0
- package/lib/host-packages/adapter-registry.json +44 -0
- package/lib/host-packages/claude/.claude-plugin/marketplace.json +20 -0
- package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +9 -0
- package/lib/host-packages/claude/openplanr/.openplanr-content.json +1179 -0
- package/lib/host-packages/claude/openplanr/agents/planr-backend.md +66 -0
- package/lib/host-packages/claude/openplanr/agents/planr-database.md +165 -0
- package/lib/host-packages/claude/openplanr/agents/planr-designer.md +57 -0
- package/lib/host-packages/claude/openplanr/agents/planr-devops.md +57 -0
- package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +63 -0
- package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +29 -0
- package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +69 -0
- package/lib/host-packages/claude/openplanr/agents/planr-qa.md +162 -0
- package/lib/host-packages/claude/openplanr/agents/planr-specification.md +124 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +93 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +90 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +55 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +67 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +94 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/qa.md +17 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +111 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/contract-create-modify-preserve.md +17 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-craft-rubric.md +51 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-principles.md +43 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/design-spec-template.md +88 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/task-context-resolution.md +60 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-backend.md +26 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/shared/verification-and-recovery-frontend.md +27 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +96 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +83 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +55 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +67 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +96 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/qa.md +17 -0
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +112 -0
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/backend/nestjs.md +130 -0
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +122 -0
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/prisma.md +155 -0
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/devops/docker-compose.md +140 -0
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/frontend/nextjs.md +123 -0
- package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +54 -0
- package/lib/host-packages/claude/openplanr/skills/artifact/openplanr.skill.json +48 -0
- package/lib/host-packages/claude/openplanr/skills/artifact/references/company-review.md +18 -0
- package/lib/host-packages/claude/openplanr/skills/artifact/references/design-sharing.md +51 -0
- package/lib/host-packages/claude/openplanr/skills/browser-qa/SKILL.md +34 -0
- package/lib/host-packages/claude/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +47 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +101 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/openplanr.skill.json +70 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +86 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +46 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +45 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +48 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +47 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/openplanr.skill.json +81 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/dashboard/SKILL.md +20 -0
- package/lib/host-packages/claude/openplanr/skills/dashboard/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +73 -0
- package/lib/host-packages/claude/openplanr/skills/design/openplanr.skill.json +466 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/craft.md +68 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/design-spec-template.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +33 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/discovery.md +53 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +105 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/handoff.md +47 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/review.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/team-review.md +131 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +93 -0
- package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +17323 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/SKILL.md +58 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/openplanr.skill.json +466 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/craft.md +68 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +33 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/discovery.md +53 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +105 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/handoff.md +47 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/team-review.md +131 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +93 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/SKILL.md +54 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/openplanr.skill.json +466 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/craft.md +68 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/design-spec-template.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +33 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/discovery.md +53 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +105 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/handoff.md +47 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +88 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/team-review.md +131 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +93 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +17323 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/claude/openplanr/skills/diagram/SKILL.md +65 -0
- package/lib/host-packages/claude/openplanr/skills/diagram/openplanr.skill.json +59 -0
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-document.md +86 -0
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
- package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +40 -0
- package/lib/host-packages/claude/openplanr/skills/doctor/openplanr.skill.json +37 -0
- package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +106 -0
- package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +31 -0
- package/lib/host-packages/claude/openplanr/skills/investigate/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/land/SKILL.md +33 -0
- package/lib/host-packages/claude/openplanr/skills/land/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +181 -0
- package/lib/host-packages/claude/openplanr/skills/operate/openplanr.skill.json +70 -0
- package/lib/host-packages/claude/openplanr/skills/operate/scripts/errors.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/claude/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/claude/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +106 -0
- package/lib/host-packages/claude/openplanr/skills/plan/openplanr.skill.json +389 -0
- package/lib/host-packages/claude/openplanr/skills/plan/references/artifact-contract.md +39 -0
- package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +17323 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/claude/openplanr/skills/plan-review/SKILL.md +39 -0
- package/lib/host-packages/claude/openplanr/skills/plan-review/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/release/SKILL.md +180 -0
- package/lib/host-packages/claude/openplanr/skills/release/assets/changelog-template.md +18 -0
- package/lib/host-packages/claude/openplanr/skills/release/assets/profile-template.md +45 -0
- package/lib/host-packages/claude/openplanr/skills/release/openplanr.skill.json +92 -0
- package/lib/host-packages/claude/openplanr/skills/release/references/cadence.md +92 -0
- package/lib/host-packages/claude/openplanr/skills/release/references/release-notes.md +127 -0
- package/lib/host-packages/claude/openplanr/skills/release/references/schemes.md +103 -0
- package/lib/host-packages/claude/openplanr/skills/release/scripts/collect_changes.sh +85 -0
- package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +80 -0
- package/lib/host-packages/claude/openplanr/skills/ship/openplanr.skill.json +48 -0
- package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +14 -0
- package/lib/host-packages/claude/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
- package/lib/host-packages/claude/openplanr/skills/spec/SKILL.md +53 -0
- package/lib/host-packages/claude/openplanr/skills/spec/openplanr.skill.json +37 -0
- package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +32 -0
- package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +21 -0
- package/lib/host-packages/claude/openplanr/skills/status/openplanr.skill.json +26 -0
- package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +30 -0
- package/lib/host-packages/claude/openplanr/skills/sync/openplanr.skill.json +37 -0
- package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +230 -0
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +939 -0
- package/lib/host-packages/cursor/openplanr/manifest.json +32 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/company-review.md +18 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/design-sharing.md +51 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +53 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-browser-qa.mdc +34 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review.mdc +45 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +99 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +84 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review.mdc +44 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review.mdc +43 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review.mdc +46 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review.mdc +45 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-dashboard.mdc +19 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/craft.md +68 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-spec-template.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +33 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/discovery.md +53 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +105 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/handoff.md +47 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/team-review.md +131 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +93 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +17323 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/craft.md +68 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-spec-template.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +33 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/discovery.md +53 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +105 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/handoff.md +47 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/team-review.md +131 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +93 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +17323 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop.mdc +57 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/craft.md +68 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-spec-template.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +33 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/discovery.md +53 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +105 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/handoff.md +47 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +88 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/team-review.md +131 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +93 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +17323 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review.mdc +53 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +72 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-document.md +86 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-fidelity.md +19 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-intent-to-ir.md +22 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram.mdc +64 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +106 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +39 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-land.mdc +32 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/errors.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-operate/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +180 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/references/artifact-contract.md +39 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +17323 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/planning-ids.mjs +120 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan-review.mdc +38 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +105 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/changelog-template.md +18 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/assets/profile-template.md +45 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/references/cadence.md +92 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/references/release-notes.md +127 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/references/schemes.md +103 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release/scripts/collect_changes.sh +85 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-release.mdc +179 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +14 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/discover-verification.mjs +107 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +79 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +32 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-spec.mdc +52 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +20 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +230 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +29 -0
- package/lib/host-packages/openai/.claude-plugin/marketplace.json +19 -0
- package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +10 -0
- package/lib/host-packages/openai/openplanr/.openplanr-content.json +1139 -0
- package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +54 -0
- package/lib/host-packages/openai/openplanr/skills/artifact/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/artifact/openplanr.skill.json +48 -0
- package/lib/host-packages/openai/openplanr/skills/artifact/references/company-review.md +18 -0
- package/lib/host-packages/openai/openplanr/skills/artifact/references/design-sharing.md +51 -0
- package/lib/host-packages/openai/openplanr/skills/browser-qa/SKILL.md +34 -0
- package/lib/host-packages/openai/openplanr/skills/browser-qa/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/browser-qa/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +47 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/ceo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +101 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/openplanr.skill.json +70 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/chair-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +86 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/openplanr.skill.json +70 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/challenger-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +46 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/cmo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +45 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/coo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +48 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/openplanr.skill.json +81 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/cpo-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +47 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/openplanr.skill.json +81 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +111 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/cto-review/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/dashboard/SKILL.md +20 -0
- package/lib/host-packages/openai/openplanr/skills/dashboard/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/dashboard/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +73 -0
- package/lib/host-packages/openai/openplanr/skills/design/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +466 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/craft.md +68 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/design-spec-template.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +33 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/discovery.md +53 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +105 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/handoff.md +47 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/review.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/team-review.md +131 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +93 -0
- package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +17323 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/SKILL.md +58 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/openplanr.skill.json +466 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/craft.md +68 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-spec-template.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +33 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/discovery.md +53 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +105 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/handoff.md +47 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/team-review.md +131 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +93 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +17323 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/SKILL.md +54 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/openplanr.skill.json +466 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/craft.md +68 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/design-spec-template.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +33 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/discovery.md +53 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +105 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/handoff.md +47 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +88 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/team-review.md +131 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +93 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +17323 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- 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
- 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
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/SKILL.md +65 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/openplanr.skill.json +59 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-document.md +86 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-fidelity.md +19 -0
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-intent-to-ir.md +22 -0
- package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +40 -0
- package/lib/host-packages/openai/openplanr/skills/doctor/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/doctor/openplanr.skill.json +37 -0
- package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +106 -0
- package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +31 -0
- package/lib/host-packages/openai/openplanr/skills/investigate/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/land/SKILL.md +33 -0
- package/lib/host-packages/openai/openplanr/skills/land/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/land/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +181 -0
- package/lib/host-packages/openai/openplanr/skills/operate/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/operate/openplanr.skill.json +70 -0
- package/lib/host-packages/openai/openplanr/skills/operate/scripts/errors.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-contract.mjs +438 -0
- package/lib/host-packages/openai/openplanr/skills/operate/scripts/operate-review-note.mjs +595 -0
- package/lib/host-packages/openai/openplanr/skills/operate/scripts/validate-note.mjs +31 -0
- package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +106 -0
- package/lib/host-packages/openai/openplanr/skills/plan/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +389 -0
- package/lib/host-packages/openai/openplanr/skills/plan/references/artifact-contract.md +39 -0
- package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +17323 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/planning-ids.mjs +120 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/entities.txt +13 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/notices/parse5.txt +21 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/artifact/templates/artifact-review-stage.js +3994 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.css +378 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/enhancements.js +805 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.css +1 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/share.js +132 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.css +1103 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/design/templates/studio/studio.js +1775 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +115 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/registry/artifact-theme.json +60 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.0.0/design-manifest.schema.json +90 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-envelope.schema.json +142 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-paste.schema.json +49 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-review.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.1.0/artifact-theme.schema.json +139 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-bundle.schema.json +584 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-context.schema.json +191 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-handoff.schema.json +407 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.10.0/design-review-metadata-payload.schema.json +106 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.11.0/design-review-metadata-payload.schema.json +107 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-document.schema.json +306 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-bundle.schema.json +346 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-review-workspace.schema.json +108 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-create.schema.json +170 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-event.schema.json +97 -0
- package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/schemas/v1.9.0/design-workspace-revision.schema.json +56 -0
- package/lib/host-packages/openai/openplanr/skills/plan-review/SKILL.md +39 -0
- package/lib/host-packages/openai/openplanr/skills/plan-review/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/plan-review/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/release/SKILL.md +180 -0
- package/lib/host-packages/openai/openplanr/skills/release/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/release/assets/changelog-template.md +18 -0
- package/lib/host-packages/openai/openplanr/skills/release/assets/profile-template.md +45 -0
- package/lib/host-packages/openai/openplanr/skills/release/openplanr.skill.json +92 -0
- package/lib/host-packages/openai/openplanr/skills/release/references/cadence.md +92 -0
- package/lib/host-packages/openai/openplanr/skills/release/references/release-notes.md +127 -0
- package/lib/host-packages/openai/openplanr/skills/release/references/schemes.md +103 -0
- package/lib/host-packages/openai/openplanr/skills/release/scripts/collect_changes.sh +85 -0
- package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +80 -0
- package/lib/host-packages/openai/openplanr/skills/ship/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +48 -0
- package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +14 -0
- package/lib/host-packages/openai/openplanr/skills/ship/scripts/discover-verification.mjs +107 -0
- package/lib/host-packages/openai/openplanr/skills/spec/SKILL.md +53 -0
- package/lib/host-packages/openai/openplanr/skills/spec/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/spec/openplanr.skill.json +37 -0
- package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +32 -0
- package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +21 -0
- package/lib/host-packages/openai/openplanr/skills/status/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +26 -0
- package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +30 -0
- package/lib/host-packages/openai/openplanr/skills/sync/agents/openai.yaml +6 -0
- package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +37 -0
- package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +230 -0
- package/lib/integrations.d.mts +43 -0
- package/lib/integrations.mjs +230 -0
- package/lib/skill-runtime/errors.mjs +8 -0
- package/lib/skill-runtime/operate-review-contract.mjs +438 -0
- package/lib/skill-runtime/operate-review-note.mjs +595 -0
- package/package.json +56 -18
- package/dist/ai/codebase/context-builder.d.ts +0 -50
- package/dist/ai/codebase/context-builder.d.ts.map +0 -1
- package/dist/ai/codebase/context-builder.js +0 -281
- package/dist/ai/codebase/context-builder.js.map +0 -1
- package/dist/ai/codebase/file-reader.d.ts +0 -22
- package/dist/ai/codebase/file-reader.d.ts.map +0 -1
- package/dist/ai/codebase/file-reader.js +0 -144
- package/dist/ai/codebase/file-reader.js.map +0 -1
- package/dist/ai/codebase/index.d.ts +0 -7
- package/dist/ai/codebase/index.d.ts.map +0 -1
- package/dist/ai/codebase/index.js +0 -7
- package/dist/ai/codebase/index.js.map +0 -1
- package/dist/ai/codebase/pattern-rules.d.ts +0 -28
- package/dist/ai/codebase/pattern-rules.d.ts.map +0 -1
- package/dist/ai/codebase/pattern-rules.js +0 -186
- package/dist/ai/codebase/pattern-rules.js.map +0 -1
- package/dist/ai/codebase/rules-reader.d.ts +0 -14
- package/dist/ai/codebase/rules-reader.d.ts.map +0 -1
- package/dist/ai/codebase/rules-reader.js +0 -25
- package/dist/ai/codebase/rules-reader.js.map +0 -1
- package/dist/ai/codebase/stack-detector.d.ts +0 -18
- package/dist/ai/codebase/stack-detector.d.ts.map +0 -1
- package/dist/ai/codebase/stack-detector.js +0 -173
- package/dist/ai/codebase/stack-detector.js.map +0 -1
- package/dist/ai/codebase/tree-generator.d.ts +0 -8
- package/dist/ai/codebase/tree-generator.d.ts.map +0 -1
- package/dist/ai/codebase/tree-generator.js +0 -84
- package/dist/ai/codebase/tree-generator.js.map +0 -1
- package/dist/ai/errors.d.ts +0 -22
- package/dist/ai/errors.d.ts.map +0 -1
- package/dist/ai/errors.js +0 -72
- package/dist/ai/errors.js.map +0 -1
- package/dist/ai/index.d.ts +0 -11
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js +0 -10
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/prompts/prompt-builder.d.ts +0 -134
- package/dist/ai/prompts/prompt-builder.d.ts.map +0 -1
- package/dist/ai/prompts/prompt-builder.js +0 -295
- package/dist/ai/prompts/prompt-builder.js.map +0 -1
- package/dist/ai/prompts/system-prompts.d.ts +0 -41
- package/dist/ai/prompts/system-prompts.d.ts.map +0 -1
- package/dist/ai/prompts/system-prompts.js +0 -512
- package/dist/ai/prompts/system-prompts.js.map +0 -1
- package/dist/ai/provider-factory.d.ts +0 -10
- package/dist/ai/provider-factory.d.ts.map +0 -1
- package/dist/ai/provider-factory.js +0 -49
- package/dist/ai/provider-factory.js.map +0 -1
- package/dist/ai/providers/anthropic-provider.d.ts +0 -24
- package/dist/ai/providers/anthropic-provider.d.ts.map +0 -1
- package/dist/ai/providers/anthropic-provider.js +0 -97
- package/dist/ai/providers/anthropic-provider.js.map +0 -1
- package/dist/ai/providers/ollama-provider.d.ts +0 -13
- package/dist/ai/providers/ollama-provider.d.ts.map +0 -1
- package/dist/ai/providers/ollama-provider.js +0 -16
- package/dist/ai/providers/ollama-provider.js.map +0 -1
- package/dist/ai/providers/openai-provider.d.ts +0 -19
- package/dist/ai/providers/openai-provider.d.ts.map +0 -1
- package/dist/ai/providers/openai-provider.js +0 -84
- package/dist/ai/providers/openai-provider.js.map +0 -1
- package/dist/ai/schemas/ai-response-schemas.d.ts +0 -340
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +0 -1
- package/dist/ai/schemas/ai-response-schemas.js +0 -278
- package/dist/ai/schemas/ai-response-schemas.js.map +0 -1
- package/dist/ai/types.d.ts +0 -76
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/ai/types.js +0 -49
- package/dist/ai/types.js.map +0 -1
- package/dist/ai/validation/index.d.ts +0 -2
- package/dist/ai/validation/index.d.ts.map +0 -1
- package/dist/ai/validation/index.js +0 -2
- package/dist/ai/validation/index.js.map +0 -1
- package/dist/ai/validation/task-validator.d.ts +0 -37
- package/dist/ai/validation/task-validator.d.ts.map +0 -1
- package/dist/ai/validation/task-validator.js +0 -81
- package/dist/ai/validation/task-validator.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -8
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -224
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/estimate.d.ts +0 -3
- package/dist/cli/commands/estimate.d.ts.map +0 -1
- package/dist/cli/commands/estimate.js +0 -368
- package/dist/cli/commands/estimate.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -9
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -166
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/pipeline.d.ts +0 -3
- package/dist/cli/commands/pipeline.d.ts.map +0 -1
- package/dist/cli/commands/pipeline.js +0 -59
- package/dist/cli/commands/pipeline.js.map +0 -1
- package/dist/cli/commands/plan.d.ts +0 -15
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.js +0 -444
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/refine.d.ts +0 -10
- package/dist/cli/commands/refine.d.ts.map +0 -1
- package/dist/cli/commands/refine.js +0 -226
- package/dist/cli/commands/refine.js.map +0 -1
- package/dist/cli/commands/revise.d.ts +0 -24
- package/dist/cli/commands/revise.d.ts.map +0 -1
- package/dist/cli/commands/revise.js +0 -572
- package/dist/cli/commands/revise.js.map +0 -1
- package/dist/cli/helpers/task-creation.d.ts +0 -89
- package/dist/cli/helpers/task-creation.d.ts.map +0 -1
- package/dist/cli/helpers/task-creation.js +0 -139
- package/dist/cli/helpers/task-creation.js.map +0 -1
- package/dist/services/ai-service.d.ts +0 -77
- package/dist/services/ai-service.d.ts.map +0 -1
- package/dist/services/ai-service.js +0 -241
- package/dist/services/ai-service.js.map +0 -1
- package/dist/services/artifact-gathering.d.ts +0 -55
- package/dist/services/artifact-gathering.d.ts.map +0 -1
- package/dist/services/artifact-gathering.js +0 -147
- package/dist/services/artifact-gathering.js.map +0 -1
- package/dist/services/operate/advisors.d.ts +0 -625
- package/dist/services/operate/advisors.d.ts.map +0 -1
- package/dist/services/operate/advisors.js +0 -1545
- package/dist/services/operate/advisors.js.map +0 -1
- package/dist/services/operate/artifact-route-generation.d.ts +0 -111
- package/dist/services/operate/artifact-route-generation.d.ts.map +0 -1
- package/dist/services/operate/artifact-route-generation.js +0 -460
- package/dist/services/operate/artifact-route-generation.js.map +0 -1
- package/dist/services/operate/artifacts.d.ts +0 -66
- package/dist/services/operate/artifacts.d.ts.map +0 -1
- package/dist/services/operate/artifacts.js +0 -336
- package/dist/services/operate/artifacts.js.map +0 -1
- package/dist/services/operate/cadence.d.ts +0 -50
- package/dist/services/operate/cadence.d.ts.map +0 -1
- package/dist/services/operate/cadence.js +0 -56
- package/dist/services/operate/cadence.js.map +0 -1
- package/dist/services/operate/canonical.d.ts +0 -18
- package/dist/services/operate/canonical.d.ts.map +0 -1
- package/dist/services/operate/canonical.js +0 -157
- package/dist/services/operate/canonical.js.map +0 -1
- package/dist/services/operate/citation-resolution.d.ts +0 -161
- package/dist/services/operate/citation-resolution.d.ts.map +0 -1
- package/dist/services/operate/citation-resolution.js +0 -593
- package/dist/services/operate/citation-resolution.js.map +0 -1
- package/dist/services/operate/completion.d.ts +0 -80
- package/dist/services/operate/completion.d.ts.map +0 -1
- package/dist/services/operate/completion.js +0 -279
- package/dist/services/operate/completion.js.map +0 -1
- package/dist/services/operate/config.d.ts +0 -154
- package/dist/services/operate/config.d.ts.map +0 -1
- package/dist/services/operate/config.js +0 -791
- package/dist/services/operate/config.js.map +0 -1
- package/dist/services/operate/consolidation.d.ts +0 -18
- package/dist/services/operate/consolidation.d.ts.map +0 -1
- package/dist/services/operate/consolidation.js +0 -539
- package/dist/services/operate/consolidation.js.map +0 -1
- package/dist/services/operate/context-research.d.ts +0 -84
- package/dist/services/operate/context-research.d.ts.map +0 -1
- package/dist/services/operate/context-research.js +0 -448
- package/dist/services/operate/context-research.js.map +0 -1
- package/dist/services/operate/decision-brief.d.ts +0 -237
- package/dist/services/operate/decision-brief.d.ts.map +0 -1
- package/dist/services/operate/decision-brief.js +0 -368
- package/dist/services/operate/decision-brief.js.map +0 -1
- package/dist/services/operate/doctor.d.ts +0 -85
- package/dist/services/operate/doctor.d.ts.map +0 -1
- package/dist/services/operate/doctor.js +0 -1070
- package/dist/services/operate/doctor.js.map +0 -1
- package/dist/services/operate/drafts.d.ts +0 -48
- package/dist/services/operate/drafts.d.ts.map +0 -1
- package/dist/services/operate/drafts.js +0 -398
- package/dist/services/operate/drafts.js.map +0 -1
- package/dist/services/operate/engine.d.ts +0 -151
- package/dist/services/operate/engine.d.ts.map +0 -1
- package/dist/services/operate/engine.js +0 -1896
- package/dist/services/operate/engine.js.map +0 -1
- package/dist/services/operate/event-store.d.ts +0 -113
- package/dist/services/operate/event-store.d.ts.map +0 -1
- package/dist/services/operate/event-store.js +0 -384
- package/dist/services/operate/event-store.js.map +0 -1
- package/dist/services/operate/evidence-cache.d.ts +0 -41
- package/dist/services/operate/evidence-cache.d.ts.map +0 -1
- package/dist/services/operate/evidence-cache.js +0 -193
- package/dist/services/operate/evidence-cache.js.map +0 -1
- package/dist/services/operate/evidence-import.d.ts +0 -40
- package/dist/services/operate/evidence-import.d.ts.map +0 -1
- package/dist/services/operate/evidence-import.js +0 -340
- package/dist/services/operate/evidence-import.js.map +0 -1
- package/dist/services/operate/evidence.d.ts +0 -21
- package/dist/services/operate/evidence.d.ts.map +0 -1
- package/dist/services/operate/evidence.js +0 -20
- package/dist/services/operate/evidence.js.map +0 -1
- package/dist/services/operate/ids.d.ts +0 -7
- package/dist/services/operate/ids.d.ts.map +0 -1
- package/dist/services/operate/ids.js +0 -23
- package/dist/services/operate/ids.js.map +0 -1
- package/dist/services/operate/index.d.ts +0 -16
- package/dist/services/operate/index.d.ts.map +0 -1
- package/dist/services/operate/index.js +0 -1864
- package/dist/services/operate/index.js.map +0 -1
- package/dist/services/operate/integrity.d.ts +0 -81
- package/dist/services/operate/integrity.d.ts.map +0 -1
- package/dist/services/operate/integrity.js +0 -152
- package/dist/services/operate/integrity.js.map +0 -1
- package/dist/services/operate/interaction/action-service.d.ts +0 -34
- package/dist/services/operate/interaction/action-service.d.ts.map +0 -1
- package/dist/services/operate/interaction/action-service.js +0 -103
- package/dist/services/operate/interaction/action-service.js.map +0 -1
- package/dist/services/operate/interaction/answer-service.d.ts +0 -40
- package/dist/services/operate/interaction/answer-service.d.ts.map +0 -1
- package/dist/services/operate/interaction/answer-service.js +0 -317
- package/dist/services/operate/interaction/answer-service.js.map +0 -1
- package/dist/services/operate/interaction/charter-suggestions.d.ts +0 -29
- package/dist/services/operate/interaction/charter-suggestions.d.ts.map +0 -1
- package/dist/services/operate/interaction/charter-suggestions.js +0 -104
- package/dist/services/operate/interaction/charter-suggestions.js.map +0 -1
- package/dist/services/operate/interaction/confirmation-service.d.ts +0 -30
- package/dist/services/operate/interaction/confirmation-service.d.ts.map +0 -1
- package/dist/services/operate/interaction/confirmation-service.js +0 -78
- package/dist/services/operate/interaction/confirmation-service.js.map +0 -1
- package/dist/services/operate/interaction/initialization-replay.d.ts +0 -9
- package/dist/services/operate/interaction/initialization-replay.d.ts.map +0 -1
- package/dist/services/operate/interaction/initialization-replay.js +0 -64
- package/dist/services/operate/interaction/initialization-replay.js.map +0 -1
- package/dist/services/operate/interaction/question-engine.d.ts +0 -41
- package/dist/services/operate/interaction/question-engine.d.ts.map +0 -1
- package/dist/services/operate/interaction/question-engine.js +0 -434
- package/dist/services/operate/interaction/question-engine.js.map +0 -1
- package/dist/services/operate/interaction/question-registry.d.ts +0 -52
- package/dist/services/operate/interaction/question-registry.d.ts.map +0 -1
- package/dist/services/operate/interaction/question-registry.js +0 -305
- package/dist/services/operate/interaction/question-registry.js.map +0 -1
- package/dist/services/operate/interaction/session-service.d.ts +0 -55
- package/dist/services/operate/interaction/session-service.d.ts.map +0 -1
- package/dist/services/operate/interaction/session-service.js +0 -304
- package/dist/services/operate/interaction/session-service.js.map +0 -1
- package/dist/services/operate/interaction/terminal-renderer.d.ts +0 -19
- package/dist/services/operate/interaction/terminal-renderer.d.ts.map +0 -1
- package/dist/services/operate/interaction/terminal-renderer.js +0 -124
- package/dist/services/operate/interaction/terminal-renderer.js.map +0 -1
- package/dist/services/operate/journal.d.ts +0 -34
- package/dist/services/operate/journal.d.ts.map +0 -1
- package/dist/services/operate/journal.js +0 -235
- package/dist/services/operate/journal.js.map +0 -1
- package/dist/services/operate/legacy-import-service.d.ts +0 -58
- package/dist/services/operate/legacy-import-service.d.ts.map +0 -1
- package/dist/services/operate/legacy-import-service.js +0 -922
- package/dist/services/operate/legacy-import-service.js.map +0 -1
- package/dist/services/operate/lifecycle-driver.d.ts +0 -309
- package/dist/services/operate/lifecycle-driver.d.ts.map +0 -1
- package/dist/services/operate/lifecycle-driver.js +0 -434
- package/dist/services/operate/lifecycle-driver.js.map +0 -1
- package/dist/services/operate/lifecycle.d.ts +0 -96
- package/dist/services/operate/lifecycle.d.ts.map +0 -1
- package/dist/services/operate/lifecycle.js +0 -596
- package/dist/services/operate/lifecycle.js.map +0 -1
- package/dist/services/operate/lock-service.d.ts +0 -37
- package/dist/services/operate/lock-service.d.ts.map +0 -1
- package/dist/services/operate/lock-service.js +0 -215
- package/dist/services/operate/lock-service.js.map +0 -1
- package/dist/services/operate/maintenance.d.ts +0 -139
- package/dist/services/operate/maintenance.d.ts.map +0 -1
- package/dist/services/operate/maintenance.js +0 -2200
- package/dist/services/operate/maintenance.js.map +0 -1
- package/dist/services/operate/migration.d.ts +0 -68
- package/dist/services/operate/migration.d.ts.map +0 -1
- package/dist/services/operate/migration.js +0 -243
- package/dist/services/operate/migration.js.map +0 -1
- package/dist/services/operate/mission-dispatch.d.ts +0 -271
- package/dist/services/operate/mission-dispatch.d.ts.map +0 -1
- package/dist/services/operate/mission-dispatch.js +0 -590
- package/dist/services/operate/mission-dispatch.js.map +0 -1
- package/dist/services/operate/outcomes.d.ts +0 -48
- package/dist/services/operate/outcomes.d.ts.map +0 -1
- package/dist/services/operate/outcomes.js +0 -312
- package/dist/services/operate/outcomes.js.map +0 -1
- package/dist/services/operate/pipeline-handoff.d.ts +0 -138
- package/dist/services/operate/pipeline-handoff.d.ts.map +0 -1
- package/dist/services/operate/pipeline-handoff.js +0 -175
- package/dist/services/operate/pipeline-handoff.js.map +0 -1
- package/dist/services/operate/profile-migration.d.ts +0 -69
- package/dist/services/operate/profile-migration.d.ts.map +0 -1
- package/dist/services/operate/profile-migration.js +0 -462
- package/dist/services/operate/profile-migration.js.map +0 -1
- package/dist/services/operate/projection-persistence.d.ts +0 -126
- package/dist/services/operate/projection-persistence.d.ts.map +0 -1
- package/dist/services/operate/projection-persistence.js +0 -752
- package/dist/services/operate/projection-persistence.js.map +0 -1
- package/dist/services/operate/projection.d.ts +0 -37
- package/dist/services/operate/projection.d.ts.map +0 -1
- package/dist/services/operate/projection.js +0 -209
- package/dist/services/operate/projection.js.map +0 -1
- package/dist/services/operate/protocol.d.ts +0 -86
- package/dist/services/operate/protocol.d.ts.map +0 -1
- package/dist/services/operate/protocol.js +0 -76
- package/dist/services/operate/protocol.js.map +0 -1
- package/dist/services/operate/read-only-providers.d.ts +0 -76
- package/dist/services/operate/read-only-providers.d.ts.map +0 -1
- package/dist/services/operate/read-only-providers.js +0 -421
- package/dist/services/operate/read-only-providers.js.map +0 -1
- package/dist/services/operate/redaction.d.ts +0 -74
- package/dist/services/operate/redaction.d.ts.map +0 -1
- package/dist/services/operate/redaction.js +0 -406
- package/dist/services/operate/redaction.js.map +0 -1
- package/dist/services/operate/reducer.d.ts +0 -10
- package/dist/services/operate/reducer.d.ts.map +0 -1
- package/dist/services/operate/reducer.js +0 -11
- package/dist/services/operate/reducer.js.map +0 -1
- package/dist/services/operate/report-html.d.ts +0 -32
- package/dist/services/operate/report-html.d.ts.map +0 -1
- package/dist/services/operate/report-html.js +0 -289
- package/dist/services/operate/report-html.js.map +0 -1
- package/dist/services/operate/reports.d.ts +0 -72
- package/dist/services/operate/reports.d.ts.map +0 -1
- package/dist/services/operate/reports.js +0 -481
- package/dist/services/operate/reports.js.map +0 -1
- package/dist/services/operate/routes.d.ts +0 -133
- package/dist/services/operate/routes.d.ts.map +0 -1
- package/dist/services/operate/routes.js +0 -1577
- package/dist/services/operate/routes.js.map +0 -1
- package/dist/services/operate/scratch.d.ts +0 -81
- package/dist/services/operate/scratch.d.ts.map +0 -1
- package/dist/services/operate/scratch.js +0 -190
- package/dist/services/operate/scratch.js.map +0 -1
- package/dist/services/operate/shipment-observer.d.ts +0 -14
- package/dist/services/operate/shipment-observer.d.ts.map +0 -1
- package/dist/services/operate/shipment-observer.js +0 -320
- package/dist/services/operate/shipment-observer.js.map +0 -1
- package/dist/services/operate/stalled-item-service.d.ts +0 -18
- package/dist/services/operate/stalled-item-service.d.ts.map +0 -1
- package/dist/services/operate/stalled-item-service.js +0 -121
- package/dist/services/operate/stalled-item-service.js.map +0 -1
- package/dist/services/operate/subprocess-env.d.ts +0 -4
- package/dist/services/operate/subprocess-env.d.ts.map +0 -1
- package/dist/services/operate/subprocess-env.js +0 -45
- package/dist/services/operate/subprocess-env.js.map +0 -1
- package/dist/services/operate/types.d.ts +0 -1064
- package/dist/services/operate/types.d.ts.map +0 -1
- package/dist/services/operate/types.js +0 -27
- package/dist/services/operate/types.js.map +0 -1
- package/dist/services/operate/workspace.d.ts +0 -76
- package/dist/services/operate/workspace.d.ts.map +0 -1
- package/dist/services/operate/workspace.js +0 -350
- package/dist/services/operate/workspace.js.map +0 -1
- package/dist/services/revise-service.d.ts +0 -115
- package/dist/services/revise-service.d.ts.map +0 -1
- package/dist/services/revise-service.js +0 -294
- package/dist/services/revise-service.js.map +0 -1
- package/dist/templates/rules/claude/planr-pipeline.md.hbs +0 -69
- package/dist/templates/rules/codex/_pipeline-section.md.hbs +0 -154
- package/dist/templates/rules/cursor/agents/backend-agent.md +0 -299
- package/dist/templates/rules/cursor/agents/db-agent.md +0 -163
- package/dist/templates/rules/cursor/agents/designer-agent.md +0 -219
- package/dist/templates/rules/cursor/agents/devops-agent.md +0 -197
- package/dist/templates/rules/cursor/agents/doc-gen-agent.md +0 -203
- package/dist/templates/rules/cursor/agents/frontend-agent.md +0 -220
- package/dist/templates/rules/cursor/agents/qa-agent.md +0 -170
- package/dist/templates/rules/cursor/agents/specification-agent.md +0 -282
- package/dist/templates/rules/cursor/planr-pipeline-plan.mdc.hbs +0 -196
- package/dist/templates/rules/cursor/planr-pipeline-ship.mdc.hbs +0 -246
- 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 {
|
|
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 {
|
|
9
|
-
import {
|
|
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(
|
|
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
|
|
91
|
-
|
|
92
|
-
return !result.error && result.status === 0;
|
|
86
|
+
function codexSkillsRoot() {
|
|
87
|
+
return path.join(userHome(), '.codex', 'skills');
|
|
93
88
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
105
|
-
|
|
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
|
-
|
|
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
|
|
111
|
-
runtime,
|
|
112
|
-
installed: detectCommand(executable[runtime]),
|
|
113
|
-
command: executable[runtime],
|
|
114
|
-
}));
|
|
527
|
+
return detectInstalledRuntimes();
|
|
115
528
|
}
|
|
116
529
|
export function listRuntimeAdapters() {
|
|
117
|
-
|
|
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
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
156
|
-
version:
|
|
157
|
-
|
|
567
|
+
root,
|
|
568
|
+
version: document.pipelineVersion,
|
|
569
|
+
pluginVersion: document.pluginVersion,
|
|
570
|
+
registry: document,
|
|
158
571
|
};
|
|
159
572
|
}
|
|
160
|
-
function
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
.
|
|
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) =>
|
|
194
|
-
const hasProject = owned.some((file) =>
|
|
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
|
|
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:
|
|
675
|
+
skills: readRegistry().pluginVersion,
|
|
219
676
|
};
|
|
220
|
-
const manifestDigest =
|
|
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
|
|
708
|
+
function buildActions(options, runtimes, runtimeScopes) {
|
|
246
709
|
if (options.minimal)
|
|
247
710
|
return [];
|
|
248
|
-
const {
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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(
|
|
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: `
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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
|
|
327
|
-
content:
|
|
784
|
+
target: path.join(options.projectDir, '.cursor', 'rules', 'openplanr', asset.relativePath),
|
|
785
|
+
content: asset.content,
|
|
328
786
|
kind: 'file',
|
|
329
|
-
|
|
787
|
+
custody: 'professional-skill',
|
|
788
|
+
description: `Install Cursor rule asset ${asset.relativePath}`,
|
|
330
789
|
});
|
|
331
790
|
}
|
|
332
791
|
}
|
|
333
792
|
else {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
371
|
-
|
|
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
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
408
|
-
await
|
|
409
|
-
|
|
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(
|
|
999
|
+
entry.beforeHash = hash(bytes);
|
|
412
1000
|
}
|
|
413
1001
|
manifest.files.push(entry);
|
|
414
1002
|
}
|
|
415
|
-
|
|
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
|
|
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
|
|
480
|
-
?
|
|
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:
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
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
|
|
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
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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
|
-
|
|
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
|
|
581
|
-
if (
|
|
582
|
-
|
|
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
|
|
1387
|
+
updatedAt,
|
|
589
1388
|
backupDir: backup.dir,
|
|
1389
|
+
backupManifestHash: backupManifestIdentity(backup.manifest),
|
|
590
1390
|
runtimes: preview.runtimes,
|
|
591
1391
|
runtimeScopes: preview.runtimeScopes,
|
|
592
|
-
|
|
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
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
const
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
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
|
|
657
|
-
const
|
|
658
|
-
|
|
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
|
-
|
|
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
|
|
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) =>
|
|
666
|
-
|
|
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 (
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
hash(await readFile(entry.target)) !== entry.afterHash
|
|
674
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
705
|
-
|
|
706
|
-
|
|
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
|
|
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
|
|
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 =
|
|
764
|
-
|
|
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 ||
|
|
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
|
-
|
|
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
|
|
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 ||
|
|
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
|
|
938
|
-
|
|
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
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
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 (
|
|
966
|
-
const inspection =
|
|
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 `
|
|
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 !==
|
|
1032
|
-
const expectedDigest =
|
|
1033
|
-
|
|
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
|
|
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 } =
|
|
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
|
|
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
|
-
|
|
1108
|
-
|
|
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:
|
|
1117
|
-
status:
|
|
1118
|
-
message:
|
|
1119
|
-
|
|
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
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
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: '
|
|
2029
|
+
code: 'runtime-codex-plugin',
|
|
1204
2030
|
status: 'warn',
|
|
1205
|
-
message:
|
|
1206
|
-
fix: 'Run `planr setup --runtime
|
|
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
|
|
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: '
|
|
1224
|
-
status:
|
|
1225
|
-
message:
|
|
1226
|
-
?
|
|
1227
|
-
:
|
|
1228
|
-
...(
|
|
1229
|
-
? {
|
|
1230
|
-
|
|
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
|
|
1254
|
-
if (
|
|
1255
|
-
|
|
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
|
|
2101
|
+
fix: 'Run `planr doctor` for direct diagnostics.',
|
|
1319
2102
|
});
|
|
1320
2103
|
}
|
|
1321
2104
|
}
|