openplanr 2.2640.9 → 2.2641.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +14 -14
- package/bin/openplanr.js +13 -0
- package/bin/planr.js +5 -11
- package/dist/cli/commands/artifact.d.ts.map +1 -1
- package/dist/cli/commands/artifact.js +5 -4
- package/dist/cli/commands/artifact.js.map +1 -1
- package/dist/cli/commands/checklist.d.ts.map +1 -1
- package/dist/cli/commands/checklist.js +4 -3
- package/dist/cli/commands/checklist.js.map +1 -1
- package/dist/cli/commands/company.d.ts.map +1 -1
- package/dist/cli/commands/company.js +3 -2
- package/dist/cli/commands/company.js.map +1 -1
- package/dist/cli/commands/context.d.ts +1 -1
- package/dist/cli/commands/context.js +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +11 -5
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/export.d.ts +1 -1
- package/dist/cli/commands/export.js +1 -1
- package/dist/cli/commands/github.d.ts +1 -1
- package/dist/cli/commands/github.d.ts.map +1 -1
- package/dist/cli/commands/github.js +9 -8
- package/dist/cli/commands/github.js.map +1 -1
- package/dist/cli/commands/init-deterministic.d.ts.map +1 -1
- package/dist/cli/commands/init-deterministic.js +2 -1
- package/dist/cli/commands/init-deterministic.js.map +1 -1
- package/dist/cli/commands/linear.d.ts +2 -2
- package/dist/cli/commands/linear.d.ts.map +1 -1
- package/dist/cli/commands/linear.js +28 -27
- package/dist/cli/commands/linear.js.map +1 -1
- package/dist/cli/commands/operate/registrars/index.d.ts +1 -1
- package/dist/cli/commands/operate/registrars/index.d.ts.map +1 -1
- package/dist/cli/commands/operate/registrars/index.js +1 -1
- package/dist/cli/commands/operate/registrars/index.js.map +1 -1
- package/dist/cli/commands/operate/render.d.ts.map +1 -1
- package/dist/cli/commands/operate/render.js +2 -1
- package/dist/cli/commands/operate/render.js.map +1 -1
- package/dist/cli/commands/operate.d.ts.map +1 -1
- package/dist/cli/commands/operate.js +2 -1
- package/dist/cli/commands/operate.js.map +1 -1
- package/dist/cli/commands/planning-artifacts.d.ts.map +1 -1
- package/dist/cli/commands/planning-artifacts.js +2 -1
- package/dist/cli/commands/planning-artifacts.js.map +1 -1
- package/dist/cli/commands/quick/interaction.d.ts +1 -1
- package/dist/cli/commands/quick/interaction.d.ts.map +1 -1
- package/dist/cli/commands/quick/interaction.js +1 -1
- package/dist/cli/commands/quick/interaction.js.map +1 -1
- package/dist/cli/commands/quick/project.d.ts +1 -1
- package/dist/cli/commands/quick/project.d.ts.map +1 -1
- package/dist/cli/commands/quick/project.js +1 -1
- package/dist/cli/commands/quick/project.js.map +1 -1
- package/dist/cli/commands/report-linter.d.ts +1 -1
- package/dist/cli/commands/report-linter.js +1 -1
- package/dist/cli/commands/report.d.ts +1 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +5 -4
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +5 -4
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +11 -11
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +34 -33
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/cli/commands/sprint-refinement.d.ts.map +1 -1
- package/dist/cli/commands/sprint-refinement.js +2 -1
- package/dist/cli/commands/sprint-refinement.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +2 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/story/interaction.d.ts +1 -1
- package/dist/cli/commands/story/interaction.d.ts.map +1 -1
- package/dist/cli/commands/story/interaction.js +1 -1
- package/dist/cli/commands/story/interaction.js.map +1 -1
- package/dist/cli/commands/story/project.d.ts +1 -1
- package/dist/cli/commands/story/project.d.ts.map +1 -1
- package/dist/cli/commands/story/project.js +1 -1
- package/dist/cli/commands/story/project.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -1
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +3 -2
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/template.d.ts +1 -1
- package/dist/cli/commands/template.js +10 -10
- package/dist/cli/commands/template.js.map +1 -1
- package/dist/cli/commands/update.d.ts +1 -1
- package/dist/cli/commands/update.js +1 -1
- package/dist/cli/commands/upgrade.d.ts +1 -1
- package/dist/cli/commands/upgrade.d.ts.map +1 -1
- package/dist/cli/commands/upgrade.js +3 -2
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/voice.d.ts +1 -1
- package/dist/cli/commands/voice.js +1 -1
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-D7R6tnlX.js → index-DGyC7RDz.js} +115 -115
- package/dist/dashboard/assets/index-DGyC7RDz.js.map +1 -0
- package/dist/dashboard/dashboard-manifest.json +10 -10
- package/dist/dashboard/index.html +1 -1
- package/dist/generators/cursor-generator.js +1 -1
- package/dist/generators/cursor-generator.js.map +1 -1
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +2 -1
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +12 -12
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/artifact-service.d.ts +1 -1
- package/dist/services/artifact-service.js +2 -2
- package/dist/services/artifact-service.js.map +1 -1
- package/dist/services/audit-log-service.d.ts.map +1 -1
- package/dist/services/audit-log-service.js +2 -1
- package/dist/services/audit-log-service.js.map +1 -1
- package/dist/services/claude-plugin-service.d.ts +3 -1
- package/dist/services/claude-plugin-service.d.ts.map +1 -1
- package/dist/services/claude-plugin-service.js +9 -5
- package/dist/services/claude-plugin-service.js.map +1 -1
- package/dist/services/codex-plugin-service.d.ts.map +1 -1
- package/dist/services/codex-plugin-service.js +3 -2
- package/dist/services/codex-plugin-service.js.map +1 -1
- package/dist/services/company-auth-service.d.ts.map +1 -1
- package/dist/services/company-auth-service.js +2 -1
- package/dist/services/company-auth-service.js.map +1 -1
- package/dist/services/company-sync-service.d.ts.map +1 -1
- package/dist/services/company-sync-service.js +9 -8
- package/dist/services/company-sync-service.js.map +1 -1
- package/dist/services/config-service.d.ts +6 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +19 -4
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/connectors/checkpoint-custody.d.ts.map +1 -1
- package/dist/services/connectors/checkpoint-custody.js +4 -1
- package/dist/services/connectors/checkpoint-custody.js.map +1 -1
- package/dist/services/credentials-service.js +1 -1
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/delivery-status-service.d.ts +1 -1
- package/dist/services/delivery-status-service.d.ts.map +1 -1
- package/dist/services/delivery-status-service.js +3 -2
- package/dist/services/delivery-status-service.js.map +1 -1
- package/dist/services/diagram-authoring-service.d.ts.map +1 -1
- package/dist/services/diagram-authoring-service.js +2 -1
- package/dist/services/diagram-authoring-service.js.map +1 -1
- package/dist/services/diagram-pipeline-service.d.ts.map +1 -1
- package/dist/services/diagram-pipeline-service.js +6 -5
- package/dist/services/diagram-pipeline-service.js.map +1 -1
- package/dist/services/distribution-service.d.ts.map +1 -1
- package/dist/services/distribution-service.js +4 -3
- package/dist/services/distribution-service.js.map +1 -1
- package/dist/services/github-service.d.ts +1 -1
- package/dist/services/github-service.d.ts.map +1 -1
- package/dist/services/github-service.js +7 -6
- package/dist/services/github-service.js.map +1 -1
- package/dist/services/graph-integrity.d.ts +1 -1
- package/dist/services/graph-integrity.js +1 -1
- package/dist/services/landing/landing-service.d.ts.map +1 -1
- package/dist/services/landing/landing-service.js +4 -1
- package/dist/services/landing/landing-service.js.map +1 -1
- package/dist/services/landing/receipt-custody.d.ts.map +1 -1
- package/dist/services/landing/receipt-custody.js +3 -2
- package/dist/services/landing/receipt-custody.js.map +1 -1
- package/dist/services/linear/errors.d.ts.map +1 -1
- package/dist/services/linear/errors.js +2 -1
- package/dist/services/linear/errors.js.map +1 -1
- package/dist/services/linear/plan-builders.d.ts +3 -3
- package/dist/services/linear/plan-builders.d.ts.map +1 -1
- package/dist/services/linear/plan-builders.js +2 -2
- package/dist/services/linear/strategy-context.d.ts.map +1 -1
- package/dist/services/linear/strategy-context.js +6 -5
- package/dist/services/linear/strategy-context.js.map +1 -1
- package/dist/services/linear-mapping-service.d.ts +1 -1
- package/dist/services/linear-mapping-service.d.ts.map +1 -1
- package/dist/services/linear-mapping-service.js +3 -2
- package/dist/services/linear-mapping-service.js.map +1 -1
- package/dist/services/linear-pull-service.d.ts +1 -1
- package/dist/services/linear-pull-service.d.ts.map +1 -1
- package/dist/services/linear-pull-service.js +10 -9
- package/dist/services/linear-pull-service.js.map +1 -1
- package/dist/services/linear-push-service.d.ts +2 -2
- package/dist/services/linear-push-service.d.ts.map +1 -1
- package/dist/services/linear-push-service.js +17 -16
- package/dist/services/linear-push-service.js.map +1 -1
- package/dist/services/linear-service.d.ts +2 -2
- package/dist/services/linear-service.js +2 -2
- package/dist/services/linear-team-service.d.ts.map +1 -1
- package/dist/services/linear-team-service.js +2 -1
- package/dist/services/linear-team-service.js.map +1 -1
- package/dist/services/operate/assignment-packet-service.d.ts.map +1 -1
- package/dist/services/operate/assignment-packet-service.js +2 -1
- package/dist/services/operate/assignment-packet-service.js.map +1 -1
- package/dist/services/operate/delivery-evidence.d.ts.map +1 -1
- package/dist/services/operate/delivery-evidence.js +2 -1
- package/dist/services/operate/delivery-evidence.js.map +1 -1
- package/dist/services/operate/measurement-schedule-service.d.ts.map +1 -1
- package/dist/services/operate/measurement-schedule-service.js +2 -1
- package/dist/services/operate/measurement-schedule-service.js.map +1 -1
- package/dist/services/operate/path-custody.d.ts.map +1 -1
- package/dist/services/operate/path-custody.js +2 -1
- package/dist/services/operate/path-custody.js.map +1 -1
- package/dist/services/operate/pinned-legacy-replay-runner.d.ts.map +1 -1
- package/dist/services/operate/pinned-legacy-replay-runner.js +3 -2
- package/dist/services/operate/pinned-legacy-replay-runner.js.map +1 -1
- package/dist/services/operate/planning-handoff-service.d.ts.map +1 -1
- package/dist/services/operate/planning-handoff-service.js +3 -2
- package/dist/services/operate/planning-handoff-service.js.map +1 -1
- package/dist/services/operate/project-transaction-lock.d.ts.map +1 -1
- package/dist/services/operate/project-transaction-lock.js +2 -1
- package/dist/services/operate/project-transaction-lock.js.map +1 -1
- package/dist/services/operate/repository-read-service.d.ts.map +1 -1
- package/dist/services/operate/repository-read-service.js +5 -4
- package/dist/services/operate/repository-read-service.js.map +1 -1
- package/dist/services/operate/screened-evidence-service.d.ts.map +1 -1
- package/dist/services/operate/screened-evidence-service.js +5 -4
- package/dist/services/operate/screened-evidence-service.js.map +1 -1
- package/dist/services/operate/storage-layout.d.ts.map +1 -1
- package/dist/services/operate/storage-layout.js +8 -7
- package/dist/services/operate/storage-layout.js.map +1 -1
- package/dist/services/operate/store.d.ts.map +1 -1
- package/dist/services/operate/store.js +7 -6
- package/dist/services/operate/store.js.map +1 -1
- package/dist/services/pipeline-package-service.js +1 -1
- package/dist/services/pipeline-package-service.js.map +1 -1
- package/dist/services/provenance-service.d.ts.map +1 -1
- package/dist/services/provenance-service.js +2 -1
- package/dist/services/provenance-service.js.map +1 -1
- package/dist/services/report-linter-service.js +1 -1
- package/dist/services/report-linter-service.js.map +1 -1
- package/dist/services/revise-cache-service.d.ts.map +1 -1
- package/dist/services/revise-cache-service.js +2 -1
- package/dist/services/revise-cache-service.js.map +1 -1
- package/dist/services/runtime-manager/doctor.d.ts +13 -0
- package/dist/services/runtime-manager/doctor.d.ts.map +1 -1
- package/dist/services/runtime-manager/doctor.js +50 -3
- package/dist/services/runtime-manager/doctor.js.map +1 -1
- package/dist/services/runtime-manager/inventory.d.ts +1 -0
- package/dist/services/runtime-manager/inventory.d.ts.map +1 -1
- package/dist/services/runtime-manager/inventory.js +3 -1
- package/dist/services/runtime-manager/inventory.js.map +1 -1
- package/dist/services/runtime-manager-service.d.ts +4 -2
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +52 -33
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/dist/services/server-lifecycle-service.d.ts.map +1 -1
- package/dist/services/server-lifecycle-service.js +14 -9
- package/dist/services/server-lifecycle-service.js.map +1 -1
- package/dist/services/spec-service.d.ts +4 -4
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +9 -8
- package/dist/services/spec-service.js.map +1 -1
- package/dist/services/sprint-refinement-service.d.ts +6 -6
- package/dist/services/sprint-refinement-service.d.ts.map +1 -1
- package/dist/services/sprint-refinement-service.js +16 -16
- package/dist/services/sprint-refinement-service.js.map +1 -1
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +3 -1
- package/dist/services/template-service.js.map +1 -1
- package/dist/services/upgrade-offer-service.d.ts +2 -2
- package/dist/services/upgrade-offer-service.d.ts.map +1 -1
- package/dist/services/upgrade-offer-service.js +4 -3
- package/dist/services/upgrade-offer-service.js.map +1 -1
- package/dist/services/upgrade-report.d.ts +1 -1
- package/dist/services/upgrade-report.d.ts.map +1 -1
- package/dist/services/upgrade-report.js +5 -4
- package/dist/services/upgrade-report.js.map +1 -1
- package/dist/services/upgrade-service.d.ts +5 -5
- package/dist/services/upgrade-service.d.ts.map +1 -1
- package/dist/services/upgrade-service.js +14 -13
- package/dist/services/upgrade-service.js.map +1 -1
- package/dist/templates/backlog/backlog-item.md.hbs +1 -1
- package/dist/templates/checklists/agile-checklist.md.hbs +6 -6
- package/dist/templates/epics/epic.md.hbs +1 -1
- package/dist/templates/export/planning-report.html.hbs +1 -1
- package/dist/templates/export/planning-report.md.hbs +1 -1
- package/dist/templates/features/feature.md.hbs +1 -1
- package/dist/templates/guides/estimation.md.hbs +3 -12
- package/dist/templates/quick/quick-task.md.hbs +1 -1
- package/dist/templates/rules/cursor/create-epic.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/create-features.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/create-user-story.mdc.hbs +1 -1
- package/dist/templates/rules/cursor/openplanr.mdc.hbs +1 -1
- package/dist/templates/rules/shared/host-native-guidance.md.hbs +1 -1
- package/dist/templates/spec/spec-shaped.md.hbs +1 -1
- package/dist/templates/spec/spec.md.hbs +1 -1
- package/dist/templates/sprints/sprint-tasks.md.hbs +1 -1
- package/dist/templates/sprints/sprint.md.hbs +1 -1
- package/dist/templates/stories/user-story.md.hbs +1 -1
- package/dist/utils/constants.d.ts +8 -4
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +10 -4
- package/dist/utils/constants.js.map +1 -1
- package/docs/ARTIFACT_REVIEW.md +13 -13
- package/docs/CLI.md +249 -249
- package/docs/CROSS_RUNTIME_SETUP.md +33 -33
- package/docs/TROUBLESHOOTING.md +28 -28
- package/install.ps1 +2 -2
- package/install.sh +3 -3
- package/lib/host-packages/adapter-registry.json +5 -5
- package/lib/host-packages/capability-map.json +2 -2
- package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
- package/lib/host-packages/claude/openplanr/.openplanr-content.json +49 -45
- package/lib/host-packages/claude/openplanr/README.md +7 -7
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +2 -2
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-owner-custody.mjs +8 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +81 -46
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +9 -4
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +3 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +10 -3
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +12 -12
- package/lib/host-packages/claude/openplanr/skills/artifact/references/company-review.md +9 -9
- package/lib/host-packages/claude/openplanr/skills/artifact/references/design-sharing.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/artifact/references/diagram-sharing.md +3 -3
- package/lib/host-packages/claude/openplanr/skills/dashboard/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design/references/team-review.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +4 -4
- package/lib/host-packages/claude/openplanr/skills/design-loop/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/team-review.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +4 -4
- package/lib/host-packages/claude/openplanr/skills/design-review/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design-review/references/team-review.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +4 -4
- package/lib/host-packages/claude/openplanr/skills/diagram/SKILL.md +15 -15
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-document.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-intent-to-ir.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-sharing.md +3 -3
- package/lib/host-packages/claude/openplanr/skills/doctor/SKILL.md +9 -9
- package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +18 -16
- package/lib/host-packages/claude/openplanr/skills/land/SKILL.md +2 -2
- package/lib/host-packages/claude/openplanr/skills/plan/references/artifact-contract.md +5 -0
- package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +5 -0
- package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +12 -12
- package/lib/host-packages/claude/openplanr/skills/sprint/references/refinement-contract.md +5 -5
- package/lib/host-packages/claude/openplanr/skills/sprint/references/sprint-formats.md +8 -8
- package/lib/host-packages/claude/openplanr/skills/sprint/schemas/refinement.schema.json +3 -3
- package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +6 -6
- package/lib/host-packages/claude/openplanr/skills/sync/scripts/names.mjs +8 -0
- package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +3 -2
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +47 -43
- package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/company-review.md +9 -9
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/design-sharing.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/diagram-sharing.md +3 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +12 -12
- package/lib/host-packages/cursor/openplanr/rules/planr-dashboard.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/team-review.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +4 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/team-review.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +4 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/team-review.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +4 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-document.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-intent-to-ir.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-sharing.md +3 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram.mdc +15 -15
- package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +18 -16
- package/lib/host-packages/cursor/openplanr/rules/planr-doctor.mdc +9 -9
- package/lib/host-packages/cursor/openplanr/rules/planr-land.mdc +2 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/references/artifact-contract.md +5 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +5 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/refinement-contract.md +5 -5
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/sprint-formats.md +8 -8
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/schemas/refinement.schema.json +3 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +12 -12
- package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/names.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +3 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +6 -6
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-owner-custody.mjs +8 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +81 -46
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +9 -4
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +3 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +10 -3
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
- package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
- package/lib/host-packages/openai/openplanr/.openplanr-content.json +48 -44
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-owner-custody.mjs +8 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +81 -46
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +9 -4
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/lib/artifact/ui/studio-shell.css +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +3 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +10 -3
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +9 -1
- package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +12 -12
- package/lib/host-packages/openai/openplanr/skills/artifact/references/company-review.md +9 -9
- package/lib/host-packages/openai/openplanr/skills/artifact/references/design-sharing.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/artifact/references/diagram-sharing.md +3 -3
- package/lib/host-packages/openai/openplanr/skills/dashboard/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design/references/team-review.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +4 -4
- package/lib/host-packages/openai/openplanr/skills/design-loop/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/team-review.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +4 -4
- package/lib/host-packages/openai/openplanr/skills/design-review/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design-review/references/team-review.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +4 -4
- package/lib/host-packages/openai/openplanr/skills/diagram/SKILL.md +15 -15
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-document.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-intent-to-ir.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-sharing.md +3 -3
- package/lib/host-packages/openai/openplanr/skills/doctor/SKILL.md +9 -9
- package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +18 -16
- package/lib/host-packages/openai/openplanr/skills/land/SKILL.md +2 -2
- package/lib/host-packages/openai/openplanr/skills/plan/references/artifact-contract.md +5 -0
- package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +5 -0
- package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +12 -12
- package/lib/host-packages/openai/openplanr/skills/sprint/references/refinement-contract.md +5 -5
- package/lib/host-packages/openai/openplanr/skills/sprint/references/sprint-formats.md +8 -8
- package/lib/host-packages/openai/openplanr/skills/sprint/schemas/refinement.schema.json +3 -3
- package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +6 -6
- package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/sync/scripts/names.mjs +8 -0
- package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +3 -2
- package/lib/integrations.mjs +3 -2
- package/lib/names.d.mts +4 -0
- package/lib/names.mjs +8 -0
- package/lib/planning-folder.d.mts +14 -0
- package/lib/planning-folder.mjs +40 -0
- package/package.json +5 -5
- package/dist/dashboard/assets/index-D7R6tnlX.js.map +0 -1
- package/dist/templates/voice/standup.md.hbs +0 -20
- /package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-runtime-support-5cb7531bede8.mjs → design-runtime-support-336900df0d39.mjs} +0 -0
- /package/lib/host-packages/cursor/openplanr/runtime/design/scripts/{design-runtime-support-5cb7531bede8.mjs → design-runtime-support-336900df0d39.mjs} +0 -0
- /package/lib/host-packages/openai/openplanr/runtime/design/scripts/{design-runtime-support-5cb7531bede8.mjs → design-runtime-support-336900df0d39.mjs} +0 -0
|
@@ -52,6 +52,10 @@ import {
|
|
|
52
52
|
readJson,
|
|
53
53
|
reviewDigest
|
|
54
54
|
} from "./design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs";
|
|
55
|
+
import {
|
|
56
|
+
CLI_COMMAND,
|
|
57
|
+
PLANNING_FOLDER
|
|
58
|
+
} from "./design-owner-custody.mjs";
|
|
55
59
|
import {
|
|
56
60
|
planrHome
|
|
57
61
|
} from "./design-runtime-home.mjs";
|
|
@@ -410,8 +414,8 @@ ${fence}`;
|
|
|
410
414
|
var { createDesignReviewExport, serializeDesignReviewExport } = reviewExportTools();
|
|
411
415
|
|
|
412
416
|
// packages/design/lib/design/review.mjs
|
|
413
|
-
import { existsSync as
|
|
414
|
-
import { dirname as dirname4, join as
|
|
417
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4 } from "node:fs";
|
|
418
|
+
import { dirname as dirname4, join as join5, relative, resolve as resolve3 } from "node:path";
|
|
415
419
|
|
|
416
420
|
// packages/artifact/lib/artifact/review-server.mjs
|
|
417
421
|
import { existsSync, lstatSync, readdirSync, readFileSync, rmSync } from "node:fs";
|
|
@@ -1456,7 +1460,7 @@ function readReviewServerState(path) {
|
|
|
1456
1460
|
throw artifactError(
|
|
1457
1461
|
ARTIFACT_ERROR_CODES.LOOPBACK_STATE,
|
|
1458
1462
|
"Local Studio owner state is unsafe or malformed. The original record was preserved.",
|
|
1459
|
-
|
|
1463
|
+
`Run ${CLI_COMMAND} doctor and recover the owner record before starting or stopping this service.`
|
|
1460
1464
|
);
|
|
1461
1465
|
}
|
|
1462
1466
|
}
|
|
@@ -1533,6 +1537,34 @@ async function stopArtifactReviewServer(instanceId, { env = process.env, fetchIm
|
|
|
1533
1537
|
return controlRequest({ state }, "/internal/v1/shutdown", { method: "POST", fetchImpl });
|
|
1534
1538
|
}
|
|
1535
1539
|
|
|
1540
|
+
// packages/protocol/src/planning-folder.mjs
|
|
1541
|
+
import { existsSync as existsSync2, readdirSync as readdirSync2, statSync } from "node:fs";
|
|
1542
|
+
import { join as join2 } from "node:path";
|
|
1543
|
+
var FOREIGN_FILES = Object.freeze(["planr.config.json", "board.html"]);
|
|
1544
|
+
var GOAL_DIRECTORIES = Object.freeze(["tasks", "plans"]);
|
|
1545
|
+
var isDirectory = (path) => existsSync2(path) && statSync(path).isDirectory();
|
|
1546
|
+
function foreignPlanningFolderSigns(projectRoot2) {
|
|
1547
|
+
const folder = join2(projectRoot2, PLANNING_FOLDER);
|
|
1548
|
+
if (!isDirectory(folder) || existsSync2(join2(folder, "config.json"))) return [];
|
|
1549
|
+
const signs = FOREIGN_FILES.filter((name) => existsSync2(join2(folder, name)));
|
|
1550
|
+
for (const name of GOAL_DIRECTORIES) {
|
|
1551
|
+
const directory = join2(folder, name);
|
|
1552
|
+
if (isDirectory(directory) && readdirSync2(directory).some((entry) => entry.endsWith("-goal.md")))
|
|
1553
|
+
signs.push(`*-goal.md files in ${name}`);
|
|
1554
|
+
}
|
|
1555
|
+
return signs;
|
|
1556
|
+
}
|
|
1557
|
+
function planningFolderConflict(projectRoot2) {
|
|
1558
|
+
const signs = foreignPlanningFolderSigns(projectRoot2);
|
|
1559
|
+
if (signs.length === 0) return null;
|
|
1560
|
+
return Object.freeze({
|
|
1561
|
+
code: "E_PLANNING_FOLDER_FOREIGN",
|
|
1562
|
+
problem: `The ${PLANNING_FOLDER} folder in this project wasn't created by OpenPlanr: it has ${signs.join(", ")} and no OpenPlanr config.json. OpenPlanr wrote nothing there.`,
|
|
1563
|
+
fix: `Move or rename that folder, or use ${CLI_COMMAND} in a project without it, then retry.`,
|
|
1564
|
+
signs: Object.freeze(signs)
|
|
1565
|
+
});
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1536
1568
|
// packages/design/lib/design/design-plan-handoff.mjs
|
|
1537
1569
|
var clone = (value) => JSON.parse(canonicalizeJson(value));
|
|
1538
1570
|
function prepareDesignPlanHandoff(handoff, { subject } = {}) {
|
|
@@ -1571,7 +1603,7 @@ function prepareDesignPlanHandoff(handoff, { subject } = {}) {
|
|
|
1571
1603
|
// packages/design/lib/design/implementation-handoff.mjs
|
|
1572
1604
|
import { createHash, randomUUID } from "node:crypto";
|
|
1573
1605
|
import {
|
|
1574
|
-
existsSync as
|
|
1606
|
+
existsSync as existsSync3,
|
|
1575
1607
|
mkdirSync,
|
|
1576
1608
|
readFileSync as readFileSync2,
|
|
1577
1609
|
realpathSync,
|
|
@@ -1579,7 +1611,7 @@ import {
|
|
|
1579
1611
|
rmSync as rmSync2,
|
|
1580
1612
|
writeFileSync
|
|
1581
1613
|
} from "node:fs";
|
|
1582
|
-
import { dirname as dirname2, join as
|
|
1614
|
+
import { dirname as dirname2, join as join3, resolve as resolve2, sep } from "node:path";
|
|
1583
1615
|
|
|
1584
1616
|
// packages/design/lib/design/implementation-handoff-markdown.mjs
|
|
1585
1617
|
var line = (value) => String(value).replaceAll("\r\n", "\n").replaceAll("\r", "\n").trim().replaceAll("\n", " ").replace(/([\\`*_[\]<>#|])/gu, "\\$1");
|
|
@@ -1832,19 +1864,19 @@ function createRepositorySourceResolver(root) {
|
|
|
1832
1864
|
};
|
|
1833
1865
|
}
|
|
1834
1866
|
function implementationHandoffPaths(root) {
|
|
1835
|
-
const directory =
|
|
1867
|
+
const directory = join3(resolve2(root), "implementation-handoff");
|
|
1836
1868
|
return Object.freeze({
|
|
1837
1869
|
directory,
|
|
1838
|
-
draftJson:
|
|
1839
|
-
draftMarkdown:
|
|
1840
|
-
journal:
|
|
1841
|
-
current:
|
|
1842
|
-
history:
|
|
1870
|
+
draftJson: join3(directory, "draft.json"),
|
|
1871
|
+
draftMarkdown: join3(directory, "draft.md"),
|
|
1872
|
+
journal: join3(directory, "draft-publication.json"),
|
|
1873
|
+
current: join3(directory, "current.json"),
|
|
1874
|
+
history: join3(directory, "versions")
|
|
1843
1875
|
});
|
|
1844
1876
|
}
|
|
1845
1877
|
function recoverImplementationHandoffDraft(root) {
|
|
1846
1878
|
const paths = implementationHandoffPaths(root);
|
|
1847
|
-
if (!
|
|
1879
|
+
if (!existsSync3(paths.journal)) return false;
|
|
1848
1880
|
const journal = JSON.parse(readFileSync2(paths.journal, "utf8"));
|
|
1849
1881
|
const value = assertImplementationHandoffProjection(journal.package);
|
|
1850
1882
|
if (journal.markdown !== value.markdown)
|
|
@@ -1857,14 +1889,14 @@ function recoverImplementationHandoffDraft(root) {
|
|
|
1857
1889
|
function readImplementationHandoffDraft(root, { allowMissing = true } = {}) {
|
|
1858
1890
|
const paths = implementationHandoffPaths(root);
|
|
1859
1891
|
recoverImplementationHandoffDraft(root);
|
|
1860
|
-
if (!
|
|
1892
|
+
if (!existsSync3(paths.draftJson)) {
|
|
1861
1893
|
if (allowMissing) return null;
|
|
1862
1894
|
throw new Error("No implementation handoff draft exists.");
|
|
1863
1895
|
}
|
|
1864
1896
|
const value = assertImplementationHandoffProjection(
|
|
1865
1897
|
JSON.parse(readFileSync2(paths.draftJson, "utf8"))
|
|
1866
1898
|
);
|
|
1867
|
-
if (!
|
|
1899
|
+
if (!existsSync3(paths.draftMarkdown))
|
|
1868
1900
|
throw new Error("Implementation handoff Markdown is missing.");
|
|
1869
1901
|
if (readFileSync2(paths.draftMarkdown, "utf8") !== value.markdown)
|
|
1870
1902
|
throw new Error("Implementation handoff JSON and Markdown projections differ.");
|
|
@@ -1899,15 +1931,15 @@ function importImplementationHandoffPackage(input, { resolveSource } = {}) {
|
|
|
1899
1931
|
// packages/design/lib/design/implementation-handoff-approval.mjs
|
|
1900
1932
|
import { createHash as createHash2, randomUUID as randomUUID2 } from "node:crypto";
|
|
1901
1933
|
import {
|
|
1902
|
-
existsSync as
|
|
1934
|
+
existsSync as existsSync4,
|
|
1903
1935
|
mkdirSync as mkdirSync2,
|
|
1904
|
-
readdirSync as
|
|
1936
|
+
readdirSync as readdirSync3,
|
|
1905
1937
|
readFileSync as readFileSync3,
|
|
1906
1938
|
renameSync as renameSync2,
|
|
1907
1939
|
rmSync as rmSync3,
|
|
1908
1940
|
writeFileSync as writeFileSync2
|
|
1909
1941
|
} from "node:fs";
|
|
1910
|
-
import { dirname as dirname3, join as
|
|
1942
|
+
import { dirname as dirname3, join as join4 } from "node:path";
|
|
1911
1943
|
var DIGEST2 = /^sha256:[a-f0-9]{64}$/u;
|
|
1912
1944
|
var ID = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/u;
|
|
1913
1945
|
var APPROVE_CAPABILITY = "design:implementation-handoff:approve";
|
|
@@ -1996,20 +2028,20 @@ function implementationHandoffApprovalPaths(root) {
|
|
|
1996
2028
|
const base = implementationHandoffPaths(root);
|
|
1997
2029
|
return Object.freeze({
|
|
1998
2030
|
...base,
|
|
1999
|
-
events:
|
|
2000
|
-
journal:
|
|
2031
|
+
events: join4(base.directory, "events"),
|
|
2032
|
+
journal: join4(base.directory, "lifecycle-publication.json")
|
|
2001
2033
|
});
|
|
2002
2034
|
}
|
|
2003
2035
|
function archivePaths(root, value) {
|
|
2004
|
-
const directory =
|
|
2036
|
+
const directory = join4(implementationHandoffPaths(root).history, packageKey(value));
|
|
2005
2037
|
return {
|
|
2006
2038
|
directory,
|
|
2007
|
-
json:
|
|
2008
|
-
markdown:
|
|
2039
|
+
json: join4(directory, "handoff.json"),
|
|
2040
|
+
markdown: join4(directory, "handoff.md")
|
|
2009
2041
|
};
|
|
2010
2042
|
}
|
|
2011
2043
|
function eventPath(root, requestId) {
|
|
2012
|
-
return
|
|
2044
|
+
return join4(implementationHandoffApprovalPaths(root).events, `${requestKey(requestId)}.json`);
|
|
2013
2045
|
}
|
|
2014
2046
|
function readJson2(path, fallback = void 0) {
|
|
2015
2047
|
try {
|
|
@@ -2043,13 +2075,13 @@ function pointerFor(value, status, eventId, extra = {}) {
|
|
|
2043
2075
|
}
|
|
2044
2076
|
function writeLifecycleJournal(root, journal) {
|
|
2045
2077
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2046
|
-
if (
|
|
2078
|
+
if (existsSync4(paths.journal)) recoverImplementationHandoffApproval(root);
|
|
2047
2079
|
atomicText2(paths.journal, jsonBytes2(journal));
|
|
2048
2080
|
return recoverImplementationHandoffApproval(root);
|
|
2049
2081
|
}
|
|
2050
2082
|
function recoverImplementationHandoffApproval(root) {
|
|
2051
2083
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2052
|
-
if (!
|
|
2084
|
+
if (!existsSync4(paths.journal)) return false;
|
|
2053
2085
|
const journal = readJson2(paths.journal);
|
|
2054
2086
|
if (journal.kind !== "openplanr-design-implementation-handoff-lifecycle-publication" || journal.schemaVersion !== "1.0.0")
|
|
2055
2087
|
throw new TypeError("The implementation handoff lifecycle journal is invalid.");
|
|
@@ -2080,16 +2112,16 @@ function readImplementationHandoffVersion(root, identity) {
|
|
|
2080
2112
|
function listImplementationHandoffHistory(root) {
|
|
2081
2113
|
recoverImplementationHandoffApproval(root);
|
|
2082
2114
|
const directory = implementationHandoffPaths(root).history;
|
|
2083
|
-
if (!
|
|
2084
|
-
return
|
|
2085
|
-
(entry) => assertImplementationHandoffProjection(readJson2(
|
|
2115
|
+
if (!existsSync4(directory)) return [];
|
|
2116
|
+
return readdirSync3(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map(
|
|
2117
|
+
(entry) => assertImplementationHandoffProjection(readJson2(join4(directory, entry.name, "handoff.json")))
|
|
2086
2118
|
).sort((left, right) => left.version - right.version || left.id.localeCompare(right.id));
|
|
2087
2119
|
}
|
|
2088
2120
|
function readImplementationHandoffLifecycle(root) {
|
|
2089
2121
|
recoverImplementationHandoffApproval(root);
|
|
2090
2122
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2091
2123
|
const current = readJson2(paths.current, null);
|
|
2092
|
-
const events =
|
|
2124
|
+
const events = existsSync4(paths.events) ? readdirSync3(paths.events).filter((name) => name.endsWith(".json")).map((name) => readJson2(join4(paths.events, name))).sort(
|
|
2093
2125
|
(left, right) => left.at.localeCompare(right.at) || left.eventId.localeCompare(right.eventId)
|
|
2094
2126
|
) : [];
|
|
2095
2127
|
return Object.freeze({ current, history: listImplementationHandoffHistory(root), events });
|
|
@@ -2561,7 +2593,7 @@ function validateState(value, current) {
|
|
|
2561
2593
|
function projectRoot(root) {
|
|
2562
2594
|
let candidate = root;
|
|
2563
2595
|
while (true) {
|
|
2564
|
-
if (
|
|
2596
|
+
if (existsSync5(join5(candidate, PLANNING_FOLDER)) || existsSync5(join5(candidate, ".git")))
|
|
2565
2597
|
return candidate;
|
|
2566
2598
|
const parent = dirname4(candidate);
|
|
2567
2599
|
if (parent === candidate) return root;
|
|
@@ -2606,7 +2638,7 @@ function proposeImplementationPackage(file, env) {
|
|
|
2606
2638
|
designSpecPath(current.root),
|
|
2607
2639
|
...(current.sourceFiles ?? []).map((path) => resolve3(current.root, path))
|
|
2608
2640
|
])
|
|
2609
|
-
].filter((path) =>
|
|
2641
|
+
].filter((path) => existsSync5(path));
|
|
2610
2642
|
const sources = paths.map((path, index) => {
|
|
2611
2643
|
const logicalPath = relative(repository, path).replaceAll("\\", "/");
|
|
2612
2644
|
const extension = logicalPath.split(".").pop()?.toLowerCase();
|
|
@@ -2652,7 +2684,10 @@ function proposeImplementationPackage(file, env) {
|
|
|
2652
2684
|
};
|
|
2653
2685
|
}
|
|
2654
2686
|
async function persistDesignTaste(current, state) {
|
|
2655
|
-
const
|
|
2687
|
+
const root = projectRoot(current.root);
|
|
2688
|
+
const conflict = planningFolderConflict(root);
|
|
2689
|
+
if (conflict) throw new PipelineError(conflict.code, conflict.problem, conflict.fix);
|
|
2690
|
+
const path = join5(root, `${PLANNING_FOLDER}/design-system/taste.json`);
|
|
2656
2691
|
const release = await acquireStartLock(`${path}.lock`);
|
|
2657
2692
|
try {
|
|
2658
2693
|
const taste = readJson(path, { designs: {} });
|
|
@@ -2693,7 +2728,7 @@ async function saveDesignState(file, { state, revision, stateVersion }) {
|
|
|
2693
2728
|
throw Object.assign(new Error("The design changed. Reload before saving feedback."), {
|
|
2694
2729
|
statusCode: 409
|
|
2695
2730
|
});
|
|
2696
|
-
const path =
|
|
2731
|
+
const path = join5(current.root, ".design/studio-state.json");
|
|
2697
2732
|
const release = await acquireStartLock(`${path}.lock`);
|
|
2698
2733
|
try {
|
|
2699
2734
|
current = currentDesign(file);
|
|
@@ -2731,7 +2766,7 @@ var readBody = async (req) => JSON.parse(await readRequestBody(req, { maxBytes:
|
|
|
2731
2766
|
var readImplementationBody = async (req) => JSON.parse(await readRequestBody(req, { maxBytes: 5 * 1024 * 1024, encoding: "utf8" }));
|
|
2732
2767
|
async function startDesignReview(file, options = {}) {
|
|
2733
2768
|
const { root } = currentDesign(file);
|
|
2734
|
-
const release = await acquireStartLock(
|
|
2769
|
+
const release = await acquireStartLock(join5(root, ".design/start.lock"));
|
|
2735
2770
|
try {
|
|
2736
2771
|
return await startDesignReviewUnlocked(file, options);
|
|
2737
2772
|
} finally {
|
|
@@ -2752,7 +2787,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2752
2787
|
let current = currentDesign(file);
|
|
2753
2788
|
const applyInitialView = async () => {
|
|
2754
2789
|
if (view === void 0) return;
|
|
2755
|
-
const saved = readJson(
|
|
2790
|
+
const saved = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
2756
2791
|
state: {},
|
|
2757
2792
|
stateVersion: 0
|
|
2758
2793
|
});
|
|
@@ -2762,7 +2797,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2762
2797
|
state: { ...saved.state, view }
|
|
2763
2798
|
});
|
|
2764
2799
|
};
|
|
2765
|
-
const stateFile =
|
|
2800
|
+
const stateFile = join5(current.root, ".design/server.json");
|
|
2766
2801
|
const old = readJson(stateFile, null);
|
|
2767
2802
|
const services = (await listArtifactReviewServers({ env, fetchImpl })).filter(
|
|
2768
2803
|
(service) => service.kind === "design" && service.projectRoot === current.root
|
|
@@ -2839,7 +2874,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2839
2874
|
session.designRevision = current.revision;
|
|
2840
2875
|
},
|
|
2841
2876
|
renderDocument({ model, base }) {
|
|
2842
|
-
const state = readJson(
|
|
2877
|
+
const state = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
2843
2878
|
state: {}
|
|
2844
2879
|
}).state;
|
|
2845
2880
|
const stalePins = readDesignFeedback(file, env).pins.filter((pin) => pin.stale);
|
|
@@ -2892,7 +2927,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
2892
2927
|
respond(res, 200, readDesignHandoff(file, { env }));
|
|
2893
2928
|
} else if (route === "design-implementation-handoff" && req.method === "GET") {
|
|
2894
2929
|
const design = currentDesign(file);
|
|
2895
|
-
const unlock = await acquireStartLock(
|
|
2930
|
+
const unlock = await acquireStartLock(join5(design.root, ".design/render.lock"));
|
|
2896
2931
|
try {
|
|
2897
2932
|
const root = dirname4(designSpecPath(design.root));
|
|
2898
2933
|
let proposal = null;
|
|
@@ -2938,7 +2973,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
2938
2973
|
].includes(input.action))
|
|
2939
2974
|
throw new Error("Unknown implementation package action.");
|
|
2940
2975
|
const initial = currentDesign(file);
|
|
2941
|
-
const unlock = await acquireStartLock(
|
|
2976
|
+
const unlock = await acquireStartLock(join5(initial.root, ".design/render.lock"));
|
|
2942
2977
|
try {
|
|
2943
2978
|
const design = currentDesign(file);
|
|
2944
2979
|
const root = dirname4(designSpecPath(design.root));
|
|
@@ -3103,7 +3138,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3103
3138
|
else if (action === "recovery")
|
|
3104
3139
|
result = await exportDesignShareRecovery(file, {
|
|
3105
3140
|
...options,
|
|
3106
|
-
output:
|
|
3141
|
+
output: join5(
|
|
3107
3142
|
env.HOME ?? process.env.HOME,
|
|
3108
3143
|
"Downloads",
|
|
3109
3144
|
`openplanr-design-recovery-${Date.now()}.json`
|
|
@@ -3112,7 +3147,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3112
3147
|
else result = await manageDesignShare(file, action, options);
|
|
3113
3148
|
respond(res, 200, result);
|
|
3114
3149
|
} else if (route === "design-status" && req.method === "GET") {
|
|
3115
|
-
const ready = readJson(
|
|
3150
|
+
const ready = readJson(join5(current.root, ".design/browser-ready.json"), null);
|
|
3116
3151
|
respond(res, 200, {
|
|
3117
3152
|
ok: true,
|
|
3118
3153
|
documentId: current.document.id,
|
|
@@ -3123,7 +3158,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3123
3158
|
});
|
|
3124
3159
|
} else if (route === "design-state" && req.method === "GET") {
|
|
3125
3160
|
respond(res, 200, {
|
|
3126
|
-
...readJson(
|
|
3161
|
+
...readJson(join5(current.root, ".design/studio-state.json"), {
|
|
3127
3162
|
state: {},
|
|
3128
3163
|
stateVersion: 0
|
|
3129
3164
|
}),
|
|
@@ -3136,7 +3171,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3136
3171
|
const loadedArtifacts = new Set(Array.isArray(value?.artifacts) ? value.artifacts : []);
|
|
3137
3172
|
if (value.revision !== current.revision || value.status !== "ready" || !Array.isArray(value.artifacts) || value.artifacts.length === 0 || loadedArtifacts.size !== value.artifacts.length || value.artifacts.some((id) => !current.entries.some((entry) => entry.artifactId === id)))
|
|
3138
3173
|
throw new Error("Browser readiness must identify loaded design artboards.");
|
|
3139
|
-
atomicJson(
|
|
3174
|
+
atomicJson(join5(current.root, ".design/browser-ready.json"), {
|
|
3140
3175
|
status: "ready",
|
|
3141
3176
|
revision: current.revision,
|
|
3142
3177
|
artifacts: value.artifacts,
|
|
@@ -3145,7 +3180,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3145
3180
|
});
|
|
3146
3181
|
respond(res, 200, { ok: true });
|
|
3147
3182
|
} else if (route === "design-export" && req.method === "GET") {
|
|
3148
|
-
const state = readJson(
|
|
3183
|
+
const state = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
3149
3184
|
state: {}
|
|
3150
3185
|
}).state;
|
|
3151
3186
|
res.writeHead(200, {
|
|
@@ -3269,8 +3304,8 @@ async function resolveDesignPins(file, { pinIds, summary, env = process.env }) {
|
|
|
3269
3304
|
"One or more requested pins do not exist."
|
|
3270
3305
|
);
|
|
3271
3306
|
writeArtifactReviewState(path, createReviewLedger({ ...ledger, reviews: revisions }));
|
|
3272
|
-
const history = readJson(
|
|
3273
|
-
atomicJson(
|
|
3307
|
+
const history = readJson(join5(current.root, ".design/review-history.json"), []);
|
|
3308
|
+
atomicJson(join5(current.root, ".design/review-history.json"), [
|
|
3274
3309
|
...history,
|
|
3275
3310
|
{
|
|
3276
3311
|
revision: current.revision,
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
createChunkedWorkspaceClient
|
|
21
21
|
} from "./design-chunked-workspace-client.mjs";
|
|
22
22
|
import {
|
|
23
|
+
PLANNING_FOLDER,
|
|
23
24
|
ensurePrivateDirectory,
|
|
24
25
|
readCustody,
|
|
25
26
|
writeCustody
|
|
@@ -80,7 +81,7 @@ function custodyLocation(file, options = {}, { allowMissing = false } = {}) {
|
|
|
80
81
|
const root = resolve(options.custodyRoot ?? join(planrHome(env), "design-shares"));
|
|
81
82
|
let project = current.root;
|
|
82
83
|
for (let candidate = current.root; dirname(candidate) !== candidate; candidate = dirname(candidate)) {
|
|
83
|
-
if (existsSync(join(candidate, ".git")) || existsSync(join(candidate,
|
|
84
|
+
if (existsSync(join(candidate, ".git")) || existsSync(join(candidate, PLANNING_FOLDER))) {
|
|
84
85
|
project = candidate;
|
|
85
86
|
break;
|
|
86
87
|
}
|
|
@@ -684,7 +685,7 @@ function inside(base, candidate) {
|
|
|
684
685
|
return rel === "" || !rel.startsWith("..") && !isAbsolute2(rel);
|
|
685
686
|
}
|
|
686
687
|
function parseablePlanrConfig(root) {
|
|
687
|
-
const path = join2(root,
|
|
688
|
+
const path = join2(root, PLANNING_FOLDER, "config.json");
|
|
688
689
|
if (!existsSync3(path)) return false;
|
|
689
690
|
try {
|
|
690
691
|
if (lstatSync2(path).isSymbolicLink()) return false;
|
|
@@ -813,7 +814,11 @@ function resolveArtifactReviewDestination({
|
|
|
813
814
|
}
|
|
814
815
|
const projectRoot = findArtifactProjectRoot(cwd, { env });
|
|
815
816
|
if (projectRoot) {
|
|
816
|
-
const directory2 = assertSafeDestination(projectRoot, [
|
|
817
|
+
const directory2 = assertSafeDestination(projectRoot, [
|
|
818
|
+
PLANNING_FOLDER,
|
|
819
|
+
"artifacts",
|
|
820
|
+
artifactId
|
|
821
|
+
]);
|
|
817
822
|
return Object.freeze({
|
|
818
823
|
kind: "project",
|
|
819
824
|
artifactId,
|
|
@@ -1799,7 +1804,7 @@ async function importDesignShareRecovery(file, { input, ...options } = {}) {
|
|
|
1799
1804
|
const pending = custody.pendingCreate ?? custody.pendingMutation.body;
|
|
1800
1805
|
const destination = join3(root, "uploads", custody.id, pending.operationId);
|
|
1801
1806
|
if (existsSync4(destination)) {
|
|
1802
|
-
const { spoolChunkReader: spoolChunkReader2 } = await import("./design-runtime-support-
|
|
1807
|
+
const { spoolChunkReader: spoolChunkReader2 } = await import("./design-runtime-support-336900df0d39.mjs");
|
|
1803
1808
|
const reader = spoolChunkReader2(destination, pending);
|
|
1804
1809
|
for (const part of pending.manifest.chunks) await reader(part.index);
|
|
1805
1810
|
} else await copyUploadSpool(custody, destination);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/* generated by scripts/typescript/compile-sources.mjs from studio-shell.source.css */
|
|
2
|
-
.studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:flex;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{flex:1}.studio-toolbar-trailing{justify-content:flex-end}.studio-identity{min-width:0}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px)}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:flex;grid-template-columns:none;flex-wrap:wrap;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{flex:0 0 auto;flex-wrap:wrap;max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:52px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:100%;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-save-state,.design-preview-state){display:none}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;flex-wrap:wrap;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:min-content;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:min-content}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-trailing>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}
|
|
2
|
+
.studio-toolbar{min-width:0;min-height:54px;gap:12px;font:400 13px / 1.4 var(--planr-font-body, "DM Sans", sans-serif);box-sizing:border-box;display:flex;align-items:center;flex-wrap:nowrap;padding:0 16px;width:100%}.studio-toolbar .planr-brand{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.studio-toolbar .planr-mark{display:inline-flex;flex:none;width:28px;height:28px;color:var(--planr-color-primary)}.studio-toolbar .planr-mark svg{display:block;width:100%;height:100%}.studio-toolbar .design-wordmark{font-weight:500;white-space:nowrap;font-size:13px;color:var(--planr-color-text)}.studio-toolbar .design-wordmark>span{font-weight:600;color:var(--planr-color-primary)}.studio-toolbar .planr-title-block{display:flex;align-items:center;gap:7px;min-width:0}.studio-chrome-mount,.studio-panel-mount{display:contents}.studio-toolbar-leading,.studio-toolbar-trailing{min-width:0;display:flex;align-items:center;gap:8px}.studio-toolbar-leading{flex:1}.studio-toolbar-trailing{justify-content:flex-end}.studio-identity{min-width:0}.studio-toolbar .planr-title-block strong{max-width:min(25vw,300px)}.studio-subtitle,.studio-hierarchy{display:block;overflow:hidden;color:var(--planr-color-text-muted);font-size:10px;text-overflow:ellipsis;white-space:nowrap}.studio-hierarchy a{color:inherit}.studio-type-badge{display:inline-flex;flex:none;align-items:center;padding:2px 5px;border:1px solid var(--planr-color-rule);border-radius:var(--planr-radius-small, 5px);color:var(--planr-color-text-muted);font:500 10px / 1.2 var(--planr-font-body);white-space:nowrap}.studio-button,.studio-menu-content,.studio-tooltip,.studio-panel-dialog{border:1px solid var(--planr-color-rule);background:var(--planr-color-panel);color:var(--planr-color-text)}.studio-button{min-height:32px;display:inline-flex;justify-content:center;align-items:center;gap:6px;border-radius:var(--planr-radius-medium, 8px);padding:0 9px;font:500 13px / 1 var(--planr-font-body);cursor:pointer}.studio-button-ghost{background:transparent;border-color:transparent}.studio-button-primary{background:var(--planr-color-primary);border-color:var(--planr-color-primary);color:var(--planr-color-background)}.studio-button:not(:disabled):hover,.studio-button[aria-pressed=true],.studio-button[aria-expanded=true]{background:var(--planr-color-raised);color:var(--planr-color-primary)}.studio-button:disabled,.studio-menu-item[data-disabled]{opacity:0.45;cursor:not-allowed}.studio-button:focus-visible,.studio-menu-item:focus-visible{outline:2px solid var(--planr-color-primary);outline-offset:2px}.studio-menu{display:inline-flex}.studio-menu-content{min-width:180px;max-width:min(320px,calc(100vw - 16px));max-height:var(--radix-dropdown-menu-content-available-height);overflow-y:auto;padding:5px;z-index:160;border-radius:var(--planr-radius-medium, 8px);box-shadow:0 12px 30px color-mix(in srgb,var(--planr-color-background) 60%,transparent)}.studio-menu-item{width:100%;min-height:34px;padding:8px 10px;display:flex;align-items:center;text-align:left;border:0;border-radius:var(--planr-radius-small, 5px);background:transparent;color:inherit;font:500 13px / 1.3 var(--planr-font-body);cursor:pointer}.studio-menu-item[data-highlighted]{background:var(--planr-color-raised);outline:none;color:var(--planr-color-primary)}.studio-menu-group-start{border-top:1px solid var(--planr-color-rule);border-radius:0}.studio-tooltip{z-index:180;padding:6px 8px;border-radius:var(--planr-radius-small, 5px);font:12px / 1.4 var(--planr-font-body)}.studio-status{min-width:0;display:inline-flex;align-items:center;gap:4px;color:var(--planr-color-text-muted);font:10px / 1.3 var(--planr-font-body)}.studio-status[data-tone=error]{color:var(--planr-color-danger)}.studio-status .studio-button{width:24px;min-height:24px;padding:0}.studio-panel-overlay{position:absolute;inset:0;z-index:170;background:color-mix(in srgb,var(--planr-color-background) 72%,transparent)}.studio-panel-dialog{position:absolute;top:env(safe-area-inset-top,0px);bottom:env(safe-area-inset-bottom,0px);z-index:180;width:min(350px,calc(100% - 32px));box-shadow:0 8px 30px color-mix(in srgb,var(--planr-color-background) 50%,transparent)}.studio-panel-left{left:0}.studio-panel-right{right:0}.studio-panel-close{position:absolute;right:8px;top:8px;z-index:2;width:32px}.studio-panel-content{height:100%;min-height:0}.studio-panel-dialog .design-navigator,.studio-panel-dialog .planr-review-rail,.studio-panel-dialog .diagram-outline{position:static!important;width:100%!important;height:100%!important;max-height:100%!important;transform:none!important;overflow-y:auto;padding-top:42px;border:0}@media(max-width:680px){.studio-toolbar{gap:6px;padding-inline:8px}.studio-toolbar .planr-title-block strong{max-width:30vw}.studio-toolbar .design-wordmark{display:none}.studio-toolbar .design-button-label{display:none}.studio-toolbar .studio-status{max-width:90px}.studio-button{min-height:36px;padding-inline:8px}}.planr-shell[data-studio-framework=react]{--planr-toolbar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-shell[data-studio-framework=react] :is(.design-toolbar,.diagram-toolbar){display:flex;grid-template-columns:none;flex-wrap:wrap;min-height:var(--planr-toolbar-height);height:auto;padding-block:4px;overflow:visible}.planr-shell[data-studio-framework=react] .planr-brand{display:flex;gap:8px;max-width:none;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{flex:0 0 auto;flex-wrap:wrap;max-width:100%}.planr-shell[data-studio-framework=react] .design-toolbar .design-view-picker{display:inline-flex;width:auto;margin:0;border:0}.planr-shell[data-studio-framework=react] .design-export>button{display:inline-flex;width:auto;padding:0 9px}.planr-shell[data-studio-framework=react] .studio-menu-content{position:relative}.planr-shell[data-studio-framework=react] .planr-title-block{display:flex}.planr-shell[data-studio-framework=react]>.planr-workspace{position:relative}@media(max-width:680px){.planr-shell[data-studio-framework=react] .studio-toolbar.planr-toolbar{gap:2px;padding-inline:4px}.planr-shell[data-studio-framework=react] .studio-toolbar-leading,.planr-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:2px}.planr-shell[data-studio-framework=react] .planr-brand{overflow:hidden}.planr-shell[data-studio-framework=react] .studio-identity{display:block;overflow:hidden}.planr-shell[data-studio-framework=react] .planr-mark{width:22px;height:22px}.planr-shell[data-studio-framework=react] .design-view-picker{height:44px;gap:0}.planr-shell[data-studio-framework=react] .design-view-picker button{width:44px;height:100%;padding:0}.planr-shell[data-studio-framework=react] .studio-button{min-width:44px;min-height:44px}.planr-shell[data-studio-framework=react] :is(.design-save-state,.design-preview-state){display:none}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button{font-size:0;width:44px;padding:0}.planr-shell[data-studio-framework=react] :is(.design-export,.diagram-export)>button span{font-size:16px}}@media(max-width:960px){.planr-shell[data-studio-framework=react] .design-wordmark{display:none}.planr-shell[data-studio-framework=react] .planr-workspace>:is(.design-navigator,.planr-review-rail){top:0;max-height:100%}}@media(max-width:1240px){.planr-shell[data-studio-framework=react] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-shell[data-studio-framework=react] .planr-title-block strong{max-width:100%;line-height:1.1}.planr-shell[data-studio-framework=react] .design-preview-state{max-width:48px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.planr-diagram-editor[data-studio-framework=react]{--de-bar-height: 60px;grid-template-rows:auto minmax(0,1fr)}.planr-diagram-editor[data-studio-framework=react] .de-bar{display:block;padding:0;height:auto;overflow:visible;border-bottom:0}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar{min-height:60px;height:auto;flex-wrap:wrap;padding:4px 16px;border:0;border-bottom:1px solid var(--de-rule);background:var(--de-panel)}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar-leading{flex:1;min-width:min-content}.planr-diagram-editor[data-studio-framework=react] .studio-toolbar :is(.de-command-group,.studio-toolbar-trailing){flex:none}.planr-diagram-editor[data-studio-framework=react] .planr-brand{min-width:min-content;overflow:hidden}.planr-diagram-editor[data-studio-framework=react] .de-title{max-width:25vw;line-height:1.35}.planr-diagram-editor[data-studio-framework=react] .studio-subtitle .de-subtitle{line-height:1.3}.planr-diagram-editor[data-studio-framework=react] .de-alert{grid-row:2;top:var(--de-space-3)}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .design-wordmark,.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .studio-subtitle{display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=drawer] .planr-title-block{flex-direction:column;align-items:flex-start;gap:1px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar{padding:4px 8px;gap:8px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-toolbar-trailing{gap:4px}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .studio-menu:has([data-studio-palette-menu]){display:none}.planr-diagram-editor[data-studio-framework=react][data-layout~=compact] .de-more-menu{top:calc(100% + var(--de-space-2))}[data-studio-framework=react]{position:relative}[data-studio-framework=react] .studio-toolbar .studio-type-badge{display:inline-flex}[data-studio-framework=react] .studio-identity{flex:1;min-width:min-content}[data-studio-framework=react] .studio-toolbar .planr-title-block strong{contain:inline-size;display:block;align-self:stretch;width:auto;min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[data-studio-framework=react] .studio-subtitle{contain:inline-size}[data-studio-framework=react]:has(.studio-panel-dialog) [data-planr-close-feedback],[data-studio-framework=react]:has(.studio-panel-dialog) .planr-review-rail [data-planr-close-feedback]{display:none}.studio-panel-dialog .design-nav-close,.studio-panel-dialog .studio-panel-content .planr-review-rail [data-planr-close-feedback]{display:none}.studio-preserved-control{display:contents}.studio-toolbar fieldset.planr-segment{margin:0;padding:0;min-inline-size:0}.diagram-shell[data-present=true] .studio-toolbar-trailing>:not([data-action=present]):not(.studio-menu){display:none}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button{color:var(--planr-color-text);background:var(--planr-color-panel)}.diagram-shell[data-studio-framework=react] .diagram-presentation-nav button:enabled:hover{background:var(--planr-color-raised)}@media(max-width:680px){.studio-panel-close{width:44px;min-height:44px}}@media(max-width:700px){.diagram-shell[data-present=true] .studio-toolbar-leading{flex:none}.diagram-shell[data-present=true] .diagram-presentation-nav{min-width:0;flex:1;gap:4px}.diagram-shell[data-present=true] .diagram-presentation-nav>div{min-width:0}}@media(min-width:681px)and (max-width:960px){.diagram-shell[data-studio-framework=react] .studio-toolbar-trailing{gap:4px}}@media(max-width:480px){.studio-toolbar .planr-mark{display:none}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openplanr/design",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.4",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Canonical OpenPlanr design helpers and design-loop engine",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"node": ">=20.19.0"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@openplanr/artifact": "0.6.
|
|
50
|
-
"@openplanr/protocol": "0.10.
|
|
49
|
+
"@openplanr/artifact": "0.6.4",
|
|
50
|
+
"@openplanr/protocol": "0.10.2"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"test": "node --test --test-concurrency=2 tests/*.test.mjs",
|
|
@@ -62,14 +62,14 @@
|
|
|
62
62
|
background: var(--planr-color-raised); color:var(--planr-color-primary);
|
|
63
63
|
}
|
|
64
64
|
.design-view-picker {
|
|
65
|
-
align-self:
|
|
65
|
+
align-self:center; height:32px; gap:8px; padding:0; border:0; border-radius:0; background:transparent;
|
|
66
66
|
}
|
|
67
67
|
.design-view-picker button {
|
|
68
|
-
position:relative; display:flex; align-items:center; gap:7px; height:100%; padding:0 10px; border-radius:
|
|
68
|
+
position:relative; display:flex; align-items:center; gap:7px; height:100%; padding:0 10px; border-radius:6px;
|
|
69
69
|
font-size:12px; font-weight:550;
|
|
70
70
|
}
|
|
71
71
|
.design-view-picker button[aria-pressed="true"], .design-view-picker button:not(:disabled):hover {
|
|
72
|
-
background:
|
|
72
|
+
background:var(--planr-color-raised); color:var(--planr-color-text);
|
|
73
73
|
}
|
|
74
74
|
.design-view-picker button[aria-pressed="true"]::after {
|
|
75
75
|
content:""; position:absolute; bottom:0; left:10px; right:10px; height:2px; background:var(--planr-color-primary);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openplanr/protocol",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
"types": "./src/semver.d.mts",
|
|
28
28
|
"import": "./src/semver.mjs"
|
|
29
29
|
},
|
|
30
|
+
"./names": {
|
|
31
|
+
"types": "./src/names.d.mts",
|
|
32
|
+
"import": "./src/names.mjs"
|
|
33
|
+
},
|
|
34
|
+
"./planning-folder": {
|
|
35
|
+
"types": "./src/planning-folder.d.mts",
|
|
36
|
+
"import": "./src/planning-folder.mjs"
|
|
37
|
+
},
|
|
30
38
|
"./contracts": {
|
|
31
39
|
"types": "./src/contracts.d.mts",
|
|
32
40
|
"import": "./src/contracts.mjs"
|
|
@@ -1671,6 +1671,9 @@ import {
|
|
|
1671
1671
|
import { homedir as homedir2 } from "node:os";
|
|
1672
1672
|
import { dirname as dirname3, isAbsolute, join as join4, relative, resolve as resolve3 } from "node:path";
|
|
1673
1673
|
|
|
1674
|
+
// packages/protocol/src/names.mjs
|
|
1675
|
+
var PLANNING_FOLDER = ".planr";
|
|
1676
|
+
|
|
1674
1677
|
// packages/artifact/lib/artifact/internal/feedback.mjs
|
|
1675
1678
|
var FEEDBACK_FILE = "feedback.json";
|
|
1676
1679
|
|
|
@@ -1839,7 +1842,7 @@ function inside(base, candidate) {
|
|
|
1839
1842
|
return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
|
|
1840
1843
|
}
|
|
1841
1844
|
function parseablePlanrConfig(root) {
|
|
1842
|
-
const path = join4(root,
|
|
1845
|
+
const path = join4(root, PLANNING_FOLDER, "config.json");
|
|
1843
1846
|
if (!existsSync2(path)) return false;
|
|
1844
1847
|
try {
|
|
1845
1848
|
if (lstatSync3(path).isSymbolicLink()) return false;
|
|
@@ -1968,7 +1971,11 @@ function resolveArtifactReviewDestination({
|
|
|
1968
1971
|
}
|
|
1969
1972
|
const projectRoot = findArtifactProjectRoot(cwd, { env });
|
|
1970
1973
|
if (projectRoot) {
|
|
1971
|
-
const directory2 = assertSafeDestination(projectRoot, [
|
|
1974
|
+
const directory2 = assertSafeDestination(projectRoot, [
|
|
1975
|
+
PLANNING_FOLDER,
|
|
1976
|
+
"artifacts",
|
|
1977
|
+
artifactId
|
|
1978
|
+
]);
|
|
1972
1979
|
return Object.freeze({
|
|
1973
1980
|
kind: "project",
|
|
1974
1981
|
artifactId,
|
|
@@ -2533,7 +2540,7 @@ function custodyLocation(file, options = {}, { allowMissing = false } = {}) {
|
|
|
2533
2540
|
const root = resolve5(options.custodyRoot ?? join7(planrHome(env), "design-shares"));
|
|
2534
2541
|
let project = current.root;
|
|
2535
2542
|
for (let candidate = current.root; dirname5(candidate) !== candidate; candidate = dirname5(candidate)) {
|
|
2536
|
-
if (existsSync4(join7(candidate, ".git")) || existsSync4(join7(candidate,
|
|
2543
|
+
if (existsSync4(join7(candidate, ".git")) || existsSync4(join7(candidate, PLANNING_FOLDER))) {
|
|
2537
2544
|
project = candidate;
|
|
2538
2545
|
break;
|
|
2539
2546
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openplanr/protocol",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
"types": "./src/semver.d.mts",
|
|
28
28
|
"import": "./src/semver.mjs"
|
|
29
29
|
},
|
|
30
|
+
"./names": {
|
|
31
|
+
"types": "./src/names.d.mts",
|
|
32
|
+
"import": "./src/names.mjs"
|
|
33
|
+
},
|
|
34
|
+
"./planning-folder": {
|
|
35
|
+
"types": "./src/planning-folder.d.mts",
|
|
36
|
+
"import": "./src/planning-folder.mjs"
|
|
37
|
+
},
|
|
30
38
|
"./contracts": {
|
|
31
39
|
"types": "./src/contracts.d.mts",
|
|
32
40
|
"import": "./src/contracts.mjs"
|
|
@@ -6,23 +6,23 @@ license: MIT
|
|
|
6
6
|
|
|
7
7
|
# OpenPlanr Artifact
|
|
8
8
|
|
|
9
|
-
Use the deterministic `
|
|
9
|
+
Use the deterministic `openplanr artifact` utility when it is installed. Never
|
|
10
10
|
relaunch the active coding agent from inside this skill.
|
|
11
11
|
|
|
12
|
-
1. For local review, run `
|
|
13
|
-
`
|
|
12
|
+
1. For local review, run `openplanr artifact <file>` or
|
|
13
|
+
`openplanr artifact open <file>`. Use `--no-open --json` in headless sessions.
|
|
14
14
|
Generic artifacts default to the edge-to-edge `document` presentation. Use
|
|
15
15
|
`--presentation canvas` only for an explicitly spatial or zoomable review,
|
|
16
16
|
or `--presentation document` to force the reading surface.
|
|
17
17
|
2. For a diagram manifest or authored bundle, read
|
|
18
|
-
[diagram-sharing.md](references/diagram-sharing.md). `
|
|
18
|
+
[diagram-sharing.md](references/diagram-sharing.md). `openplanr artifact share
|
|
19
19
|
<manifest-or-bundle>` creates a native permanent encrypted review with a stable
|
|
20
20
|
URL and a separately entered access token. Use the local **Share diagram**
|
|
21
|
-
dialog to copy it. Publish only an explicitly requested update with `
|
|
22
|
-
artifact publish <manifest-or-bundle>`; synchronize feedback with `
|
|
21
|
+
dialog to copy it. Publish only an explicitly requested update with `openplanr
|
|
22
|
+
artifact publish <manifest-or-bundle>`; synchronize feedback with `openplanr
|
|
23
23
|
artifact sync <manifest-or-bundle>`. Verify the actual shared native canvas,
|
|
24
24
|
fonts and source revision before describing the hosted result as verified.
|
|
25
|
-
Sharing is always explicit. Run `
|
|
25
|
+
Sharing is always explicit. Run `openplanr artifact share <file>` only after the
|
|
26
26
|
user asks to share. Before sharing or publishing a design document, read
|
|
27
27
|
[design-sharing.md](references/design-sharing.md) and author or refresh its
|
|
28
28
|
sibling `review-context.json` in this active host session. Ground the welcome
|
|
@@ -33,20 +33,20 @@ relaunch the active coding agent from inside this skill.
|
|
|
33
33
|
token. Owner credentials save privately outside the project; copy the reviewer
|
|
34
34
|
token through the studio's Share dialog, never put it in a URL or ordinary
|
|
35
35
|
command output. Publish an explicitly requested update with
|
|
36
|
-
`
|
|
37
|
-
with `
|
|
36
|
+
`openplanr artifact publish <design-document.json>`; synchronize reviewer feedback
|
|
37
|
+
with `openplanr artifact sync <design-document.json>`. Hosted sharing requires the
|
|
38
38
|
configured compatible service. An unavailable service must be reported, not
|
|
39
39
|
described as a successful share. Generic HTML retains its existing expiring
|
|
40
40
|
live-room and `--snapshot` fragment/short-link behavior; reviewer, owner-verdict,
|
|
41
41
|
and management authority remain separate.
|
|
42
|
-
3. For returned feedback, run `
|
|
42
|
+
3. For returned feedback, run `openplanr artifact import <review-url>`. Do not add
|
|
43
43
|
`--allow-stale` by default. Show the stale-review preview and, when the user
|
|
44
44
|
has not already chosen, use the host's native question UI to offer import or
|
|
45
45
|
skip.
|
|
46
46
|
4. Export a completed local session with
|
|
47
|
-
`
|
|
47
|
+
`openplanr artifact export <session-id> --format json|markdown`.
|
|
48
48
|
5. If the pipeline package is unavailable, report the exact corrective command
|
|
49
|
-
printed by `
|
|
49
|
+
printed by `openplanr`; do not bypass the runtime lock or managed state.
|
|
50
50
|
|
|
51
51
|
Local review is loopback-only. Opening, approving, finishing, or importing an
|
|
52
52
|
artifact never publishes it automatically.
|