openplanr 3.1.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -0
- package/dist/cli/commands/groups/delivery.d.ts.map +1 -1
- package/dist/cli/commands/groups/delivery.js +2 -0
- package/dist/cli/commands/groups/delivery.js.map +1 -1
- package/dist/cli/commands/planning-artifacts.d.ts.map +1 -1
- package/dist/cli/commands/planning-artifacts.js +22 -12
- package/dist/cli/commands/planning-artifacts.js.map +1 -1
- package/dist/cli/commands/ship.d.ts +3 -0
- package/dist/cli/commands/ship.d.ts.map +1 -0
- package/dist/cli/commands/ship.js +65 -0
- package/dist/cli/commands/ship.js.map +1 -0
- package/dist/cli/commands/spec.d.ts +2 -1
- package/dist/cli/commands/spec.d.ts.map +1 -1
- package/dist/cli/commands/spec.js +45 -5
- package/dist/cli/commands/spec.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/index-B_96uzCl.js +572 -0
- package/dist/dashboard/assets/index-B_96uzCl.js.map +1 -0
- package/dist/dashboard/dashboard-manifest.json +10 -10
- package/dist/dashboard/index.html +1 -1
- package/dist/models/schema.d.ts +39 -23
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +19 -12
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +6 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/claude-plugin-service.d.ts +5 -0
- package/dist/services/claude-plugin-service.d.ts.map +1 -1
- package/dist/services/claude-plugin-service.js +18 -2
- 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 +11 -3
- package/dist/services/codex-plugin-service.js.map +1 -1
- package/dist/services/id-service.d.ts +1 -5
- package/dist/services/id-service.d.ts.map +1 -1
- package/dist/services/id-service.js +1 -34
- package/dist/services/id-service.js.map +1 -1
- package/dist/services/runtime-manager/codex-discovery.d.ts +1 -3
- package/dist/services/runtime-manager/codex-discovery.d.ts.map +1 -1
- package/dist/services/runtime-manager/codex-discovery.js +3 -16
- package/dist/services/runtime-manager/codex-discovery.js.map +1 -1
- package/dist/services/runtime-manager/doctor.d.ts +25 -0
- package/dist/services/runtime-manager/doctor.d.ts.map +1 -1
- package/dist/services/runtime-manager/doctor.js +480 -0
- package/dist/services/runtime-manager/doctor.js.map +1 -1
- package/dist/services/runtime-manager/errors.d.ts +12 -0
- package/dist/services/runtime-manager/errors.d.ts.map +1 -0
- package/dist/services/runtime-manager/errors.js +14 -0
- package/dist/services/runtime-manager/errors.js.map +1 -0
- package/dist/services/runtime-manager/global-state.d.ts +7 -0
- package/dist/services/runtime-manager/global-state.d.ts.map +1 -1
- package/dist/services/runtime-manager/global-state.js +116 -0
- package/dist/services/runtime-manager/global-state.js.map +1 -1
- package/dist/services/runtime-manager/host-version-probe.d.ts +8 -0
- package/dist/services/runtime-manager/host-version-probe.d.ts.map +1 -0
- package/dist/services/runtime-manager/host-version-probe.js +14 -0
- package/dist/services/runtime-manager/host-version-probe.js.map +1 -0
- package/dist/services/runtime-manager/install-plan.d.ts +25 -0
- package/dist/services/runtime-manager/install-plan.d.ts.map +1 -1
- package/dist/services/runtime-manager/install-plan.js +305 -0
- package/dist/services/runtime-manager/install-plan.js.map +1 -1
- package/dist/services/runtime-manager/inventory.d.ts +6 -0
- package/dist/services/runtime-manager/inventory.d.ts.map +1 -1
- package/dist/services/runtime-manager/inventory.js +16 -1
- package/dist/services/runtime-manager/inventory.js.map +1 -1
- package/dist/services/runtime-manager/legacy-adapters.d.ts +9 -0
- package/dist/services/runtime-manager/legacy-adapters.d.ts.map +1 -0
- package/dist/services/runtime-manager/legacy-adapters.js +187 -0
- package/dist/services/runtime-manager/legacy-adapters.js.map +1 -0
- package/dist/services/runtime-manager/paths.d.ts +18 -0
- package/dist/services/runtime-manager/paths.d.ts.map +1 -0
- package/dist/services/runtime-manager/paths.js +83 -0
- package/dist/services/runtime-manager/paths.js.map +1 -0
- package/dist/services/runtime-manager/runtime-package.d.ts +21 -0
- package/dist/services/runtime-manager/runtime-package.d.ts.map +1 -1
- package/dist/services/runtime-manager/runtime-package.js +77 -0
- package/dist/services/runtime-manager/runtime-package.js.map +1 -1
- package/dist/services/runtime-manager/storage.d.ts +47 -0
- package/dist/services/runtime-manager/storage.d.ts.map +1 -0
- package/dist/services/runtime-manager/storage.js +604 -0
- package/dist/services/runtime-manager/storage.js.map +1 -0
- package/dist/services/runtime-manager-service.d.ts +7 -17
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +32 -1695
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/dist/services/ship-checks/changes.d.ts +24 -0
- package/dist/services/ship-checks/changes.d.ts.map +1 -0
- package/dist/services/ship-checks/changes.js +135 -0
- package/dist/services/ship-checks/changes.js.map +1 -0
- package/dist/services/ship-checks/contract.d.ts +93 -0
- package/dist/services/ship-checks/contract.d.ts.map +1 -0
- package/dist/services/ship-checks/contract.js +7 -0
- package/dist/services/ship-checks/contract.js.map +1 -0
- package/dist/services/ship-checks/coverage.d.ts +4 -0
- package/dist/services/ship-checks/coverage.d.ts.map +1 -0
- package/dist/services/ship-checks/coverage.js +113 -0
- package/dist/services/ship-checks/coverage.js.map +1 -0
- package/dist/services/ship-checks/discover.d.ts +10 -0
- package/dist/services/ship-checks/discover.d.ts.map +1 -0
- package/dist/services/ship-checks/discover.js +253 -0
- package/dist/services/ship-checks/discover.js.map +1 -0
- package/dist/services/ship-checks/glob.d.ts +5 -0
- package/dist/services/ship-checks/glob.d.ts.map +1 -0
- package/dist/services/ship-checks/glob.js +39 -0
- package/dist/services/ship-checks/glob.js.map +1 -0
- package/dist/services/ship-checks/hooks.d.ts +7 -0
- package/dist/services/ship-checks/hooks.d.ts.map +1 -0
- package/dist/services/ship-checks/hooks.js +65 -0
- package/dist/services/ship-checks/hooks.js.map +1 -0
- package/dist/services/ship-checks/packages.d.ts +29 -0
- package/dist/services/ship-checks/packages.d.ts.map +1 -0
- package/dist/services/ship-checks/packages.js +197 -0
- package/dist/services/ship-checks/packages.js.map +1 -0
- package/dist/services/ship-checks/related-tests.d.ts +13 -0
- package/dist/services/ship-checks/related-tests.d.ts.map +1 -0
- package/dist/services/ship-checks/related-tests.js +73 -0
- package/dist/services/ship-checks/related-tests.js.map +1 -0
- package/dist/services/ship-checks/scope.d.ts +8 -0
- package/dist/services/ship-checks/scope.d.ts.map +1 -0
- package/dist/services/ship-checks/scope.js +66 -0
- package/dist/services/ship-checks/scope.js.map +1 -0
- package/dist/services/ship-checks/task-requirements.d.ts +14 -0
- package/dist/services/ship-checks/task-requirements.d.ts.map +1 -0
- package/dist/services/ship-checks/task-requirements.js +145 -0
- package/dist/services/ship-checks/task-requirements.js.map +1 -0
- package/dist/services/ship-checks/workflows.d.ts +21 -0
- package/dist/services/ship-checks/workflows.d.ts.map +1 -0
- package/dist/services/ship-checks/workflows.js +208 -0
- package/dist/services/ship-checks/workflows.js.map +1 -0
- package/dist/services/spec-service.d.ts +18 -0
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +174 -9
- package/dist/services/spec-service.js.map +1 -1
- package/dist/services/template-service.d.ts +2 -0
- package/dist/services/template-service.d.ts.map +1 -1
- package/dist/services/template-service.js +4 -0
- package/dist/services/template-service.js.map +1 -1
- package/dist/templates/spec/spec-shaped.md.hbs +1 -1
- package/dist/templates/spec/spec.md.hbs +2 -2
- package/dist/utils/slugify.d.ts +1 -8
- package/dist/utils/slugify.d.ts.map +1 -1
- package/dist/utils/slugify.js +1 -25
- package/dist/utils/slugify.js.map +1 -1
- package/docs/CLI.md +96 -2
- package/lib/backlog-item.d.mts +49 -0
- package/lib/backlog-item.mjs +339 -0
- package/lib/host-packages/adapter-registry.json +5 -5
- package/lib/host-packages/capability-map.json +3 -3
- 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 +134 -94
- package/lib/host-packages/claude/openplanr/CONNECTORS.md +4 -6
- package/lib/host-packages/claude/openplanr/README.md +1 -1
- package/lib/host-packages/claude/openplanr/agents/planr-qa.md +5 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-document.mjs +471 -80
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +2 -2
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +45 -4
- package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → claude/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs} +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +8 -5
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +138 -12
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/{design-shared-protocol-contracts-31a760fc.mjs → design-shared-protocol-contracts-b5f28f94.mjs} +413 -45
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design.mjs +482 -79
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -32
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +322 -45
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +165 -276
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +259 -522
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +585 -937
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +119 -244
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +285 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2773 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2207 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1597 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
- package/lib/host-packages/{openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0}/design-document.schema.json +207 -7
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +324 -45
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +73 -12
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
- package/lib/host-packages/claude/openplanr/skills/connect/references/connectors.md +4 -6
- package/lib/host-packages/claude/openplanr/skills/design/SKILL.md +12 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/craft.md +14 -3
- package/lib/host-packages/claude/openplanr/skills/design/references/design-system.md +48 -1
- package/lib/host-packages/claude/openplanr/skills/design/references/discovery.md +18 -4
- package/lib/host-packages/claude/openplanr/skills/design/references/generation.md +133 -2
- package/lib/host-packages/claude/openplanr/skills/design/references/hosted-canvas.md +62 -0
- package/lib/host-packages/claude/openplanr/skills/design/references/review.md +46 -1
- package/lib/host-packages/claude/openplanr/skills/design/references/utilities.md +17 -1
- package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/craft.md +14 -3
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/design-system.md +48 -1
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/discovery.md +18 -4
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/generation.md +133 -2
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/review.md +46 -1
- package/lib/host-packages/claude/openplanr/skills/design-loop/references/utilities.md +17 -1
- package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/claude/openplanr/skills/design-review/references/craft.md +14 -3
- package/lib/host-packages/claude/openplanr/skills/design-review/references/design-system.md +48 -1
- package/lib/host-packages/claude/openplanr/skills/design-review/references/discovery.md +18 -4
- package/lib/host-packages/claude/openplanr/skills/design-review/references/generation.md +133 -2
- package/lib/host-packages/claude/openplanr/skills/design-review/references/review.md +46 -1
- package/lib/host-packages/claude/openplanr/skills/design-review/references/utilities.md +17 -1
- package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +11 -2
- package/lib/host-packages/claude/openplanr/skills/investigate/references/findings.md +92 -0
- package/lib/host-packages/claude/openplanr/skills/investigate/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +24 -11
- package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/claude/openplanr/skills/share/references/connectors.md +4 -6
- package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +46 -14
- package/lib/host-packages/claude/openplanr/skills/ship/references/findings.md +92 -0
- package/lib/host-packages/claude/openplanr/skills/ship/references/result-contract.md +3 -1
- package/lib/host-packages/claude/openplanr/skills/ship/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/claude/openplanr/skills/spec/SKILL.md +6 -0
- package/lib/host-packages/claude/openplanr/skills/spec/references/specification-contract.md +3 -1
- package/lib/host-packages/claude/openplanr/skills/sprint/references/connectors.md +4 -6
- package/lib/host-packages/claude/openplanr/skills/status/references/connectors.md +4 -6
- package/lib/host-packages/claude/openplanr/skills/sync/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +132 -92
- package/lib/host-packages/cursor/openplanr/CONNECTORS.md +4 -6
- package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-connect/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/craft.md +14 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/design-system.md +48 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/discovery.md +18 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/generation.md +133 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/hosted-canvas.md +62 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/review.md +46 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/references/utilities.md +17 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/craft.md +14 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/design-system.md +48 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/discovery.md +18 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/generation.md +133 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/review.md +46 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/references/utilities.md +17 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/craft.md +14 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/design-system.md +48 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/discovery.md +18 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/generation.md +133 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/review.md +46 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/references/utilities.md +17 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-design.mdc +12 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-investigate/references/findings.md +92 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-investigate/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-investigate.mdc +11 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +24 -11
- package/lib/host-packages/cursor/openplanr/rules/planr-share/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/findings.md +92 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/references/result-contract.md +3 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-ship/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-ship.mdc +46 -14
- package/lib/host-packages/cursor/openplanr/rules/planr-spec/references/specification-contract.md +3 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-spec.mdc +6 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-status/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/connectors.md +4 -6
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-document.mjs +471 -80
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +2 -2
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +45 -4
- package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → cursor/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs} +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +8 -5
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +138 -12
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
- package/lib/host-packages/{openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs → cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs} +413 -45
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design.mjs +482 -79
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -32
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +322 -45
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +165 -276
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +259 -522
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +585 -937
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +119 -244
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +285 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2773 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2207 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1597 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
- package/lib/host-packages/{claude/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0}/design-document.schema.json +207 -7
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +324 -45
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +73 -12
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
- 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 +139 -99
- package/lib/host-packages/openai/openplanr/CONNECTORS.md +4 -6
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-artifact-shell.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-chunked-workspace-client.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-document.mjs +471 -80
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +2 -2
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-resource-pack.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +45 -4
- package/lib/host-packages/{claude/openplanr/runtime/design/scripts/design-runtime-support-e34c388a8e59.mjs → openai/openplanr/runtime/design/scripts/design-runtime-support-25485dbf1cb2.mjs} +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +8 -5
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-dependencies-design-support-protocol-contracts-3d9b1a86.mjs +138 -12
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-shared-artifact-support-protocol-contracts-ea2cd15e.mjs +1 -1
- package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/design-shared-protocol-contracts-31a760fc.mjs → openai/openplanr/runtime/design/scripts/design-shared-protocol-contracts-b5f28f94.mjs} +413 -45
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-upload-spool.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design.mjs +482 -79
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/notices/THIRD_PARTY_NOTICES.txt +32 -32
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/02-artifact-review-ui.js +23 -23
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/03-protocol-contracts.js +322 -45
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/06-artifact-review-ui.js +12 -12
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources/08-artifact-review-ui.js +47 -14
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/artifact/templates/artifact-review-stage.js.sources.json +11 -10
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +4 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.css +16 -11
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/01-module-runtime.js +7 -11
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/02-react.js +165 -276
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/03-react-dom-client-fiber-foundations.js +494 -967
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/04-react-dom-client-reconciliation-hooks.js +346 -678
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/05-react-dom-client-render-phases.js +382 -810
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/06-react-dom-client-commit-effects.js +406 -730
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/07-react-dom-client-work-loop-scheduling.js +259 -522
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/08-react-dom-client-dom-events-properties-hydration.js +585 -937
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/09-react-dom-client-public-roots.js +119 -244
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/10-react.js +7 -17
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/11-artifact-review-ui.js +3 -4
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-protocol-contracts.js +285 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2773 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-studio-shell.js +134 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-canvas-engine.js +2207 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/16-design-review-experience.js +16 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-studio-shell.js +8 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/18-interface-primitives.js +3883 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/19-interface-primitives.js +966 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/{16-studio-shell.js → 20-studio-shell.js} +122 -227
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/21-design-studio.js +1597 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources.json +101 -47
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +6 -2
- package/lib/host-packages/{cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.9.0 → openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0}/design-document.schema.json +207 -7
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/schemas/v1.22.0/design-review-bundle.schema.json +822 -0
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +324 -45
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +73 -12
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +6 -2
- package/lib/host-packages/openai/openplanr/skills/connect/references/connectors.md +4 -6
- package/lib/host-packages/openai/openplanr/skills/design/SKILL.md +12 -0
- package/lib/host-packages/openai/openplanr/skills/design/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/craft.md +14 -3
- package/lib/host-packages/openai/openplanr/skills/design/references/design-system.md +48 -1
- package/lib/host-packages/openai/openplanr/skills/design/references/discovery.md +18 -4
- package/lib/host-packages/openai/openplanr/skills/design/references/generation.md +133 -2
- package/lib/host-packages/openai/openplanr/skills/design/references/hosted-canvas.md +62 -0
- package/lib/host-packages/openai/openplanr/skills/design/references/review.md +46 -1
- package/lib/host-packages/openai/openplanr/skills/design/references/utilities.md +17 -1
- package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/craft.md +14 -3
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/design-system.md +48 -1
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/discovery.md +18 -4
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/generation.md +133 -2
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/review.md +46 -1
- package/lib/host-packages/openai/openplanr/skills/design-loop/references/utilities.md +17 -1
- package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/openai/openplanr/skills/design-review/references/craft.md +14 -3
- package/lib/host-packages/openai/openplanr/skills/design-review/references/design-system.md +48 -1
- package/lib/host-packages/openai/openplanr/skills/design-review/references/discovery.md +18 -4
- package/lib/host-packages/openai/openplanr/skills/design-review/references/generation.md +133 -2
- package/lib/host-packages/openai/openplanr/skills/design-review/references/review.md +46 -1
- package/lib/host-packages/openai/openplanr/skills/design-review/references/utilities.md +17 -1
- package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +11 -2
- package/lib/host-packages/openai/openplanr/skills/investigate/agents/openai.yaml +1 -1
- package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +23 -1
- package/lib/host-packages/openai/openplanr/skills/investigate/references/findings.md +92 -0
- package/lib/host-packages/openai/openplanr/skills/investigate/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +24 -11
- package/lib/host-packages/openai/openplanr/skills/plan/openplanr.skill.json +1 -1
- package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +207 -7
- package/lib/host-packages/openai/openplanr/skills/share/references/connectors.md +4 -6
- package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +46 -14
- package/lib/host-packages/openai/openplanr/skills/ship/agents/openai.yaml +1 -1
- package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +23 -1
- package/lib/host-packages/openai/openplanr/skills/ship/references/findings.md +92 -0
- package/lib/host-packages/openai/openplanr/skills/ship/references/result-contract.md +3 -1
- package/lib/host-packages/openai/openplanr/skills/ship/scripts/backlog-item.mjs +339 -0
- package/lib/host-packages/openai/openplanr/skills/spec/SKILL.md +6 -0
- package/lib/host-packages/openai/openplanr/skills/spec/openplanr.skill.json +1 -1
- package/lib/host-packages/openai/openplanr/skills/spec/references/specification-contract.md +3 -1
- package/lib/host-packages/openai/openplanr/skills/sprint/references/connectors.md +4 -6
- package/lib/host-packages/openai/openplanr/skills/status/references/connectors.md +4 -6
- package/lib/host-packages/openai/openplanr/skills/sync/references/connectors.md +4 -6
- package/lib/json-schema.mjs +4 -0
- package/package.json +13 -13
- package/dist/dashboard/assets/index-G7ygVDGg.js +0 -572
- package/dist/dashboard/assets/index-G7ygVDGg.js.map +0 -1
- package/dist/templates/backlog/backlog-item.md.hbs +0 -40
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/12-design-review-experience.js +0 -3589
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-studio-shell.js +0 -184
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/14-interface-primitives.js +0 -5229
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/15-interface-primitives.js +0 -1733
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/17-design-studio.js +0 -1844
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/utils/slugify.js
CHANGED
|
@@ -1,26 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Convert text to a URL/filename-safe slug.
|
|
3
|
-
*
|
|
4
|
-
* `maxLength` caps the slug (default 80) so filenames stay well under
|
|
5
|
-
* the OS limit (255 chars) even after the ID prefix and `.md` extension.
|
|
6
|
-
* The slug is trimmed at the last whole word boundary to avoid cut-off words.
|
|
7
|
-
*/
|
|
8
|
-
export function slugify(text, maxLength = 80) {
|
|
9
|
-
let slug = text
|
|
10
|
-
.toLowerCase()
|
|
11
|
-
.trim()
|
|
12
|
-
.replace(/[^\w\s-]/g, '')
|
|
13
|
-
.replace(/[\s_]+/g, '-')
|
|
14
|
-
.replace(/-+/g, '-')
|
|
15
|
-
.replace(/^-+|-+$/g, '');
|
|
16
|
-
if (slug.length > maxLength) {
|
|
17
|
-
slug = slug.slice(0, maxLength);
|
|
18
|
-
// Trim at last whole-word boundary to avoid cut-off words
|
|
19
|
-
const lastDash = slug.lastIndexOf('-');
|
|
20
|
-
if (lastDash > 0) {
|
|
21
|
-
slug = slug.slice(0, lastDash);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return slug;
|
|
25
|
-
}
|
|
1
|
+
export { slugify } from '../../lib/backlog-item.mjs';
|
|
26
2
|
//# sourceMappingURL=slugify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/utils/slugify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC"}
|
package/docs/CLI.md
CHANGED
|
@@ -243,6 +243,30 @@ openplanr spec shape SPEC-001
|
|
|
243
243
|
|
|
244
244
|
---
|
|
245
245
|
|
|
246
|
+
#### `openplanr spec validate`
|
|
247
|
+
|
|
248
|
+
Check one spec file against the specification contract. It reads the file and writes nothing.
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
openplanr spec validate SPEC-001
|
|
252
|
+
openplanr spec validate SPEC-001 --json
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
| Option | Description | Required |
|
|
256
|
+
| ---------- | --------------------------------------------------------------- | -------- |
|
|
257
|
+
| `<specId>` | Spec ID to check | Yes |
|
|
258
|
+
| `--json` | Print `{ ok, specId, file, violations[] }` instead of text | No |
|
|
259
|
+
|
|
260
|
+
**Rules:**
|
|
261
|
+
1. **`path`** — the file is `SPEC-NNN-{slug}/SPEC-NNN-{slug}.md`, and its frontmatter `id` and `slug` match that path.
|
|
262
|
+
2. **`frontmatter`** — the frontmatter is valid against the Protocol spec schema for the `schemaVersion` it declares (`1.0.0` or `1.7.0`): every required key (including `id`), allowed values, no unknown keys. A missing or unsupported `schemaVersion` is an error that lists the supported versions.
|
|
263
|
+
3. **`headings`** — the 13 contract headings, from `## Context & Goal` to `## Notes for Decomposition`, appear in order, and `## Scope Boundaries` has `### In Scope` and `### Out of Scope`. Other headings may sit between them.
|
|
264
|
+
4. **`acceptance-ids`** — every top-level item under `## Acceptance Criteria` starts with a unique `AC-NNN` id (a checkbox and bold markers before it are fine).
|
|
265
|
+
|
|
266
|
+
Each violation is printed with the file, the rule, and what was found. The command exits 1 when there is any violation or the spec is not found, and 0 otherwise.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
246
270
|
#### `openplanr spec sync`
|
|
247
271
|
|
|
248
272
|
Validate spec integrity and auto-fix safe inconsistencies. Use after manual edits, interrupted work, or when in doubt.
|
|
@@ -322,12 +346,20 @@ openplanr spec attach-design SPEC-001 --files login.png signup.png
|
|
|
322
346
|
|
|
323
347
|
#### `openplanr spec promote`
|
|
324
348
|
|
|
325
|
-
Validate that a spec is ready for handoff
|
|
349
|
+
Validate that a spec is ready for handoff (has stories, tasks, and a non-trivial body), mark the spec ready-for-pipeline by writing `status: "ready-for-pipeline"` into its frontmatter, and print the next-step pipeline command.
|
|
326
350
|
|
|
327
351
|
```bash
|
|
328
352
|
openplanr spec promote SPEC-001
|
|
353
|
+
openplanr spec promote SPEC-001 --dry-run # validate and print the handoff; write nothing
|
|
329
354
|
```
|
|
330
355
|
|
|
356
|
+
| Option | Description | Required |
|
|
357
|
+
| ----------- | ------------------------------------------------------------------------------- | -------- |
|
|
358
|
+
| `<specId>` | Spec ID to promote | Yes |
|
|
359
|
+
| `--dry-run` | Validate and print the handoff command without marking the spec ready-for-pipeline | No |
|
|
360
|
+
|
|
361
|
+
To check a spec's structure without changing its status, use `openplanr spec validate`.
|
|
362
|
+
|
|
331
363
|
After promotion, run from any configured runtime:
|
|
332
364
|
|
|
333
365
|
```text
|
|
@@ -694,6 +726,65 @@ Cursor uses Composer handoff with sequential fallback.
|
|
|
694
726
|
|
|
695
727
|
---
|
|
696
728
|
|
|
729
|
+
### `openplanr ship checks`
|
|
730
|
+
|
|
731
|
+
List the checks a change needs for a tier, without running them. Sources are the
|
|
732
|
+
GitHub Actions workflows, husky (`.husky/pre-commit`, `.husky/pre-push`) and
|
|
733
|
+
pre-commit hooks, package scripts, and the task's `## Test Requirements`.
|
|
734
|
+
|
|
735
|
+
```bash
|
|
736
|
+
openplanr ship checks --task .planr/tasks/T-012-parser.md --json
|
|
737
|
+
openplanr ship checks --tier push --json
|
|
738
|
+
```
|
|
739
|
+
|
|
740
|
+
| Option | Description | Default |
|
|
741
|
+
| --------------- | -------------------------------------------------------------- | ----------------------------------------- |
|
|
742
|
+
| `--task <path>` | Task file whose Test Requirements to include | none |
|
|
743
|
+
| `--tier <tier>` | `task`, `story`, `push` or `planning` | `planning` for a `.planr`-only change, else `task` |
|
|
744
|
+
| `--base <ref>` | Compare against the merge base with this ref | `origin/HEAD`, then `main` |
|
|
745
|
+
| `--json` | Print the `openplanr-ship-checks` result (schema `1.1.0`) | `false` |
|
|
746
|
+
|
|
747
|
+
**Tiers:**
|
|
748
|
+
|
|
749
|
+
- `planning`: `openplanr spec sync --dry-run` and `openplanr sync --dry-run`, tagged
|
|
750
|
+
`report-only` because both exit 0 when they report problems.
|
|
751
|
+
- `task`: Test Requirements commands, pre-commit hooks, and the CI build when the
|
|
752
|
+
change touches a package entry point, a build script, a `tsconfig*.json` or a
|
|
753
|
+
bundler config. Without a task command, the `test`, `typecheck` and `lint`
|
|
754
|
+
scripts are listed as `fallback`.
|
|
755
|
+
- `story`: `task` plus every `run` step of the pull-request and merge-queue
|
|
756
|
+
workflows whose path filters match the change.
|
|
757
|
+
- `push`: `story` without path filters, plus push workflows and pre-push hooks.
|
|
758
|
+
|
|
759
|
+
Each CI step is kept verbatim with its `cwd` (step, then job, then workflow
|
|
760
|
+
`working-directory`). Install steps and `uses` steps are skipped. A static matrix
|
|
761
|
+
is expanded; other `${{ }}` expressions are tagged `needs-review`. A check is
|
|
762
|
+
`tracked-only` when its command, its package script, or a script file either one
|
|
763
|
+
runs directly mentions `lint-staged`, `ls-files`, `--cached` or `--staged`;
|
|
764
|
+
deeper calls are not followed. `relatedTests` lists test files that mention a
|
|
765
|
+
name the change exports, a `.command()` name, or a route path.
|
|
766
|
+
|
|
767
|
+
`coverage` names changed files that a passing run may not have checked.
|
|
768
|
+
`trackedOnly.unseen` lists untracked files when any check is `tracked-only`
|
|
769
|
+
(warning `UNTRACKED_NOT_SEEN`); `git add -N` makes them visible.
|
|
770
|
+
`typescript.uncovered` lists new `.ts`, `.tsx`, `.mts` and `.cts` files outside
|
|
771
|
+
`.planr/` that no `tsconfig*.json` root file set includes (`files`, `include`,
|
|
772
|
+
`exclude`, `extends`, and `references` one level deep; warning `TS_NOT_COVERED`).
|
|
773
|
+
A file reached only through an import is still reported, and the command does
|
|
774
|
+
not check which tsconfig CI runs. A tsconfig that TypeScript reports errors for
|
|
775
|
+
raises `TSCONFIG_ERROR` with its first message, and a config whose `extends`
|
|
776
|
+
cannot be read adds no coverage. To read tsconfigs, the command loads the
|
|
777
|
+
`typescript` package that Node resolves from the project root, which can be a
|
|
778
|
+
copy in a parent directory, and that runs the package's code; it never executes
|
|
779
|
+
checks. When Node cannot resolve `typescript` there, `typescript` is `null` with
|
|
780
|
+
the info diagnostic `TYPESCRIPT_UNAVAILABLE`.
|
|
781
|
+
|
|
782
|
+
`complete` is `false` when any diagnostic is an `error`, for example a workflow
|
|
783
|
+
that fails to parse: the listed checks are then not the full CI set. The command
|
|
784
|
+
exits 1 for an unknown tier, a missing `--task` file or a directory outside git.
|
|
785
|
+
|
|
786
|
+
---
|
|
787
|
+
|
|
697
788
|
### `openplanr sync`
|
|
698
789
|
|
|
699
790
|
Validate and repair cross-references across all artifacts.
|
|
@@ -1286,6 +1377,9 @@ For semantic decomposition, invoke the installed `planr:plan` skill. After revie
|
|
|
1286
1377
|
"backlog": "BL",
|
|
1287
1378
|
"sprint": "SPRINT"
|
|
1288
1379
|
},
|
|
1289
|
-
"createdAt": "2026-03-26"
|
|
1380
|
+
"createdAt": "2026-03-26",
|
|
1381
|
+
"findings": { "unattended": "report" }
|
|
1290
1382
|
}
|
|
1291
1383
|
```
|
|
1384
|
+
|
|
1385
|
+
`findings.unattended` decides what Ship and Investigate do with findings outside the task when nobody can answer: `report` (the default) lists them, `file` files each one as a backlog item. Settings OpenPlanr doesn't know are kept when it saves the file.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Normalised fields of one backlog item. */
|
|
2
|
+
export interface BacklogFields {
|
|
3
|
+
readonly title: string;
|
|
4
|
+
readonly priority: string;
|
|
5
|
+
readonly tags: readonly string[];
|
|
6
|
+
readonly description: string;
|
|
7
|
+
readonly acceptanceCriteria?: string | readonly string[];
|
|
8
|
+
readonly notes?: string;
|
|
9
|
+
readonly epicId?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** One open backlog item; `path` is project-relative. */
|
|
13
|
+
export interface OpenBacklogItem {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly title: string;
|
|
16
|
+
readonly status: string;
|
|
17
|
+
readonly path: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** The command that installs the OpenPlanr CLI. */
|
|
21
|
+
export declare const CLI_INSTALL_COMMAND: 'npm install -g openplanr';
|
|
22
|
+
/** The one-time line shown after filing without the CLI. */
|
|
23
|
+
export declare const CLI_HINT: string;
|
|
24
|
+
|
|
25
|
+
/** Reserves the next `PREFIX-NNN` in `dir`, one past the highest file or reservation; never reissues a removed ID. */
|
|
26
|
+
export declare function reserveNextId(dir: string, prefix: string): Promise<string>;
|
|
27
|
+
/** Converts text to a filename-safe slug of at most `maxLength` characters, cut at a word boundary. */
|
|
28
|
+
export declare function slugify(text: string, maxLength?: number): string;
|
|
29
|
+
/** Normalises raw input; throws when the title is empty. */
|
|
30
|
+
export declare function backlogFields(input: Record<string, unknown>): BacklogFields;
|
|
31
|
+
/** Renders the default backlog item Markdown. */
|
|
32
|
+
export declare function renderBacklogItem(id: string, fields: BacklogFields, date: string): string;
|
|
33
|
+
/** Reserves an ID and writes the item into `backlogDir`. */
|
|
34
|
+
export declare function writeBacklogItem(
|
|
35
|
+
backlogDir: string,
|
|
36
|
+
prefix: string,
|
|
37
|
+
fields: BacklogFields,
|
|
38
|
+
date: string,
|
|
39
|
+
): Promise<{ id: string; filePath: string }>;
|
|
40
|
+
/** Creates an item in the backlog folder configured by `<projectDir>/.planr/config.json`. */
|
|
41
|
+
export declare function createBacklogItem(
|
|
42
|
+
projectDir: string,
|
|
43
|
+
input: Record<string, unknown>,
|
|
44
|
+
date?: string,
|
|
45
|
+
): Promise<{ id: string; title: string; artifactPath: string }>;
|
|
46
|
+
/** Lists backlog items whose status is not `closed` or `done`. */
|
|
47
|
+
export declare function listOpenBacklog(projectDir: string): Promise<OpenBacklogItem[]>;
|
|
48
|
+
/** Returns the install hint and records it in `.planr/config.json`, or null once it has been shown in this project. */
|
|
49
|
+
export declare function takeCliHint(projectDir: string): Promise<string | null>;
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// @ts-check
|
|
3
|
+
// The one backlog item writer: the CLI imports it, and skills run it when no CLI is installed.
|
|
4
|
+
|
|
5
|
+
import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { join, relative, resolve, sep } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
9
|
+
/** Holds one empty file per issued ID, so the ID of a removed artifact is never issued again. */
|
|
10
|
+
const ISSUED_IDS_DIR = '.issued-ids';
|
|
11
|
+
const CLOSED_STATUSES = new Set(['closed', 'done']);
|
|
12
|
+
|
|
13
|
+
/** @type {typeof import('./backlog-item.d.mts').CLI_INSTALL_COMMAND} */
|
|
14
|
+
export const CLI_INSTALL_COMMAND = 'npm install -g openplanr';
|
|
15
|
+
/** @type {typeof import('./backlog-item.d.mts').CLI_HINT} */
|
|
16
|
+
export const CLI_HINT = `Install the OpenPlanr CLI to manage these items: ${CLI_INSTALL_COMMAND}`;
|
|
17
|
+
|
|
18
|
+
/** @type {typeof import('./backlog-item.d.mts').reserveNextId} */
|
|
19
|
+
export async function reserveNextId(dir, prefix) {
|
|
20
|
+
const issuedDir = join(dir, ISSUED_IDS_DIR);
|
|
21
|
+
await mkdir(issuedDir, { recursive: true });
|
|
22
|
+
const pattern = new RegExp(`^${prefix.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')}-(\\d{3,})`, 'u');
|
|
23
|
+
let next = 1;
|
|
24
|
+
for (const directory of [dir, issuedDir]) {
|
|
25
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
26
|
+
const match = entry.isDirectory() ? null : pattern.exec(entry.name);
|
|
27
|
+
if (match) next = Math.max(next, Number.parseInt(match[1], 10) + 1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
for (; ; next++) {
|
|
31
|
+
const id = `${prefix}-${String(next).padStart(3, '0')}`;
|
|
32
|
+
try {
|
|
33
|
+
await writeFile(join(issuedDir, id), '', { flag: 'wx' });
|
|
34
|
+
return id;
|
|
35
|
+
} catch (error) {
|
|
36
|
+
if (/** @type {NodeJS.ErrnoException} */ (error).code !== 'EEXIST') throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** @type {typeof import('./backlog-item.d.mts').slugify} */
|
|
42
|
+
export function slugify(text, maxLength = 80) {
|
|
43
|
+
let slug = text
|
|
44
|
+
.toLowerCase()
|
|
45
|
+
.trim()
|
|
46
|
+
.replace(/[^\w\s-]/g, '')
|
|
47
|
+
.replace(/[\s_]+/g, '-')
|
|
48
|
+
.replace(/-+/g, '-')
|
|
49
|
+
.replace(/^-+|-+$/g, '');
|
|
50
|
+
if (slug.length > maxLength) {
|
|
51
|
+
slug = slug.slice(0, maxLength);
|
|
52
|
+
// Trim at the last whole-word boundary to avoid cut-off words.
|
|
53
|
+
const lastDash = slug.lastIndexOf('-');
|
|
54
|
+
if (lastDash > 0) slug = slug.slice(0, lastDash);
|
|
55
|
+
}
|
|
56
|
+
return slug;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @param {unknown} value */
|
|
60
|
+
function strings(value) {
|
|
61
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
62
|
+
if (typeof value === 'string')
|
|
63
|
+
return value
|
|
64
|
+
.split(',')
|
|
65
|
+
.map((item) => item.trim())
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** @param {unknown} value */
|
|
71
|
+
function optionalText(value) {
|
|
72
|
+
return value === undefined || value === null || value === '' ? undefined : value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const PRIORITIES = Object.freeze(['critical', 'high', 'medium', 'low']);
|
|
76
|
+
|
|
77
|
+
/** Bad backlog input; the code lets the CLI report it as an input error, not a crash. */
|
|
78
|
+
class BacklogInputError extends Error {
|
|
79
|
+
/** @param {string} message */
|
|
80
|
+
constructor(message) {
|
|
81
|
+
super(message);
|
|
82
|
+
this.name = 'BacklogInputError';
|
|
83
|
+
this.code = 'E_BACKLOG_INVALID';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** @type {typeof import('./backlog-item.d.mts').backlogFields} */
|
|
88
|
+
export function backlogFields(input) {
|
|
89
|
+
const title = String(input.title ?? input.name ?? '').trim();
|
|
90
|
+
if (!title) throw new BacklogInputError('A backlog item needs a non-empty title.');
|
|
91
|
+
const priority = String(input.priority ?? 'medium');
|
|
92
|
+
if (!PRIORITIES.includes(priority))
|
|
93
|
+
throw new BacklogInputError(
|
|
94
|
+
`Backlog priority ${JSON.stringify(priority)} is not valid; use one of ${PRIORITIES.join(', ')}.`,
|
|
95
|
+
);
|
|
96
|
+
const criteria = optionalText(input.acceptanceCriteria);
|
|
97
|
+
const notes = optionalText(input.notes);
|
|
98
|
+
const epicId = optionalText(input.epicId);
|
|
99
|
+
return {
|
|
100
|
+
title,
|
|
101
|
+
priority,
|
|
102
|
+
tags: strings(input.tags),
|
|
103
|
+
description: String(input.description ?? title),
|
|
104
|
+
...(criteria === undefined
|
|
105
|
+
? {}
|
|
106
|
+
: { acceptanceCriteria: Array.isArray(criteria) ? criteria.map(String) : String(criteria) }),
|
|
107
|
+
...(notes === undefined ? {} : { notes: String(notes) }),
|
|
108
|
+
...(epicId === undefined ? {} : { epicId: String(epicId) }),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** @type {typeof import('./backlog-item.d.mts').renderBacklogItem} */
|
|
113
|
+
export function renderBacklogItem(id, fields, date) {
|
|
114
|
+
const quote = JSON.stringify;
|
|
115
|
+
const lines = [
|
|
116
|
+
'---',
|
|
117
|
+
`id: ${quote(id)}`,
|
|
118
|
+
`title: ${quote(fields.title)}`,
|
|
119
|
+
`priority: ${quote(fields.priority)}`,
|
|
120
|
+
`tags: [${fields.tags.map((tag) => quote(tag)).join(', ')}]`,
|
|
121
|
+
'status: "open"',
|
|
122
|
+
`created: ${quote(date)}`,
|
|
123
|
+
`updated: ${quote(date)}`,
|
|
124
|
+
...(fields.epicId ? [`epicId: ${quote(fields.epicId)}`] : []),
|
|
125
|
+
'---',
|
|
126
|
+
'',
|
|
127
|
+
`# ${id}: ${fields.title}`,
|
|
128
|
+
'',
|
|
129
|
+
];
|
|
130
|
+
/** @param {string} heading @param {string} body @param {boolean} [spaced] */
|
|
131
|
+
const section = (heading, body, spaced = false) =>
|
|
132
|
+
lines.push(`## ${heading}`, ...(spaced ? [''] : []), body, '');
|
|
133
|
+
if (fields.tags.length > 0)
|
|
134
|
+
section('Tags', fields.tags.map((tag) => `- ${tag}`).join('\n'), true);
|
|
135
|
+
// A description with its own sections stands alone instead of nesting under another heading.
|
|
136
|
+
if (/^## /u.test(fields.description)) lines.push(fields.description, '');
|
|
137
|
+
else if (fields.description !== fields.title) section('Description', fields.description);
|
|
138
|
+
if (fields.acceptanceCriteria !== undefined && fields.acceptanceCriteria.length > 0)
|
|
139
|
+
section(
|
|
140
|
+
'Acceptance Criteria',
|
|
141
|
+
Array.isArray(fields.acceptanceCriteria)
|
|
142
|
+
? fields.acceptanceCriteria.map((criterion) => `- ${criterion}`).join('\n')
|
|
143
|
+
: fields.acceptanceCriteria,
|
|
144
|
+
);
|
|
145
|
+
if (fields.notes) section('Notes', fields.notes);
|
|
146
|
+
lines.push('---', `_Close when done: \`openplanr backlog update ${id} --status closed\`_`, '');
|
|
147
|
+
return lines.join('\n');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** @type {typeof import('./backlog-item.d.mts').writeBacklogItem} */
|
|
151
|
+
export async function writeBacklogItem(backlogDir, prefix, fields, date) {
|
|
152
|
+
await mkdir(backlogDir, { recursive: true });
|
|
153
|
+
const id = await reserveNextId(backlogDir, prefix);
|
|
154
|
+
const filePath = join(backlogDir, `${id}-${slugify(fields.title)}.md`);
|
|
155
|
+
await writeFile(filePath, renderBacklogItem(id, fields, date));
|
|
156
|
+
return { id, filePath };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** @param {string} projectDir */
|
|
160
|
+
async function projectConfig(projectDir) {
|
|
161
|
+
const configPath = join(projectDir, '.planr', 'config.json');
|
|
162
|
+
let raw;
|
|
163
|
+
try {
|
|
164
|
+
raw = await readFile(configPath, 'utf8');
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (/** @type {NodeJS.ErrnoException} */ (error).code === 'ENOENT')
|
|
167
|
+
throw new Error(
|
|
168
|
+
`No OpenPlanr project at ${projectDir}: ${configPath} is missing. Run \`openplanr init\` or pass the project root.`,
|
|
169
|
+
);
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
let config;
|
|
173
|
+
try {
|
|
174
|
+
config = JSON.parse(raw);
|
|
175
|
+
} catch (error) {
|
|
176
|
+
throw new Error(`${configPath} is not valid JSON: ${/** @type {Error} */ (error).message}`);
|
|
177
|
+
}
|
|
178
|
+
return { configPath, raw, config };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** @param {string} projectDir */
|
|
182
|
+
async function projectBacklog(projectDir) {
|
|
183
|
+
const { config } = await projectConfig(projectDir);
|
|
184
|
+
const agile = String(config.outputPaths?.agile ?? '.planr').replaceAll('\\', '/');
|
|
185
|
+
return {
|
|
186
|
+
backlogDir: resolve(projectDir, agile, 'backlog'),
|
|
187
|
+
prefix: String(config.idPrefix?.backlog ?? 'BL'),
|
|
188
|
+
templateOverrides:
|
|
189
|
+
typeof config.templateOverrides === 'string' ? config.templateOverrides : undefined,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** @param {string} projectDir @param {string} filePath */
|
|
194
|
+
const relativePath = (projectDir, filePath) => relative(projectDir, filePath).split(sep).join('/');
|
|
195
|
+
|
|
196
|
+
/** @type {typeof import('./backlog-item.d.mts').createBacklogItem} */
|
|
197
|
+
export async function createBacklogItem(
|
|
198
|
+
projectDir,
|
|
199
|
+
input,
|
|
200
|
+
date = new Date().toISOString().split('T')[0],
|
|
201
|
+
) {
|
|
202
|
+
const { backlogDir, prefix } = await projectBacklog(projectDir);
|
|
203
|
+
const fields = backlogFields(input);
|
|
204
|
+
const { id, filePath } = await writeBacklogItem(backlogDir, prefix, fields, date);
|
|
205
|
+
return { id, title: fields.title, artifactPath: relativePath(projectDir, filePath) };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Top-level scalar frontmatter fields; double-quoted values are read as JSON strings.
|
|
210
|
+
* @param {string} text
|
|
211
|
+
* @param {string} filePath
|
|
212
|
+
*/
|
|
213
|
+
function frontmatter(text, filePath) {
|
|
214
|
+
const block = /^---\n([\s\S]*?)\n---/u.exec(text.replace(/\r\n/gu, '\n'))?.[1] ?? '';
|
|
215
|
+
/** @type {Record<string, string>} */
|
|
216
|
+
const fields = {};
|
|
217
|
+
for (const line of block.split('\n')) {
|
|
218
|
+
const match = /^(\w+):\s*(.*)$/u.exec(line);
|
|
219
|
+
if (!match) continue;
|
|
220
|
+
const value = match[2].trim();
|
|
221
|
+
if (!value.startsWith('"')) {
|
|
222
|
+
fields[match[1]] = value.replace(/^'(.*)'$/u, '$1');
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
try {
|
|
226
|
+
fields[match[1]] = String(JSON.parse(value));
|
|
227
|
+
} catch (error) {
|
|
228
|
+
throw new Error(
|
|
229
|
+
`${filePath}: frontmatter field "${match[1]}" is not a valid quoted string: ${/** @type {Error} */ (error).message}`,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return fields;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** @type {typeof import('./backlog-item.d.mts').listOpenBacklog} */
|
|
237
|
+
export async function listOpenBacklog(projectDir) {
|
|
238
|
+
const { backlogDir } = await projectBacklog(projectDir);
|
|
239
|
+
let names;
|
|
240
|
+
try {
|
|
241
|
+
names = await readdir(backlogDir);
|
|
242
|
+
} catch (error) {
|
|
243
|
+
if (/** @type {NodeJS.ErrnoException} */ (error).code === 'ENOENT') return [];
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
const items = [];
|
|
247
|
+
for (const name of names.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))) {
|
|
248
|
+
const match = /^([A-Z]+-\d{3,})-.+\.md$/u.exec(name);
|
|
249
|
+
if (!match) continue;
|
|
250
|
+
const filePath = join(backlogDir, name);
|
|
251
|
+
const fields = frontmatter(await readFile(filePath, 'utf8'), filePath);
|
|
252
|
+
const status = fields.status ?? 'open';
|
|
253
|
+
if (CLOSED_STATUSES.has(status)) continue;
|
|
254
|
+
items.push({
|
|
255
|
+
id: fields.id ?? match[1],
|
|
256
|
+
title: fields.title ?? name.slice(match[1].length + 1, -3).replace(/-/g, ' '),
|
|
257
|
+
status,
|
|
258
|
+
path: relativePath(projectDir, filePath),
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return items;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** @type {typeof import('./backlog-item.d.mts').takeCliHint} */
|
|
265
|
+
export async function takeCliHint(projectDir) {
|
|
266
|
+
const { configPath, raw, config } = await projectConfig(projectDir);
|
|
267
|
+
if (config.findings?.cliHintShown === true) return null;
|
|
268
|
+
const next = { ...config, findings: { ...config.findings, cliHintShown: true } };
|
|
269
|
+
const indent = /\n(\t| +)"/u.exec(raw)?.[1] ?? ' ';
|
|
270
|
+
await writeFile(configPath, `${JSON.stringify(next, null, indent)}\n`);
|
|
271
|
+
return CLI_HINT;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/** @param {string} source */
|
|
275
|
+
async function readInput(source) {
|
|
276
|
+
const text =
|
|
277
|
+
source === '-'
|
|
278
|
+
? await new Promise((done, fail) => {
|
|
279
|
+
let value = '';
|
|
280
|
+
process.stdin.setEncoding('utf8');
|
|
281
|
+
process.stdin.on('data', (chunk) => {
|
|
282
|
+
value += chunk;
|
|
283
|
+
});
|
|
284
|
+
process.stdin.on('end', () => done(value));
|
|
285
|
+
process.stdin.on('error', fail);
|
|
286
|
+
})
|
|
287
|
+
: await readFile(resolve(source), 'utf8');
|
|
288
|
+
const parsed = JSON.parse(String(text));
|
|
289
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
290
|
+
throw new Error('Backlog input must be one JSON object with at least a title.');
|
|
291
|
+
return parsed;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const USAGE =
|
|
295
|
+
'Usage: backlog-item.mjs add --project <dir> --data <file|->\n backlog-item.mjs list --project <dir> --open\n';
|
|
296
|
+
|
|
297
|
+
/** @param {string[]} argv */
|
|
298
|
+
async function main(argv) {
|
|
299
|
+
const [command, ...rest] = argv;
|
|
300
|
+
/** @type {Record<string, string | boolean>} */
|
|
301
|
+
const options = {};
|
|
302
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
303
|
+
const flag = rest[index];
|
|
304
|
+
if (flag === '--open') options.open = true;
|
|
305
|
+
else if (flag === '--project' || flag === '--data')
|
|
306
|
+
options[flag.slice(2)] = rest[++index] ?? '';
|
|
307
|
+
else throw new Error(`Unknown argument: ${flag}\n${USAGE}`);
|
|
308
|
+
}
|
|
309
|
+
const projectDir = resolve(String(options.project ?? '.'));
|
|
310
|
+
if (command === 'add') {
|
|
311
|
+
if (typeof options.data !== 'string' || !options.data)
|
|
312
|
+
throw new Error(`add needs --data.\n${USAGE}`);
|
|
313
|
+
const { templateOverrides } = await projectBacklog(projectDir);
|
|
314
|
+
const result = await createBacklogItem(projectDir, await readInput(options.data));
|
|
315
|
+
const cliHint = await takeCliHint(projectDir);
|
|
316
|
+
process.stdout.write(
|
|
317
|
+
`${JSON.stringify({
|
|
318
|
+
ok: true,
|
|
319
|
+
action: 'backlog.created',
|
|
320
|
+
...result,
|
|
321
|
+
...(templateOverrides ? { templateOverrideIgnored: true } : {}),
|
|
322
|
+
...(cliHint ? { cliHint } : {}),
|
|
323
|
+
})}\n`,
|
|
324
|
+
);
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (command === 'list' && options.open) {
|
|
328
|
+
process.stdout.write(`${JSON.stringify({ items: await listOpenBacklog(projectDir) })}\n`);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
throw new Error(USAGE);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
335
|
+
main(process.argv.slice(2)).catch((error) => {
|
|
336
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
337
|
+
process.exit(1);
|
|
338
|
+
});
|
|
339
|
+
}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"kind": "host-native-adapter-registry",
|
|
3
3
|
"schemaVersion": "1.0.0",
|
|
4
4
|
"protocolVersion": "1.8.0",
|
|
5
|
-
"pipelineVersion": "0.
|
|
6
|
-
"pluginVersion": "3.
|
|
5
|
+
"pipelineVersion": "0.61.0",
|
|
6
|
+
"pluginVersion": "3.3.0",
|
|
7
7
|
"adapters": [
|
|
8
8
|
{
|
|
9
9
|
"id": "claude-code",
|
|
10
|
-
"version": "3.
|
|
10
|
+
"version": "3.3.0",
|
|
11
11
|
"capabilityLevel": "product",
|
|
12
12
|
"installScopes": [
|
|
13
13
|
"user",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"id": "codex",
|
|
22
|
-
"version": "3.
|
|
22
|
+
"version": "3.3.0",
|
|
23
23
|
"capabilityLevel": "product",
|
|
24
24
|
"installScopes": [
|
|
25
25
|
"user",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
"id": "cursor",
|
|
34
|
-
"version": "3.
|
|
34
|
+
"version": "3.3.0",
|
|
35
35
|
"capabilityLevel": "workflow",
|
|
36
36
|
"installScopes": [
|
|
37
37
|
"project"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"kind": "openplanr-capability-map",
|
|
3
3
|
"schemaVersion": "1.0.0",
|
|
4
|
-
"pluginVersion": "3.
|
|
4
|
+
"pluginVersion": "3.3.0",
|
|
5
5
|
"families": [
|
|
6
6
|
{
|
|
7
7
|
"id": "planning",
|
|
@@ -339,7 +339,7 @@
|
|
|
339
339
|
"id": "planr-investigate",
|
|
340
340
|
"name": "investigate",
|
|
341
341
|
"family": "diagnostics",
|
|
342
|
-
"description": "Diagnose a bug, regression, error, or unexplained behavior and optionally implement a bounded fix. Use for root-cause investigation, not planned feature delivery.",
|
|
342
|
+
"description": "Diagnose a bug, regression, error, or unexplained behavior and optionally implement a bounded fix. Use for root-cause investigation, including before any fix, not planned feature delivery.",
|
|
343
343
|
"useWhen": [
|
|
344
344
|
"Investigate a bug, regression, error, or unexplained behavior",
|
|
345
345
|
"Reproduce a defect, establish its root cause, or apply a bounded fix",
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
"id": "planr-ship",
|
|
472
472
|
"name": "ship",
|
|
473
473
|
"family": "implementation",
|
|
474
|
-
"description": "Implement an OpenPlanr plan, specification, task, or clearly stated request end to end in the current repository. Use when the user asks to build, implement, fix, finish, or ship local work.",
|
|
474
|
+
"description": "Implement an OpenPlanr plan, specification, task, or clearly stated request end to end in the current repository. Use when the user asks to build, implement, fix, finish, or ship local work, or to plan and implement an accepted change. Invoke before editing files for the requested change. Not for planning only, landing, release, or work handed to another coding agent.",
|
|
475
475
|
"useWhen": [
|
|
476
476
|
"Implement a plan, specification, task, fix, or clearly stated local request",
|
|
477
477
|
"Build and verify the requested repository change",
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
"name": "OpenPlanr"
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
|
-
"version": "3.
|
|
8
|
+
"version": "3.3.0",
|
|
9
9
|
"description": "Generated local OpenPlanr package."
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "planr",
|
|
14
14
|
"source": "./openplanr",
|
|
15
|
-
"version": "3.
|
|
15
|
+
"version": "3.3.0",
|
|
16
16
|
"description": "Close the loop from intent to delivery. Plan, design, build, review, and operate from durable context in your repository.",
|
|
17
17
|
"strict": true
|
|
18
18
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "planr",
|
|
3
3
|
"displayName": "OpenPlanr",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.0",
|
|
5
5
|
"description": "Close the loop from intent to delivery. Plan, design, build, review, and operate from durable context in your repository.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "OpenPlanr",
|