openplanr 2.2641.0 → 2.2641.2
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 +34 -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 +6 -5
- 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 +16 -18
- 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 +29 -28
- 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 +32 -35
- 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-DI_TKz9J.js} +115 -115
- package/dist/dashboard/assets/index-DI_TKz9J.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 +0 -4
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +2 -3
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +13 -16
- 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/credentials-service.js +2 -2
- 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 +1 -4
- package/dist/services/distribution-service.d.ts.map +1 -1
- package/dist/services/distribution-service.js +3 -61
- package/dist/services/distribution-service.js.map +1 -1
- package/dist/services/github-service.d.ts +8 -5
- package/dist/services/github-service.d.ts.map +1 -1
- package/dist/services/github-service.js +23 -21
- 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 +5 -6
- package/dist/services/linear-push-service.d.ts.map +1 -1
- package/dist/services/linear-push-service.js +22 -22
- 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 +43 -77
- 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/capability-map.md.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 +258 -262
- 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 +9 -9
- 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 +109 -89
- package/lib/host-packages/claude/openplanr/README.md +13 -17
- package/lib/host-packages/claude/openplanr/agents/planr-backend.md +49 -55
- package/lib/host-packages/claude/openplanr/agents/planr-database.md +56 -92
- package/lib/host-packages/claude/openplanr/agents/planr-designer.md +35 -51
- package/lib/host-packages/claude/openplanr/agents/planr-devops.md +37 -51
- package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +29 -52
- package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +24 -23
- package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +46 -58
- package/lib/host-packages/claude/openplanr/agents/planr-qa.md +4 -2
- package/lib/host-packages/claude/openplanr/agents/planr-specification.md +54 -51
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +21 -65
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +5 -6
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +3 -4
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +19 -64
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +10 -12
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +19 -62
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +5 -6
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +16 -59
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +9 -11
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +4 -4
- 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 +105 -55
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +12 -7
- 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/share.js +1 -1
- 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 +11 -4
- 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 +14 -14
- 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 +4 -4
- package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +6 -2
- package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +6 -2
- package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/dashboard/SKILL.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +7 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +8 -6
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
- 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 +4 -4
- 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/operate/SKILL.md +5 -3
- package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +8 -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 +16 -15
- 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/references/tracker-connections.md +70 -0
- package/lib/host-packages/claude/openplanr/skills/sprint/schemas/refinement.schema.json +3 -3
- package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +5 -4
- package/lib/host-packages/claude/openplanr/skills/status/references/tracker-connections.md +70 -0
- package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +11 -20
- package/lib/host-packages/claude/openplanr/skills/sync/references/tracker-connections.md +70 -0
- 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 +81 -61
- 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 +4 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +14 -14
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +6 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +6 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-dashboard.mdc +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +8 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +7 -0
- 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 +4 -4
- 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-operate.mdc +5 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/references/artifact-contract.md +5 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +8 -2
- 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/references/tracker-connections.md +70 -0
- 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 +16 -15
- package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md +70 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +5 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/tracker-connections.md +70 -0
- 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 +11 -20
- 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 +105 -55
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +12 -7
- 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/share.js +1 -1
- 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 +11 -4
- 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 +90 -70
- 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 +105 -55
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +12 -7
- 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/share.js +1 -1
- 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 +11 -4
- 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 +14 -14
- 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 +4 -4
- package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +6 -2
- package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +6 -2
- package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/dashboard/SKILL.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +7 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +8 -6
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
- 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 +4 -4
- 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/operate/SKILL.md +5 -3
- package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +8 -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 +16 -15
- package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +11 -0
- 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/references/tracker-connections.md +70 -0
- package/lib/host-packages/openai/openplanr/skills/sprint/schemas/refinement.schema.json +3 -3
- package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +5 -4
- package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/status/references/tracker-connections.md +70 -0
- package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +11 -20
- package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +22 -0
- package/lib/host-packages/openai/openplanr/skills/sync/references/tracker-connections.md +70 -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/services/connectors/adapters/business-metrics.d.ts +0 -5
- package/dist/services/connectors/adapters/business-metrics.d.ts.map +0 -1
- package/dist/services/connectors/adapters/business-metrics.js +0 -41
- package/dist/services/connectors/adapters/business-metrics.js.map +0 -1
- package/dist/services/connectors/adapters/deployment-health.d.ts +0 -18
- package/dist/services/connectors/adapters/deployment-health.d.ts.map +0 -1
- package/dist/services/connectors/adapters/deployment-health.js +0 -67
- package/dist/services/connectors/adapters/deployment-health.js.map +0 -1
- package/dist/services/connectors/adapters/github.d.ts +0 -5
- package/dist/services/connectors/adapters/github.d.ts.map +0 -1
- package/dist/services/connectors/adapters/github.js +0 -31
- package/dist/services/connectors/adapters/github.js.map +0 -1
- package/dist/services/connectors/adapters/linear-jira.d.ts +0 -5
- package/dist/services/connectors/adapters/linear-jira.d.ts.map +0 -1
- package/dist/services/connectors/adapters/linear-jira.js +0 -26
- package/dist/services/connectors/adapters/linear-jira.js.map +0 -1
- package/dist/services/connectors/adapters/posthog.d.ts +0 -5
- package/dist/services/connectors/adapters/posthog.d.ts.map +0 -1
- package/dist/services/connectors/adapters/posthog.js +0 -31
- package/dist/services/connectors/adapters/posthog.js.map +0 -1
- package/dist/services/connectors/adapters/sentry.d.ts +0 -5
- package/dist/services/connectors/adapters/sentry.d.ts.map +0 -1
- package/dist/services/connectors/adapters/sentry.js +0 -31
- package/dist/services/connectors/adapters/sentry.js.map +0 -1
- package/dist/services/connectors/checkpoint-custody.d.ts +0 -45
- package/dist/services/connectors/checkpoint-custody.d.ts.map +0 -1
- package/dist/services/connectors/checkpoint-custody.js +0 -496
- package/dist/services/connectors/checkpoint-custody.js.map +0 -1
- package/dist/services/connectors/connector-registry.d.ts +0 -144
- package/dist/services/connectors/connector-registry.d.ts.map +0 -1
- package/dist/services/connectors/connector-registry.js +0 -423
- package/dist/services/connectors/connector-registry.js.map +0 -1
- package/dist/services/connectors/connector-runtime.d.ts +0 -208
- package/dist/services/connectors/connector-runtime.d.ts.map +0 -1
- package/dist/services/connectors/connector-runtime.js +0 -1305
- package/dist/services/connectors/connector-runtime.js.map +0 -1
- package/dist/services/connectors/credential-custody.d.ts +0 -96
- package/dist/services/connectors/credential-custody.d.ts.map +0 -1
- package/dist/services/connectors/credential-custody.js +0 -390
- package/dist/services/connectors/credential-custody.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
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# GitHub and Linear connections
|
|
2
|
+
|
|
3
|
+
These skills store and read no GitHub or Linear credentials. Remote steps run through a
|
|
4
|
+
connection the host already has; the planning files stay the source of truth.
|
|
5
|
+
|
|
6
|
+
## Use the host's connection
|
|
7
|
+
|
|
8
|
+
- **Linear:** the host's Linear connection, whose tools read, create and update issues.
|
|
9
|
+
- **GitHub:** the host's GitHub connection, or the GitHub CLI when
|
|
10
|
+
`gh auth status --hostname github.com` succeeds.
|
|
11
|
+
|
|
12
|
+
Never ask the user for a token, read one from the environment or a file, or put one in a
|
|
13
|
+
command, URL or file.
|
|
14
|
+
|
|
15
|
+
## When a connection is missing
|
|
16
|
+
|
|
17
|
+
Finish the local work first. Then report the remote step as not run and give the one
|
|
18
|
+
line for the current host:
|
|
19
|
+
|
|
20
|
+
| Host | Linear | GitHub |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
+
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
+
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
+
|
|
26
|
+
Ask the user to try again once connected; never retry the remote step on your own.
|
|
27
|
+
|
|
28
|
+
## Status mapping
|
|
29
|
+
|
|
30
|
+
| Local status | Linear workflow state | GitHub issue |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `planning`, `pending` | Unstarted (for example Todo) | open |
|
|
33
|
+
| `in-progress` | Started (for example In Progress) | open |
|
|
34
|
+
| `done` | Completed (for example Done) | closed |
|
|
35
|
+
| Backlog `open` | Backlog, else Unstarted | open |
|
|
36
|
+
| Backlog `closed` | Completed | closed |
|
|
37
|
+
| Backlog `promoted` | Leave as it is | Leave as it is |
|
|
38
|
+
|
|
39
|
+
When reading state back, write only a status the item's type allows. A backlog item takes
|
|
40
|
+
`open` or `closed` and keeps `promoted`.
|
|
41
|
+
|
|
42
|
+
- Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
|
|
43
|
+
`in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
|
|
44
|
+
and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
|
|
45
|
+
task files keep their status.
|
|
46
|
+
- A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
|
|
47
|
+
`in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
|
|
48
|
+
stay as they are.
|
|
49
|
+
|
|
50
|
+
## Links
|
|
51
|
+
|
|
52
|
+
A linked item records its tracker identity in frontmatter. Update a linked item through
|
|
53
|
+
that identity instead of creating another, and record the identity of everything you
|
|
54
|
+
create.
|
|
55
|
+
|
|
56
|
+
- **GitHub:** each item is one issue, recorded as `githubIssue`.
|
|
57
|
+
- **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
|
|
58
|
+
create:
|
|
59
|
+
- An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
|
|
60
|
+
`linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
|
|
61
|
+
it is a milestone in an existing project (`linearMilestoneId`) or a team label
|
|
62
|
+
(`linearLabelId`) instead, and every issue under it carries that milestone
|
|
63
|
+
(`linearProjectMilestoneId`) or label (`linearLabelIds`).
|
|
64
|
+
- A feature, quick task or backlog item is one issue (`linearIssueId`,
|
|
65
|
+
`linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
|
|
66
|
+
issue (`linearParentIssueId`).
|
|
67
|
+
- All task files of one feature share one task-list issue: a sub-issue of the feature's
|
|
68
|
+
issue whose checklist merges every task file, recorded in each task file. Its state is
|
|
69
|
+
Completed when every task file is `done`, Unstarted when every one is `pending`, and
|
|
70
|
+
Started otherwise.
|
|
@@ -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 { 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 the host's Linear connection.",
|
|
150
151
|
);
|
|
151
152
|
} else {
|
|
152
153
|
throw new IntegrationError(
|
|
@@ -6,31 +6,22 @@ alwaysApply: false
|
|
|
6
6
|
# OpenPlanr Sync
|
|
7
7
|
|
|
8
8
|
Reconcile local planning artifacts and, when requested, GitHub or Linear state.
|
|
9
|
-
Reason about conflicts in this active session
|
|
10
|
-
|
|
11
|
-
Local and GitHub work never require the OpenPlanr CLI.
|
|
9
|
+
Reason about conflicts in this active session. Local and GitHub work never require
|
|
10
|
+
the OpenPlanr CLI.
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
Remote steps run through the host's own connections, as described in
|
|
13
|
+
[tracker connections](planr-sync/references/tracker-connections.md), which also holds the status
|
|
14
|
+
mapping and what to tell the user when a connection is missing:
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Linear through the CLI:
|
|
21
|
-
|
|
22
|
-
- the user runs `planr linear init` in a terminal once; it prompts for a personal
|
|
23
|
-
access token, which the CLI stores;
|
|
24
|
-
- audit with `planr linear sync --dry-run`, which reads Linear without writing;
|
|
25
|
-
- before a real `planr linear sync`, ask how conflicts should resolve and pass
|
|
26
|
-
`--on-conflict local` or `--on-conflict linear`; without a prompt it favors Linear;
|
|
27
|
-
- `planr linear push <artifact-id>` creates or updates Linear issues; preview with
|
|
28
|
-
`--dry-run`. Quick tasks and backlog items need `linear.standaloneProjectId` in the
|
|
29
|
-
project config when no terminal prompt is available.
|
|
16
|
+
- GitHub: the host's GitHub connection, or, when the GitHub CLI is signed in, the
|
|
17
|
+
packaged [sync helper](planr-sync/scripts/sync.mjs), which creates and edits issues through `gh`;
|
|
18
|
+
close or reopen an issue with `gh issue close` or `gh issue reopen`. `openplanr github`
|
|
19
|
+
is an optional equivalent; `openplanr sync` only repairs local cross-references.
|
|
20
|
+
- Linear: the host's Linear connection.
|
|
30
21
|
|
|
31
22
|
Audit is read-only by default. Apply local changes only when the request asks for
|
|
32
23
|
reconciliation, and push remote changes only when the request asks for external
|
|
33
|
-
synchronization. If
|
|
24
|
+
synchronization. If a connection is unavailable, complete local reconciliation
|
|
34
25
|
and report only the external step that could not run.
|
|
35
26
|
|
|
36
27
|
## Return
|
|
@@ -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";
|
|
@@ -420,8 +424,12 @@ import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
|
420
424
|
import { fileURLToPath } from "node:url";
|
|
421
425
|
var here = dirname(fileURLToPath(new URL("./runtime/packages/artifact/lib/artifact/review-server.mjs", import.meta.url).href));
|
|
422
426
|
var STAGE_RUNTIME_PATH = join(here, "..", "..", "templates", "artifact-review-stage.js");
|
|
423
|
-
var ARTIFACT_REVIEW_SERVER_VERSION =
|
|
427
|
+
var ARTIFACT_REVIEW_SERVER_VERSION = 3;
|
|
424
428
|
var ARTIFACT_REVIEW_SERVER_KIND = "artifact-review";
|
|
429
|
+
var CONTROL_HEADER = "x-openplanr-control";
|
|
430
|
+
var CONTROLLABLE_SERVER_VERSIONS = /* @__PURE__ */ new Set([2, ARTIFACT_REVIEW_SERVER_VERSION]);
|
|
431
|
+
var EXPORT_ONLY_SERVER_VERSIONS = /* @__PURE__ */ new Set([1]);
|
|
432
|
+
var AUTHORIZATION_CONTROL_VERSIONS = /* @__PURE__ */ new Set([1, 2]);
|
|
425
433
|
var CONTROL_WINDOW_BYTES = 64 * 1024 * 1024;
|
|
426
434
|
var ARTIFACT_REVIEW_MAX_CONTROL_BYTES = Math.ceil((MAX_ARTIFACT_HTML_BYTES * 2 + ARTIFACT_REVIEW_MAX_STATE_BYTES) / CONTROL_WINDOW_BYTES) * CONTROL_WINDOW_BYTES;
|
|
427
435
|
var ARTIFACT_REVIEW_MAX_STATE_BYTES2 = ARTIFACT_REVIEW_MAX_STATE_BYTES;
|
|
@@ -477,6 +485,12 @@ var PERMISSIONS_POLICY = [
|
|
|
477
485
|
function artifactError(code, message, fix = "", details) {
|
|
478
486
|
return new PipelineError(code, message, fix, details);
|
|
479
487
|
}
|
|
488
|
+
function artifactReviewControlHeaders(controlToken) {
|
|
489
|
+
return { [CONTROL_HEADER]: controlToken };
|
|
490
|
+
}
|
|
491
|
+
function stateControlHeaders(state) {
|
|
492
|
+
return AUTHORIZATION_CONTROL_VERSIONS.has(state.serverVersion) ? { authorization: `Bearer ${state.controlToken}` } : artifactReviewControlHeaders(state.controlToken);
|
|
493
|
+
}
|
|
480
494
|
function reviewStateDir(env = process.env) {
|
|
481
495
|
return join(planrHome(env), "artifact-daemon");
|
|
482
496
|
}
|
|
@@ -559,9 +573,9 @@ function parseRequestPath(rawUrl) {
|
|
|
559
573
|
});
|
|
560
574
|
return { segments, trailingSlash };
|
|
561
575
|
}
|
|
562
|
-
function
|
|
563
|
-
const value = req.headers?.
|
|
564
|
-
return typeof value === "string"
|
|
576
|
+
function presentedControlToken(req) {
|
|
577
|
+
const value = req.headers?.[CONTROL_HEADER];
|
|
578
|
+
return typeof value === "string" ? value : "";
|
|
565
579
|
}
|
|
566
580
|
function cloneAndValidateEnvelope(envelope) {
|
|
567
581
|
let cloned;
|
|
@@ -871,7 +885,7 @@ function createArtifactReviewServer({
|
|
|
871
885
|
return;
|
|
872
886
|
}
|
|
873
887
|
if (internal) {
|
|
874
|
-
if (!timingSafeTokenEqual(
|
|
888
|
+
if (!timingSafeTokenEqual(presentedControlToken(req), controlToken)) {
|
|
875
889
|
sendJson(res, 403, { ok: false, error: "forbidden" });
|
|
876
890
|
return;
|
|
877
891
|
}
|
|
@@ -1445,7 +1459,7 @@ function createArtifactReviewServer({
|
|
|
1445
1459
|
return controller;
|
|
1446
1460
|
}
|
|
1447
1461
|
function validState(value, requestedPort, { allowLegacy = false } = {}) {
|
|
1448
|
-
return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (value.serverVersion
|
|
1462
|
+
return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (CONTROLLABLE_SERVER_VERSIONS.has(value.serverVersion) || allowLegacy && EXPORT_ONLY_SERVER_VERSIONS.has(value.serverVersion)) && Number.isInteger(value.pid) && value.pid > 0 && Number.isInteger(value.port) && value.port > 0 && value.port <= 65535 && (requestedPort === 0 || value.port === requestedPort) && isCapabilityToken(value.instanceId, { bytes: SESSION_ID_BYTES }) && isCapabilityToken(value.controlToken, { bytes: CONTROL_TOKEN_BYTES });
|
|
1449
1463
|
}
|
|
1450
1464
|
function readReviewServerState(path) {
|
|
1451
1465
|
try {
|
|
@@ -1456,7 +1470,7 @@ function readReviewServerState(path) {
|
|
|
1456
1470
|
throw artifactError(
|
|
1457
1471
|
ARTIFACT_ERROR_CODES.LOOPBACK_STATE,
|
|
1458
1472
|
"Local Studio owner state is unsafe or malformed. The original record was preserved.",
|
|
1459
|
-
|
|
1473
|
+
`Run ${CLI_COMMAND} doctor and recover the owner record before starting or stopping this service.`
|
|
1460
1474
|
);
|
|
1461
1475
|
}
|
|
1462
1476
|
}
|
|
@@ -1469,7 +1483,7 @@ async function controlRequest(descriptor, path, { method, body, fetchImpl } = {}
|
|
|
1469
1483
|
const response = await fetchImpl(`http://${LOOPBACK_HOST}:${descriptor.state.port}${path}`, {
|
|
1470
1484
|
method,
|
|
1471
1485
|
headers: {
|
|
1472
|
-
|
|
1486
|
+
...stateControlHeaders(descriptor.state),
|
|
1473
1487
|
...body === void 0 ? {} : { "content-type": "application/json" }
|
|
1474
1488
|
},
|
|
1475
1489
|
...body === void 0 ? {} : { body: JSON.stringify(body) },
|
|
@@ -1533,6 +1547,34 @@ async function stopArtifactReviewServer(instanceId, { env = process.env, fetchIm
|
|
|
1533
1547
|
return controlRequest({ state }, "/internal/v1/shutdown", { method: "POST", fetchImpl });
|
|
1534
1548
|
}
|
|
1535
1549
|
|
|
1550
|
+
// packages/protocol/src/planning-folder.mjs
|
|
1551
|
+
import { existsSync as existsSync2, readdirSync as readdirSync2, statSync } from "node:fs";
|
|
1552
|
+
import { join as join2 } from "node:path";
|
|
1553
|
+
var FOREIGN_FILES = Object.freeze(["planr.config.json", "board.html"]);
|
|
1554
|
+
var GOAL_DIRECTORIES = Object.freeze(["tasks", "plans"]);
|
|
1555
|
+
var isDirectory = (path) => existsSync2(path) && statSync(path).isDirectory();
|
|
1556
|
+
function foreignPlanningFolderSigns(projectRoot2) {
|
|
1557
|
+
const folder = join2(projectRoot2, PLANNING_FOLDER);
|
|
1558
|
+
if (!isDirectory(folder) || existsSync2(join2(folder, "config.json"))) return [];
|
|
1559
|
+
const signs = FOREIGN_FILES.filter((name) => existsSync2(join2(folder, name)));
|
|
1560
|
+
for (const name of GOAL_DIRECTORIES) {
|
|
1561
|
+
const directory = join2(folder, name);
|
|
1562
|
+
if (isDirectory(directory) && readdirSync2(directory).some((entry) => entry.endsWith("-goal.md")))
|
|
1563
|
+
signs.push(`*-goal.md files in ${name}`);
|
|
1564
|
+
}
|
|
1565
|
+
return signs;
|
|
1566
|
+
}
|
|
1567
|
+
function planningFolderConflict(projectRoot2) {
|
|
1568
|
+
const signs = foreignPlanningFolderSigns(projectRoot2);
|
|
1569
|
+
if (signs.length === 0) return null;
|
|
1570
|
+
return Object.freeze({
|
|
1571
|
+
code: "E_PLANNING_FOLDER_FOREIGN",
|
|
1572
|
+
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.`,
|
|
1573
|
+
fix: `Move or rename that folder, or use ${CLI_COMMAND} in a project without it, then retry.`,
|
|
1574
|
+
signs: Object.freeze(signs)
|
|
1575
|
+
});
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1536
1578
|
// packages/design/lib/design/design-plan-handoff.mjs
|
|
1537
1579
|
var clone = (value) => JSON.parse(canonicalizeJson(value));
|
|
1538
1580
|
function prepareDesignPlanHandoff(handoff, { subject } = {}) {
|
|
@@ -1571,7 +1613,7 @@ function prepareDesignPlanHandoff(handoff, { subject } = {}) {
|
|
|
1571
1613
|
// packages/design/lib/design/implementation-handoff.mjs
|
|
1572
1614
|
import { createHash, randomUUID } from "node:crypto";
|
|
1573
1615
|
import {
|
|
1574
|
-
existsSync as
|
|
1616
|
+
existsSync as existsSync3,
|
|
1575
1617
|
mkdirSync,
|
|
1576
1618
|
readFileSync as readFileSync2,
|
|
1577
1619
|
realpathSync,
|
|
@@ -1579,7 +1621,7 @@ import {
|
|
|
1579
1621
|
rmSync as rmSync2,
|
|
1580
1622
|
writeFileSync
|
|
1581
1623
|
} from "node:fs";
|
|
1582
|
-
import { dirname as dirname2, join as
|
|
1624
|
+
import { dirname as dirname2, join as join3, resolve as resolve2, sep } from "node:path";
|
|
1583
1625
|
|
|
1584
1626
|
// packages/design/lib/design/implementation-handoff-markdown.mjs
|
|
1585
1627
|
var line = (value) => String(value).replaceAll("\r\n", "\n").replaceAll("\r", "\n").trim().replaceAll("\n", " ").replace(/([\\`*_[\]<>#|])/gu, "\\$1");
|
|
@@ -1832,19 +1874,19 @@ function createRepositorySourceResolver(root) {
|
|
|
1832
1874
|
};
|
|
1833
1875
|
}
|
|
1834
1876
|
function implementationHandoffPaths(root) {
|
|
1835
|
-
const directory =
|
|
1877
|
+
const directory = join3(resolve2(root), "implementation-handoff");
|
|
1836
1878
|
return Object.freeze({
|
|
1837
1879
|
directory,
|
|
1838
|
-
draftJson:
|
|
1839
|
-
draftMarkdown:
|
|
1840
|
-
journal:
|
|
1841
|
-
current:
|
|
1842
|
-
history:
|
|
1880
|
+
draftJson: join3(directory, "draft.json"),
|
|
1881
|
+
draftMarkdown: join3(directory, "draft.md"),
|
|
1882
|
+
journal: join3(directory, "draft-publication.json"),
|
|
1883
|
+
current: join3(directory, "current.json"),
|
|
1884
|
+
history: join3(directory, "versions")
|
|
1843
1885
|
});
|
|
1844
1886
|
}
|
|
1845
1887
|
function recoverImplementationHandoffDraft(root) {
|
|
1846
1888
|
const paths = implementationHandoffPaths(root);
|
|
1847
|
-
if (!
|
|
1889
|
+
if (!existsSync3(paths.journal)) return false;
|
|
1848
1890
|
const journal = JSON.parse(readFileSync2(paths.journal, "utf8"));
|
|
1849
1891
|
const value = assertImplementationHandoffProjection(journal.package);
|
|
1850
1892
|
if (journal.markdown !== value.markdown)
|
|
@@ -1857,14 +1899,14 @@ function recoverImplementationHandoffDraft(root) {
|
|
|
1857
1899
|
function readImplementationHandoffDraft(root, { allowMissing = true } = {}) {
|
|
1858
1900
|
const paths = implementationHandoffPaths(root);
|
|
1859
1901
|
recoverImplementationHandoffDraft(root);
|
|
1860
|
-
if (!
|
|
1902
|
+
if (!existsSync3(paths.draftJson)) {
|
|
1861
1903
|
if (allowMissing) return null;
|
|
1862
1904
|
throw new Error("No implementation handoff draft exists.");
|
|
1863
1905
|
}
|
|
1864
1906
|
const value = assertImplementationHandoffProjection(
|
|
1865
1907
|
JSON.parse(readFileSync2(paths.draftJson, "utf8"))
|
|
1866
1908
|
);
|
|
1867
|
-
if (!
|
|
1909
|
+
if (!existsSync3(paths.draftMarkdown))
|
|
1868
1910
|
throw new Error("Implementation handoff Markdown is missing.");
|
|
1869
1911
|
if (readFileSync2(paths.draftMarkdown, "utf8") !== value.markdown)
|
|
1870
1912
|
throw new Error("Implementation handoff JSON and Markdown projections differ.");
|
|
@@ -1899,15 +1941,15 @@ function importImplementationHandoffPackage(input, { resolveSource } = {}) {
|
|
|
1899
1941
|
// packages/design/lib/design/implementation-handoff-approval.mjs
|
|
1900
1942
|
import { createHash as createHash2, randomUUID as randomUUID2 } from "node:crypto";
|
|
1901
1943
|
import {
|
|
1902
|
-
existsSync as
|
|
1944
|
+
existsSync as existsSync4,
|
|
1903
1945
|
mkdirSync as mkdirSync2,
|
|
1904
|
-
readdirSync as
|
|
1946
|
+
readdirSync as readdirSync3,
|
|
1905
1947
|
readFileSync as readFileSync3,
|
|
1906
1948
|
renameSync as renameSync2,
|
|
1907
1949
|
rmSync as rmSync3,
|
|
1908
1950
|
writeFileSync as writeFileSync2
|
|
1909
1951
|
} from "node:fs";
|
|
1910
|
-
import { dirname as dirname3, join as
|
|
1952
|
+
import { dirname as dirname3, join as join4 } from "node:path";
|
|
1911
1953
|
var DIGEST2 = /^sha256:[a-f0-9]{64}$/u;
|
|
1912
1954
|
var ID = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/u;
|
|
1913
1955
|
var APPROVE_CAPABILITY = "design:implementation-handoff:approve";
|
|
@@ -1996,20 +2038,20 @@ function implementationHandoffApprovalPaths(root) {
|
|
|
1996
2038
|
const base = implementationHandoffPaths(root);
|
|
1997
2039
|
return Object.freeze({
|
|
1998
2040
|
...base,
|
|
1999
|
-
events:
|
|
2000
|
-
journal:
|
|
2041
|
+
events: join4(base.directory, "events"),
|
|
2042
|
+
journal: join4(base.directory, "lifecycle-publication.json")
|
|
2001
2043
|
});
|
|
2002
2044
|
}
|
|
2003
2045
|
function archivePaths(root, value) {
|
|
2004
|
-
const directory =
|
|
2046
|
+
const directory = join4(implementationHandoffPaths(root).history, packageKey(value));
|
|
2005
2047
|
return {
|
|
2006
2048
|
directory,
|
|
2007
|
-
json:
|
|
2008
|
-
markdown:
|
|
2049
|
+
json: join4(directory, "handoff.json"),
|
|
2050
|
+
markdown: join4(directory, "handoff.md")
|
|
2009
2051
|
};
|
|
2010
2052
|
}
|
|
2011
2053
|
function eventPath(root, requestId) {
|
|
2012
|
-
return
|
|
2054
|
+
return join4(implementationHandoffApprovalPaths(root).events, `${requestKey(requestId)}.json`);
|
|
2013
2055
|
}
|
|
2014
2056
|
function readJson2(path, fallback = void 0) {
|
|
2015
2057
|
try {
|
|
@@ -2043,13 +2085,13 @@ function pointerFor(value, status, eventId, extra = {}) {
|
|
|
2043
2085
|
}
|
|
2044
2086
|
function writeLifecycleJournal(root, journal) {
|
|
2045
2087
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2046
|
-
if (
|
|
2088
|
+
if (existsSync4(paths.journal)) recoverImplementationHandoffApproval(root);
|
|
2047
2089
|
atomicText2(paths.journal, jsonBytes2(journal));
|
|
2048
2090
|
return recoverImplementationHandoffApproval(root);
|
|
2049
2091
|
}
|
|
2050
2092
|
function recoverImplementationHandoffApproval(root) {
|
|
2051
2093
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2052
|
-
if (!
|
|
2094
|
+
if (!existsSync4(paths.journal)) return false;
|
|
2053
2095
|
const journal = readJson2(paths.journal);
|
|
2054
2096
|
if (journal.kind !== "openplanr-design-implementation-handoff-lifecycle-publication" || journal.schemaVersion !== "1.0.0")
|
|
2055
2097
|
throw new TypeError("The implementation handoff lifecycle journal is invalid.");
|
|
@@ -2080,16 +2122,16 @@ function readImplementationHandoffVersion(root, identity) {
|
|
|
2080
2122
|
function listImplementationHandoffHistory(root) {
|
|
2081
2123
|
recoverImplementationHandoffApproval(root);
|
|
2082
2124
|
const directory = implementationHandoffPaths(root).history;
|
|
2083
|
-
if (!
|
|
2084
|
-
return
|
|
2085
|
-
(entry) => assertImplementationHandoffProjection(readJson2(
|
|
2125
|
+
if (!existsSync4(directory)) return [];
|
|
2126
|
+
return readdirSync3(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map(
|
|
2127
|
+
(entry) => assertImplementationHandoffProjection(readJson2(join4(directory, entry.name, "handoff.json")))
|
|
2086
2128
|
).sort((left, right) => left.version - right.version || left.id.localeCompare(right.id));
|
|
2087
2129
|
}
|
|
2088
2130
|
function readImplementationHandoffLifecycle(root) {
|
|
2089
2131
|
recoverImplementationHandoffApproval(root);
|
|
2090
2132
|
const paths = implementationHandoffApprovalPaths(root);
|
|
2091
2133
|
const current = readJson2(paths.current, null);
|
|
2092
|
-
const events =
|
|
2134
|
+
const events = existsSync4(paths.events) ? readdirSync3(paths.events).filter((name) => name.endsWith(".json")).map((name) => readJson2(join4(paths.events, name))).sort(
|
|
2093
2135
|
(left, right) => left.at.localeCompare(right.at) || left.eventId.localeCompare(right.eventId)
|
|
2094
2136
|
) : [];
|
|
2095
2137
|
return Object.freeze({ current, history: listImplementationHandoffHistory(root), events });
|
|
@@ -2561,7 +2603,7 @@ function validateState(value, current) {
|
|
|
2561
2603
|
function projectRoot(root) {
|
|
2562
2604
|
let candidate = root;
|
|
2563
2605
|
while (true) {
|
|
2564
|
-
if (
|
|
2606
|
+
if (existsSync5(join5(candidate, PLANNING_FOLDER)) || existsSync5(join5(candidate, ".git")))
|
|
2565
2607
|
return candidate;
|
|
2566
2608
|
const parent = dirname4(candidate);
|
|
2567
2609
|
if (parent === candidate) return root;
|
|
@@ -2606,7 +2648,7 @@ function proposeImplementationPackage(file, env) {
|
|
|
2606
2648
|
designSpecPath(current.root),
|
|
2607
2649
|
...(current.sourceFiles ?? []).map((path) => resolve3(current.root, path))
|
|
2608
2650
|
])
|
|
2609
|
-
].filter((path) =>
|
|
2651
|
+
].filter((path) => existsSync5(path));
|
|
2610
2652
|
const sources = paths.map((path, index) => {
|
|
2611
2653
|
const logicalPath = relative(repository, path).replaceAll("\\", "/");
|
|
2612
2654
|
const extension = logicalPath.split(".").pop()?.toLowerCase();
|
|
@@ -2652,7 +2694,10 @@ function proposeImplementationPackage(file, env) {
|
|
|
2652
2694
|
};
|
|
2653
2695
|
}
|
|
2654
2696
|
async function persistDesignTaste(current, state) {
|
|
2655
|
-
const
|
|
2697
|
+
const root = projectRoot(current.root);
|
|
2698
|
+
const conflict = planningFolderConflict(root);
|
|
2699
|
+
if (conflict) throw new PipelineError(conflict.code, conflict.problem, conflict.fix);
|
|
2700
|
+
const path = join5(root, `${PLANNING_FOLDER}/design-system/taste.json`);
|
|
2656
2701
|
const release = await acquireStartLock(`${path}.lock`);
|
|
2657
2702
|
try {
|
|
2658
2703
|
const taste = readJson(path, { designs: {} });
|
|
@@ -2693,7 +2738,7 @@ async function saveDesignState(file, { state, revision, stateVersion }) {
|
|
|
2693
2738
|
throw Object.assign(new Error("The design changed. Reload before saving feedback."), {
|
|
2694
2739
|
statusCode: 409
|
|
2695
2740
|
});
|
|
2696
|
-
const path =
|
|
2741
|
+
const path = join5(current.root, ".design/studio-state.json");
|
|
2697
2742
|
const release = await acquireStartLock(`${path}.lock`);
|
|
2698
2743
|
try {
|
|
2699
2744
|
current = currentDesign(file);
|
|
@@ -2731,7 +2776,7 @@ var readBody = async (req) => JSON.parse(await readRequestBody(req, { maxBytes:
|
|
|
2731
2776
|
var readImplementationBody = async (req) => JSON.parse(await readRequestBody(req, { maxBytes: 5 * 1024 * 1024, encoding: "utf8" }));
|
|
2732
2777
|
async function startDesignReview(file, options = {}) {
|
|
2733
2778
|
const { root } = currentDesign(file);
|
|
2734
|
-
const release = await acquireStartLock(
|
|
2779
|
+
const release = await acquireStartLock(join5(root, ".design/start.lock"));
|
|
2735
2780
|
try {
|
|
2736
2781
|
return await startDesignReviewUnlocked(file, options);
|
|
2737
2782
|
} finally {
|
|
@@ -2752,7 +2797,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2752
2797
|
let current = currentDesign(file);
|
|
2753
2798
|
const applyInitialView = async () => {
|
|
2754
2799
|
if (view === void 0) return;
|
|
2755
|
-
const saved = readJson(
|
|
2800
|
+
const saved = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
2756
2801
|
state: {},
|
|
2757
2802
|
stateVersion: 0
|
|
2758
2803
|
});
|
|
@@ -2762,7 +2807,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2762
2807
|
state: { ...saved.state, view }
|
|
2763
2808
|
});
|
|
2764
2809
|
};
|
|
2765
|
-
const stateFile =
|
|
2810
|
+
const stateFile = join5(current.root, ".design/server.json");
|
|
2766
2811
|
const old = readJson(stateFile, null);
|
|
2767
2812
|
const services = (await listArtifactReviewServers({ env, fetchImpl })).filter(
|
|
2768
2813
|
(service) => service.kind === "design" && service.projectRoot === current.root
|
|
@@ -2817,7 +2862,12 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2817
2862
|
server = createArtifactReviewServer({
|
|
2818
2863
|
env,
|
|
2819
2864
|
serverMetadata: { kind: "design", projectRoot: current.root },
|
|
2820
|
-
prepareSource: (options) => prepareArtifactDocument({
|
|
2865
|
+
prepareSource: (options) => prepareArtifactDocument({
|
|
2866
|
+
...options,
|
|
2867
|
+
allowLocalForms: true,
|
|
2868
|
+
prototypeState: true,
|
|
2869
|
+
screenId: current.entries.find((entry) => entry.artifactId === options.artifactId)?.screenId ?? options.artifactId
|
|
2870
|
+
}),
|
|
2821
2871
|
async refreshSession(session) {
|
|
2822
2872
|
current = currentDesign(file);
|
|
2823
2873
|
if (session.designRevision === current.revision) return;
|
|
@@ -2839,7 +2889,7 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2839
2889
|
session.designRevision = current.revision;
|
|
2840
2890
|
},
|
|
2841
2891
|
renderDocument({ model, base }) {
|
|
2842
|
-
const state = readJson(
|
|
2892
|
+
const state = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
2843
2893
|
state: {}
|
|
2844
2894
|
}).state;
|
|
2845
2895
|
const stalePins = readDesignFeedback(file, env).pins.filter((pin) => pin.stale);
|
|
@@ -2892,7 +2942,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
2892
2942
|
respond(res, 200, readDesignHandoff(file, { env }));
|
|
2893
2943
|
} else if (route === "design-implementation-handoff" && req.method === "GET") {
|
|
2894
2944
|
const design = currentDesign(file);
|
|
2895
|
-
const unlock = await acquireStartLock(
|
|
2945
|
+
const unlock = await acquireStartLock(join5(design.root, ".design/render.lock"));
|
|
2896
2946
|
try {
|
|
2897
2947
|
const root = dirname4(designSpecPath(design.root));
|
|
2898
2948
|
let proposal = null;
|
|
@@ -2938,7 +2988,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
2938
2988
|
].includes(input.action))
|
|
2939
2989
|
throw new Error("Unknown implementation package action.");
|
|
2940
2990
|
const initial = currentDesign(file);
|
|
2941
|
-
const unlock = await acquireStartLock(
|
|
2991
|
+
const unlock = await acquireStartLock(join5(initial.root, ".design/render.lock"));
|
|
2942
2992
|
try {
|
|
2943
2993
|
const design = currentDesign(file);
|
|
2944
2994
|
const root = dirname4(designSpecPath(design.root));
|
|
@@ -3103,7 +3153,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3103
3153
|
else if (action === "recovery")
|
|
3104
3154
|
result = await exportDesignShareRecovery(file, {
|
|
3105
3155
|
...options,
|
|
3106
|
-
output:
|
|
3156
|
+
output: join5(
|
|
3107
3157
|
env.HOME ?? process.env.HOME,
|
|
3108
3158
|
"Downloads",
|
|
3109
3159
|
`openplanr-design-recovery-${Date.now()}.json`
|
|
@@ -3112,7 +3162,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3112
3162
|
else result = await manageDesignShare(file, action, options);
|
|
3113
3163
|
respond(res, 200, result);
|
|
3114
3164
|
} else if (route === "design-status" && req.method === "GET") {
|
|
3115
|
-
const ready = readJson(
|
|
3165
|
+
const ready = readJson(join5(current.root, ".design/browser-ready.json"), null);
|
|
3116
3166
|
respond(res, 200, {
|
|
3117
3167
|
ok: true,
|
|
3118
3168
|
documentId: current.document.id,
|
|
@@ -3123,7 +3173,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3123
3173
|
});
|
|
3124
3174
|
} else if (route === "design-state" && req.method === "GET") {
|
|
3125
3175
|
respond(res, 200, {
|
|
3126
|
-
...readJson(
|
|
3176
|
+
...readJson(join5(current.root, ".design/studio-state.json"), {
|
|
3127
3177
|
state: {},
|
|
3128
3178
|
stateVersion: 0
|
|
3129
3179
|
}),
|
|
@@ -3136,7 +3186,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3136
3186
|
const loadedArtifacts = new Set(Array.isArray(value?.artifacts) ? value.artifacts : []);
|
|
3137
3187
|
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
3188
|
throw new Error("Browser readiness must identify loaded design artboards.");
|
|
3139
|
-
atomicJson(
|
|
3189
|
+
atomicJson(join5(current.root, ".design/browser-ready.json"), {
|
|
3140
3190
|
status: "ready",
|
|
3141
3191
|
revision: current.revision,
|
|
3142
3192
|
artifacts: value.artifacts,
|
|
@@ -3145,7 +3195,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3145
3195
|
});
|
|
3146
3196
|
respond(res, 200, { ok: true });
|
|
3147
3197
|
} else if (route === "design-export" && req.method === "GET") {
|
|
3148
|
-
const state = readJson(
|
|
3198
|
+
const state = readJson(join5(current.root, ".design/studio-state.json"), {
|
|
3149
3199
|
state: {}
|
|
3150
3200
|
}).state;
|
|
3151
3201
|
res.writeHead(200, {
|
|
@@ -3179,7 +3229,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3179
3229
|
const registered = await fetchImpl(`${origin}/internal/v1/sessions`, {
|
|
3180
3230
|
method: "POST",
|
|
3181
3231
|
headers: {
|
|
3182
|
-
|
|
3232
|
+
...artifactReviewControlHeaders(server.controlToken),
|
|
3183
3233
|
"content-type": "application/json"
|
|
3184
3234
|
},
|
|
3185
3235
|
body: JSON.stringify({
|
|
@@ -3269,8 +3319,8 @@ async function resolveDesignPins(file, { pinIds, summary, env = process.env }) {
|
|
|
3269
3319
|
"One or more requested pins do not exist."
|
|
3270
3320
|
);
|
|
3271
3321
|
writeArtifactReviewState(path, createReviewLedger({ ...ledger, reviews: revisions }));
|
|
3272
|
-
const history = readJson(
|
|
3273
|
-
atomicJson(
|
|
3322
|
+
const history = readJson(join5(current.root, ".design/review-history.json"), []);
|
|
3323
|
+
atomicJson(join5(current.root, ".design/review-history.json"), [
|
|
3274
3324
|
...history,
|
|
3275
3325
|
{
|
|
3276
3326
|
revision: current.revision,
|