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
|
@@ -0,0 +1,805 @@
|
|
|
1
|
+
/* Review experience. Trusted shell UI only; authored screens remain opaque sandboxes.
|
|
2
|
+
* Adapter hooks: loadExperience, listRevisions, loadRevision, prepareComparisonSource,
|
|
3
|
+
* loadHandoff, updateHandoff, updateReviewMetadata. All hooks are optional and fail visibly.
|
|
4
|
+
*/
|
|
5
|
+
(() => {
|
|
6
|
+
'use strict';
|
|
7
|
+
// A removed, still-downloading runtime belongs to a canceled opening.
|
|
8
|
+
if (document.currentScript && !document.currentScript.isConnected) return;
|
|
9
|
+
const payloadNode = document.getElementById('planr-design-studio-payload');
|
|
10
|
+
if (!payloadNode) return;
|
|
11
|
+
const payload = JSON.parse(payloadNode.textContent);
|
|
12
|
+
const design = payload.document;
|
|
13
|
+
const q = (selector, parent = document) => parent.querySelector(selector);
|
|
14
|
+
const qa = (selector, parent = document) => [...parent.querySelectorAll(selector)];
|
|
15
|
+
const node = (tag, text = '', attrs = {}) => {
|
|
16
|
+
const value = document.createElement(tag);
|
|
17
|
+
if (text) value.textContent = text;
|
|
18
|
+
for (const [key, entry] of Object.entries(attrs)) if (entry !== undefined && entry !== null && entry !== false) value.setAttribute(key, entry);
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
const button = (text, action, attrs = {}) => { const value = node('button', text, { type: 'button', ...attrs }); value.addEventListener('click', action); return value; };
|
|
22
|
+
const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
|
|
23
|
+
const options = () => globalThis.__OPENPLANR_DESIGN_STUDIO_OPTIONS__ || {};
|
|
24
|
+
const scope = `openplanr.experience.${location.pathname.startsWith('/d/') ? location.pathname : design.id}`;
|
|
25
|
+
const read = (key, fallback) => { try { return JSON.parse(localStorage.getItem(`${scope}.${key}`)) ?? fallback; } catch { return fallback; } };
|
|
26
|
+
const write = (key, value) => { try { localStorage.setItem(`${scope}.${key}`, JSON.stringify(value)); } catch { /* Personal preferences remain usable in memory. */ } };
|
|
27
|
+
const avatarColors = [
|
|
28
|
+
['teal', 'Teal', '#0f766e'], ['blue', 'Blue', '#1d4ed8'], ['violet', 'Violet', '#6d28d9'],
|
|
29
|
+
['rose', 'Rose', '#be185d'], ['amber', 'Amber', '#a16207'], ['slate', 'Slate', '#475569'],
|
|
30
|
+
];
|
|
31
|
+
const colorFor = value => [...String(value)].reduce((n, char) => (n * 31 + char.codePointAt(0)) >>> 0, 0) % avatarColors.length;
|
|
32
|
+
const normalizedProfile = value => ({ name: typeof value?.name === 'string' ? value.name.trim().slice(0, 160) : '', color: avatarColors.some(([key]) => key === value?.color) ? value.color : avatarColors[colorFor(value?.name || '')][0] });
|
|
33
|
+
let profile = normalizedProfile(read('profile', null)), themePreference = 'dark';
|
|
34
|
+
try { const saved = localStorage.getItem('openplanr.design.theme'); if (['dark', 'light', 'system'].includes(saved)) themePreference = saved; } catch {}
|
|
35
|
+
const systemTheme = typeof matchMedia === 'function' ? matchMedia('(prefers-color-scheme: light)') : null;
|
|
36
|
+
const applyTheme = () => {
|
|
37
|
+
const resolved = themePreference === 'system' ? (systemTheme?.matches ? 'light' : 'dark') : themePreference;
|
|
38
|
+
if (stage?.getState().theme !== resolved) stage?.dispatch({ type:'set-theme',theme:resolved });
|
|
39
|
+
Object.assign(document.documentElement.dataset, { planrTheme: resolved, designTheme: resolved, designThemePreference: themePreference });
|
|
40
|
+
for (const value of qa('[data-design-theme-choice]')) value.value = themePreference;
|
|
41
|
+
options().onThemeChange?.({ preference: themePreference, resolved });
|
|
42
|
+
};
|
|
43
|
+
const setTheme = value => {
|
|
44
|
+
if (!['dark', 'light', 'system'].includes(value)) return;
|
|
45
|
+
themePreference = value; try { localStorage.setItem('openplanr.design.theme', value); } catch {}
|
|
46
|
+
applyTheme();
|
|
47
|
+
};
|
|
48
|
+
const select = (label, values, initial) => {
|
|
49
|
+
const value = node('select', '', { 'aria-label': label });
|
|
50
|
+
for (const [id, text] of values) value.append(node('option', text, { value: id }));
|
|
51
|
+
value.value = initial; return value;
|
|
52
|
+
};
|
|
53
|
+
let studio, stage, root, rail, experience, activeDialog, railTab = 'review', inspectorEnabled = false;
|
|
54
|
+
let metadata = { version: 0, categories: {}, dispositions: {} };
|
|
55
|
+
let destroyers = [], disposed = false;
|
|
56
|
+
const on = (target, name, callback, config) => { target.addEventListener(name, callback, config); destroyers.push(() => target.removeEventListener(name, callback, config)); };
|
|
57
|
+
const revision = () => experience?.revision || studio.getRevision() || payload.revision;
|
|
58
|
+
const reviewerAudience = () => options().audience === 'reviewer' || location.pathname.startsWith('/d/');
|
|
59
|
+
const commentTypes = [['question','Question','Ask for clarification'], ['suggestion','Suggestion','Offer an optional improvement'], ['change-request','Request change','Ask for a specific change'], ['blocker','Blocker','Must be addressed before proceeding']];
|
|
60
|
+
const categoryLabel = value => commentTypes.find(([id]) => id === value)?.[1] || ({ fix:'Fix', improve:'Improve' })[value] || value;
|
|
61
|
+
const owner = () => experience?.capabilities?.owner === true || experience?.owner === true;
|
|
62
|
+
const state = () => studio.getState();
|
|
63
|
+
const entry = (screenId = state().screenId) => payload.entries.find(item => item.screenId === screenId && item.variantId === state().variantId && item.frameId === state().frameId);
|
|
64
|
+
const pinScope = pin => { const reviewId = pin.reviewId || stage.review.getState().review?.reviewId; const revisionId = pin.revisionId || (reviewId?.startsWith('shared-') ? reviewId.slice(7) : undefined); return { ...(reviewId ? {reviewId}:{}), ...(revisionId ? {revisionId}:{}) }; };
|
|
65
|
+
const pinMetadata = pin => { const value = pinScope(pin); return metadata.byRevision?.[value.revisionId || value.reviewId] || metadata; };
|
|
66
|
+
let toastTimer;
|
|
67
|
+
function announce(text, error = false) {
|
|
68
|
+
let value = q('[data-experience-status]');
|
|
69
|
+
if (!value) { value = node('div', '', { class: 'design-experience-status', 'data-experience-status': '', role: 'status', 'aria-live': 'polite' }); root.append(value); }
|
|
70
|
+
value.textContent = text; value.dataset.error = String(error); value.hidden = false;
|
|
71
|
+
clearTimeout(toastTimer); toastTimer = setTimeout(() => { value.hidden = true; }, error ? 12000 : 6500);
|
|
72
|
+
}
|
|
73
|
+
async function request(name, urlName, input) {
|
|
74
|
+
if (typeof options()[name] === 'function') return options()[name](input);
|
|
75
|
+
const url = options()[urlName];
|
|
76
|
+
if (!url) throw new Error('This action is unavailable in this viewer. Open the attached local review to continue.');
|
|
77
|
+
const response = await fetch(url, { cache: 'no-store', credentials: 'same-origin', ...(input === undefined ? {} : { method: 'POST', headers: { 'content-type': 'application/json', 'x-openplanr-design': '1' }, body: JSON.stringify(input) }) });
|
|
78
|
+
const result = await response.json();
|
|
79
|
+
if (!response.ok || result.ok === false) throw new Error(result.error || 'The request could not be saved. Retry after reconnecting.');
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function modal(title, className = '', onDismiss) {
|
|
83
|
+
activeDialog?.dismiss?.();
|
|
84
|
+
const opener = document.activeElement;
|
|
85
|
+
if (q('[data-design-notes]')?.open) q('[data-design-close-notes]')?.click();
|
|
86
|
+
const dialog = node('dialog', '', { class: `design-experience-dialog ${className}`, 'aria-label': title });
|
|
87
|
+
const head = node('header'); head.append(node('h2', title));
|
|
88
|
+
const dismiss = () => { if (!disposed) onDismiss?.(); dialog.close(); dialog.remove(); if (activeDialog === dialog) activeDialog = null; opener?.isConnected && opener.focus({ preventScroll:true }); };
|
|
89
|
+
dialog.dismiss = dismiss;
|
|
90
|
+
head.append(button('×', dismiss, { 'aria-label': `Close ${title.toLowerCase()}`, class: 'design-dialog-close' }));
|
|
91
|
+
const content = node('div', '', { class: 'design-dialog-content' }); dialog.append(head, content);
|
|
92
|
+
const status = node('p', '', { role: 'status', 'aria-live': 'polite', class: 'design-dialog-status' }); dialog.append(status);
|
|
93
|
+
dialog.addEventListener('cancel', event => { event.preventDefault(); dismiss(); });
|
|
94
|
+
dialog.addEventListener('keydown', event => { event.stopPropagation(); });
|
|
95
|
+
dialog.addEventListener('click', event => { const r = dialog.getBoundingClientRect(); if (event.target === dialog && (event.clientX < r.left || event.clientX > r.right || event.clientY < r.top || event.clientY > r.bottom)) dismiss(); });
|
|
96
|
+
document.body.append(dialog); activeDialog = dialog; dialog.showModal();
|
|
97
|
+
return { dialog, content, status, dismiss };
|
|
98
|
+
}
|
|
99
|
+
function about(auto = false) {
|
|
100
|
+
if (auto && (read('welcomed', false) || !location.pathname.startsWith('/d/'))) return;
|
|
101
|
+
const dialog = modal('Welcome to this review', 'design-welcome', () => write('welcomed', true));
|
|
102
|
+
const { content, dismiss } = dialog;
|
|
103
|
+
dialog.dialog.dataset.designWelcomeStep = 'intro';
|
|
104
|
+
const intro = node('div');
|
|
105
|
+
content.append(node('div', 'OpenPlanr · Design review', { class: 'design-eyebrow' }), node('h3', design.title));
|
|
106
|
+
const brief = experience?.reviewContext?.brief || payload.reviewContext?.brief;
|
|
107
|
+
content.append(node('p', brief?.purpose || 'Explore this design and leave feedback on the screens that matter to you.'));
|
|
108
|
+
if (brief?.audience) content.append(node('p', `For ${brief.audience}`, { class: 'design-muted' }));
|
|
109
|
+
if (brief?.requests?.length) { content.append(node('h4', 'What we need your feedback on')); const list = node('ul'); for (const text of brief.requests) list.append(node('li', text)); content.append(list); }
|
|
110
|
+
content.append(node('p', 'Use Review to add a comment. Your navigation and canvas arrangement are personal.', { class: 'design-muted' }));
|
|
111
|
+
const start = (view) => { dismiss(); studio.setView(view); if (view === 'walkthrough') studio.selectScreen(design.screenOrder[0]); studio.setPanels({ navOpen: false, reviewOpen: false }); studio.fit(); };
|
|
112
|
+
const actions = node('div', '', { class: 'design-dialog-actions' });
|
|
113
|
+
const next = view => {
|
|
114
|
+
while (content.firstChild) intro.append(content.firstChild);
|
|
115
|
+
renderProfile(dialog, { continueAction: () => start(view), back: () => { content.replaceChildren(...intro.childNodes); dialog.dialog.dataset.designWelcomeStep = 'intro'; dialog.dialog.setAttribute('aria-label','Welcome to this review'); q('h2',dialog.dialog).textContent = 'Welcome to this review'; actions.querySelector('button')?.focus(); } });
|
|
116
|
+
};
|
|
117
|
+
actions.append(button('Start walkthrough', () => next('walkthrough'), { class: 'design-primary' }), button('Explore freely', () => next('canvas'))); content.append(actions);
|
|
118
|
+
}
|
|
119
|
+
function avatar(author, { color, large = false } = {}) {
|
|
120
|
+
const name = author?.name || 'Reviewer';
|
|
121
|
+
const identity = stage?.review.getState().identity;
|
|
122
|
+
const own = typeof options().isOwnReviewAuthor === 'function' ? options().isOwnReviewAuthor(author) : author?.id && identity?.id ? author.id === identity.id : !author?.id && !identity?.id && name === identity?.name;
|
|
123
|
+
const key = color || (own ? profile.color : avatarColors[colorFor(author?.id || name)][0]);
|
|
124
|
+
const chosen = avatarColors.find(([id]) => id === key) || avatarColors[0];
|
|
125
|
+
const initials = name.trim().split(/\s+/u).slice(0,2).map(part => [...part][0] || '').join('').toLocaleUpperCase();
|
|
126
|
+
const value = node('span', initials || 'R', { class: `design-avatar${large ? ' design-avatar-large' : ''}`, 'aria-hidden': 'true', 'data-avatar-color': chosen[0] });
|
|
127
|
+
value.style.setProperty('--design-avatar-color', chosen[2]); return value;
|
|
128
|
+
}
|
|
129
|
+
function themeChoice() {
|
|
130
|
+
const wrapper = node('label', 'Appearance', { class: 'design-theme-field' });
|
|
131
|
+
const choice = select('Studio theme', [['dark','Dark'],['light','Light'],['system','System']], themePreference);
|
|
132
|
+
choice.title = 'Board appearance only. Product screens keep their own theme.';
|
|
133
|
+
choice.setAttribute('aria-description', choice.title);
|
|
134
|
+
choice.dataset.designThemeChoice = ''; choice.addEventListener('change', () => setTheme(choice.value)); wrapper.append(choice); return wrapper;
|
|
135
|
+
}
|
|
136
|
+
let notifiedProfile;
|
|
137
|
+
function profileChanged() {
|
|
138
|
+
for (const value of qa('[data-design-profile-button]')) {
|
|
139
|
+
value.replaceChildren(avatar(profile, { color: profile.color }), node('span', profile.name || 'Reviewer profile'));
|
|
140
|
+
value.title = profile.name ? `Edit profile for ${profile.name}` : 'Set up your reviewer profile';
|
|
141
|
+
}
|
|
142
|
+
const identityBlock=q('.planr-identity'); if (identityBlock && reviewerAudience()) identityBlock.hidden=Boolean(profile.name);
|
|
143
|
+
const next = JSON.stringify(profile);
|
|
144
|
+
if (profile.name && next !== notifiedProfile) { notifiedProfile = next; options().onProfileChange?.({ ...profile }); }
|
|
145
|
+
updateFilters();
|
|
146
|
+
}
|
|
147
|
+
function saveProfile(next) {
|
|
148
|
+
profile = normalizedProfile(next); write('profile', profile);
|
|
149
|
+
const identity = stage.review.getState().identity;
|
|
150
|
+
stage.review.setIdentity({ ...(identity?.id ? { id: identity.id } : {}), name: profile.name });
|
|
151
|
+
profileChanged();
|
|
152
|
+
}
|
|
153
|
+
function renderProfile(dialog, { continueAction = dialog.dismiss, back } = {}) {
|
|
154
|
+
const { content, status } = dialog;
|
|
155
|
+
dialog.dialog.dataset.designWelcomeStep = 'profile'; dialog.dialog.setAttribute('aria-label','Your reviewer profile'); q('h2',dialog.dialog).textContent = 'Your reviewer profile';
|
|
156
|
+
content.replaceChildren();
|
|
157
|
+
content.append(node('p', 'Choose how your comments appear. You can change this later.', { class: 'design-muted' }));
|
|
158
|
+
const form = node('form', '', { class: 'design-profile-form' });
|
|
159
|
+
const preview = node('div', '', { class: 'design-profile-preview' });
|
|
160
|
+
const draft = { ...profile };
|
|
161
|
+
const refresh = () => { preview.replaceChildren(avatar(draft, { color: draft.color, large: true }), node('strong', draft.name.trim() || 'Your name')); };
|
|
162
|
+
const label = node('label', 'Reviewer name');
|
|
163
|
+
const name = node('input', '', { type: 'text', name: 'reviewer-name', autocomplete: 'nickname', enterkeyhint:'done', maxlength: '160', required: '', 'aria-label': 'Reviewer name', placeholder: 'How should the team know you?' });
|
|
164
|
+
name.value = draft.name; name.addEventListener('input', () => { draft.name = name.value; name.setCustomValidity(''); refresh(); }); label.append(name);
|
|
165
|
+
const palette = node('fieldset', '', { class: 'design-avatar-palette' }); palette.append(node('legend', 'Avatar color'));
|
|
166
|
+
for (const [key, title, color] of avatarColors) {
|
|
167
|
+
const option = node('label', '', { class: 'design-avatar-option' });
|
|
168
|
+
const radio = node('input', '', { type: 'radio', name: 'avatar-color', value: key, 'aria-label': title }); radio.checked = draft.color === key;
|
|
169
|
+
const swatch = node('span', '', { 'aria-hidden': 'true' }); swatch.style.setProperty('--design-avatar-color',color);
|
|
170
|
+
radio.addEventListener('change', () => { if (radio.checked) { draft.color = key; refresh(); } });
|
|
171
|
+
option.append(radio,swatch,node('span',title)); palette.append(option);
|
|
172
|
+
}
|
|
173
|
+
form.append(preview,label,palette,node('p','Your name is shared with comments. Your avatar color is a personal preference saved in this browser.',{class:'design-muted'}),themeChoice());
|
|
174
|
+
const actions = node('div', '', { class: 'design-dialog-actions' });
|
|
175
|
+
const submit = node('button', back ? 'Continue to review' : 'Save profile', { type:'submit',class:'design-primary' });
|
|
176
|
+
actions.append(submit);
|
|
177
|
+
if (back) actions.append(button('Browse first', continueAction),button('Back',back));
|
|
178
|
+
else actions.append(button('Cancel',dialog.dismiss));
|
|
179
|
+
form.append(actions);content.append(form);refresh();
|
|
180
|
+
form.addEventListener('submit', event => {
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
if (!draft.name.trim()) { name.setCustomValidity('Enter a name, or choose Browse first.'); name.reportValidity(); return; }
|
|
183
|
+
try { saveProfile(draft); continueAction(); } catch (error) { status.textContent = error.message; }
|
|
184
|
+
});
|
|
185
|
+
// Opening the profile step must not also open a phone keyboard and move
|
|
186
|
+
// the page. The person chooses when to type; desktop retains direct focus.
|
|
187
|
+
if (window.matchMedia?.('(pointer:coarse), (max-width:680px)').matches) {
|
|
188
|
+
const title = q('h2',dialog.dialog); title.tabIndex = -1; title.focus({ preventScroll:true });
|
|
189
|
+
} else name.focus({ preventScroll:true });
|
|
190
|
+
content.scrollTop = 0;
|
|
191
|
+
}
|
|
192
|
+
function editProfile() { renderProfile(modal('Your reviewer profile', 'design-profile')); }
|
|
193
|
+
function installMobileViewport() {
|
|
194
|
+
const html = document.documentElement;
|
|
195
|
+
const mobile = window.matchMedia?.('(pointer:coarse), (max-width:680px)');
|
|
196
|
+
if (!mobile) return;
|
|
197
|
+
let pending = 0, width = innerWidth;
|
|
198
|
+
const clear = () => {
|
|
199
|
+
delete root.dataset.designKeyboard;
|
|
200
|
+
root.style.removeProperty('--design-frozen-shell-height');
|
|
201
|
+
html.style.removeProperty('--design-visible-height');
|
|
202
|
+
html.style.removeProperty('--design-visible-top');
|
|
203
|
+
};
|
|
204
|
+
const update = () => {
|
|
205
|
+
pending = 0;
|
|
206
|
+
const active = document.activeElement;
|
|
207
|
+
const editing = mobile.matches && active?.matches('input:not([type="radio"]):not([type="checkbox"]):not([type="hidden"]),textarea,select');
|
|
208
|
+
if (!editing) { clear(); return; }
|
|
209
|
+
if (!root.dataset.designKeyboard || width !== innerWidth) {
|
|
210
|
+
root.style.removeProperty('--design-frozen-shell-height');
|
|
211
|
+
root.style.setProperty('--design-frozen-shell-height',`${root.getBoundingClientRect().height}px`);
|
|
212
|
+
root.dataset.designKeyboard = 'true'; width = innerWidth;
|
|
213
|
+
}
|
|
214
|
+
const visual = window.visualViewport;
|
|
215
|
+
// Browser pinch zoom remains native. Never resize/reposition the layout
|
|
216
|
+
// to counteract a person's zoom, which would create a scale feedback loop.
|
|
217
|
+
if (visual && Math.abs(visual.scale - 1) < .01) {
|
|
218
|
+
html.style.setProperty('--design-visible-height',`${Math.max(1,visual.height)}px`);
|
|
219
|
+
html.style.setProperty('--design-visible-top',`${Math.max(0,visual.offsetTop)}px`);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
const schedule = () => { if (!pending) pending = requestAnimationFrame(update); };
|
|
223
|
+
on(document,'focusin',update); on(document,'focusout',schedule);
|
|
224
|
+
on(window,'resize',schedule);
|
|
225
|
+
if (window.visualViewport) { on(window.visualViewport,'resize',schedule); on(window.visualViewport,'scroll',schedule); }
|
|
226
|
+
destroyers.push(() => { cancelAnimationFrame(pending); clear(); });
|
|
227
|
+
}
|
|
228
|
+
function installProfileAndTheme() {
|
|
229
|
+
applyTheme();
|
|
230
|
+
if (systemTheme?.addEventListener) on(systemTheme,'change',() => { if (themePreference === 'system') applyTheme(); });
|
|
231
|
+
const identity = stage.review.getState().identity;
|
|
232
|
+
if (identity?.name) profile = normalizedProfile({ ...profile,name:identity.name });
|
|
233
|
+
else if (profile.name) stage.review.setIdentity({ name:profile.name });
|
|
234
|
+
const footer = node('div','',{class:'design-personal-settings'});
|
|
235
|
+
footer.append(button('',editProfile,{'data-design-profile-button':'','aria-label':'Edit reviewer profile',class:'design-profile-button'}),themeChoice());
|
|
236
|
+
q('.design-nav-footer').before(footer);
|
|
237
|
+
destroyers.push(stage.review.controller.subscribe((state, change) => {
|
|
238
|
+
if (change.type !== 'identity') return;
|
|
239
|
+
profile = normalizedProfile({ ...profile,name:state.identity?.name || '' }); write('profile',profile); profileChanged();
|
|
240
|
+
}));
|
|
241
|
+
profileChanged();
|
|
242
|
+
}
|
|
243
|
+
function installPersonalDrafts() {
|
|
244
|
+
// Shared reviews already persist drafts through their authenticated host.
|
|
245
|
+
if (location.pathname.startsWith('/d/')) return;
|
|
246
|
+
const key = `review-drafts.${payload.revision || studio.getRevision() || 'unpublished'}`;
|
|
247
|
+
const restore = () => { const saved = read(key,null); if (saved) { try { stage.review.restoreDrafts?.(saved); } catch { /* Invalid personal storage must not block the studio. */ } } };
|
|
248
|
+
restore(); on(root,'planr:design-ready',restore,{once:true});
|
|
249
|
+
on(root,'planr:artifact-review-draft-change',event => { if (event.detail?.reviewOf) write(key,event.detail); });
|
|
250
|
+
on(window,'pagehide',() => { const snapshot = stage.review.snapshotDrafts?.(); if (snapshot?.reviewOf) write(key,snapshot); });
|
|
251
|
+
}
|
|
252
|
+
function installReadability() {
|
|
253
|
+
const widths = read('widths', { left: 240, right: 336 });
|
|
254
|
+
const apply = () => { root.style.setProperty('--design-nav-width', `${clamp(widths.left, 200, 360)}px`); root.style.setProperty('--planr-review-rail-width', `${clamp(widths.right, 300, 480)}px`); };
|
|
255
|
+
apply();
|
|
256
|
+
for (const [side, panel, min, max] of [['left', q('.design-navigator'), 200, 360], ['right', rail, 300, 480]]) {
|
|
257
|
+
const handle = node('div', '', { class: `design-resize-handle design-resize-${side}`, role: 'separator', tabindex: '0', 'aria-orientation': 'vertical', 'aria-label': `Resize ${side === 'left' ? 'screens' : 'review'} sidebar`, 'aria-valuemin': String(min), 'aria-valuemax': String(max), 'aria-valuenow': String(widths[side]) });
|
|
258
|
+
panel.append(handle);
|
|
259
|
+
const set = value => { widths[side] = clamp(value, min, max); apply(); handle.setAttribute('aria-valuenow', String(Math.round(widths[side]))); write('widths', widths); };
|
|
260
|
+
let drag;
|
|
261
|
+
on(handle, 'pointerdown', event => { if (event.button !== 0) return; drag = { start: event.clientX, width: widths[side], id: event.pointerId }; handle.setPointerCapture(event.pointerId); event.preventDefault(); root.dataset.designResizing = 'true'; });
|
|
262
|
+
on(handle, 'pointermove', event => { if (drag?.id === event.pointerId) set(drag.width + (event.clientX - drag.start) * (side === 'left' ? 1 : -1)); });
|
|
263
|
+
for (const name of ['pointerup', 'pointercancel']) on(handle, name, () => { drag = null; delete root.dataset.designResizing; });
|
|
264
|
+
on(handle, 'keydown', event => { if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return; event.preventDefault(); const delta = (event.key === 'ArrowRight' ? 1 : -1) * (side === 'left' ? 1 : -1) * (event.shiftKey ? 40 : 8); set(event.key === 'Home' ? min : event.key === 'End' ? max : widths[side] + delta); });
|
|
265
|
+
on(handle, 'dblclick', () => set(side === 'left' ? 240 : 336));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function installThumbnails() {
|
|
269
|
+
// Phones use numbered navigation: styled DOM/SVG captures can briefly
|
|
270
|
+
// multiply the memory occupied by a live product document.
|
|
271
|
+
if (stage.frameBudget) return;
|
|
272
|
+
const cache = new Map(), queue = [], queued = new Set(); let running = false, ready = false;
|
|
273
|
+
const paintable = current => {
|
|
274
|
+
const frame = stage.getFrame(current.artifactId);
|
|
275
|
+
return state().navOpen && frame && !frame.closest('.planr-artifact-panel')?.hidden && frame.getClientRects().length > 0;
|
|
276
|
+
};
|
|
277
|
+
const renderThumb = async (screenButton) => {
|
|
278
|
+
const current = entry(screenButton.dataset.designScreen); if (!current) return;
|
|
279
|
+
const fingerprint = (experience?.fingerprints || payload.fingerprints)?.find(item => item.screenId === current.screenId && item.frameId === current.frameId && item.variantId === current.variantId);
|
|
280
|
+
const key = `${fingerprint?.contentDigest || revision()}:${current.artifactId}`; const target = q('.design-thumbnail', screenButton);
|
|
281
|
+
if (cache.has(key)) { target.replaceChildren(cache.get(key).cloneNode()); return; }
|
|
282
|
+
if (!paintable(current)) return;
|
|
283
|
+
if (queued.has(key)) return; queued.add(key); queue.push({ current, key, target }); await pump();
|
|
284
|
+
};
|
|
285
|
+
const pump = async () => {
|
|
286
|
+
if (running || !ready || disposed) return; running = true;
|
|
287
|
+
while (queue.length && !disposed) {
|
|
288
|
+
const { current, key, target } = queue.shift();
|
|
289
|
+
try {
|
|
290
|
+
if (!paintable(current)) continue;
|
|
291
|
+
const result = await stage.getFrame(current.artifactId)?.__openPlanrBridge?.thumbnail?.();
|
|
292
|
+
if (typeof result?.dataUrl !== 'string' || !/^data:image\/png;base64,/u.test(result.dataUrl) || result.dataUrl.length > 360000) continue;
|
|
293
|
+
const img = node('img', '', { src: result.dataUrl, alt: '', loading: 'lazy' }); cache.set(key, img);
|
|
294
|
+
if (entry(current.screenId)?.artifactId === current.artifactId) target.replaceChildren(img.cloneNode());
|
|
295
|
+
} catch { /* The labelled screen button remains usable when capture is unavailable. */ }
|
|
296
|
+
finally { queued.delete(key); }
|
|
297
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
298
|
+
}
|
|
299
|
+
running = false;
|
|
300
|
+
};
|
|
301
|
+
const screenButtons = qa('[data-design-screen]');
|
|
302
|
+
for (const screenButton of screenButtons) {
|
|
303
|
+
const preview = node('span', '', { class: 'design-thumbnail', 'aria-hidden': 'true' }); preview.append(node('span', screenButton.querySelector('.design-screen-number')?.textContent || '')); screenButton.prepend(preview);
|
|
304
|
+
}
|
|
305
|
+
const visible = new Set();
|
|
306
|
+
const observer = typeof IntersectionObserver === 'function' ? new IntersectionObserver(records => { for (const record of records) { if (record.isIntersecting) { visible.add(record.target); void renderThumb(record.target); } else visible.delete(record.target); } }, { root: q('.design-screen-list'), rootMargin: '120px' }) : null;
|
|
307
|
+
if (observer) { screenButtons.forEach(item => observer.observe(item)); destroyers.push(() => observer.disconnect()); }
|
|
308
|
+
else screenButtons.slice(0, 6).forEach(item => visible.add(item));
|
|
309
|
+
let signature = '', scheduled;
|
|
310
|
+
const schedule = () => {
|
|
311
|
+
if (scheduled || disposed) return;
|
|
312
|
+
scheduled = requestAnimationFrame(() => { scheduled = null; for (const target of visible) void renderThumb(target); void pump(); });
|
|
313
|
+
};
|
|
314
|
+
// Journey views hide inactive frames. Retry only when a presentation change can
|
|
315
|
+
// make a frame paintable, after layout; camera motion never creates retry loops.
|
|
316
|
+
on(root, 'planr:design-render', () => { const current = state(); const next = `${current.view}:${current.screenId}:${current.variantId}:${current.frameId}:${current.navOpen}`; if (next !== signature) { signature = next; schedule(); } });
|
|
317
|
+
destroyers.push(() => cancelAnimationFrame(scheduled));
|
|
318
|
+
const start = () => { ready = true; schedule(); };
|
|
319
|
+
on(root, 'planr:design-ready', start); if (stage.getState().status === 'ready') setTimeout(start, 200);
|
|
320
|
+
}
|
|
321
|
+
let updateFilters = () => {};
|
|
322
|
+
function categoryPicker(initial, onChange) {
|
|
323
|
+
const group = node('div','',{class:'design-category-picker',role:'radiogroup','aria-label':'Comment type'});
|
|
324
|
+
const field = node('input','',{type:'hidden','data-planr-draft-key':'category'}); field.value=initial; group.append(field);
|
|
325
|
+
const sync = () => {
|
|
326
|
+
for (const value of qa('[role="radio"]',group)) { const selected=value.dataset.designCategory===field.value; value.setAttribute('aria-checked',String(selected)); value.tabIndex=selected || (!commentTypes.some(([id])=>id===field.value) && value===q('[role="radio"]',group)) ? 0 : -1; }
|
|
327
|
+
onChange?.(field.value);
|
|
328
|
+
};
|
|
329
|
+
for (const [id,label,hint] of commentTypes) {
|
|
330
|
+
const choice=button(label,()=>{field.value=id;field.dispatchEvent(new Event('change',{bubbles:true}));},{role:'radio','aria-label':label,'data-design-category':id,title:hint,'aria-description':hint}); group.append(choice);
|
|
331
|
+
}
|
|
332
|
+
group.addEventListener('keydown',event=>{if (!['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','Home','End'].includes(event.key)) return;event.preventDefault();const buttons=qa('[role="radio"]',group),index=buttons.indexOf(event.target);const next=event.key==='Home'?0:event.key==='End'?buttons.length-1:(index+(event.key==='ArrowLeft'||event.key==='ArrowUp'?-1:1)+buttons.length)%buttons.length;buttons[next].click();buttons[next].focus();});
|
|
333
|
+
field.addEventListener('change',sync); sync(); return {group,field};
|
|
334
|
+
}
|
|
335
|
+
function installComposerCategory() {
|
|
336
|
+
let pending = null, saving = false, retry;
|
|
337
|
+
const outbox = read(`categories.${revision()}`, {});
|
|
338
|
+
const available = () => typeof options().updateReviewMetadata === 'function' || (owner() && (options().handoffUrl || options().updateHandoff));
|
|
339
|
+
const flush = async () => {
|
|
340
|
+
if (saving || !available()) return; saving = true;
|
|
341
|
+
try {
|
|
342
|
+
for (const [pinId, category] of Object.entries(outbox)) {
|
|
343
|
+
const body = { action: 'category', pinId, category, revision: revision(), version: metadata.version || 0, ...pinScope({}) };
|
|
344
|
+
const result = options().updateReviewMetadata ? await options().updateReviewMetadata(body) : await request('updateHandoff', 'handoffUrl', body);
|
|
345
|
+
metadata = result.metadata || { ...metadata, categories: { ...metadata.categories, [pinId]: category } };
|
|
346
|
+
delete outbox[pinId]; write(`categories.${revision()}`, outbox); updateFilters();
|
|
347
|
+
}
|
|
348
|
+
} catch { announce('Comment saved. Its type is waiting to sync. Retry when your connection is available.', true); }
|
|
349
|
+
finally { saving = false; if (retry) retry.hidden = !Object.keys(outbox).length; }
|
|
350
|
+
};
|
|
351
|
+
on(root, 'planr:artifact-annotation-draft', () => {
|
|
352
|
+
const composer = q('[data-planr-annotation-composer]'); if (!composer || q('[data-planr-draft-key="category"]', composer) || !available()) return;
|
|
353
|
+
const picker = q('[role="radiogroup"]', composer); picker.hidden = true;
|
|
354
|
+
const {group,field:category} = categoryPicker('suggestion', value => { const intent = { question:'question',suggestion:'improve','change-request':'fix',blocker:'fix' }[value] || 'improve'; q(`[data-planr-intent="${intent}"]`, picker).click(); });
|
|
355
|
+
const label = node('div', '', { class: 'design-composer-category' }); label.append(node('span','Comment type'),group); picker.after(label);
|
|
356
|
+
q('[data-planr-composer-comment]',composer).placeholder='Describe your feedback for this area…';
|
|
357
|
+
composer.addEventListener('submit', () => { if (!q('[data-planr-composer-comment]', composer).value.trim() || !q('[data-planr-composer-identity]', composer).value.trim()) { pending = null; return; } pending = { ids: new Set((stage.review.getState().review?.pins || []).map(item => item.id)), category: category.value }; }, { capture: true });
|
|
358
|
+
});
|
|
359
|
+
on(root, 'planr:artifact-review-change', event => {
|
|
360
|
+
if (pending) { const pin = event.detail?.pins?.find(item => !pending.ids.has(item.id)); if (pin) { outbox[pin.id] = pending.category; metadata.categories = { ...metadata.categories, [pin.id]: pending.category }; write(`categories.${revision()}`, outbox); pending = null; queueMicrotask(() => { updateFilters(); void flush(); }); } }
|
|
361
|
+
});
|
|
362
|
+
on(window, 'online', flush);
|
|
363
|
+
on(document, 'openplanr:design-experience-changed', flush);
|
|
364
|
+
retry = button('Retry pending categories', flush, { class: 'design-text-button' });
|
|
365
|
+
retry.hidden = !Object.keys(outbox).length; q('[data-design-review-filters]').append(retry);
|
|
366
|
+
on(root, 'planr:artifact-review-change', () => { retry.hidden = !Object.keys(outbox).length; });
|
|
367
|
+
}
|
|
368
|
+
function installReview() {
|
|
369
|
+
const controls = node('div', '', { class: 'design-review-filters', 'data-design-review-filters': '' });
|
|
370
|
+
const row = node('div', '', { class: 'design-filter-row' });
|
|
371
|
+
const scopeFilter = select('Review scope', [['screen', 'This screen'], ['all', 'All screens']], 'screen');
|
|
372
|
+
const statusFilter = select('Review status', [['open', 'Open'], ['resolved', 'Resolved'], ['all', 'All statuses']], 'open');
|
|
373
|
+
row.append(scopeFilter, statusFilter);
|
|
374
|
+
const search = node('input', '', { type: 'search', placeholder: 'Search comments', 'aria-label': 'Search comments' });
|
|
375
|
+
const type = select('Comment type', [['all', 'All types'], ['question', 'Questions'], ['suggestion', 'Suggestions'], ['change-request','Change requests'], ['blocker', 'Blockers'], ['fix', 'Fixes']], 'all');
|
|
376
|
+
const unreadOnly = node('input', '', { type: 'checkbox' }); const unreadLabel = node('label', '', { class: 'design-unread-toggle' }); const unreadCount = node('span', 'Unread only'); unreadLabel.append(unreadOnly, unreadCount);
|
|
377
|
+
const secondary = node('div', '', { class: 'design-filter-row' }); secondary.append(type, unreadLabel);
|
|
378
|
+
controls.append(row, search, secondary, button('Export reviews', exportReviews, {class:'design-review-export'})); q('.design-comment-action').after(controls);
|
|
379
|
+
const seen = read(`seen.${revision()}`, {});
|
|
380
|
+
const activity = pin => [pin.updatedAt, pin.createdAt, ...(pin.replies || []).map(reply => reply.createdAt)].filter(Boolean).sort().at(-1) || '';
|
|
381
|
+
const unread = pin => (seen[pin.id] || '') < activity(pin);
|
|
382
|
+
const category = pin => pinMetadata(pin).categories?.[pin.id] || (pin.intent === 'improve' ? 'suggestion' : pin.intent);
|
|
383
|
+
const filter = pin => {
|
|
384
|
+
const identity = payload.entries.find(value => value.artifactId === pin.artifactId);
|
|
385
|
+
const screenId = pin.anchor?.screen || identity?.screenId;
|
|
386
|
+
return (scopeFilter.value === 'all' || screenId === state().screenId) && (statusFilter.value === 'all' || (statusFilter.value === 'resolved' ? pin.status === 'resolved' : pin.status !== 'resolved')) && (type.value === 'all' || category(pin) === type.value) && (!unreadOnly.checked || unread(pin)) && (!search.value.trim() || [pin.comment, pin.author.name, ...(pin.replies || []).flatMap(reply => [reply.comment, reply.author.name])].join(' ').toLowerCase().includes(search.value.trim().toLowerCase()));
|
|
387
|
+
};
|
|
388
|
+
const label = pin => categoryLabel(category(pin));
|
|
389
|
+
const decorate = ({ element, pin }) => {
|
|
390
|
+
q('.planr-review-byline',element)?.prepend(avatar(pin.author));
|
|
391
|
+
qa('.planr-reply',element).forEach(reply => { const author=pin.replies?.find(item => item.id === reply.dataset.planrReplyId)?.author; if(author) q('header',reply).prepend(avatar(author)); });
|
|
392
|
+
element.dataset.designCategory=category(pin);
|
|
393
|
+
const badge=q('.planr-intent',element); badge.dataset.designCategory=category(pin);
|
|
394
|
+
const section = node('div', '', { class: 'design-thread-triage' });
|
|
395
|
+
const canCategorize = (typeof options().updateReviewMetadata === 'function' || (owner() && (options().handoffUrl || options().updateHandoff))) && (typeof options().canCategorizePin !== 'function' || options().canCategorizePin(pin.id));
|
|
396
|
+
if (canCategorize) {
|
|
397
|
+
const edit=button(label(pin), async () => {
|
|
398
|
+
const {content,status,dismiss}=modal('Comment type');
|
|
399
|
+
content.append(node('p',pin.comment,{class:'design-edit-comment-excerpt'}));
|
|
400
|
+
let save;
|
|
401
|
+
const {group,field}=categoryPicker(category(pin),()=>{if(save)save.disabled=false;});content.append(group);
|
|
402
|
+
save=button('Save type',async()=>{save.disabled=true;try {
|
|
403
|
+
const body={action:'category',pinId:pin.id,category:field.value,revision:revision(),version:metadata.version||0,...pinScope(pin)};
|
|
404
|
+
const result=options().updateReviewMetadata?await options().updateReviewMetadata(body):await request('updateHandoff','handoffUrl',body);
|
|
405
|
+
metadata=result.metadata||{...metadata,categories:{...metadata.categories,[pin.id]:field.value}};updateFilters();dismiss();
|
|
406
|
+
}catch(error){status.textContent=error.message;}finally{save.disabled=false;}},{class:'design-primary'});
|
|
407
|
+
save.disabled=!commentTypes.some(([id])=>id===field.value);
|
|
408
|
+
const actions=node('div','',{class:'design-dialog-actions'});actions.append(button('Cancel',dismiss),save);content.append(actions);
|
|
409
|
+
},{class:'design-category-badge','data-design-category':category(pin),'aria-label':`Change comment type: ${label(pin)}`,title:'Change comment type'});
|
|
410
|
+
badge.replaceWith(edit);
|
|
411
|
+
}
|
|
412
|
+
const disposition = pinMetadata(pin).dispositions?.[pin.id];
|
|
413
|
+
if (disposition) section.append(node('span', `${disposition.disposition}${disposition.reason ? ` · ${disposition.reason}` : ''}`, { class: 'design-disposition' }));
|
|
414
|
+
if (owner()) section.append(button('Disposition', () => editDisposition(pin), { class: 'design-small-button' }));
|
|
415
|
+
if (section.childNodes.length) element.append(section);
|
|
416
|
+
};
|
|
417
|
+
const colorPins = () => { if(disposed)return; const colors=new Map((stage.review.getState().review?.pins || []).map(pin=>[pin.id,category(pin)])); for(const marker of qa('[data-planr-pin-id]')) { const value=colors.get(marker.dataset.planrPinId);if(value && marker.dataset.designCategory!==value) marker.dataset.designCategory=value; } };
|
|
418
|
+
const updateUnread = () => { const count = (stage.review.getState().review?.pins || []).filter(unread).length; unreadCount.textContent = `Unread · ${count}`; };
|
|
419
|
+
updateFilters = () => { if(disposed)return; updateUnread(); stage.review.setPresentation?.({ compact:true, pageSize:40, filterKey:JSON.stringify([scopeFilter.value,statusFilter.value,type.value,unreadOnly.checked,search.value,state().screenId]), filterPin: filter, describePin: pin => ({ intentLabel: label(pin), unread: unread(pin) }), decorateThread: decorate, emptyMessage: 'No comments match these filters.', onThreadOpen: (pinId) => { const pin = stage.review.getState().review?.pins.find(item => item.id === pinId); if (pin && unread(pin)) { seen[pinId] = activity(pin); write(`seen.${revision()}`, seen); const thread = qa('[data-planr-pin-id]').find(value => value.dataset.planrPinId === pinId); thread?.removeAttribute('data-planr-unread'); updateUnread(); } } }); colorPins(); };
|
|
420
|
+
on(root, 'planr:artifact-review-change', () => { updateUnread(); queueMicrotask(colorPins); });
|
|
421
|
+
for (const value of [scopeFilter, statusFilter, type, unreadOnly]) on(value, 'change', updateFilters);
|
|
422
|
+
on(search, 'input', updateFilters);
|
|
423
|
+
let currentScreen = state().screenId;
|
|
424
|
+
on(root, 'planr:design-render', () => { if (currentScreen !== state().screenId) { currentScreen = state().screenId; updateFilters(); } });
|
|
425
|
+
updateFilters(); colorPins();
|
|
426
|
+
on(document,'planr:design-experience-change',()=>queueMicrotask(colorPins));
|
|
427
|
+
}
|
|
428
|
+
function exportReviews() {
|
|
429
|
+
const {content,status,dialog}=modal('Export reviews');
|
|
430
|
+
const canLoad=typeof options().loadReviewExport==='function';
|
|
431
|
+
const scopeChoice=select('Review export scope', canLoad ? [['current','Current revision'],['all','All revisions']] : [['current','Current revision']], 'current');
|
|
432
|
+
content.append(node('p','Download comments and replies with their original screen, frame, timestamps and pin coordinates. This does not approve or resolve feedback.'),scopeChoice);
|
|
433
|
+
const actions=node('div','',{class:'design-dialog-actions'});
|
|
434
|
+
let preparing=false;
|
|
435
|
+
const download=async(format)=>{
|
|
436
|
+
if(preparing)return;preparing=true;
|
|
437
|
+
for(const value of actions.querySelectorAll('button'))value.disabled=true;
|
|
438
|
+
scopeChoice.disabled=true;status.textContent='Preparing review history…';
|
|
439
|
+
try {
|
|
440
|
+
if(Object.keys(read(`categories.${revision()}`,{})).length)throw Error('A comment type is still waiting to save. Reconnect and retry after it finishes.');
|
|
441
|
+
const tools=globalThis.OpenPlanrDesignReviewExport;
|
|
442
|
+
if(!tools)throw Error('Review export is unavailable. Reload this review and try again.');
|
|
443
|
+
if(canLoad && !reviewerAudience()){await studio.flush();if(studio.getSaveState().dirty)throw Error('Changes are still waiting to save. Reconnect and retry.');}
|
|
444
|
+
const snapshot=canLoad?await options().loadReviewExport({scope:scopeChoice.value}):tools.createDesignReviewExport({bundle:{document:design,entries:payload.entries,revision:revision()},revisionId:revision(),review:stage.review.getState().review,metadata,historyComplete:!experience?.loadingHistory,olderPagesLoading:Boolean(experience?.loadingHistory),generatedAt:new Date().toISOString()});
|
|
445
|
+
if(!dialog.isConnected)return;
|
|
446
|
+
const text=tools.serializeDesignReviewExport(snapshot,format),url=URL.createObjectURL(new Blob([text],{type:format==='json'?'application/json':'text/markdown;charset=utf-8'}));
|
|
447
|
+
const link=node('a','',{href:url,download:`design-review-${scopeChoice.value}.${format==='json'?'json':'md'}`});
|
|
448
|
+
document.body.append(link);link.click();link.remove();setTimeout(()=>URL.revokeObjectURL(url),10000);
|
|
449
|
+
status.textContent=`Exported ${snapshot.summary.threads} comments and ${snapshot.summary.replies} replies.${snapshot.completeness.historyComplete?'':' Some history is unavailable; the export identifies this.'}`;
|
|
450
|
+
}catch(error){status.textContent=`Could not export reviews: ${error.message} Try the download again.`;}
|
|
451
|
+
finally{preparing=false;for(const value of actions.querySelectorAll('button'))value.disabled=false;scopeChoice.disabled=false;}
|
|
452
|
+
};
|
|
453
|
+
actions.append(button('Download Markdown',()=>void download('markdown'),{class:'design-primary'}),button('Download JSON',()=>void download('json')));content.append(actions);
|
|
454
|
+
}
|
|
455
|
+
async function editDisposition(pin) {
|
|
456
|
+
const { content, status } = modal('Review disposition');
|
|
457
|
+
const current = pinMetadata(pin).dispositions?.[pin.id];
|
|
458
|
+
content.append(node('p', pin.comment));
|
|
459
|
+
const value = select('Disposition', [['accepted', 'Accept for implementation'], ['deferred', 'Defer'], ['rejected', 'Decline']], current?.disposition || 'accepted');
|
|
460
|
+
const reason = node('textarea', '', { 'aria-label': 'Disposition reason', placeholder: 'Explain the decision', maxlength: '8192' }); reason.value = current?.reason || '';
|
|
461
|
+
const save = button('Save disposition', async () => {
|
|
462
|
+
save.disabled = true;
|
|
463
|
+
try { const result = await request('updateHandoff', 'handoffUrl', { action: 'disposition', revision: revision(), version: metadata.version || 0, pinId: pin.id, disposition: value.value, reason: reason.value.trim(), ...pinScope(pin) }); metadata = result.metadata || metadata; updateFilters(); status.textContent = 'Disposition saved. Original feedback is unchanged.'; }
|
|
464
|
+
catch (error) { status.textContent = error.message; } finally { save.disabled = false; }
|
|
465
|
+
}, { class: 'design-primary' }); content.append(value, reason, save);
|
|
466
|
+
}
|
|
467
|
+
function installCanvas() {
|
|
468
|
+
const tools = q('.design-canvas-tools');
|
|
469
|
+
const more = node('details', '', { class: 'design-tools-menu' }); more.append(node('summary', 'More', { 'aria-label': 'More canvas controls' }));
|
|
470
|
+
const list = node('div');
|
|
471
|
+
list.append(button('Fit selection', () => { studio.fitSelection(); more.open = false; }, { 'aria-keyshortcuts': 'Shift+2' }));
|
|
472
|
+
let minimapOpen = read('minimap', design.screens.length > 6);
|
|
473
|
+
const toggleMap = button('Minimap', () => { minimapOpen = !minimapOpen; write('minimap', minimapOpen); draw(); more.open = false; }, { 'aria-pressed': String(minimapOpen) }); list.append(toggleMap);
|
|
474
|
+
const presentation = button('Present fullscreen', () => { void fullscreen(); more.open = false; }); list.append(presentation);
|
|
475
|
+
list.append(button('Keyboard shortcuts', () => { shortcuts(); more.open = false; }, { 'aria-keyshortcuts': '?' }), button('Reviewer profile', () => { editProfile(); more.open = false; }), button('About this review', () => { about(); more.open = false; })); more.append(list); tools.append(more);
|
|
476
|
+
const map = node('div', '', { class: 'design-minimap', 'aria-label': 'Canvas minimap' });
|
|
477
|
+
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); svg.setAttribute('viewBox', '0 0 200 128'); svg.setAttribute('aria-label', 'Canvas overview');
|
|
478
|
+
const close = button('×', () => { minimapOpen = false; write('minimap', false); draw(); }, { class: 'design-minimap-close', 'aria-label': 'Close minimap' }); map.append(svg, close); q('.planr-stage').append(map);
|
|
479
|
+
const scroll = q('.planr-stage-scroll'); let geometry = null, scheduled = false;
|
|
480
|
+
const mapBoards = new Map();
|
|
481
|
+
const viewportRect = document.createElementNS(svg.namespaceURI, 'rect');
|
|
482
|
+
viewportRect.setAttribute('class', 'design-minimap-viewport'); viewportRect.setAttribute('pointer-events', 'none'); svg.append(viewportRect);
|
|
483
|
+
const attribute = (element, name, value) => { if (element.getAttribute(name) !== String(value)) element.setAttribute(name, String(value)); };
|
|
484
|
+
function draw() {
|
|
485
|
+
const current = state(); toggleMap.hidden = current.view !== 'canvas';
|
|
486
|
+
q('summary',more).setAttribute('aria-label', current.view === 'canvas' ? 'More canvas controls' : 'More screen controls');
|
|
487
|
+
map.hidden = current.view !== 'canvas' || !minimapOpen || root.dataset.designPresentation === 'true'; toggleMap.setAttribute('aria-pressed', String(minimapOpen)); if (map.hidden) return;
|
|
488
|
+
const boards = payload.entries.filter(item => !stage.getPanel(item.artifactId)?.hidden).map(item => { const panel = stage.getPanel(item.artifactId), frame = design.frames.find(value => value.id === item.frameId); return { ...item, x: parseFloat(panel.style.left) || 0, y: parseFloat(panel.style.top) || 0, width: frame.width, height: frame.height }; });
|
|
489
|
+
if (!boards.length) return;
|
|
490
|
+
const viewport = { x: -current.camera.x / current.zoom, y: -current.camera.y / current.zoom, width: scroll.clientWidth / current.zoom, height: scroll.clientHeight / current.zoom };
|
|
491
|
+
// Board bounds are independent of the camera. Including the viewport in
|
|
492
|
+
// these bounds made every zoom shrink/recenter the whole overview.
|
|
493
|
+
const minX = Math.min(...boards.map(item => item.x)), minY = Math.min(...boards.map(item => item.y));
|
|
494
|
+
const width = Math.max(...boards.map(item => item.x + item.width)) - minX, height = Math.max(...boards.map(item => item.y + item.height)) - minY;
|
|
495
|
+
const scale = Math.min(184 / Math.max(1, width), 112 / Math.max(1, height));
|
|
496
|
+
const offsetX = (200 - width * scale) / 2, offsetY = (128 - height * scale) / 2;
|
|
497
|
+
geometry = { minX, minY, scale, viewport, offsetX, offsetY };
|
|
498
|
+
const place = (element, box) => { for (const [key, value] of Object.entries({ x: offsetX + (box.x - minX) * scale, y: offsetY + (box.y - minY) * scale, width: Math.max(1, box.width * scale), height: Math.max(1, box.height * scale) })) attribute(element,key,value); };
|
|
499
|
+
const visible = new Set(boards.map(board => board.artifactId));
|
|
500
|
+
for (const [id, value] of mapBoards) if (!visible.has(id)) { value.remove(); mapBoards.delete(id); }
|
|
501
|
+
for (const board of boards) {
|
|
502
|
+
let value = mapBoards.get(board.artifactId);
|
|
503
|
+
if (!value) {
|
|
504
|
+
value = document.createElementNS(svg.namespaceURI, 'rect');
|
|
505
|
+
for (const [key, entry] of Object.entries({ class:'design-minimap-board', 'data-map-artifact':board.artifactId, role:'button', tabindex:'0', 'aria-label':`Focus ${design.screens.find(item => item.id === board.screenId).title}, ${board.frameId}` })) attribute(value,key,entry);
|
|
506
|
+
mapBoards.set(board.artifactId,value); svg.insertBefore(value,viewportRect);
|
|
507
|
+
}
|
|
508
|
+
place(value,board);
|
|
509
|
+
}
|
|
510
|
+
place(viewportRect,viewport);
|
|
511
|
+
}
|
|
512
|
+
const schedule = () => { if (!scheduled) { scheduled = true; requestAnimationFrame(() => { scheduled = false; draw(); }); } };
|
|
513
|
+
on(root, 'planr:design-render', schedule); on(root, 'planr:design-camera', schedule); on(window, 'resize', schedule);
|
|
514
|
+
let dragging = false;
|
|
515
|
+
const move = event => { if (!geometry) return; const bounds = svg.getBoundingClientRect(); const x = (event.clientX - bounds.left) * 200 / bounds.width, y = (event.clientY - bounds.top) * 128 / bounds.height; const worldX = geometry.minX + (x - geometry.offsetX) / geometry.scale, worldY = geometry.minY + (y - geometry.offsetY) / geometry.scale; studio.setCamera({ x: scroll.clientWidth / 2 - worldX * state().zoom, y: scroll.clientHeight / 2 - worldY * state().zoom }); };
|
|
516
|
+
on(svg, 'pointerdown', event => { event.preventDefault(); dragging = true; svg.setPointerCapture(event.pointerId); move(event); });
|
|
517
|
+
on(svg, 'pointermove', event => { if (dragging) move(event); }); for (const type of ['pointerup', 'pointercancel']) on(svg, type, () => { dragging = false; });
|
|
518
|
+
on(svg, 'keydown', event => { if (!['Enter', ' '].includes(event.key)) return; const selected = payload.entries.find(item => item.artifactId === event.target.dataset.mapArtifact); if (selected) { event.preventDefault(); studio.selectEntry(selected); studio.fitSelection(); } });
|
|
519
|
+
on(root, 'dblclick', event => { const header = event.target.closest('[data-design-drag]'); if (header && state().view === 'canvas') { event.preventDefault(); studio.selectEntry(payload.entries.find(item => item.artifactId === header.dataset.designDrag)); studio.fitSelection(); } });
|
|
520
|
+
let chrome = null, focusBeforePresentation = null;
|
|
521
|
+
const restore = () => {
|
|
522
|
+
if (!chrome) return;
|
|
523
|
+
const snapshot = chrome; chrome = null; root.dataset.designRestoring = 'true'; delete root.dataset.designPresentation;
|
|
524
|
+
studio.restorePresentation(snapshot); presentation.textContent = 'Present fullscreen'; exit.hidden = true;
|
|
525
|
+
requestAnimationFrame(() => requestAnimationFrame(() => { if (disposed) return; studio.restorePresentation(snapshot); delete root.dataset.designRestoring; const hiddenMenu = focusBeforePresentation?.closest('details:not([open])'); const target = hiddenMenu ? q('summary',hiddenMenu) : focusBeforePresentation?.isConnected && focusBeforePresentation.getClientRects().length ? focusBeforePresentation : q('summary',more); target?.focus(); schedule(); }));
|
|
526
|
+
};
|
|
527
|
+
const exit = button('Exit presentation', async () => { if (document.fullscreenElement) await document.exitFullscreen().catch(() => {}); restore(); }, { class: 'design-exit-presentation', hidden: '' }); root.append(exit);
|
|
528
|
+
const settlePresentation = async () => {
|
|
529
|
+
// Fullscreen and panel collapse both change the stage's containing block.
|
|
530
|
+
// Measuring in the click task can observe a zero/intermediate viewport and
|
|
531
|
+
// leave the selected artboard at the minimum zoom, outside the visible area.
|
|
532
|
+
await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));
|
|
533
|
+
if (!chrome || root.dataset.designPresentation !== 'true' || disposed) return;
|
|
534
|
+
if (state().view === 'canvas') studio.fitSelection({ save: false });
|
|
535
|
+
else studio.fit({ save: false });
|
|
536
|
+
schedule();
|
|
537
|
+
};
|
|
538
|
+
async function fullscreen() {
|
|
539
|
+
if (chrome) { await exit.click(); return; }
|
|
540
|
+
chrome = state(); focusBeforePresentation = document.activeElement; root.dataset.designPresentation = 'true'; inspector(false); studio.setPanels({ navOpen: false, reviewOpen: false }, { save: false }); presentation.textContent = 'Exit presentation'; exit.hidden = false;
|
|
541
|
+
if (root.requestFullscreen) { try { await root.requestFullscreen(); } catch { announce('Presentation view is ready. Fullscreen is unavailable in this browser.'); } }
|
|
542
|
+
await settlePresentation();
|
|
543
|
+
}
|
|
544
|
+
on(document, 'fullscreenchange', () => { if (!document.fullscreenElement) restore(); });
|
|
545
|
+
on(document, 'keydown', event => { if (event.key === 'Escape' && chrome && !activeDialog) { event.preventDefault(); restore(); return; } if (event.target.closest('input,textarea,select,[contenteditable="true"]') || activeDialog) return; if (event.shiftKey && ['1', '!'].includes(event.key)) { event.preventDefault(); studio.fit(); } else if (event.shiftKey && ['2', '@'].includes(event.key)) { event.preventDefault(); studio.fitSelection(); } else if (event.key === '?') { event.preventDefault(); shortcuts(); } });
|
|
546
|
+
draw();
|
|
547
|
+
}
|
|
548
|
+
function shortcuts() {
|
|
549
|
+
const { content } = modal('Keyboard shortcuts'); const table = node('dl', '', { class: 'design-shortcuts' });
|
|
550
|
+
for (const [key, description] of [['I', 'Interact with the product'], ['C', 'Annotate the design'], ['H', 'Select the Pan tool'], ['Space + drag', 'Temporarily pan, then return to the selected tool'], ['Middle mouse / trackpad', 'Move around the canvas from anywhere'], ['Ctrl / ⌘ + wheel', 'Zoom around the pointer'], ['Shift + 1', 'Fit all artboards'], ['Shift + 2', 'Fit the selected artboard'], ['Double-click artboard title', 'Focus an artboard'], ['Arrows on artboard title', 'Move artboard · hold Shift for larger steps'], ['← / → in walkthrough', 'Previous / next screen'], ['Escape', 'Leave Pan or Inspect; dismiss notes, dialogs or presentation'], ['?', 'Show these shortcuts']]) table.append(node('dt', key), node('dd', description)); content.append(table);
|
|
551
|
+
}
|
|
552
|
+
let inspectContent, reviewTabs, inspectOverlays = [], inspectedTarget = null;
|
|
553
|
+
function inspector(enabled) {
|
|
554
|
+
if (enabled && payload.staticArtifacts?.includes(entry()?.artifactId)) { announce('This screen is a static reference. Read its authored guidance; component internals are not available.'); enabled = false; }
|
|
555
|
+
studio.setTool(enabled ? 'inspect' : 'interact');
|
|
556
|
+
}
|
|
557
|
+
function applyInspector(enabled) {
|
|
558
|
+
inspectorEnabled = enabled; root.dataset.designInspect = String(enabled);
|
|
559
|
+
if (enabled) studio.setPanels({ reviewOpen: true });
|
|
560
|
+
for (const overlay of inspectOverlays) overlay.hidden = !enabled;
|
|
561
|
+
const picker = q('[data-design-inspect-mode]'); picker?.setAttribute('aria-pressed', String(enabled));
|
|
562
|
+
const selectControl = q('[data-design-inspect-start]'); if (selectControl) { selectControl.textContent = enabled ? 'Stop selecting elements' : 'Select an element'; selectControl.setAttribute('aria-pressed', String(enabled)); }
|
|
563
|
+
}
|
|
564
|
+
function installInspector() {
|
|
565
|
+
if (reviewerAudience()) return;
|
|
566
|
+
const reviewBody = node('section', '', { class: 'design-review-panel', id: 'design-review-panel', role: 'tabpanel', 'aria-labelledby': 'design-review-tab' });
|
|
567
|
+
for (const child of [...rail.children]) if (child.tagName !== 'HEADER' && !child.classList.contains('design-resize-handle')) reviewBody.append(child);
|
|
568
|
+
rail.append(reviewBody);
|
|
569
|
+
reviewTabs = node('div', '', { class: 'design-rail-tabs', role: 'tablist', 'aria-label': 'Sidebar content' });
|
|
570
|
+
const reviewButton = button('Review', () => switchRail('review'), { role: 'tab', 'aria-selected': 'true', 'aria-controls': 'design-review-panel', id: 'design-review-tab' });
|
|
571
|
+
const inspectButton = button('Inspect', () => switchRail('inspect'), { role: 'tab', 'aria-selected': 'false', 'aria-controls': 'design-inspect-panel', id: 'design-inspect-tab', tabindex: '-1' }); reviewTabs.append(reviewButton, inspectButton); rail.querySelector('header').after(reviewTabs);
|
|
572
|
+
inspectContent = node('section', '', { class: 'design-inspector', id: 'design-inspect-panel', role: 'tabpanel', 'aria-labelledby': 'design-inspect-tab', hidden: '' }); rail.append(inspectContent);
|
|
573
|
+
const picker = button('Inspect', () => { switchRail('inspect'); inspector(!inspectorEnabled); }, { 'data-design-inspect-mode': '', 'aria-pressed': 'false', title: 'Inspect a product element without activating it' }); q('.design-interaction-picker').append(picker);
|
|
574
|
+
on(reviewTabs, 'keydown', event => { if (['ArrowLeft', 'ArrowRight'].includes(event.key)) { event.preventDefault(); switchRail(railTab === 'review' ? 'inspect' : 'review'); q('[aria-selected="true"]', reviewTabs).focus(); } });
|
|
575
|
+
const selectTarget = async (value, overlay, point) => {
|
|
576
|
+
const bridge = stage.getFrame(value.artifactId)?.__openPlanrBridge;
|
|
577
|
+
try { const result = point ? await bridge?.inspectAt?.(point.x, point.y) : await bridge?.inspect?.(value); if (!result) throw new Error('Element inspection is unavailable for this screen. Authored implementation guidance is available below.'); renderInspector(result); if (overlay && result.rect) { let highlight = q('.design-inspect-highlight', overlay); if (!highlight) { highlight = node('span', '', { class: 'design-inspect-highlight' }); overlay.append(highlight); } Object.assign(highlight.style, { left: `${result.rect.x}px`, top: `${result.rect.y}px`, width: `${result.rect.width}px`, height: `${result.rect.height}px` }); } }
|
|
578
|
+
catch (error) { announce(error.message, true); }
|
|
579
|
+
};
|
|
580
|
+
for (const value of payload.entries) {
|
|
581
|
+
const panel = stage.getPanel(value.artifactId), frame = stage.getFrame(value.artifactId);
|
|
582
|
+
const overlay = node('div', '', { class: 'design-inspect-overlay', role: 'button', tabindex: '0', 'aria-label': `Inspect elements in ${design.screens.find(item => item.id === value.screenId).title}`, hidden: '' }); q('.planr-frame', panel).append(overlay); inspectOverlays.push(overlay);
|
|
583
|
+
on(overlay, 'pointerdown', event => { event.preventDefault(); event.stopPropagation(); });
|
|
584
|
+
on(overlay, 'click', event => { event.preventDefault(); event.stopPropagation(); const rect = frame.getBoundingClientRect(), viewport = design.frames.find(item => item.id === value.frameId); studio.selectEntry(value); void selectTarget(value, overlay, { x: clamp((event.clientX - rect.left) * viewport.width / rect.width, 0, viewport.width), y: clamp((event.clientY - rect.top) * viewport.height / rect.height, 0, viewport.height) }); });
|
|
585
|
+
on(overlay, 'keydown', event => { if (event.key === 'Escape') { inspector(false); reviewButton.focus(); } else if (event.key === 'Enter') { event.preventDefault(); const first = design.screens.find(item => item.id === value.screenId)?.anchors?.[0]; if (first) void selectTarget({ ...value, planrId: first, screen: value.screenId }); else announce('This screen has no named element anchors. Use pointer inspection or read the screen guidance.'); } });
|
|
586
|
+
}
|
|
587
|
+
on(root, 'planr:design-tool-change', event => applyInspector(event.detail.tool === 'inspect'));
|
|
588
|
+
const selection = () => `${state().screenId}:${state().frameId}:${state().variantId}`;
|
|
589
|
+
let selected = selection(); on(root, 'planr:design-render', () => { if (inspectorEnabled) for (const value of payload.entries) stage.getFrame(value.artifactId).tabIndex = -1; if (selected !== selection()) { selected = selection(); inspectedTarget = null; if (payload.staticArtifacts?.includes(entry()?.artifactId)) inspector(false); if (railTab === 'inspect') renderInspector(); } });
|
|
590
|
+
renderInspector();
|
|
591
|
+
}
|
|
592
|
+
function switchRail(tab) {
|
|
593
|
+
if (!inspectContent) return;
|
|
594
|
+
railTab = tab; root.dataset.designRailTab = tab; inspectContent.hidden = tab !== 'inspect'; q('#design-review-panel').hidden = tab !== 'review'; studio.setPanels({ reviewOpen: true });
|
|
595
|
+
qa('[role="tab"]', reviewTabs).forEach(value => { const selected = value.textContent.toLowerCase() === tab; value.setAttribute('aria-selected', String(selected)); value.tabIndex = selected ? 0 : -1; });
|
|
596
|
+
if (tab === 'review') inspector(false); else renderInspector();
|
|
597
|
+
}
|
|
598
|
+
function renderInspector(computed = inspectedTarget) {
|
|
599
|
+
if (!inspectContent) return;
|
|
600
|
+
inspectedTarget = computed;
|
|
601
|
+
const expanded = new Set(qa('details[open]', inspectContent).map(value => value.querySelector('summary')?.textContent));
|
|
602
|
+
inspectContent.replaceChildren();
|
|
603
|
+
inspectContent.append(node('p', 'Read-only implementation guidance', { class: 'design-eyebrow' }), node('h3', design.screens.find(item => item.id === state().screenId)?.title || 'Screen'));
|
|
604
|
+
const inspectToggle = button(inspectorEnabled ? 'Stop selecting elements' : 'Select an element', () => { inspector(!inspectorEnabled); renderInspector(computed); }, { class: 'design-primary', 'data-design-inspect-start':'', 'aria-pressed': String(inspectorEnabled) }); inspectContent.append(inspectToggle);
|
|
605
|
+
if (payload.staticArtifacts?.includes(entry()?.artifactId)) { inspectToggle.disabled = true; inspectContent.append(node('p', 'Static reference · depicted component internals are unavailable. The guidance below is authored separately.', {class:'design-muted'})); }
|
|
606
|
+
if (computed) {
|
|
607
|
+
const asset = ['IMG','SVG','CANVAS','IMAGE'].includes(String(computed.tagName).toUpperCase());
|
|
608
|
+
const detail = node('details', '', { open: '' }); detail.append(node('summary', `${asset ? 'Asset properties' : 'Computed'} · ${computed.tagName || 'element'}`));
|
|
609
|
+
const values = node('dl', '', { class: 'design-inspect-values' });
|
|
610
|
+
for (const [key, value] of Object.entries(computed.rect || {})) values.append(node('dt', key), node('dd', `${Math.round(value * 100) / 100}px`));
|
|
611
|
+
if (computed.anchor?.planrId) values.append(node('dt', 'Anchor'), node('dd', computed.anchor.planrId));
|
|
612
|
+
for (const [key, value] of Object.entries(computed.styles || {})) values.append(node('dt', key), node('dd', String(value)));
|
|
613
|
+
for (const [key, value] of Object.entries(computed.accessibility || {})) if (value !== null && value !== '') values.append(node('dt', key), node('dd', String(value)));
|
|
614
|
+
detail.append(values, node('p', asset ? 'This is an image or vector asset. Its depicted component internals cannot be inspected. Use authored implementation guidance below.' : 'Computed in this frame. These values describe the current render, not a reusable component contract.', { class: 'design-muted' })); inspectContent.append(detail);
|
|
615
|
+
}
|
|
616
|
+
const implementation = (experience?.reviewContext || payload.reviewContext)?.implementation || {};
|
|
617
|
+
const section = (title, values, renderValue) => { const detail = node('details'); detail.append(node('summary', title)); if (!values?.length) detail.append(node('p', 'Not documented for this design yet.', { class: 'design-muted' })); else values.forEach(value => detail.append(renderValue(value))); inspectContent.append(detail); };
|
|
618
|
+
section('Authored tokens', implementation.tokens, value => { const line = node('div', '', { class: 'design-token' }); line.append(node('strong', value.name), node('code', value.value)); if (value.description) line.append(node('p', value.description)); return line; });
|
|
619
|
+
section('Components & states', implementation.components?.filter(value => !value.screenIds?.length || value.screenIds.includes(state().screenId)), value => { const group = node('div', '', { class: 'design-component-guide' }); group.append(node('h4', value.name)); if (value.notes) group.append(node('p', value.notes)); for (const item of value.states || []) group.append(node('p', `${item.name}: ${item.description || ''}`)); if (value.responsive) group.append(node('p', `Responsive: ${value.responsive}`)); if (value.accessibility) group.append(node('p', `Accessibility: ${value.accessibility}`)); return group; });
|
|
620
|
+
section('Responsive rules', implementation.responsive, text => node('p', text)); section('Accessibility requirements', implementation.accessibility, text => node('p', text));
|
|
621
|
+
const screen = design.screens.find(value => value.id === state().screenId); if (screen.description) { const detail = node('details'); detail.append(node('summary', 'Screen notes'), node('p', screen.description)); inspectContent.append(detail); }
|
|
622
|
+
for (const detail of qa('details', inspectContent)) if (expanded.has(detail.querySelector('summary')?.textContent)) detail.open = true;
|
|
623
|
+
}
|
|
624
|
+
async function history() {
|
|
625
|
+
const { content, status, dialog } = modal('Revision history', 'design-history'); status.textContent = 'Loading published revisions…';
|
|
626
|
+
try {
|
|
627
|
+
const value = await request('listRevisions', 'revisionsUrl'); const revisions = Array.isArray(value) ? value : value.revisions || [];
|
|
628
|
+
status.textContent = ''; if (!revisions.length) { content.append(node('p', 'This design has no earlier published revisions yet.')); return; }
|
|
629
|
+
content.append(node('p', 'Compare published content. Comments stay attached to the revision where they were made.', { class: 'design-muted' }));
|
|
630
|
+
if (revisions.length > 1) content.append(button('Compare latest revisions', () => compareRevisions(), {class:'design-primary'}));
|
|
631
|
+
for (const [index, item] of revisions.entries()) { const id = item.revision || item.id; const card = node('article', '', { class: 'design-revision-item' }); card.append(node('strong', `${index === 0 ? 'Latest · ' : ''}${item.createdAt ? new Date(item.createdAt).toLocaleString() : id.slice(0, 12)}`)); if (item.summary) card.append(node('p', item.summary)); card.append(node('code', id.slice(0, 12)));
|
|
632
|
+
const previous = revisions[index + 1];
|
|
633
|
+
if (item.fingerprints?.length && previous?.fingerprints?.length) {
|
|
634
|
+
const diffs = screenDifferences(previous.fingerprints, item.fingerprints); const changed = Object.values(diffs).filter(value => value !== 'Unchanged');
|
|
635
|
+
card.append(node('span', changed.length ? `${changed.length} screens changed · ${[...new Set(changed)].join(', ')}` : 'Design unchanged · runtime or publication only', {class:'design-revision-badge'}));
|
|
636
|
+
} else if (previous) card.append(node('span', 'Rendered-output comparison available', {class:'design-revision-badge'}));
|
|
637
|
+
if (revisions.length > 1) card.append(button('Compare with current', () => compareRevisions(id, value.currentRevision || revisions[0].revision || revisions[0].id), { disabled: id === (value.currentRevision || revisions[0].revision || revisions[0].id) ? '' : undefined }));
|
|
638
|
+
content.append(card);
|
|
639
|
+
}
|
|
640
|
+
if (!dialog.isConnected) return;
|
|
641
|
+
} catch (error) { status.textContent = error.message; content.append(button('Retry', history)); }
|
|
642
|
+
}
|
|
643
|
+
async function loadRevision(id) { return options().loadRevision ? options().loadRevision(id) : request('loadRevision', 'revisionsUrl', { revision: id }); }
|
|
644
|
+
function screenDifferences(before, after) {
|
|
645
|
+
const ids = [...new Set([...before, ...after].map(item => item.screenId))];
|
|
646
|
+
const signature = (items, field) => JSON.stringify(items.map(item => [`${item.variantId}:${item.frameId}`, item[field]]).sort((a,b)=>a[0].localeCompare(b[0])));
|
|
647
|
+
return Object.fromEntries(ids.map(id => {
|
|
648
|
+
const a = before.filter(item=>item.screenId===id), b = after.filter(item=>item.screenId===id);
|
|
649
|
+
return [id, !a.length ? 'Added' : !b.length ? 'Removed' : signature(a,'contentDigest') !== signature(b,'contentDigest') ? 'Changed' : signature(a,'guidanceDigest') !== signature(b,'guidanceDigest') ? 'Notes' : 'Unchanged'];
|
|
650
|
+
}));
|
|
651
|
+
}
|
|
652
|
+
let badgeRevision = null;
|
|
653
|
+
async function updateScreenBadges() {
|
|
654
|
+
if (badgeRevision === revision() || !(options().revisionsUrl || options().listRevisions)) return;
|
|
655
|
+
badgeRevision = revision();
|
|
656
|
+
try {
|
|
657
|
+
const value = options().listRevisions ? await options().listRevisions({brief:true}) : await request('listRevisions','revisionsUrl'); const revisions = Array.isArray(value) ? value : value.revisions || [];
|
|
658
|
+
const index = Math.max(0,revisions.findIndex(item => (item.revision || item.id) === revision())); const previous = revisions[index+1];
|
|
659
|
+
if (!previous) return;
|
|
660
|
+
const old = previous.fingerprints?.length ? previous : await loadRevision(previous.revision || previous.id);
|
|
661
|
+
const current = experience?.fingerprints || payload.fingerprints;
|
|
662
|
+
if (!old.fingerprints?.length || !current?.length || disposed) return;
|
|
663
|
+
const differences = screenDifferences(old.fingerprints,current);
|
|
664
|
+
for (const screen of qa('[data-design-screen]')) { q('.design-screen-change',screen)?.remove(); const change = differences[screen.dataset.designScreen]; if (change && change !== 'Unchanged') screen.append(node('span',change,{class:'design-screen-change'})); }
|
|
665
|
+
} catch { /* History retains an explicit retry state without blocking the current design. */ badgeRevision = null; }
|
|
666
|
+
}
|
|
667
|
+
async function compareRevisions(beforeId, afterId) {
|
|
668
|
+
const { content, status, dialog } = modal('Compare revisions', 'design-comparison'); status.textContent = 'Loading both revisions…';
|
|
669
|
+
const observers = []; let pairSerial = 0, renderSerial = 0;
|
|
670
|
+
dialog.addEventListener('close', () => observers.splice(0).forEach(value => value.disconnect()));
|
|
671
|
+
try {
|
|
672
|
+
const history = await request('listRevisions', 'revisionsUrl');
|
|
673
|
+
const revisions = Array.isArray(history) ? history : history.revisions || [];
|
|
674
|
+
if (!revisions.length) { status.textContent = 'No published revisions are available for comparison.'; return; }
|
|
675
|
+
afterId ||= history.currentRevision || revisions[0].revision || revisions[0].id;
|
|
676
|
+
beforeId ||= revisions.find(item => (item.revision || item.id) !== afterId)?.revision || revisions.find(item => (item.revision || item.id) !== afterId)?.id || afterId;
|
|
677
|
+
const revisionChoices = revisions.map(item => [item.revision || item.id, `${item.createdAt ? new Date(item.createdAt).toLocaleString() : 'Revision'} · ${(item.revision || item.id).slice(0,8)}`]);
|
|
678
|
+
const beforeSelect = select('Before revision', revisionChoices, beforeId), afterSelect = select('After revision', revisionChoices, afterId);
|
|
679
|
+
const revisionsRow = node('div', '', { class: 'design-comparison-controls' });
|
|
680
|
+
for (const [title, field] of [['Before', beforeSelect], ['After', afterSelect]]) { const label = node('label', title); label.append(field); revisionsRow.append(label); } content.append(revisionsRow);
|
|
681
|
+
const screenSelect = select('Comparison screen', [], ''), frameSelect = select('Comparison frame', [], ''), variantSelect = select('Comparison direction', [], '');
|
|
682
|
+
const controls = node('div', '', { class: 'design-comparison-controls' }); controls.append(screenSelect, frameSelect, variantSelect); content.append(controls);
|
|
683
|
+
const summary = node('p', '', { class: 'design-comparison-summary' }), boards = node('div', '', { class: 'design-comparison-boards' }); content.append(summary, boards);
|
|
684
|
+
let before, after;
|
|
685
|
+
const choices = (field, values, fallback) => { const current = field.value || fallback; field.replaceChildren(...values.map(([id, text]) => node('option', text, { value: id }))); field.value = values.some(([id]) => id === current) ? current : values[0]?.[0] || ''; };
|
|
686
|
+
const title = id => after.design.screens.find(item => item.id === id)?.title || before.design.screens.find(item => item.id === id)?.title || id;
|
|
687
|
+
const render = async () => {
|
|
688
|
+
const attempt = ++renderSerial; observers.splice(0).forEach(value => value.disconnect()); boards.replaceChildren(); status.textContent = 'Preparing isolated previews…';
|
|
689
|
+
const selectedScreen = screenSelect.value, selectedFrame = frameSelect.value, selectedVariant = variantSelect.value;
|
|
690
|
+
const matches = item => item.screenId === selectedScreen && item.frameId === selectedFrame && item.variantId === selectedVariant;
|
|
691
|
+
const a = before.fingerprints?.find(matches), b = after.fingerprints?.find(matches);
|
|
692
|
+
const beforeEntry = before.entries.find(matches), afterEntry = after.entries.find(matches);
|
|
693
|
+
summary.textContent = !beforeEntry ? 'Added screen, frame or direction' : !afterEntry ? 'Removed screen, frame or direction' : !a || !b ? 'Rendered-output comparison · authored source fingerprints are unavailable for this revision' : a.contentDigest !== b.contentDigest ? 'Product design changed' : a.guidanceDigest !== b.guidanceDigest ? 'Guidance changed · product design unchanged' : 'Product design and guidance unchanged · publication or studio runtime only';
|
|
694
|
+
const windows = [];
|
|
695
|
+
for (const [name, bundle, id, selectedEntry] of [['Before', before, beforeSelect.value, beforeEntry], ['After', after, afterSelect.value, afterEntry]]) {
|
|
696
|
+
const card = node('section', '', { class: 'design-comparison-card', 'aria-label': `${name} revision` }); card.append(node('h3', `${name} · ${id.slice(0,8)}`)); boards.append(card);
|
|
697
|
+
if (!selectedEntry) { card.append(node('p', 'This screen, direction or frame does not exist in this revision.', { class: 'design-comparison-missing' })); continue; }
|
|
698
|
+
const artifact = bundle.envelope.artifacts.find(item => item.id === selectedEntry.artifactId);
|
|
699
|
+
let source = bundle.comparisonSources?.[artifact.id];
|
|
700
|
+
if (!source && typeof options().prepareComparisonSource === 'function') source = await options().prepareComparisonSource({ artifact, revision: id });
|
|
701
|
+
if (attempt !== renderSerial || !dialog.isConnected) return;
|
|
702
|
+
if (typeof source !== 'string') { card.append(node('p', 'Isolated comparison is unavailable in this host. The current design remains usable.', { class: 'design-comparison-missing' })); continue; }
|
|
703
|
+
const viewport = artifact.viewport || bundle.design.frames.find(item => item.id === selectedFrame);
|
|
704
|
+
const windowNode = node('div', '', { class: 'design-comparison-window', tabindex: '0', 'aria-label': `Scroll ${name.toLowerCase()} preview` });
|
|
705
|
+
const scaled = node('div', '', { class: 'design-comparison-scaled' });
|
|
706
|
+
const iframe = node('iframe', '', { sandbox: 'allow-scripts allow-forms', referrerpolicy: 'no-referrer', title: `${name}: ${title(selectedScreen)}`, tabindex: '-1' });
|
|
707
|
+
iframe.srcdoc = source; iframe.style.width = `${viewport.width}px`; iframe.style.height = `${viewport.height}px`; scaled.append(iframe); windowNode.append(scaled); card.append(windowNode); windows.push(windowNode);
|
|
708
|
+
const comments = (bundle.review?.pins || bundle.envelope.review?.pins || []).filter(pin => pin.artifactId === artifact.id);
|
|
709
|
+
const commentList = node('details'); commentList.append(node('summary', `${comments.length} comments on this revision`));
|
|
710
|
+
for (const [index,pin] of comments.entries()) {
|
|
711
|
+
const quote = node('p', `${pin.author?.name || 'Reviewer'}: ${pin.comment}`); quote.id = `compare-${name}-${index}`; commentList.append(quote);
|
|
712
|
+
const marker = button(String(index + 1), () => { commentList.open = true; quote.scrollIntoView({block:'nearest'}); }, {class:'design-comparison-pin', 'aria-label': `Read ${name.toLowerCase()} comment ${index+1}`});
|
|
713
|
+
marker.style.left = `${pin.region.x*100}%`; marker.style.top = `${pin.region.y*100}%`; scaled.append(marker);
|
|
714
|
+
}
|
|
715
|
+
if (comments.length) card.append(commentList);
|
|
716
|
+
const fit = () => { const ratio = Math.min(1, windowNode.clientWidth / viewport.width); iframe.style.transform = `scale(${ratio})`; scaled.style.height = `${viewport.height * ratio}px`; };
|
|
717
|
+
requestAnimationFrame(fit); if (typeof ResizeObserver === 'function') { const observer = new ResizeObserver(fit); observer.observe(windowNode); observers.push(observer); }
|
|
718
|
+
const notes = bundle.design.screens.find(item=>item.id===selectedScreen)?.description; if (notes) { const detail=node('details');detail.append(node('summary','Notes on this revision'),node('p',notes));card.append(detail); }
|
|
719
|
+
}
|
|
720
|
+
let scrolling = false;
|
|
721
|
+
for (const windowNode of windows) windowNode.addEventListener('scroll', () => { if (scrolling) return; scrolling = true; for (const other of windows) if (other !== windowNode) other.scrollTop = (windowNode.scrollTop / Math.max(1,windowNode.scrollHeight - windowNode.clientHeight)) * Math.max(0,other.scrollHeight - other.clientHeight); requestAnimationFrame(()=>{scrolling=false;}); });
|
|
722
|
+
status.textContent = 'Read-only comparison · scrolling is synchronized. Return to the design to interact or comment.';
|
|
723
|
+
};
|
|
724
|
+
const loadPair = async () => {
|
|
725
|
+
const attempt=++pairSerial; status.textContent='Loading revisions…';
|
|
726
|
+
try {
|
|
727
|
+
const pair=await Promise.all([loadRevision(beforeSelect.value),loadRevision(afterSelect.value)]); if (attempt!==pairSerial || !dialog.isConnected)return;[before,after]=pair;
|
|
728
|
+
const ids=[...new Set([...after.design.screenOrder,...before.design.screenOrder])];choices(screenSelect,ids.map(id=>[id,title(id)]),state().screenId);
|
|
729
|
+
const frames=[...new Map([...after.design.frames,...before.design.frames].map(item=>[item.id,item])).values()];choices(frameSelect,frames.map(item=>[item.id,item.label]),state().frameId);
|
|
730
|
+
const variants=[...new Map([...after.design.variants,...before.design.variants].filter(item=>item.status==='ready').map(item=>[item.id,item])).values()];choices(variantSelect,variants.map(item=>[item.id,item.label]),state().variantId);
|
|
731
|
+
await render();
|
|
732
|
+
} catch(error){status.textContent=error.message;}
|
|
733
|
+
};
|
|
734
|
+
for (const field of [beforeSelect,afterSelect]) field.addEventListener('change',()=>void loadPair());
|
|
735
|
+
for (const field of [screenSelect,frameSelect,variantSelect]) field.addEventListener('change',()=>void render().catch(error=>{status.textContent=error.message;}));
|
|
736
|
+
await loadPair();
|
|
737
|
+
} catch (error) { status.textContent = error.message; content.append(button('Retry comparison', () => compareRevisions(beforeId, afterId))); }
|
|
738
|
+
}
|
|
739
|
+
async function handoff() {
|
|
740
|
+
const { content, status } = modal('Review handoff', 'design-handoff'); status.textContent = 'Loading review decisions…'; let response;
|
|
741
|
+
const render = () => {
|
|
742
|
+
content.replaceChildren(); const draft = response.draft;
|
|
743
|
+
content.append(node('p', 'Turn accepted feedback into a proposed implementation brief. Approval records your decision; Plan remains a separate invocation.', { class: 'design-muted' }));
|
|
744
|
+
if (!draft) { content.append(button('Generate proposed handoff', () => act({ action: 'draft', version: 0 }), { class: 'design-primary' })); return; }
|
|
745
|
+
content.append(node('p', response.current ? (draft.status === 'approved' ? 'Approved for this design and feedback snapshot.' : 'Ready for your review.') : 'Outdated: the design or feedback changed. Regenerate before approval.', { class: 'design-handoff-state' }));
|
|
746
|
+
const title = node('label', 'Summary'); const summary = node('textarea', '', { 'aria-label': 'Handoff summary', maxlength: '16384' }); summary.value = draft.content.summary || ''; title.append(summary); content.append(title);
|
|
747
|
+
const fields = {};
|
|
748
|
+
for (const [key, title] of [['agreedChanges', 'Accepted changes'], ['openQuestions', 'Unresolved questions & blockers'], ['deferred', 'Deferred'], ['rejected', 'Declined']]) {
|
|
749
|
+
const group = node('section'); group.append(node('h3', title)); fields[key] = [];
|
|
750
|
+
if (!(draft.content[key] || []).length) group.append(node('p', 'None recorded.', { class: 'design-muted' }));
|
|
751
|
+
for (const item of draft.content[key] || []) { const field = node('textarea', '', { 'aria-label': `${title}: ${item.pinId || 'note'}`, maxlength: '8192' }); field.value = item.refinement || ''; fields[key].push({ field, item }); group.append(node('blockquote', item.text, { class: 'design-review-quote' }), node('label', 'Implementation refinement'), field); if (item.pinId) group.append(button(`View comment ${item.pinId.slice(0, 8)}`, () => { activeDialog?.dismiss(); const currentReview = stage.review.getState().review; if ((item.revisionId && item.revisionId !== revision()) || (item.reviewOf && item.reviewOf !== currentReview?.reviewOf) || (item.reviewId && item.reviewId !== currentReview?.reviewId)) { void history(); announce('This source comment belongs to another review snapshot. Inspect its original revision; it has not been relocated.'); return; } const pin = currentReview?.pins.find(value => value.id === item.pinId); if (pin) { const value = payload.entries.find(value => value.artifactId === pin.artifactId); if (value) studio.selectEntry(value); stage.review.selectPin?.(pin.id); studio.setPanels({ reviewOpen: true }); } else announce('This comment belongs to an earlier revision. Open revision history to inspect it.'); }, { class: 'design-text-button' })); }
|
|
752
|
+
content.append(group);
|
|
753
|
+
}
|
|
754
|
+
let edited = false;
|
|
755
|
+
const actions = node('div', '', { class: 'design-dialog-actions' });
|
|
756
|
+
const save = button('Save draft', () => act({ action: 'update', version: draft.version, content: { ...draft.content, summary: summary.value, ...Object.fromEntries(Object.entries(fields).map(([key, items]) => [key, items.map(({ field, item }) => ({ ...item, refinement: field.value }))])) } }));
|
|
757
|
+
const approve = button('Approve handoff', () => act({ action: 'approve', version: draft.version, contentHash: draft.contentHash }), { class: 'design-primary' }); approve.disabled = !response.current || draft.status === 'approved';
|
|
758
|
+
for (const input of qa('textarea', content)) input.addEventListener('input', () => { edited = true; approve.disabled = true; status.textContent = 'Save your edits before approving.'; });
|
|
759
|
+
const regenerate = button('Regenerate from reviews', () => { if (!edited || window.confirm('Replace your unsaved handoff edits with current review decisions?')) void act({ action: 'draft', version: draft.version }); }); actions.append(save, approve, regenerate); content.append(actions);
|
|
760
|
+
if (draft.markdown) content.append(button('Copy handoff', async () => { try { await navigator.clipboard.writeText(draft.markdown); status.textContent = 'Handoff copied.'; } catch { const output = node('textarea', '', { 'aria-label': 'Copy handoff Markdown', readonly: '' }); output.value = draft.markdown; content.append(output); output.focus(); output.select(); } }));
|
|
761
|
+
};
|
|
762
|
+
const act = async input => {
|
|
763
|
+
const previousDisabled = new Map(qa('button', content).map(value => [value,value.disabled]));
|
|
764
|
+
qa('button', content).forEach(value => { value.disabled = true; }); status.textContent = 'Saving…';
|
|
765
|
+
try { response = await request('updateHandoff', 'handoffUrl', { ...input, revision: revision() }); if (response.metadata) metadata = response.metadata; render(); status.textContent = input.action === 'approve' ? 'Handoff approved. Invoke Plan separately when you are ready.' : 'Draft saved.'; updateFilters(); }
|
|
766
|
+
catch (error) { status.textContent = error.message; for (const [value,disabled] of previousDisabled) if (value.isConnected) value.disabled = disabled; }
|
|
767
|
+
};
|
|
768
|
+
try { response = await request('loadHandoff', 'handoffUrl'); if (response.metadata) metadata = response.metadata; render(); status.textContent = ''; }
|
|
769
|
+
catch (error) { status.textContent = error.message; content.append(button('Retry', handoff)); }
|
|
770
|
+
}
|
|
771
|
+
async function refreshExperience() {
|
|
772
|
+
const previousContext = JSON.stringify(experience?.reviewContext || payload.reviewContext);
|
|
773
|
+
try { experience = await request('loadExperience', 'experienceUrl'); metadata = experience.metadata || metadata; }
|
|
774
|
+
catch { experience = { reviewContext: payload.reviewContext, capabilities: { owner: Boolean(options().handoffUrl), revisions: Boolean(options().revisionsUrl || options().listRevisions), handoff: Boolean(options().handoffUrl || options().updateHandoff) } }; }
|
|
775
|
+
if (disposed) return;
|
|
776
|
+
updateFilters(); if (previousContext !== JSON.stringify(experience?.reviewContext || payload.reviewContext)) renderInspector();
|
|
777
|
+
let actionBar = q('.design-experience-actions'); if (!actionBar) { actionBar = node('div', '', { class: 'design-experience-actions' }); q('.design-nav-footer').before(actionBar); }
|
|
778
|
+
const signature = `${owner()}:${Boolean(experience.capabilities?.revisions || options().listRevisions || options().revisionsUrl)}:${Boolean(options().handoffUrl || options().updateHandoff)}`;
|
|
779
|
+
if (actionBar.dataset.signature !== signature) {
|
|
780
|
+
actionBar.dataset.signature = signature; actionBar.replaceChildren(button('About this review', () => about()));
|
|
781
|
+
if (experience.capabilities?.revisions || options().listRevisions || options().revisionsUrl) actionBar.append(button('Revision history', history));
|
|
782
|
+
if (owner() && (options().handoffUrl || options().updateHandoff)) actionBar.append(button('Prepare handoff', handoff));
|
|
783
|
+
}
|
|
784
|
+
void updateScreenBadges();
|
|
785
|
+
}
|
|
786
|
+
function mount() {
|
|
787
|
+
studio = window.__openPlanrDesignStudio; stage = window.__openPlanrArtifactStage; root = q('.planr-shell'); rail = q('.planr-review-rail');
|
|
788
|
+
root.dataset.designAudience=reviewerAudience() ? 'reviewer' : 'owner';
|
|
789
|
+
if (reviewerAudience()) for (const value of qa('.design-direction-review,[data-design-verification],.planr-decision-slot')) value.hidden=true;
|
|
790
|
+
installMobileViewport(); installProfileAndTheme(); installReadability(); installReview(); installComposerCategory(); installInspector(); installCanvas(); installThumbnails(); installPersonalDrafts();
|
|
791
|
+
// The published payload already contains the authorized introduction. Show
|
|
792
|
+
// it before any asynchronous metadata refresh can expose the board first.
|
|
793
|
+
about(true);
|
|
794
|
+
options().onExperienceReady?.();
|
|
795
|
+
void refreshExperience();
|
|
796
|
+
on(document, 'planr:design-experience-change', event => { if (event.detail?.metadata) { metadata = event.detail.metadata; updateFilters(); } if (event.detail?.reviewContext) { experience = { ...experience, reviewContext: event.detail.reviewContext }; renderInspector(); } });
|
|
797
|
+
on(document, 'openplanr:design-experience-changed', () => { void refreshExperience(); });
|
|
798
|
+
const dispose = () => { disposed = true; activeDialog?.dismiss(); for (const remove of destroyers.splice(0)) remove(); clearTimeout(toastTimer); };
|
|
799
|
+
on(window, 'pagehide', dispose); on(root, 'planr:design-destroy', dispose);
|
|
800
|
+
window.__openPlanrDesignExperience = Object.freeze({ about, profile:editProfile, setTheme, history, compare: compareRevisions, handoff, refresh: refreshExperience, getState: () => ({ railTab, inspectorEnabled, profile:{...profile}, theme:themePreference, metadata: structuredClone(metadata) }) });
|
|
801
|
+
}
|
|
802
|
+
const started = Date.now();
|
|
803
|
+
function boot() { if (document.getElementById('planr-design-studio-payload') !== payloadNode) return; if (window.__openPlanrDesignStudio && window.__openPlanrArtifactStage) mount(); else if (Date.now() - started < 15000) setTimeout(boot, 30); }
|
|
804
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true }); else boot();
|
|
805
|
+
})();
|