openplanr 2.2641.1 → 2.2641.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +1 -1
- package/dist/cli/commands/artifact.js +1 -1
- package/dist/cli/commands/artifact.js.map +1 -1
- package/dist/cli/commands/github.d.ts.map +1 -1
- package/dist/cli/commands/github.js +7 -10
- package/dist/cli/commands/github.js.map +1 -1
- package/dist/cli/commands/linear.js +1 -1
- package/dist/cli/commands/linear.js.map +1 -1
- package/dist/cli/commands/report.d.ts.map +1 -1
- package/dist/cli/commands/report.js +28 -32
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-DGyC7RDz.js → index-DI_TKz9J.js} +2 -2
- package/dist/dashboard/assets/{index-DGyC7RDz.js.map → index-DI_TKz9J.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 +0 -4
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +0 -2
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +1 -4
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/credentials-service.js +1 -1
- package/dist/services/credentials-service.js.map +1 -1
- package/dist/services/distribution-service.d.ts +1 -4
- package/dist/services/distribution-service.d.ts.map +1 -1
- package/dist/services/distribution-service.js +1 -60
- package/dist/services/distribution-service.js.map +1 -1
- package/dist/services/github-service.d.ts +7 -4
- package/dist/services/github-service.d.ts.map +1 -1
- package/dist/services/github-service.js +16 -15
- package/dist/services/github-service.js.map +1 -1
- package/dist/services/linear-push-service.d.ts +3 -4
- package/dist/services/linear-push-service.d.ts.map +1 -1
- package/dist/services/linear-push-service.js +5 -6
- package/dist/services/linear-push-service.js.map +1 -1
- package/dist/services/spec-service.d.ts.map +1 -1
- package/dist/services/spec-service.js +34 -69
- package/dist/services/spec-service.js.map +1 -1
- package/dist/templates/rules/shared/capability-map.md.hbs +1 -1
- package/docs/CLI.md +10 -14
- package/lib/host-packages/adapter-registry.json +5 -5
- package/lib/host-packages/capability-map.json +8 -8
- 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 +80 -64
- package/lib/host-packages/claude/openplanr/README.md +8 -12
- package/lib/host-packages/claude/openplanr/agents/planr-backend.md +49 -55
- package/lib/host-packages/claude/openplanr/agents/planr-database.md +56 -92
- package/lib/host-packages/claude/openplanr/agents/planr-designer.md +35 -51
- package/lib/host-packages/claude/openplanr/agents/planr-devops.md +37 -51
- package/lib/host-packages/claude/openplanr/agents/planr-documentation.md +29 -52
- package/lib/host-packages/claude/openplanr/agents/planr-entity-scaffold.md +24 -23
- package/lib/host-packages/claude/openplanr/agents/planr-frontend.md +46 -58
- package/lib/host-packages/claude/openplanr/agents/planr-qa.md +4 -2
- package/lib/host-packages/claude/openplanr/agents/planr-specification.md +54 -51
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/backend.md +21 -65
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/designer.md +5 -6
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/devops.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/doc-gen.md +3 -4
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/frontend.md +19 -64
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/default/specification.md +10 -12
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/backend.md +19 -62
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/designer.md +3 -4
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/devops.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/doc-gen.md +2 -3
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/frontend.md +16 -59
- package/lib/host-packages/claude/openplanr/references/agents/shared/modes/spec-driven/specification.md +9 -11
- package/lib/host-packages/claude/openplanr/references/pipeline/stacks/database/mongodb.md +4 -4
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-review.mjs +24 -9
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/design-share.mjs +3 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
- package/lib/host-packages/claude/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/design.mjs +1 -1
- package/lib/host-packages/claude/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
- package/lib/host-packages/claude/openplanr/skills/artifact/SKILL.md +2 -2
- package/lib/host-packages/claude/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/ceo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/chair-review/SKILL.md +6 -2
- package/lib/host-packages/claude/openplanr/skills/challenger-review/SKILL.md +6 -2
- package/lib/host-packages/claude/openplanr/skills/cmo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/coo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/cpo-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/cto-review/SKILL.md +0 -1
- package/lib/host-packages/claude/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/claude/openplanr/skills/delegate/SKILL.md +7 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/references/operator-guide.md +7 -5
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/claude/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
- package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
- package/lib/host-packages/claude/openplanr/skills/operate/SKILL.md +5 -3
- package/lib/host-packages/claude/openplanr/skills/plan/SKILL.md +8 -2
- package/lib/host-packages/claude/openplanr/skills/sprint/SKILL.md +5 -4
- package/lib/host-packages/claude/openplanr/skills/sprint/references/tracker-connections.md +70 -0
- package/lib/host-packages/claude/openplanr/skills/status/SKILL.md +4 -3
- package/lib/host-packages/claude/openplanr/skills/status/references/tracker-connections.md +70 -0
- package/lib/host-packages/claude/openplanr/skills/sync/SKILL.md +11 -20
- package/lib/host-packages/claude/openplanr/skills/sync/references/tracker-connections.md +70 -0
- package/lib/host-packages/claude/openplanr/skills/sync/scripts/sync.mjs +2 -2
- package/lib/host-packages/cursor/openplanr/.openplanr-content.json +52 -36
- package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact/references/diagram-sharing.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-artifact.mdc +2 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-chair-review.mdc +6 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-challenger-review.mdc +6 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/references/operator-guide.md +7 -5
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate/scripts/run-record.mjs +2 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-delegate.mdc +7 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-sharing.md +1 -1
- package/lib/host-packages/cursor/openplanr/rules/planr-operate.mdc +5 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-plan.mdc +8 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/tracker-connections.md +70 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sprint.mdc +5 -4
- package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md +70 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-status.mdc +4 -3
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/references/tracker-connections.md +70 -0
- package/lib/host-packages/cursor/openplanr/rules/planr-sync/scripts/sync.mjs +2 -2
- package/lib/host-packages/cursor/openplanr/rules/planr-sync.mdc +11 -20
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-review.mjs +24 -9
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/design-share.mjs +3 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/design.mjs +1 -1
- package/lib/host-packages/cursor/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -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 +61 -45
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-review.mjs +24 -9
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/design-share.mjs +3 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/package.json +3 -3
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/design/templates/studio/share.js +1 -1
- package/lib/host-packages/openai/openplanr/runtime/design/scripts/runtime/packages/protocol/package.json +1 -1
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/design.mjs +1 -1
- package/lib/host-packages/openai/openplanr/runtime/plan/scripts/runtime/packages/protocol/package.json +1 -1
- package/lib/host-packages/openai/openplanr/skills/artifact/SKILL.md +2 -2
- package/lib/host-packages/openai/openplanr/skills/artifact/references/diagram-sharing.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/ceo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/ceo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/chair-review/SKILL.md +6 -2
- package/lib/host-packages/openai/openplanr/skills/challenger-review/SKILL.md +6 -2
- package/lib/host-packages/openai/openplanr/skills/cmo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cmo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/coo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/coo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/cpo-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cpo-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/cto-review/SKILL.md +0 -1
- package/lib/host-packages/openai/openplanr/skills/cto-review/references/operate-advisor-contract.md +25 -4
- package/lib/host-packages/openai/openplanr/skills/delegate/SKILL.md +7 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/references/capsule-contract.md +16 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/references/operator-guide.md +7 -5
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/claude.mjs +11 -4
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/adapters/native.mjs +1 -1
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/backend-diagnostics.mjs +14 -48
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/context.mjs +84 -22
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/credentials.mjs +167 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/presentation.mjs +3 -2
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-contract.mjs +5 -7
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-preparation.mjs +2 -0
- package/lib/host-packages/openai/openplanr/skills/delegate/scripts/run-record.mjs +2 -3
- package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-sharing.md +1 -1
- package/lib/host-packages/openai/openplanr/skills/operate/SKILL.md +5 -3
- package/lib/host-packages/openai/openplanr/skills/plan/SKILL.md +8 -2
- package/lib/host-packages/openai/openplanr/skills/sprint/SKILL.md +5 -4
- package/lib/host-packages/openai/openplanr/skills/sprint/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/sprint/references/tracker-connections.md +70 -0
- package/lib/host-packages/openai/openplanr/skills/status/SKILL.md +4 -3
- package/lib/host-packages/openai/openplanr/skills/status/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/status/references/tracker-connections.md +70 -0
- package/lib/host-packages/openai/openplanr/skills/sync/SKILL.md +11 -20
- package/lib/host-packages/openai/openplanr/skills/sync/openplanr.skill.json +11 -0
- package/lib/host-packages/openai/openplanr/skills/sync/references/tracker-connections.md +70 -0
- package/lib/host-packages/openai/openplanr/skills/sync/scripts/sync.mjs +2 -2
- package/lib/integrations.mjs +2 -2
- package/package.json +2 -2
- package/dist/services/connectors/adapters/business-metrics.d.ts +0 -5
- package/dist/services/connectors/adapters/business-metrics.d.ts.map +0 -1
- package/dist/services/connectors/adapters/business-metrics.js +0 -41
- package/dist/services/connectors/adapters/business-metrics.js.map +0 -1
- package/dist/services/connectors/adapters/deployment-health.d.ts +0 -18
- package/dist/services/connectors/adapters/deployment-health.d.ts.map +0 -1
- package/dist/services/connectors/adapters/deployment-health.js +0 -67
- package/dist/services/connectors/adapters/deployment-health.js.map +0 -1
- package/dist/services/connectors/adapters/github.d.ts +0 -5
- package/dist/services/connectors/adapters/github.d.ts.map +0 -1
- package/dist/services/connectors/adapters/github.js +0 -31
- package/dist/services/connectors/adapters/github.js.map +0 -1
- package/dist/services/connectors/adapters/linear-jira.d.ts +0 -5
- package/dist/services/connectors/adapters/linear-jira.d.ts.map +0 -1
- package/dist/services/connectors/adapters/linear-jira.js +0 -26
- package/dist/services/connectors/adapters/linear-jira.js.map +0 -1
- package/dist/services/connectors/adapters/posthog.d.ts +0 -5
- package/dist/services/connectors/adapters/posthog.d.ts.map +0 -1
- package/dist/services/connectors/adapters/posthog.js +0 -31
- package/dist/services/connectors/adapters/posthog.js.map +0 -1
- package/dist/services/connectors/adapters/sentry.d.ts +0 -5
- package/dist/services/connectors/adapters/sentry.d.ts.map +0 -1
- package/dist/services/connectors/adapters/sentry.js +0 -31
- package/dist/services/connectors/adapters/sentry.js.map +0 -1
- package/dist/services/connectors/checkpoint-custody.d.ts +0 -45
- package/dist/services/connectors/checkpoint-custody.d.ts.map +0 -1
- package/dist/services/connectors/checkpoint-custody.js +0 -499
- package/dist/services/connectors/checkpoint-custody.js.map +0 -1
- package/dist/services/connectors/connector-registry.d.ts +0 -144
- package/dist/services/connectors/connector-registry.d.ts.map +0 -1
- package/dist/services/connectors/connector-registry.js +0 -423
- package/dist/services/connectors/connector-registry.js.map +0 -1
- package/dist/services/connectors/connector-runtime.d.ts +0 -208
- package/dist/services/connectors/connector-runtime.d.ts.map +0 -1
- package/dist/services/connectors/connector-runtime.js +0 -1305
- package/dist/services/connectors/connector-runtime.js.map +0 -1
- package/dist/services/connectors/credential-custody.d.ts +0 -96
- package/dist/services/connectors/credential-custody.d.ts.map +0 -1
- package/dist/services/connectors/credential-custody.js +0 -390
- package/dist/services/connectors/credential-custody.js.map +0 -1
|
@@ -78,8 +78,14 @@ Write stories and tasks directly in the repository's active planning mode.
|
|
|
78
78
|
deleted ID. The packaged [planning ID helper](planr-plan/scripts/planning-ids.mjs) may
|
|
79
79
|
inspect or reserve IDs; it never generates content.
|
|
80
80
|
- Give each story stable acceptance IDs starting at `AC-001`.
|
|
81
|
-
-
|
|
82
|
-
|
|
81
|
+
- Split each story into tasks that are coherent and independently verifiable.
|
|
82
|
+
Separate by ownership first: UI work is a `UI` task for the frontend role and
|
|
83
|
+
server, data, or integration work is a `Tech` task for the backend role.
|
|
84
|
+
Within one owner, split further only for a real output dependency, a distinct
|
|
85
|
+
verification surface, or reviewable size. Most stories need one Tech task,
|
|
86
|
+
plus one UI task when a design surface applies; never fragment one coherent
|
|
87
|
+
change into tasks that cannot be verified alone, and never fold unrelated work
|
|
88
|
+
into one task.
|
|
83
89
|
- Map every acceptance ID through `acceptanceRefs` and name it with a concrete
|
|
84
90
|
verification statement under `## Test Requirements`.
|
|
85
91
|
- Set `reviewRisks` and `browserSurfaces` from repository evidence; use empty
|
package/lib/host-packages/cursor/openplanr/rules/planr-sprint/references/tracker-connections.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# GitHub and Linear connections
|
|
2
|
+
|
|
3
|
+
These skills store and read no GitHub or Linear credentials. Remote steps run through a
|
|
4
|
+
connection the host already has; the planning files stay the source of truth.
|
|
5
|
+
|
|
6
|
+
## Use the host's connection
|
|
7
|
+
|
|
8
|
+
- **Linear:** the host's Linear connection, whose tools read, create and update issues.
|
|
9
|
+
- **GitHub:** the host's GitHub connection, or the GitHub CLI when
|
|
10
|
+
`gh auth status --hostname github.com` succeeds.
|
|
11
|
+
|
|
12
|
+
Never ask the user for a token, read one from the environment or a file, or put one in a
|
|
13
|
+
command, URL or file.
|
|
14
|
+
|
|
15
|
+
## When a connection is missing
|
|
16
|
+
|
|
17
|
+
Finish the local work first. Then report the remote step as not run and give the one
|
|
18
|
+
line for the current host:
|
|
19
|
+
|
|
20
|
+
| Host | Linear | GitHub |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
+
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
+
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
+
|
|
26
|
+
Ask the user to try again once connected; never retry the remote step on your own.
|
|
27
|
+
|
|
28
|
+
## Status mapping
|
|
29
|
+
|
|
30
|
+
| Local status | Linear workflow state | GitHub issue |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `planning`, `pending` | Unstarted (for example Todo) | open |
|
|
33
|
+
| `in-progress` | Started (for example In Progress) | open |
|
|
34
|
+
| `done` | Completed (for example Done) | closed |
|
|
35
|
+
| Backlog `open` | Backlog, else Unstarted | open |
|
|
36
|
+
| Backlog `closed` | Completed | closed |
|
|
37
|
+
| Backlog `promoted` | Leave as it is | Leave as it is |
|
|
38
|
+
|
|
39
|
+
When reading state back, write only a status the item's type allows. A backlog item takes
|
|
40
|
+
`open` or `closed` and keeps `promoted`.
|
|
41
|
+
|
|
42
|
+
- Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
|
|
43
|
+
`in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
|
|
44
|
+
and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
|
|
45
|
+
task files keep their status.
|
|
46
|
+
- A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
|
|
47
|
+
`in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
|
|
48
|
+
stay as they are.
|
|
49
|
+
|
|
50
|
+
## Links
|
|
51
|
+
|
|
52
|
+
A linked item records its tracker identity in frontmatter. Update a linked item through
|
|
53
|
+
that identity instead of creating another, and record the identity of everything you
|
|
54
|
+
create.
|
|
55
|
+
|
|
56
|
+
- **GitHub:** each item is one issue, recorded as `githubIssue`.
|
|
57
|
+
- **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
|
|
58
|
+
create:
|
|
59
|
+
- An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
|
|
60
|
+
`linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
|
|
61
|
+
it is a milestone in an existing project (`linearMilestoneId`) or a team label
|
|
62
|
+
(`linearLabelId`) instead, and every issue under it carries that milestone
|
|
63
|
+
(`linearProjectMilestoneId`) or label (`linearLabelIds`).
|
|
64
|
+
- A feature, quick task or backlog item is one issue (`linearIssueId`,
|
|
65
|
+
`linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
|
|
66
|
+
issue (`linearParentIssueId`).
|
|
67
|
+
- All task files of one feature share one task-list issue: a sub-issue of the feature's
|
|
68
|
+
issue whose checklist merges every task file, recorded in each task file. Its state is
|
|
69
|
+
Completed when every task file is `done`, Unstarted when every one is `pending`, and
|
|
70
|
+
Started otherwise.
|
|
@@ -35,7 +35,7 @@ capability; it never blocks the run. Name every degraded input in `Issues`.
|
|
|
35
35
|
| Capacity (engineers × working days) | Fit the list and name the overflow | Ask once; default 1 engineer × 10 days, stated in the return |
|
|
36
36
|
| Previous sprint or refinement note (`.planr/sprints/SPRINT-NNN/refinement.json`) | Carry `leftovers`; `openplanr sprint diff` is possible | First run, no diff |
|
|
37
37
|
| Last Operate cycle | Rank its unfinished actions alongside | Skipped silently |
|
|
38
|
-
| Linear or GitHub
|
|
38
|
+
| Linear or GitHub connection ([tracker connections](planr-sprint/references/tracker-connections.md)) | Update linked issues on approval, read PR state | Local files only; report the external step as not run and name the connection to add |
|
|
39
39
|
|
|
40
40
|
## Step 0: Frame the run
|
|
41
41
|
|
|
@@ -134,9 +134,10 @@ openplanr sprint apply SPRINT-NNN --dry-run # show the status and prior
|
|
|
134
134
|
openplanr sprint apply SPRINT-NNN --yes --commit # one commit: chore(planr): refine backlog for SPRINT-NNN
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
137
|
+
Then update the issue linked to each changed item through the host's Linear or
|
|
138
|
+
GitHub connection, with the status mapping in
|
|
139
|
+
[tracker connections](planr-sprint/references/tracker-connections.md), and report the items that
|
|
140
|
+
were not updated. When the CLI is unavailable, apply the same status changes with
|
|
140
141
|
the repository's own vocabulary and commit them with the same message.
|
|
141
142
|
|
|
142
143
|
Close a finished sprint with `openplanr sprint close SPRINT-NNN`; it records the
|
package/lib/host-packages/cursor/openplanr/rules/planr-status/references/tracker-connections.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# GitHub and Linear connections
|
|
2
|
+
|
|
3
|
+
These skills store and read no GitHub or Linear credentials. Remote steps run through a
|
|
4
|
+
connection the host already has; the planning files stay the source of truth.
|
|
5
|
+
|
|
6
|
+
## Use the host's connection
|
|
7
|
+
|
|
8
|
+
- **Linear:** the host's Linear connection, whose tools read, create and update issues.
|
|
9
|
+
- **GitHub:** the host's GitHub connection, or the GitHub CLI when
|
|
10
|
+
`gh auth status --hostname github.com` succeeds.
|
|
11
|
+
|
|
12
|
+
Never ask the user for a token, read one from the environment or a file, or put one in a
|
|
13
|
+
command, URL or file.
|
|
14
|
+
|
|
15
|
+
## When a connection is missing
|
|
16
|
+
|
|
17
|
+
Finish the local work first. Then report the remote step as not run and give the one
|
|
18
|
+
line for the current host:
|
|
19
|
+
|
|
20
|
+
| Host | Linear | GitHub |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
+
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
+
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
+
|
|
26
|
+
Ask the user to try again once connected; never retry the remote step on your own.
|
|
27
|
+
|
|
28
|
+
## Status mapping
|
|
29
|
+
|
|
30
|
+
| Local status | Linear workflow state | GitHub issue |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `planning`, `pending` | Unstarted (for example Todo) | open |
|
|
33
|
+
| `in-progress` | Started (for example In Progress) | open |
|
|
34
|
+
| `done` | Completed (for example Done) | closed |
|
|
35
|
+
| Backlog `open` | Backlog, else Unstarted | open |
|
|
36
|
+
| Backlog `closed` | Completed | closed |
|
|
37
|
+
| Backlog `promoted` | Leave as it is | Leave as it is |
|
|
38
|
+
|
|
39
|
+
When reading state back, write only a status the item's type allows. A backlog item takes
|
|
40
|
+
`open` or `closed` and keeps `promoted`.
|
|
41
|
+
|
|
42
|
+
- Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
|
|
43
|
+
`in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
|
|
44
|
+
and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
|
|
45
|
+
task files keep their status.
|
|
46
|
+
- A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
|
|
47
|
+
`in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
|
|
48
|
+
stay as they are.
|
|
49
|
+
|
|
50
|
+
## Links
|
|
51
|
+
|
|
52
|
+
A linked item records its tracker identity in frontmatter. Update a linked item through
|
|
53
|
+
that identity instead of creating another, and record the identity of everything you
|
|
54
|
+
create.
|
|
55
|
+
|
|
56
|
+
- **GitHub:** each item is one issue, recorded as `githubIssue`.
|
|
57
|
+
- **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
|
|
58
|
+
create:
|
|
59
|
+
- An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
|
|
60
|
+
`linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
|
|
61
|
+
it is a milestone in an existing project (`linearMilestoneId`) or a team label
|
|
62
|
+
(`linearLabelId`) instead, and every issue under it carries that milestone
|
|
63
|
+
(`linearProjectMilestoneId`) or label (`linearLabelIds`).
|
|
64
|
+
- A feature, quick task or backlog item is one issue (`linearIssueId`,
|
|
65
|
+
`linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
|
|
66
|
+
issue (`linearParentIssueId`).
|
|
67
|
+
- All task files of one feature share one task-list issue: a sub-issue of the feature's
|
|
68
|
+
issue whose checklist merges every task file, recorded in each task file. Its state is
|
|
69
|
+
Completed when every task file is `done`, Unstarted when every one is `pending`, and
|
|
70
|
+
Started otherwise.
|
|
@@ -10,9 +10,10 @@ planning artifacts, task statuses, dependency graph, current branch, and relevan
|
|
|
10
10
|
runtime markers directly. Use the optional deterministic `openplanr status --json`
|
|
11
11
|
utility when available, but do not require it or a semantic subprocess.
|
|
12
12
|
|
|
13
|
-
Add GitHub or Linear lookups only when the user requests live remote state
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
Add GitHub or Linear lookups only when the user requests live remote state, through
|
|
14
|
+
the host's connections as described in [tracker connections](planr-status/references/tracker-connections.md).
|
|
15
|
+
Keep local results useful when a connection is unavailable, and name the one to add.
|
|
16
|
+
Report counts, ready and blocked work, dependency problems, and the most useful next
|
|
16
17
|
action. Do not repair artifacts, start Plan or Ship, or change lifecycle state.
|
|
17
18
|
|
|
18
19
|
When the OpenPlanr dashboard is running (`planr-dashboard`), the same delivery
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# GitHub and Linear connections
|
|
2
|
+
|
|
3
|
+
These skills store and read no GitHub or Linear credentials. Remote steps run through a
|
|
4
|
+
connection the host already has; the planning files stay the source of truth.
|
|
5
|
+
|
|
6
|
+
## Use the host's connection
|
|
7
|
+
|
|
8
|
+
- **Linear:** the host's Linear connection, whose tools read, create and update issues.
|
|
9
|
+
- **GitHub:** the host's GitHub connection, or the GitHub CLI when
|
|
10
|
+
`gh auth status --hostname github.com` succeeds.
|
|
11
|
+
|
|
12
|
+
Never ask the user for a token, read one from the environment or a file, or put one in a
|
|
13
|
+
command, URL or file.
|
|
14
|
+
|
|
15
|
+
## When a connection is missing
|
|
16
|
+
|
|
17
|
+
Finish the local work first. Then report the remote step as not run and give the one
|
|
18
|
+
line for the current host:
|
|
19
|
+
|
|
20
|
+
| Host | Linear | GitHub |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| Claude Code | Run `/plugin install linear@claude-plugins-official`, then sign in to Linear from `/mcp`. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
23
|
+
| Codex | Run `codex mcp add linear --url https://mcp.linear.app/mcp`, then `codex mcp login linear`. | Install the GitHub plugin from `/plugins`, or run `gh auth login`. |
|
|
24
|
+
| Cursor | Add Linear from the Cursor Marketplace and sign in to Linear. | Install the GitHub CLI (cli.github.com) and run `gh auth login`. |
|
|
25
|
+
|
|
26
|
+
Ask the user to try again once connected; never retry the remote step on your own.
|
|
27
|
+
|
|
28
|
+
## Status mapping
|
|
29
|
+
|
|
30
|
+
| Local status | Linear workflow state | GitHub issue |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `planning`, `pending` | Unstarted (for example Todo) | open |
|
|
33
|
+
| `in-progress` | Started (for example In Progress) | open |
|
|
34
|
+
| `done` | Completed (for example Done) | closed |
|
|
35
|
+
| Backlog `open` | Backlog, else Unstarted | open |
|
|
36
|
+
| Backlog `closed` | Completed | closed |
|
|
37
|
+
| Backlog `promoted` | Leave as it is | Leave as it is |
|
|
38
|
+
|
|
39
|
+
When reading state back, write only a status the item's type allows. A backlog item takes
|
|
40
|
+
`open` or `closed` and keeps `promoted`.
|
|
41
|
+
|
|
42
|
+
- Linear Completed or Canceled sets `done`, or `closed` for a backlog item. Started sets
|
|
43
|
+
`in-progress`, and Triage, Backlog or Unstarted sets `planning` for features and stories
|
|
44
|
+
and `pending` for quick tasks; a backlog item takes `open` from any of these. Epics and
|
|
45
|
+
task files keep their status.
|
|
46
|
+
- A closed GitHub issue sets `done`, or `closed` for a backlog item. An open issue sets
|
|
47
|
+
`in-progress` for a `done` item and `open` for a `closed` backlog item; other statuses
|
|
48
|
+
stay as they are.
|
|
49
|
+
|
|
50
|
+
## Links
|
|
51
|
+
|
|
52
|
+
A linked item records its tracker identity in frontmatter. Update a linked item through
|
|
53
|
+
that identity instead of creating another, and record the identity of everything you
|
|
54
|
+
create.
|
|
55
|
+
|
|
56
|
+
- **GitHub:** each item is one issue, recorded as `githubIssue`.
|
|
57
|
+
- **Linear:** use the shapes the OpenPlanr CLI uses, so its later pushes reuse what you
|
|
58
|
+
create:
|
|
59
|
+
- An epic is a Linear project (`linearProjectId`, `linearProjectIdentifier`,
|
|
60
|
+
`linearProjectUrl`). When its `linearMappingStrategy` is `milestone-of` or `label-on`,
|
|
61
|
+
it is a milestone in an existing project (`linearMilestoneId`) or a team label
|
|
62
|
+
(`linearLabelId`) instead, and every issue under it carries that milestone
|
|
63
|
+
(`linearProjectMilestoneId`) or label (`linearLabelIds`).
|
|
64
|
+
- A feature, quick task or backlog item is one issue (`linearIssueId`,
|
|
65
|
+
`linearIssueIdentifier`, `linearIssueUrl`). A story is a sub-issue of its feature's
|
|
66
|
+
issue (`linearParentIssueId`).
|
|
67
|
+
- All task files of one feature share one task-list issue: a sub-issue of the feature's
|
|
68
|
+
issue whose checklist merges every task file, recorded in each task file. Its state is
|
|
69
|
+
Completed when every task file is `done`, Unstarted when every one is `pending`, and
|
|
70
|
+
Started otherwise.
|
|
@@ -5,7 +5,7 @@ import { access, readFile } from 'node:fs/promises';
|
|
|
5
5
|
import { resolve } from 'node:path';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
|
-
import {
|
|
8
|
+
import { PLANNING_FOLDER } from './names.mjs';
|
|
9
9
|
|
|
10
10
|
const execFileAsync = promisify(execFile);
|
|
11
11
|
const LINEAR_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
|
|
@@ -147,7 +147,7 @@ export async function runPortableSync(
|
|
|
147
147
|
} else if (args.provider === 'linear') {
|
|
148
148
|
throw new IntegrationError(
|
|
149
149
|
'E_SYNC_USAGE',
|
|
150
|
-
|
|
150
|
+
"Linear synchronization runs through the host's Linear connection.",
|
|
151
151
|
);
|
|
152
152
|
} else {
|
|
153
153
|
throw new IntegrationError(
|
|
@@ -6,31 +6,22 @@ alwaysApply: false
|
|
|
6
6
|
# OpenPlanr Sync
|
|
7
7
|
|
|
8
8
|
Reconcile local planning artifacts and, when requested, GitHub or Linear state.
|
|
9
|
-
Reason about conflicts in this active session
|
|
10
|
-
|
|
11
|
-
Local and GitHub work never require the OpenPlanr CLI.
|
|
9
|
+
Reason about conflicts in this active session. Local and GitHub work never require
|
|
10
|
+
the OpenPlanr CLI.
|
|
12
11
|
|
|
13
|
-
|
|
12
|
+
Remote steps run through the host's own connections, as described in
|
|
13
|
+
[tracker connections](planr-sync/references/tracker-connections.md), which also holds the status
|
|
14
|
+
mapping and what to tell the user when a connection is missing:
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Linear through the CLI:
|
|
21
|
-
|
|
22
|
-
- the user runs `openplanr linear init` in a terminal once; it prompts for a personal
|
|
23
|
-
access token, which the CLI stores;
|
|
24
|
-
- audit with `openplanr linear sync --dry-run`, which reads Linear without writing;
|
|
25
|
-
- before a real `openplanr linear sync`, ask how conflicts should resolve and pass
|
|
26
|
-
`--on-conflict local` or `--on-conflict linear`; without a prompt it favors Linear;
|
|
27
|
-
- `openplanr linear push <artifact-id>` creates or updates Linear issues; preview with
|
|
28
|
-
`--dry-run`. Quick tasks and backlog items need `linear.standaloneProjectId` in the
|
|
29
|
-
project config when no terminal prompt is available.
|
|
16
|
+
- GitHub: the host's GitHub connection, or, when the GitHub CLI is signed in, the
|
|
17
|
+
packaged [sync helper](planr-sync/scripts/sync.mjs), which creates and edits issues through `gh`;
|
|
18
|
+
close or reopen an issue with `gh issue close` or `gh issue reopen`. `openplanr github`
|
|
19
|
+
is an optional equivalent; `openplanr sync` only repairs local cross-references.
|
|
20
|
+
- Linear: the host's Linear connection.
|
|
30
21
|
|
|
31
22
|
Audit is read-only by default. Apply local changes only when the request asks for
|
|
32
23
|
reconciliation, and push remote changes only when the request asks for external
|
|
33
|
-
synchronization. If
|
|
24
|
+
synchronization. If a connection is unavailable, complete local reconciliation
|
|
34
25
|
and report only the external step that could not run.
|
|
35
26
|
|
|
36
27
|
## Return
|
|
@@ -424,8 +424,12 @@ import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
|
424
424
|
import { fileURLToPath } from "node:url";
|
|
425
425
|
var here = dirname(fileURLToPath(new URL("./runtime/packages/artifact/lib/artifact/review-server.mjs", import.meta.url).href));
|
|
426
426
|
var STAGE_RUNTIME_PATH = join(here, "..", "..", "templates", "artifact-review-stage.js");
|
|
427
|
-
var ARTIFACT_REVIEW_SERVER_VERSION =
|
|
427
|
+
var ARTIFACT_REVIEW_SERVER_VERSION = 3;
|
|
428
428
|
var ARTIFACT_REVIEW_SERVER_KIND = "artifact-review";
|
|
429
|
+
var CONTROL_HEADER = "x-openplanr-control";
|
|
430
|
+
var CONTROLLABLE_SERVER_VERSIONS = /* @__PURE__ */ new Set([2, ARTIFACT_REVIEW_SERVER_VERSION]);
|
|
431
|
+
var EXPORT_ONLY_SERVER_VERSIONS = /* @__PURE__ */ new Set([1]);
|
|
432
|
+
var AUTHORIZATION_CONTROL_VERSIONS = /* @__PURE__ */ new Set([1, 2]);
|
|
429
433
|
var CONTROL_WINDOW_BYTES = 64 * 1024 * 1024;
|
|
430
434
|
var ARTIFACT_REVIEW_MAX_CONTROL_BYTES = Math.ceil((MAX_ARTIFACT_HTML_BYTES * 2 + ARTIFACT_REVIEW_MAX_STATE_BYTES) / CONTROL_WINDOW_BYTES) * CONTROL_WINDOW_BYTES;
|
|
431
435
|
var ARTIFACT_REVIEW_MAX_STATE_BYTES2 = ARTIFACT_REVIEW_MAX_STATE_BYTES;
|
|
@@ -481,6 +485,12 @@ var PERMISSIONS_POLICY = [
|
|
|
481
485
|
function artifactError(code, message, fix = "", details) {
|
|
482
486
|
return new PipelineError(code, message, fix, details);
|
|
483
487
|
}
|
|
488
|
+
function artifactReviewControlHeaders(controlToken) {
|
|
489
|
+
return { [CONTROL_HEADER]: controlToken };
|
|
490
|
+
}
|
|
491
|
+
function stateControlHeaders(state) {
|
|
492
|
+
return AUTHORIZATION_CONTROL_VERSIONS.has(state.serverVersion) ? { authorization: `Bearer ${state.controlToken}` } : artifactReviewControlHeaders(state.controlToken);
|
|
493
|
+
}
|
|
484
494
|
function reviewStateDir(env = process.env) {
|
|
485
495
|
return join(planrHome(env), "artifact-daemon");
|
|
486
496
|
}
|
|
@@ -563,9 +573,9 @@ function parseRequestPath(rawUrl) {
|
|
|
563
573
|
});
|
|
564
574
|
return { segments, trailingSlash };
|
|
565
575
|
}
|
|
566
|
-
function
|
|
567
|
-
const value = req.headers?.
|
|
568
|
-
return typeof value === "string"
|
|
576
|
+
function presentedControlToken(req) {
|
|
577
|
+
const value = req.headers?.[CONTROL_HEADER];
|
|
578
|
+
return typeof value === "string" ? value : "";
|
|
569
579
|
}
|
|
570
580
|
function cloneAndValidateEnvelope(envelope) {
|
|
571
581
|
let cloned;
|
|
@@ -875,7 +885,7 @@ function createArtifactReviewServer({
|
|
|
875
885
|
return;
|
|
876
886
|
}
|
|
877
887
|
if (internal) {
|
|
878
|
-
if (!timingSafeTokenEqual(
|
|
888
|
+
if (!timingSafeTokenEqual(presentedControlToken(req), controlToken)) {
|
|
879
889
|
sendJson(res, 403, { ok: false, error: "forbidden" });
|
|
880
890
|
return;
|
|
881
891
|
}
|
|
@@ -1449,7 +1459,7 @@ function createArtifactReviewServer({
|
|
|
1449
1459
|
return controller;
|
|
1450
1460
|
}
|
|
1451
1461
|
function validState(value, requestedPort, { allowLegacy = false } = {}) {
|
|
1452
|
-
return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (value.serverVersion
|
|
1462
|
+
return value?.schemaVersion === "1.0.0" && value.kind === ARTIFACT_REVIEW_SERVER_KIND && (CONTROLLABLE_SERVER_VERSIONS.has(value.serverVersion) || allowLegacy && EXPORT_ONLY_SERVER_VERSIONS.has(value.serverVersion)) && Number.isInteger(value.pid) && value.pid > 0 && Number.isInteger(value.port) && value.port > 0 && value.port <= 65535 && (requestedPort === 0 || value.port === requestedPort) && isCapabilityToken(value.instanceId, { bytes: SESSION_ID_BYTES }) && isCapabilityToken(value.controlToken, { bytes: CONTROL_TOKEN_BYTES });
|
|
1453
1463
|
}
|
|
1454
1464
|
function readReviewServerState(path) {
|
|
1455
1465
|
try {
|
|
@@ -1473,7 +1483,7 @@ async function controlRequest(descriptor, path, { method, body, fetchImpl } = {}
|
|
|
1473
1483
|
const response = await fetchImpl(`http://${LOOPBACK_HOST}:${descriptor.state.port}${path}`, {
|
|
1474
1484
|
method,
|
|
1475
1485
|
headers: {
|
|
1476
|
-
|
|
1486
|
+
...stateControlHeaders(descriptor.state),
|
|
1477
1487
|
...body === void 0 ? {} : { "content-type": "application/json" }
|
|
1478
1488
|
},
|
|
1479
1489
|
...body === void 0 ? {} : { body: JSON.stringify(body) },
|
|
@@ -2852,7 +2862,12 @@ async function startDesignReviewUnlocked(file, {
|
|
|
2852
2862
|
server = createArtifactReviewServer({
|
|
2853
2863
|
env,
|
|
2854
2864
|
serverMetadata: { kind: "design", projectRoot: current.root },
|
|
2855
|
-
prepareSource: (options) => prepareArtifactDocument({
|
|
2865
|
+
prepareSource: (options) => prepareArtifactDocument({
|
|
2866
|
+
...options,
|
|
2867
|
+
allowLocalForms: true,
|
|
2868
|
+
prototypeState: true,
|
|
2869
|
+
screenId: current.entries.find((entry) => entry.artifactId === options.artifactId)?.screenId ?? options.artifactId
|
|
2870
|
+
}),
|
|
2856
2871
|
async refreshSession(session) {
|
|
2857
2872
|
current = currentDesign(file);
|
|
2858
2873
|
if (session.designRevision === current.revision) return;
|
|
@@ -3214,7 +3229,7 @@ ${renderArtifactParentRuntime({ ...options, adapterRuntimeUrl: `${base}api/desig
|
|
|
3214
3229
|
const registered = await fetchImpl(`${origin}/internal/v1/sessions`, {
|
|
3215
3230
|
method: "POST",
|
|
3216
3231
|
headers: {
|
|
3217
|
-
|
|
3232
|
+
...artifactReviewControlHeaders(server.controlToken),
|
|
3218
3233
|
"content-type": "application/json"
|
|
3219
3234
|
},
|
|
3220
3235
|
body: JSON.stringify({
|
|
@@ -92,7 +92,7 @@ ${current.document.id}`);
|
|
|
92
92
|
const within = relative(project, root);
|
|
93
93
|
if ((!allowMissing || existsSync(path)) && (within === "" || !within.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && within !== ".." && !isAbsolute(within)))
|
|
94
94
|
throw new Error(
|
|
95
|
-
"Design owner
|
|
95
|
+
"Design owner keys must be stored outside the project. Set PLANR_HOME to a private user-level directory."
|
|
96
96
|
);
|
|
97
97
|
const legacyPath = !options.custodyRoot && !configuredPlanrHome(env) ? join(realpathSync(env.HOME || homedir()), ".openplanr", "design-shares", `${key}.json`) : null;
|
|
98
98
|
return { root, path, current, legacyPath };
|
|
@@ -1785,10 +1785,10 @@ async function importDesignShareRecovery(file, { input, ...options } = {}) {
|
|
|
1785
1785
|
throw new Error("Recovery belongs to a different design.");
|
|
1786
1786
|
if (record && (record.custody.id !== custody.id || JSON.stringify(record.custody.ownerPublicKey) !== JSON.stringify(custody.ownerPublicKey)))
|
|
1787
1787
|
throw new Error(
|
|
1788
|
-
"This design already has different owner
|
|
1788
|
+
"This design already has different owner keys. Recovery will not overwrite them."
|
|
1789
1789
|
);
|
|
1790
1790
|
if (record && record.custody.version > custody.version)
|
|
1791
|
-
throw new Error("This recovery file is older than the locally saved owner
|
|
1791
|
+
throw new Error("This recovery file is older than the locally saved owner keys.");
|
|
1792
1792
|
if (!custody.pendingCreate && !recovered.deleted && !recovered.revoked) {
|
|
1793
1793
|
await getWorkspace(custody, { fetchImpl: options.fetchImpl });
|
|
1794
1794
|
const bundle = await decryptWorkspaceRevision(custody, custody.currentRevision, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openplanr/design",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Canonical OpenPlanr design helpers and design-loop engine",
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"node": ">=20.19.0"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@openplanr/artifact": "0.6.
|
|
50
|
-
"@openplanr/protocol": "0.10.
|
|
49
|
+
"@openplanr/artifact": "0.6.5",
|
|
50
|
+
"@openplanr/protocol": "0.10.3"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"test": "node --test --test-concurrency=2 tests/*.test.mjs",
|
|
@@ -2551,7 +2551,7 @@ ${current.document.id}`);
|
|
|
2551
2551
|
const within = relative3(project, root);
|
|
2552
2552
|
if ((!allowMissing || existsSync4(path)) && (within === "" || !within.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && within !== ".." && !isAbsolute3(within)))
|
|
2553
2553
|
throw new Error(
|
|
2554
|
-
"Design owner
|
|
2554
|
+
"Design owner keys must be stored outside the project. Set PLANR_HOME to a private user-level directory."
|
|
2555
2555
|
);
|
|
2556
2556
|
const legacyPath = !options.custodyRoot && !configuredPlanrHome(env) ? join7(realpathSync4(env.HOME || homedir3()), ".openplanr", "design-shares", `${key}.json`) : null;
|
|
2557
2557
|
return { root, path, current, legacyPath };
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
"name": "OpenPlanr"
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
|
-
"version": "2.2641.
|
|
7
|
+
"version": "2.2641.2",
|
|
8
8
|
"description": "Generated local OpenPlanr package."
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "planr",
|
|
13
13
|
"source": "./openplanr",
|
|
14
|
-
"version": "2.2641.
|
|
14
|
+
"version": "2.2641.2",
|
|
15
15
|
"description": "Close the loop from intent to delivery. Plan, design, build, review, and operate from durable context in your repository.",
|
|
16
16
|
"strict": true
|
|
17
17
|
}
|