Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions canopy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ pnpm dev:canopy # storybook on http://localhost:6007
## Dependency rules

- The addon is consumed as a **GitHub-release tarball URL** (no npm registry, no auth). pnpm records an integrity hash in the lockfile.
- The addon bundles xterm core internals, so `@xterm/xterm` here must be the exact beta the fork release was built from. Two things record that base: the release version encodes its counter (`0.20.0-sdf315.0` ⇒ built from `@xterm/xterm@6.1.0-beta.315`), and — as of `0.20.0-sdf301.1` — the tarball declares `peerDependencies: { "@xterm/xterm": "^6.1.0-beta.315" }`, the way every upstream addon does. The peer range is the authoritative one: it names the full version, whereas the counter in the tag repeats across upstream release lines.
- The addon bundles xterm core internals, so `@xterm/xterm` here must be the exact beta the fork release was built from. Two things record that base: the release version encodes its counter (`0.20.0-sdf336.0` ⇒ built from `@xterm/xterm@6.1.0-beta.336`), and — as of `0.20.0-sdf301.1` — the tarball declares `peerDependencies: { "@xterm/xterm": "^6.1.0-beta.336" }`, the way every upstream addon does. The peer range is the authoritative one: it names the full version, whereas the counter in the tag repeats across upstream release lines.
- Renovate cannot see tarball URLs, and `.github/renovate.json` disables `@xterm/**` for this file so it cannot drift the two pins off the fork base either. Bumps are manual: cut a fork release, then `node scripts/xterm-bump.mjs --canopy <forkVersion>` from the repo root rewrites the URL and both pins together. `scripts/xterm-lint.mjs` (in `pnpm test`) fails if the fork's declared peer range and the `@xterm/xterm` pin ever disagree. The trigger and the review process are in `docs/specs/webgl-text.md`; the fork-side recipe is in FORK.md on the `sdf` branch.

## Regression harness

The `UpstreamVsFork` story renders identical content through three renderers stacked: pristine upstream `@xterm/addon-webgl`, the fork with `sdf: false` (isolates the instance-layout/shader changes), and the fork with `sdf: true` (isolates the SDF glyph path). The upstream pin must be the same commit as the fork base — the `@xterm/*` beta counters are independent, so the numbers never match (addon `0.20.0-beta.309` == core `6.1.0-beta.315` == commit `991857a1`); re-derive it with `npm view @xterm/addon-webgl@<ver> gitHead` when the fork rebases, or let `node scripts/xterm-bump.mjs --canopy <forkVersion>` pick the matching addon.
The `UpstreamVsFork` story renders identical content through three renderers stacked: pristine upstream `@xterm/addon-webgl`, the fork with `sdf: false` (isolates the instance-layout/shader changes), and the fork with `sdf: true` (isolates the SDF glyph path). The upstream pin must be the same commit as the fork base — the `@xterm/*` beta counters are independent, so the numbers never match (addon `0.20.0-beta.329` == core `6.1.0-beta.336` == commit `08829c7e`); re-derive it with `npm view @xterm/addon-webgl@<ver> gitHead` when the fork rebases, or let `node scripts/xterm-bump.mjs --canopy <forkVersion>` pick the matching addon.

Story content writes PUA glyphs (powerline chevrons etc.) as `\uE0BX` escapes, never literal characters — the literals are invisible in editors and were once silently dropped in a file rewrite, which presented as a rendering regression.

Expand Down
6 changes: 3 additions & 3 deletions canopy/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
"test": "tsc -p ."
},
"dependencies": {
"@diffplug/xterm-addon-webgl-sdf": "https://github.com/diffplug/xterm.js/releases/download/sdf-v0.20.0-sdf315.0/diffplug-xterm-addon-webgl-sdf-0.20.0-sdf315.0.tgz",
"@xterm/addon-webgl": "0.20.0-beta.309",
"@xterm/xterm": "6.1.0-beta.315",
"@diffplug/xterm-addon-webgl-sdf": "https://github.com/diffplug/xterm.js/releases/download/sdf-v0.20.0-sdf336.0/diffplug-xterm-addon-webgl-sdf-0.20.0-sdf336.0.tgz",
"@xterm/addon-webgl": "0.20.0-beta.329",
"@xterm/xterm": "6.1.0-beta.336",
"react": "^19.2.6",
"react-dom": "^19.2.6"
},
Expand Down
2 changes: 1 addition & 1 deletion canopy/src/GlTerminal.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useEffect, useRef, useState } from 'react';
import { Terminal } from '@xterm/xterm';
import { WebglAddon } from '@diffplug/xterm-addon-webgl-sdf';
// The pristine upstream addon, pinned to the exact commit the fork's sdf branch is based on
// (addon 0.20.0-beta.309 == core 6.1.0-beta.315 == commit 991857a1) — the regression
// (addon 0.20.0-beta.329 == core 6.1.0-beta.336 == commit 08829c7e) — the regression
// baseline for the UpstreamVsFork story. canopy/README.md records the same triple, and
// scripts/xterm-lint.mjs check 4 holds both against canopy/package.json's pins.
import { WebglAddon as UpstreamWebglAddon } from '@xterm/addon-webgl';
Expand Down
2 changes: 1 addition & 1 deletion docs/specs/webgl-text.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

## Fork pipeline

- **Versioning**: versions shaped `<addon-version>-sdf<coreBeta>.<iteration>` (`0.20.0-sdf315.0` ⇒ `@xterm/xterm@6.1.0-beta.315`, iteration 0). **Consumers must pin the exact core beta named by the tarball's peer dependency** — the addon bundles core internals (rationale); `scripts/xterm-lint.mjs` holds the `-sdfNNN` counter to it.
- **Versioning**: versions shaped `<addon-version>-sdf<coreBeta>.<iteration>` (`0.20.0-sdf336.0` ⇒ `@xterm/xterm@6.1.0-beta.336`, iteration 0). **Consumers must pin the exact core beta named by the tarball's peer dependency** — the addon bundles core internals (rationale); `scripts/xterm-lint.mjs` holds the `-sdfNNN` counter to it.
- **Distribution**: a pnpm tarball-URL dependency on GitHub Release assets, never an npm registry (rationale). **Never replace a published asset**; the lockfile records a sha512 integrity hash, so cut a new iteration.
- **Canopy's three pins move together** — the tarball URL, the pristine upstream addon, and core. Renovate ignores canopy's `@xterm/**` (it cannot follow the tarball URL); bump them with `node scripts/xterm-bump.mjs --canopy <forkVersion>`.
- **Every pin must be exact, every addon's core peer must be `^<workspace-core-pin>`, and `lib` and `standalone` must pin the same set** — the `@xterm/*` packages share a repo but carry independent beta counters (rationale). `scripts/xterm-lint.mjs` owns the full check list in its header comment; `scripts/xterm-bump.mjs` (`pnpm bump:xterm`) writes the newest coherent per-commit set for `lib` and `standalone`.
Expand Down
2 changes: 1 addition & 1 deletion docs/specs/webgl-text.rationale.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

**Why `--dry-run` before accepting Renovate's version.** The newest coherent per-commit set is often an *older* core than Renovate proposed, because Renovate takes the latest of each package independently and the counters are not aligned.

**Why a conflict-free merge is not a correct one.** Upstream regularly adds obligations to code the fork extended without anything textually conflicting, so the merge succeeds while the extension quietly stops honoring the new contract. FORK.md's `Merging upstream` carries the same warning.
**Why a conflict-free merge is not a correct one.** Upstream regularly adds obligations to code the fork extended without anything textually conflicting, so the merge succeeds while the extension quietly stops honoring the new contract. FORK.md's `Merging upstream` carries the same warning. During the beta.336 update (2026-11), running the new upstream warm-up tests with SDF enabled caught `clearTexture` treating an empty first page as an empty atlas even when a later page held SDF glyphs; the fork now also checks its shape cache before skipping a clear.

## SDF glyph architecture

Expand Down
12 changes: 6 additions & 6 deletions lib/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@
},
"dependencies": {
"@phosphor-icons/react": "^2.1.10",
"@xterm/addon-fit": "0.12.0-beta.322",
"@xterm/addon-image": "0.10.0-beta.321",
"@xterm/addon-serialize": "0.15.0-beta.321",
"@xterm/addon-unicode-graphemes": "0.5.0-beta.321",
"@xterm/addon-webgl": "0.20.0-beta.320",
"@xterm/xterm": "6.1.0-beta.326",
"@xterm/addon-fit": "0.12.0-beta.332",
"@xterm/addon-image": "0.10.0-beta.331",
"@xterm/addon-serialize": "0.15.0-beta.330",
"@xterm/addon-unicode-graphemes": "0.5.0-beta.330",
"@xterm/addon-webgl": "0.20.0-beta.329",
"@xterm/xterm": "6.1.0-beta.336",
"@zxing/browser": "0.2.1",
"@zxing/library": "0.23.0",
"clsx": "^2.1.1",
Expand Down
142 changes: 64 additions & 78 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions standalone/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
"@tauri-apps/api": "^2.12.1",
"@tauri-apps/plugin-shell": "^2.4.0",
"@tauri-apps/plugin-updater": "^2.13.1",
"@xterm/addon-fit": "0.12.0-beta.322",
"@xterm/addon-image": "0.10.0-beta.321",
"@xterm/addon-serialize": "0.15.0-beta.321",
"@xterm/addon-unicode-graphemes": "0.5.0-beta.321",
"@xterm/addon-webgl": "0.20.0-beta.320",
"@xterm/xterm": "6.1.0-beta.326",
"@xterm/addon-fit": "0.12.0-beta.332",
"@xterm/addon-image": "0.10.0-beta.331",
"@xterm/addon-serialize": "0.15.0-beta.330",
"@xterm/addon-unicode-graphemes": "0.5.0-beta.330",
"@xterm/addon-webgl": "0.20.0-beta.329",
"@xterm/xterm": "6.1.0-beta.336",
"dormouse-lib": "workspace:*",
"react": "^19.2.6",
"react-dom": "^19.2.6"
Expand Down
Loading
Loading