openplanr 2.2640.2 → 2.2640.4

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 (83) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli/commands/runtime-output.d.ts +11 -0
  3. package/dist/cli/commands/runtime-output.d.ts.map +1 -0
  4. package/dist/cli/commands/runtime-output.js +26 -0
  5. package/dist/cli/commands/runtime-output.js.map +1 -0
  6. package/dist/cli/commands/runtime.d.ts.map +1 -1
  7. package/dist/cli/commands/runtime.js +30 -17
  8. package/dist/cli/commands/runtime.js.map +1 -1
  9. package/dist/cli/commands/setup.d.ts.map +1 -1
  10. package/dist/cli/commands/setup.js +2 -3
  11. package/dist/cli/commands/setup.js.map +1 -1
  12. package/dist/cli/commands/upgrade.d.ts +1 -1
  13. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  14. package/dist/cli/commands/upgrade.js +23 -54
  15. package/dist/cli/commands/upgrade.js.map +1 -1
  16. package/dist/dashboard/.vite/manifest.json +1 -1
  17. package/dist/dashboard/assets/{index-9DLb9EO5.js → index-CaX9EJp4.js} +2 -2
  18. package/dist/dashboard/assets/{index-9DLb9EO5.js.map → index-CaX9EJp4.js.map} +1 -1
  19. package/dist/dashboard/dashboard-manifest.json +13 -13
  20. package/dist/dashboard/index.html +1 -1
  21. package/dist/services/runtime-change-summary.d.ts +33 -0
  22. package/dist/services/runtime-change-summary.d.ts.map +1 -0
  23. package/dist/services/runtime-change-summary.js +88 -0
  24. package/dist/services/runtime-change-summary.js.map +1 -0
  25. package/dist/services/runtime-manager/inventory.d.ts.map +1 -1
  26. package/dist/services/runtime-manager/inventory.js +8 -1
  27. package/dist/services/runtime-manager/inventory.js.map +1 -1
  28. package/dist/services/runtime-manager-service.d.ts +6 -0
  29. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  30. package/dist/services/runtime-manager-service.js +28 -0
  31. package/dist/services/runtime-manager-service.js.map +1 -1
  32. package/dist/services/upgrade-offer-service.d.ts.map +1 -1
  33. package/dist/services/upgrade-offer-service.js +6 -30
  34. package/dist/services/upgrade-offer-service.js.map +1 -1
  35. package/dist/services/upgrade-report.d.ts +13 -0
  36. package/dist/services/upgrade-report.d.ts.map +1 -0
  37. package/dist/services/upgrade-report.js +90 -0
  38. package/dist/services/upgrade-report.js.map +1 -0
  39. package/dist/services/upgrade-service.d.ts +48 -29
  40. package/dist/services/upgrade-service.d.ts.map +1 -1
  41. package/dist/services/upgrade-service.js +236 -48
  42. package/dist/services/upgrade-service.js.map +1 -1
  43. package/docs/CLI.md +7 -2
  44. package/docs/CROSS_RUNTIME_SETUP.md +2 -2
  45. package/lib/host-packages/adapter-registry.json +5 -5
  46. package/lib/host-packages/capability-map.json +1 -1
  47. package/lib/host-packages/claude/.claude-plugin/marketplace.json +2 -2
  48. package/lib/host-packages/claude/openplanr/.claude-plugin/plugin.json +1 -1
  49. package/lib/host-packages/claude/openplanr/.openplanr-content.json +12 -12
  50. package/lib/host-packages/claude/openplanr/README.md +1 -1
  51. package/lib/host-packages/claude/openplanr/skills/design/scripts/design-share.mjs +105 -5
  52. package/lib/host-packages/claude/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  53. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/design-share.mjs +105 -5
  54. package/lib/host-packages/claude/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  55. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/design-share.mjs +105 -5
  56. package/lib/host-packages/claude/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  57. package/lib/host-packages/claude/openplanr/skills/doctor/references/upgrade.md +61 -63
  58. package/lib/host-packages/claude/openplanr/skills/plan/scripts/design-share.mjs +105 -5
  59. package/lib/host-packages/claude/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  60. package/lib/host-packages/cursor/openplanr/.openplanr-content.json +11 -11
  61. package/lib/host-packages/cursor/openplanr/manifest.json +1 -1
  62. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/design-share.mjs +105 -5
  63. package/lib/host-packages/cursor/openplanr/rules/planr-design/scripts/runtime/packages/protocol/package.json +1 -1
  64. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/design-share.mjs +105 -5
  65. package/lib/host-packages/cursor/openplanr/rules/planr-design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  66. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/design-share.mjs +105 -5
  67. package/lib/host-packages/cursor/openplanr/rules/planr-design-review/scripts/runtime/packages/protocol/package.json +1 -1
  68. package/lib/host-packages/cursor/openplanr/rules/planr-doctor/references/upgrade.md +61 -63
  69. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/design-share.mjs +105 -5
  70. package/lib/host-packages/cursor/openplanr/rules/planr-plan/scripts/runtime/packages/protocol/package.json +1 -1
  71. package/lib/host-packages/openai/.claude-plugin/marketplace.json +2 -2
  72. package/lib/host-packages/openai/openplanr/.codex-plugin/plugin.json +1 -1
  73. package/lib/host-packages/openai/openplanr/.openplanr-content.json +11 -11
  74. package/lib/host-packages/openai/openplanr/skills/design/scripts/design-share.mjs +105 -5
  75. package/lib/host-packages/openai/openplanr/skills/design/scripts/runtime/packages/protocol/package.json +1 -1
  76. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/design-share.mjs +105 -5
  77. package/lib/host-packages/openai/openplanr/skills/design-loop/scripts/runtime/packages/protocol/package.json +1 -1
  78. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/design-share.mjs +105 -5
  79. package/lib/host-packages/openai/openplanr/skills/design-review/scripts/runtime/packages/protocol/package.json +1 -1
  80. package/lib/host-packages/openai/openplanr/skills/doctor/references/upgrade.md +61 -63
  81. package/lib/host-packages/openai/openplanr/skills/plan/scripts/design-share.mjs +105 -5
  82. package/lib/host-packages/openai/openplanr/skills/plan/scripts/runtime/packages/protocol/package.json +1 -1
  83. package/package.json +2 -2
@@ -1,21 +1,20 @@
1
1
  # Driving an OpenPlanr upgrade
2
2
 
3
3
  `planr doctor` diagnoses; this reference is how to *act* once the tuple has
4
- drifted. An OpenPlanr install has two halves: the npm CLI, and the Claude Code
5
- plugin that `planr setup` installs from the marketplace bundled with that CLI —
6
- `planr@openplanr-local`, from the `openplanr-local` directory marketplace.
7
- `planr upgrade apply` moves the npm half itself and never changes Claude's plugin
8
- state; it hands back the exact commands for the plugin half, and this skill runs
9
- them inside the host and confirms the result.
4
+ drifted. An OpenPlanr install has two parts: the npm CLI, and what `planr setup`
5
+ installed into each coding agent from that CLI — the `planr@openplanr-local`
6
+ Claude Code plugin, Codex skills, Cursor rules. `planr upgrade apply` moves the
7
+ npm CLI itself and never changes a coding agent; the upgraded CLI then hands back
8
+ one command per installed agent, and this skill runs them and confirms the result.
10
9
 
11
10
  The cardinal rule: **name the actions, let the engine own the list.** Every
12
- plugin command you run comes from the CLI's own output. The skill never carries
13
- its own copy of those commands — the moment it did, it would drift from the CLI
14
- the first time the integration changed. The CLI renders the list from the same
15
- inspection `planr setup` and `planr doctor` use, so it cannot diverge from them.
16
- The retired remote plugins (`openplanr@openplanr`, `planr-pipeline@openplanr`)
17
- only ever appear in that list as removals; an instruction to install one did not
18
- come from the CLI.
11
+ command you run comes from the CLI's own output. The skill never carries its own
12
+ copy of those commands — the moment it did, it would drift from the CLI the first
13
+ time the integration changed. The upgraded CLI plans them with the same preview
14
+ `planr runtime update` and `planr setup` apply, so they cannot diverge. A retired
15
+ remote plugin (`openplanr@openplanr`, `planr-pipeline@openplanr`) only ever leaves
16
+ through the `planr setup … --replace-managed` command the list carries; an
17
+ instruction to install one did not come from the CLI.
19
18
 
20
19
  ## 1. Decide whether to act
21
20
 
@@ -36,7 +35,8 @@ Shape (the fields this skill reads):
36
35
  "pipeline": { "version": "0.52.1" }
37
36
  },
38
37
  "legacyPlugins": [],
39
- "ecosystemSource": "network"
38
+ "ecosystemSource": "network",
39
+ "nextSteps": []
40
40
  }
41
41
  ```
42
42
 
@@ -44,71 +44,69 @@ Shape (the fields this skill reads):
44
44
  means Claude Code was not detected or `planr setup` has not installed the
45
45
  plugin. `installed.pipeline` is always `null` — the pipeline ships inside the
46
46
  CLI, and `bundledPipeline` reports it.
47
- - `aligned` or `unknown` → nothing to drive. Report and stop. (`unknown` means
48
- the published manifest was unreachable — say so; do not guess.)
47
+ - `nextSteps` lists what each coding agent needs to match the installed CLI,
48
+ in the shape step 2 describes.
49
+ - `aligned` or `unknown` with empty `nextSteps` → nothing to drive. Report and
50
+ stop. (`unknown` means the published manifest was unreachable — say so; do not
51
+ guess.)
49
52
  - `upgrade-available` or `incompatible` → act. First **record the `installed`
50
- block as the before state** — the honest diff at the end depends on it.
53
+ block as the before state** — the honest diff at the end depends on it. When
54
+ only `nextSteps` is non-empty, skip to step 3.
51
55
 
52
- ## 2. Perform the owned half and obtain the prescription
56
+ ## 2. Upgrade the CLI and obtain the next steps
53
57
 
54
- The plugin commands are rendered by the CLI from the bundled marketplace's own
55
- operation list, so they always match what `planr setup` would really run. Confirm
56
- with the user first (this upgrades the npm CLI), then:
58
+ Confirm with the user first (this upgrades the npm CLI), then:
57
59
 
58
60
  ```bash
59
61
  planr upgrade apply --yes --json
60
62
  ```
61
63
 
62
- On success the output carries the ordered `pluginHalfCommands` array:
64
+ On success the output carries `nextSteps`, planned by the newly installed CLI:
63
65
 
64
66
  ```json
65
67
  {
66
68
  "ok": true,
67
69
  "cliUpgraded": true,
70
+ "previousVersion": "2.2638.0",
68
71
  "installedVersion": "2.2639.1",
69
- "changelogBullets": ["…"],
70
- "pluginHalfCommands": [
71
- "<refresh the bundled openplanr-local marketplace — always position 0>",
72
- "<update planr@openplanr-local from it>",
73
- "<remove a retired plugin — only when one is still installed>"
72
+ "releaseNotes": [{ "version": "2.2639.1", "entries": ["…"] }],
73
+ "nextSteps": [
74
+ {
75
+ "runtime": "claude-code",
76
+ "host": "Claude Code",
77
+ "command": "<one planr command>",
78
+ "detail": "<what it changes>"
79
+ }
74
80
  ]
75
81
  }
76
82
  ```
77
83
 
78
- The entries above are shown as roles, not literal strings, on purpose: **execute
79
- whatever the array actually contains, in the order it gives — never a list typed
80
- into this file.** Two other shapes are possible:
81
-
82
- - An empty array: Claude Code was not detected, or its plugin state could not be
83
- inspected (`claude plugin list --json` failed). Run `planr doctor --json` to
84
- find out which, then go to step 4. When `planr@openplanr-local` already matches
85
- the new CLI the array is not empty: it holds the lone
86
- `claude plugin marketplace update openplanr-local` refresh — run it as usual.
87
- - A single `planr setup --runtime claude --scope user` entry, with
88
- `--replace-managed` appended when a retired plugin must also be removed (setup
89
- refuses that removal without the flag): the bundled marketplace was never
90
- registered on this machine, and setup is the only command that registers it and
91
- records the installation. In a non-interactive shell it stops with
92
- `E_CONFIRMATION_REQUIRED`; show the user the preview (the same command with
93
- `--dry-run`) and rerun it with `--yes` only after they confirm.
84
+ The `command` values above are shown as placeholders on purpose: **run whatever
85
+ the array actually contains, in the order it gives — never a command typed into
86
+ this file.** Other shapes:
87
+
88
+ - An empty array: every installed coding agent already matches the new CLI.
89
+ - `nextStepsError` instead of steps: the upgraded CLI could not be asked. Run
90
+ `planr upgrade status --json` and use its `nextSteps`.
91
+ - A `planr doctor` command: planning that agent's update failed, and `detail`
92
+ says why. Relay it and run `planr doctor --json`.
93
+
94
+ `pluginHalfCommands` repeats the commands for older readers; read `nextSteps`.
94
95
 
95
96
  If `apply` reports `ok: false`, stop and surface its `failure.message`; the CLI
96
97
  restores the previous version on a bad install, so report what it says was
97
- restored rather than continuing to the plugin half.
98
+ restored rather than continuing to the coding agents.
98
99
 
99
- ## 3. Execute the plugin half, refresh first
100
+ ## 3. Run the next steps
100
101
 
101
- Run each entry of `pluginHalfCommands` verbatim, top to bottom, with your shell
102
- tool. Two invariants:
102
+ Run each `command` of `nextSteps` verbatim, top to bottom, with your shell tool.
103
+ Each one refreshes the bundled `openplanr-local` marketplace before it updates the
104
+ plugin, so **do not reorder, drop, merge, or hand-edit a command**. If one fails,
105
+ stop and report the failure and every agent still on the old version — a partial
106
+ upgrade that reports success is the one outcome to avoid.
103
107
 
104
- - **Refresh is position 0 and runs first.** The first entry refreshes the
105
- `openplanr-local` marketplace, which points at the directory the upgraded CLI
106
- now bundles. Without it, the installer reinstalls the cached, stale version and
107
- the user is told they upgraded when nothing moved. The CLI sorts it to position
108
- 0 for exactly this reason; preserve that order.
109
- - **No substitutions.** Do not reorder, drop, merge, or hand-edit a command. If
110
- an entry fails, stop and report the failure and everything still on the stale
111
- version — a partial upgrade that reports success is the one outcome to avoid.
108
+ Then tell the user to restart each `host` the steps named; a running coding agent
109
+ keeps the old plugin and skills until it restarts.
112
110
 
113
111
  ## 4. Verify, then report what actually changed
114
112
 
@@ -125,14 +123,14 @@ CLI 2.2638.0 → 2.2639.1 moved
125
123
  planr@openplanr-local 2.2638.0 → 2.2639.1 moved
126
124
  ```
127
125
 
128
- `planr doctor` adds what `upgrade status` does not judge. A
129
- `runtime-claude-duplicate-plugin` warning means a second `planr` plugin (usually
130
- `planr@openplanr`, installed from the public marketplace) sits beside the
131
- setup-managed one, and both expose the same `/planr` commands. Its `fix` carries
132
- the exact `claude plugin uninstall` command: relay it, and run it only when the
133
- user asks — nothing removes a duplicate automatically.
126
+ `nextSteps` should now be empty. `planr doctor` adds what `upgrade status` does
127
+ not judge. A `runtime-claude-duplicate-plugin` warning means a second `planr`
128
+ plugin (usually `planr@openplanr`, installed from the public marketplace) sits
129
+ beside the setup-managed one, and both expose the same `/planr` commands. Its `fix`
130
+ carries the exact `claude plugin uninstall` command: relay it, and run it only
131
+ when the user asks — nothing removes a duplicate automatically.
134
132
 
135
133
  State the outcome from this second reading, never from the commands you ran. If
136
134
  a component did not move, say so plainly and name the likely cause (most often a
137
- skipped or failed marketplace refresh). "Upgraded" is a claim about the after
138
- state — earn it with the re-check.
135
+ command that failed or a coding agent that was not restarted). "Upgraded" is a
136
+ claim about the after state — earn it with the re-check.
@@ -870,6 +870,104 @@ async function unseal(value, rawKey, context, limit = DESIGN_WORKSPACE_MAX_BYTES
870
870
  );
871
871
  return JSON.parse(decoder.decode(plaintext));
872
872
  }
873
+ var PACKED_BUNDLE_KIND = "openplanr-design-review-bundle-packed";
874
+ var PACKED_BUNDLE_MAX_BYTES = 128 * 1024 * 1024;
875
+ var SHARED_BLOCK_MIN_LENGTH = 2048;
876
+ var sharedBlockPattern = /(<(script|style)\b[^>]*>)([\s\S]*?)<\/\2\s*>/gi;
877
+ async function deflateRaw(bytes) {
878
+ const stream = new Blob([bytes]).stream().pipeThrough(new CompressionStream("deflate-raw"));
879
+ return new Uint8Array(await new Response(stream).arrayBuffer());
880
+ }
881
+ async function inflateRaw(bytes, limit) {
882
+ const reader = new Blob([bytes]).stream().pipeThrough(new DecompressionStream("deflate-raw")).getReader();
883
+ const chunks = [];
884
+ let size = 0;
885
+ for (; ; ) {
886
+ const { done, value } = await reader.read();
887
+ if (done) break;
888
+ size += value.byteLength;
889
+ if (size > limit) {
890
+ await reader.cancel();
891
+ throw new RangeError("The shared design expands beyond its size limit.");
892
+ }
893
+ chunks.push(value);
894
+ }
895
+ const inflated = new Uint8Array(size);
896
+ let offset = 0;
897
+ for (const chunk of chunks) {
898
+ inflated.set(chunk, offset);
899
+ offset += chunk.byteLength;
900
+ }
901
+ return inflated;
902
+ }
903
+ async function packDesignReviewBundle(bundle) {
904
+ const pages = [];
905
+ const pageIndex = /* @__PURE__ */ new Map();
906
+ const blocks = [];
907
+ const blockIndex = /* @__PURE__ */ new Map();
908
+ const segmentsOf = (html) => {
909
+ const segments = [];
910
+ let offset = 0;
911
+ for (const match of html.matchAll(sharedBlockPattern)) {
912
+ const body = match[3];
913
+ if (body.length < SHARED_BLOCK_MIN_LENGTH) continue;
914
+ const start = match.index + match[1].length;
915
+ segments.push(html.slice(offset, start));
916
+ if (!blockIndex.has(body)) blockIndex.set(body, blocks.push(body) - 1);
917
+ segments.push(blockIndex.get(body));
918
+ offset = start + body.length;
919
+ }
920
+ segments.push(html.slice(offset));
921
+ return segments;
922
+ };
923
+ const artifactPages = [];
924
+ const artifacts = bundle.envelope.artifacts.map(({ html, ...artifact }) => {
925
+ if (!pageIndex.has(html)) pageIndex.set(html, pages.push(segmentsOf(html)) - 1);
926
+ artifactPages.push(pageIndex.get(html));
927
+ return artifact;
928
+ });
929
+ const packed = {
930
+ bundle: { ...bundle, envelope: { ...bundle.envelope, artifacts } },
931
+ artifactPages,
932
+ pages,
933
+ blocks
934
+ };
935
+ return {
936
+ kind: PACKED_BUNDLE_KIND,
937
+ version: 1,
938
+ data: encodeWorkspaceBytes(await deflateRaw(encoder.encode(JSON.stringify(packed))))
939
+ };
940
+ }
941
+ async function unpackDesignReviewBundle(value, { maxBytes = PACKED_BUNDLE_MAX_BYTES } = {}) {
942
+ if (value?.kind !== PACKED_BUNDLE_KIND) return value;
943
+ if (value.version !== 1 || typeof value.data !== "string")
944
+ throw new Error("The shared design uses an unsupported packing.");
945
+ const { bundle, artifactPages, pages, blocks } = JSON.parse(
946
+ decoder.decode(await inflateRaw(decodeWorkspaceBytes(value.data), maxBytes))
947
+ );
948
+ const invalid2 = () => new Error("The shared design packing is invalid.");
949
+ if (!Array.isArray(bundle?.envelope?.artifacts) || !Array.isArray(pages) || !Array.isArray(blocks) || !Array.isArray(artifactPages) || artifactPages.length !== bundle.envelope.artifacts.length)
950
+ throw invalid2();
951
+ let expanded = 0;
952
+ const html = pages.map((segments) => {
953
+ if (!Array.isArray(segments)) throw invalid2();
954
+ const page = segments.map((segment) => {
955
+ if (typeof segment === "string") return segment;
956
+ if (!Number.isInteger(segment) || typeof blocks[segment] !== "string") throw invalid2();
957
+ return blocks[segment];
958
+ }).join("");
959
+ expanded += page.length;
960
+ if (expanded > maxBytes)
961
+ throw new RangeError("The shared design expands beyond its size limit.");
962
+ return page;
963
+ });
964
+ const artifacts = bundle.envelope.artifacts.map((artifact, index) => {
965
+ const page = html[artifactPages[index]];
966
+ if (page === void 0) throw invalid2();
967
+ return { ...artifact, html: page };
968
+ });
969
+ return { ...bundle, envelope: { ...bundle.envelope, artifacts } };
970
+ }
873
971
  var keyringContext = (id, epoch) => ({ type: "keyring", workspaceId: id, epoch });
874
972
  var revisionContext = (id, revision) => ({
875
973
  type: "revision",
@@ -914,7 +1012,7 @@ async function prepareRevision(custody, bundle) {
914
1012
  {
915
1013
  ...header,
916
1014
  ...await seal(
917
- bundle,
1015
+ await packDesignReviewBundle(bundle),
918
1016
  decodeWorkspaceBytes(custody.keys[custody.epoch]),
919
1017
  revisionContext(custody.id, header)
920
1018
  )
@@ -1084,10 +1182,12 @@ async function decryptWorkspaceRevision(access, revisionId = access.currentRevis
1084
1182
  throw new Error("The published design signature is invalid.");
1085
1183
  if (!access.keys[revision.epoch]) throw new Error("The access token cannot open this revision.");
1086
1184
  const bundle = assertDesignReviewBundle(
1087
- await unseal(
1088
- revision,
1089
- decodeWorkspaceBytes(access.keys[revision.epoch]),
1090
- revisionContext(access.id, revision)
1185
+ await unpackDesignReviewBundle(
1186
+ await unseal(
1187
+ revision,
1188
+ decodeWorkspaceBytes(access.keys[revision.epoch]),
1189
+ revisionContext(access.id, revision)
1190
+ )
1091
1191
  )
1092
1192
  );
1093
1193
  if (workspaceEnvelopeDigest(bundle.envelope) !== revision.reviewOf)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openplanr/protocol",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "type": "module",
5
5
  "description": "Canonical OpenPlanr schemas, registries, typed errors, and portable contract validation",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openplanr",
3
- "version": "2.2640.2",
3
+ "version": "2.2640.4",
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",
@@ -114,7 +114,7 @@
114
114
  "zod": "^4.3.6"
115
115
  },
116
116
  "optionalDependencies": {
117
- "planr-pipeline": "0.55.3"
117
+ "planr-pipeline": "0.55.5"
118
118
  },
119
119
  "devDependencies": {
120
120
  "@biomejs/biome": "^2.4.9",