openplanr 1.25.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -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 +1216 -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
|
@@ -2,39 +2,39 @@
|
|
|
2
2
|
* spec-service — directory-aware CRUD for spec-driven planning mode.
|
|
3
3
|
*
|
|
4
4
|
* Unlike agile/QT artifacts which are flat single files, each spec is a
|
|
5
|
-
* **self-contained directory
|
|
5
|
+
* **self-contained directory**:
|
|
6
6
|
*
|
|
7
7
|
* .planr/specs/SPEC-NNN-{slug}/
|
|
8
8
|
* ├── SPEC-NNN-{slug}.md ← the spec document
|
|
9
9
|
* ├── design/ ← UI mockups + design-spec.md (if any)
|
|
10
10
|
* │ ├── *.png
|
|
11
|
-
* │ └── design-spec.md ← reserved path (written by
|
|
11
|
+
* │ └── design-spec.md ← reserved path (written by the host-native designer role)
|
|
12
12
|
* ├── stories/
|
|
13
|
-
* │ └── US-NNN-{slug}.md ←
|
|
13
|
+
* │ └── US-NNN-{slug}.md ← project-global story ID
|
|
14
14
|
* └── tasks/
|
|
15
|
-
* └── T-NNN-{slug}.md ←
|
|
15
|
+
* └── T-NNN-{slug}.md ← project-global task ID
|
|
16
16
|
*
|
|
17
17
|
* Why directory-per-spec:
|
|
18
18
|
* - Self-contained / portable / `rm -rf` clean
|
|
19
19
|
* - `PREFIX-NNN-slug` naming consistent with every other planr artifact
|
|
20
|
-
* - US-NNN and T-NNN are
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* - Schema matches planr-pipeline plugin verbatim — both products
|
|
24
|
-
* share one contract. See https://github.com/openplanr/planr-pipeline
|
|
20
|
+
* - SPEC-NNN, US-NNN, and T-NNN IDs are project-global and monotonic. The
|
|
21
|
+
* sequence never reuses gaps; `specId` and `storyId` retain the hierarchy.
|
|
22
|
+
* - Schemas are owned by the OpenPlanr Protocol package and shared by all hosts.
|
|
25
23
|
*
|
|
26
24
|
* This service owns dedicated planning inside the planr CLI. The pipeline
|
|
27
25
|
* independently provides feature-local PO planning as part of its complete
|
|
28
26
|
* PO → Design → Review → DEV → QA flow. Both producers share the artifact
|
|
29
27
|
* contract and record provenance so their intentional overlap stays clear.
|
|
30
28
|
*/
|
|
29
|
+
import { randomUUID } from 'node:crypto';
|
|
30
|
+
import fsPromises from 'node:fs/promises';
|
|
31
31
|
import path from 'node:path';
|
|
32
32
|
import { ensureDir, fileExists, listFiles, readFile, writeFile } from '../utils/fs.js';
|
|
33
33
|
import { logger } from '../utils/logger.js';
|
|
34
|
-
import { parseMarkdown } from '../utils/markdown.js';
|
|
34
|
+
import { parseMarkdown, toMarkdownWithFrontmatter } from '../utils/markdown.js';
|
|
35
35
|
import { slugify } from '../utils/slugify.js';
|
|
36
36
|
import { atomicWriteFile } from './atomic-write-service.js';
|
|
37
|
-
import {
|
|
37
|
+
import { previewPlanningIds, reservePlanningIds } from './planning-id-service.js';
|
|
38
38
|
import { appendOpenPlanrProvenance, readOpenPlanrVersion } from './provenance-service.js';
|
|
39
39
|
import { renderTemplate } from './template-service.js';
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
@@ -101,7 +101,7 @@ export async function listSpecs(projectDir, config) {
|
|
|
101
101
|
return [];
|
|
102
102
|
const fs = await import('node:fs/promises');
|
|
103
103
|
const entries = await fs.readdir(specsRoot, { withFileTypes: true });
|
|
104
|
-
const dirRegex = /^([A-Z]+-\d{3})-(.+)$/;
|
|
104
|
+
const dirRegex = /^([A-Z]+-\d{3,})-(.+)$/;
|
|
105
105
|
const results = [];
|
|
106
106
|
for (const entry of entries) {
|
|
107
107
|
if (!entry.isDirectory())
|
|
@@ -157,7 +157,7 @@ export async function createSpec(projectDir, config, title, options = {}) {
|
|
|
157
157
|
const specsRoot = getSpecsRootDir(projectDir, config);
|
|
158
158
|
await ensureDir(specsRoot);
|
|
159
159
|
// Cross-spec slug-collision check. Two specs with the same slug would be
|
|
160
|
-
// ambiguous in
|
|
160
|
+
// ambiguous in host-native planning handoffs (`planr-plan {slug}` —
|
|
161
161
|
// which spec?), and they'd be hard to distinguish in `planr spec list`.
|
|
162
162
|
// Refuse early with a clear suggestion.
|
|
163
163
|
{
|
|
@@ -169,16 +169,13 @@ export async function createSpec(projectDir, config, title, options = {}) {
|
|
|
169
169
|
catch {
|
|
170
170
|
// specs/ may not exist yet — fine
|
|
171
171
|
}
|
|
172
|
-
const slugRe = new RegExp(`^[A-Z]+-\\d{3}-${slug.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`);
|
|
172
|
+
const slugRe = new RegExp(`^[A-Z]+-\\d{3,}-${slug.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}$`);
|
|
173
173
|
const collision = entries.find((e) => e.isDirectory() && slugRe.test(e.name));
|
|
174
174
|
if (collision) {
|
|
175
175
|
throw new Error(`A spec with slug "${slug}" already exists at ${collision.name}. Use a different --slug or delete the existing spec with \`planr spec destroy ${collision.name.split('-').slice(0, 2).join('-')}\`.`);
|
|
176
176
|
}
|
|
177
177
|
}
|
|
178
|
-
const
|
|
179
|
-
// Custom-scan: getNextId() looks for files; here we look at *directories*.
|
|
180
|
-
// We compose a synthetic "files-only" view by listing entries with the prefix.
|
|
181
|
-
const id = await nextSpecId(specsRoot, prefix);
|
|
178
|
+
const id = (await reservePlanningIds(projectDir, config, { SPEC: 1 })).SPEC[0];
|
|
182
179
|
const dirName = `${id}-${slug}`;
|
|
183
180
|
const specDir = path.join(specsRoot, dirName);
|
|
184
181
|
if (await fileExists(specDir)) {
|
|
@@ -195,7 +192,7 @@ export async function createSpec(projectDir, config, title, options = {}) {
|
|
|
195
192
|
slug,
|
|
196
193
|
title,
|
|
197
194
|
status: 'pending',
|
|
198
|
-
schemaVersion: '1.
|
|
195
|
+
schemaVersion: '1.7.0',
|
|
199
196
|
priority: options.priority || 'P1',
|
|
200
197
|
milestone: options.milestone || '',
|
|
201
198
|
po: options.po || '',
|
|
@@ -204,16 +201,16 @@ export async function createSpec(projectDir, config, title, options = {}) {
|
|
|
204
201
|
}, config.templateOverrides);
|
|
205
202
|
await writeFile(specFile, content);
|
|
206
203
|
// Drop a .gitkeep into design/ so the empty subdir survives commits
|
|
207
|
-
// (stories/ and tasks/
|
|
204
|
+
// (stories/ and tasks/ are populated by the host-native planning skill).
|
|
208
205
|
await writeFile(path.join(getSpecDesignDir(specDir), '.gitkeep'), '');
|
|
209
206
|
logger.debug(`Created spec ${id}: ${specDir}`);
|
|
210
207
|
return { id, slug, specDir, specFile };
|
|
211
208
|
}
|
|
212
209
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
210
|
+
* Preview the next project-global SPEC ID from sibling directories.
|
|
211
|
+
* Reservation uses planning-id-service so deleted IDs are never reused.
|
|
215
212
|
*/
|
|
216
|
-
async function nextSpecId(specsRoot, prefix) {
|
|
213
|
+
export async function nextSpecId(specsRoot, prefix) {
|
|
217
214
|
const fs = await import('node:fs/promises');
|
|
218
215
|
let entries = [];
|
|
219
216
|
try {
|
|
@@ -222,20 +219,174 @@ async function nextSpecId(specsRoot, prefix) {
|
|
|
222
219
|
catch {
|
|
223
220
|
return `${prefix}-001`;
|
|
224
221
|
}
|
|
225
|
-
const re = new RegExp(`^${prefix}-(\\d{3})-`);
|
|
226
|
-
|
|
222
|
+
const re = new RegExp(`^${prefix}-(\\d{3,})-`);
|
|
223
|
+
let maximum = 0;
|
|
227
224
|
for (const e of entries) {
|
|
228
225
|
if (!e.isDirectory())
|
|
229
226
|
continue;
|
|
230
227
|
const m = e.name.match(re);
|
|
231
228
|
if (m)
|
|
232
|
-
|
|
229
|
+
maximum = Math.max(maximum, Number.parseInt(m[1], 10));
|
|
233
230
|
}
|
|
234
|
-
|
|
235
|
-
while (taken.has(n))
|
|
236
|
-
n++;
|
|
231
|
+
const n = maximum + 1;
|
|
237
232
|
return `${prefix}-${String(n).padStart(3, '0')}`;
|
|
238
233
|
}
|
|
234
|
+
function markdownInline(value) {
|
|
235
|
+
return String(value)
|
|
236
|
+
.replace(/\s+/gu, ' ')
|
|
237
|
+
.trim()
|
|
238
|
+
.replace(/[\\`*_[\]()!|<>]/gu, '\\$&');
|
|
239
|
+
}
|
|
240
|
+
function markdownCode(value) {
|
|
241
|
+
const text = String(value).replace(/\s+/gu, ' ').trim();
|
|
242
|
+
const longestRun = Math.max(0, ...[...text.matchAll(/`+/gu)].map((match) => match[0].length));
|
|
243
|
+
const fence = '`'.repeat(longestRun + 1);
|
|
244
|
+
const padding = text.startsWith('`') || text.endsWith('`') ? ' ' : '';
|
|
245
|
+
return `${fence}${padding}${text}${padding}${fence}`;
|
|
246
|
+
}
|
|
247
|
+
function operatingOriginSection(input) {
|
|
248
|
+
const origin = input.operatingOrigin;
|
|
249
|
+
const line = (label, value) => `- **${label}:** ${markdownInline(value)}`;
|
|
250
|
+
const identity = (label, value) => `- **${label}:** ${markdownCode(value)}`;
|
|
251
|
+
const nested = (label, values) => values.length > 0
|
|
252
|
+
? ` - ${label}: ${values.map(markdownInline).join('; ')}`
|
|
253
|
+
: ` - ${label}: none recorded`;
|
|
254
|
+
const perspectives = origin.perspectives
|
|
255
|
+
.map((perspective) => [
|
|
256
|
+
`- **${markdownInline(perspective.roleKind)} · ${markdownCode(perspective.roleId)}** (${markdownInline(perspective.stance)}): ${markdownInline(perspective.summary)}`,
|
|
257
|
+
nested('Constraints', perspective.constraints),
|
|
258
|
+
nested('Uncertainties', perspective.uncertainties),
|
|
259
|
+
].join('\n'))
|
|
260
|
+
.join('\n');
|
|
261
|
+
const evidence = origin.evidence.length === 0
|
|
262
|
+
? '- No access-safe evidence reference was available.'
|
|
263
|
+
: origin.evidence
|
|
264
|
+
.map((entry) => [
|
|
265
|
+
`- ${markdownCode(entry.evidenceRefId)} · ${markdownInline(entry.relation)} · ${markdownInline(entry.freshness)} · confidence ${entry.confidence}`,
|
|
266
|
+
` - Summary: ${entry.summary === null ? 'restricted; summary unavailable' : markdownInline(entry.summary)}`,
|
|
267
|
+
nested('Limitations', entry.limitations),
|
|
268
|
+
].join('\n'))
|
|
269
|
+
.join('\n');
|
|
270
|
+
const omitted = origin.omissions.map((entry) => `${entry.count} ${markdownInline(entry.reason)}`);
|
|
271
|
+
const actionPath = `#/operate/actions/${encodeURIComponent(origin.action.actionId)}/planning`;
|
|
272
|
+
return [
|
|
273
|
+
'## Operating origin',
|
|
274
|
+
'',
|
|
275
|
+
'This section is the access-safe human translation of the accepted Operate proposal. Machine authority remains in the adjacent `operating-origin.json` sidecar.',
|
|
276
|
+
'',
|
|
277
|
+
'### Problem and constraints',
|
|
278
|
+
'',
|
|
279
|
+
line('Problem', input.framing.problem),
|
|
280
|
+
line('Constraints', input.framing.constraints.length > 0 ? input.framing.constraints.join('; ') : 'none recorded'),
|
|
281
|
+
'',
|
|
282
|
+
'### Decision and intended Outcome',
|
|
283
|
+
'',
|
|
284
|
+
identity('Correlation', origin.correlationId),
|
|
285
|
+
identity('Proposal', origin.proposalId),
|
|
286
|
+
`- **Decision:** ${markdownCode(origin.decision.decisionId)} revision ${origin.decision.revision}`,
|
|
287
|
+
line('Decision title', origin.decision.title),
|
|
288
|
+
line('Decision rationale', origin.decision.rationale),
|
|
289
|
+
line('Intended Outcome', origin.decision.outcome),
|
|
290
|
+
`- **Action:** ${markdownCode(origin.action.actionId)} revision ${origin.action.revision}`,
|
|
291
|
+
line('Expected result', origin.action.expectedResult),
|
|
292
|
+
'',
|
|
293
|
+
'### Scope, non-scope, and risks',
|
|
294
|
+
'',
|
|
295
|
+
line('Scope', input.framing.scope.join('; ')),
|
|
296
|
+
line('Non-scope', input.framing.nonScope.length > 0 ? input.framing.nonScope.join('; ') : 'none recorded'),
|
|
297
|
+
line('Risks', input.framing.risks.length > 0 ? input.framing.risks.join('; ') : 'none recorded'),
|
|
298
|
+
'',
|
|
299
|
+
'### Accepted perspectives',
|
|
300
|
+
'',
|
|
301
|
+
perspectives,
|
|
302
|
+
'',
|
|
303
|
+
'### Evidence and limitations',
|
|
304
|
+
'',
|
|
305
|
+
evidence,
|
|
306
|
+
...(omitted.length > 0 ? ['', line('Access-safe omissions', omitted.join('; '))] : []),
|
|
307
|
+
'',
|
|
308
|
+
'### Verification',
|
|
309
|
+
'',
|
|
310
|
+
identity('Metric', origin.verification.metricId),
|
|
311
|
+
line('Baseline', origin.verification.baseline),
|
|
312
|
+
line('Target', origin.verification.target),
|
|
313
|
+
line('Window', origin.verification.window),
|
|
314
|
+
line('Method', origin.verification.method),
|
|
315
|
+
'',
|
|
316
|
+
'### Continue in Operate',
|
|
317
|
+
'',
|
|
318
|
+
`Run ${markdownCode(`planr operate dashboard ${origin.cycleId} --actor <authorizedActorId>`)}, then [open this Action in Planning](${actionPath}).`,
|
|
319
|
+
].join('\n');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Render, but do not publish, a Protocol 1.7 SPEC for an approved Operate handoff.
|
|
323
|
+
* Allocation reserves a project-global monotonic ID; the caller holds the
|
|
324
|
+
* Planning bridge lock until its directory rename commits.
|
|
325
|
+
*/
|
|
326
|
+
export async function prepareOperatingSpecDraft(projectDir, config, input) {
|
|
327
|
+
const slug = slugify(input.slug);
|
|
328
|
+
if (!slug || slug !== input.slug || Number.isNaN(Date.parse(input.createdAt))) {
|
|
329
|
+
throw Object.assign(new Error('Operating Planning requires a canonical slug and timestamp.'), {
|
|
330
|
+
code: 'E_OPERATE_PLANNING_INVALID',
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const specsRoot = getSpecsRootDir(projectDir, config);
|
|
334
|
+
await ensureDir(specsRoot);
|
|
335
|
+
const fs = await import('node:fs/promises');
|
|
336
|
+
const entries = await fs.readdir(specsRoot, { withFileTypes: true });
|
|
337
|
+
const escapedSlug = slug.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
338
|
+
if (entries.some((entry) => entry.isDirectory() && new RegExp(`^[A-Z]+-\\d{3,}-${escapedSlug}$`).test(entry.name))) {
|
|
339
|
+
throw Object.assign(new Error('An existing SPEC already uses this canonical planning slug.'), {
|
|
340
|
+
code: 'E_OPERATE_PLANNING_CONFLICT',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
const id = (await reservePlanningIds(projectDir, config, { SPEC: 1 })).SPEC[0];
|
|
344
|
+
const specDir = getSpecDir(projectDir, config, id, slug);
|
|
345
|
+
const specFile = path.join(specDir, `${id}-${slug}.md`);
|
|
346
|
+
const date = input.createdAt.slice(0, 10);
|
|
347
|
+
const list = (values) => values.map((value) => `- ${value}`).join('\n');
|
|
348
|
+
const titlePlaceholder = '__OPENPLANR_OPERATING_SPEC_TITLE__';
|
|
349
|
+
const rendered = await renderTemplate('spec/spec-shaped.md.hbs', {
|
|
350
|
+
id,
|
|
351
|
+
slug,
|
|
352
|
+
title: titlePlaceholder,
|
|
353
|
+
schemaVersion: '1.7.0',
|
|
354
|
+
priority: 'P1',
|
|
355
|
+
milestone: '',
|
|
356
|
+
po: '',
|
|
357
|
+
created: date,
|
|
358
|
+
date,
|
|
359
|
+
uiFiles: [],
|
|
360
|
+
context: `${input.framing.problem}\n\nObjective: ${input.framing.objective}\n\nUsers: ${input.framing.users.join('; ')}`,
|
|
361
|
+
functionalRequirements: input.framing.requirements,
|
|
362
|
+
businessRules: list(input.framing.constraints),
|
|
363
|
+
outOfScope: input.framing.nonScope,
|
|
364
|
+
acceptanceCriteria: input.framing.acceptanceOutcomes,
|
|
365
|
+
decompositionNotes: [
|
|
366
|
+
`Scope:\n${list(input.framing.scope)}`,
|
|
367
|
+
input.framing.risks.length > 0 ? `Risks:\n${list(input.framing.risks)}` : '',
|
|
368
|
+
'This SPEC inherits its operating origin through the adjacent closed sidecar. PLAN, Design, stories, tasks, and SHIP must not copy private operating bodies.',
|
|
369
|
+
]
|
|
370
|
+
.filter(Boolean)
|
|
371
|
+
.join('\n\n'),
|
|
372
|
+
}, config.templateOverrides);
|
|
373
|
+
const parsed = parseMarkdown(rendered);
|
|
374
|
+
const frontmatter = {
|
|
375
|
+
id,
|
|
376
|
+
title: input.title,
|
|
377
|
+
slug,
|
|
378
|
+
schemaVersion: '1.7.0',
|
|
379
|
+
status: 'shaping',
|
|
380
|
+
priority: 'P1',
|
|
381
|
+
po: input.actorId,
|
|
382
|
+
created: date,
|
|
383
|
+
updated: date,
|
|
384
|
+
ui_files: [],
|
|
385
|
+
tech_dependencies: [],
|
|
386
|
+
};
|
|
387
|
+
const content = toMarkdownWithFrontmatter(frontmatter, `${parsed.content.replaceAll(titlePlaceholder, input.title).trimEnd()}\n\n${operatingOriginSection(input)}\n`);
|
|
388
|
+
return { id, slug, specDir, specFile, content };
|
|
389
|
+
}
|
|
239
390
|
export async function readSpec(projectDir, config, specId) {
|
|
240
391
|
const resolved = await resolveSpecDir(projectDir, config, specId);
|
|
241
392
|
if (!resolved)
|
|
@@ -274,15 +425,17 @@ export async function updateSpecFields(projectDir, config, specId, fields) {
|
|
|
274
425
|
const specFile = path.join(resolved.dir, `${specId}-${resolved.slug}.md`);
|
|
275
426
|
const raw = await readFile(specFile);
|
|
276
427
|
const today = new Date().toISOString().split('T')[0];
|
|
277
|
-
|
|
428
|
+
await atomicWriteFile(specFile, updateSpecFrontmatter(raw, { ...fields, updated: today }));
|
|
429
|
+
}
|
|
430
|
+
function updateSpecFrontmatter(raw, fields) {
|
|
278
431
|
const openIdx = raw.indexOf('---');
|
|
279
432
|
const closeIdx = raw.indexOf('\n---', openIdx + 3);
|
|
280
433
|
if (openIdx === -1 || closeIdx === -1) {
|
|
281
|
-
throw new Error(
|
|
434
|
+
throw new Error('Spec has no valid frontmatter.');
|
|
282
435
|
}
|
|
283
436
|
let frontmatter = raw.slice(openIdx, closeIdx);
|
|
284
437
|
const body = raw.slice(closeIdx);
|
|
285
|
-
for (const [key, value] of Object.entries(
|
|
438
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
286
439
|
const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
287
440
|
const pattern = new RegExp(`^${escapedKey}:\\s*.*$`, 'm');
|
|
288
441
|
const replacement = `${key}: ${formatYamlValue(value)}`;
|
|
@@ -293,7 +446,7 @@ export async function updateSpecFields(projectDir, config, specId, fields) {
|
|
|
293
446
|
frontmatter += `\n${replacement}`;
|
|
294
447
|
}
|
|
295
448
|
}
|
|
296
|
-
|
|
449
|
+
return frontmatter + body;
|
|
297
450
|
}
|
|
298
451
|
/**
|
|
299
452
|
* Format a JS value as valid YAML for frontmatter.
|
|
@@ -340,7 +493,7 @@ export async function syncSpec(projectDir, config, specId, opts = {}) {
|
|
|
340
493
|
const storyIds = new Set(stories.map((s) => s.id));
|
|
341
494
|
for (const t of tasks) {
|
|
342
495
|
if (!t.storyId) {
|
|
343
|
-
warnings.push(`Task ${t.id} (${t.filename}) has no storyId — set it manually or
|
|
496
|
+
warnings.push(`Task ${t.id} (${t.filename}) has no storyId — set it manually or regenerate it with planr-plan.`);
|
|
344
497
|
}
|
|
345
498
|
else if (!storyIds.has(t.storyId)) {
|
|
346
499
|
warnings.push(`Task ${t.id} (${t.filename}) references non-existent story ${t.storyId} in this spec. ` +
|
|
@@ -355,7 +508,7 @@ export async function syncSpec(projectDir, config, specId, opts = {}) {
|
|
|
355
508
|
}
|
|
356
509
|
for (const s of stories) {
|
|
357
510
|
if (!tasksByStory.has(s.id)) {
|
|
358
|
-
warnings.push(`Story ${s.id} has no tasks —
|
|
511
|
+
warnings.push(`Story ${s.id} has no tasks — invoke planr-plan or hand-author tasks.`);
|
|
359
512
|
}
|
|
360
513
|
}
|
|
361
514
|
// ── Check 3: missing specId in US/Task frontmatter ────────────────────
|
|
@@ -384,7 +537,7 @@ export async function syncSpec(projectDir, config, specId, opts = {}) {
|
|
|
384
537
|
}
|
|
385
538
|
}
|
|
386
539
|
// ── Check 4: schema version drift ─────────────────────────────────────
|
|
387
|
-
const CURRENT_SCHEMA_VERSION = '1.
|
|
540
|
+
const CURRENT_SCHEMA_VERSION = '1.7.0';
|
|
388
541
|
const specSchemaVersion = typeof spec.data.schemaVersion === 'string' ? spec.data.schemaVersion : null;
|
|
389
542
|
if (specSchemaVersion && specSchemaVersion !== CURRENT_SCHEMA_VERSION) {
|
|
390
543
|
warnings.push(`Spec uses schemaVersion ${specSchemaVersion} (current: ${CURRENT_SCHEMA_VERSION}). No auto-migration in v1 — review manually.`);
|
|
@@ -408,19 +561,314 @@ export async function syncAllSpecs(projectDir, config, opts = {}) {
|
|
|
408
561
|
}
|
|
409
562
|
return { specsScanned: specs.length, reports };
|
|
410
563
|
}
|
|
564
|
+
async function resolveDesignContext(projectDir, spec) {
|
|
565
|
+
const designDir = getSpecDesignDir(spec.specDir);
|
|
566
|
+
const designSpecPath = path.join(designDir, 'design-spec.md');
|
|
567
|
+
const hasDesignSpec = await fileExists(designSpecPath);
|
|
568
|
+
const pngFiles = (await listFiles(designDir, /\.png$/iu)).sort();
|
|
569
|
+
const declaredUiFiles = Array.isArray(spec.data.ui_files)
|
|
570
|
+
? spec.data.ui_files.filter((file) => typeof file === 'string' && file.trim().length > 0)
|
|
571
|
+
: [];
|
|
572
|
+
const sections = [];
|
|
573
|
+
if (declaredUiFiles.length > 0) {
|
|
574
|
+
sections.push(`Declared UI files:\n${declaredUiFiles.map((file) => `- ${file}`).join('\n')}`);
|
|
575
|
+
}
|
|
576
|
+
if (pngFiles.length > 0) {
|
|
577
|
+
sections.push(`PNG inputs present:\n${pngFiles
|
|
578
|
+
.map((file) => `- ${path.relative(projectDir, path.join(designDir, file))}`)
|
|
579
|
+
.join('\n')}`);
|
|
580
|
+
}
|
|
581
|
+
if (hasDesignSpec) {
|
|
582
|
+
sections.push(`Design specification (${path.relative(projectDir, designSpecPath)}):\n${await readFile(designSpecPath)}`);
|
|
583
|
+
}
|
|
584
|
+
return {
|
|
585
|
+
hasDesign: declaredUiFiles.length > 0 || pngFiles.length > 0 || hasDesignSpec,
|
|
586
|
+
...(sections.length > 0 ? { context: sections.join('\n\n') } : {}),
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
function specTaskInput(aiTask, storyId, taskIdMap, acceptanceCriteria) {
|
|
590
|
+
const acceptanceRefs = [...aiTask.acceptanceRefs];
|
|
591
|
+
const knownAcceptance = new Set(acceptanceCriteria.map(({ id }) => id));
|
|
592
|
+
const unknownAcceptance = acceptanceRefs.filter((id) => !knownAcceptance.has(id));
|
|
593
|
+
if (unknownAcceptance.length > 0) {
|
|
594
|
+
throw invalidDecomposition(`${aiTask.id} references unknown acceptance IDs: ${unknownAcceptance.join(', ')}.`);
|
|
595
|
+
}
|
|
596
|
+
const mappedDependencies = aiTask.dependsOn.map((dependencyId) => {
|
|
597
|
+
const mapped = taskIdMap.get(dependencyId);
|
|
598
|
+
if (!mapped)
|
|
599
|
+
throw invalidDecomposition(`${aiTask.id} depends on unknown task ${dependencyId}.`);
|
|
600
|
+
return mapped;
|
|
601
|
+
});
|
|
602
|
+
const acceptanceVerification = acceptanceCriteria
|
|
603
|
+
.filter(({ id }) => acceptanceRefs.includes(id))
|
|
604
|
+
.map(({ id, statement }) => `- ${id}: ${statement}`)
|
|
605
|
+
.join('\n');
|
|
606
|
+
const shared = {
|
|
607
|
+
storyId,
|
|
608
|
+
title: aiTask.title,
|
|
609
|
+
rationale: aiTask.rationale,
|
|
610
|
+
dependsOn: mappedDependencies,
|
|
611
|
+
filesCreate: aiTask.filesCreate,
|
|
612
|
+
filesModify: aiTask.filesModify,
|
|
613
|
+
filesPreserve: aiTask.filesPreserve,
|
|
614
|
+
objective: aiTask.objective,
|
|
615
|
+
technicalSpec: aiTask.technicalSpec,
|
|
616
|
+
testRequirements: [aiTask.testRequirements.trim(), acceptanceVerification]
|
|
617
|
+
.filter(Boolean)
|
|
618
|
+
.join('\n'),
|
|
619
|
+
reviewRisks: aiTask.reviewRisks,
|
|
620
|
+
browserSurfaces: aiTask.browserSurfaces,
|
|
621
|
+
acceptanceRefs,
|
|
622
|
+
acceptanceCriteria: acceptanceCriteria.filter(({ id }) => acceptanceRefs.includes(id)),
|
|
623
|
+
};
|
|
624
|
+
return aiTask.type === 'UI'
|
|
625
|
+
? { ...shared, type: 'UI', agent: 'frontend-agent' }
|
|
626
|
+
: { ...shared, type: 'Tech', agent: 'backend-agent' };
|
|
627
|
+
}
|
|
628
|
+
function validateRenderedPlanningArtifact(content, expected) {
|
|
629
|
+
const parsed = parseMarkdown(content);
|
|
630
|
+
for (const [key, value] of Object.entries(expected)) {
|
|
631
|
+
if (parsed.data[key] !== value) {
|
|
632
|
+
throw invalidDecomposition(`rendered ${expected.id} has ${key}=${String(parsed.data[key])}; expected ${value}.`);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
async function loadPlanningProtocolValidator() {
|
|
637
|
+
try {
|
|
638
|
+
const protocol = await import('planr-pipeline/protocol');
|
|
639
|
+
return protocol.validateProtocolArtifact;
|
|
640
|
+
}
|
|
641
|
+
catch (error) {
|
|
642
|
+
const moduleError = error;
|
|
643
|
+
if (moduleError.code === 'ERR_MODULE_NOT_FOUND' &&
|
|
644
|
+
moduleError.message.includes('planr-pipeline')) {
|
|
645
|
+
logger.warn('Full Protocol frontmatter validation is unavailable because optional planr-pipeline is not installed. Install the matching planr-pipeline version before promoting this spec.');
|
|
646
|
+
return null;
|
|
647
|
+
}
|
|
648
|
+
throw error;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
function validatePlanningProtocolFrontmatter(validator, kind, content, artifactId, protocolVersion = '1.0.0') {
|
|
652
|
+
if (!validator)
|
|
653
|
+
return;
|
|
654
|
+
const issues = validator(kind, parseMarkdown(content).data, { protocolVersion });
|
|
655
|
+
if (issues.length === 0)
|
|
656
|
+
return;
|
|
657
|
+
const summary = issues
|
|
658
|
+
.slice(0, 8)
|
|
659
|
+
.map((issue) => `${issue.path} ${issue.rule}: ${issue.detail}`)
|
|
660
|
+
.join('; ');
|
|
661
|
+
const remainder = issues.length > 8 ? `; and ${issues.length - 8} more` : '';
|
|
662
|
+
throw invalidDecomposition(`rendered ${artifactId} violates Protocol ${protocolVersion} ${kind} frontmatter: ${summary}${remainder}.`);
|
|
663
|
+
}
|
|
664
|
+
async function removeDecompositionTransient(directory) {
|
|
665
|
+
try {
|
|
666
|
+
await fsPromises.rm(directory, { recursive: true, force: true });
|
|
667
|
+
}
|
|
668
|
+
catch (error) {
|
|
669
|
+
logger.debug(`Could not remove decomposition transient ${directory}`, error);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
async function replaceSpecWithDecomposition(config, spec, existingStories, existingTasks, decomposition, allocation) {
|
|
673
|
+
const fs = await import('node:fs/promises');
|
|
674
|
+
const transactionId = randomUUID();
|
|
675
|
+
const specParent = path.dirname(spec.specDir);
|
|
676
|
+
const specDirName = path.basename(spec.specDir);
|
|
677
|
+
const stagedSpecDir = path.join(specParent, `.${specDirName}.decompose-stage-${transactionId}`);
|
|
678
|
+
const backupSpecDir = path.join(specParent, `.${specDirName}.decompose-backup-${transactionId}`);
|
|
679
|
+
const protocolValidator = await loadPlanningProtocolValidator();
|
|
680
|
+
try {
|
|
681
|
+
await fsPromises.cp(spec.specDir, stagedSpecDir, {
|
|
682
|
+
recursive: true,
|
|
683
|
+
force: false,
|
|
684
|
+
errorOnExist: true,
|
|
685
|
+
});
|
|
686
|
+
const stagedStoriesDir = getSpecStoriesDir(stagedSpecDir);
|
|
687
|
+
const stagedTasksDir = getSpecTasksDir(stagedSpecDir);
|
|
688
|
+
await ensureDir(stagedStoriesDir);
|
|
689
|
+
await ensureDir(stagedTasksDir);
|
|
690
|
+
for (const story of existingStories) {
|
|
691
|
+
await fs.rm(path.join(stagedStoriesDir, story.filename), { force: true });
|
|
692
|
+
}
|
|
693
|
+
for (const task of existingTasks) {
|
|
694
|
+
await fs.rm(path.join(stagedTasksDir, task.filename), { force: true });
|
|
695
|
+
}
|
|
696
|
+
let tasksCreated = 0;
|
|
697
|
+
const flatTasks = decomposition.stories.flatMap((story) => story.tasks);
|
|
698
|
+
const taskIdMap = new Map(flatTasks.map((task, index) => [task.id, allocation.T[index]]));
|
|
699
|
+
for (const [storyIndex, aiStory] of decomposition.stories.entries()) {
|
|
700
|
+
const storyId = allocation.US[storyIndex];
|
|
701
|
+
const acceptanceCriteria = aiStory.acceptanceCriteria.map((statement, index) => ({
|
|
702
|
+
id: `AC-${String(index + 1).padStart(3, '0')}`,
|
|
703
|
+
statement,
|
|
704
|
+
}));
|
|
705
|
+
const renderedTasks = [];
|
|
706
|
+
for (const aiTask of aiStory.tasks) {
|
|
707
|
+
const taskId = taskIdMap.get(aiTask.id);
|
|
708
|
+
if (!taskId)
|
|
709
|
+
throw invalidDecomposition(`No global ID was allocated for ${aiTask.id}.`);
|
|
710
|
+
const input = specTaskInput(aiTask, storyId, taskIdMap, acceptanceCriteria);
|
|
711
|
+
const rendered = await renderSpecTaskContent(config, spec.id, taskId, input);
|
|
712
|
+
const filename = `${taskId}-${rendered.slug}.md`;
|
|
713
|
+
validateRenderedPlanningArtifact(rendered.content, {
|
|
714
|
+
id: taskId,
|
|
715
|
+
specId: spec.id,
|
|
716
|
+
storyId,
|
|
717
|
+
});
|
|
718
|
+
validatePlanningProtocolFrontmatter(protocolValidator, 'task', rendered.content, taskId, '1.7.0');
|
|
719
|
+
renderedTasks.push({
|
|
720
|
+
id: taskId,
|
|
721
|
+
filename,
|
|
722
|
+
agent: input.agent,
|
|
723
|
+
title: aiTask.title,
|
|
724
|
+
content: rendered.content,
|
|
725
|
+
acceptanceRefs: input.acceptanceRefs ?? [],
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
const mappedAcceptance = new Set(renderedTasks.flatMap((task) => task.acceptanceRefs));
|
|
729
|
+
const uncovered = acceptanceCriteria.filter(({ id }) => !mappedAcceptance.has(id));
|
|
730
|
+
if (uncovered.length > 0) {
|
|
731
|
+
throw invalidDecomposition(`${storyId} has acceptance criteria without task verification: ${uncovered.map(({ id }) => id).join(', ')}.`);
|
|
732
|
+
}
|
|
733
|
+
const renderedStory = await renderSpecStoryContent(config, spec.id, storyId, aiStory.title, {
|
|
734
|
+
roleAction: aiStory.roleAction,
|
|
735
|
+
benefit: aiStory.benefit,
|
|
736
|
+
scope: aiStory.scope,
|
|
737
|
+
acceptanceCriteria,
|
|
738
|
+
tasks: renderedTasks.map(({ id, filename, agent, title }) => ({
|
|
739
|
+
id,
|
|
740
|
+
filename,
|
|
741
|
+
agent,
|
|
742
|
+
title,
|
|
743
|
+
})),
|
|
744
|
+
});
|
|
745
|
+
validateRenderedPlanningArtifact(renderedStory.content, { id: storyId, specId: spec.id });
|
|
746
|
+
validatePlanningProtocolFrontmatter(protocolValidator, 'story', renderedStory.content, storyId, '1.7.0');
|
|
747
|
+
await writeFile(path.join(stagedStoriesDir, `${storyId}-${renderedStory.slug}.md`), renderedStory.content);
|
|
748
|
+
for (const task of renderedTasks) {
|
|
749
|
+
await writeFile(path.join(stagedTasksDir, task.filename), task.content);
|
|
750
|
+
tasksCreated++;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
const stagedSpecFile = path.join(stagedSpecDir, path.basename(spec.specFile));
|
|
754
|
+
const stagedSpecContent = updateSpecFrontmatter(await readFile(stagedSpecFile), {
|
|
755
|
+
status: 'decomposed',
|
|
756
|
+
updated: new Date().toISOString().split('T')[0],
|
|
757
|
+
});
|
|
758
|
+
const parsedSpec = parseMarkdown(stagedSpecContent);
|
|
759
|
+
if (parsedSpec.data.id !== spec.id || parsedSpec.data.status !== 'decomposed') {
|
|
760
|
+
throw invalidDecomposition('rendered spec status update did not preserve its identity.');
|
|
761
|
+
}
|
|
762
|
+
validatePlanningProtocolFrontmatter(protocolValidator, 'spec', stagedSpecContent, spec.id, parsedSpec.data.schemaVersion === '1.7.0' ? '1.7.0' : '1.0.0');
|
|
763
|
+
await atomicWriteFile(stagedSpecFile, stagedSpecContent);
|
|
764
|
+
await fsPromises.rename(spec.specDir, backupSpecDir);
|
|
765
|
+
try {
|
|
766
|
+
await fsPromises.rename(stagedSpecDir, spec.specDir);
|
|
767
|
+
}
|
|
768
|
+
catch (publishError) {
|
|
769
|
+
try {
|
|
770
|
+
await fsPromises.rename(backupSpecDir, spec.specDir);
|
|
771
|
+
}
|
|
772
|
+
catch (rollbackError) {
|
|
773
|
+
throw new AggregateError([publishError, rollbackError], `Could not publish the staged decomposition or restore ${spec.id}. The original plan remains at ${backupSpecDir}.`);
|
|
774
|
+
}
|
|
775
|
+
throw publishError;
|
|
776
|
+
}
|
|
777
|
+
try {
|
|
778
|
+
await fsPromises.rm(backupSpecDir, { recursive: true, force: true });
|
|
779
|
+
}
|
|
780
|
+
catch (error) {
|
|
781
|
+
logger.debug(`Could not remove completed decomposition backup ${backupSpecDir}`, error);
|
|
782
|
+
}
|
|
783
|
+
return { storiesCreated: decomposition.stories.length, tasksCreated };
|
|
784
|
+
}
|
|
785
|
+
catch (error) {
|
|
786
|
+
await removeDecompositionTransient(stagedSpecDir);
|
|
787
|
+
throw error;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
function invalidDecomposition(message) {
|
|
791
|
+
return Object.assign(new Error(`Invalid spec decomposition: ${message}`), {
|
|
792
|
+
code: 'E_SPEC_DECOMPOSITION_INVALID',
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Enforce the deterministic parts of the planning contract before any story or
|
|
797
|
+
* task is written. Semantic dependency need is established by the prompt; this
|
|
798
|
+
* boundary verifies that the declared graph is addressable and executable.
|
|
799
|
+
*/
|
|
800
|
+
function validateDecompositionContract(stories, hasDesign) {
|
|
801
|
+
const flattened = [];
|
|
802
|
+
for (const [storyIndex, story] of stories.entries()) {
|
|
803
|
+
const location = `story ${storyIndex + 1} (${story.title})`;
|
|
804
|
+
if (hasDesign) {
|
|
805
|
+
if (story.tasks.length !== 2) {
|
|
806
|
+
throw invalidDecomposition(`${location} must contain exactly two tasks because design context exists: UI then Tech.`);
|
|
807
|
+
}
|
|
808
|
+
const [uiTask, techTask] = story.tasks;
|
|
809
|
+
if (uiTask.type !== 'UI' || uiTask.agent !== 'frontend-agent') {
|
|
810
|
+
throw invalidDecomposition(`${location} task 1 must use type UI with frontend-agent when design context exists.`);
|
|
811
|
+
}
|
|
812
|
+
if (techTask.type !== 'Tech' || techTask.agent !== 'backend-agent') {
|
|
813
|
+
throw invalidDecomposition(`${location} task 2 must use type Tech with backend-agent.`);
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
else {
|
|
817
|
+
if (story.tasks.length !== 1) {
|
|
818
|
+
throw invalidDecomposition(`${location} must contain exactly one Tech task because no design context exists.`);
|
|
819
|
+
}
|
|
820
|
+
const [techTask] = story.tasks;
|
|
821
|
+
if (techTask.type !== 'Tech' || techTask.agent !== 'backend-agent') {
|
|
822
|
+
throw invalidDecomposition(`${location} must use type Tech with backend-agent when no design context exists.`);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
flattened.push(...story.tasks);
|
|
826
|
+
}
|
|
827
|
+
const taskIds = new Set();
|
|
828
|
+
for (const [index, task] of flattened.entries()) {
|
|
829
|
+
const expectedId = `T-${String(index + 1).padStart(3, '0')}`;
|
|
830
|
+
if (task.id !== expectedId) {
|
|
831
|
+
throw invalidDecomposition(`task ${index + 1} must be ${expectedId} in flattened output order; received ${task.id}.`);
|
|
832
|
+
}
|
|
833
|
+
taskIds.add(task.id);
|
|
834
|
+
}
|
|
835
|
+
for (const task of flattened) {
|
|
836
|
+
for (const dependencyId of task.dependsOn) {
|
|
837
|
+
if (!taskIds.has(dependencyId)) {
|
|
838
|
+
throw invalidDecomposition(`${task.id} depends on unknown task ${dependencyId}; dependencies must reference this decomposition.`);
|
|
839
|
+
}
|
|
840
|
+
if (dependencyId === task.id) {
|
|
841
|
+
throw invalidDecomposition(`${task.id} cannot depend on itself.`);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
const dependencies = new Map(flattened.map((task) => [task.id, task.dependsOn]));
|
|
846
|
+
const state = new Map();
|
|
847
|
+
const visit = (taskId, path) => {
|
|
848
|
+
const currentState = state.get(taskId);
|
|
849
|
+
if (currentState === 'visited')
|
|
850
|
+
return;
|
|
851
|
+
if (currentState === 'visiting') {
|
|
852
|
+
throw invalidDecomposition(`dependency cycle detected: ${[...path, taskId].join(' -> ')}.`);
|
|
853
|
+
}
|
|
854
|
+
state.set(taskId, 'visiting');
|
|
855
|
+
for (const dependencyId of dependencies.get(taskId) ?? []) {
|
|
856
|
+
visit(dependencyId, [...path, taskId]);
|
|
857
|
+
}
|
|
858
|
+
state.set(taskId, 'visited');
|
|
859
|
+
};
|
|
860
|
+
for (const task of flattened)
|
|
861
|
+
visit(task.id, []);
|
|
862
|
+
}
|
|
411
863
|
/**
|
|
412
864
|
* Decompose a SPEC into User Stories + Tasks via AI.
|
|
413
865
|
*
|
|
414
866
|
* High-level flow:
|
|
415
867
|
* 1. Read the spec; refuse if stories/ or tasks/ already populated
|
|
416
|
-
* (unless
|
|
417
|
-
* 2.
|
|
418
|
-
* 3.
|
|
419
|
-
*
|
|
420
|
-
* 4. Build prompt + call AI provider via `generateStreamingJSON`
|
|
421
|
-
* 5. Validate the response with `aiSpecDecomposeResponseSchema`
|
|
422
|
-
* 6. Write each US via `createSpecStory` and each Task via `createSpecTask`
|
|
423
|
-
* 7. Update SPEC frontmatter status: pending|shaping → decomposing → decomposed
|
|
868
|
+
* (unless replacement was requested)
|
|
869
|
+
* 2. Accept the semantic decomposition authored by the active host agent.
|
|
870
|
+
* 3. Validate and render a complete staged spec directory.
|
|
871
|
+
* 4. Replace the prior spec directory only after the staged plan is valid.
|
|
424
872
|
*/
|
|
425
873
|
export async function decomposeSpec(projectDir, config, specId, opts = {}) {
|
|
426
874
|
const spec = await readSpec(projectDir, config, specId);
|
|
@@ -429,90 +877,44 @@ export async function decomposeSpec(projectDir, config, specId, opts = {}) {
|
|
|
429
877
|
// ── Guard: refuse to overwrite existing decomposition ─────────────────
|
|
430
878
|
const existingStories = await listSpecStories(spec.specDir);
|
|
431
879
|
const existingTasks = await listSpecTasks(spec.specDir);
|
|
432
|
-
|
|
880
|
+
const replaceExisting = opts.replaceExisting === true || opts.force === true;
|
|
881
|
+
if ((existingStories.length > 0 || existingTasks.length > 0) && !replaceExisting) {
|
|
433
882
|
throw new Error(`Spec ${specId} already has ${existingStories.length} stor${existingStories.length === 1 ? 'y' : 'ies'} and ${existingTasks.length} task${existingTasks.length === 1 ? '' : 's'}. ` +
|
|
434
|
-
`Pass --
|
|
435
|
-
}
|
|
436
|
-
// If forcing, wipe existing US + Task files BEFORE the AI call so a failed
|
|
437
|
-
// decomposition doesn't leave a half-overwritten tree.
|
|
438
|
-
if (opts.force && (existingStories.length > 0 || existingTasks.length > 0)) {
|
|
439
|
-
const fs = await import('node:fs/promises');
|
|
440
|
-
for (const s of existingStories)
|
|
441
|
-
await fs.rm(s.filePath, { force: true });
|
|
442
|
-
for (const t of existingTasks)
|
|
443
|
-
await fs.rm(t.filePath, { force: true });
|
|
444
|
-
}
|
|
445
|
-
// ── Determine PNG presence (drives 1-vs-2 tasks per US per rules.md R2) ─
|
|
446
|
-
const uiFilesData = spec.data.ui_files;
|
|
447
|
-
const hasPNGs = Array.isArray(uiFilesData) && uiFilesData.length > 0;
|
|
448
|
-
// ── Read stack.md (best-effort) ───────────────────────────────────────
|
|
449
|
-
let stackInfo;
|
|
450
|
-
try {
|
|
451
|
-
const stackPath = path.join(projectDir, 'input/tech/stack.md');
|
|
452
|
-
if (await fileExists(stackPath)) {
|
|
453
|
-
stackInfo = await readFile(stackPath);
|
|
454
|
-
}
|
|
883
|
+
`Pass --replace-existing to regenerate them atomically.`);
|
|
455
884
|
}
|
|
456
|
-
|
|
457
|
-
|
|
885
|
+
if (!opts.decomposition) {
|
|
886
|
+
const error = new Error('Semantic decomposition belongs to the active host agent; provide a host-authored decomposition to the deterministic publisher.');
|
|
887
|
+
error.code = 'E_HOST_AGENT_REQUIRED';
|
|
888
|
+
throw error;
|
|
458
889
|
}
|
|
459
|
-
//
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
const { TOKEN_BUDGETS } = await import('../ai/types.js');
|
|
484
|
-
const provider = await getAIProvider(config);
|
|
485
|
-
const messages = buildSpecDecomposePrompt(spec.content, hasPNGs, stackInfo, codebaseContext, opts.maxStories);
|
|
486
|
-
const { result } = await generateStreamingJSON(provider, messages, aiSpecDecomposeResponseSchema, { maxTokens: TOKEN_BUDGETS.taskFeature });
|
|
487
|
-
// ── Persist stories + tasks ────────────────────────────────────────────
|
|
488
|
-
let storiesCreated = 0;
|
|
489
|
-
let tasksCreated = 0;
|
|
490
|
-
for (const aiStory of result.stories) {
|
|
491
|
-
const created = await createSpecStory(projectDir, config, specId, aiStory.title, {
|
|
492
|
-
roleAction: aiStory.roleAction,
|
|
493
|
-
benefit: aiStory.benefit,
|
|
494
|
-
scope: aiStory.scope,
|
|
495
|
-
acceptanceCriteria: aiStory.acceptanceCriteria,
|
|
496
|
-
});
|
|
497
|
-
storiesCreated++;
|
|
498
|
-
for (const aiTask of aiStory.tasks) {
|
|
499
|
-
await createSpecTask(projectDir, config, specId, {
|
|
500
|
-
storyId: created.id,
|
|
501
|
-
title: aiTask.title,
|
|
502
|
-
type: aiTask.type,
|
|
503
|
-
agent: aiTask.agent,
|
|
504
|
-
filesCreate: aiTask.filesCreate,
|
|
505
|
-
filesModify: aiTask.filesModify,
|
|
506
|
-
filesPreserve: aiTask.filesPreserve,
|
|
507
|
-
objective: aiTask.objective,
|
|
508
|
-
technicalSpec: aiTask.technicalSpec,
|
|
509
|
-
testRequirements: aiTask.testRequirements,
|
|
510
|
-
});
|
|
511
|
-
tasksCreated++;
|
|
512
|
-
}
|
|
890
|
+
// Resolve design context for deterministic one-vs-two task validation.
|
|
891
|
+
const design = await resolveDesignContext(projectDir, spec);
|
|
892
|
+
const result = opts.decomposition;
|
|
893
|
+
validateDecompositionContract(result.stories, design.hasDesign);
|
|
894
|
+
const flatTasks = result.stories.flatMap((story) => story.tasks);
|
|
895
|
+
const counts = { US: result.stories.length, T: flatTasks.length };
|
|
896
|
+
const allocation = opts.preview
|
|
897
|
+
? await previewPlanningIds(projectDir, config, counts)
|
|
898
|
+
: await reservePlanningIds(projectDir, config, counts);
|
|
899
|
+
const firstReadyIndex = flatTasks.findIndex((task) => task.dependsOn.length === 0);
|
|
900
|
+
const selectedIndex = firstReadyIndex >= 0 ? firstReadyIndex : 0;
|
|
901
|
+
const taskSelector = allocation.T[selectedIndex];
|
|
902
|
+
const shipCommand = `$planr:ship ${taskSelector}`;
|
|
903
|
+
if (opts.preview) {
|
|
904
|
+
return {
|
|
905
|
+
storiesCreated: result.stories.length,
|
|
906
|
+
tasksCreated: flatTasks.length,
|
|
907
|
+
decompositionNotes: result.decompositionNotes,
|
|
908
|
+
preview: true,
|
|
909
|
+
storyIds: allocation.US,
|
|
910
|
+
taskIds: allocation.T,
|
|
911
|
+
taskSelector,
|
|
912
|
+
shipCommand,
|
|
913
|
+
};
|
|
513
914
|
}
|
|
514
|
-
//
|
|
515
|
-
|
|
915
|
+
// Render and validate outside the live spec directory. The final rename is
|
|
916
|
+
// the first mutation of the existing plan, and it rolls back on failure.
|
|
917
|
+
const { storiesCreated, tasksCreated } = await replaceSpecWithDecomposition(config, spec, existingStories, existingTasks, result, allocation);
|
|
516
918
|
await appendOpenPlanrProvenance({
|
|
517
919
|
projectDir,
|
|
518
920
|
artifactId: spec.id,
|
|
@@ -527,8 +929,231 @@ export async function decomposeSpec(projectDir, config, specId, opts = {}) {
|
|
|
527
929
|
storiesCreated,
|
|
528
930
|
tasksCreated,
|
|
529
931
|
decompositionNotes: result.decompositionNotes,
|
|
932
|
+
preview: false,
|
|
933
|
+
storyIds: allocation.US,
|
|
934
|
+
taskIds: allocation.T,
|
|
935
|
+
taskSelector,
|
|
936
|
+
shipCommand,
|
|
530
937
|
};
|
|
531
938
|
}
|
|
939
|
+
// ---------------------------------------------------------------------------
|
|
940
|
+
// Shape — professional specification authoring
|
|
941
|
+
// ---------------------------------------------------------------------------
|
|
942
|
+
export const PROFESSIONAL_SPECIFICATION_CONTRACT = 'professional-specification@1.0.0';
|
|
943
|
+
export const PROFESSIONAL_SPECIFICATION_KIND = 'professional-specification';
|
|
944
|
+
export const PROFESSIONAL_SPECIFICATION_SCHEMA_VERSION = '1.0.0';
|
|
945
|
+
export const PROFESSIONAL_SPECIFICATION_PROTOCOL_VERSION = '1.1.0';
|
|
946
|
+
export const PROFESSIONAL_SPECIFICATION_MAX_INPUT_BYTES = 128 * 1024;
|
|
947
|
+
export const PROFESSIONAL_SPEC_SPECIALISTS = Object.freeze([
|
|
948
|
+
'security',
|
|
949
|
+
'performance',
|
|
950
|
+
'migration',
|
|
951
|
+
'api-contract',
|
|
952
|
+
'data-integrity',
|
|
953
|
+
]);
|
|
954
|
+
export class ProfessionalSpecValidationError extends Error {
|
|
955
|
+
code = 'E_PROFESSIONAL_SPEC_INVALID';
|
|
956
|
+
missing;
|
|
957
|
+
constructor(problem, missing = []) {
|
|
958
|
+
super(problem);
|
|
959
|
+
this.name = this.code;
|
|
960
|
+
this.missing = [...missing];
|
|
961
|
+
}
|
|
962
|
+
toJSON() {
|
|
963
|
+
return {
|
|
964
|
+
ok: false,
|
|
965
|
+
code: this.code,
|
|
966
|
+
problem: this.message,
|
|
967
|
+
recovery: 'Provide one closed professional-specification@1.0.0 JSON object with every required field.',
|
|
968
|
+
...(this.missing.length > 0 ? { missing: [...this.missing] } : {}),
|
|
969
|
+
};
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
const PROFESSIONAL_SPEC_TOP_LEVEL_KEYS = Object.freeze([
|
|
973
|
+
'kind',
|
|
974
|
+
'schemaVersion',
|
|
975
|
+
'protocolVersion',
|
|
976
|
+
'context',
|
|
977
|
+
'audience',
|
|
978
|
+
'outcome',
|
|
979
|
+
'functionalRequirements',
|
|
980
|
+
'constraints',
|
|
981
|
+
'evidenceExpectations',
|
|
982
|
+
'failureModes',
|
|
983
|
+
'rollback',
|
|
984
|
+
'scope',
|
|
985
|
+
'acceptanceCriteria',
|
|
986
|
+
'declaredSpecialists',
|
|
987
|
+
'businessRules',
|
|
988
|
+
'decompositionNotes',
|
|
989
|
+
]);
|
|
990
|
+
const REQUIRED_PROFESSIONAL_SPEC_FIELDS = Object.freeze([
|
|
991
|
+
'kind',
|
|
992
|
+
'schemaVersion',
|
|
993
|
+
'protocolVersion',
|
|
994
|
+
'context',
|
|
995
|
+
'audience',
|
|
996
|
+
'outcome',
|
|
997
|
+
'functionalRequirements',
|
|
998
|
+
'constraints',
|
|
999
|
+
'evidenceExpectations',
|
|
1000
|
+
'failureModes',
|
|
1001
|
+
'rollback',
|
|
1002
|
+
'scope',
|
|
1003
|
+
'acceptanceCriteria',
|
|
1004
|
+
'declaredSpecialists',
|
|
1005
|
+
]);
|
|
1006
|
+
function plainRecord(value) {
|
|
1007
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
1008
|
+
? value
|
|
1009
|
+
: null;
|
|
1010
|
+
}
|
|
1011
|
+
function rejectUnknownKeys(value, allowed, label) {
|
|
1012
|
+
if (Object.keys(value).some((key) => !allowed.includes(key))) {
|
|
1013
|
+
throw new ProfessionalSpecValidationError(`${label} contains unsupported fields.`);
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
function isPlaceholder(value) {
|
|
1017
|
+
const normalized = value
|
|
1018
|
+
.replace(/[*_`#]/gu, '')
|
|
1019
|
+
.replace(/\s+/gu, ' ')
|
|
1020
|
+
.trim()
|
|
1021
|
+
.toLowerCase();
|
|
1022
|
+
return (normalized.length === 0 ||
|
|
1023
|
+
/^(?:tbd|todo|n\/?a|unknown|later|placeholder|none|\.{3}|…)[.!]?$/u.test(normalized) ||
|
|
1024
|
+
/\b(?:tbd|todo|placeholder)\b/u.test(normalized) ||
|
|
1025
|
+
/(?:given|when|then)\s+(?:\.{3}|…)/u.test(normalized) ||
|
|
1026
|
+
/^\[(?:insert|describe|add|fill)[^\]]*\]$/u.test(normalized));
|
|
1027
|
+
}
|
|
1028
|
+
function meaningfulText(value, label, options = {}) {
|
|
1029
|
+
const min = options.min ?? 8;
|
|
1030
|
+
const max = options.max ?? 4_096;
|
|
1031
|
+
if (typeof value !== 'string') {
|
|
1032
|
+
throw new ProfessionalSpecValidationError(`${label} must be text.`);
|
|
1033
|
+
}
|
|
1034
|
+
const normalized = value.trim();
|
|
1035
|
+
if (normalized.length < min || normalized.length > max || isPlaceholder(normalized)) {
|
|
1036
|
+
throw new ProfessionalSpecValidationError(`${label} must be explicit, decision-complete text between ${min} and ${max} characters.`);
|
|
1037
|
+
}
|
|
1038
|
+
return normalized;
|
|
1039
|
+
}
|
|
1040
|
+
function meaningfulList(value, label, options = {}) {
|
|
1041
|
+
const min = options.min ?? 1;
|
|
1042
|
+
const max = options.max ?? 32;
|
|
1043
|
+
if (!Array.isArray(value) || value.length > max || (!options.allowEmpty && value.length < min)) {
|
|
1044
|
+
throw new ProfessionalSpecValidationError(`${label} must contain ${options.allowEmpty ? 'zero or more' : `between ${min} and ${max}`} items.`);
|
|
1045
|
+
}
|
|
1046
|
+
const normalized = value.map((item) => meaningfulText(item, `${label} item`, { min: options.itemMin ?? 8, max: 2_048 }));
|
|
1047
|
+
const identities = normalized.map((item) => item.toLocaleLowerCase('en-US'));
|
|
1048
|
+
if (new Set(identities).size !== identities.length) {
|
|
1049
|
+
throw new ProfessionalSpecValidationError(`${label} contains duplicate items.`);
|
|
1050
|
+
}
|
|
1051
|
+
return normalized;
|
|
1052
|
+
}
|
|
1053
|
+
/** Parse, normalize, and close one professional specification authoring request. */
|
|
1054
|
+
export function parseProfessionalSpecAnswers(value) {
|
|
1055
|
+
let byteLength = 0;
|
|
1056
|
+
try {
|
|
1057
|
+
byteLength = Buffer.byteLength(JSON.stringify(value), 'utf8');
|
|
1058
|
+
}
|
|
1059
|
+
catch {
|
|
1060
|
+
throw new ProfessionalSpecValidationError('Professional specification input must be one JSON object.');
|
|
1061
|
+
}
|
|
1062
|
+
if (byteLength > PROFESSIONAL_SPECIFICATION_MAX_INPUT_BYTES) {
|
|
1063
|
+
throw new ProfessionalSpecValidationError('Professional specification input exceeds the 128KB limit.');
|
|
1064
|
+
}
|
|
1065
|
+
const input = plainRecord(value);
|
|
1066
|
+
if (!input) {
|
|
1067
|
+
throw new ProfessionalSpecValidationError('Professional specification input must be one JSON object.');
|
|
1068
|
+
}
|
|
1069
|
+
rejectUnknownKeys(input, PROFESSIONAL_SPEC_TOP_LEVEL_KEYS, 'Professional specification input');
|
|
1070
|
+
const missing = REQUIRED_PROFESSIONAL_SPEC_FIELDS.filter((field) => !(field in input));
|
|
1071
|
+
if (missing.length > 0) {
|
|
1072
|
+
throw new ProfessionalSpecValidationError('Professional specification input is missing required fields.', [...missing]);
|
|
1073
|
+
}
|
|
1074
|
+
if (input.kind !== PROFESSIONAL_SPECIFICATION_KIND ||
|
|
1075
|
+
input.schemaVersion !== PROFESSIONAL_SPECIFICATION_SCHEMA_VERSION ||
|
|
1076
|
+
input.protocolVersion !== PROFESSIONAL_SPECIFICATION_PROTOCOL_VERSION) {
|
|
1077
|
+
throw new ProfessionalSpecValidationError('Professional specification contract identity is unsupported.');
|
|
1078
|
+
}
|
|
1079
|
+
const audience = plainRecord(input.audience);
|
|
1080
|
+
if (!audience)
|
|
1081
|
+
throw new ProfessionalSpecValidationError('audience must be one object.');
|
|
1082
|
+
rejectUnknownKeys(audience, ['primary', 'affected'], 'audience');
|
|
1083
|
+
const audienceMissing = ['primary', 'affected'].filter((field) => !(field in audience));
|
|
1084
|
+
if (audienceMissing.length > 0) {
|
|
1085
|
+
throw new ProfessionalSpecValidationError('audience is missing required fields.', audienceMissing);
|
|
1086
|
+
}
|
|
1087
|
+
const outcome = plainRecord(input.outcome);
|
|
1088
|
+
if (!outcome)
|
|
1089
|
+
throw new ProfessionalSpecValidationError('outcome must be one object.');
|
|
1090
|
+
rejectUnknownKeys(outcome, ['statement', 'measure', 'target', 'timeframe'], 'outcome');
|
|
1091
|
+
const outcomeMissing = ['statement', 'measure', 'target', 'timeframe'].filter((field) => !(field in outcome));
|
|
1092
|
+
if (outcomeMissing.length > 0) {
|
|
1093
|
+
throw new ProfessionalSpecValidationError('outcome is missing required fields.', outcomeMissing);
|
|
1094
|
+
}
|
|
1095
|
+
const scope = plainRecord(input.scope);
|
|
1096
|
+
if (!scope)
|
|
1097
|
+
throw new ProfessionalSpecValidationError('scope must be one object.');
|
|
1098
|
+
rejectUnknownKeys(scope, ['inScope', 'outOfScope'], 'scope');
|
|
1099
|
+
const scopeMissing = ['inScope', 'outOfScope'].filter((field) => !(field in scope));
|
|
1100
|
+
if (scopeMissing.length > 0) {
|
|
1101
|
+
throw new ProfessionalSpecValidationError('scope is missing required fields.', scopeMissing);
|
|
1102
|
+
}
|
|
1103
|
+
if (!Array.isArray(input.declaredSpecialists)) {
|
|
1104
|
+
throw new ProfessionalSpecValidationError('declaredSpecialists must be one array.');
|
|
1105
|
+
}
|
|
1106
|
+
const declaredSpecialists = input.declaredSpecialists.map((candidate) => {
|
|
1107
|
+
if (typeof candidate !== 'string' ||
|
|
1108
|
+
!PROFESSIONAL_SPEC_SPECIALISTS.includes(candidate)) {
|
|
1109
|
+
throw new ProfessionalSpecValidationError('declaredSpecialists contains an unsupported specialist identity.');
|
|
1110
|
+
}
|
|
1111
|
+
return candidate;
|
|
1112
|
+
});
|
|
1113
|
+
if (new Set(declaredSpecialists).size !== declaredSpecialists.length) {
|
|
1114
|
+
throw new ProfessionalSpecValidationError('declaredSpecialists contains duplicates.');
|
|
1115
|
+
}
|
|
1116
|
+
const orderedSpecialists = PROFESSIONAL_SPEC_SPECIALISTS.filter((specialist) => declaredSpecialists.includes(specialist));
|
|
1117
|
+
const businessRules = input.businessRules === undefined
|
|
1118
|
+
? []
|
|
1119
|
+
: meaningfulList(input.businessRules, 'businessRules', { allowEmpty: true });
|
|
1120
|
+
const decompositionNotes = input.decompositionNotes === undefined
|
|
1121
|
+
? ''
|
|
1122
|
+
: typeof input.decompositionNotes === 'string' && input.decompositionNotes.length <= 8_192
|
|
1123
|
+
? input.decompositionNotes.trim()
|
|
1124
|
+
: (() => {
|
|
1125
|
+
throw new ProfessionalSpecValidationError('decompositionNotes must be text no longer than 8192 characters.');
|
|
1126
|
+
})();
|
|
1127
|
+
return Object.freeze({
|
|
1128
|
+
kind: PROFESSIONAL_SPECIFICATION_KIND,
|
|
1129
|
+
schemaVersion: PROFESSIONAL_SPECIFICATION_SCHEMA_VERSION,
|
|
1130
|
+
protocolVersion: PROFESSIONAL_SPECIFICATION_PROTOCOL_VERSION,
|
|
1131
|
+
context: meaningfulText(input.context, 'context'),
|
|
1132
|
+
audience: Object.freeze({
|
|
1133
|
+
primary: meaningfulText(audience.primary, 'audience.primary'),
|
|
1134
|
+
affected: Object.freeze(meaningfulList(audience.affected, 'audience.affected')),
|
|
1135
|
+
}),
|
|
1136
|
+
outcome: Object.freeze({
|
|
1137
|
+
statement: meaningfulText(outcome.statement, 'outcome.statement'),
|
|
1138
|
+
measure: meaningfulText(outcome.measure, 'outcome.measure'),
|
|
1139
|
+
target: meaningfulText(outcome.target, 'outcome.target'),
|
|
1140
|
+
timeframe: meaningfulText(outcome.timeframe, 'outcome.timeframe'),
|
|
1141
|
+
}),
|
|
1142
|
+
functionalRequirements: Object.freeze(meaningfulList(input.functionalRequirements, 'functionalRequirements')),
|
|
1143
|
+
constraints: Object.freeze(meaningfulList(input.constraints, 'constraints')),
|
|
1144
|
+
evidenceExpectations: Object.freeze(meaningfulList(input.evidenceExpectations, 'evidenceExpectations')),
|
|
1145
|
+
failureModes: Object.freeze(meaningfulList(input.failureModes, 'failureModes')),
|
|
1146
|
+
rollback: meaningfulText(input.rollback, 'rollback'),
|
|
1147
|
+
scope: Object.freeze({
|
|
1148
|
+
inScope: Object.freeze(meaningfulList(scope.inScope, 'scope.inScope')),
|
|
1149
|
+
outOfScope: Object.freeze(meaningfulList(scope.outOfScope, 'scope.outOfScope')),
|
|
1150
|
+
}),
|
|
1151
|
+
acceptanceCriteria: Object.freeze(meaningfulList(input.acceptanceCriteria, 'acceptanceCriteria', { itemMin: 20 })),
|
|
1152
|
+
declaredSpecialists: Object.freeze([...orderedSpecialists]),
|
|
1153
|
+
businessRules: Object.freeze(businessRules),
|
|
1154
|
+
decompositionNotes,
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
532
1157
|
/**
|
|
533
1158
|
* Re-render the SPEC body from a structured set of answers and write it back
|
|
534
1159
|
* atomically. Preserves frontmatter values that the user (or `planr spec
|
|
@@ -541,6 +1166,7 @@ export async function shapeSpec(projectDir, config, specId, answers) {
|
|
|
541
1166
|
const spec = await readSpec(projectDir, config, specId);
|
|
542
1167
|
if (!spec)
|
|
543
1168
|
throw new Error(`Spec ${specId} not found.`);
|
|
1169
|
+
const professional = parseProfessionalSpecAnswers(answers);
|
|
544
1170
|
const today = new Date().toISOString().split('T')[0];
|
|
545
1171
|
// Carry through every frontmatter field that was already set, so we don't
|
|
546
1172
|
// accidentally erase user customizations on re-shape.
|
|
@@ -561,16 +1187,24 @@ export async function shapeSpec(projectDir, config, specId, answers) {
|
|
|
561
1187
|
created: typeof data.created === 'string' ? data.created : today,
|
|
562
1188
|
date: today,
|
|
563
1189
|
uiFiles,
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
1190
|
+
specificationContract: PROFESSIONAL_SPECIFICATION_CONTRACT,
|
|
1191
|
+
context: professional.context,
|
|
1192
|
+
audience: professional.audience,
|
|
1193
|
+
outcome: professional.outcome,
|
|
1194
|
+
functionalRequirements: professional.functionalRequirements,
|
|
1195
|
+
constraints: professional.constraints,
|
|
1196
|
+
evidenceExpectations: professional.evidenceExpectations,
|
|
1197
|
+
failureModes: professional.failureModes,
|
|
1198
|
+
rollback: professional.rollback,
|
|
1199
|
+
scope: professional.scope,
|
|
1200
|
+
acceptanceCriteria: professional.acceptanceCriteria,
|
|
1201
|
+
declaredSpecialists: professional.declaredSpecialists,
|
|
1202
|
+
businessRules: professional.businessRules,
|
|
1203
|
+
decompositionNotes: professional.decompositionNotes,
|
|
570
1204
|
projectName: config.projectName,
|
|
571
1205
|
}, config.templateOverrides);
|
|
572
1206
|
await atomicWriteFile(spec.specFile, content);
|
|
573
|
-
logger.debug(`Shaped spec ${spec.id} (status:
|
|
1207
|
+
logger.debug(`Shaped professional spec ${spec.id} (status: shaped)`);
|
|
574
1208
|
return { specFile: spec.specFile };
|
|
575
1209
|
}
|
|
576
1210
|
/**
|
|
@@ -586,19 +1220,43 @@ export async function destroySpec(projectDir, config, specId) {
|
|
|
586
1220
|
await fs.rm(resolved.dir, { recursive: true, force: true });
|
|
587
1221
|
logger.debug(`Destroyed spec ${specId}: ${resolved.dir}`);
|
|
588
1222
|
}
|
|
1223
|
+
async function renderSpecStoryContent(config, specId, id, title, body) {
|
|
1224
|
+
const slug = slugify(title);
|
|
1225
|
+
if (!slug)
|
|
1226
|
+
throw invalidDecomposition(`story ${id} title must produce a non-empty slug.`);
|
|
1227
|
+
const today = new Date().toISOString().split('T')[0];
|
|
1228
|
+
const acceptanceCriteria = (body.acceptanceCriteria ?? []).map((criterion, index) => typeof criterion === 'string'
|
|
1229
|
+
? { id: `AC-${String(index + 1).padStart(3, '0')}`, statement: criterion }
|
|
1230
|
+
: criterion);
|
|
1231
|
+
const content = await renderTemplate('spec/story.md.hbs', {
|
|
1232
|
+
id,
|
|
1233
|
+
slug,
|
|
1234
|
+
title,
|
|
1235
|
+
specId,
|
|
1236
|
+
schemaVersion: '1.7.0',
|
|
1237
|
+
status: 'pending',
|
|
1238
|
+
date: today,
|
|
1239
|
+
roleAction: body.roleAction,
|
|
1240
|
+
benefit: body.benefit,
|
|
1241
|
+
scope: body.scope || '',
|
|
1242
|
+
acceptanceCriteria,
|
|
1243
|
+
tasks: body.tasks || [],
|
|
1244
|
+
projectName: config.projectName,
|
|
1245
|
+
}, config.templateOverrides);
|
|
1246
|
+
return { slug, content };
|
|
1247
|
+
}
|
|
589
1248
|
/**
|
|
590
|
-
* List US-NNN files inside a spec's stories/ subdirectory.
|
|
591
|
-
* Returns IDs scoped to this spec — two specs can each have US-001.
|
|
1249
|
+
* List project-global US-NNN files inside a spec's stories/ subdirectory.
|
|
592
1250
|
*/
|
|
593
1251
|
export async function listSpecStories(specDir) {
|
|
594
1252
|
const storiesDir = getSpecStoriesDir(specDir);
|
|
595
1253
|
const exists = await fileExists(storiesDir);
|
|
596
1254
|
if (!exists)
|
|
597
1255
|
return [];
|
|
598
|
-
const files = await listFiles(storiesDir, /^US-\d{3}-.+\.md$/);
|
|
1256
|
+
const files = await listFiles(storiesDir, /^US-\d{3,}-.+\.md$/);
|
|
599
1257
|
const out = [];
|
|
600
1258
|
for (const filename of files.sort()) {
|
|
601
|
-
const m = filename.match(/^(US-\d{3})-(.+)\.md$/);
|
|
1259
|
+
const m = filename.match(/^(US-\d{3,})-(.+)\.md$/);
|
|
602
1260
|
if (!m)
|
|
603
1261
|
continue;
|
|
604
1262
|
const [, id, slug] = m;
|
|
@@ -626,26 +1284,10 @@ export async function createSpecStory(projectDir, config, specId, title, body) {
|
|
|
626
1284
|
throw new Error(`Spec ${specId} not found.`);
|
|
627
1285
|
const storiesDir = getSpecStoriesDir(resolved.dir);
|
|
628
1286
|
await ensureDir(storiesDir);
|
|
629
|
-
const
|
|
630
|
-
const
|
|
631
|
-
const id = await getNextId(storiesDir, prefix);
|
|
1287
|
+
const id = (await reservePlanningIds(projectDir, config, { US: 1 })).US[0];
|
|
1288
|
+
const { slug, content } = await renderSpecStoryContent(config, specId, id, title, body);
|
|
632
1289
|
const filename = `${id}-${slug}.md`;
|
|
633
1290
|
const filePath = path.join(storiesDir, filename);
|
|
634
|
-
const today = new Date().toISOString().split('T')[0];
|
|
635
|
-
const content = await renderTemplate('spec/story.md.hbs', {
|
|
636
|
-
id,
|
|
637
|
-
slug,
|
|
638
|
-
title,
|
|
639
|
-
specId,
|
|
640
|
-
schemaVersion: '1.0.0',
|
|
641
|
-
status: 'pending',
|
|
642
|
-
date: today,
|
|
643
|
-
roleAction: body.roleAction,
|
|
644
|
-
benefit: body.benefit,
|
|
645
|
-
scope: body.scope || '',
|
|
646
|
-
acceptanceCriteria: body.acceptanceCriteria || [],
|
|
647
|
-
projectName: config.projectName,
|
|
648
|
-
}, config.templateOverrides);
|
|
649
1291
|
await writeFile(filePath, content);
|
|
650
1292
|
return { id, slug, filePath };
|
|
651
1293
|
}
|
|
@@ -657,10 +1299,10 @@ export async function listSpecTasks(specDir) {
|
|
|
657
1299
|
const exists = await fileExists(tasksDir);
|
|
658
1300
|
if (!exists)
|
|
659
1301
|
return [];
|
|
660
|
-
const files = await listFiles(tasksDir, /^T-\d{3}-.+\.md$/);
|
|
1302
|
+
const files = await listFiles(tasksDir, /^T-\d{3,}-.+\.md$/);
|
|
661
1303
|
const out = [];
|
|
662
1304
|
for (const filename of files.sort()) {
|
|
663
|
-
const m = filename.match(/^(T-\d{3})-(.+)\.md$/);
|
|
1305
|
+
const m = filename.match(/^(T-\d{3,})-(.+)\.md$/);
|
|
664
1306
|
if (!m)
|
|
665
1307
|
continue;
|
|
666
1308
|
const [, id, slug] = m;
|
|
@@ -700,39 +1342,65 @@ export async function listSpecTasks(specDir) {
|
|
|
700
1342
|
}
|
|
701
1343
|
return out;
|
|
702
1344
|
}
|
|
703
|
-
|
|
704
|
-
export async function createSpecTask(projectDir, config, specId, input) {
|
|
705
|
-
const resolved = await resolveSpecDir(projectDir, config, specId);
|
|
706
|
-
if (!resolved)
|
|
707
|
-
throw new Error(`Spec ${specId} not found.`);
|
|
708
|
-
const tasksDir = getSpecTasksDir(resolved.dir);
|
|
709
|
-
await ensureDir(tasksDir);
|
|
1345
|
+
async function renderSpecTaskContent(config, specId, id, input) {
|
|
710
1346
|
const slug = slugify(input.title);
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
const id = await getNextId(tasksDir, 'T');
|
|
714
|
-
const filename = `${id}-${slug}.md`;
|
|
715
|
-
const filePath = path.join(tasksDir, filename);
|
|
1347
|
+
if (!slug)
|
|
1348
|
+
throw invalidDecomposition(`task ${id} title must produce a non-empty slug.`);
|
|
716
1349
|
const today = new Date().toISOString().split('T')[0];
|
|
1350
|
+
const rationale = input.rationale?.trim() ||
|
|
1351
|
+
`${input.title} is required for ${input.storyId}; the listed files define the expected ${input.type === 'UI' ? 'user-interface' : 'technical'} change surface.`;
|
|
1352
|
+
const rationaleSentences = rationale.split(/(?<=[.!?])\s+/u).filter(Boolean);
|
|
1353
|
+
if (rationaleSentences.length > 3) {
|
|
1354
|
+
throw new Error('Task rationale must contain 1-3 sentences.');
|
|
1355
|
+
}
|
|
1356
|
+
const dependsOn = input.dependsOn ?? [];
|
|
1357
|
+
if (dependsOn.some((dependencyId) => !/^T-\d{3,}$/u.test(dependencyId)) ||
|
|
1358
|
+
new Set(dependsOn).size !== dependsOn.length) {
|
|
1359
|
+
throw new Error('Task dependencies must be unique project-global T-NNN IDs.');
|
|
1360
|
+
}
|
|
1361
|
+
if (dependsOn.includes(id)) {
|
|
1362
|
+
throw new Error(`Task ${id} cannot depend on itself.`);
|
|
1363
|
+
}
|
|
717
1364
|
const content = await renderTemplate('spec/task.md.hbs', {
|
|
718
1365
|
id,
|
|
719
1366
|
slug,
|
|
720
1367
|
title: input.title,
|
|
721
1368
|
storyId: input.storyId,
|
|
722
1369
|
specId,
|
|
723
|
-
schemaVersion: '1.
|
|
1370
|
+
schemaVersion: '1.7.0',
|
|
724
1371
|
type: input.type,
|
|
725
1372
|
agent: input.agent,
|
|
726
1373
|
status: 'pending',
|
|
727
1374
|
date: today,
|
|
1375
|
+
rationale,
|
|
1376
|
+
dependsOn,
|
|
728
1377
|
filesCreate: input.filesCreate || [],
|
|
729
1378
|
filesModify: input.filesModify || [],
|
|
730
1379
|
filesPreserve: input.filesPreserve || [],
|
|
731
1380
|
objective: input.objective || '',
|
|
732
1381
|
technicalSpec: input.technicalSpec || '',
|
|
733
1382
|
testRequirements: input.testRequirements || '',
|
|
1383
|
+
reviewRisks: input.reviewRisks || [],
|
|
1384
|
+
browserSurfaces: input.browserSurfaces || [],
|
|
1385
|
+
acceptanceRefs: input.acceptanceRefs || [],
|
|
1386
|
+
acceptanceCriteria: input.acceptanceCriteria || [],
|
|
734
1387
|
projectName: config.projectName,
|
|
735
1388
|
}, config.templateOverrides);
|
|
1389
|
+
return { slug, content };
|
|
1390
|
+
}
|
|
1391
|
+
/** Create a new T-NNN task file under the spec's tasks/ directory. */
|
|
1392
|
+
export async function createSpecTask(projectDir, config, specId, input) {
|
|
1393
|
+
const resolved = await resolveSpecDir(projectDir, config, specId);
|
|
1394
|
+
if (!resolved)
|
|
1395
|
+
throw new Error(`Spec ${specId} not found.`);
|
|
1396
|
+
const tasksDir = getSpecTasksDir(resolved.dir);
|
|
1397
|
+
await ensureDir(tasksDir);
|
|
1398
|
+
// Task ID prefix: 'T' (single letter) by convention in spec mode
|
|
1399
|
+
// (vs agile mode's 'TASK'). Matches planr-pipeline schema.
|
|
1400
|
+
const id = (await reservePlanningIds(projectDir, config, { T: 1 })).T[0];
|
|
1401
|
+
const { slug, content } = await renderSpecTaskContent(config, specId, id, input);
|
|
1402
|
+
const filename = `${id}-${slug}.md`;
|
|
1403
|
+
const filePath = path.join(tasksDir, filename);
|
|
736
1404
|
await writeFile(filePath, content);
|
|
737
1405
|
return { id, slug, filePath };
|
|
738
1406
|
}
|
|
@@ -781,8 +1449,99 @@ export async function getSpecStatus(projectDir, config) {
|
|
|
781
1449
|
const totalTasks = specs.reduce((acc, s) => acc + s.taskCount, 0);
|
|
782
1450
|
return { specCount: specs.length, specs, totalStories, totalTasks };
|
|
783
1451
|
}
|
|
1452
|
+
const PROFESSIONAL_SPEC_REQUIRED_SECTIONS = Object.freeze([
|
|
1453
|
+
'Context & Goal',
|
|
1454
|
+
'Audience',
|
|
1455
|
+
'Outcome & Measurement',
|
|
1456
|
+
'Functional Requirements',
|
|
1457
|
+
'Constraints',
|
|
1458
|
+
'Evidence Expectations',
|
|
1459
|
+
'Failure Modes',
|
|
1460
|
+
'Rollback',
|
|
1461
|
+
'Scope Boundaries',
|
|
1462
|
+
'Acceptance Criteria',
|
|
1463
|
+
'Declared Risk Specialists',
|
|
1464
|
+
]);
|
|
1465
|
+
function markdownSection(content, heading, level = 2) {
|
|
1466
|
+
const lines = content.split(/\r?\n/u);
|
|
1467
|
+
const prefix = '#'.repeat(level);
|
|
1468
|
+
const start = lines.findIndex((line) => line.trim() === `${prefix} ${heading}`);
|
|
1469
|
+
if (start === -1)
|
|
1470
|
+
return null;
|
|
1471
|
+
const next = lines.findIndex((line, index) => index > start && new RegExp(`^#{1,${level}}\\s`, 'u').test(line));
|
|
1472
|
+
return lines
|
|
1473
|
+
.slice(start + 1, next === -1 ? undefined : next)
|
|
1474
|
+
.join('\n')
|
|
1475
|
+
.trim();
|
|
1476
|
+
}
|
|
1477
|
+
function sectionHasExplicitText(section) {
|
|
1478
|
+
return section
|
|
1479
|
+
.split(/\r?\n/u)
|
|
1480
|
+
.map((line) => line
|
|
1481
|
+
.replace(/^[-*+]\s+/u, '')
|
|
1482
|
+
.replace(/^\[[ xX]\]\s*/u, '')
|
|
1483
|
+
.replace(/^\*\*[^*]+:\*\*\s*/u, '')
|
|
1484
|
+
.trim())
|
|
1485
|
+
.some((line) => line.length >= 8 && !isPlaceholder(line));
|
|
1486
|
+
}
|
|
1487
|
+
/** Validate only documents that explicitly claim the professional marker. */
|
|
1488
|
+
export function validateProfessionalSpecDocument(content) {
|
|
1489
|
+
const issues = [];
|
|
1490
|
+
const sections = new Map();
|
|
1491
|
+
for (const heading of PROFESSIONAL_SPEC_REQUIRED_SECTIONS) {
|
|
1492
|
+
const section = markdownSection(content, heading);
|
|
1493
|
+
if (section === null) {
|
|
1494
|
+
issues.push(`Professional specification is missing the "${heading}" section.`);
|
|
1495
|
+
continue;
|
|
1496
|
+
}
|
|
1497
|
+
sections.set(heading, section);
|
|
1498
|
+
if (!sectionHasExplicitText(section)) {
|
|
1499
|
+
issues.push(`Professional specification section "${heading}" is not decision complete.`);
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
const audience = sections.get('Audience');
|
|
1503
|
+
if (audience) {
|
|
1504
|
+
if (!/^\*\*Primary:\*\*\s+\S.+$/mu.test(audience)) {
|
|
1505
|
+
issues.push('Professional specification Audience must name one primary audience.');
|
|
1506
|
+
}
|
|
1507
|
+
const affected = /^\*\*Affected:\*\*\s*$([\s\S]*)$/mu.exec(audience)?.[1]?.trim();
|
|
1508
|
+
if (!affected || !sectionHasExplicitText(affected)) {
|
|
1509
|
+
issues.push('Professional specification Audience must list affected audiences.');
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
const outcome = sections.get('Outcome & Measurement');
|
|
1513
|
+
if (outcome) {
|
|
1514
|
+
for (const label of ['Statement', 'Measure', 'Target', 'Timeframe']) {
|
|
1515
|
+
const escaped = label.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
1516
|
+
if (!new RegExp(`^\\*\\*${escaped}:\\*\\*\\s+\\S.{7,}$`, 'mu').test(outcome)) {
|
|
1517
|
+
issues.push(`Professional specification Outcome must include an explicit ${label}.`);
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
}
|
|
1521
|
+
const scope = sections.get('Scope Boundaries');
|
|
1522
|
+
if (scope) {
|
|
1523
|
+
for (const label of ['In Scope', 'Out of Scope']) {
|
|
1524
|
+
const boundary = markdownSection(`## Scope Boundaries\n${scope}`, label, 3);
|
|
1525
|
+
if (boundary === null || !sectionHasExplicitText(boundary)) {
|
|
1526
|
+
issues.push(`Professional specification Scope Boundaries must include ${label}.`);
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
const acceptance = sections.get('Acceptance Criteria');
|
|
1531
|
+
if (acceptance) {
|
|
1532
|
+
const criteria = acceptance
|
|
1533
|
+
.split(/\r?\n/u)
|
|
1534
|
+
.map((line) => /^- \[[ xX]\]\s+(.+)$/u.exec(line.trim())?.[1]?.trim())
|
|
1535
|
+
.filter((line) => Boolean(line));
|
|
1536
|
+
if (criteria.length === 0 ||
|
|
1537
|
+
criteria.some((criterion) => criterion.length < 20 || isPlaceholder(criterion))) {
|
|
1538
|
+
issues.push('Professional specification Acceptance Criteria must contain decision-complete checklist items.');
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
return issues;
|
|
1542
|
+
}
|
|
784
1543
|
/**
|
|
785
|
-
* Validate that a spec is ready
|
|
1544
|
+
* Validate that a spec is ready for host-native implementation.
|
|
786
1545
|
* Returns the list of issues, or empty array if ready.
|
|
787
1546
|
*/
|
|
788
1547
|
export async function validateSpecForPromotion(projectDir, config, specId) {
|
|
@@ -793,11 +1552,11 @@ export async function validateSpecForPromotion(projectDir, config, specId) {
|
|
|
793
1552
|
}
|
|
794
1553
|
const stories = await listSpecStories(spec.specDir);
|
|
795
1554
|
if (stories.length === 0) {
|
|
796
|
-
issues.push(`No User Stories found.
|
|
1555
|
+
issues.push(`No User Stories found. Invoke planr-plan for ${specId} first.`);
|
|
797
1556
|
}
|
|
798
1557
|
const tasks = await listSpecTasks(spec.specDir);
|
|
799
1558
|
if (tasks.length === 0) {
|
|
800
|
-
issues.push(`No Tasks found.
|
|
1559
|
+
issues.push(`No Tasks found. Invoke planr-plan for ${specId} first.`);
|
|
801
1560
|
}
|
|
802
1561
|
// Each story should have at least 1 task
|
|
803
1562
|
const storyIds = new Set(stories.map((s) => s.id));
|
|
@@ -811,6 +1570,14 @@ export async function validateSpecForPromotion(projectDir, config, specId) {
|
|
|
811
1570
|
if (spec.content.trim().length < 100) {
|
|
812
1571
|
issues.push(`Spec body is very short (< 100 chars). Run \`planr spec shape ${specId}\` to flesh it out.`);
|
|
813
1572
|
}
|
|
1573
|
+
const specificationContract = spec.data.specificationContract;
|
|
1574
|
+
if (specificationContract !== undefined &&
|
|
1575
|
+
specificationContract !== PROFESSIONAL_SPECIFICATION_CONTRACT) {
|
|
1576
|
+
issues.push('Spec declares an unsupported professional specification contract.');
|
|
1577
|
+
}
|
|
1578
|
+
else if (specificationContract === PROFESSIONAL_SPECIFICATION_CONTRACT) {
|
|
1579
|
+
issues.push(...validateProfessionalSpecDocument(spec.content));
|
|
1580
|
+
}
|
|
814
1581
|
return { ready: issues.length === 0, issues };
|
|
815
1582
|
}
|
|
816
1583
|
//# sourceMappingURL=spec-service.js.map
|