Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
6e603cd
ci: give every validate job a unique check context (#2937)
caio-pizzol Apr 24, 2026
dc706f9
feat(document-api): ranges.scrollIntoView for text + entity targets (…
caio-pizzol Apr 24, 2026
5ca32b3
feat(list-level-formatting): implement symbol font normalization and …
andrii-harbour Apr 24, 2026
e7ef89d
ci: align release and CI triggers with package impact map (#2938)
caio-pizzol Apr 24, 2026
10c89ad
chore(ai): deprecate @superdoc-dev/ai (#2939)
caio-pizzol Apr 24, 2026
cbf2b9f
ci(behavior): speed up PRs with chromium-only matrix and dedup math s…
caio-pizzol Apr 24, 2026
4809517
fix(release): preview local dry runs on inferred release branches
harbournick Apr 24, 2026
45d03e1
SD-2443 - fix: comments being merged by range when they shouldn't (#2…
chittolinag Apr 25, 2026
6b41a26
Merge branch 'stable'
harbournick Apr 25, 2026
8e2fcf1
feat: unify edit history (#2946)
harbournick Apr 25, 2026
1d3d77a
feat: add presetContent for template builder (#2856)
artem-harbour Apr 26, 2026
6ef2aea
feat(super-editor): add pointer event observability (#2801)
mattConnHarbour Apr 26, 2026
8e708ff
chore(renovate): ignore demos, examples, and visual-testing (#2957)
caio-pizzol Apr 27, 2026
8d953bd
ci(behavior): always run on PRs targeting main and stable (#2960)
caio-pizzol Apr 27, 2026
df9ffb5
chore(deps): update dependency @anthropic-ai/claude-agent-sdk to v0.2…
renovate[bot] Apr 27, 2026
adc8ee8
chore(deps): update dependency @types/bun to v1.3.13 (#2950)
renovate[bot] Apr 27, 2026
a4b136a
chore(deps): update dependency bun to v1.3.13 (#2952)
renovate[bot] Apr 27, 2026
cd84f8e
feat(document-api): selection primitives + multi-block comment target…
caio-pizzol Apr 27, 2026
9b4c1d8
chore(deps): update dev dependencies (patch) (#2962)
renovate[bot] Apr 27, 2026
419e905
chore(deps): update dependency @vue/test-utils to v2.4.9 (#2961)
renovate[bot] Apr 27, 2026
62846d9
chore: remove accidental breaking change wording from triggering sem …
harbournick Apr 27, 2026
46d230b
fix: tcs in footers causing multiple single-char additions (#2967)
harbournick Apr 27, 2026
a35d94d
feat(examples): add AI streaming demo using Document API (#2966)
caio-pizzol Apr 27, 2026
5268a4d
feat(editor): allow child editors to skip telemetry (#2968)
andrii-harbour Apr 27, 2026
d3f7309
list tool improvements (#2927)
andrii-harbour Apr 28, 2026
d54519c
fix: sdt field style (#2958)
artem-harbour Apr 28, 2026
a5e4a55
feat(document-api): anchor tracked changes to text spans in extract (…
caio-pizzol Apr 28, 2026
862f3fe
SD-2279 - fix: floating textbox not rendering (#2732)
chittolinag Apr 28, 2026
0a07b7a
SD-2281 - fix: page number on footer not properly aligned (#2725)
chittolinag Apr 28, 2026
b97a6d7
SD-2343 - Table borders being converted twice (#2667)
chittolinag Apr 28, 2026
8641955
fix: table gap clicks selecting wrong paragraph and jumping scroll (S…
luccas-harbour Apr 28, 2026
04c1198
fix(sdk): pin bun version to 1.3.11 and update ignoreDeps in renovate…
andrii-harbour Apr 28, 2026
3e8ad7f
fix(mcp): enhance release configuration for MCP (#2975)
andrii-harbour Apr 28, 2026
b3c7d00
fix: render manual line breaks correctly (#2807)
VladaHarbour Apr 28, 2026
a4d2dae
ci(release): gate production docs on stable release success (#2989)
caio-pizzol Apr 29, 2026
56be3e3
ci(docs): trigger preview workflow on docs PRs to main (#2992)
caio-pizzol Apr 29, 2026
b834ab2
ci(docs): always post preview URL once per PR
caio-pizzol Apr 29, 2026
fe60204
docs(intro): tighten installation card copy (#2991)
caio-pizzol Apr 29, 2026
e754e3b
docs(intro): broaden AI Agents card to agent workflows (#2993)
caio-pizzol Apr 29, 2026
97eddb7
ci(docs): refresh main docs preview on push
caio-pizzol Apr 29, 2026
3022bc0
ci(docs): allow manual workflow_dispatch on main docs preview
caio-pizzol Apr 29, 2026
6f01fec
ci(docs): rename docs preview workflows for clarity
caio-pizzol Apr 29, 2026
98c540a
fix(comments): prevent flicker when clicking comment with tracked cha…
gpardhivvarma Apr 29, 2026
f60241c
fix(release): build workspace before vscode-ext recovery package
caio-pizzol Apr 29, 2026
7dee4a5
feat(document-api): comment reopen lifecycle inverse (SD-2789) (#2987)
caio-pizzol Apr 29, 2026
d31eb43
feat(document-api): selection.current() exposes activeCommentIds and …
caio-pizzol Apr 29, 2026
0899a75
chore: merge stable into main (#2997)
superdoc-bot[bot] Apr 29, 2026
00199ae
chore: fix install deps
harbournick Apr 29, 2026
a494a3e
feat(superdoc/ui): createSuperDocUI skeleton + selector substrate (SD…
caio-pizzol Apr 29, 2026
23c133a
fix(mcp): update package configuration and enhance server functionali…
andrii-harbour Apr 29, 2026
26300bf
chore: remove CODEOWNERS to disable auto review routing (#3001)
caio-pizzol Apr 29, 2026
d32aa7d
feat(superdoc/ui): dedicated UI-only entry + bundle audit (SD-2803) (…
caio-pizzol Apr 29, 2026
b2f835c
fix: large header is missing and cursor is buggy in doc with footnote…
VladaHarbour Apr 29, 2026
baca2c6
chore: restore CODEOWNERS for reviewer-approval enforcement
caio-pizzol Apr 29, 2026
e3eaed9
feat: add public DOCX evidence contracts and source anchors for layou…
harbournick Apr 29, 2026
b1bb6e7
feat(superdoc/ui): custom toolbar command registration (SD-2802) (#3004)
caio-pizzol Apr 29, 2026
ccd7bb9
chore: merge stable into main (release conflicts auto-resolved) (#3009)
superdoc-bot[bot] Apr 29, 2026
1c72e1b
SD-2526 - feat: implement 2 extra types of bullet lists (square, circ…
chittolinag Apr 29, 2026
4c5d84e
feat(superdoc/ui): selection slice exposes SelectionTarget alongside …
caio-pizzol Apr 29, 2026
a873ed9
fix(super-editor/ui): cast TextTarget through unknown for story looku…
caio-pizzol Apr 29, 2026
a3d9a34
chore: pr builder (#3018)
harbournick Apr 29, 2026
981e97f
Merge branch 'main' into nick/merge-main-stable
harbournick Apr 30, 2026
c813f7f
ci: run stable promotion checks after Labs PR build
harbournick Apr 30, 2026
704885b
fix: comments.create partial target shape handling
harbournick Apr 30, 2026
0b29d32
fix: return null selection target for node selections
harbournick Apr 30, 2026
8c24653
chore: disable qualification checks for now
harbournick Apr 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
66 changes: 66 additions & 0 deletions .github/package-impact-map.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Package impact map

Source of truth for which repo paths should trigger CI and release workflows for each published surface.

## Principle

**Test broad, release narrow.**

- **CI gates compatibility.** A change to SuperDoc core should run the CI of every dependent package — that's how breakage in `@superdoc-dev/react` or `@superdoc-dev/sdk` gets caught before it ships. CI paths follow *compatibility* impact.
- **Release gates artifact changes.** A package should only publish a new version when its own published artifact actually changes. Release paths follow *artifact* impact.

These two are not the same. `template-builder` and `esign` externalize `superdoc` in their builds and declare it as a `peerDependency`, so a core change doesn't change their tarballs → CI broad, release narrow. CLI bundles core into platform binaries, so a core change does change the CLI tarball → both broad.

## Surfaces

| Surface | Purpose | Release impact | CI impact |
|---|---|---|---|
| `superdoc` | Main browser DOCX editor/runtime | core | core |
| `@superdoc-dev/react` | React wrapper around superdoc | react + core (see note below) | react + core |
| `@superdoc-dev/template-builder` | React SDT/template authoring UI | `packages/template-builder/**` only | template-builder + core |
| `@superdoc-dev/esign` | React signing workflow | `packages/esign/**` only | esign + core |
| `@superdoc-dev/cli` | Native Document API CLI | cli + doc-api + core | same |
| `@superdoc-dev/sdk` | JS/Python SDK packaging CLI binaries | sdk + cli + doc-api + core | same |
| `@superdoc-dev/mcp` | MCP server over SDK/document engine | mcp + sdk + cli + doc-api + core | same |
| `superdoc-vscode-ext` | VS Code DOCX editor | vscode-ext + core | same |
| `@superdoc-dev/create` | Project scaffolder | `apps/create/**` only | own changes only |
| `@superdoc-dev/superdoc-yjs-collaboration` | Standalone Yjs server (no SuperDoc dep) | `packages/collaboration-yjs/**` only | own changes + collaboration examples |
| `@superdoc/docs` (private) | Documentation site | N/A (not published) | docs + public API / doc generation |
| demos, examples (private) | Compatibility samples | N/A (not published) | own paths + relevant upstream runtime |

## Path expansions

**core** expands to:
- `packages/superdoc/**`
- `packages/super-editor/**`
- `packages/layout-engine/**`
- `packages/word-layout/**`
- `packages/preset-geometry/**`
- `shared/**`
- `pnpm-workspace.yaml`

**doc-api** is `packages/document-api/**`.

**cli** is `apps/cli/**`.

**sdk** is `packages/sdk/**`.

**mcp**, **vscode-ext**, **create** are their respective `apps/*/**` or `packages/*/**` paths.

## Why each classification

- **`template-builder` and `esign`** externalize `superdoc` in their Vite build (`rollupOptions.external`) and declare it as a `peerDependency`. A SuperDoc core change does not change the wrapper's published bundle — consumers receive the new core through their own `npm install`. Release-on-core is pure version noise; CI-on-core remains necessary to catch breaking API changes.
- **`react`** externalizes `superdoc` in its Vite build the same way, and declares `superdoc` in **both** `dependencies` and `peerDependencies`. The `dependencies` entry preserves auto-install for every consumer (zero-break regardless of package manager); the `peerDependencies` entry signals the singleton contract and aligns the manifest with template-builder/esign. Because the `dependencies` entry still pins via lockfiles, existing consumers only pick up a new core version when react republishes, so release-on-core stays correct *today*. The unlock for release-narrow is to remove `superdoc` from `dependencies` entirely — that is a breaking change and tracked as a separate decision.
- **CLI / SDK** bundle engine behavior into platform-specific native binaries (see `apps/cli/.releaserc.cjs` and `packages/sdk/.releaserc.cjs` — both use `patch-commit-filter.cjs` to expand release analysis into core paths). The published artifact genuinely changes when core changes.
- **MCP** depends on SDK via `workspace:*` and imports engine/session code directly. Its current release trigger (`apps/mcp/**` only) causes it to lag SDK releases. Expand to match SDK's release paths.
- **VS Code extension** packages SuperDoc into the extension VSIX. Treated like CLI/SDK.
- **collaboration-yjs** has no SuperDoc dependency. It's a standalone Yjs server. Release and CI both narrow.
- **create** is a scaffolder with no dependencies on SuperDoc runtime. Release and CI both narrow.
- **docs, demos, examples** are not published. They get CI on changes to anything they render to catch visual or behavior regressions.

## Notes

- `packages/ai/**` has been removed from all release and CI triggers. `@superdoc-dev/ai` is being deprecated; npm-side deprecation is a separate operational step.
- When SuperDoc core ships a breaking API change, `template-builder` and `esign` must be manually updated and released. Their `peerDependencies` version bump is the signal; semantic-release won't auto-trigger on upstream changes for them.
- `@superdoc-dev/react` declares `superdoc` in both `dependencies` and `peerDependencies` to preserve zero-break install semantics while still signaling the singleton contract. Removing `superdoc` from `dependencies` is the unlock for release-narrow and is tracked as a separate decision.
- When editing a release or CI workflow, its `paths:` filter must match the corresponding row in this map. Workflow-lint rules should enforce this.
70 changes: 35 additions & 35 deletions .github/scripts/package-lock.json

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

19 changes: 6 additions & 13 deletions .github/workflows/ci-behavior.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,6 @@ permissions:
on:
pull_request:
branches: [main, stable]
paths:
- 'packages/superdoc/**'
- 'packages/layout-engine/**'
- 'packages/super-editor/**'
- 'packages/ai/**'
- 'packages/word-layout/**'
- 'packages/preset-geometry/**'
- 'tests/behavior/**'
- 'shared/**'
- '.github/workflows/ci-behavior.yml'
- '!**/*.md'
merge_group:
workflow_dispatch:

Expand All @@ -30,7 +19,9 @@ jobs:
strategy:
fail-fast: false
matrix:
browser: [chromium, firefox, webkit]
# PRs run chromium only for fast feedback. merge_group and workflow_dispatch
# run the full 3-browser matrix before anything lands on main.
browser: ${{ fromJSON(github.event_name == 'pull_request' && '["chromium"]' || '["chromium", "firefox", "webkit"]') }}
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -75,12 +66,14 @@ jobs:
working-directory: tests/behavior

validate:
name: Behavior Tests / validate
if: always()
needs: [test]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then
echo "One or more required jobs did not succeed."
exit 1
fi
4 changes: 3 additions & 1 deletion .github/workflows/ci-demos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,14 @@ jobs:
run: DEMO=${{ matrix.demo }} npx playwright test

validate:
name: CI Demos / validate
if: always()
needs: [smoke-test]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then
echo "One or more required jobs did not succeed."
exit 1
fi
1 change: 1 addition & 0 deletions .github/workflows/ci-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:

jobs:
validate:
name: CI Docs / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-document-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ concurrency:

jobs:
validate:
name: CI Document API / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-esign.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ concurrency:

jobs:
validate:
name: CI eSign / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/ci-examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -172,12 +172,14 @@ jobs:
run: npx tsx src/index.test.ts

validate:
name: CI Examples / validate
if: always()
needs: [getting-started, collaboration, features, advanced-headless-toolbar, headless]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then
echo "One or more required jobs did not succeed."
exit 1
fi
1 change: 1 addition & 0 deletions .github/workflows/ci-mcp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ concurrency:

jobs:
validate:
name: CI MCP / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-react.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ concurrency:

jobs:
validate:
name: CI React / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ concurrency:

jobs:
validate:
name: CI SDK / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/ci-superdoc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ on:
- 'packages/sdk/**'
- 'packages/template-builder/**'
- 'packages/esign/**'
- 'packages/ai/**'
- 'evals/**'
- '**/*.md'
merge_group:
Expand All @@ -40,7 +41,7 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.12
bun-version: 1.3.13

- name: Install canvas system dependencies
run: |
Expand Down Expand Up @@ -108,7 +109,7 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.12
bun-version: 1.3.13

- name: Install canvas system dependencies
run: |
Expand Down Expand Up @@ -195,7 +196,7 @@ jobs:

- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.12
bun-version: 1.3.13

- name: Install dependencies
run: pnpm install
Expand Down Expand Up @@ -232,12 +233,14 @@ jobs:
flags: superdoc

validate:
name: CI SuperDoc / validate
if: always()
needs: [build, unit-tests, cli-tests, coverage]
runs-on: ubuntu-latest
steps:
- name: Check results
run: |
if [[ "${{ contains(needs.*.result, 'failure') }}" == "true" ]]; then
if [[ "${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') || contains(needs.*.result, 'skipped') }}" == "true" ]]; then
echo "One or more required jobs did not succeed."
exit 1
fi
1 change: 1 addition & 0 deletions .github/workflows/ci-template-builder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ concurrency:

jobs:
validate:
name: CI Template Builder / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci-vscode-ext.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ concurrency:

jobs:
validate:
name: CI VS Code Extension / validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand Down
Loading
Loading