From 80db4cae6e12d72cf29c4d3a04ed66c3352aff5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B2=E1=84=8B=E1=85=AD=E1=86=BC=E1=84=90?= =?UTF-8?q?=E1=85=A2?= Date: Sun, 26 Jul 2026 10:05:57 +0900 Subject: [PATCH] feat!: promote provider-neutral v2 kernel --- README.md | 38 +- apps/grouping-lab/src/App.tsx | 2 +- .../src/outlinerModel.test.ts | 2 +- apps/outliner-blind-b/src/outlinerModel.ts | 2 +- apps/outliner/src/OutlineRow.tsx | 2 +- apps/outliner/src/clipboard.ts | 2 +- apps/outliner/src/commands/context.ts | 2 +- apps/outliner/src/commands/focus.ts | 2 +- apps/outliner/src/commands/structure.ts | 2 +- apps/outliner/src/hooks/useClickPolicy.ts | 2 +- apps/outliner/src/hooks/useDraftState.ts | 2 +- apps/outliner/src/hooks/useToasts.ts | 2 +- apps/outliner/src/pointer-utils.ts | 2 +- apps/outliner/tests/stress.test.tsx | 2 +- apps/review-comments-lab/src/App.tsx | 2 +- apps/site/index.html | 6 +- apps/site/public/site.webmanifest | 2 +- apps/site/src/generated/repo-catalog.ts | 152 +-- .../InterfaceWorkbench.playground.tsx | 2 +- apps/site/src/routes/Home.tsx | 22 +- apps/site/src/site-routes.json | 8 +- apps/site/tests/docs-consistency.test.ts | 42 +- apps/site/tests/site-shell.test.tsx | 12 +- apps/snippet-composer-lab/src/App.tsx | 2 +- config/json-document-source-aliases.ts | 4 + docs/README.md | 20 +- docs/changelog.md | 13 + docs/generated/repo-catalog.json | 152 +-- docs/public/api.md | 506 +++++----- docs/public/extensions.md | 22 +- docs/public/overview.md | 163 ++-- docs/public/quickstart.md | 255 +++-- docs/public/recipes.md | 35 +- docs/standard/core-standard.md | 12 +- docs/standard/json-document-spec.md | 15 +- docs/standard/v2-projection-profile.md | 234 +++++ docs/standard/v2-public-surface.json | 457 +++++++++ labs/extensions/apply-defaults/package.json | 2 +- labs/extensions/apply-defaults/src/create.ts | 2 +- .../apply-defaults/src/operations.ts | 2 +- labs/extensions/apply-defaults/src/plan.ts | 2 +- labs/extensions/apply-defaults/src/types.ts | 2 +- .../tests/apply-defaults.test.ts | 2 +- .../apply-defaults/vitest.config.ts | 2 +- labs/extensions/autosave/package.json | 2 +- labs/extensions/autosave/src/create.ts | 2 +- labs/extensions/autosave/src/types.ts | 2 +- .../autosave/tests/autosave.test.ts | 2 +- labs/extensions/autosave/vitest.config.ts | 2 +- labs/extensions/batch-update/package.json | 2 +- labs/extensions/batch-update/src/create.ts | 2 +- .../extensions/batch-update/src/operations.ts | 2 +- labs/extensions/batch-update/src/plan.ts | 2 +- labs/extensions/batch-update/src/types.ts | 2 +- .../batch-update/tests/batch-update.test.ts | 2 +- labs/extensions/batch-update/vitest.config.ts | 2 +- labs/extensions/bookmarks/package.json | 2 +- labs/extensions/bookmarks/src/create.ts | 2 +- labs/extensions/bookmarks/src/types.ts | 2 +- .../bookmarks/tests/bookmarks.test.ts | 2 +- labs/extensions/bookmarks/vitest.config.ts | 2 +- .../extensions/calculated-fields/package.json | 2 +- .../calculated-fields/src/create.ts | 2 +- .../calculated-fields/src/operations.ts | 2 +- labs/extensions/calculated-fields/src/plan.ts | 2 +- .../extensions/calculated-fields/src/types.ts | 2 +- .../tests/calculated-fields.test.ts | 2 +- .../calculated-fields/vitest.config.ts | 2 +- .../causal-patch-inbox/package.json | 2 +- .../causal-patch-inbox/src/create.ts | 2 +- .../causal-patch-inbox/src/envelope.ts | 2 +- .../causal-patch-inbox/src/types.ts | 2 +- .../tests/causal-patch-inbox.test.ts | 2 +- .../causal-patch-inbox/vitest.config.ts | 2 +- labs/extensions/change-case/package.json | 2 +- labs/extensions/change-case/src/create.ts | 2 +- labs/extensions/change-case/src/operations.ts | 2 +- labs/extensions/change-case/src/plan.ts | 2 +- labs/extensions/change-case/src/types.ts | 2 +- .../change-case/tests/change-case.test.ts | 2 +- labs/extensions/change-case/vitest.config.ts | 2 +- labs/extensions/checkpoints/package.json | 2 +- labs/extensions/checkpoints/src/create.ts | 2 +- labs/extensions/checkpoints/src/types.ts | 2 +- .../checkpoints/tests/checkpoints.test.ts | 2 +- labs/extensions/checkpoints/vitest.config.ts | 2 +- labs/extensions/clear-contents/package.json | 2 +- labs/extensions/clear-contents/src/create.ts | 2 +- .../clear-contents/src/operations.ts | 2 +- labs/extensions/clear-contents/src/plan.ts | 2 +- labs/extensions/clear-contents/src/types.ts | 2 +- .../tests/clear-contents.test.ts | 2 +- .../clear-contents/vitest.config.ts | 2 +- .../convert-block-type/package.json | 2 +- .../convert-block-type/src/create.ts | 2 +- .../convert-block-type/src/operations.ts | 2 +- .../extensions/convert-block-type/src/plan.ts | 2 +- .../convert-block-type/src/types.ts | 2 +- .../tests/convert-block-type.test.ts | 2 +- .../convert-block-type/vitest.config.ts | 2 +- labs/extensions/convert-type/package.json | 2 +- labs/extensions/convert-type/src/create.ts | 2 +- .../extensions/convert-type/src/operations.ts | 2 +- labs/extensions/convert-type/src/plan.ts | 2 +- labs/extensions/convert-type/src/types.ts | 2 +- .../convert-type/tests/convert-type.test.ts | 2 +- labs/extensions/convert-type/vitest.config.ts | 2 +- labs/extensions/dedupe/package.json | 2 +- labs/extensions/dedupe/src/create.ts | 2 +- labs/extensions/dedupe/src/operations.ts | 2 +- labs/extensions/dedupe/src/plan.ts | 2 +- labs/extensions/dedupe/src/types.ts | 2 +- labs/extensions/dedupe/tests/dedupe.test.ts | 2 +- labs/extensions/dedupe/vitest.config.ts | 2 +- labs/extensions/document-diff/package.json | 2 +- labs/extensions/document-diff/src/create.ts | 2 +- .../document-diff/src/operations.ts | 2 +- labs/extensions/document-diff/src/plan.ts | 2 +- labs/extensions/document-diff/src/types.ts | 2 +- .../document-diff/tests/document-diff.test.ts | 2 +- .../extensions/document-diff/vitest.config.ts | 2 +- labs/extensions/drag-drop/package.json | 2 +- labs/extensions/drag-drop/src/create.ts | 2 +- labs/extensions/drag-drop/src/operations.ts | 2 +- labs/extensions/drag-drop/src/plan.ts | 2 +- labs/extensions/drag-drop/src/types.ts | 2 +- .../drag-drop/tests/drag-drop.test.ts | 2 +- labs/extensions/drag-drop/vitest.config.ts | 2 +- labs/extensions/fill-blanks/package.json | 2 +- labs/extensions/fill-blanks/src/create.ts | 2 +- labs/extensions/fill-blanks/src/operations.ts | 2 +- labs/extensions/fill-blanks/src/plan.ts | 2 +- labs/extensions/fill-blanks/src/types.ts | 2 +- .../fill-blanks/tests/fill-blanks.test.ts | 2 +- labs/extensions/fill-blanks/vitest.config.ts | 2 +- labs/extensions/fill-down/package.json | 2 +- labs/extensions/fill-down/src/create.ts | 2 +- labs/extensions/fill-down/src/operations.ts | 2 +- labs/extensions/fill-down/src/plan.ts | 2 +- labs/extensions/fill-down/src/types.ts | 2 +- .../fill-down/tests/fill-down.test.ts | 2 +- labs/extensions/fill-down/vitest.config.ts | 2 +- labs/extensions/fill-series/package.json | 2 +- labs/extensions/fill-series/src/create.ts | 2 +- labs/extensions/fill-series/src/operations.ts | 2 +- labs/extensions/fill-series/src/plan.ts | 2 +- labs/extensions/fill-series/src/types.ts | 2 +- .../fill-series/tests/fill-series.test.ts | 2 +- labs/extensions/fill-series/vitest.config.ts | 2 +- labs/extensions/generate-slug/package.json | 2 +- labs/extensions/generate-slug/src/create.ts | 2 +- .../generate-slug/src/operations.ts | 2 +- labs/extensions/generate-slug/src/plan.ts | 2 +- labs/extensions/generate-slug/src/types.ts | 2 +- .../generate-slug/tests/generate-slug.test.ts | 2 +- .../extensions/generate-slug/vitest.config.ts | 2 +- labs/extensions/grid-range/package.json | 2 +- labs/extensions/grid-range/src/create.ts | 2 +- labs/extensions/grid-range/src/operations.ts | 2 +- labs/extensions/grid-range/src/plan.ts | 2 +- labs/extensions/grid-range/src/types.ts | 2 +- .../grid-range/tests/grid-range.test.ts | 2 +- labs/extensions/grid-range/vitest.config.ts | 2 +- labs/extensions/increment-number/package.json | 2 +- .../extensions/increment-number/src/create.ts | 2 +- .../increment-number/src/operations.ts | 2 +- labs/extensions/increment-number/src/plan.ts | 2 +- labs/extensions/increment-number/src/types.ts | 2 +- .../tests/increment-number.test.ts | 2 +- .../increment-number/vitest.config.ts | 2 +- labs/extensions/join-text/package.json | 2 +- labs/extensions/join-text/src/create.ts | 2 +- labs/extensions/join-text/src/operations.ts | 2 +- labs/extensions/join-text/src/plan.ts | 2 +- labs/extensions/join-text/src/types.ts | 2 +- .../join-text/tests/join-text.test.ts | 2 +- labs/extensions/join-text/vitest.config.ts | 2 +- labs/extensions/layer-order/package.json | 2 +- labs/extensions/layer-order/src/create.ts | 2 +- labs/extensions/layer-order/src/operations.ts | 2 +- labs/extensions/layer-order/src/plan.ts | 2 +- labs/extensions/layer-order/src/types.ts | 2 +- .../layer-order/tests/layer-order.test.ts | 2 +- labs/extensions/layer-order/vitest.config.ts | 2 +- labs/extensions/limit-items/package.json | 2 +- labs/extensions/limit-items/src/create.ts | 2 +- labs/extensions/limit-items/src/operations.ts | 2 +- labs/extensions/limit-items/src/plan.ts | 2 +- labs/extensions/limit-items/src/types.ts | 2 +- .../limit-items/tests/limit-items.test.ts | 2 +- labs/extensions/limit-items/vitest.config.ts | 2 +- labs/extensions/live-cursors/package.json | 2 +- labs/extensions/live-cursors/src/create.ts | 2 +- labs/extensions/live-cursors/src/types.ts | 2 +- .../live-cursors/tests/live-cursors.test.ts | 2 +- labs/extensions/live-cursors/vitest.config.ts | 2 +- labs/extensions/move-selected/package.json | 2 +- labs/extensions/move-selected/src/create.ts | 2 +- .../move-selected/src/operations.ts | 2 +- labs/extensions/move-selected/src/plan.ts | 2 +- labs/extensions/move-selected/src/types.ts | 2 +- .../move-selected/tests/move-selected.test.ts | 2 +- .../extensions/move-selected/vitest.config.ts | 2 +- labs/extensions/pad-text/package.json | 2 +- labs/extensions/pad-text/src/create.ts | 2 +- labs/extensions/pad-text/src/operations.ts | 2 +- labs/extensions/pad-text/src/plan.ts | 2 +- labs/extensions/pad-text/src/types.ts | 2 +- .../pad-text/tests/pad-text.test.ts | 2 +- labs/extensions/pad-text/vitest.config.ts | 2 +- labs/extensions/paste-cells/package.json | 2 +- labs/extensions/paste-cells/src/create.ts | 2 +- labs/extensions/paste-cells/src/operations.ts | 2 +- labs/extensions/paste-cells/src/plan.ts | 2 +- labs/extensions/paste-cells/src/types.ts | 2 +- .../paste-cells/tests/paste-cells.test.ts | 2 +- labs/extensions/paste-cells/vitest.config.ts | 2 +- labs/extensions/paste-special/package.json | 2 +- labs/extensions/paste-special/src/create.ts | 2 +- .../paste-special/src/operations.ts | 2 +- labs/extensions/paste-special/src/plan.ts | 2 +- labs/extensions/paste-special/src/types.ts | 2 +- .../paste-special/tests/paste-special.test.ts | 2 +- .../extensions/paste-special/vitest.config.ts | 2 +- labs/extensions/patch-rebase/package.json | 2 +- labs/extensions/patch-rebase/src/copy.ts | 2 +- labs/extensions/patch-rebase/src/guards.ts | 2 +- labs/extensions/patch-rebase/src/plan.ts | 2 +- labs/extensions/patch-rebase/src/pointer.ts | 2 +- labs/extensions/patch-rebase/src/selection.ts | 2 +- labs/extensions/patch-rebase/src/transform.ts | 2 +- labs/extensions/patch-rebase/src/types.ts | 2 +- .../patch-rebase/tests/patch-rebase.test.ts | 2 +- labs/extensions/patch-rebase/vitest.config.ts | 2 +- labs/extensions/references/package.json | 2 +- labs/extensions/references/src/create.ts | 2 +- labs/extensions/references/src/operations.ts | 2 +- labs/extensions/references/src/plan.ts | 2 +- labs/extensions/references/src/types.ts | 2 +- .../references/tests/references.test.ts | 2 +- labs/extensions/references/vitest.config.ts | 2 +- labs/extensions/renumber-items/package.json | 2 +- labs/extensions/renumber-items/src/create.ts | 2 +- .../renumber-items/src/operations.ts | 2 +- labs/extensions/renumber-items/src/plan.ts | 2 +- labs/extensions/renumber-items/src/types.ts | 2 +- .../tests/renumber-items.test.ts | 2 +- .../renumber-items/vitest.config.ts | 2 +- labs/extensions/round/package.json | 2 +- labs/extensions/round/src/create.ts | 2 +- labs/extensions/round/src/operations.ts | 2 +- labs/extensions/round/src/plan.ts | 2 +- labs/extensions/round/src/types.ts | 2 +- labs/extensions/round/tests/round.test.ts | 2 +- labs/extensions/round/vitest.config.ts | 2 +- labs/extensions/sort-items/package.json | 2 +- labs/extensions/sort-items/src/create.ts | 2 +- labs/extensions/sort-items/src/operations.ts | 2 +- labs/extensions/sort-items/src/plan.ts | 2 +- labs/extensions/sort-items/src/types.ts | 2 +- .../sort-items/tests/sort-items.test.ts | 2 +- labs/extensions/sort-items/vitest.config.ts | 2 +- labs/extensions/sparse-record/package.json | 2 +- labs/extensions/sparse-record/src/create.ts | 2 +- .../sparse-record/src/operations.ts | 2 +- labs/extensions/sparse-record/src/plan.ts | 2 +- labs/extensions/sparse-record/src/types.ts | 2 +- .../sparse-record/tests/sparse-record.test.ts | 2 +- .../extensions/sparse-record/vitest.config.ts | 2 +- labs/extensions/split-text/package.json | 2 +- labs/extensions/split-text/src/create.ts | 2 +- labs/extensions/split-text/src/operations.ts | 2 +- labs/extensions/split-text/src/plan.ts | 2 +- labs/extensions/split-text/src/types.ts | 2 +- .../split-text/tests/split-text.test.ts | 2 +- labs/extensions/split-text/vitest.config.ts | 2 +- labs/extensions/stable-id-rebase/package.json | 2 +- labs/extensions/stable-id-rebase/src/plan.ts | 2 +- .../stable-id-rebase/src/selection.ts | 2 +- labs/extensions/stable-id-rebase/src/types.ts | 2 +- .../tests/stable-id-rebase.test.ts | 2 +- .../stable-id-rebase/vitest.config.ts | 2 +- labs/extensions/swap-items/package.json | 2 +- labs/extensions/swap-items/src/create.ts | 2 +- labs/extensions/swap-items/src/operations.ts | 2 +- labs/extensions/swap-items/src/plan.ts | 2 +- labs/extensions/swap-items/src/types.ts | 2 +- .../swap-items/tests/swap-items.test.ts | 2 +- labs/extensions/swap-items/vitest.config.ts | 2 +- labs/extensions/toggle-option/package.json | 2 +- labs/extensions/toggle-option/src/create.ts | 2 +- labs/extensions/toggle-option/src/plan.ts | 2 +- labs/extensions/toggle-option/src/types.ts | 2 +- .../toggle-option/tests/toggle-option.test.ts | 2 +- .../extensions/toggle-option/vitest.config.ts | 2 +- labs/extensions/toggle-value/package.json | 2 +- labs/extensions/toggle-value/src/create.ts | 2 +- .../extensions/toggle-value/src/operations.ts | 2 +- labs/extensions/toggle-value/src/plan.ts | 2 +- labs/extensions/toggle-value/src/types.ts | 2 +- .../toggle-value/tests/toggle-value.test.ts | 2 +- labs/extensions/toggle-value/vitest.config.ts | 2 +- labs/extensions/trim-text/package.json | 2 +- labs/extensions/trim-text/src/create.ts | 2 +- labs/extensions/trim-text/src/operations.ts | 2 +- labs/extensions/trim-text/src/plan.ts | 2 +- labs/extensions/trim-text/src/types.ts | 2 +- .../trim-text/tests/trim-text.test.ts | 2 +- labs/extensions/trim-text/vitest.config.ts | 2 +- labs/extensions/wrap-selection/package.json | 2 +- labs/extensions/wrap-selection/src/create.ts | 2 +- .../wrap-selection/src/operations.ts | 2 +- labs/extensions/wrap-selection/src/plan.ts | 2 +- labs/extensions/wrap-selection/src/types.ts | 2 +- .../tests/wrap-selection.test.ts | 2 +- .../wrap-selection/vitest.config.ts | 2 +- llms.txt | 402 ++++---- package-lock.json | 49 +- packages/bulk-edit/package.json | 2 +- packages/bulk-edit/src/create.ts | 2 +- packages/bulk-edit/src/deleteAll.ts | 2 +- packages/bulk-edit/src/errors.ts | 2 +- packages/bulk-edit/src/matches.ts | 2 +- packages/bulk-edit/src/replaceAll.ts | 2 +- packages/bulk-edit/src/types.ts | 2 +- packages/bulk-edit/tests/bulk-edit.test.ts | 2 +- packages/bulk-edit/vitest.config.ts | 2 +- packages/clipboard-web/README.md | 49 +- packages/clipboard-web/package.json | 2 +- packages/clipboard-web/src/create.ts | 2 +- packages/clipboard-web/src/paste.ts | 2 +- packages/clipboard-web/src/types.ts | 2 +- .../clipboard-web/tests/clipboard-web.test.ts | 2 +- packages/clipboard-web/vitest.config.ts | 2 +- packages/collection/package.json | 2 +- packages/collection/src/create.ts | 2 +- packages/collection/src/delete.ts | 2 +- packages/collection/src/duplicate.ts | 2 +- packages/collection/src/error.ts | 2 +- packages/collection/src/location.ts | 2 +- packages/collection/src/move.ts | 2 +- packages/collection/src/types.ts | 2 +- packages/collection/tests/collection.test.ts | 2 +- packages/collection/vitest.config.ts | 2 +- packages/comments/package.json | 2 +- packages/comments/src/create.ts | 2 +- packages/comments/src/errors.ts | 2 +- packages/comments/src/filter.ts | 2 +- packages/comments/src/tracking.ts | 2 +- packages/comments/src/types.ts | 2 +- packages/comments/src/validation.ts | 2 +- packages/comments/tests/comments.test.ts | 2 +- packages/comments/vitest.config.ts | 2 +- packages/contenteditable-react/package.json | 2 +- .../src/useContentEditable.ts | 2 +- .../tests/contenteditable-react.test.tsx | 2 +- .../contenteditable-react/vitest.config.ts | 2 +- packages/contenteditable-web/package.json | 2 +- packages/contenteditable-web/src/core.ts | 2 +- .../src/dom/clipboardEvent.ts | 2 +- .../src/dom/createAdapter.ts | 2 +- .../contenteditable-web/src/dom/selection.ts | 2 +- packages/contenteditable-web/src/fragment.ts | 2 +- packages/contenteditable-web/src/types.ts | 2 +- .../tests/contenteditable-core.test.ts | 2 +- .../tests/contenteditable-web.test.ts | 2 +- packages/contenteditable-web/vitest.config.ts | 2 +- packages/dirty-state/package.json | 2 +- packages/dirty-state/src/create.ts | 2 +- packages/dirty-state/src/types.ts | 2 +- .../dirty-state/tests/dirty-state.test.ts | 2 +- packages/dirty-state/vitest.config.ts | 2 +- packages/form-draft/package.json | 2 +- packages/form-draft/src/batch.ts | 2 +- packages/form-draft/src/create.ts | 2 +- packages/form-draft/src/errors.ts | 2 +- packages/form-draft/src/json.ts | 2 +- packages/form-draft/src/snapshot.ts | 2 +- packages/form-draft/src/types.ts | 2 +- packages/form-draft/tests/form-draft.test.ts | 2 +- packages/form-draft/vitest.config.ts | 2 +- packages/grouping/package.json | 2 +- packages/grouping/src/create.ts | 2 +- packages/grouping/src/operations.ts | 2 +- packages/grouping/src/plan.ts | 2 +- packages/grouping/src/types.ts | 2 +- packages/grouping/tests/grouping.test.ts | 2 +- packages/grouping/vitest.config.ts | 2 +- packages/id-resolver/package.json | 2 +- packages/id-resolver/src/diagnostics.ts | 2 +- packages/id-resolver/src/types.ts | 2 +- .../id-resolver/tests/id-resolver.test.ts | 2 +- packages/id-resolver/vitest.config.ts | 2 +- packages/json-document/README.md | 418 +++----- packages/json-document/package.json | 27 +- packages/json-document/public-contract.json | 26 + .../src/application/document/contract.ts | 98 +- .../src/application/document/create.ts | 51 +- .../src/application/document/index.ts | 175 +--- .../src/application/document/protocol.ts | 54 ++ .../src/application/react-document/index.ts | 6 +- .../src/application/session/contract.ts | 9 + .../src/application/session/create.ts | 46 + .../src/application/session/index.ts | 167 ++++ .../src/domain/projection/create.ts | 266 +++++ .../src/domain/projection/index.ts | 17 + .../src/foundation/protocol/apply.ts | 148 +++ .../src/foundation/protocol/contract.ts | 67 ++ .../src/foundation/protocol/index.ts | 48 + .../tests/conformance/v2/projection-suite.ts | 424 ++++++++ .../conformance/v2/projection-vectors.json | 907 ++++++++++++++++++ .../tests/conformance/v2/protocol-suite.ts | 350 +++++++ .../conformance/v2/protocol-vectors.json | 417 ++++++++ .../document/capability/integration.test.ts | 2 +- .../document/clipboard/integration.test.ts | 2 +- .../document/create-json-document.test.ts | 2 +- .../tests/document/history/metadata.test.ts | 2 +- .../tests/document/interface.test.ts | 2 +- .../tests/document/read/integration.test.ts | 2 +- .../tests/document/schema/integration.test.ts | 2 +- .../tests/document/selection/headless.test.ts | 2 +- .../tests/document/text-surface.test.ts | 2 +- .../tests/document/validation-paths.test.ts | 2 +- .../json-document/tests/public/error.test.ts | 2 +- .../tests/public/guarantees.test.ts | 2 +- .../tests/public/json-patch/apply.test.ts | 2 +- .../public/json-patch/conformance.test.ts | 2 +- .../tests/public/json-patch/rfc6902.test.ts | 2 +- .../public/json-pointer/sibling-range.test.ts | 2 +- .../public/json-pointer/uri-fragment.test.ts | 2 +- .../tests/public/jsonpath/cts.test.ts | 2 +- .../tests/public/package-exports.test.ts | 3 + .../public/pointer-tracking/pointer.test.ts | 6 +- .../tests/public/result-contract.test.ts | 2 +- .../tests/public/semantic-contract.test.ts | 2 +- .../tests/public/signature-contract.test-d.ts | 2 +- .../tests/public/standard-conformance.test.ts | 2 +- ...v2-projection-standard-conformance.test.ts | 334 +++++++ .../v2-protocol-standard-conformance.test.ts | 12 + .../public/v2-signature-contract.test-d.ts | 91 ++ ...sue-200-undo-overwrite-add-inverse.test.ts | 2 +- ...jsonpath-fastpath-object-container.test.ts | 2 +- .../issue-204-removerange-reducer.test.ts | 2 +- ...ema-introspection-optional-wrapper.test.ts | 2 +- ...e-208-readat-canonical-array-index.test.ts | 2 +- ...issue-210-paste-into-absent-target.test.ts | 2 +- .../issue-219-additive-surface.test.ts | 2 +- .../issue-219-editok-unification.test.ts | 2 +- .../issue-52-record-pointer.test-d.ts | 2 +- .../issue-55-applypatch-strict.test-d.ts | 2 +- .../issue-57-structural-sharing.test.ts | 2 +- .../regression/json-state-invariants.test.ts | 2 +- .../overlapping-replace-batch.test.ts | 2 +- .../prepared-change-reentrancy.test.ts | 2 +- .../structural-schema-fast-path.test.ts | 2 +- .../tests/smoke/package-smoke.mjs | 86 +- packages/json-document/tsconfig.test.json | 3 + packages/json-document/vitest.config.ts | 1 + packages/outline/package.json | 2 +- packages/outline/src/copy.ts | 2 +- packages/outline/src/create.ts | 2 +- packages/outline/src/error.ts | 2 +- packages/outline/src/move.ts | 2 +- packages/outline/src/read.ts | 2 +- packages/outline/src/source.ts | 2 +- packages/outline/src/types.ts | 2 +- packages/outline/tests/outline.test.ts | 2 +- packages/outline/vitest.config.ts | 2 +- packages/patch-log/package.json | 2 +- packages/patch-log/src/copy.ts | 2 +- packages/patch-log/src/create.ts | 2 +- packages/patch-log/src/replay.ts | 2 +- packages/patch-log/src/types.ts | 2 +- packages/patch-log/tests/patch-log.test.ts | 2 +- packages/patch-log/vitest.config.ts | 2 +- packages/patch-preview/package.json | 2 +- packages/patch-preview/src/create.ts | 2 +- packages/patch-preview/src/preview.ts | 2 +- packages/patch-preview/src/types.ts | 4 +- .../patch-preview/tests/patch-preview.test.ts | 2 +- packages/patch-preview/vitest.config.ts | 2 +- packages/persist-web/package.json | 2 +- packages/persist-web/src/create.ts | 2 +- packages/persist-web/src/restore.ts | 2 +- packages/persist-web/src/selection.ts | 2 +- packages/persist-web/src/snapshot.ts | 2 +- packages/persist-web/src/types.ts | 2 +- packages/persist-web/src/watch.ts | 2 +- .../persist-web/tests/persist-web.test.ts | 2 +- packages/persist-web/vitest.config.ts | 2 +- packages/proposed-changes/package.json | 2 +- packages/proposed-changes/src/accept.ts | 2 +- packages/proposed-changes/src/copy.ts | 2 +- packages/proposed-changes/src/create.ts | 2 +- packages/proposed-changes/src/errors.ts | 2 +- packages/proposed-changes/src/plan.ts | 2 +- packages/proposed-changes/src/types.ts | 2 +- .../tests/proposed-changes.test.ts | 2 +- packages/proposed-changes/vitest.config.ts | 2 +- packages/protected-ranges/package.json | 2 +- packages/protected-ranges/src/create.ts | 2 +- packages/protected-ranges/src/match.ts | 2 +- packages/protected-ranges/src/operations.ts | 2 +- packages/protected-ranges/src/types.ts | 2 +- .../tests/protected-ranges.test.ts | 2 +- packages/protected-ranges/vitest.config.ts | 2 +- packages/schema-form/package.json | 2 +- packages/schema-form/src/container.ts | 2 +- packages/schema-form/src/create.ts | 2 +- packages/schema-form/src/error.ts | 2 +- packages/schema-form/src/field.ts | 2 +- packages/schema-form/src/tree.ts | 2 +- packages/schema-form/src/types.ts | 2 +- .../schema-form/tests/schema-form.test.ts | 2 +- packages/schema-form/vitest.config.ts | 2 +- packages/search-replace/package.json | 2 +- packages/search-replace/src/create.ts | 2 +- packages/search-replace/src/errors.ts | 2 +- packages/search-replace/src/find.ts | 2 +- packages/search-replace/src/match.ts | 2 +- packages/search-replace/src/replaceAll.ts | 2 +- packages/search-replace/src/types.ts | 2 +- .../tests/search-replace.test.ts | 2 +- packages/search-replace/vitest.config.ts | 2 +- packages/snippets/package.json | 2 +- packages/snippets/src/create.ts | 2 +- packages/snippets/src/errors.ts | 2 +- packages/snippets/src/insert.ts | 2 +- packages/snippets/src/options.ts | 2 +- packages/snippets/src/plan.ts | 2 +- packages/snippets/src/types.ts | 2 +- packages/snippets/tests/snippets.test.ts | 2 +- packages/snippets/vitest.config.ts | 2 +- scripts/benchmark-adapter-readiness.mjs | 8 +- scripts/benchmark-core.mjs | 40 +- scripts/evaluate-docs.mjs | 85 +- scripts/evaluate-extension-lab.mjs | 7 +- scripts/evaluate-extensions.mjs | 13 +- scripts/evaluate-json-document-layers.mjs | 2 + scripts/evaluate-standardization.mjs | 674 ++++++++++++- tsconfig.json-document-paths.json | 1 + 541 files changed, 6690 insertions(+), 2031 deletions(-) create mode 100644 docs/standard/v2-projection-profile.md create mode 100644 docs/standard/v2-public-surface.json create mode 100644 packages/json-document/src/application/document/protocol.ts create mode 100644 packages/json-document/src/application/session/contract.ts create mode 100644 packages/json-document/src/application/session/create.ts create mode 100644 packages/json-document/src/application/session/index.ts create mode 100644 packages/json-document/src/domain/projection/create.ts create mode 100644 packages/json-document/src/domain/projection/index.ts create mode 100644 packages/json-document/src/foundation/protocol/apply.ts create mode 100644 packages/json-document/src/foundation/protocol/contract.ts create mode 100644 packages/json-document/src/foundation/protocol/index.ts create mode 100644 packages/json-document/tests/conformance/v2/projection-suite.ts create mode 100644 packages/json-document/tests/conformance/v2/projection-vectors.json create mode 100644 packages/json-document/tests/conformance/v2/protocol-suite.ts create mode 100644 packages/json-document/tests/conformance/v2/protocol-vectors.json create mode 100644 packages/json-document/tests/public/v2-projection-standard-conformance.test.ts create mode 100644 packages/json-document/tests/public/v2-protocol-standard-conformance.test.ts create mode 100644 packages/json-document/tests/public/v2-signature-contract.test-d.ts diff --git a/README.md b/README.md index 3ea49e38..9d6531b2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,15 @@ # json-document -json-document는 Zod schema가 있는 JSON 문서를 편집하기 위한 headless document -engine입니다. +json-document는 문서, 표, 슬라이드, 캔버스, 노트 편집기가 함께 쓸 수 있는 +provider-neutral JSON 편집 protocol과 headless document projection입니다. -폼, CMS block, kanban board, outliner, settings editor처럼 UI가 다른 편집 툴도 -결국 schema가 있는 JSON document를 읽고, 바꾸고, 선택하고, 복사하고, -붙여넣고, 되돌립니다. json-document는 이 공통 document engine을 UI 밖에 둡니다. +v2 root는 JSON, JSON Pointer, JSONPath, JSON Patch만 전제로 하며 Zod, React, +selection, clipboard, history를 필수 계약에 넣지 않습니다. ```txt -schema -> document -> pointer/query -> can* -> change -> result +Pure Protocol + |-> Document Projection -> host adapter + `-> Candidate Editing Session -> React / rich host adapter ``` 공식 사이트: https://developer-1px.github.io/json-document/ @@ -24,17 +25,15 @@ schema -> document -> pointer/query -> can* -> change -> result | 제품별 feature 지도 | [docs/public/recipes.md](docs/public/recipes.md) | | 문서 구조 | [docs/README.md](docs/README.md) | | 변경 기록 | [docs/changelog.md](docs/changelog.md) | -| core 의미론 명세 | [docs/standard/json-document-spec.md](docs/standard/json-document-spec.md) | -| 1.0 conformance profile | [docs/standard/conformance-profile.md](docs/standard/conformance-profile.md) | -| result/error 계약 | [docs/standard/result-contract.md](docs/standard/result-contract.md) | -| selection 계약 | [docs/standard/selection-contract.md](docs/standard/selection-contract.md) | -| schema introspection 계약 | [docs/standard/schema-introspection-contract.md](docs/standard/schema-introspection-contract.md) | +| v2 Projection 표준 | [docs/standard/v2-projection-profile.md](docs/standard/v2-projection-profile.md) | +| v2 공개 표면 manifest | [docs/standard/v2-public-surface.json](docs/standard/v2-public-surface.json) | +| Candidate Session의 1.x 기준선 | [docs/standard/conformance-profile.md](docs/standard/conformance-profile.md) | ## 코드 지도 | 위치 | 역할 | | --- | --- | -| [packages/json-document](packages/json-document) | core package. `createJSONDocument`, JSON Patch/Pointer/Path, selection, clipboard, history | +| [packages/json-document](packages/json-document) | v2 Kernel과 optional Candidate Session | | [packages/collection](packages/collection) | ordered JSON array item 이동/복제/삭제 | | [packages/clipboard-web](packages/clipboard-web) | browser clipboard bridge | | [packages/contenteditable-web](packages/contenteditable-web) | `@interactive-os/json-document-contenteditable-web` DOM contenteditable text-surface adapter | @@ -61,13 +60,16 @@ schema -> document -> pointer/query -> can* -> change -> result ## 경계 -json-document가 제공하는 document engine: +v2 Kernel이 제공하는 최소 계약: -- Zod schema로 검증되는 JSON document state -- JSON Pointer 주소, JSON Patch mutation, JSONPath search -- `can*` capability result -- headless selection, clipboard payload, undo/redo history -- 반복 편집 개념을 조립하는 작은 extension 함수 +- immutable JSON snapshot +- JSON Pointer read와 JSONPath query +- state를 바꾸지 않는 `canPatch` +- ordered atomic JSON Patch commit +- canonical applied change publication + +`@interactive-os/json-document/session`은 Zod 기반 schema 검증, selection, +clipboard, history와 고수준 편집 동사를 제공하는 optional Candidate 표면입니다. 편집 툴이 계속 소유하는 것: diff --git a/apps/grouping-lab/src/App.tsx b/apps/grouping-lab/src/App.tsx index 6b17c630..b866da3c 100644 --- a/apps/grouping-lab/src/App.tsx +++ b/apps/grouping-lab/src/App.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from "react"; import { createGrouping, type GroupingAdapter, type GroupingChangeResult } from "@interactive-os/json-document-grouping"; -import type { Pointer } from "@interactive-os/json-document"; +import type { Pointer } from "@interactive-os/json-document/session"; import { useJSONDocument } from "@interactive-os/json-document/react"; import { z } from "zod"; import "./grouping-lab.css"; diff --git a/apps/outliner-blind-b/src/outlinerModel.test.ts b/apps/outliner-blind-b/src/outlinerModel.test.ts index f2e7ef64..3d0ab23b 100644 --- a/apps/outliner-blind-b/src/outlinerModel.test.ts +++ b/apps/outliner-blind-b/src/outlinerModel.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { createJSONDocument } from "@interactive-os/json-document"; +import { createJSONDocument } from "@interactive-os/json-document/session"; import { addChild, addSibling, diff --git a/apps/outliner-blind-b/src/outlinerModel.ts b/apps/outliner-blind-b/src/outlinerModel.ts index 1621b874..02006b66 100644 --- a/apps/outliner-blind-b/src/outlinerModel.ts +++ b/apps/outliner-blind-b/src/outlinerModel.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import type { JSONDocument, JSONPatchOperation, Pointer } from "@interactive-os/json-document"; +import type { JSONDocument, JSONPatchOperation, Pointer } from "@interactive-os/json-document/session"; export type OutlineNode = { id: string; diff --git a/apps/outliner/src/OutlineRow.tsx b/apps/outliner/src/OutlineRow.tsx index f35e6e36..a5d4b117 100644 --- a/apps/outliner/src/OutlineRow.tsx +++ b/apps/outliner/src/OutlineRow.tsx @@ -2,7 +2,7 @@ // keydown 은 props 로 받는다 — chord dispatcher 는 부모 책임. import { useEffect, useRef } from "react"; -import type { JSONDocument, Pointer } from "@interactive-os/json-document"; +import type { JSONDocument, Pointer } from "@interactive-os/json-document/session"; import type { OutlineNode } from "./schema.js"; import type { Mode } from "./keymap.js"; diff --git a/apps/outliner/src/clipboard.ts b/apps/outliner/src/clipboard.ts index df30af9e..81d893af 100644 --- a/apps/outliner/src/clipboard.ts +++ b/apps/outliner/src/clipboard.ts @@ -10,7 +10,7 @@ import { type WebClipboardCutResult, type WebClipboardPasteResult, } from "@interactive-os/json-document-clipboard-web"; -import type { JSONDocument, Pointer } from "@interactive-os/json-document"; +import type { JSONDocument, Pointer } from "@interactive-os/json-document/session"; import type { OutlineNode } from "./schema.js"; export type ClipboardMode = "empty" | "copy" | "cut"; diff --git a/apps/outliner/src/commands/context.ts b/apps/outliner/src/commands/context.ts index 0f70a8d8..86e35a15 100644 --- a/apps/outliner/src/commands/context.ts +++ b/apps/outliner/src/commands/context.ts @@ -1,6 +1,6 @@ // Command 들이 공유하는 ctx 형식 + 공용 헬퍼. -import type { JSONDocument, Pointer, SelectionPoint, SelectionState } from "@interactive-os/json-document"; +import type { JSONDocument, Pointer, SelectionPoint, SelectionState } from "@interactive-os/json-document/session"; import type { OutlineNode } from "../schema.js"; import type { ClipboardApi } from "../clipboard.js"; import { comparePointer } from "../pointer-utils.js"; diff --git a/apps/outliner/src/commands/focus.ts b/apps/outliner/src/commands/focus.ts index 6f191997..73ffc25f 100644 --- a/apps/outliner/src/commands/focus.ts +++ b/apps/outliner/src/commands/focus.ts @@ -1,6 +1,6 @@ // Focus navigation — DFS visible order 위에서 좌표 이동만 (state 미변경). -import type { Pointer } from "@interactive-os/json-document"; +import type { Pointer } from "@interactive-os/json-document/session"; import type { OutlineNode } from "../schema.js"; import { parentOf, nextVisible, prevVisible, firstVisible, lastVisible, firstChildOf, diff --git a/apps/outliner/src/commands/structure.ts b/apps/outliner/src/commands/structure.ts index bacd81a3..76568660 100644 --- a/apps/outliner/src/commands/structure.ts +++ b/apps/outliner/src/commands/structure.ts @@ -1,6 +1,6 @@ import { createCollection } from "@interactive-os/json-document-collection"; import { createOutline } from "@interactive-os/json-document-outline"; -import { type JSONResult, type Pointer } from "@interactive-os/json-document"; +import { type JSONResult, type Pointer } from "@interactive-os/json-document/session"; import { lastIndex, parentOf } from "../pointer-utils.js"; import { focusOf, type CommandContext, targetsOf, sortDfs } from "./context.js"; diff --git a/apps/outliner/src/hooks/useClickPolicy.ts b/apps/outliner/src/hooks/useClickPolicy.ts index dd73fa05..f75dd122 100644 --- a/apps/outliner/src/hooks/useClickPolicy.ts +++ b/apps/outliner/src/hooks/useClickPolicy.ts @@ -4,7 +4,7 @@ // click = collapse import { useCallback } from "react"; -import type { Pointer, SelectionState } from "@interactive-os/json-document"; +import type { Pointer, SelectionState } from "@interactive-os/json-document/session"; import type { Mode } from "../keymap.js"; export function useClickPolicy( diff --git a/apps/outliner/src/hooks/useDraftState.ts b/apps/outliner/src/hooks/useDraftState.ts index eff2bf6a..f079f3a1 100644 --- a/apps/outliner/src/hooks/useDraftState.ts +++ b/apps/outliner/src/hooks/useDraftState.ts @@ -5,7 +5,7 @@ import { type DocumentPersistenceRestoreResult, type DocumentPersistenceSaveResult, } from "@interactive-os/json-document-persist-web"; -import type { JSONDocument } from "@interactive-os/json-document"; +import type { JSONDocument } from "@interactive-os/json-document/session"; import type { OutlineNode } from "../schema.js"; const DRAFT_KEY = "json-document.outliner.draft"; diff --git a/apps/outliner/src/hooks/useToasts.ts b/apps/outliner/src/hooks/useToasts.ts index d772f527..4142705a 100644 --- a/apps/outliner/src/hooks/useToasts.ts +++ b/apps/outliner/src/hooks/useToasts.ts @@ -1,7 +1,7 @@ // Toast 상태. error 는 클릭 시까지 유지 (zod 메시지가 길어서), info 는 2.5s. import { useCallback, useEffect, useRef, useState } from "react"; -import type { JSONDocumentError } from "@interactive-os/json-document"; +import type { JSONDocumentError } from "@interactive-os/json-document/session"; export interface ToastMessage { id: number; diff --git a/apps/outliner/src/pointer-utils.ts b/apps/outliner/src/pointer-utils.ts index cd7314fd..064327b8 100644 --- a/apps/outliner/src/pointer-utils.ts +++ b/apps/outliner/src/pointer-utils.ts @@ -1,6 +1,6 @@ // Outliner-local Pointer helpers. RFC 6901 위에서 outline 트리를 다루는 식별 함수들. -import { parentPointer, lastSegmentIndex, withLastSegment, type Pointer } from "@interactive-os/json-document"; +import { parentPointer, lastSegmentIndex, withLastSegment, type Pointer } from "@interactive-os/json-document/session"; import type { OutlineNode } from "./schema.js"; // Outliner-local 별칭 — json-document 의 path arithmetic 헬퍼를 짧은 이름으로. diff --git a/apps/outliner/tests/stress.test.tsx b/apps/outliner/tests/stress.test.tsx index f08fa429..8b670c2c 100644 --- a/apps/outliner/tests/stress.test.tsx +++ b/apps/outliner/tests/stress.test.tsx @@ -12,7 +12,7 @@ import { renderHook } from "@testing-library/react"; import { afterEach, describe, expect, test } from "vitest"; import { z } from "zod"; import { Outliner, OutlineSchema, SAMPLE } from "../src/index.js"; -import type { JSONDocumentError } from "@interactive-os/json-document"; +import type { JSONDocumentError } from "@interactive-os/json-document/session"; import { useJSONDocument } from "@interactive-os/json-document/react"; afterEach(cleanup); diff --git a/apps/review-comments-lab/src/App.tsx b/apps/review-comments-lab/src/App.tsx index 07124048..fab9678c 100644 --- a/apps/review-comments-lab/src/App.tsx +++ b/apps/review-comments-lab/src/App.tsx @@ -6,7 +6,7 @@ import { type Comments, } from "@interactive-os/json-document-comments"; import { useJSONDocument } from "@interactive-os/json-document/react"; -import { type Pointer } from "@interactive-os/json-document"; +import { type Pointer } from "@interactive-os/json-document/session"; import { z } from "zod"; import "./review-comments-lab.css"; diff --git a/apps/site/index.html b/apps/site/index.html index 66af1565..9b72cf92 100644 --- a/apps/site/index.html +++ b/apps/site/index.html @@ -5,7 +5,7 @@ @@ -13,14 +13,14 @@ diff --git a/apps/site/public/site.webmanifest b/apps/site/public/site.webmanifest index e4145643..38c1f5a2 100644 --- a/apps/site/public/site.webmanifest +++ b/apps/site/public/site.webmanifest @@ -1,7 +1,7 @@ { "name": "@interactive-os/json-document", "short_name": "@interactive-os/json-document", - "description": "Zod-guarded headless JSON editing.", + "description": "Provider-neutral JSON editing protocol and headless document projection.", "start_url": ".", "display": "standalone", "background_color": "#fafaf9", diff --git a/apps/site/src/generated/repo-catalog.ts b/apps/site/src/generated/repo-catalog.ts index e06763a1..4e2c623f 100644 --- a/apps/site/src/generated/repo-catalog.ts +++ b/apps/site/src/generated/repo-catalog.ts @@ -4,7 +4,7 @@ export const repoCatalog = { "repo": { "name": "@interactive-os/json-document-monorepo", "private": true, - "summary": "json-document는 Zod schema가 있는 JSON 문서를 편집하기 위한 headless document\nengine입니다." + "summary": "json-document는 문서, 표, 슬라이드, 캔버스, 노트 편집기가 함께 쓸 수 있는\nprovider-neutral JSON 편집 protocol과 headless document projection입니다." }, "packages": [ { @@ -386,163 +386,43 @@ export const repoCatalog = { "status": "core", "private": false, "publishable": true, - "version": "1.1.0-rc.0", - "description": "Headless JSON editing primitives guarded by Zod schemas.", + "version": "2.0.0-rc.0", + "description": "Provider-neutral JSON editing protocol and headless document projection.", "license": "MIT", - "summary": "Zod schema로 보호되는 JSON state를 읽고, 바꾸고, 선택하고, 복사하고,\n붙여넣고, 되돌리기 위한 headless document layer입니다.", + "summary": "문서, 표, 슬라이드, 캔버스, 노트 편집기가 함께 쓸 수 있는 provider-neutral\nJSON 편집 protocol과 headless document projection입니다.", "guidance": null, "publicExports": [ - "ClipboardCopyError", - "ClipboardCopyOk", - "ClipboardCopyOptions", - "ClipboardCopyResult", - "ClipboardCutError", - "ClipboardCutOk", - "ClipboardCutOptions", - "ClipboardCutResult", - "ClipboardEmpty", - "ClipboardMutationOk", - "ClipboardPasteDiscriminatorMismatch", - "ClipboardPasteError", - "ClipboardPasteResult", - "ClipboardReadOk", - "ClipboardReadOptions", - "ClipboardReadResult", - "ClipboardSource", - "ClipboardState", - "ClipboardWriteOptions", - "DeleteSelectionTextResult", - "EntriesResult", - "EntryKind", - "HistoryTransactionOptions", + "JSONAppliedChange", "JSONCapabilityResult", "JSONChangeMetadata", "JSONDocument", "JSONDocumentCommitOptions", - "JSONDocumentDuplicateError", - "JSONDocumentDuplicateOptions", - "JSONDocumentDuplicateResult", - "JSONDocumentEditError", - "JSONDocumentEditOk", - "JSONDocumentEditResult", - "JSONDocumentError", - "JSONDocumentHistory", - "JSONDocumentInsertOptions", - "JSONDocumentInsertTarget", - "JSONDocumentMoveTarget", - "JSONDocumentOptions", - "JSONDocumentPasteOptions", - "JSONDocumentPasteTarget", - "JSONDocumentSchemaInput", - "JSONDocumentSchemaLike", - "JSONDocumentSchemaOutput", - "JSONDocumentSelectionTarget", - "JSONPatchInput", + "JSONDocumentCommitResult", "JSONPatchOperation", - "JSONResult", + "JSONPatchResult", + "JSONValue", "Pointer", - "PointerSyntaxError", "QueryResult", - "ReadEntry", "ReadResult", - "ReplaceSelectionTextResult", - "ResolveSiblingRangeOptions", - "SchemaDescription", - "SchemaDescriptionResult", - "SchemaErrorCode", - "SchemaErrorResult", - "SchemaKind", - "SchemaKindResult", - "SchemaPathMode", - "SchemaQueryResult", - "SchemaState", - "SelectionAffinity", - "SelectionContext", - "SelectionCursorDirection", - "SelectionCursorErrorCode", - "SelectionCursorOptions", - "SelectionCursorResult", - "SelectionCursorTarget", - "SelectionDirection", - "SelectionEdge", - "SelectionMode", - "SelectionOptions", - "SelectionOrderErrorCode", - "SelectionOrderOptions", - "SelectionOrderedRange", - "SelectionOrderedRangeEntry", - "SelectionPoint", - "SelectionPointObject", - "SelectionPointOrderResult", - "SelectionPointerSpan", - "SelectionPointerSpansResult", - "SelectionRange", - "SelectionRangeInput", - "SelectionRangeOrderResult", - "SelectionRangesOrderResult", - "SelectionScopeErrorCode", - "SelectionScopeOptions", - "SelectionScopeResult", - "SelectionScopeTarget", - "SelectionSnap", - "SelectionSource", - "SelectionSpanOptions", - "SelectionState", - "SelectionTextDeleteDirection", - "SelectionTextDeleteOptions", - "SelectionTextEdit", - "SelectionTextEditErrorCode", - "SelectionTextEditOptions", - "SelectionTextEditsResult", - "SelectionType", - "SiblingLocation", - "SiblingRangeErrorCode", - "SiblingRangeResult", - "TextSurface", - "TextSurfaceAtom", - "TextSurfaceError", - "TextSurfaceErrorCode", - "TextSurfaceFragment", - "TextSurfaceFragmentResult", - "TextSurfaceMutationRange", - "TextSurfaceMutationResult", - "TextSurfaceRange", - "TextSurfaceReplaceOptions", - "TextSurfaceReplaceResult", - "TextSurfaceReplacement", - "TextSurfaceSelectionRange", "appendSegment", - "applyOperation", "applyPatch", - "applyPatchToTrustedState", "buildPointer", "createJSONDocument", - "escapeSegment", - "lastSegment", - "lastSegmentIndex", "parentPointer", "parsePointer", - "replaceTextSurfaceSelection", - "resolveSiblingRange", - "syncTextSurfaceMutation", - "textSurfaceFragment", "trackPointer", - "tryParsePointer", - "unescapeSegment", - "withLastSegment" + "tryParsePointer" ], - "publicExportCount": 138, + "publicExportCount": 20, "keywords": [ - "clipboard", - "crud", + "document", + "editor", "headless", "json", - "redo", - "schema", - "tree", - "treegrid", - "undo", - "zod" + "json-patch", + "json-pointer", + "jsonpath", + "protocol" ] }, { diff --git a/apps/site/src/playgrounds/InterfaceWorkbench.playground.tsx b/apps/site/src/playgrounds/InterfaceWorkbench.playground.tsx index da880b9c..1ba675a2 100644 --- a/apps/site/src/playgrounds/InterfaceWorkbench.playground.tsx +++ b/apps/site/src/playgrounds/InterfaceWorkbench.playground.tsx @@ -22,7 +22,7 @@ import { type JSONCapabilityResult, type Pointer, type SelectionSnap, -} from "@interactive-os/json-document"; +} from "@interactive-os/json-document/session"; import { useJSONDocument } from "@interactive-os/json-document/react"; const Card = z.object({ diff --git a/apps/site/src/routes/Home.tsx b/apps/site/src/routes/Home.tsx index b49d37fb..68f24c25 100644 --- a/apps/site/src/routes/Home.tsx +++ b/apps/site/src/routes/Home.tsx @@ -1,9 +1,9 @@ const modelRows = [ - ["document", "value, patch, duplicate, read/query"], - ["selection", "anchor, focus, ranges, text plans"], - ["clipboard", "copy, cut, paste, payload insertion"], - ["history", "undo, redo, transaction metadata"], - ["can*", "reasoned checks for UI and tests"], + ["protocol", "provider-neutral JSON Patch application"], + ["projection", "value, at, query, canPatch, commit, subscribe"], + ["acceptance", "optional provider-neutral candidate validation"], + ["session", "optional selection, clipboard, history, rich edit verbs"], + ["host", "rendering, focus, keyboard, persistence, collaboration"], ] as const; const BASE_PATH = import.meta.env.BASE_URL.replace(/\/$/, ""); @@ -19,14 +19,14 @@ export function Home() {

- Zod-guarded JSON editing + Provider-neutral JSON editing

json-document

- A headless document facade for JSON Patch, JSON Pointer, JSONPath, - selection, clipboard, history, and reasoned capability checks. + A headless JSON protocol and six-member document projection for + documents, tables, slides, canvases, and notes.

@@ -49,7 +49,7 @@ export function Home() {
Install
-
npm install @interactive-os/json-document zod
+
npm install @interactive-os/json-document@2.0.0-rc.0
Start
{`import { createJSONDocument } from "@interactive-os/json-document";`}
@@ -82,8 +82,8 @@ export function Home() {