Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
db5fc36
test(review): define public review package contract
seonghobae Aug 20, 2026
3c36390
test(review): make package RED runner-realistic
seonghobae Aug 20, 2026
4f2332c
feat(review): expose revision-bound review contract
seonghobae Aug 20, 2026
897333e
feat(review): add React-free review bundle
seonghobae Aug 20, 2026
6e91833
test(review): verify packed review subpath
seonghobae Aug 20, 2026
72c949e
feat(review): publish review package subpath
seonghobae Aug 20, 2026
1e0063d
test(review): require bounded detached review targets
seonghobae Aug 20, 2026
b331806
feat(review): validate detached review targets
seonghobae Aug 20, 2026
cb8c327
test(review): verify packed target validation API
seonghobae Aug 20, 2026
a901a4b
docs(review): document active review package boundary
seonghobae Aug 20, 2026
8aa01e1
docs(review): expose active review subpath in README
seonghobae Aug 20, 2026
17ba45b
test(review): cover same-width hostile target keys
seonghobae Aug 20, 2026
da5c363
test(review): compile hostile symbol-key coverage
seonghobae Aug 20, 2026
245e6a0
test(review): require bounded insert and delete suggestion records
seonghobae Aug 20, 2026
670356c
feat(review): add bounded insert and delete suggestion records
seonghobae Aug 20, 2026
2e0d22d
test(review): require revision-bound operation evidence
seonghobae Aug 21, 2026
917b156
test(review): cover invalid operation action
seonghobae Aug 21, 2026
64b8954
feat(review): bind decisions to revision transition evidence
seonghobae Aug 21, 2026
8f57c9a
test(review): verify packed operation contract exports
seonghobae Aug 21, 2026
9e56bda
test(review): require bounded thread presentation contract
seonghobae Aug 21, 2026
b6e45cb
feat(review): add bounded thread presentation metadata
seonghobae Aug 21, 2026
06561c7
test(review): define controlled accessible React thread list
seonghobae Aug 21, 2026
c024d0a
feat(review): render controlled accessible thread list
seonghobae Aug 21, 2026
22dd017
test(review): require packaged React presentation adapter
seonghobae Aug 21, 2026
5038e35
feat(review): package controlled React presentation adapter
seonghobae Aug 21, 2026
80a7267
docs(review): document React review package boundary
seonghobae Aug 21, 2026
46dba82
docs(review): expose React review adapter in README
seonghobae Aug 21, 2026
34287e9
fix(review): make packed React verifier syntax-safe
seonghobae Aug 22, 2026
5f1a926
test(review): fail closed on changed stale operations
seonghobae Aug 22, 2026
85c8b8f
fix(review): reject mutated stale operations
seonghobae Aug 22, 2026
315fbfc
fix(review): stage declaration runtime dependencies
seonghobae Aug 22, 2026
4b949f2
test(review): reject duplicate thread presentation keys
seonghobae Aug 22, 2026
6aea2ac
fix(review): reject duplicate thread keys
seonghobae Aug 22, 2026
aa2dec8
test(review): reject malformed presentation collections
seonghobae Aug 22, 2026
fac9e80
fix(review): normalize malformed presentation collections
seonghobae Aug 22, 2026
e061413
test(review): reject hostile inaccessible labels
seonghobae Aug 22, 2026
b769019
fix(review): fail closed on inaccessible host labels
seonghobae Aug 22, 2026
ac712c0
fix(review): preserve label-key type narrowing
seonghobae Aug 22, 2026
f7b97b7
test(review): cover fail-closed label schema
seonghobae Aug 22, 2026
7ff4451
test(review): require thread-specific action names
seonghobae Aug 22, 2026
0713a5d
fix(review): disambiguate thread action names
seonghobae Aug 22, 2026
0e3177b
fix(review): keep action labels fully covered
seonghobae Aug 22, 2026
2fb8a12
test(review): require keyboard thread traversal
seonghobae Aug 22, 2026
ed0fe00
test(review): cover neutral keyboard traversal
seonghobae Aug 22, 2026
7423f6c
fix(review): add deterministic keyboard thread traversal
seonghobae Aug 22, 2026
8fe9e3f
test(review): reject malformed intent callbacks
seonghobae Aug 22, 2026
9dab12c
test(review): make intent callback RED type-valid
seonghobae Aug 22, 2026
91178c4
fix(review): fail closed on malformed intent callbacks
seonghobae Aug 22, 2026
987c276
test(review): preflight presentation collection entries
seonghobae Aug 23, 2026
771c156
fix(review): bound presentation collection preflight
seonghobae Aug 23, 2026
6da14e1
test(review): require explicit accessible thread summaries
seonghobae Aug 23, 2026
9724ef6
feat(review): expose accessible thread summaries
seonghobae Aug 23, 2026
d0ebe3c
test(review): cover summary label failure normalization
seonghobae Aug 23, 2026
eb91c8f
test(review): assert public presentation error type
seonghobae Aug 23, 2026
9e0802b
test(review): redact intent callback failures
seonghobae Aug 23, 2026
5e7938b
fix(review): normalize intent callback failures
seonghobae Aug 23, 2026
f1a2425
test(review): cover keyboard traversal boundaries
seonghobae Aug 25, 2026
2a69b09
test(review): require a single roving thread tab stop
seonghobae Aug 26, 2026
e8cb4fd
fix(review): make thread selection focus roving
seonghobae Aug 26, 2026
9e7e0ff
test(review): cover rover fallback after thread removal
seonghobae Aug 27, 2026
8b95407
test(review): flush rover focus state before removal
seonghobae Aug 27, 2026
7406507
test(review): capture redacted callback errors at window boundary
seonghobae Aug 28, 2026
721061d
test(review): assert normalized callback failures independent of Reac…
seonghobae Aug 28, 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
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ runtime.
| Envelope identity | `@contextualwisdomlab/cwl-editor/envelope-identity` | Framework-independent bounded schema identity for host-owned migration routing |
| Revision evidence | `@contextualwisdomlab/cwl-editor/revision-evidence` | Framework-independent canonical envelope, strong revision, and transition evidence |
| Text-position selector | `@contextualwisdomlab/cwl-editor/text-position-selector` | React-free deterministic W3C `TextPositionSelector` projection core |
| Review target core | `@contextualwisdomlab/cwl-editor/review` | `implemented_on_active_pr` — React-free deterministic exact-revision review targets; durable review records and policy remain host-owned |
| Review React adapter | `@contextualwisdomlab/cwl-editor/review-react` | `implemented_on_active_pr` — controlled accessible thread presentation over the React-free review contract; hosts own actions, authorization, bodies, and persistence |
| Autosave | `@contextualwisdomlab/cwl-editor/autosave` | Provider-neutral bounded single-flight persistence coordination |
| Headless Markdown | `@contextualwisdomlab/cwl-editor/markdown` | React-free deterministic Markdown/HTML/email/plain-text conversion |
| Styles | `@contextualwisdomlab/cwl-editor/styles.css` | Editor layout and theming |
Expand Down Expand Up @@ -727,4 +729,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).
42 changes: 37 additions & 5 deletions docs/package-distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ integrations.
| `@contextualwisdomlab/cwl-editor/envelope-identity` | Framework-independent identity-only envelope routing for bounded schema identity inspection; migration remains host-owned |
| `@contextualwisdomlab/cwl-editor/revision-evidence` | Framework-independent revision evidence and document-transition evidence for local content equality/lineage claims |
| `@contextualwisdomlab/cwl-editor/text-position-selector` | `implemented_on_protected_main` — React-free text-position projection core implementing W3C `TextPositionSelector`; interactive capture, revision binding, authorization, persistence, and re-anchoring remain outside this subpath |
| `@contextualwisdomlab/cwl-editor/review` | `implemented_on_active_pr` — React-free deterministic review-target validation bound to exact local SHA-256 revision evidence plus Inkspan's W3C text-position projection; durable review records and policy remain host-owned |
| `@contextualwisdomlab/cwl-editor/review-react` | `implemented_on_active_pr` — controlled accessible React thread presentation over the bounded review contract; hosts supply labels and own actions, authorization, bodies, and persistence |
| `@contextualwisdomlab/cwl-editor/markdown` | `implemented_on_active_pr` — headless deterministic Markdown/HTML/email/plain-text conversion with the same safe-link and strict inline-raster policies as the editor, without importing the React/TipTap editor graph |
| `@contextualwisdomlab/cwl-editor/styles.css` | Editor layout and theming |
| `@contextualwisdomlab/cwl-editor/fonts.css` | Full offline KR/EN/JP/SC/TC/VI font bundle |
Expand Down Expand Up @@ -58,11 +60,18 @@ embedded in the npm tarball.
dependencies so the consumer's package manager installs and resolves it; it
is not merely a type-only dependency.
- The framework-independent autosave, converter, envelope-identity,
revision-evidence, text-position-selector, and Markdown entrypoints do not
require React UI, a mounted editor, naruon, contextual-orchestrator, a
revision-evidence, text-position-selector, review, and Markdown entrypoints do
not require React UI, a mounted editor, naruon, contextual-orchestrator, a
database, provider credentials, or host transport. Their individual
package-consumer gates additionally prevent framework dependencies from
leaking into subpaths whose public contracts exclude them.
- The review-react subpath is an optional controlled React presentation adapter.
It validates every host-supplied presentation through the React-free review
contract before rendering, receives visible and accessible copy from the host,
and emits selection, reply, and resolve intent callbacks only. Presentation
capability flags never grant authority on their own; missing host callbacks
keep actions disabled. It owns no comment body, actor lookup, authorization,
persistence, notification, or transport.
- The Markdown subpath exposes `markdownToHtml`, `htmlToMarkdown`,
`normalizeMarkdown`, `markdownToEmailHtml`, `markdownToPlainText`, and
`htmlToPlainText` plus their option types. It bundles deterministic conversion
Expand All @@ -81,6 +90,15 @@ embedded in the npm tarball.
state or bind a selector to a document revision. Hosts remain responsible for
annotation identifiers/bodies, source-resource identity, authorization,
tenancy, persistence, audit, and cross-revision re-anchoring.
- The review subpath composes only validated local SHA-256 revision evidence,
Inkspan's canonical text-position selector/projection identity, and a detached
immutable v1 target. It rejects malformed, accessor-backed, symbolic, or
unknown target fields without retaining caller-owned objects. It cannot prove
that an arbitrary caller-supplied offset is inside a document without the
referenced document, and it creates no durable comment/thread identifier,
actor identity, authorization, tenant boundary, persistence, retention,
notification, audit occurrence, collaboration-provider admission, or
cross-revision re-anchoring authority. Hosts retain all of those duties.
- Envelope identity output is routing metadata only. It does not accept an
unsupported document generation as current semantics and does not move schema
registry, migration, persistence, rollback, or authorization authority into
Expand Down Expand Up @@ -109,9 +127,9 @@ production library build. The verification chain:
4. rejects internal source, tests, demos, Office files, coverage output, and
workflow files from the npm tarball;
5. imports the root, collaboration, converter, autosave, envelope-identity,
revision-evidence, text-position-selector, and Markdown surfaces through their
dedicated packed-consumer checks, including framework-free isolation where
that is part of the public contract;
revision-evidence, text-position-selector, review, review-react, and Markdown
surfaces through their dedicated packed-consumer checks, including
framework-free isolation where that is part of the public contract;
6. exercises supported ESM/CommonJS entrypoints and compiles strict TypeScript
consumers against the published declaration surfaces;
7. resolves public CSS and font subpaths; and
Expand All @@ -129,6 +147,20 @@ rejects **ambient network and credential authority** such as `fetch`,
of the selector's structural contract and introduce no interactive runtime
authority.

The active review-package check likewise builds and extracts a real npm tarball,
executes `@contextualwisdomlab/cwl-editor/review` through ESM and CommonJS,
compiles a strict TypeScript consumer, exercises valid and malformed target
metadata, and rejects external runtime imports, dynamic module loaders, and
ambient network or credential authority. This is active-PR evidence only until
the review subpath is integrated into protected main.

The active review-react package check is configured to build and extract a real
npm tarball, exercise ESM and CommonJS server-render consumers plus strict
TypeScript declarations, permit only host-supplied React peer runtime imports,
and reject dynamic module loaders plus ambient network or credential authority.
Its result is active-PR evidence only until the review-react subpath is integrated
into protected main.

The Markdown package check likewise builds and extracts a real npm tarball,
executes its ESM and CommonJS entrypoints outside the source tree, compiles a
strict TypeScript consumer, and verifies representative safe-link, plain-text,
Expand Down
14 changes: 12 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,16 @@
"import": "./dist/cwl-text-position-selector.js",
"require": "./dist/cwl-text-position-selector.cjs"
},
"./review": {
"types": "./dist/review/index.d.ts",
"import": "./dist/cwl-review.js",
"require": "./dist/cwl-review.cjs"
},
"./review-react": {
"types": "./dist/review-react/index.d.ts",
"import": "./dist/cwl-review-react.js",
"require": "./dist/cwl-review-react.cjs"
},
"./markdown": {
"types": "./dist/markdown/index.d.ts",
"import": "./dist/cwl-markdown.js",
Expand All @@ -99,7 +109,7 @@
],
"scripts": {
"dev": "vite",
"build": "tsc --noEmit && vite build && vite build --config vite.collaboration.config.ts && vite build --config vite.converter.config.ts && vite build --config vite.envelope-identity.config.ts && vite build --config vite.revision-evidence.config.ts && vite build --config vite.autosave.config.ts && vite build --config vite.text-position-selector.config.ts && vite build --config vite.markdown.config.ts && node ./scripts/copy-styles.mjs",
"build": "tsc --noEmit && vite build && vite build --config vite.collaboration.config.ts && vite build --config vite.converter.config.ts && vite build --config vite.envelope-identity.config.ts && vite build --config vite.revision-evidence.config.ts && vite build --config vite.autosave.config.ts && vite build --config vite.text-position-selector.config.ts && vite build --config vite.review.config.ts && vite build --config vite.review-react.config.ts && vite build --config vite.markdown.config.ts && node ./scripts/copy-styles.mjs",
"build:demo": "vite build --config vite.demo.config.ts",
"fonts": "node ./scripts/fetch-fonts.mjs",
"preview": "vite preview",
Expand All @@ -108,7 +118,7 @@
"test:watch": "vitest",
"coverage": "vitest run --coverage",
"test:package-config": "node --test ./scripts/revision-evidence-consumer-config.test.mjs ./scripts/release-metadata.test.mjs ./scripts/javascript-runtime-authority.test.mjs",
"verify:package": "pnpm run test:package-config && node ./tests/package/verify-package.mjs && node ./tests/package/verify-editor-placeholder-package.mjs && node ./scripts/verify-canonical-envelope-package.mjs && node ./scripts/verify-revision-evidence-package.mjs && node ./scripts/verify-framework-free-revision-evidence-package.mjs && node ./scripts/verify-framework-free-envelope-identity-package.mjs && node ./tests/package/verify-framework-free-autosave-package.mjs && node ./scripts/verify-text-position-selector-package.mjs && node ./scripts/verify-text-position-selector-subpath-package.mjs && node ./scripts/verify-markdown-subpath-package.mjs"
"verify:package": "pnpm run test:package-config && node ./tests/package/verify-package.mjs && node ./tests/package/verify-editor-placeholder-package.mjs && node ./scripts/verify-canonical-envelope-package.mjs && node ./scripts/verify-revision-evidence-package.mjs && node ./scripts/verify-framework-free-revision-evidence-package.mjs && node ./scripts/verify-framework-free-envelope-identity-package.mjs && node ./tests/package/verify-framework-free-autosave-package.mjs && node ./scripts/verify-text-position-selector-package.mjs && node ./scripts/verify-text-position-selector-subpath-package.mjs && node ./scripts/verify-review-package.mjs && node ./scripts/verify-review-react-package.mjs && node ./scripts/verify-markdown-subpath-package.mjs"
},
"peerDependencies": {
"react": "^18.0.0 || ^19.0.0",
Expand Down
Loading
Loading