openplanr 3.1.1 → 3.2.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 +48 -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/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-G7ygVDGg.js → index-L8qtwqv6.js} +2 -2
- package/dist/dashboard/assets/{index-G7ygVDGg.js.map → index-L8qtwqv6.js.map} +1 -1
- package/dist/dashboard/dashboard-manifest.json +8 -8
- 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/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/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 +81 -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/discover.d.ts +10 -0
- package/dist/services/ship-checks/discover.d.ts.map +1 -0
- package/dist/services/ship-checks/discover.js +250 -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/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/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 +48 -1
- 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 +1 -1
- 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 +126 -90
- 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/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 +385 -79
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
- 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-6774fd3d5d02.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 +40 -7
- 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} +284 -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 +215 -55
- 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 +246 -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 +163 -274
- 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 +115 -240
- 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 +215 -0
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -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 +2170 -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 +1583 -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 +5 -1
- 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.20.0}/design-document.schema.json +78 -5
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +45 -12
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -1
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/claude/openplanr/skills/design/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/claude/openplanr/skills/design-loop/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/claude/openplanr/skills/design-review/schemas/design-document.schema.json +78 -5
- package/lib/host-packages/claude/openplanr/skills/investigate/SKILL.md +10 -1
- 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 +3 -0
- package/lib/host-packages/claude/openplanr/skills/plan/schemas/design-document.schema.json +78 -5
- package/lib/host-packages/claude/openplanr/skills/share/references/connectors.md +4 -6
- package/lib/host-packages/claude/openplanr/skills/ship/SKILL.md +15 -4
- 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/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 +125 -89
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-design-review/schemas/design-document.schema.json +78 -5
- 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 +10 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-plan/schemas/design-document.schema.json +78 -5
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +3 -0
- 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 +15 -4
- 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 +385 -79
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
- 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-6774fd3d5d02.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 +40 -7
- 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} +284 -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 +215 -55
- 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 +246 -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 +163 -274
- 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 +115 -240
- 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 +215 -0
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -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 +2170 -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 +1583 -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 +5 -1
- 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.20.0}/design-document.schema.json +78 -5
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +45 -12
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -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 +128 -92
- 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 +385 -79
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-handoff.mjs +1 -1
- 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-6774fd3d5d02.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 +40 -7
- 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} +284 -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 +215 -55
- 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 +246 -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 +163 -274
- 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 +115 -240
- 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 +215 -0
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/studio.js.sources/13-design-review-experience.js +2766 -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 +2170 -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 +1583 -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 +5 -1
- 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.20.0}/design-document.schema.json +78 -5
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design-protocol-contracts.mjs +247 -45
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +45 -12
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +5 -1
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/openai/openplanr/skills/design/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/openai/openplanr/skills/design-loop/schemas/design-document.schema.json +78 -5
- 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 +33 -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 +74 -1
- 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 +6 -0
- package/lib/host-packages/openai/openplanr/skills/design-review/schemas/design-document.schema.json +78 -5
- package/lib/host-packages/openai/openplanr/skills/investigate/SKILL.md +10 -1
- package/lib/host-packages/openai/openplanr/skills/investigate/openplanr.skill.json +22 -0
- 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 +3 -0
- package/lib/host-packages/openai/openplanr/skills/plan/schemas/design-document.schema.json +78 -5
- package/lib/host-packages/openai/openplanr/skills/share/references/connectors.md +4 -6
- package/lib/host-packages/openai/openplanr/skills/ship/SKILL.md +15 -4
- package/lib/host-packages/openai/openplanr/skills/ship/openplanr.skill.json +22 -0
- 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/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/package.json +3 -3
- 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
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const RUNNERS = new Set([
|
|
4
|
+
'npm',
|
|
5
|
+
'npx',
|
|
6
|
+
'pnpm',
|
|
7
|
+
'yarn',
|
|
8
|
+
'bun',
|
|
9
|
+
'bunx',
|
|
10
|
+
'node',
|
|
11
|
+
'deno',
|
|
12
|
+
'tsx',
|
|
13
|
+
'tsc',
|
|
14
|
+
'vitest',
|
|
15
|
+
'jest',
|
|
16
|
+
'playwright',
|
|
17
|
+
'biome',
|
|
18
|
+
'eslint',
|
|
19
|
+
'prettier',
|
|
20
|
+
'cargo',
|
|
21
|
+
'go',
|
|
22
|
+
'make',
|
|
23
|
+
'just',
|
|
24
|
+
'pytest',
|
|
25
|
+
'python',
|
|
26
|
+
'python3',
|
|
27
|
+
'dotnet',
|
|
28
|
+
'mvn',
|
|
29
|
+
'gradle',
|
|
30
|
+
'./gradlew',
|
|
31
|
+
'pre-commit',
|
|
32
|
+
]);
|
|
33
|
+
// Runner names that are also common English words never count on a bare prose line.
|
|
34
|
+
const AMBIGUOUS = new Set(['make', 'go', 'just', 'node', 'python', 'python3']);
|
|
35
|
+
const PREFIXES = [
|
|
36
|
+
['pnpm', 'exec'],
|
|
37
|
+
['pnpm', 'dlx'],
|
|
38
|
+
['bun', 'x'],
|
|
39
|
+
['npx'],
|
|
40
|
+
['bunx'],
|
|
41
|
+
];
|
|
42
|
+
const ACCEPTANCE = /\b(?:[A-Z][A-Z0-9]*-\d+\.)?AC-\d+\b/gu;
|
|
43
|
+
const ENV_ASSIGNMENT = /^[A-Za-z_][A-Za-z0-9_]*=\S*$/u;
|
|
44
|
+
function section(markdown, heading) {
|
|
45
|
+
const lines = markdown.split(/\r?\n/u);
|
|
46
|
+
const start = lines.findIndex((line) => line.trim() === `## ${heading}`);
|
|
47
|
+
if (start < 0)
|
|
48
|
+
return null;
|
|
49
|
+
const end = lines.findIndex((line, index) => index > start && /^##?\s/u.test(line));
|
|
50
|
+
return { body: lines.slice(start + 1, end < 0 ? undefined : end).join('\n'), line: start + 2 };
|
|
51
|
+
}
|
|
52
|
+
function binaries(root) {
|
|
53
|
+
const dir = join(root, 'node_modules/.bin');
|
|
54
|
+
return existsSync(dir) ? new Set(readdirSync(dir)) : new Set();
|
|
55
|
+
}
|
|
56
|
+
/** Whether text is a command: its first word, after env and runner prefixes, is a known runner. */
|
|
57
|
+
export function isCommand(text, bins, prose) {
|
|
58
|
+
const tokens = text.trim().split(/\s+/u).filter(Boolean);
|
|
59
|
+
while (tokens[0] !== undefined && ENV_ASSIGNMENT.test(tokens[0]))
|
|
60
|
+
tokens.shift();
|
|
61
|
+
for (const prefix of PREFIXES) {
|
|
62
|
+
if (prefix.every((word, index) => tokens[index] === word) && tokens.length > prefix.length) {
|
|
63
|
+
tokens.splice(0, prefix.length);
|
|
64
|
+
while (tokens[0]?.startsWith('-'))
|
|
65
|
+
tokens.shift();
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const head = tokens[0];
|
|
70
|
+
if (head === undefined)
|
|
71
|
+
return false;
|
|
72
|
+
if (prose && AMBIGUOUS.has(head))
|
|
73
|
+
return false;
|
|
74
|
+
return RUNNERS.has(head) || bins.has(head);
|
|
75
|
+
}
|
|
76
|
+
const LIST_MARKER = /^(?:[-*+]|\d+[.)])\s+(?:\[[ xX]\]\s+)?/u;
|
|
77
|
+
/**
|
|
78
|
+
* Every Test Requirements line yields at least one entry: each command it holds becomes a
|
|
79
|
+
* check, and any remaining prose becomes a requirement.
|
|
80
|
+
*/
|
|
81
|
+
export function readTaskRequirements(root, taskFile, relativePath) {
|
|
82
|
+
const markdown = readFileSync(taskFile, 'utf8');
|
|
83
|
+
const found = section(markdown, 'Test Requirements');
|
|
84
|
+
const result = { checks: [], requirements: [], acceptance: [] };
|
|
85
|
+
if (found === null)
|
|
86
|
+
return result;
|
|
87
|
+
const bins = binaries(root);
|
|
88
|
+
const acceptance = new Set();
|
|
89
|
+
let fenced = false;
|
|
90
|
+
found.body.split('\n').forEach((raw, index) => {
|
|
91
|
+
const line = found.line + index;
|
|
92
|
+
const trimmed = raw.trim();
|
|
93
|
+
if (/^(?:```|~~~)/u.test(trimmed)) {
|
|
94
|
+
fenced = !fenced;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (trimmed === '')
|
|
98
|
+
return;
|
|
99
|
+
const ids = [...new Set(trimmed.match(ACCEPTANCE) ?? [])];
|
|
100
|
+
for (const id of ids)
|
|
101
|
+
acceptance.add(id);
|
|
102
|
+
const commands = [];
|
|
103
|
+
let prose = trimmed.replace(LIST_MARKER, '');
|
|
104
|
+
if (fenced) {
|
|
105
|
+
if (!trimmed.startsWith('#'))
|
|
106
|
+
commands.push(trimmed);
|
|
107
|
+
prose = '';
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
prose = prose.replace(/`([^`\n]+)`/gu, (whole, span) => {
|
|
111
|
+
if (!isCommand(span, bins, false))
|
|
112
|
+
return whole;
|
|
113
|
+
commands.push(span.trim());
|
|
114
|
+
return '';
|
|
115
|
+
});
|
|
116
|
+
if (commands.length === 0 && isCommand(prose, bins, true) && !/[.:]$/u.test(prose)) {
|
|
117
|
+
commands.push(prose);
|
|
118
|
+
prose = '';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
commands.forEach((command, position) => {
|
|
122
|
+
result.checks.push({
|
|
123
|
+
id: `task:${line}${commands.length > 1 ? `:${position + 1}` : ''}`,
|
|
124
|
+
command,
|
|
125
|
+
cwd: '.',
|
|
126
|
+
sources: [{ kind: 'task', file: relativePath, line }],
|
|
127
|
+
tags: ['task'],
|
|
128
|
+
acceptanceIds: ids,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
const remaining = prose
|
|
132
|
+
.replace(ACCEPTANCE, '')
|
|
133
|
+
.replace(/[\s:;,.()\-–—]+/gu, ' ')
|
|
134
|
+
.trim();
|
|
135
|
+
if (remaining !== '')
|
|
136
|
+
result.requirements.push({
|
|
137
|
+
kind: 'prose',
|
|
138
|
+
text: trimmed.replace(LIST_MARKER, ''),
|
|
139
|
+
acceptanceIds: ids,
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
result.acceptance = [...acceptance];
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=task-requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-requirements.js","sourceRoot":"","sources":["../../../src/services/ship-checks/task-requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CheckCandidate, ShipDiagnostic } from './contract.js';
|
|
2
|
+
export type WorkflowTriggers = {
|
|
3
|
+
pullRequest: boolean;
|
|
4
|
+
mergeGroup: boolean;
|
|
5
|
+
push: boolean;
|
|
6
|
+
pullRequestPaths: string[] | null;
|
|
7
|
+
pullRequestPathsIgnore: string[] | null;
|
|
8
|
+
names: string[];
|
|
9
|
+
};
|
|
10
|
+
export type ParsedWorkflow = {
|
|
11
|
+
file: string;
|
|
12
|
+
triggers: WorkflowTriggers;
|
|
13
|
+
checks: CheckCandidate[];
|
|
14
|
+
/** Diagnostics that apply only when a tier includes this workflow. */
|
|
15
|
+
notes: ShipDiagnostic[];
|
|
16
|
+
};
|
|
17
|
+
/** Whether the workflow's pull-request-side triggers fire for the changed paths. */
|
|
18
|
+
export declare function firesForChange(triggers: WorkflowTriggers, paths: readonly string[]): boolean;
|
|
19
|
+
/** Parses every GitHub Actions workflow; invalid files become error diagnostics. */
|
|
20
|
+
export declare function readWorkflows(root: string, diagnostics: ShipDiagnostic[]): ParsedWorkflow[];
|
|
21
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/services/ship-checks/workflows.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAIpE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,sBAAsB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,sEAAsE;IACtE,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAyCF,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAY5F;AAgKD,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAuB3F"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { basename, join, posix } from 'node:path';
|
|
3
|
+
import { isMap, isScalar, LineCounter, parseDocument } from 'yaml';
|
|
4
|
+
import { diagnostic } from './contract.js';
|
|
5
|
+
import { matchesFilterList } from './glob.js';
|
|
6
|
+
const WORKFLOW_DIR = '.github/workflows';
|
|
7
|
+
const INSTALL = /^(?:npm (?:ci|install|i)|yarn|yarn install(?: .*)?|pnpm (?:install|i)(?: .*)?|bun install(?: .*)?)$/u;
|
|
8
|
+
const MATRIX_REF = /\$\{\{\s*matrix\.([\w-]+)\s*\}\}/gu;
|
|
9
|
+
const OTHER_CI_FILES = [
|
|
10
|
+
'.gitlab-ci.yml',
|
|
11
|
+
'.circleci/config.yml',
|
|
12
|
+
'azure-pipelines.yml',
|
|
13
|
+
'Jenkinsfile',
|
|
14
|
+
'.travis.yml',
|
|
15
|
+
'bitbucket-pipelines.yml',
|
|
16
|
+
];
|
|
17
|
+
const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
18
|
+
const text = (value) => typeof value === 'string'
|
|
19
|
+
? value
|
|
20
|
+
: typeof value === 'number' || typeof value === 'boolean'
|
|
21
|
+
? String(value)
|
|
22
|
+
: undefined;
|
|
23
|
+
const stringList = (value) => Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : null;
|
|
24
|
+
function readTriggers(on) {
|
|
25
|
+
const names = typeof on === 'string' ? [on] : Array.isArray(on) ? on.map(String) : Object.keys(record(on));
|
|
26
|
+
const pullRequest = record(record(on).pull_request);
|
|
27
|
+
return {
|
|
28
|
+
pullRequest: names.includes('pull_request'),
|
|
29
|
+
mergeGroup: names.includes('merge_group'),
|
|
30
|
+
push: names.includes('push'),
|
|
31
|
+
pullRequestPaths: stringList(pullRequest.paths),
|
|
32
|
+
pullRequestPathsIgnore: stringList(pullRequest['paths-ignore']),
|
|
33
|
+
names: [...names].sort(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Whether the workflow's pull-request-side triggers fire for the changed paths. */
|
|
37
|
+
export function firesForChange(triggers, paths) {
|
|
38
|
+
if (triggers.mergeGroup)
|
|
39
|
+
return true;
|
|
40
|
+
if (!triggers.pullRequest)
|
|
41
|
+
return false;
|
|
42
|
+
if (triggers.pullRequestPaths !== null) {
|
|
43
|
+
const include = triggers.pullRequestPaths;
|
|
44
|
+
return paths.some((path) => matchesFilterList(path, include));
|
|
45
|
+
}
|
|
46
|
+
if (triggers.pullRequestPathsIgnore !== null) {
|
|
47
|
+
const ignore = triggers.pullRequestPathsIgnore;
|
|
48
|
+
return paths.some((path) => !matchesFilterList(path, ignore));
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/** Static matrix combinations for the referenced keys, or null when they cannot be derived. */
|
|
53
|
+
function matrixCombinations(strategy, keys) {
|
|
54
|
+
if (keys.length === 0)
|
|
55
|
+
return [{}];
|
|
56
|
+
const matrix = record(record(strategy).matrix);
|
|
57
|
+
const axes = Object.keys(matrix).filter((key) => key !== 'include' && key !== 'exclude');
|
|
58
|
+
const include = matrix.include;
|
|
59
|
+
if (matrix.exclude !== undefined)
|
|
60
|
+
return null;
|
|
61
|
+
if (include !== undefined && axes.length > 0)
|
|
62
|
+
return null;
|
|
63
|
+
if (include !== undefined) {
|
|
64
|
+
if (!Array.isArray(include))
|
|
65
|
+
return null;
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
const combinations = [];
|
|
68
|
+
for (const entry of include) {
|
|
69
|
+
const values = record(entry);
|
|
70
|
+
const combination = {};
|
|
71
|
+
for (const key of keys) {
|
|
72
|
+
const value = text(values[key]);
|
|
73
|
+
if (value === undefined)
|
|
74
|
+
return null;
|
|
75
|
+
combination[key] = value;
|
|
76
|
+
}
|
|
77
|
+
const id = JSON.stringify(combination);
|
|
78
|
+
if (!seen.has(id)) {
|
|
79
|
+
seen.add(id);
|
|
80
|
+
combinations.push(combination);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return combinations;
|
|
84
|
+
}
|
|
85
|
+
let combinations = [{}];
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
const values = matrix[key];
|
|
88
|
+
if (!Array.isArray(values))
|
|
89
|
+
return null;
|
|
90
|
+
const scalars = values.map(text);
|
|
91
|
+
if (scalars.some((value) => value === undefined))
|
|
92
|
+
return null;
|
|
93
|
+
combinations = combinations.flatMap((combination) => scalars.map((value) => ({ ...combination, [key]: value })));
|
|
94
|
+
}
|
|
95
|
+
return combinations;
|
|
96
|
+
}
|
|
97
|
+
function substitute(value, combination) {
|
|
98
|
+
return value.replace(MATRIX_REF, (whole, key) => combination[key] ?? whole);
|
|
99
|
+
}
|
|
100
|
+
function normalizeCwd(value) {
|
|
101
|
+
if (value === undefined || value.trim() === '')
|
|
102
|
+
return '.';
|
|
103
|
+
const normalized = posix.normalize(value.trim().replace(/^\.\/+/u, ''));
|
|
104
|
+
return normalized === '' ? '.' : normalized.replace(/\/+$/u, '');
|
|
105
|
+
}
|
|
106
|
+
function runLine(document, counter, path) {
|
|
107
|
+
const node = document.getIn(path, true);
|
|
108
|
+
const range = isScalar(node) ? node.range : null;
|
|
109
|
+
return range ? counter.linePos(range[0]).line : null;
|
|
110
|
+
}
|
|
111
|
+
function parseWorkflow(root, name, diagnostics) {
|
|
112
|
+
const file = `${WORKFLOW_DIR}/${name}`;
|
|
113
|
+
const counter = new LineCounter();
|
|
114
|
+
const document = parseDocument(readFileSync(join(root, file), 'utf8'), { lineCounter: counter });
|
|
115
|
+
if (document.errors.length > 0) {
|
|
116
|
+
const first = document.errors[0];
|
|
117
|
+
diagnostics.push(diagnostic('WORKFLOW_INVALID', 'error', `${file} is not valid YAML: ${first?.message ?? 'parse error'}`, file));
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
const workflow = record(document.toJS());
|
|
121
|
+
const jobsNode = document.get('jobs', true);
|
|
122
|
+
if (!isMap(jobsNode)) {
|
|
123
|
+
diagnostics.push(diagnostic('WORKFLOW_INVALID', 'error', `${file} has no jobs map.`, file));
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
const workflowDefaults = record(record(workflow.defaults).run);
|
|
127
|
+
const jobs = record(workflow.jobs);
|
|
128
|
+
const checks = [];
|
|
129
|
+
const notes = [];
|
|
130
|
+
for (const jobId of jobsNode.items.map((pair) => String(isScalar(pair.key) ? pair.key.value : pair.key))) {
|
|
131
|
+
const job = record(jobs[jobId]);
|
|
132
|
+
if (typeof job.uses === 'string') {
|
|
133
|
+
notes.push(diagnostic('REUSABLE_WORKFLOW_SKIPPED', 'warning', `${file} job ${jobId} calls the reusable workflow ${job.uses}, which is not followed.`, file));
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const jobDefaults = record(record(job.defaults).run);
|
|
137
|
+
const needsServices = job.services !== undefined || job.container !== undefined;
|
|
138
|
+
const steps = Array.isArray(job.steps) ? job.steps : [];
|
|
139
|
+
steps.forEach((value, index) => {
|
|
140
|
+
const step = record(value);
|
|
141
|
+
const run = text(step.run);
|
|
142
|
+
if (run === undefined)
|
|
143
|
+
return;
|
|
144
|
+
const command = run.replace(/\n+$/u, '');
|
|
145
|
+
if (INSTALL.test(command.trim()))
|
|
146
|
+
return;
|
|
147
|
+
const stepLabel = text(step.name) ?? text(step.id) ?? `step ${index + 1}`;
|
|
148
|
+
const rawCwd = text(step['working-directory']) ??
|
|
149
|
+
text(jobDefaults['working-directory']) ??
|
|
150
|
+
text(workflowDefaults['working-directory']);
|
|
151
|
+
const keys = [
|
|
152
|
+
...new Set([...`${command}\n${rawCwd ?? ''}`.matchAll(MATRIX_REF)].map((match) => match[1] ?? '')),
|
|
153
|
+
];
|
|
154
|
+
const combinations = matrixCombinations(job.strategy, keys) ?? [{}];
|
|
155
|
+
const condition = text(step.if) ?? text(job.if);
|
|
156
|
+
const shell = text(step.shell) ?? text(jobDefaults.shell) ?? text(workflowDefaults.shell);
|
|
157
|
+
const line = runLine(document, counter, ['jobs', jobId, 'steps', index, 'run']);
|
|
158
|
+
for (const combination of combinations) {
|
|
159
|
+
const expanded = substitute(command, combination);
|
|
160
|
+
const cwd = substitute(rawCwd ?? '', combination);
|
|
161
|
+
const tags = ['ci'];
|
|
162
|
+
if (expanded.includes('\n'))
|
|
163
|
+
tags.push('multi-line');
|
|
164
|
+
if (/\$\{\{/u.test(`${expanded}\n${cwd}`))
|
|
165
|
+
tags.push('needs-review');
|
|
166
|
+
if (condition !== undefined)
|
|
167
|
+
tags.push('conditional');
|
|
168
|
+
if (needsServices)
|
|
169
|
+
tags.push('needs-services');
|
|
170
|
+
const suffix = Object.entries(combination)
|
|
171
|
+
.map(([key, entry]) => `[${key}=${entry}]`)
|
|
172
|
+
.join('');
|
|
173
|
+
checks.push({
|
|
174
|
+
id: `ci:${name}:${jobId}:${text(step.id) ?? index + 1}${suffix}`,
|
|
175
|
+
command: expanded,
|
|
176
|
+
cwd: normalizeCwd(cwd),
|
|
177
|
+
sources: [{ kind: 'ci', file, line, job: jobId, step: stepLabel }],
|
|
178
|
+
tags,
|
|
179
|
+
...(condition === undefined ? {} : { condition }),
|
|
180
|
+
...(shell === undefined ? {} : { shell }),
|
|
181
|
+
acceptanceIds: [],
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
return { file, triggers: readTriggers(workflow.on), checks, notes };
|
|
187
|
+
}
|
|
188
|
+
/** Parses every GitHub Actions workflow; invalid files become error diagnostics. */
|
|
189
|
+
export function readWorkflows(root, diagnostics) {
|
|
190
|
+
for (const other of OTHER_CI_FILES) {
|
|
191
|
+
if (existsSync(join(root, other))) {
|
|
192
|
+
diagnostics.push(diagnostic('CI_SYSTEM_UNSUPPORTED', 'warning', `${other} is not read; only GitHub Actions workflows are parsed.`, other));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
let names;
|
|
196
|
+
try {
|
|
197
|
+
names = readdirSync(join(root, WORKFLOW_DIR))
|
|
198
|
+
.filter((name) => /\.ya?ml$/u.test(name))
|
|
199
|
+
.sort();
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
if (error.code === 'ENOENT')
|
|
203
|
+
return [];
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
return names.flatMap((name) => parseWorkflow(root, basename(name), diagnostics) ?? []);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/services/ship-checks/workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/** Compile and render a Handlebars template, checking the override directory first. */
|
|
2
2
|
export declare function renderTemplate(templatePath: string, data: Record<string, unknown>, // Template data is inherently untyped
|
|
3
3
|
overrideDir?: string): Promise<string>;
|
|
4
|
+
/** Whether `overrideDir` holds its own copy of `templatePath`. */
|
|
5
|
+
export declare function hasTemplateOverride(templatePath: string, overrideDir?: string): Promise<boolean>;
|
|
4
6
|
//# sourceMappingURL=template-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAiCA,uFAAuF;AACvF,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sCAAsC;AACrE,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB"}
|
|
1
|
+
{"version":3,"file":"template-service.d.ts","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"AAiCA,uFAAuF;AACvF,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,sCAAsC;AACrE,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,kEAAkE;AAClE,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -33,6 +33,10 @@ overrideDir) {
|
|
|
33
33
|
}
|
|
34
34
|
return compiled(data);
|
|
35
35
|
}
|
|
36
|
+
/** Whether `overrideDir` holds its own copy of `templatePath`. */
|
|
37
|
+
export async function hasTemplateOverride(templatePath, overrideDir) {
|
|
38
|
+
return overrideDir ? fileExists(path.join(overrideDir, templatePath)) : false;
|
|
39
|
+
}
|
|
36
40
|
async function resolveTemplatePath(templatePath, overrideDir) {
|
|
37
41
|
if (overrideDir) {
|
|
38
42
|
const overrideFull = path.join(overrideDir, templatePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"template-service.js","sourceRoot":"","sources":["../../src/services/template-service.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/slugify.d.ts
CHANGED
|
@@ -1,9 +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 declare function slugify(text: string, maxLength?: number): string;
|
|
1
|
+
export { slugify } from '../../lib/backlog-item.mjs';
|
|
9
2
|
//# sourceMappingURL=slugify.d.ts.map
|
|
@@ -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
|
@@ -694,6 +694,50 @@ Cursor uses Composer handoff with sequential fallback.
|
|
|
694
694
|
|
|
695
695
|
---
|
|
696
696
|
|
|
697
|
+
### `openplanr ship checks`
|
|
698
|
+
|
|
699
|
+
List the checks a change needs for a tier, without running them. Sources are the
|
|
700
|
+
GitHub Actions workflows, husky (`.husky/pre-commit`, `.husky/pre-push`) and
|
|
701
|
+
pre-commit hooks, package scripts, and the task's `## Test Requirements`.
|
|
702
|
+
|
|
703
|
+
```bash
|
|
704
|
+
openplanr ship checks --task .planr/tasks/T-012-parser.md --json
|
|
705
|
+
openplanr ship checks --tier push --json
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
| Option | Description | Default |
|
|
709
|
+
| --------------- | -------------------------------------------------------------- | ----------------------------------------- |
|
|
710
|
+
| `--task <path>` | Task file whose Test Requirements to include | none |
|
|
711
|
+
| `--tier <tier>` | `task`, `story`, `push` or `planning` | `planning` for a `.planr`-only change, else `task` |
|
|
712
|
+
| `--base <ref>` | Compare against the merge base with this ref | `origin/HEAD`, then `main` |
|
|
713
|
+
| `--json` | Print the `openplanr-ship-checks` result (schema `1.0.0`) | `false` |
|
|
714
|
+
|
|
715
|
+
**Tiers:**
|
|
716
|
+
|
|
717
|
+
- `planning`: `openplanr spec sync --dry-run` and `openplanr sync --dry-run`, tagged
|
|
718
|
+
`report-only` because both exit 0 when they report problems.
|
|
719
|
+
- `task`: Test Requirements commands, pre-commit hooks, and the CI build when the
|
|
720
|
+
change touches a package entry point, a build script, a `tsconfig*.json` or a
|
|
721
|
+
bundler config. Without a task command, the `test`, `typecheck` and `lint`
|
|
722
|
+
scripts are listed as `fallback`.
|
|
723
|
+
- `story`: `task` plus every `run` step of the pull-request and merge-queue
|
|
724
|
+
workflows whose path filters match the change.
|
|
725
|
+
- `push`: `story` without path filters, plus push workflows and pre-push hooks.
|
|
726
|
+
|
|
727
|
+
Each CI step is kept verbatim with its `cwd` (step, then job, then workflow
|
|
728
|
+
`working-directory`). Install steps and `uses` steps are skipped. A static matrix
|
|
729
|
+
is expanded; other `${{ }}` expressions are tagged `needs-review`. A check is
|
|
730
|
+
`tracked-only` when its command, its package script, or a script file either one
|
|
731
|
+
runs directly mentions `lint-staged`, `ls-files`, `--cached` or `--staged`;
|
|
732
|
+
deeper calls are not followed. `relatedTests` lists test files that mention a
|
|
733
|
+
name the change exports, a `.command()` name, or a route path.
|
|
734
|
+
|
|
735
|
+
`complete` is `false` when any diagnostic is an `error`, for example a workflow
|
|
736
|
+
that fails to parse: the listed checks are then not the full CI set. The command
|
|
737
|
+
exits 1 for an unknown tier, a missing `--task` file or a directory outside git.
|
|
738
|
+
|
|
739
|
+
---
|
|
740
|
+
|
|
697
741
|
### `openplanr sync`
|
|
698
742
|
|
|
699
743
|
Validate and repair cross-references across all artifacts.
|
|
@@ -1286,6 +1330,9 @@ For semantic decomposition, invoke the installed `planr:plan` skill. After revie
|
|
|
1286
1330
|
"backlog": "BL",
|
|
1287
1331
|
"sprint": "SPRINT"
|
|
1288
1332
|
},
|
|
1289
|
-
"createdAt": "2026-03-26"
|
|
1333
|
+
"createdAt": "2026-03-26",
|
|
1334
|
+
"findings": { "unattended": "report" }
|
|
1290
1335
|
}
|
|
1291
1336
|
```
|
|
1337
|
+
|
|
1338
|
+
`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>;
|