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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Three durable outputs and one chat return. The CLI writes the first three from
|
|
4
4
|
the two JSON inputs below; when it is unavailable, write the same files by hand.
|
|
5
5
|
|
|
6
|
-
## `sprint.json` (input to `
|
|
6
|
+
## `sprint.json` (input to `openplanr sprint create --data`)
|
|
7
7
|
|
|
8
8
|
```json
|
|
9
9
|
{
|
|
@@ -17,7 +17,7 @@ the two JSON inputs below; when it is unavailable, write the same files by hand.
|
|
|
17
17
|
|
|
18
18
|
`endDate` defaults to `releaseCut`, or to `startDate` plus the duration when no
|
|
19
19
|
cut is known. `status` may be `planned` or `active` (default). Omit `taskIds`
|
|
20
|
-
and `batches`; `
|
|
20
|
+
and `batches`; `openplanr sprint refinement` fills them from the refinement
|
|
21
21
|
document.
|
|
22
22
|
|
|
23
23
|
## Sprint artifact
|
|
@@ -64,11 +64,11 @@ refinedAt: "2026-09-17"
|
|
|
64
64
|
- [ ] **QT-194** Release cut 25 Sep · hours · [view](../quick/QT-194-release-cut-25-sep.md)
|
|
65
65
|
|
|
66
66
|
## Retrospective
|
|
67
|
-
_Complete this section when closing the sprint with `
|
|
67
|
+
_Complete this section when closing the sprint with `openplanr sprint close SPRINT-004`._
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
Each task line is `- [ ] **ID** title · effort · [view](relative path)`.
|
|
71
|
-
`
|
|
71
|
+
`openplanr status`, `openplanr sprint close` and the dashboard read these lines; tick a
|
|
72
72
|
box when the item ships. `releaseCut` is absent when no release profile exists;
|
|
73
73
|
`capacityDays` and `refinedAt` are absent until a refinement is recorded.
|
|
74
74
|
|
|
@@ -84,20 +84,20 @@ run can diff against it:
|
|
|
84
84
|
- **Refuter verdicts**: every correction verbatim, with its lens.
|
|
85
85
|
- **In progress** by batch, then **Plan next**, **Blocked** and **Close or
|
|
86
86
|
demote** in full, since only In progress goes into the sprint.
|
|
87
|
-
- **Leftovers** (after `
|
|
88
|
-
`
|
|
87
|
+
- **Leftovers** (after `openplanr sprint close`) and **Applied** (after
|
|
88
|
+
`openplanr sprint apply`).
|
|
89
89
|
|
|
90
90
|
## Machine-readable copy
|
|
91
91
|
|
|
92
92
|
`.planr/sprints/SPRINT-NNN/refinement.json`: the document described in
|
|
93
93
|
[the refinement contract](refinement-contract.md), validated against the JSON
|
|
94
94
|
Schema packaged as `schemas/refinement.schema.json` (linked from the skill
|
|
95
|
-
entrypoint). The dashboard, `
|
|
95
|
+
entrypoint). The dashboard, `openplanr sprint diff` and `openplanr sprint apply` consume
|
|
96
96
|
it.
|
|
97
97
|
|
|
98
98
|
## Status write-back
|
|
99
99
|
|
|
100
|
-
Only on approval through the structured question. `
|
|
100
|
+
Only on approval through the structured question. `openplanr sprint apply
|
|
101
101
|
SPRINT-NNN --yes --commit` writes each close, demote or blocked row's
|
|
102
102
|
`targetStatus`, `targetPriority` and `blockedBy` to the artifacts and commits the
|
|
103
103
|
sprint, the note, the JSON and the changed artifacts as one commit:
|
package/lib/host-packages/cursor/openplanr/rules/planr-sprint/schemas/refinement.schema.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openplanr.dev/schemas/skills/planr-sprint/refinement.schema.json",
|
|
4
4
|
"title": "OpenPlanr sprint refinement document",
|
|
5
|
-
"description": "One backlog refinement run: inputs, every open item's judgement, the four buckets, the in-progress batches and the refuter corrections. Written by the planr-sprint skill and validated by
|
|
5
|
+
"description": "One backlog refinement run: inputs, every open item's judgement, the four buckets, the in-progress batches and the refuter corrections. Written by the planr-sprint skill and validated by openplanr sprint refinement.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["schemaVersion", "sprintId", "refinedAt", "inputs", "items", "buckets"],
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
}
|
|
103
103
|
},
|
|
104
104
|
"leftovers": {
|
|
105
|
-
"description": "Written by
|
|
105
|
+
"description": "Written by openplanr sprint close.",
|
|
106
106
|
"type": "array",
|
|
107
107
|
"items": {
|
|
108
108
|
"type": "object",
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
117
|
"applied": {
|
|
118
|
-
"description": "Written by
|
|
118
|
+
"description": "Written by openplanr sprint apply.",
|
|
119
119
|
"type": "object",
|
|
120
120
|
"additionalProperties": false,
|
|
121
121
|
"required": ["at", "updates"],
|
|
@@ -10,7 +10,7 @@ item in full and judges it against the default branch and the calendar.
|
|
|
10
10
|
**Select** fits the surviving items to the stated capacity and the next release
|
|
11
11
|
cut, refutes the picks with three independent lenses, and writes the sprint.
|
|
12
12
|
Perform the reasoning in this session; never delegate it to a model subprocess.
|
|
13
|
-
The CLI (`
|
|
13
|
+
The CLI (`openplanr sprint …`) stores what this skill decides. It is optional: when
|
|
14
14
|
it is unavailable, write the same files by hand in the shapes given in
|
|
15
15
|
[sprint formats](planr-sprint/references/sprint-formats.md).
|
|
16
16
|
|
|
@@ -33,7 +33,7 @@ capability; it never blocks the run. Name every degraded input in `Issues`.
|
|
|
33
33
|
| Git history and the code paths items cite | Evidence lens: stale, already fixed, premise false | Buckets rest on the items' own dates; say "not verified against code" |
|
|
34
34
|
| Release profile (`.release/profile.md`: cut date, cadence, freezes) | Size the In-progress bucket to the cut; the sprint gets `releaseCut` | Ask once for a horizon; default to a two-week sprint from today |
|
|
35
35
|
| Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
|
|
36
|
-
| Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `
|
|
36
|
+
| Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `openplanr sprint diff` is possible | First run, no diff |
|
|
37
37
|
| Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
|
|
38
38
|
| Linear or GitHub connector | Push statuses on approval, read PR state | Local files only; report the external step as not run |
|
|
39
39
|
|
|
@@ -89,7 +89,7 @@ the cheapest refutations.
|
|
|
89
89
|
|
|
90
90
|
Carry the previous Operate cycle's unfinished actions explicitly. Include the
|
|
91
91
|
release cut itself as work; when it has no artifact yet, file it with
|
|
92
|
-
`
|
|
92
|
+
`openplanr quick create "Release cut <date>"` so the sprint contains only artifact
|
|
93
93
|
ids.
|
|
94
94
|
|
|
95
95
|
## Step 4: Refute the In-progress bucket
|
|
@@ -113,9 +113,9 @@ Write the three durable outputs (formats in
|
|
|
113
113
|
them.
|
|
114
114
|
|
|
115
115
|
```bash
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
openplanr sprint create --data sprint.json --json # name, releaseCut, capacityDays, startDate
|
|
117
|
+
openplanr sprint refinement SPRINT-NNN --data refinement.json --json # validates, stores the note and JSON, fills the sprint body
|
|
118
|
+
openplanr sprint diff SPRINT-MMM SPRINT-NNN # when a previous run exists
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
`refinement.json` must satisfy [the schema](planr-sprint/schemas/refinement.schema.json); the
|
|
@@ -130,16 +130,16 @@ write-back, or leave the proposal as written.
|
|
|
130
130
|
## Step 6: On approval, apply
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
openplanr sprint apply SPRINT-NNN --dry-run # show the status and priority changes
|
|
134
|
+
openplanr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
Where a connector is configured, push each changed item afterwards
|
|
138
|
-
(`
|
|
138
|
+
(`openplanr linear push <id>`, `openplanr github push <id>`) and report the ones that
|
|
139
139
|
were not pushed. When the CLI is unavailable, apply the same status changes with
|
|
140
140
|
the repository's own vocabulary and commit them with the same message.
|
|
141
141
|
|
|
142
|
-
Close a finished sprint with `
|
|
142
|
+
Close a finished sprint with `openplanr sprint close SPRINT-NNN`; it records the
|
|
143
143
|
leftovers the next run carries.
|
|
144
144
|
|
|
145
145
|
## Rules from production use
|
|
@@ -151,7 +151,7 @@ leftovers the next run carries.
|
|
|
151
151
|
the question that unblocks them.
|
|
152
152
|
- The list must fit the stated capacity; if it does not, say what was cut.
|
|
153
153
|
- No new migration in a hand deploy unless the sprint says so explicitly.
|
|
154
|
-
- Use the repository's own status vocabulary (`
|
|
154
|
+
- Use the repository's own status vocabulary (`openplanr update --help` lists it);
|
|
155
155
|
never introduce a second one.
|
|
156
156
|
- The note and the JSON are the durable output; the chat return is a view of
|
|
157
157
|
them. That is what keeps the third run from re-arguing the first two.
|
|
@@ -178,7 +178,7 @@ and identify incomplete evidence or blocked inputs with their recovery action.
|
|
|
178
178
|
The note and JSON remain complete and unchanged in shape. Omit empty chat sections;
|
|
179
179
|
different summary wording never causes another sprint creation or write-back.
|
|
180
180
|
|
|
181
|
-
`
|
|
181
|
+
`openplanr status` shows the active sprint with its cut and progress; the dashboard
|
|
182
182
|
(`planr-dashboard`) renders the sprint from the same frontmatter and checkboxes.
|
|
183
183
|
|
|
184
184
|
## Reference files
|
|
@@ -7,7 +7,7 @@ alwaysApply: false
|
|
|
7
7
|
|
|
8
8
|
Inspect delivery state read-only in the active session. Read the repository's
|
|
9
9
|
planning artifacts, task statuses, dependency graph, current branch, and relevant
|
|
10
|
-
runtime markers directly. Use the optional deterministic `
|
|
10
|
+
runtime markers directly. Use the optional deterministic `openplanr status --json`
|
|
11
11
|
utility when available, but do not require it or a semantic subprocess.
|
|
12
12
|
|
|
13
13
|
Add GitHub or Linear lookups only when the user requests live remote state. Keep
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
// The planning folder and command names that every package and generated copy reads.
|
|
3
|
+
|
|
4
|
+
/** @type {typeof import('./names.d.mts').PLANNING_FOLDER} */
|
|
5
|
+
export const PLANNING_FOLDER = '.planr';
|
|
6
|
+
|
|
7
|
+
/** @type {typeof import('./names.d.mts').CLI_COMMAND} */
|
|
8
|
+
export const CLI_COMMAND = 'openplanr';
|
|
@@ -5,6 +5,7 @@ import { access, readFile } from 'node:fs/promises';
|
|
|
5
5
|
import { resolve } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
|
+
import { CLI_COMMAND, PLANNING_FOLDER } from './names.mjs';
|
|
8
9
|
|
|
9
10
|
const execFileAsync = promisify(execFile);
|
|
10
11
|
const LINEAR_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
@@ -109,7 +110,7 @@ async function readJsonInput(value, stdin) {
|
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
async function inspectLocal(cwd) {
|
|
112
|
-
const candidates = [
|
|
113
|
+
const candidates = [`${PLANNING_FOLDER}/config.json`, '.openplanr/config.json'];
|
|
113
114
|
const roots = [];
|
|
114
115
|
for (const candidate of candidates) {
|
|
115
116
|
try {
|
|
@@ -146,7 +147,7 @@ export async function runPortableSync(
|
|
|
146
147
|
} else if (args.provider === 'linear') {
|
|
147
148
|
throw new IntegrationError(
|
|
148
149
|
'E_SYNC_USAGE',
|
|
149
|
-
|
|
150
|
+
`Linear synchronization runs through a Linear connector or the ${CLI_COMMAND} CLI (${CLI_COMMAND} linear push, ${CLI_COMMAND} linear sync).`,
|
|
150
151
|
);
|
|
151
152
|
} else {
|
|
152
153
|
throw new IntegrationError(
|
|
@@ -14,17 +14,17 @@ Resolution order:
|
|
|
14
14
|
|
|
15
15
|
1. use a host-native GitHub or Linear connector when available;
|
|
16
16
|
2. otherwise, for GitHub, use the packaged deterministic helper;
|
|
17
|
-
3. otherwise, for Linear, use the `
|
|
18
|
-
installed it; `
|
|
17
|
+
3. otherwise, for Linear, use the `openplanr linear` terminal utility when the user has
|
|
18
|
+
installed it; `openplanr github` and `openplanr sync` are optional equivalents for the rest.
|
|
19
19
|
|
|
20
20
|
Linear through the CLI:
|
|
21
21
|
|
|
22
|
-
- the user runs `
|
|
22
|
+
- the user runs `openplanr linear init` in a terminal once; it prompts for a personal
|
|
23
23
|
access token, which the CLI stores;
|
|
24
|
-
- audit with `
|
|
25
|
-
- before a real `
|
|
24
|
+
- audit with `openplanr linear sync --dry-run`, which reads Linear without writing;
|
|
25
|
+
- before a real `openplanr linear sync`, ask how conflicts should resolve and pass
|
|
26
26
|
`--on-conflict local` or `--on-conflict linear`; without a prompt it favors Linear;
|
|
27
|
-
- `
|
|
27
|
+
- `openplanr linear push <artifact-id>` creates or updates Linear issues; preview with
|
|
28
28
|
`--dry-run`. Quick tasks and backlog items need `linear.standaloneProjectId` in the
|
|
29
29
|
project config when no terminal prompt is available.
|
|
30
30
|
|
|
@@ -16,6 +16,12 @@ import {
|
|
|
16
16
|
writeFileSync
|
|
17
17
|
} from "node:fs";
|
|
18
18
|
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
19
|
+
|
|
20
|
+
// packages/protocol/src/names.mjs
|
|
21
|
+
var PLANNING_FOLDER = ".planr";
|
|
22
|
+
var CLI_COMMAND = "openplanr";
|
|
23
|
+
|
|
24
|
+
// packages/artifact/lib/artifact/owner-custody.mjs
|
|
19
25
|
function custodyError(message, code = "E_OWNER_CUSTODY_LOCATION") {
|
|
20
26
|
return Object.assign(new Error(message), { code, status: 400 });
|
|
21
27
|
}
|
|
@@ -115,6 +121,8 @@ function writeCustody(path, record, { label = "Owner" } = {}) {
|
|
|
115
121
|
}
|
|
116
122
|
|
|
117
123
|
export {
|
|
124
|
+
PLANNING_FOLDER,
|
|
125
|
+
CLI_COMMAND,
|
|
118
126
|
ensurePrivateDirectory,
|
|
119
127
|
readCustody,
|
|
120
128
|
writeCustody
|
|
@@ -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,
|