openplanr 2.6.2 → 2.6.3

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.
Files changed (30) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/services/diagram-artifact-service.d.ts +6 -0
  3. package/dist/services/diagram-artifact-service.d.ts.map +1 -1
  4. package/dist/services/diagram-artifact-service.js.map +1 -1
  5. package/lib/host-packages/adapter-registry.json +5 -5
  6. package/lib/host-packages/capability-map.json +1 -1
  7. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  8. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
  9. package/lib/host-packages/claude/openplanr/.openplanr-content.json +7 -7
  10. package/lib/host-packages/claude/openplanr/skills/design/scripts/design.mjs +14 -0
  11. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design.mjs +14 -0
  12. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design.mjs +14 -0
  13. package/lib/host-packages/claude/openplanr/skills/diagram/references/diagram-fidelity.md +14 -0
  14. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design.mjs +14 -0
  15. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +7 -7
  16. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  17. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design.mjs +14 -0
  18. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design.mjs +14 -0
  19. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design.mjs +14 -0
  20. package/lib/host-packages/cursor/openplanr/rules/planr-diagram/references/diagram-fidelity.md +14 -0
  21. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design.mjs +14 -0
  22. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  23. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  24. package/lib/host-packages/openai/openplanr/.openplanr-content.json +7 -7
  25. package/lib/host-packages/openai/openplanr/skills/design/scripts/design.mjs +14 -0
  26. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design.mjs +14 -0
  27. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design.mjs +14 -0
  28. package/lib/host-packages/openai/openplanr/skills/diagram/references/diagram-fidelity.md +14 -0
  29. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design.mjs +14 -0
  30. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.6.3
4
+
3
5
  ## 2.6.2
4
6
  ### Patch Changes
5
7
 
@@ -13,6 +13,10 @@ export declare function openDiagramArtifact(file: string, options: Record<string
13
13
  export declare function openDiagramOwner(options: {
14
14
  root: string;
15
15
  slug: string;
16
+ title?: string;
17
+ grammar?: string;
18
+ noOpen?: boolean;
19
+ openUrl?: (url: string) => void | Promise<void>;
16
20
  port?: number;
17
21
  env?: Record<string, string | undefined>;
18
22
  }): Promise<{
@@ -21,6 +25,8 @@ export declare function openDiagramOwner(options: {
21
25
  sessionId: string;
22
26
  recoveryScope: string;
23
27
  baseUrl: string;
28
+ url: string;
29
+ launchError?: string;
24
30
  apiBase: string;
25
31
  capabilities: {
26
32
  read: true;
@@ -1 +1 @@
1
- {"version":3,"file":"diagram-artifact-service.d.ts","sourceRoot":"","sources":["../../src/services/diagram-artifact-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ3D;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AA4BD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGpF;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED,0FAA0F;AAC1F,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C,GAAG,OAAO,CAAC;IACV,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC,CAWD"}
1
+ {"version":3,"file":"diagram-artifact-service.d.ts","sourceRoot":"","sources":["../../src/services/diagram-artifact-service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ3D;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AA4BD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGpF;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED,0FAA0F;AAC1F,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C,GAAG,OAAO,CAAC;IACV,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,eAAe,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC,CAWD"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagram-artifact-service.js","sourceRoot":"","sources":["../../src/services/diagram-artifact-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA4B,CAAC;QAChF,OAAO,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAmBD,KAAK,UAAU,0BAA0B;IACvC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,2GAA2G,CAC5G,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAoC,CAAC;IAC7F,IAAI,OAAO,OAAO,CAAC,6BAA6B,KAAK,UAAU,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,OAAO,qEAAqE,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,OAAiC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,MAAM,OAAO,GAAG,MAAM,0BAA0B,EAAE,CAAC;IACnD,OAAO,CAAC,MAAM,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,OAAgC;IAEhC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,MAAM,MAAM,CAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAChF,CAAC;IACF,IAAI,OAAO,OAAO,CAAC,kBAAkB,KAAK,UAAU;QAClD,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,OAAO,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAKtC;IAWC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,MAAM,MAAM,CAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAC5F,CAAC;IACF,IAAI,OAAO,OAAO,CAAC,iBAAiB,KAAK,UAAU;QACjD,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;IACJ,OAAO,OAAO,CAAC,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC"}
1
+ {"version":3,"file":"diagram-artifact-service.js","sourceRoot":"","sources":["../../src/services/diagram-artifact-service.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,12 @@
2
2
  "kind": "host-native-adapter-registry",
3
3
  "schemaVersion": "1.0.0",
4
4
  "protocolVersion": "1.8.0",
5
- "pipelineVersion": "0.50.0",
6
- "pluginVersion": "2.6.2",
5
+ "pipelineVersion": "0.51.0",
6
+ "pluginVersion": "2.6.3",
7
7
  "adapters": [
8
8
  {
9
9
  "id": "claude-code",
10
- "version": "2.6.2",
10
+ "version": "2.6.3",
11
11
  "capabilityLevel": "product",
12
12
  "installScopes": [
13
13
  "user",
@@ -19,7 +19,7 @@
19
19
  },
20
20
  {
21
21
  "id": "codex",
22
- "version": "2.6.2",
22
+ "version": "2.6.3",
23
23
  "capabilityLevel": "product",
24
24
  "installScopes": [
25
25
  "user",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  {
33
33
  "id": "cursor",
34
- "version": "2.6.2",
34
+ "version": "2.6.3",
35
35
  "capabilityLevel": "workflow",
36
36
  "installScopes": [
37
37
  "project"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "kind": "openplanr-capability-map",
3
3
  "schemaVersion": "1.0.0",
4
- "pluginVersion": "2.6.2",
4
+ "pluginVersion": "2.6.3",
5
5
  "families": [
6
6
  {
7
7
  "id": "planning",
@@ -5,14 +5,14 @@
5
5
  "name": "AsemDevs"
6
6
  },
7
7
  "metadata": {
8
- "version": "2.6.2",
8
+ "version": "2.6.3",
9
9
  "description": "Generated local OpenPlanr package."
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "planr",
14
14
  "source": "./openplanr",
15
- "version": "2.6.2",
15
+ "version": "2.6.3",
16
16
  "description": "Host-native OpenPlanr skills and role agents for Claude Code.",
17
17
  "strict": true
18
18
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "planr",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Host-native OpenPlanr planning, delivery, review, design, and operating skills.",
5
5
  "author": {
6
6
  "name": "AsemDevs"
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": ".claude-plugin/plugin.json",
11
- "digest": "sha256:998c286eee3bb61dcba08b8c3b9f6d0b631aae3663a215f59ef3ef682d0006f7"
11
+ "digest": "sha256:34ce806adbdb448840283188ddde1b3a21d1f0fd24f7a4b54c9b177439300af3"
12
12
  },
13
13
  {
14
14
  "path": "agents/planr-backend.md",
@@ -424,7 +424,7 @@
424
424
  },
425
425
  {
426
426
  "path": "skills/design-loop/scripts/design.mjs",
427
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
427
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
428
428
  },
429
429
  {
430
430
  "path": "skills/design-loop/scripts/runtime/notices/entities.txt",
@@ -612,7 +612,7 @@
612
612
  },
613
613
  {
614
614
  "path": "skills/design-review/scripts/design.mjs",
615
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
615
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
616
616
  },
617
617
  {
618
618
  "path": "skills/design-review/scripts/runtime/notices/entities.txt",
@@ -800,7 +800,7 @@
800
800
  },
801
801
  {
802
802
  "path": "skills/design/scripts/design.mjs",
803
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
803
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
804
804
  },
805
805
  {
806
806
  "path": "skills/design/scripts/runtime/notices/entities.txt",
@@ -944,7 +944,7 @@
944
944
  },
945
945
  {
946
946
  "path": "skills/diagram/references/diagram-fidelity.md",
947
- "digest": "sha256:3eadcce2990f6d74a0eb96e26b78ecd7e493322ae6a8aee3cdcecc66ca3d75bd"
947
+ "digest": "sha256:25294a35cd4cef3744023d0fcf26bb57585f2fa544f712e54f1dd14d2c773522"
948
948
  },
949
949
  {
950
950
  "path": "skills/diagram/references/diagram-intent-to-ir.md",
@@ -1048,7 +1048,7 @@
1048
1048
  },
1049
1049
  {
1050
1050
  "path": "skills/plan/scripts/design.mjs",
1051
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
1051
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
1052
1052
  },
1053
1053
  {
1054
1054
  "path": "skills/plan/scripts/planning-ids.mjs",
@@ -1291,5 +1291,5 @@
1291
1291
  "digest": "sha256:53698324b62f43b672ce8fe1654c526c96fb202e313442f09c6fc1e72268677e"
1292
1292
  }
1293
1293
  ],
1294
- "contentDigest": "sha256:a24289064375999fc4a45bb6ab86d2f3d82e03230318d1ab653dd4c971785fae"
1294
+ "contentDigest": "sha256:1a0351f2d0376082cd2f9cfe7d9dd297689d87a2565771d0f15bf63a1a78a464"
1295
1295
  }
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -4,6 +4,20 @@ Use this reference when the user requests Mermaid or Excalidraw editing, imports
4
4
  an existing source, or asks why a projection was omitted.
5
5
 
6
6
  - Canonical `.planr-diagram.json` is the semantic source and is always editable.
7
+ - For the v1.13 flowchart authoring path, the `.planr-diagram-bundle.json` holds
8
+ the semantic document, presentation, exact original Mermaid text, and source
9
+ correspondence. Use `@openplanr/artifact/diagram-authoring`'s
10
+ `previewMermaidCopy`, `adoptMermaidCopy`, and `exportMermaidCopy` for copy
11
+ interchange. Preview never saves; adoption requires acknowledgement of that
12
+ exact preview's fidelity losses. Saving the bundle is a separate owner action.
13
+ - The certified Mermaid copy subset supports explicit flowchart node IDs,
14
+ rectangle/rounded/decision/cylinder shapes, directed/bidirectional/undirected
15
+ edges, labels, and nested subgraphs. It does not infer lanes or preserve
16
+ coordinates, manual routes, annotations, styling, or exact source formatting
17
+ on export. Keep the complete bundle when these matter. Copy import/export
18
+ never creates a repository source link or watcher.
19
+ - Legacy sequence diagrams remain readable and renderable; they are not in the
20
+ editable Mermaid copy certification.
7
21
  - Mermaid is emitted only when the selected grammar has a certified projection.
8
22
  `editable`, `partial`, and `unsupported` are honest compatibility levels, not
9
23
  success or failure labels.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": "manifest.json",
11
- "digest": "sha256:f7632851e45e3b63d23d3a132d6f679209c570dcba4908c8feb462a226b94f5b"
11
+ "digest": "sha256:afd571d81a5c12c74392f1ace5cd4c015646abe3c806fae696a6fe67d6c92c47"
12
12
  },
13
13
  {
14
14
  "path": "rules/planr-artifact.mdc",
@@ -244,7 +244,7 @@
244
244
  },
245
245
  {
246
246
  "path": "rules/planr-design-loop/scripts/design.mjs",
247
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
247
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
248
248
  },
249
249
  {
250
250
  "path": "rules/planr-design-loop/scripts/runtime/notices/entities.txt",
@@ -428,7 +428,7 @@
428
428
  },
429
429
  {
430
430
  "path": "rules/planr-design-review/scripts/design.mjs",
431
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
431
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
432
432
  },
433
433
  {
434
434
  "path": "rules/planr-design-review/scripts/runtime/notices/entities.txt",
@@ -612,7 +612,7 @@
612
612
  },
613
613
  {
614
614
  "path": "rules/planr-design/scripts/design.mjs",
615
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
615
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
616
616
  },
617
617
  {
618
618
  "path": "rules/planr-design/scripts/runtime/notices/entities.txt",
@@ -752,7 +752,7 @@
752
752
  },
753
753
  {
754
754
  "path": "rules/planr-diagram/references/diagram-fidelity.md",
755
- "digest": "sha256:3eadcce2990f6d74a0eb96e26b78ecd7e493322ae6a8aee3cdcecc66ca3d75bd"
755
+ "digest": "sha256:25294a35cd4cef3744023d0fcf26bb57585f2fa544f712e54f1dd14d2c773522"
756
756
  },
757
757
  {
758
758
  "path": "rules/planr-diagram/references/diagram-intent-to-ir.md",
@@ -828,7 +828,7 @@
828
828
  },
829
829
  {
830
830
  "path": "rules/planr-plan/scripts/design.mjs",
831
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
831
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
832
832
  },
833
833
  {
834
834
  "path": "rules/planr-plan/scripts/planning-ids.mjs",
@@ -1043,5 +1043,5 @@
1043
1043
  "digest": "sha256:6378ad3477e4be8b7e916c4249404c50cafecac1c70ffbf5a1a2fce195dfea16"
1044
1044
  }
1045
1045
  ],
1046
- "contentDigest": "sha256:b90d6456a743b00c5cee7336112e5680c0f991442ab2666d1ad512360513415f"
1046
+ "contentDigest": "sha256:cfa5baf3840a22a3e82bec87c86797a1f0a5f5a639a63f710a4d808b8888f97b"
1047
1047
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "ruleCount": 27,
5
5
  "rules": [
6
6
  "rules/planr-artifact.mdc",
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -4,6 +4,20 @@ Use this reference when the user requests Mermaid or Excalidraw editing, imports
4
4
  an existing source, or asks why a projection was omitted.
5
5
 
6
6
  - Canonical `.planr-diagram.json` is the semantic source and is always editable.
7
+ - For the v1.13 flowchart authoring path, the `.planr-diagram-bundle.json` holds
8
+ the semantic document, presentation, exact original Mermaid text, and source
9
+ correspondence. Use `@openplanr/artifact/diagram-authoring`'s
10
+ `previewMermaidCopy`, `adoptMermaidCopy`, and `exportMermaidCopy` for copy
11
+ interchange. Preview never saves; adoption requires acknowledgement of that
12
+ exact preview's fidelity losses. Saving the bundle is a separate owner action.
13
+ - The certified Mermaid copy subset supports explicit flowchart node IDs,
14
+ rectangle/rounded/decision/cylinder shapes, directed/bidirectional/undirected
15
+ edges, labels, and nested subgraphs. It does not infer lanes or preserve
16
+ coordinates, manual routes, annotations, styling, or exact source formatting
17
+ on export. Keep the complete bundle when these matter. Copy import/export
18
+ never creates a repository source link or watcher.
19
+ - Legacy sequence diagrams remain readable and renderable; they are not in the
20
+ editable Mermaid copy certification.
7
21
  - Mermaid is emitted only when the selected grammar has a certified projection.
8
22
  `editable`, `partial`, and `unsupported` are honest compatibility levels, not
9
23
  success or failure labels.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -4,14 +4,14 @@
4
4
  "name": "AsemDevs"
5
5
  },
6
6
  "metadata": {
7
- "version": "2.6.2",
7
+ "version": "2.6.3",
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.6.2",
14
+ "version": "2.6.3",
15
15
  "description": "Host-native OpenPlanr skills for OpenAI coding agents.",
16
16
  "strict": true
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "planr",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Host-native OpenPlanr planning, delivery, review, design, and operating skills.",
5
5
  "author": {
6
6
  "name": "AsemDevs"
@@ -8,7 +8,7 @@
8
8
  "files": [
9
9
  {
10
10
  "path": ".codex-plugin/plugin.json",
11
- "digest": "sha256:848eeaeef1f239d5938a57121755a287736ed9361df9c697ebf1999b9f1a374c"
11
+ "digest": "sha256:56ba6c4519d4d20524b8a874342e21cadb55f5b87c7b5514540e11a104488965"
12
12
  },
13
13
  {
14
14
  "path": "skills/artifact/agents/openai.yaml",
@@ -328,7 +328,7 @@
328
328
  },
329
329
  {
330
330
  "path": "skills/design-loop/scripts/design.mjs",
331
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
331
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
332
332
  },
333
333
  {
334
334
  "path": "skills/design-loop/scripts/runtime/notices/entities.txt",
@@ -520,7 +520,7 @@
520
520
  },
521
521
  {
522
522
  "path": "skills/design-review/scripts/design.mjs",
523
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
523
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
524
524
  },
525
525
  {
526
526
  "path": "skills/design-review/scripts/runtime/notices/entities.txt",
@@ -712,7 +712,7 @@
712
712
  },
713
713
  {
714
714
  "path": "skills/design/scripts/design.mjs",
715
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
715
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
716
716
  },
717
717
  {
718
718
  "path": "skills/design/scripts/runtime/notices/entities.txt",
@@ -860,7 +860,7 @@
860
860
  },
861
861
  {
862
862
  "path": "skills/diagram/references/diagram-fidelity.md",
863
- "digest": "sha256:3eadcce2990f6d74a0eb96e26b78ecd7e493322ae6a8aee3cdcecc66ca3d75bd"
863
+ "digest": "sha256:25294a35cd4cef3744023d0fcf26bb57585f2fa544f712e54f1dd14d2c773522"
864
864
  },
865
865
  {
866
866
  "path": "skills/diagram/references/diagram-intent-to-ir.md",
@@ -992,7 +992,7 @@
992
992
  },
993
993
  {
994
994
  "path": "skills/plan/scripts/design.mjs",
995
- "digest": "sha256:e368470cc9863cd20f5d5815c1d1df30a0f8432cbc09160f5b445fdb5420d4be"
995
+ "digest": "sha256:7a554ec4a32ea6caa6f3bb9f9e9059d586527afd73e33feb708739b0bb75c627"
996
996
  },
997
997
  {
998
998
  "path": "skills/plan/scripts/planning-ids.mjs",
@@ -1259,5 +1259,5 @@
1259
1259
  "digest": "sha256:53698324b62f43b672ce8fe1654c526c96fb202e313442f09c6fc1e72268677e"
1260
1260
  }
1261
1261
  ],
1262
- "contentDigest": "sha256:6cf50c5f87816e7e85e6c3a622c784199abfa4f4371d9bbef9f22b3b72bfd98b"
1262
+ "contentDigest": "sha256:f0fccaf05277a2ba6204f6eac657d2ed8274d83d4e390fe52c85da333503f74f"
1263
1263
  }
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
@@ -4,6 +4,20 @@ Use this reference when the user requests Mermaid or Excalidraw editing, imports
4
4
  an existing source, or asks why a projection was omitted.
5
5
 
6
6
  - Canonical `.planr-diagram.json` is the semantic source and is always editable.
7
+ - For the v1.13 flowchart authoring path, the `.planr-diagram-bundle.json` holds
8
+ the semantic document, presentation, exact original Mermaid text, and source
9
+ correspondence. Use `@openplanr/artifact/diagram-authoring`'s
10
+ `previewMermaidCopy`, `adoptMermaidCopy`, and `exportMermaidCopy` for copy
11
+ interchange. Preview never saves; adoption requires acknowledgement of that
12
+ exact preview's fidelity losses. Saving the bundle is a separate owner action.
13
+ - The certified Mermaid copy subset supports explicit flowchart node IDs,
14
+ rectangle/rounded/decision/cylinder shapes, directed/bidirectional/undirected
15
+ edges, labels, and nested subgraphs. It does not infer lanes or preserve
16
+ coordinates, manual routes, annotations, styling, or exact source formatting
17
+ on export. Keep the complete bundle when these matter. Copy import/export
18
+ never creates a repository source link or watcher.
19
+ - Legacy sequence diagrams remain readable and renderable; they are not in the
20
+ editable Mermaid copy certification.
7
21
  - Mermaid is emitted only when the selected grammar has a certified projection.
8
22
  `editable`, `partial`, and `unsupported` are honest compatibility levels, not
9
23
  success or failure labels.
@@ -15049,6 +15049,10 @@ function createArtifactReviewServer({
15049
15049
  notFound(res, { head });
15050
15050
  return;
15051
15051
  }
15052
+ if (segments.length === 3 && !trailingSlash && ["GET", "HEAD"].includes(req.method)) {
15053
+ send(res, 308, "", { location: `/o/${owner.id}/${owner.capability}/` }, { head });
15054
+ return;
15055
+ }
15052
15056
  const request2 = Promise.resolve().then(() => owner.handleRequest({
15053
15057
  req,
15054
15058
  segments: segments.slice(3),
@@ -15067,6 +15071,16 @@ function createArtifactReviewServer({
15067
15071
  notFound(res, { head });
15068
15072
  return;
15069
15073
  }
15074
+ if (response.kind === "asset") {
15075
+ const mediaTypes = { document: "text/html", runtime: "text/javascript", stylesheet: "text/css" };
15076
+ if (!Object.hasOwn(mediaTypes, response.asset) || typeof response.body !== "string") throw new Error("Invalid owner asset response.");
15077
+ send(res, response.status, response.body, {
15078
+ ...parentHeaders(),
15079
+ "content-type": `${mediaTypes[response.asset]}; charset=utf-8`,
15080
+ "content-security-policy": "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; font-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'"
15081
+ }, { head });
15082
+ return;
15083
+ }
15070
15084
  send(res, response.status, JSON.stringify(response.body), {
15071
15085
  // Rejections may precede body consumption (for example Content-Length
15072
15086
  // above the limit). Do not reuse a socket containing unread body bytes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Deterministic OpenPlanr utilities for planning storage, validation, rendering, setup, diagnostics, and GitHub/Linear synchronization",
5
5
  "type": "module",
6
6
  "main": "./dist/cli/index.js",
@@ -115,7 +115,7 @@
115
115
  "zod": "^4.3.6"
116
116
  },
117
117
  "optionalDependencies": {
118
- "planr-pipeline": "0.50.0"
118
+ "planr-pipeline": "0.51.0"
119
119
  },
120
120
  "devDependencies": {
121
121
  "@biomejs/biome": "^2.4.9",