Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
481e581
chore(deps): bump @tiptap/core from 2.27.2 to 3.30.4
dependabot[bot] Sep 3, 2026
6c9db08
build(deps): patch transitive security advisories
seonghobae Sep 4, 2026
a334084
build(deps): migrate TipTap stack to v3
seonghobae Sep 4, 2026
87b5fef
docs: record the editor security migration
seonghobae Sep 4, 2026
870c2c3
fix(ci): preserve Python boundary coverage
seonghobae Sep 4, 2026
93fd077
fix(ci): restore full Python PR matrix
seonghobae Sep 4, 2026
84bc0e2
Merge remote-tracking branch 'origin/main' into codex/security-transi…
seonghobae Sep 4, 2026
d942322
test(ci): cover event-specific Python matrix
seonghobae Sep 4, 2026
ca31a26
test(ci): bind Python matrix to event
seonghobae Sep 4, 2026
6b059f2
fix(deps): repair TipTap React declarations
seonghobae Sep 4, 2026
3d4efaa
repair(ci): keep security lane out of Python policy
seonghobae Sep 4, 2026
2f7455d
chore(ci): join security prerequisite for verification
seonghobae Sep 4, 2026
4378877
chore(ci): join TipTap security prerequisite
seonghobae Sep 4, 2026
6207d78
chore(ci): synchronize protected main
seonghobae Sep 4, 2026
85c7765
fix(types): isolate packed declarations from TipTap React
seonghobae Sep 4, 2026
b444332
docs(tiptap): tighten migration evidence
seonghobae Sep 4, 2026
202084d
fix(collaboration): declare v3 runtime binding
seonghobae Sep 4, 2026
d1f2753
fix(collaboration): ship y-tiptap peer runtime
seonghobae Sep 4, 2026
b229572
feat!: version the TipTap 3 migration
seonghobae Sep 4, 2026
6d51f5c
docs: align 0.7 release authority
seonghobae Sep 4, 2026
ac0b7bd
fix: identify TipTap v3 in demo
seonghobae Sep 4, 2026
637b910
test: tighten release contract guards
seonghobae Sep 4, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ${{ github.event_name == 'pull_request' && fromJSON('["3.14"]') || fromJSON('["3.11", "3.12", "3.13", "3.14"]') }}
python-version: ["3.11", "3.12", "3.13", "3.14"]
defaults:
run:
working-directory: office
Expand Down
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,28 @@ Historical release entries from **0.1.0 through 0.5.27** are preserved verbatim

## [Unreleased]

## [0.7.0] — 2026-09-05
Comment thread
seonghobae marked this conversation as resolved.

### Release
- Unified the npm editor and `inkspan-office` package manifests at **0.7.0** for the TipTap v3 migration release candidate; protected integration and registry publication remain separate acceptance gates.

### Breaking
- Upgraded the public TipTap editor ABI from v2 to the coherent TipTap 3.30.4 package family. Hosts that consume `CwlEditorHandle.getEditor()` or pass TipTap extensions to `buildExtensions()` must upgrade those host imports and extensions to v3; v2 and v3 editor graphs must not be mixed.

### Added
- Named the repeating editor chrome as a host-facing theme-token catalog and Storybook inventory so hosts can override `--cwl-*` custom properties on `.cwl-editor` after checking WCAG 2.2 contrast, without editing Inkspan internals. Color catalog values now distinguish light, dark, and `@media print` remaps; forced-colors mode is not treated as a token assignment. Hosts can call `getEditorThemeTokenContrast()` to compare inventoried pairs, including `--cwl-accent` on `--cwl-accent-soft`, against the 4.5:1 text threshold via `meetsTextContrast`.

### Accessibility
- Prepared the active-PR dark active-toolbar accent change from protected-main `#4493f8` to `#58a6ff`, increasing `--cwl-accent` text on `--cwl-accent-soft: #163356` from about 4.13:1 to about 5.06:1 so the candidate default 13px active-button text meets the WCAG 2.2 4.5:1 normal-text threshold; this remains active-PR evidence until protected integration. `getEditorThemeTokenContrast()` checks catalog values, and host overrides must be re-checked with `contrastRatioFromHex(actualForegroundHex, actualBackgroundHex)` using the actual resolved colors.
- Raised the shipped dark active-toolbar accent from `#4493f8` to `#58a6ff`, increasing `--cwl-accent` text on `--cwl-accent-soft: #163356` from about 4.13:1 to about 5.06:1 so the default 13px active-button text meets the WCAG 2.2 4.5:1 normal-text threshold. `getEditorThemeTokenContrast()` checks catalog values, and host overrides must be re-checked with `contrastRatioFromHex(actualForegroundHex, actualBackgroundHex)` using the actual resolved colors.
- Restored a visible `:focus-visible` indicator on the editable textbox, mapped it to `CanvasText` in forced-colors mode, and suppresses that interactive focus chrome under `@media print`; dependency-locked Chromium, Firefox, and WebKit acceptance exercises the packed stylesheet on the real `role="textbox"` surface.

### Migration and rollback
- Upgrade Inkspan and every host-owned TipTap extension as one dependency-lock change, then re-run the host's editor, collaboration, and packed-consumer checks. Before adoption, rollback restores the latest verified released Inkspan 0.5.x editor and the host TipTap 2 dependency graph together; an unpublished 0.6.x source candidate is not a rollback artifact. The document-envelope schema is unchanged and needs no stored-document migration.

### Security
- Raised workspace-wide transitive development-tool overrides for `fast-uri`, `nanoid`, and `postcss` to patched minimums, keeping the lockfile audit clean without changing runtime package authority.
- Normalized isolated package-verifier temporary roots before containment checks on macOS.
- Patched the TipTap runtime advisory while preserving formatting, collaboration presence, safe-link enforcement, and exact document restore behavior within the new v3 ABI.

## [0.6.0] — 2026-08-10

Expand Down
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,23 @@ runtime.
pnpm add @contextualwisdomlab/cwl-editor react react-dom
```

### Migrate to 0.7.0

Inkspan 0.7.0 upgrades its public editor boundary from TipTap 2 to TipTap
3.30.4. Hosts that call `getEditor()` or pass `additionalExtensions` to
`buildExtensions()` must upgrade their TipTap extensions and imports to the
same v3 package family; do not mix v2 and v3 extensions or ProseMirror graphs.
Hosts that use only `CwlEditor` props still need to test their editor workflows
before adopting the new minor release.

To roll back before adopting 0.7.0, restore the latest verified released
Inkspan 0.5.x editor and the host's TipTap 2 dependencies together. Do not use
an unpublished 0.6.x source candidate as a rollback target. The document-envelope
schema is unchanged, so this rollback needs no stored-document migration. After
adopting 0.7.0 APIs, revert host extension code and dependency locks as one
reviewed change rather than downgrading
Inkspan alone.

### Quick start

```tsx
Expand Down Expand Up @@ -746,4 +763,4 @@ capabilities they require.
- **Fonts:** Noto Sans families are SIL Open Font License 1.1.

See [`LICENSE`](LICENSE), [`src/fonts/OFL.txt`](src/fonts/OFL.txt), and
[`src/fonts/NOTICE`](src/fonts/NOTICE).
[`src/fonts/NOTICE`](src/fonts/NOTICE).
2 changes: 1 addition & 1 deletion demo/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { CwlEditor, type EditorMode } from '../src/index.js';

const SAMPLE_MD = `# Inkspan

A **commercial-grade** Markdown + HTML editor built on TipTap v2, with
A **commercial-grade** Markdown + HTML editor built on TipTap v3, with
bundled offline fonts for five scripts.

## Multilingual (bundled Noto Sans, no network)
Expand Down
2 changes: 1 addition & 1 deletion docs/CONTRACTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ Rollback must preserve readable canonical documents and must not require silentl
| autosave | local ordering/state, callback contract, validator validation | transport, durable CAS, retry/offline policy, persistence |
| collaboration | provider-neutral editor/Yjs binding | provider lifecycle, rooms, identity, authorization, persistence, awareness privacy |
| Office rendering | deterministic bounded JSON→artifact conversion | file destination policy, downstream distribution, tenant authorization |
| editor chrome theming (Active PR / Proposed) | named `--cwl-*` tokens, DTCG interchange snapshot, Storybook inventory, inventoried pair contrast including `--cwl-accent` on `--cwl-accent-soft` | host brand CSS, contrast certification, Figma Variables, design-tool sync |
| editor chrome theming | named `--cwl-*` tokens, DTCG interchange snapshot, Storybook inventory, inventoried pair contrast including `--cwl-accent` on `--cwl-accent-soft` | host brand CSS, contrast certification, Figma Variables, design-tool sync |
| naruon composition | stable local package/module boundary | authenticated compose transport, tenancy, provider/model policy |
| model assistance | deterministic proposal acceptance boundary | provider, prompt/data policy, credentials, human approval |
| release evidence | exact four-file draft inventory, package/artifact/digest verification and repository evidence | downstream deployment and operational rollout |
Expand Down
5 changes: 2 additions & 3 deletions docs/DOCUMENTATION_FITNESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Document fitness and implementation maturity are independent. A `present_current
| Unified stable registry release train | ADR 0019, protected release workflow and release doctoring | `present_current` | `implemented_on_protected_main` | Stable npm/Office version equality, OIDC Trusted Publishing, exact-artifact publication and post-publication digest verification are source-integrated; live registry publication remains separate operational evidence. |
| Framework-neutral Markdown package boundary | ADR 0020, protected `@contextualwisdomlab/cwl-editor/markdown` package subpath and shared policy modules from #114 | `present_current` | `implemented_on_protected_main` | Server/worker consumers can reuse deterministic Markdown/HTML/email/plain-text conversion without evaluating the React/TipTap editor graph. |
| CSS paged-media print boundary | ADR 0021, protected `src/styles.css`, packaged stylesheet evidence and real-browser print tests from #116/#127 | `present_current` | `implemented_on_protected_main` | Declarative print output removes screen-only clipping/chrome while preserving authored content without creating a durable PDF service. |
| Editor chrome design tokens / Storybook inventory | ADR 0031, `docs/design-tokens.md`, doctoring, token catalog, and Storybook stories | `present_current` | `implemented_on_active_pr` | Hosts can name, override, and preview repeating toolbar/editor tokens without treating the interchange snapshot as shipped protected-main authority. |
| Editor chrome design tokens / Storybook inventory | ADR 0031, `docs/design-tokens.md`, doctoring, token catalog, and Storybook stories | `present_current` | `implemented_on_protected_main` | Hosts can name, override, and preview repeating toolbar/editor tokens while CSS remains runtime presentation authority. |
| Informative DOCX PNG figures | ADR 0022, Office schema/renderer/tests and guidance | `present_current` | `implemented_on_protected_main` | Strict bounded inline PNG figures preserve informative alternative text without remote-resource or arbitrary OOXML authority. |
| DOCX bounded rich-text runs | ADR 0023, Office schema/renderer/tests and doctoring | `present_current` | `implemented_on_protected_main` | Ordered bold/italic/underline runs preserve common inline fidelity under one bounded deterministic contract. |
| DOCX bounded paragraph alignment | ADR 0024, Office schema/renderer/tests, Office guidance and doctoring | `present_current` | `implemented_on_protected_main` | `paragraph` and `rich_paragraph` preserve explicit left/center/right/justify alignment while omission retains inherited/default behavior. |
Expand All @@ -81,10 +81,9 @@ Autonomous commercial-maintenance scheduling and no-early-stop execution are con

The documentation pack is substantially complete for acquisition review, but repository closure is not documentation closure:

1. The protected manifests now agree at `0.6.0`, while registry operational acceptance remains open under issue #118 because the exact protected release still needs its tag/GitHub Release, live npm/PyPI Trusted Publisher execution, and public artifact digest verification.
1. The active release candidate manifests agree at `0.7.0`, while the verified public editor support line remains `0.5.x`. Registry operational acceptance remains open under issue #118 because the exact protected release still needs its tag/GitHub Release, live npm/PyPI Trusted Publisher execution, and public artifact digest verification.
2. Future protected-source changes must continue to reconcile PRD/TRD/Architecture/ADR/UML/DATA_MODEL/security/test/operability/traceability semantics rather than treating this baseline as permanently complete.
3. Documentation becoming mergeable, green, or protected-merged is never a reason for the commercial loop to stop; the next safe product, release, security, accessibility, package, Office-fidelity, or interoperability lane continues.
4. Hosts still need a named, Storybook-previewable chrome-token catalog so brand theming does not require editing Inkspan internals; that lane is Active PR / Proposed and must not be described as shipped until protected integration.

## Sufficiency decision

Expand Down
2 changes: 1 addition & 1 deletion docs/PRD.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,4 @@ Protected `main` is the sole implemented baseline. Open PRs may describe Propose

SafeClipboard, real Chromium/Firefox/WebKit release assurance, lifecycle observation, the root security disclosure lifecycle, toolbar shortcut accessibility metadata, SSR/native-form serialization, revision-scoped selection evidence, W3C text-position selector evidence, document-transition evidence, and envelope identity migration routing are implemented on protected `main`.

A named editor-chrome theme-token catalog, DTCG 2025.10 interchange snapshot, and Storybook inventory for repeating toolbar/editor objects are Active PR / Proposed and are not shipped claims until protected integration. Hosts must check inventoried active-chrome contrast (`--cwl-accent` on `--cwl-accent-soft`) in addition to body text.
A named editor-chrome theme-token catalog, DTCG 2025.10 interchange snapshot, and Storybook inventory for repeating toolbar/editor objects are implemented on protected `main`. Hosts must check inventoried active-chrome contrast (`--cwl-accent` on `--cwl-accent-soft`) in addition to body text.
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ This directory is the discoverable index for Inkspan's product, technical, secur
| [`package-distribution.md`](package-distribution.md) | Buyer-facing public npm package entrypoints, packaged contents, runtime dependency boundaries, and consumer verification |
| [`email-output.md`](email-output.md) | Deterministic email fragment/full-document authority, language/direction metadata, accessibility and host-owned transport boundary |
| [`print-output.md`](print-output.md) | Browser print/paged-media presentation, accessibility/fidelity limits, host-owned governed-export boundary, and rollback |
| [`design-tokens.md`](design-tokens.md) | Host-facing editor chrome tokens, DTCG 2025.10 interchange snapshot, and Storybook inventory (Active PR / Proposed) |
| [`design-tokens.md`](design-tokens.md) | Protected host-facing editor chrome tokens, DTCG 2025.10 interchange snapshot, and Storybook inventory |
| [`UML.md`](UML.md) | Component, sequence, state and authority-flow diagrams |
| [`DATA_MODEL.md`](DATA_MODEL.md) | Conceptual evidence/domain model and persistence ownership |
| [`THREAT_MODEL.md`](THREAT_MODEL.md) | Trust boundaries, abuse cases, security/privacy controls and residual risks |
Expand Down
2 changes: 1 addition & 1 deletion docs/TRACEABILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ This record maps durable Inkspan product decisions to authoritative standards, p
| Browser clipboard behavior | Security-relevant rich HTML handling requires actual paste-pipeline integration and bounded semantic reconstruction before editor state | WHATWG HTML parsing; W3C Clipboard API | protected-main rich-clipboard unit/integration corpus and SafeClipboard ADR | Protected jsdom/TipTap integration success is not universal browser-engine conformance |
| Cross-engine release assurance | The same committed synthetic adversarial corpus runs under required Chromium, Firefox, and WebKit projects; exact package-lock and packed npm artifact SHA-256 digests are required, and only focused standards-grounded safe differences may be admitted | WHATWG HTML Living Standard; W3C Clipboard API and events; Playwright 1.62 release notes and browser/project documentation | ADR 0016, protected-main browser evidence source/workflows, TEST_STRATEGY, OPERABILITY and UML | Protected-main implementation is the release-policy authority; every release candidate must regenerate fresh exact-source/lock/run/browser evidence bound to the exact packed npm artifact SHA-256 and does not claim byte-identical browser serialization or branded enterprise-policy coverage |
| CSS paged-media output | Shipped editor CSS has a declarative print boundary that removes interactive chrome and screen clipping while preserving authored document flow and bounded fragmentation behavior | W3C Media Queries Level 3; CSS Fragmentation Level 3; CSS Paged Media Level 3 as tracked draft input | protected-main #116 packaged stylesheet, real-browser print-media evidence, ADR 0021, print doctoring and tests | `implemented_on_protected_main`; browser print styling does not create a durable PDF service, page-number/header authority, persistence, signing, or PDF-conformance claim |
| Editor chrome design tokens | Repeating toolbar/editor surfaces share named `--cwl-*` custom properties; hosts override those properties on `.cwl-editor` and preview them in Storybook | Design Tokens Format Module 2025.10; WCAG 2.2 contrast including inventoried `--cwl-accent` on `--cwl-accent-soft`; Storybook React/Vite | Active-PR doctoring `docs/doctoring/editor-design-tokens.md`, operator guide, ADR 0031, token catalog tests, and Storybook inventory | Proposed until protected `main`; the interchange snapshot is not complete DTCG conformance, Figma Variables sync, or a host WCAG certification |
| Editor chrome design tokens | Repeating toolbar/editor surfaces share named `--cwl-*` custom properties; hosts override those properties on `.cwl-editor` and preview them in Storybook | Design Tokens Format Module 2025.10; WCAG 2.2 contrast including inventoried `--cwl-accent` on `--cwl-accent-soft`; Storybook React/Vite | Protected doctoring `docs/doctoring/editor-design-tokens.md`, operator guide, ADR 0031, token catalog tests, and Storybook inventory | Implemented on protected `main`; the interchange snapshot is not complete DTCG conformance, Figma Variables sync, or a host WCAG certification |
| Editor integration | Public behavior must exercise the actual TipTap/ProseMirror integration path, not an inert extension field or test-only hook | official TipTap and ProseMirror documentation for the locked dependency line | integration tests and package consumers | Inkspan does not claim compatibility with untested major-version integration semantics |
| Collaboration | Inkspan provides provider-neutral editor/Yjs bindings; host owns provider lifecycle, room authorization, awareness privacy, persistence and audit | official Yjs/provider documentation plus Inkspan public contract | collaboration tests and architecture ownership matrix | No network-provider or tenant-authorization authority is implied |
| Secure development | Security controls are developed test-first, with exact-head scanning/review/package evidence and root-cause regression | NIST SP 800-218 SSDF 1.1 | CI/security/SAST/package/provenance gates, doctoring and regression history | Repository evidence is not a claim of complete SSDF organizational conformance |
Expand Down
2 changes: 1 addition & 1 deletion docs/UML.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ flowchart LR

The host owns transport, authentication, authorization, tenant isolation, persistence, credentials, provider lifecycle, retention, deployment, durable audit, and model-use policy. Inkspan owns deterministic local editor/conversion/evidence behavior only.

A named editor-chrome theme-token catalog and Storybook inventory are Active PR / Proposed. Hosts override `--cwl-*` on `.cwl-editor` after checking WCAG 2.2 contrast for body text and active toolbar text (`--cwl-accent` on `--cwl-accent-soft`). CSS remains runtime presentation authority. Storybook previews a class-level chrome sample (including `:focus-visible`) and a live shipped Toolbar. It does not mount `CwlEditor`. Print-media remaps live in `@media print`; forced-colors mode does not assign those custom properties. Figma Variables, brand certification, and design-tool sync remain host-owned.
A named editor-chrome theme-token catalog and Storybook inventory are implemented on protected `main`. Hosts override `--cwl-*` on `.cwl-editor` after checking WCAG 2.2 contrast for body text and active toolbar text (`--cwl-accent` on `--cwl-accent-soft`). CSS remains runtime presentation authority. Storybook previews a class-level chrome sample (including `:focus-visible`) and a live shipped Toolbar. It does not mount `CwlEditor`. Print-media remaps live in `@media print`; forced-colors mode does not assign those custom properties. Figma Variables, brand certification, and design-tool sync remain host-owned.

## Rich paste sequence

Expand Down
Loading
Loading