@octanejs/cli 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/package.json +50 -0
  4. package/src/bin/octane.js +4 -0
  5. package/src/commands/add.js +138 -0
  6. package/src/commands/analyze.js +271 -0
  7. package/src/commands/bindings.js +55 -0
  8. package/src/commands/doctor/check.js +43 -0
  9. package/src/commands/doctor/checks/bundler.js +104 -0
  10. package/src/commands/doctor/checks/config.js +184 -0
  11. package/src/commands/doctor/checks/dependencies.js +120 -0
  12. package/src/commands/doctor/checks/environment.js +38 -0
  13. package/src/commands/doctor/checks/source.js +108 -0
  14. package/src/commands/doctor/checks/typescript.js +183 -0
  15. package/src/commands/doctor/index.js +118 -0
  16. package/src/commands/doctor/registry.js +32 -0
  17. package/src/commands/doctor/report.js +158 -0
  18. package/src/commands/explain.js +95 -0
  19. package/src/commands/info.js +54 -0
  20. package/src/commands/init/index.js +277 -0
  21. package/src/commands/init/templates.js +124 -0
  22. package/src/commands/mcp/add.js +241 -0
  23. package/src/commands/mcp/clients.js +281 -0
  24. package/src/commands/mcp/detect.js +58 -0
  25. package/src/commands/mcp/index.js +23 -0
  26. package/src/commands/mcp/remove.js +105 -0
  27. package/src/commands/mcp/server.js +46 -0
  28. package/src/commands/mcp/status.js +48 -0
  29. package/src/data/index.js +74 -0
  30. package/src/data/octane-data.json +953 -0
  31. package/src/index.js +4 -0
  32. package/src/kernel/args.js +181 -0
  33. package/src/kernel/banner.js +98 -0
  34. package/src/kernel/command.js +84 -0
  35. package/src/kernel/context.js +78 -0
  36. package/src/kernel/edit.js +238 -0
  37. package/src/kernel/errors.js +42 -0
  38. package/src/kernel/exec.js +62 -0
  39. package/src/kernel/help.js +97 -0
  40. package/src/kernel/install.js +43 -0
  41. package/src/kernel/jsonc.js +91 -0
  42. package/src/kernel/main.js +166 -0
  43. package/src/kernel/project.js +376 -0
  44. package/src/kernel/registry.js +52 -0
  45. package/src/kernel/semver.js +111 -0
  46. package/src/kernel/ui.js +155 -0
@@ -0,0 +1,953 @@
1
+ {
2
+ "bindings": [
3
+ {
4
+ "name": "@octanejs/apollo-client",
5
+ "version": "0.1.12",
6
+ "category": "AI, data, and routing",
7
+ "upstream": { "package": "@apollo/client", "version": "4.2.6" },
8
+ "surface": "Complete published client adapter surface: all 18 @apollo/client/react runtime exports and their Apollo 4.2.6 TypeScript declarations, framework-neutral root/testing exports, an Octane MockedProvider, and the Octane-native /react/ssr prerenderStatic entry.",
9
+ "divergences": [
10
+ "Suspense unwraps stable Apollo promises through Octane use() instead of React's use() or a thrown-promise fallback.",
11
+ "The React class-based MockedProvider is an equivalent Octane function component.",
12
+ "React Server Components and Apollo's React Compiler-generated entry are intentionally not exposed."
13
+ ],
14
+ "ssr": "Dedicated Node-mode tests cover multi-pass useQuery, nested query waterfalls, per-request cache isolation, ssr:false/no-cache, render limits, and scoped CSS; client hydration verifies cache restoration, in-place adoption, and no duplicate fetch. Streaming cache patches remain open.",
15
+ "verified": "2026-07-25"
16
+ },
17
+ {
18
+ "name": "@octanejs/aria",
19
+ "version": "0.0.11",
20
+ "category": "UI and interaction",
21
+ "upstream": { "package": "react-aria", "version": "3.50.0" },
22
+ "surface": "Phases 0-5 + the Tree/Table follow-up complete. Phases 0-1: the utils foundation, SSR utilities, the complete interactions area (usePress, useHover, focus/keyboard family, useLongPress, useMove, Pressable/PressResponder), the focus area (FocusScope with containment/restore/focus managers, FocusRing, useFocusRing, useHasTabbableChild), the i18n area (I18nProvider, locale/collator/formatter/filter hooks), form validation (useFormValidation + stately useFormValidationState), and the leaf hooks: useButton/useToggleButton(+Group), useLabel/useField, useCheckbox(+Group/+Item), useRadio/useRadioGroup, useSwitch, useTextField, useSearchField, useProgressBar, useMeter, useSeparator, useLink, useDisclosure, useToolbar, VisuallyHidden. Phase 2 adds the collections + selection tier: the stately collections engine (CollectionBuilder/Item/Section/useCollection) and selection core (Selection/SelectionManager/useMultipleSelectionState), the stately state hooks (useListState/useSingleSelectListState, useTreeState, useMenuTriggerState/useSubmenuTriggerState, useOverlayTriggerState, useSelectState, useComboBoxState, useTabListState, useNumberFieldState, useSliderState), the aria selection area (useSelectableCollection/-Item/-List, useTypeSelect, ListKeyboardDelegate, DOMLayoutDelegate), and the aria hooks useListBox/useOption/useListBoxSection, useMenu/useMenuItem/useMenuSection/useMenuTrigger/useSubmenuTrigger, useTab/useTabList/useTabPanel, useSlider/useSliderThumb, useNumberField, useGridList(+Item/+Section/+SelectionCheckbox), useTag/useTagGroup, useBreadcrumbs/useBreadcrumbItem — plus the matching react-stately state hooks under `@octanejs/aria/stately`. Phase 3 adds the overlays hooks tier: the stately `useTooltipTriggerState` and the whole aria overlays area (usePreventScroll, ariaHideOutside, DismissButton, PortalProvider, useOverlay, useOverlayTrigger, useOverlayPosition + calculatePosition, Overlay/useOverlayFocusContain, useModal/ModalProvider/OverlayProvider/OverlayContainer, useModalOverlay, usePopover), plus the consumers useDialog, useTooltip/useTooltipTrigger, useSelect/useHiddenSelect/HiddenSelect, and useComboBox. Differential-verified byte-identical against the real react-aria (interactions + button/toggle/checkbox/switch/radio/textfield/progress + tabs + listbox + select + combobox fixtures); dialog/tooltip/overlay focus-trap/dismiss/scroll-lock paths are covered by behavioral tests (the differential rig shares one document, so focus/portal/positioning aren't rig-driveable). Autocomplete (useAutocomplete/useSearchAutocomplete) is deferred — useComboBox does not depend on it in 3.50.0. Phase 4 adds the react-aria-components foundation under `@octanejs/aria/components`: the collections engine re-hosted on a detached real-DOM store (BaseCollection/CollectionBuilder/createLeafComponent/createBranchComponent/Hidden/useCachedChildren + Collection/Section), the RAC plumbing (Provider, useContextProps, slotted contexts, useRenderProps/composeRenderProps with data-* state attributes), and the non-collection components: Button, ToggleButton(+Group), Checkbox(+Group/Field/Button), Switch(+Field/Button), RadioGroup(+Radio/Field/Button), TextField, SearchField, NumberField, Form, Label/Input/TextArea/FieldError, Group, Toolbar, Separator, Header, Heading, Link, ProgressBar, Meter, Slider(+Output/Track/Thumb/Fill), Disclosure(+Group/Panel), DialogTrigger/Dialog, Modal/ModalOverlay, Popover, TooltipTrigger/Tooltip, OverlayArrow, Text, Keyboard, SelectionIndicator, SharedElementTransition. Phase-4 differentials drive the REAL components on both sides byte-identical (Button hover+mid-press, ToggleButton, Checkbox, TextField typing, Disclosure expand/collapse). Phase 5 adds the RAC collection components over that engine: Autocomplete (full — aria useAutocomplete + stately useAutocompleteState now ported), ListBox(+Item/Section/LoadMoreItem), Menu(+MenuTrigger/SubmenuTrigger/MenuItem/MenuSection), Select(+SelectValue), ComboBox(+ComboBoxValue), Tabs(+TabList/Tab/TabPanels/TabPanel), TagGroup(+TagList/Tag), GridList(+Item/Section/Header/LoadMoreItem), Breadcrumbs(+Breadcrumb), and the DragAndDrop context layer (DropIndicator/contexts/DragAndDropHooks type; components' dnd branches are inert — the dnd engine and useDragAndDrop() itself arrive in a later phase, the stub throws). Phase-5 differentials drive the REAL react-aria-components byte-identical (ListBox selection + keyed reverse, Tabs switch, TagGroup multi-select, GridList row selection, Breadcrumbs, ComboBox typing); Menu/Select open-state (portal'd) carries behavioral coverage incl. keyboard-driven submenus. The Tree/Table follow-up adds the remaining collection verticals: stately grid (GridCollection/useGridState) + the full stately table area (TableCollection/useTableState/column-resize state/UNSTABLE_useTreeGridState), the aria tree hooks (useTree/useTreeItem) and the full aria table hook area (useTable family, TableKeyboardDelegate, useTableColumnResize, grid hooks it rides on), RAC Tree(+TreeItem/TreeItemContent/TreeSection/TreeHeader/TreeLoadMoreItem) and RAC Table(+TableHeader/TableBody/Column/Row/Cell/ColumnResizer/ResizableTableContainer/TableFooter/TableLoadMoreItem). Tree structure states and the interactive Table (sort cycling, row selection) are differential-verified byte-identical vs the real react-aria-components; chevron-driven Tree interaction carries behavioral coverage (the rig's virtual clicks cannot faithfully reproduce the focus-effect interplay on the React side). TableLayout lands with the Virtualizer; date/color families and the drag-and-drop engine are not started — see the migration plan.",
23
+ "divergences": [
24
+ "Text-input DOM wiring uses octane's native `onInput` (per keystroke) instead of React's synthetic `onChange`; React Aria's public value-level `onChange(value)` callbacks are unchanged.",
25
+ "`forwardRef` becomes octane's ref-as-prop.",
26
+ "i18n server serializer: hoisted-string variable names stay valid identifiers past 26 entries (upstream's `common.size + 97` yields `{`, `|`, … — a SyntaxError in the emitted inline script).",
27
+ "useDefaultLocale, SSR branch: `direction` derives from the server-injected locale via `isRTL` (upstream hardcodes 'ltr' even for an injected RTL locale, disagreeing with its own getDefaultLocale)."
28
+ ],
29
+ "ssr": "Dedicated Node-mode coverage verifies SSRProvider, hydration-safe labelled relationships, server snapshots, and injected LTR/RTL locales; real Vite-compiled Octane server markup is hydrated in place and remains interactive. Overlay and collection SSR registration remain planned for Phase 8.",
30
+ "verified": "2026-07-25"
31
+ },
32
+ {
33
+ "name": "@octanejs/base-ui",
34
+ "version": "0.1.15",
35
+ "category": "UI and interaction",
36
+ "upstream": { "package": "@base-ui/react", "version": "1.6.0" },
37
+ "surface": "Alpha, in progress: 28 of 43 upstream subpaths. The foundation, overlay infrastructure, hover/focus interaction layer and popup viewport have landed, along with Dialog, AlertDialog, Popover, Tooltip, PreviewCard, the full form-control set, and the standalone Button/DirectionProvider/CSPProvider/useMediaQuery utilities — ported at full fidelity and differential-verified against the real `@base-ui/react`.",
38
+ "divergences": [
39
+ "Handlers receive native DOM events (no synthetic layer): visible text controls use per-edit `input`, while the NumberField form-facing number input intentionally observes native `change` commits.",
40
+ "`forwardRef` becomes ref-as-prop; `className` composes via octane's `normalizeClass` (the render-prop string merge matches Base UI exactly).",
41
+ "The vendored `floating-ui-react` surface is internal rather than republished, so its standalone `useHover` combiner is not ported — no Base UI component uses it.",
42
+ "Tooltips outside a `Tooltip.Provider` still share the delay-group context's module-level default refs, so opening one closes another. Transcribed from Base UI rather than chosen; pinned by `tests/tooltip-delay-group.test.ts`.",
43
+ "`NumberField.ScrubArea` and hold-to-repeat stepping remain unported; the steppers respond to single presses only."
44
+ ],
45
+ "ssr": "Dedicated Node-mode tests cover server snapshots, accessible separators, edge-aligned slider visibility, and closed dialogs; hydration adopts Vite-compiled Octane server markup, transitions to the client snapshot, and preserves interaction. Open overlays and remaining components are not yet covered.",
46
+ "verified": "2026-07-26"
47
+ },
48
+ {
49
+ "name": "@octanejs/cmdk",
50
+ "version": "0.1.0",
51
+ "category": "UI and interaction",
52
+ "upstream": { "package": "cmdk", "version": "1.1.1" },
53
+ "surface": "Complete against the published `cmdk@1.1.1` public surface: `Command` (the root itself) and the `CommandRoot` named export, `Command.Input`, `Command.List`, `Command.Item`, `Command.Group`, `Command.Separator`, `Command.Dialog`, `Command.Empty`, `Command.Loading`, the flat `CommandX` aliases, `useCommandState`, and `defaultFilter` — with the DOM-authoritative store and item/group registration, `useValue` text-content inference, `onInput`-driven search, score filtering plus item and group DOM sorting, keyboard navigation (arrows/Home/End/vim/Enter), controlled `value`/`onValueChange`/`loop`/`shouldFilter`/custom `filter`/`forceMount`, the `--cmdk-list-height` ResizeObserver, and a Radix-backed `Command.Dialog`. `asChild` is the one unsupported prop (see divergences).",
54
+ "divergences": [
55
+ "No forwardRef: components take `ref` as a normal prop; multi-ref uses octane's `ref={[a, b]}` instead of composeRefs.",
56
+ "`Command.Input` drives search from the native `onInput` event; the public `onValueChange(search)` API is unchanged (no synthetic `onChange`).",
57
+ "Item value is inferred from the provided `value` prop or the rendered `textContent`; cmdk's string-child inspection is dropped because octane's compiled children are opaque. An item that has never been scored therefore renders once so the inference can read its text — treating unscored as score zero deadlocks it (null render leaves no element, no element leaves no textContent, no textContent scores zero), which made items arriving during an active search permanently invisible.",
58
+ "Score ranking is expressed as CSS `order` inside a flex container, not by relocating DOM nodes. Upstream's sort() is DOM-authoritative: it appendChild's matching items into the list sizer. Octane fences every component's DOM with comment markers and tracks the range between them, and a template construct like `@for` or `@if` wraps each item in a SECOND, outer range — so relocating an item carries it out of every range at once, and the loop later clears an empty range while the real node is orphaned in the list forever. Carrying the flanking markers along only repairs the innermost range, so it breaks again at each new nesting construct. Ranking declaratively removes the class of bug: no node moves, no range is violated, and clearing the search restores true source order because the styles are simply dropped. The cost is that the list sizer and each group's item container are flex columns WHILE a filter is active, so a consumer relying on physical DOM order (`:nth-child` styling, drag handles) or on a custom container `display` diverges from upstream. Selection, arrow-key navigation and alt+arrow group navigation all read the ranked order, not DOM order, so what is selected always matches what is on screen. Every valid item is ranked rather than only the matches: an unranked flex child keeps the initial `order` of 0, which sorts it AHEAD of every match, so a force-mounted non-match would jump to the top of its container. Ranking everything puts zero-scoring items last, which is where upstream's append-in-score-order leaves them too. Ranks land on the child the container actually lays out, resolved at any nesting depth, because `order` applies to a flex CHILD — upstream resolves a single wrapper level, which its appendChild model tolerates but this one does not. Ungrouped items and group hosts share the sizer's rank space, so the former are numbered densely and the latter continue past them, matching upstream's order of appending items before groups.",
59
+ "`aria-activedescendant` is wired on the initial auto-select and after every filter; upstream queues that work from inside its own layout-effect flush and its batcher discards it, so upstream only sets the attribute after a directly user-driven selection. The runtimes agree on which item is selected.",
60
+ "Ids are `radix-` prefixed to match upstream, which takes them from `@radix-ui/react-id`.",
61
+ "Group reordering resolves each group element by its registered value rather than upstream's `[cmdk-group=\"\"][data-value=\"<groupId>\"]` selector. That selector can never match — `data-value` holds the group's heading text, never its id — so upstream's group sort is effectively dead code; the port makes groups genuinely reorder by their best item score.",
62
+ "Re-registering an item value during an active search re-derives the whole filter aggregate (match count and matching groups), not just that item's score. Upstream only re-sorts, leaving `filtered.count`/`filtered.groups` describing the previous values — so an item that starts matching renders while `Command.Empty` still shows \"no results\" (and its group can stay hidden). Upstream's own item-registration path already re-derives the aggregate the same way, so the omission reads as an oversight rather than intent.",
63
+ "Force-mounted items are counted so `Command.Empty` can see them. Upstream skips registration entirely for a `forceMount` item, so it never reaches `filtered.count` — with a search that matches nothing, upstream renders the force-mounted item and \"no results\" on top of each other. The port tracks the live force-mounted count separately (`filtered.count` keeps its upstream meaning for `useCommandState`) and Empty consults both.",
64
+ "Removing the selected force-mounted item moves the selection on. Because upstream never registers a `forceMount` item it has no teardown for one either, so the selected value keeps pointing at a node that is gone: nothing renders `aria-selected`, `aria-activedescendant` dangles at a removed id, and Enter does nothing until the user arrows away. The port re-selects from the force-mount teardown, the same way the plain item teardown does.",
65
+ "Every registration path releases the value it registered. Items, force-mounted items and groups all register through the same `useValue`, but upstream only releases on the plain item teardown — so a force-mounted item or a group that unmounts leaves its entry in `ids`/`filtered.items` for the Command's lifetime. In the port all three release symmetrically, which also keeps the dev-only duplicate-value report honest: re-showing a force-mounted item used to count its value again each time (\"2 items share…\", then \"3…\") and blame the author for code holding exactly one live item with that value.",
66
+ "Registration teardowns hop a microtask before scheduling their follow-up work. Octane runs a removed child's effect cleanups during the PARENT's render, so scheduling straight from a teardown lands its state update mid-render and the runtime reports \"Cannot update a component (`CommandRoot`) while rendering a different component\" — advice a teardown cannot act on, since it does not choose when it runs. The queued work is unchanged and still runs before paint; only the teardown paths defer, because every other caller schedules from a layout effect where the synchronous update is load-bearing. React has no equivalent problem: it runs cleanups in the commit phase.",
67
+ "`Command.Empty` renders nothing during SSR. Items register in layout effects, which never run on the server, so the match count is unavoidably 0 there and upstream ships \"no results\" above a fully-populated list on every server-rendered page — permanently so for readers without JavaScript. The port supplies a server snapshot of \"not empty\" instead, and the empty state appears on the client once the count is real.",
68
+ "An item leaving a group is removed from that group's member set. Upstream deletes the item from `ids`/`allItems` but never from `allGroups`, so a group accumulates dead item ids for the lifetime of the Command — unbounded growth in a menu whose results churn, plus wasted work in every filter pass.",
69
+ "`Command.Dialog` additionally forwards `defaultOpen` and `modal` to the underlying Radix `Dialog.Root`. Upstream cmdk forwards only `open`/`onOpenChange`, so it has no uncontrolled open state and is always modal.",
70
+ "Duplicate item values are reported in development. Selection is keyed by value, so two items sharing one both render `aria-selected=\"true\"` while only the first responds to Enter — an invalid single-select listbox. The runtime cannot pick a winner (cmdk requires unique values), so the port warns instead of failing silently; upstream neither warns nor resolves it.",
71
+ "The layout-effect batcher isolates each queued callback: a callback that throws is reported through `console.error` (as octane reports effect exceptions) and the remaining queued callbacks still run, rather than one failure aborting the rest of the flush. Upstream has no such isolation, so a throwing callback there aborts the siblings queued behind it.",
72
+ "`asChild` is not supported: cmdk's SlottableWithNestedChildren clones a child element and re-parents the component's own content into it, which has no faithful equivalent over octane's opaque compiled children. Components always render their own host element.",
73
+ "`Command.Dialog` builds on @octanejs/radix's Dialog (composed via createElement descriptors, since radix's Portal iterates children) instead of @radix-ui/react-dialog.",
74
+ "The vendored scorer gained explicit parameter type annotations for strict typecheck and repo-style formatting; the algorithm and score constants are unchanged from cmdk@1.1.1."
75
+ ],
76
+ "ssr": "Supported and tested: the menu server-renders all items in source order without browser globals (the DOM-authoritative filter/selection is post-hydration work), and no empty state — items cannot register on the server, so `Command.Empty` renders nothing there rather than claiming \"no results\" over a full list. `hydrateRoot` adopts the server nodes without a mismatch, then activates — values infer from textContent, the first item selects, and typing filters live.",
77
+ "verified": "2026-07-22"
78
+ },
79
+ {
80
+ "name": "@octanejs/devtools",
81
+ "version": "0.0.5",
82
+ "category": "Styling, tests, and devtools",
83
+ "upstream": { "package": "octane", "version": "workspace" },
84
+ "surface": "Octane-native DevTools plugin (not an upstream port): renders live runtime diagnostics into a TanStack Devtools host via @tanstack/devtools-event-client. P1 ships the Components tree + state inspector.",
85
+ "divergences": [],
86
+ "ssr": "The plugin renders no anchor of its own; it is a client-only panel plugged into @octanejs/tanstack-devtools. Include it only in dev.",
87
+ "verified": "2026-07-24"
88
+ },
89
+ {
90
+ "name": "@octanejs/dexie",
91
+ "version": "0.1.10",
92
+ "category": "AI, data, and routing",
93
+ "upstream": { "package": "dexie-react-hooks", "version": "4.4.0" },
94
+ "surface": "Port of the public dexie-react-hooks surface: useObservable, useLiveQuery, useSuspendingObservable, useSuspendingLiveQuery, usePermissions, and useDocument, with Dexie's framework-neutral API re-exported from the package root.",
95
+ "divergences": [
96
+ "Suspending hooks integrate with Octane's use() rather than React's use() or thrown-promise implementation details.",
97
+ "Hook call-site slots are forwarded through Octane's compiler binding ABI.",
98
+ "useDocument requires consumers to install and import y-dexie and yjs before using the hook; those integrations remain optional."
99
+ ],
100
+ "ssr": "Supported for non-suspending live queries: SSR returns the configured default without opening IndexedDB, and hydration adopts the server host before replacing the default with live data. Suspending live queries remain client-oriented and do not claim server data loading.",
101
+ "verified": "2026-07-16"
102
+ },
103
+ {
104
+ "name": "@octanejs/dnd-kit",
105
+ "version": "0.1.12",
106
+ "category": "UI and interaction",
107
+ "upstream": { "package": "@dnd-kit/react", "version": "0.5.0" },
108
+ "surface": "Complete modern dnd-kit React-adapter surface: DragDropProvider, DragOverlay, useDraggable/useDroppable, manager/monitor/operation hooks, PointerSensor/KeyboardSensor re-exports, the public signal-hook utilities, useSortable, and all four upstream entry points.",
109
+ "divergences": [
110
+ "DragOverlay distinguishes octane compiled children blocks from function render props; ordinary typed usage is behaviorally equivalent.",
111
+ "useSortable retains the upstream keyboard plugin by default but omits OptimisticSortingPlugin because moving one host element before application state commits can split an Octane keyed DOM range; explicit plugin arrays remain authoritative."
112
+ ],
113
+ "ssr": "Static SSR and hydration are covered; DOM plugins initialize only after client refs register.",
114
+ "verified": "2026-07-15"
115
+ },
116
+ {
117
+ "name": "@octanejs/floating-ui",
118
+ "version": "0.1.16",
119
+ "category": "UI and interaction",
120
+ "upstream": { "package": "@floating-ui/react", "version": "0.27.19" },
121
+ "surface": "Positioning (`useFloating`, ref-aware `arrow`, the `@floating-ui/dom` middleware re-exports, the floating tree), the full interaction-hook set (`useInteractions`, `useHover` + `safePolygon`, `useClick`, `useFocus`, `useDismiss`, `useRole`, `useClientPoint`, `useListNavigation`, `useTypeahead`), the component layer (`FloatingPortal`, `FloatingOverlay`, `FloatingFocusManager`, `FloatingArrow`, `FloatingList`, `Composite`), and transitions + `FloatingDelayGroup`.",
122
+ "divergences": ["`forwardRef` becomes octane's ref-as-prop."],
123
+ "ssr": "No dedicated SSR/hydration tests.",
124
+ "verified": "2026-07-05"
125
+ },
126
+ {
127
+ "name": "@octanejs/hook-form",
128
+ "version": "0.1.14",
129
+ "category": "Forms and content",
130
+ "upstream": { "package": "react-hook-form", "version": "7.81.0" },
131
+ "surface": "Complete port of react-hook-form 7.81.0 (upstream commit b7df98c2) with the upstream test suite ported: `useForm`, `useController`, `useFieldArray`, `useFormState`, `useWatch`, `useFormContext`/`FormProvider`, schema resolvers, and all validation modes.",
132
+ "divergences": [
133
+ "`register()` returns `onInput` (octane's native per-keystroke event) instead of React's synthetic `onChange`; mode names and `register` option keys keep the upstream spelling.",
134
+ "Ported tests directly assert Octane's documented microtask-flush commit granularity, eager `Object.is` setState bailout, and native input-event delivery; the suite contains no skipped or expected-failure cases."
135
+ ],
136
+ "ssr": "Supported and tested — the upstream `*.server.test.tsx` suite runs via `octane/server` with byte-identical markup.",
137
+ "verified": "2026-07-14"
138
+ },
139
+ {
140
+ "name": "@octanejs/i18next",
141
+ "version": "0.1.12",
142
+ "category": "Forms and content",
143
+ "upstream": { "package": "react-i18next", "version": "17.0.9" },
144
+ "surface": "Complete runtime port of react-i18next 17.0.9: useTranslation, I18nextProvider/context, Trans/TransWithoutContext, IcuTrans/IcuTransWithoutContext, Translation, the withTranslation/withSSR HOCs, useSSR, namespace reporting, initialization/default helpers, and the root ICU helper exports over the unchanged i18next core.",
145
+ "divergences": [
146
+ "Trans children that must be inspected are passed in prop position (`children={<>…</>}`) or through `defaults` + `components`; natural .tsrx block children are opaque compiled render bodies and fall back with a development warning.",
147
+ "Suspense uses octane's `use(thenable)` instead of throwing a Promise.",
148
+ "withTranslation's `withRef` option uses octane's ref-as-prop model; class components are unsupported.",
149
+ "The React/Babel-specific `icu.macro` subpath is not shipped; the runtime IcuTrans APIs are fully supported."
150
+ ],
151
+ "ssr": "Preloaded renderToString output and namespace collection are covered; useSSR, withSSR, getInitialProps, and composeInitialProps are ported. A dedicated hydration differential is still open.",
152
+ "verified": "2026-07-13"
153
+ },
154
+ {
155
+ "name": "@octanejs/jotai",
156
+ "version": "0.1.14",
157
+ "category": "Shared state",
158
+ "upstream": { "package": "jotai", "version": "2.20.2" },
159
+ "surface": "Complete 1:1 port: the framework-agnostic vanilla core (`jotai/vanilla`, `/vanilla/utils`, `/vanilla/internals`) is reused verbatim; the React layer (`Provider`, `useStore`, `useAtom`, `useAtomValue`, `useSetAtom`) and `react/utils` (`useResetAtom`, `useReducerAtom`, `useAtomCallback`, `useHydrateAtoms`) are ported onto octane hooks, preserving upstream's useReducer force-update + effect-subscription implementation, async atoms via octane's `use()`.",
160
+ "divergences": ["`jotai/babel/*` (React-specific compile-time plugins) is not shipped."],
161
+ "ssr": "No SSR-specific surface; `useHydrateAtoms` is ported and usable for hydration seeding; no dedicated SSR tests.",
162
+ "verified": "2026-07-21"
163
+ },
164
+ {
165
+ "name": "@octanejs/lexical",
166
+ "version": "0.1.16",
167
+ "category": "Forms and content",
168
+ "upstream": { "package": "@lexical/react", "version": "0.46.0" },
169
+ "surface": "35 of 39 `@lexical/react` modules ported: composer + contexts, the editable surface, plain/rich text, and the full plugin/menu set (history, lists + check-list, links, tables, markdown shortcuts, the typeahead/node-menu/context-menu family, draggable-block, character-limit, …) plus the `useLexical*` hooks.",
170
+ "divergences": [
171
+ "Positioning uses `@floating-ui/dom` instead of `@floating-ui/react`.",
172
+ "The class-based `LexicalErrorBoundary` becomes an octane error boundary; `forwardRef` becomes ref-as-prop."
173
+ ],
174
+ "ssr": "No dedicated SSR/hydration tests.",
175
+ "verified": "2026-07-09"
176
+ },
177
+ {
178
+ "name": "@octanejs/lucide",
179
+ "version": "0.1.12",
180
+ "category": "UI and interaction",
181
+ "upstream": { "package": "lucide-react", "version": "1.24.0" },
182
+ "surface": "Complete against the published `lucide-react@1.24.0` runtime surface: every canonical icon and alias, the `icons` namespace, `Icon`, `createLucideIcon`, `LucideProvider`, `useLucideContext`, `DynamicIcon`, `iconNames`, `dynamicIconImports`, and per-icon subpath imports.",
183
+ "divergences": [
184
+ "Icon refs are normal Octane `ref` props rather than React `forwardRef` components.",
185
+ "Event callbacks receive native DOM events rather than React synthetic events."
186
+ ],
187
+ "ssr": "Supported and tested: icons and provider defaults render through `octane/server`, and client hydration adopts the server-rendered SVG element.",
188
+ "verified": "2026-07-13"
189
+ },
190
+ {
191
+ "name": "@octanejs/mdx",
192
+ "version": "0.1.14",
193
+ "category": "Forms and content",
194
+ "upstream": { "package": "@mdx-js/mdx", "version": "3.1.1" },
195
+ "surface": "The full compile-don't-interpret pipeline: `.mdx`/`.md` → `@mdx-js/mdx` (reused verbatim) → octane compiler, via the `octaneMdx()` Vite plugin plus the `./compile` and `./server` entries; compiler warnings propagate through direct and Vite compile surfaces with authored `.mdx` ranges; `@mdx-js/react`'s provider layer (`MDXProvider`/`useMDXComponents`) is ported onto octane context. The octane website runs on it.",
196
+ "divergences": [
197
+ "`useMDXComponents` drops upstream's `useMemo` referential-stability wrapper so the call is valid in both server and client runtimes (same observable mapping)."
198
+ ],
199
+ "ssr": "Full SSR + hydration coverage — server-compiled documents render via `renderToString` and hydrate byte-for-byte (`ssr.test.ts`, `hydration.test.ts`).",
200
+ "verified": "2026-07-17"
201
+ },
202
+ {
203
+ "name": "@octanejs/motion",
204
+ "version": "0.1.16",
205
+ "category": "UI and interaction",
206
+ "upstream": { "package": "motion", "version": "12.42.2" },
207
+ "surface": "Core surface: `motion.<tag>` (animate, gestures, variants with propagation/stagger, drag, layout basics), `AnimatePresence`, `MotionConfig`, and the motion-value hooks (`useMotionValue`, `useScroll`, `useTransform`, `useSpring`, `useAnimate`, `useMotionValueEvent`); motion-dom's animation engine and gesture primitives are reused verbatim.",
208
+ "divergences": [
209
+ "Exit animations run via cleanup-before-detach instead of React's deferred-deletion machinery.",
210
+ "`layout`/`layoutId` use single-element FLIP, not the full projection tree."
211
+ ],
212
+ "ssr": "No SSR-specific surface; no dedicated SSR tests.",
213
+ "verified": "2026-07-21"
214
+ },
215
+ {
216
+ "name": "@octanejs/nuqs",
217
+ "version": "0.1.6",
218
+ "category": "AI, data, and routing",
219
+ "upstream": { "package": "nuqs", "version": "2.9.1" },
220
+ "surface": "Full vendored port: the framework-agnostic core (`parsers`/`parseAs*`/`createParser`, `createSerializer`, `createLoader`, `createStandardSchemaV1`, the throttle/debounce update queues, sync emitter and URL encoding) is vendored verbatim from nuqs 2.9.1; the React layer (`useQueryState`, `useQueryStates`, the `useSyncExternalStores` helper and the adapter context) is ported onto octane's hooks — same `useState`/`useEffect`/`useSyncExternalStore` implementation shape as upstream, so re-render and URL-reconciliation behaviour matches nuqs on React. Adapters ported: `@octanejs/nuqs/adapters/react` (`NuqsAdapter`, `enableHistorySync`), `/adapters/custom` (`unstable_createAdapterProvider`), `/adapters/testing` (`NuqsTestingAdapter`, `withNuqsTestingAdapter`). Server surface (`@octanejs/nuqs/server`) exposes `createLoader`/`createSerializer`/parsers/`createStandardSchemaV1`.",
221
+ "divergences": [
222
+ "Framework adapters that bind other React routers are NOT shipped: `nuqs/adapters/next`, `/adapters/remix`, `/adapters/react-router` and `/adapters/tanstack-router` (they require octane ports of those routers). Use `/adapters/react`, or `/adapters/custom` to wire a router.",
223
+ "`createSearchParamsCache` (from `nuqs/server`) is not ported: it is built on React Server Components' `React.cache()`, which octane does not implement. Use `createLoader` for request-scoped parsing.",
224
+ "`TransitionStartFunction` is declared locally in `defs.ts` rather than imported from `@types/react`, so the package carries no react type dependency.",
225
+ "`NuqsTestingAdapter` resets the shared update queue once per mount (ref-guarded) instead of on every render as upstream does; the reset still runs during the first render (before child hooks read the queue), but a re-render no longer re-aborts in-flight/debounced URL writes."
226
+ ],
227
+ "ssr": "The server entry (`@octanejs/nuqs/server`) is react-free and usable during SSR for parsing/serialising search params; the client hooks read `location.search` through `useSyncExternalStore` with an empty-search server snapshot (upstream parity). No dedicated SSR hydration tests yet.",
228
+ "verified": "2026-07-20"
229
+ },
230
+ {
231
+ "name": "@octanejs/radix",
232
+ "version": "0.1.16",
233
+ "category": "UI and interaction",
234
+ "upstream": { "package": "radix-ui", "version": "1.6.4" },
235
+ "surface": "Complete against the unified `radix-ui@1.6.4` component surface — all primitives (incl. Dialog, the Menu/DropdownMenu/ContextMenu family, Popover, Tooltip, Select, NavigationMenu, Toast, Menubar, Slider, the form controls, and OneTimePasswordField/PasswordToggleField) plus the composition/state/overlay foundations — verified by a differential suite (same fixtures through octane and the real radix-ui, byte-identical DOM).",
236
+ "divergences": [
237
+ "`Slot`/`asChild` compose element descriptors (prop-position JSX, `createElement`, `.map()` returns), not children-position JSX.",
238
+ "`forwardRef` becomes octane's ref-as-prop."
239
+ ],
240
+ "ssr": "SSR/hydration coverage for the overlay/portal components is still open (tracked in the migration plan).",
241
+ "verified": "2026-07-21"
242
+ },
243
+ {
244
+ "name": "@octanejs/recharts",
245
+ "version": "0.1.14",
246
+ "category": "Data-heavy screens",
247
+ "upstream": { "package": "recharts", "version": "3.9.2" },
248
+ "surface": "Partial (phases 0–1 of 5): the static `BarChart`/`LineChart` pipeline end-to-end (`isAnimationActive={false}`), byte-identical to upstream in the differential rig; the Redux/RTK state layer, `Surface`/`Layer`, and the pure shape set are in place.",
249
+ "divergences": [
250
+ "Chart events coordinate through octane's native delegated events rather than React's synthetic layer."
251
+ ],
252
+ "ssr": "Untested; text measurement (`getStringSize`) returns 0×0 under SSR.",
253
+ "verified": "2026-07-07"
254
+ },
255
+ {
256
+ "name": "@octanejs/redux",
257
+ "version": "0.1.14",
258
+ "category": "Shared state",
259
+ "upstream": { "package": "react-redux", "version": "9.3.0" },
260
+ "surface": "The hooks + `Provider` surface of react-redux 9.3.0 (`useSelector`, `useDispatch`, `useStore`, and the custom-context factory variants) on octane's `useSyncExternalStore`; works with any Redux 5 / Redux Toolkit store. Export parity is pinned by test.",
261
+ "divergences": [
262
+ "`connect()` (the legacy HOC surface) intentionally throws — the hooks API is the supported surface.",
263
+ "Error messages are octane-branded."
264
+ ],
265
+ "ssr": "No SSR-specific surface; no dedicated SSR tests.",
266
+ "verified": "2026-07-08"
267
+ },
268
+ {
269
+ "name": "@octanejs/redux-toolkit",
270
+ "version": "0.1.12",
271
+ "category": "Shared state",
272
+ "upstream": { "package": "@reduxjs/toolkit", "version": "2.12.0" },
273
+ "surface": "Complete four-entry-point port: the framework-agnostic Toolkit and RTK Query core are re-exported verbatim; `/query/react` provides generated query, lazy-query, mutation, infinite-query, prefetch hooks and `ApiProvider`; `/react` provides the dynamic-middleware dispatch-hook integration.",
274
+ "divergences": [
275
+ "The compatibility `/react` subpaths and `reactHooksModule` names are retained, but use octane and `@octanejs/redux` internally.",
276
+ "`useDebugValue` is octane's no-op compatibility hook; observable query behavior is unchanged."
277
+ ],
278
+ "ssr": "Preloaded RTK Query state renders through the traditional @octanejs/redux Provider; effects and browser listeners remain client-only. Dedicated SSR and hydration tests are included.",
279
+ "verified": "2026-07-13"
280
+ },
281
+ {
282
+ "name": "@octanejs/remix-router",
283
+ "version": "0.1.13",
284
+ "category": "AI, data, and routing",
285
+ "upstream": { "package": "react-router", "version": "8.2.0" },
286
+ "surface": "COMPLETE port (all phases shipped — full export parity, EXPECTED_MISSING is empty): the framework-agnostic router core (lib/router/* + framework-free helpers, ~12k lines) is vendored byte-close and validated by 161 ported upstream router tests plus four focused v8.2 regression pins; the data-mode React layer (createMemoryRouter, RouterProvider incl. the /dom flushSync variant, Outlet, Await, RenderErrorBoundary/errorElement, Link + useLinkClickHandler, and the full read-hook family) and the declarative layer (MemoryRouter, Routes/Route in BOTH children forms — descriptor children walked upstream-style, .tsrx block children via a registration collector — Navigate, createRoutesFromChildren/Elements, the UNSAFE_With*Props wrappers) and the DOM layer (createBrowserRouter/createHashRouter with __staticRouterHydrationData parsing, BrowserRouter/HashRouter/unstable_HistoryRouter, Link + NavLink incl. the isActive/isPending render props, useLinkClickHandler, useSearchParams) and the mutation layer (Form on octane's native delegated submit event, useSubmit incl. JSON encTypes, useFormAction with ?index resolution, useFetcher/useFetchers incl. fetcher.Form/load/submit/reset and shared keys), the guard/scroll layer (useBlocker, unstable_usePrompt, ScrollRestoration/UNSAFE_useScrollRestoration, useBeforeUnload, useViewTransitionState, unstable_useRoute/unstable_useRouterState), static SSR (StaticRouter, StaticRouterProvider, createStaticHandler/createStaticRouter rendering through octane/server — markup byte-identical to react-dom/server after marker stripping, hydration payload identical), and the vendored cookie/session server runtime (createCookie/createSession/createCookieSessionStorage/createMemorySessionStorage) are transcribed onto octane and differential-verified against real react-router. Framework-mode + RSC names (Meta/Links/Scripts, createRequestHandler, UNSAFE_ internals) exist as THROWING STUBS so parity is honest.",
287
+ "divergences": [
288
+ "Refs are props (octane has no forwardRef) — Link's forwardRef becomes a `ref` prop.",
289
+ "Error-boundary reset on location change / revalidation-idle happens in a layout effect one commit after upstream's render-phase derivation — same observable outcome.",
290
+ "octane's flushSync inside an ambient flush degrades to a plain call drained at that flush's boundary (sync scroll/navigation notifies from within event handlers land at the flush boundary instead of nested) — consumer-invisible, conformance-pinned.",
291
+ "Form's onSubmit is a NATIVE delegated submit listener (octane has no synthetic events): `event.submitter` is read directly off the SubmitEvent where React reads `event.nativeEvent.submitter` — same value, differential-verified.",
292
+ "Block-children `<Routes>` collects `<Route>`s by registration (mount order) instead of upstream's element-children walk (source order) — a conditionally-mounted `<Route>` between static siblings registers after them, which only affects matchRoutes score TIES; conformance-pinned."
293
+ ],
294
+ "ssr": "Shipped: StaticRouter/StaticRouterProvider/createStaticHandler/createStaticRouter render through octane/server (remix-router-ssr vitest project compiles the whole graph in server mode; markup matches react-dom/server byte-for-byte after framework-marker stripping). Block-children <Routes> is CLIENT-only (the registration collector runs in layout effects) — use descriptor children or route objects for SSR.",
295
+ "verified": "2026-07-13"
296
+ },
297
+ {
298
+ "name": "@octanejs/shadcn",
299
+ "version": "0.0.2",
300
+ "category": "UI and interaction",
301
+ "upstream": {
302
+ "package": "shadcn-ui/ui (radix base)",
303
+ "version": "4baadbc6517070ae8f8feb2c97037adc2b305544 + shadcn@4.14.1"
304
+ },
305
+ "surface": "Tiers 1-2 complete plus the first Tier-3 composites — 40 component families (~185 exports). STYLING FLAVOR: the package is mid-migration from the pinned bases/radix semantic-hook (cn-*) system to the default-Tailwind utilities-inlined flavor (user-directed; class strings verbatim from supplied sources or upstream new-york-v4). Migrated: accordion, alert, alert-dialog, avatar, badge, breadcrumb, button, card, checkbox, collapsible, dialog, input, label, progress, radio-group, separator, skeleton, slider, sonner, switch, table, tabs, textarea, toggle, toggle-group. Still cn-*-hooked (style-sheet-dependent): select, scroll-area, sheet, tooltip, popover, hover-card, dropdown-menu, context-menu, menubar, navigation-menu, pagination, sidebar, field, item, empty, native-select, kbd, spinner. Structure/behavior are unchanged by the flavor migration; the shipped registry (packages/shadcn/registry, 47 items) carries the current flavors and the migrated ones install through the upstream shadcn CLI without its cn-* style-transform stripping.",
306
+ "divergences": [
307
+ "No `\"use client\"` directives anywhere: octane has no Server Components, so the RSC axis does not exist here.",
308
+ "Refs are props (octane has no forwardRef) — upstream v4 already dropped forwardRef, so component shapes match.",
309
+ "`asChild` composes element descriptors (createElement) rather than opaque compiled .tsrx children — the documented @octanejs/radix Slot contract. The same rule applies to the exported Portal wrappers (DialogPortal, AlertDialogPortal, DropdownMenuPortal, ContextMenuPortal, MenubarPortal): radix's Portal slots its child, so direct Portal children must be descriptors. The shipped *Content wrappers compose their Portal/Overlay/Content trees with createElement internally, so the ordinary authoring surface is unchanged — consumer children always flow through the props.children channel.",
310
+ "Upstream's IconPlaceholder (the CLI-resolved `iconLibrary` axis) is resolved at port time to the default library, lucide, via @octanejs/lucide (XIcon, CheckIcon, CircleIcon, ChevronDownIcon, ChevronUpIcon, ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon, Loader2Icon); other icon libraries are a registry-emit concern.",
311
+ "Events are native delegated DOM events: per-keystroke text handling on Input/Textarea is `onInput` (native `change` keeps its commit-on-blur meaning), menus open on native pointerdown/contextmenu, and component-level callbacks (`onValueChange`, `onCheckedChange`, `onPressedChange`, `onOpenChange`) are unchanged.",
312
+ "ToggleGroup's variant/size/spacing/orientation inheritance uses octane's createContext/useContext with upstream's defaults and `context.value || ownProp` precedence.",
313
+ "SelectItem text portals into the trigger value node verbatim; multi-line-authored item text keeps its surrounding whitespace where React JSX would trim it (author item labels inline).",
314
+ "Collapsible composes the radix binding's canonical Collapsible.Trigger/Collapsible.Content exports; the upstream CollapsibleTrigger/CollapsibleContent alias names are not exported by @octanejs/radix 0.1.12 (same components, different export alias).",
315
+ "Accordion arrow-key navigation is collection-driven in the radix binding rather than RovingFocusGroup-wrapped; Home/End/Arrow focus movement between triggers is behaviorally equivalent and tested.",
316
+ "FieldError renders falsy error-list entries as null instead of React's skipped false children — identical output.",
317
+ "SidebarTrigger's click handling is the native delegated click event; behavior is otherwise identical to upstream. At this pin SidebarProvider does not mount a TooltipProvider, so consumers using SidebarMenuButton's tooltip prop must provide one (matches upstream).",
318
+ "The packaged theme.css omits the upstream site-only tokens (--surface, --code-*, --selection*) and inlines concrete oklch values for --chart-1..5 (upstream references Tailwind palette variables, which require a Tailwind build this standalone file cannot assume)."
319
+ ],
320
+ "ssr": "Tier 1 is fully server-rendered and tested (17 families through renderToString with no browser globals, including Slot-composed hosts), with hydration adoption pinned for representative shapes (plain host, Button-asChild anchor, nested Table) — zero mismatch, preserved node identity. Tier 2's portal-free components (Checkbox, RadioGroup, Switch, Slider, Tabs, Toggle, ToggleGroup, Accordion, Collapsible, AspectRatio, Progress) are server-rendered and tested. Field is SSR-safe (no portals/browser globals); Sidebar server-renders its static desktop branch (useIsMobile is false on the server; the mobile Sheet branch and tooltip portals are client-only). Portal-backed overlays/menus/Select are excluded until the radix binding supports overlay SSR; ScrollArea awaits verification of its viewport style injection on the server.",
321
+ "verified": "2026-07-25"
322
+ },
323
+ {
324
+ "name": "@octanejs/sonner",
325
+ "version": "0.1.12",
326
+ "category": "UI and interaction",
327
+ "upstream": { "package": "sonner", "version": "2.0.7" },
328
+ "surface": "Complete against the published `sonner@2.0.7` public surface: `Toaster`, the callable `toast` API and all methods, `useSonner`, promise lifecycle, multiple toaster targeting, stacked layout, themes, styling, focus management, timers, and swipe dismissal.",
329
+ "divergences": [
330
+ "Action callbacks receive native DOM `MouseEvent`s rather than React synthetic events.",
331
+ "`Toaster` accepts its ref as a normal prop instead of using `forwardRef`.",
332
+ "The document-visibility hook is guarded during SSR; upstream 2.0.7 reads `document.hidden` during render."
333
+ ],
334
+ "ssr": "Supported and tested: `Toaster` server-renders without browser globals, hydrates by adopting the server host, and can show the first client-created toast without replacing it.",
335
+ "verified": "2026-07-13"
336
+ },
337
+ {
338
+ "name": "@octanejs/styled-components",
339
+ "version": "0.1.9",
340
+ "category": "Styling, tests, and devtools",
341
+ "upstream": { "package": "styled-components", "version": "6.4.3" },
342
+ "surface": "Full v6 web API, ported from the upstream 6.4.3 sources: `styled` with every HTML/SVG tag shortcut, `.attrs`/`.withConfig` chaining, `css`, `keyframes`, `createGlobalStyle`, `createTheme`, `ThemeProvider`/`ThemeContext`/`ThemeConsumer`/`useTheme`/`withTheme`, `StyleSheetManager`/`StyleSheetContext`/`StyleSheetConsumer` (targets, namespaces, vendor prefixing, stylis plugins, `shouldForwardProp`), `ServerStyleSheet`, `isStyledComponent`, `version`, and `__PRIVATE__`. Component selectors, folding (`styled(Styled)`), transient `$` props, `as`/`forwardedAs`, and the grouped CSSOM sheet engine (with upstream `data-styled` rehydration) all behave as upstream. The React Native surface and the RSC-only `stylisPluginRSC` are not ported.",
343
+ "divergences": [
344
+ "`ref` is a plain prop (octane has no `forwardRef`); it always attaches to the rendered element and is never subject to `shouldForwardProp` filtering.",
345
+ "SSR is automatic: server-side inserts flow through octane's css channel, so `renderToString`/streaming return the styles as `<style data-octane=\"sc.<componentId>.<name>\">` chunks in `RenderResult.css` with per-request isolation, and client boot adopts those chunks without duplicate injection. `ServerStyleSheet` ships as a working compat wrapper, but `interleaveWithNodeStream` throws — octane streaming already interleaves styles.",
346
+ "`defaultProps` on a styled component is resolved by the factory at render time (octane call sites do not apply component `defaultProps`); folding via `styled(Styled)` deep-merges as upstream.",
347
+ "Polymorphic `as`/`forwardedAs` typing is pragmatic: component targets infer props from their function signature, host tags use a permissive prop bag (octane has no `JSX.IntrinsicElements` map to introspect).",
348
+ "The babel `css` prop transform is not supported.",
349
+ "The dev-only dynamic-creation warning uses a per-displayName creation-count heuristic instead of upstream's React-dispatcher probe.",
350
+ "Unnamed stylis plugins actually throw the documented error 15 (upstream 6.4.3 constructs the error but forgets to throw it).",
351
+ "Interpolation-position styled components are recognized by an octane brand symbol rather than React's forward-ref `$$typeof` (octane styled components are plain functions)."
352
+ ],
353
+ "ssr": "Supported and tested: zero-config collection into `RenderResult.css` via octane's `injectStyle` channel (styled rules, keyframes, and globals, with content-derived immutable chunk ids that make streaming dedup sound), repeat-render and dynamic-global request isolation through a stateless server output backend, hydration adoption of server chunks (removed after adoption, no duplicate rules), and the `ServerStyleSheet` compat surface.",
354
+ "verified": "2026-07-18"
355
+ },
356
+ {
357
+ "name": "@octanejs/stylex",
358
+ "version": "0.1.16",
359
+ "category": "Styling, tests, and devtools",
360
+ "upstream": { "package": "@stylexjs/stylex", "version": "0.19.0" },
361
+ "surface": "Full compile-time integration: re-exports the StyleX runtime API (`create`, `props`, `attrs`, `keyframes`, `defineVars`, `createTheme`) and registers as an import source; the `/vite` plugin runs the StyleX compiler over octane's compiled output and emits one static atomic stylesheet (`virtual:stylex.css`) with zero StyleX runtime in the bundle.",
362
+ "divergences": [
363
+ "The `sx` JSX prop is not supported — spread `{...stylex.props(...)}` instead.",
364
+ "The compiler runs over octane's compiled output rather than source, so StyleX's own PostCSS source-scanning setup is unused."
365
+ ],
366
+ "ssr": "Works under SSR — the stylesheet is static and server markup carries the final class names; no dedicated SSR test files.",
367
+ "verified": "2026-07-09"
368
+ },
369
+ {
370
+ "name": "@octanejs/tanstack-ai",
371
+ "version": "0.0.11",
372
+ "category": "AI, data, and routing",
373
+ "upstream": { "package": "@tanstack/ai-react", "version": "0.17.0" },
374
+ "surface": "Ports the @tanstack/ai-react 0.17.0 hook surface (useChat, useRealtimeChat, useGeneration, useGenerateImage/Audio/Speech/Video, useTranscription, useSummarize, useAudioRecorder, useMcpAppBridge) while reusing @tanstack/ai 0.41.0 and @tanstack/ai-client 0.21.0 unchanged and mirroring all 30 @tanstack/ai-client convenience re-exports from the upstream index.",
375
+ "divergences": [
376
+ "The `./mcp-apps` subpath and its `MCPAppResource` component are not ported: they render `AppRenderer` from the React-only `@mcp-ui/client`, which has no Octane equivalent. The framework-agnostic `useMcpAppBridge` hook is ported and available on the main entry.",
377
+ "Octane uses native events: text/file/recorder inputs drive updates via `onInput`; there is no synthetic `onChange` layer.",
378
+ "Octane has no StrictMode double-invoke and always provides `useId`, so no random-id fallback is needed.",
379
+ "The TanStack AI Devtools bridge is tagged `framework: 'octane'` (upstream `@tanstack/ai-react` sends `'react'`), so the devtools identify this binding correctly.",
380
+ "Realtime reconnects and token refreshes use the latest `getToken` and adapter supplied to the hook; upstream @tanstack/ai-react 0.17.0 captures the first render's callbacks.",
381
+ "The declared realtime `onStatusChange` callback is invoked alongside the hook's state update; upstream @tanstack/ai-react 0.17.0 currently drops the external callback.",
382
+ "Changing `useChat`'s connection or fetcher updates the active ChatClient in place and preserves conversation state; upstream @tanstack/ai-react 0.17.0 captures the initial transport.",
383
+ "One upstream `useChat` test case (\"auto-resume on mount / when the browser comes back online\") is omitted: it targets `ChatClient.prototype.maybeAutoResume`, an API absent from the pinned (and latest published) `@tanstack/ai-client@0.21.0` and never invoked by `useChat`. It is untestable in this binding until that dependency ships the method."
384
+ ],
385
+ "ssr": "Supported and tested: useChat renders its initial message snapshot through octane/server without a DOM.",
386
+ "verified": "2026-07-16"
387
+ },
388
+ {
389
+ "name": "@octanejs/tanstack-devtools",
390
+ "version": "0.0.11",
391
+ "category": "Styling, tests, and devtools",
392
+ "upstream": { "package": "@tanstack/react-devtools", "version": "0.10.7" },
393
+ "surface": "Ports the @tanstack/react-devtools 0.10.7 public surface (the `TanStackDevtools` component plus its plugin/init types) onto Octane while reusing the framework-agnostic `@tanstack/devtools` 0.12.5 core (`TanStackDevtoolsCore`) unchanged. Plugin, title, and custom-trigger content authored as Octane elements is portaled into the containers the core creates.",
394
+ "divergences": [
395
+ "Public adapter types use Octane-prefixed names: `TanStackDevtoolsOctanePlugin` and `TanStackDevtoolsOctaneInit` (upstream: `TanStackDevtoolsReactPlugin` / `TanStackDevtoolsReactInit`).",
396
+ "`ref` is the normal React-19-style ref prop and events are native (no synthetic layer), consistent with the rest of the Octane bindings.",
397
+ "The main entry also re-exports the framework-agnostic `@tanstack/devtools` core surface (`TanStackDevtoolsCore`, container-id constants, and plugin authoring types) so consumers do not need a direct dependency on `@tanstack/devtools` for typing plugins.",
398
+ "Plugin/title/trigger content is rendered through a tiny `DevtoolsPortal` component (a createPortal VALUE), because Octane renders a returned portal at any position rather than only as a direct JSX child."
399
+ ],
400
+ "ssr": "Supported and tested: the component renders its absolutely-positioned anchor element through octane/server without a DOM; the core is constructed but never mounted server-side (mount is a client-only effect).",
401
+ "verified": "2026-07-17"
402
+ },
403
+ {
404
+ "name": "@octanejs/tanstack-form",
405
+ "version": "0.0.11",
406
+ "category": "Forms and content",
407
+ "upstream": { "package": "@tanstack/react-form", "version": "1.33.2" },
408
+ "surface": "Ports the complete @tanstack/react-form 1.33.2 adapter surface (`useForm`, `useField`, form and field groups, hook contexts and component composition) while re-exporting @tanstack/form-core 1.33.2 unchanged and using @octanejs/tanstack-store for subscriptions.",
409
+ "divergences": [
410
+ "Octane uses native events: text controls call `field.handleChange` from `onInput`; TanStack Form's `onChange` validator and listener option names remain unchanged.",
411
+ "Octane has no StrictMode double-invoke and always provides `useId`, so the adapter omits StrictMode scenarios and the legacy random-UUID fallback.",
412
+ "Component registration accepts Octane function components; class components are not supported by Octane."
413
+ ],
414
+ "ssr": "Supported and tested: fields and form subscriptions render their initial snapshots through octane/server without a DOM.",
415
+ "verified": "2026-07-15"
416
+ },
417
+ {
418
+ "name": "@octanejs/tanstack-hotkeys",
419
+ "version": "0.0.6",
420
+ "category": "UI and interaction",
421
+ "upstream": { "package": "@tanstack/react-hotkeys", "version": "0.10.0" },
422
+ "surface": "Complete: the full upstream hook surface (`useHotkey`, `useHotkeys`, `useHeldKeys`, `useHeldKeyCodes`, `useKeyHold`, `useHotkeySequence`, `useHotkeySequences`, `useHotkeyRecorder`, `useHotkeySequenceRecorder`, `useHotkeyRegistrations`) plus `HotkeysProvider`/`useHotkeysContext`/`useDefaultHotkeysOptions`, re-exporting the framework-agnostic `@tanstack/hotkeys@0.8.0` core unchanged; store subscriptions go through `@octanejs/tanstack-store`.",
423
+ "divergences": [
424
+ "`target` refs are plain `{ current }` objects (Octane has no `React.RefObject`); the `isRef` guard and behavior are otherwise identical."
425
+ ],
426
+ "ssr": "Supported: every hook registers listeners in effects and resolves `document` lazily, so server rendering produces no registrations and no browser access (matching upstream's `typeof document` guards).",
427
+ "verified": "2026-07-20"
428
+ },
429
+ {
430
+ "name": "@octanejs/tanstack-pacer",
431
+ "version": "0.0.6",
432
+ "category": "UI and interaction",
433
+ "upstream": { "package": "@tanstack/react-pacer", "version": "0.22.1" },
434
+ "surface": "Complete: every upstream hook family — debouncer (`useDebouncer`, `useDebouncedState`, `useDebouncedValue`, `useDebouncedCallback`), throttler, rate-limiter, queuer, batcher, and their async variants (async-debouncer, async-throttler, async-rate-limiter, async-queuer, async-batcher) — plus `PacerProvider`/`usePacerContext`/`useDefaultPacerOptions`, the per-instance `Subscribe` render-prop component, and the upstream subpath exports (`/debouncer`, `/async-retryer`, `/types`, `/utils`, ...), re-exporting the framework-agnostic `@tanstack/pacer@0.21.1` core unchanged.",
435
+ "divergences": [
436
+ "Upstream types spelled with `React.Dispatch<React.SetStateAction<T>>` use structurally identical local aliases (Octane state setters have the same shape)."
437
+ ],
438
+ "ssr": "Supported: instances are created lazily in `useState` initializers, cleanup runs in effects, and no browser globals are touched during render, so server rendering produces the initial (non-pending) state exactly like upstream.",
439
+ "verified": "2026-07-20"
440
+ },
441
+ {
442
+ "name": "@octanejs/tanstack-query",
443
+ "version": "0.1.16",
444
+ "category": "AI, data, and routing",
445
+ "upstream": { "package": "@tanstack/react-query", "version": "5.101.3" },
446
+ "surface": "Complete: 58/58 runtime exports plus the full TypeScript surface; the export surface is byte-identical to upstream in both directions (locked by test), and `@tanstack/query-core` is re-exported verbatim.",
447
+ "divergences": [
448
+ "Suspense integrates via octane's `use(thenable)` rather than throwing a promise (observable behavior matches)."
449
+ ],
450
+ "ssr": "`HydrationBoundary` fully ported (incl. streaming `promise`/`dehydratedAt` re-hydration); the SSR/streaming server entries and server-render tests are still open.",
451
+ "verified": "2026-07-21"
452
+ },
453
+ {
454
+ "name": "@octanejs/tanstack-router",
455
+ "version": "0.1.16",
456
+ "category": "AI, data, and routing",
457
+ "upstream": { "package": "@tanstack/react-router", "version": "1.170.18" },
458
+ "surface": "Octane's TanStack Router binding: typed route factories and hooks, the full Match pipeline and lifecycle, file routes with TSRX-aware generator integration, full Link navigation/preloading/masking behavior, blocking, Await/deferred hydration, scroll restoration, lazy routes, not-found handling, document/head assets, and client/server SSR entries.",
459
+ "divergences": [
460
+ "Refs are props — `createLink`'s `forwardRef` becomes a `ref` prop.",
461
+ "Link callbacks receive native DOM events rather than React synthetic events.",
462
+ "Router devtools are distributed separately."
463
+ ],
464
+ "ssr": "Full-document buffered and readable-stream SSR through `./ssr/server`, client hydration through `./ssr/client`, route-owned head/scripts, CSP nonce propagation, per-route SSR modes, and native Octane stream injection; covered by retained upstream conformance tests.",
465
+ "verified": "2026-07-21"
466
+ },
467
+ {
468
+ "name": "@octanejs/tanstack-router-ssr-query",
469
+ "version": "0.0.6",
470
+ "category": "AI, data, and routing",
471
+ "upstream": { "package": "@tanstack/react-router-ssr-query", "version": "1.167.1" },
472
+ "surface": "Complete: `setupRouterSsrQueryIntegration` (the package's only export) delegating to `@tanstack/router-ssr-query-core@1.169.1`, with the QueryClientProvider Wrap composition on Octane.",
473
+ "divergences": [],
474
+ "ssr": "Supported — this package IS the SSR integration (dehydrates query state into the router stream and wraps the app in the query provider).",
475
+ "verified": "2026-07-20"
476
+ },
477
+ {
478
+ "name": "@octanejs/tanstack-store",
479
+ "version": "0.0.11",
480
+ "category": "Shared state",
481
+ "upstream": { "package": "@tanstack/react-store", "version": "0.11.0" },
482
+ "surface": "Re-exports `@tanstack/store@0.11.0` unchanged and implements the stable React binding surface (`useSelector`, `useAtom`, `useCreateAtom`, `useCreateStore`, `createStoreContext`, and deprecated `useStore`) on Octane hooks.",
483
+ "divergences": [
484
+ "The upstream experimental `_useStore` hook is intentionally omitted; use `useSelector` with `store.actions` or `store.setState` instead."
485
+ ],
486
+ "ssr": "Supported: selectors, writable atoms, and store context read their current snapshots during server rendering; the adapter has no browser-only initialization.",
487
+ "verified": "2026-07-15"
488
+ },
489
+ {
490
+ "name": "@octanejs/tanstack-table",
491
+ "version": "0.1.14",
492
+ "category": "Data-heavy screens",
493
+ "upstream": { "package": "@tanstack/react-table", "version": "9.0.0-beta.58" },
494
+ "surface": "Complete port of the v9 adapter: the framework-agnostic `@tanstack/table-core` (constructTable + every tree-shakeable feature and row model) is reused verbatim, and the adapter — `useTable`, `Subscribe`, `flexRender`/`FlexRender`, `createTableHook`, `createTableHookContexts` — is transcribed onto octane hooks. Table state lives in TanStack Store atoms via the `coreReactivityFeature` bindings, and `useSelector` drives re-renders from the selected slice. Every store primitive (hooks, `createAtom`, `batch`, `shallow`, and the atom/store types) is imported from @octanejs/tanstack-store, which re-exports all of @tanstack/store — the binding takes no direct dependency on the store core, so there is only one path to it and atom identity cannot be split across duplicate copies.",
495
+ "divergences": [
496
+ "`flexRender`'s class-component and `react.memo`/`forwardRef` exotic-component branches are dropped — octane has no class components or forwardRef, and octane's `memo()` returns a plain function, so `typeof === 'function'` covers every component.",
497
+ "Upstream's `useLegacyTable` entry (the v8-compat `get*RowModel` shim, its marker factories, and the `Legacy*` type aliases) is NOT ported. It exists to migrate existing React v8 codebases; octane has none, so octane code targets the v9 `useTable` API directly."
498
+ ],
499
+ "ssr": "No SSR-specific surface; table-core is pure computation.",
500
+ "verified": "2026-07-26"
501
+ },
502
+ {
503
+ "name": "@octanejs/tanstack-virtual",
504
+ "version": "0.1.14",
505
+ "category": "Data-heavy screens",
506
+ "upstream": { "package": "@tanstack/react-virtual", "version": "3.14.5" },
507
+ "surface": "Complete 1:1 port: the framework-agnostic `@tanstack/virtual-core` (Virtualizer + observers + windowing math) is reused verbatim; the React adapter (`useVirtualizer`, `useWindowVirtualizer`, incl. `useFlushSync` and the experimental `directDomUpdates` surface) is transcribed onto octane hooks, preserving upstream's force-update + flushSync-on-sync-scroll wiring and layout-effect lifecycle.",
508
+ "divergences": [
509
+ "octane's `flushSync` called while a flush is already on the stack degrades to a plain call drained by the ambient flush (re-entrancy guard) — sync scroll notifies dispatched from inside a discrete-event flush land at that flush's boundary instead of nested; consumer-invisible, pinned by a conformance test."
510
+ ],
511
+ "ssr": "SSR-safe: `useIsomorphicLayoutEffect` degrades to `useEffect` without `document`; the first paint windows from `initialRect`/`initialOffset` exactly as upstream. No dedicated SSR tests.",
512
+ "verified": "2026-07-12"
513
+ },
514
+ {
515
+ "name": "@octanejs/tauri",
516
+ "version": "0.0.0",
517
+ "category": "Desktop",
518
+ "upstream": { "package": "@tauri-apps/api", "version": "2.11.1" },
519
+ "surface": "Octane hooks over the framework-neutral Tauri IPC surface: useInvoke (suspending command), useInvokeState (pending/success/error with refetch), and useTauriEvent (event subscription with lifecycle-safe teardown). The rest of @tauri-apps/api — window, webview, menu, tray, path, dpi, image, and the plugin packages — is already framework-neutral and is imported directly rather than re-exported here.",
520
+ "divergences": [
521
+ "There is no React binding upstream; @tauri-apps/api ships promise and callback APIs, so this package is a new hook layer rather than a port.",
522
+ "Hook call-site slots are forwarded through Octane's compiler binding ABI.",
523
+ "useInvoke integrates with Octane's use() rather than React's use() or a thrown-promise implementation detail.",
524
+ "Command arguments given as a plain record are compared by value for the default refetch key; array and binary payloads are compared by identity. The command name is always part of the key, so explicit deps extend it rather than replacing it.",
525
+ "useInvokeState returns to pending on refetch and does not implement stale-while-revalidate; a caching query layer belongs to @octanejs/tanstack-query.",
526
+ "A failed useTauriEvent subscription throws by default so a missing capability is loud, and is then recovered by the enclosing boundary's reset(); passing onError reports it instead, keeping the component mounted so a changed event or enabled flag retries.",
527
+ "Channel-based streaming has no hook yet: construct Channel directly and keep it stable with useMemo."
528
+ ],
529
+ "ssr": "Server rendering performs no IPC. useInvokeState renders its pending state and issues the command on the client after hydration; useTauriEvent subscribes only on the client. useInvoke is client-oriented: without a Tauri host it rejects with TauriUnavailableError so the boundary reports rather than hangs.",
530
+ "verified": "2026-07-27"
531
+ },
532
+ {
533
+ "name": "@octanejs/testing-library",
534
+ "version": "0.1.14",
535
+ "category": "Styling, tests, and devtools",
536
+ "upstream": { "package": "@testing-library/react", "version": "unpinned" },
537
+ "surface": "`render`/`rerender`/`cleanup`/`renderHook` + `act` over the verbatim `@testing-library/dom` (every query, `screen`, `within`, `waitFor`, `fireEvent`, `prettyDOM`, `configure`), with commit timing wired to octane's scheduler via the dom-library's `eventWrapper`/`asyncWrapper` config.",
538
+ "divergences": [
539
+ "`fireEvent` dispatches real native events — no React remappings (`fireEvent.change` fires an explicit native `change`, not text typing or checkbox click activation) and no enter/leave/focus double-dispatch.",
540
+ "Not ported: the `ReactStrictMode` wrapper, `legacyRoot`, and the `onCaughtError`/`onRecoverableError` options."
541
+ ],
542
+ "ssr": "`hydrate: true` adopts octane SSR output via `hydrateRoot`.",
543
+ "verified": "2026-07-17"
544
+ },
545
+ {
546
+ "name": "@octanejs/three",
547
+ "version": "0.1.10",
548
+ "category": "Web 3D",
549
+ "upstream": { "package": "@react-three/fiber", "version": "9.6.1 (2a528745)" },
550
+ "surface": "Technical-preview Milestones 0–10 surface: renderer configuration and the DOM Canvas boundary, compiler ABI and renderer-local Three intrinsic types, catalogue and both extend forms, primitive/args construction, Three prop application, attachment, ordered placement/recreation, retained visibility, lifecycle/ref delivery, ownership-aware disposal, promise-returning HTMLCanvasElement and OffscreenCanvas roots, Octane act/flushSync scheduling, callback-aware unmountComponentAtNode, callable root state, scene/camera/raycaster and resize/DPR/viewport configuration, shadows/colors, one shared frame loop, controlled WebXR loop handoff, context-restore invalidation, compatible/reconstructing HMR, global effects, useStore/useThree/useFrame/useGraph and managed-instance helpers, the ray/pointer event system with DOM sources and custom managers, a keyed useLoader cache with preload/clear and GLTF graph augmentation, retained Suspense/Activity behavior, client Three-to-DOM pending/error projection, same-renderer createPortal targets with state/event enclaves and physical Three event bubbling, client-only Canvas shell streaming and production Vite/Rsbuild hydration adoption with the matching raw Rspack graph split, the explicit-target low-level DOMRegion boundary, a deterministic testing harness, an asynchronously acknowledged structured-clone transport proof, a checked public API/subpath matrix, Three r156/current compatibility lanes, a packed external consumer, real WebGL failure/recovery coverage, and semantic-checksummed renderer and shipped-size benchmarks.",
551
+ "divergences": [
552
+ "Octane owns component execution, hooks, context, scheduling, Suspense, refs, and effects instead of embedding React Reconciler.",
553
+ "The programmatic root renders an Octane component plus props rather than a React element descriptor.",
554
+ "The upstream callable store selector remains order-based because dynamic function calls cannot receive compiler slots; compiler-visible useStore(selector) and useThree(selector) preserve Octane's conditional-hook semantics.",
555
+ "buildGraph omits unnamed mesh and material entries, plus array-valued material entries, instead of publishing empty or undefined keys.",
556
+ "Removing a pierced prop resets its original nested target; R3F 9.6.1 mistakenly writes that default to the leaf key on the root object.",
557
+ "Reconstructing a captured or hovered object rewrites nested stored intersections to the replacement; R3F 9.6.1 updates only the outer hover identity and capture-map key, which leaves captured delivery pointing at the retired object.",
558
+ "Hidden retained Activity subtrees are excluded from recursive raycasts; Three r172 ignores Object3D.visible during raycasting, so R3F 9.6.1 can otherwise pierce a hidden descendant through an interactive visible ancestor.",
559
+ "Managed and externally leased portal targets are root-scoped and cross-root portal placement is rejected before mutation; this makes the universal target-handle lifetime explicit.",
560
+ "Root teardown and unmountComponentAtNode callback delivery are synchronous; R3F 9.6.1 defers its registry teardown and callback by 500 milliseconds.",
561
+ "DOMRegion is an Octane-specific explicit-target Three-to-DOM primitive, not R3F or Drei Html and not the WebXR DOM Overlay API; it intentionally defines no positioning, occlusion, styling, or layout contract."
562
+ ],
563
+ "ssr": "Three scene modules are client-only and Canvas.children is omitted from the server graph. Canvas streams its DOM shell and native fallback, then production Vite and Rsbuild hydration adopt those nodes and create one Three root on the client; raw Rspack proves the equivalent client/server graph split without claiming an application SSR lifecycle. DOMRegion and its reverse-DOM content remain inside the omitted client-only Three scene.",
564
+ "verified": "2026-07-17"
565
+ },
566
+ {
567
+ "name": "@octanejs/tiptap",
568
+ "version": "0.0.11",
569
+ "category": "Forms and content",
570
+ "upstream": { "package": "@tiptap/react", "version": "3.28.0" },
571
+ "surface": "Complete @tiptap/react 3.28.0 adapter surface across the root and ./menus entries: @tiptap/core re-exports, editor hooks and contexts, the EditorContent portal bridge, compound Tiptap API, ReactRenderer, custom NodeView/MarkView renderers and helpers, BubbleMenu, and FloatingMenu.",
572
+ "divergences": [
573
+ "Subscriptions use Octane's native useSyncExternalStore implementation, so the published binding does not depend on React or use-sync-external-store.",
574
+ "EditorConsumer is a render-prop compatibility component because Octane contexts do not expose React's .Consumer property.",
575
+ "Renderer components are Octane component bodies and refs are ordinary props; the React-prefixed public names are retained for TipTap source compatibility without a React dependency.",
576
+ "NodeViewWrapper consumes its as prop after selecting the host tag; @tiptap/react 3.28.0 also forwards that prop as an invalid DOM attribute.",
577
+ "BubbleMenu and FloatingMenu handlers receive native browser events rather than React synthetic events.",
578
+ "ReactMarkView tears down its portal when ProseMirror destroys the mark view, closing a renderer leak present in @tiptap/react 3.28.0."
579
+ ],
580
+ "ssr": "Covered across the complete surface: hooks use null server snapshots and suppress editor construction without a DOM, static NodeView/MarkView helpers render without a DOM renderer, detached menu targets are client-only, and hydration adopts deferred server shells before mounting live custom views and menus.",
581
+ "verified": "2026-07-17"
582
+ },
583
+ {
584
+ "name": "@octanejs/valtio",
585
+ "version": "0.1.0",
586
+ "category": "Shared state",
587
+ "upstream": { "package": "valtio", "version": "2.3.2" },
588
+ "surface": "The framework-agnostic `valtio/vanilla` core and `valtio/vanilla/utils` are re-exported verbatim; `useSnapshot` and the `useProxy` utility are ported to Octane.",
589
+ "divergences": [
590
+ "React DevTools affected-path debug labels are omitted because Octane's `useDebugValue` is currently a no-op."
591
+ ],
592
+ "ssr": "The server snapshot path uses `snapshot(proxyObject)`; no dedicated SSR rendering test is included yet.",
593
+ "verified": "2026-07-27"
594
+ },
595
+ {
596
+ "name": "@octanejs/visx",
597
+ "version": "0.1.11",
598
+ "category": "Data-heavy screens",
599
+ "upstream": { "package": "@visx/visx", "version": "4.0.0 + master@485c035" },
600
+ "surface": "Complete current Visx 4.x web runtime surface: the exact 35-namespace aggregate, all 40 feature entry points, and the eight public a11y/react, a11y/server, axis/react, scale/react, shape/react, theme/react, tooltip/floating, and voronoi/react subpaths. Released-only packages chord, delaunay, react-spring, sankey, and stats remain directly importable exactly as upstream specifies.",
601
+ "divergences": [
602
+ "Interaction callbacks receive native DOM events through Octane's delegated event system instead of React synthetic events.",
603
+ "All React class controllers and class-instance refs are replaced by native functional TSRX hooks; Brush intentionally omits upstream's legacy innerRef instance handle.",
604
+ "Deterministic text metrics and annotation bounds, pure SplitLinePath SVG sampling, and collision-aware estimated wordcloud rectangles replace browser-only measurement/canvas paths so fixed-size output is identical during SSR and first hydration. Font-specific wrapping, browser-specific path length rounding, and pixel-exact d3-cloud packing can differ.",
605
+ "The react-spring entry point uses a deterministic requestAnimationFrame numeric interpolator rather than spring-physics timing, and Zoom uses native wheel/pointer/touch listeners rather than @use-gesture/react at runtime. Their public Visx props and exports are retained; Zoom imports framework-neutral @use-gesture/core types only.",
606
+ "Props upstream types as React.ReactNode are octane renderables (octane's OctaneNode = unknown): octane elements are nominal, so ReactNode-typed props would reject them. Render-prop signatures keep their parameters and return octane renderables."
607
+ ],
608
+ "ssr": "Fixed-dimension primitives, wrapped XYChart series, annotations, text, and wordclouds emit complete deterministic SVG on the server. Real hydrateRoot adoption preserves the same SVG/definition/axis/text/series/annotation/wordcloud nodes without warnings, replacement, or post-effect markup changes; generated IDs, measurement fallbacks, portals, and responsive initial sizes are covered.",
609
+ "verified": "2026-07-14"
610
+ },
611
+ {
612
+ "name": "@octanejs/zustand",
613
+ "version": "0.1.16",
614
+ "category": "Shared state",
615
+ "upstream": { "package": "zustand", "version": "5.0.14" },
616
+ "surface": "Complete 1:1 port: the framework-agnostic vanilla store is reused verbatim; `create`/`useStore`, `shallow`/`useShallow`, the traditional equality-fn variants, and all middleware (persist, devtools, subscribeWithSelector, combine, redux).",
617
+ "divergences": [
618
+ "Unstable selectors (a new reference every render) settle after a bounded number of re-renders instead of hitting React's `useSyncExternalStore` warning loop — still prefer `useShallow`."
619
+ ],
620
+ "ssr": "No SSR-specific surface; no dedicated SSR tests.",
621
+ "verified": "2026-07-20"
622
+ }
623
+ ],
624
+ "reactPackages": {
625
+ "@apollo/client": "@octanejs/apollo-client",
626
+ "@base-ui-components/react": "@octanejs/base-ui",
627
+ "@dnd-kit/react": "@octanejs/dnd-kit",
628
+ "@floating-ui/react": "@octanejs/floating-ui",
629
+ "@lexical/react": "@octanejs/lexical",
630
+ "@mdx-js/react": "@octanejs/mdx",
631
+ "@react-three/fiber": "@octanejs/three",
632
+ "@reduxjs/toolkit": "@octanejs/redux-toolkit",
633
+ "@stylexjs/stylex": "@octanejs/stylex",
634
+ "@tanstack/ai-react": "@octanejs/tanstack-ai",
635
+ "@tanstack/react-devtools": "@octanejs/tanstack-devtools",
636
+ "@tanstack/react-form": "@octanejs/tanstack-form",
637
+ "@tanstack/react-hotkeys": "@octanejs/tanstack-hotkeys",
638
+ "@tanstack/react-pacer": "@octanejs/tanstack-pacer",
639
+ "@tanstack/react-query": "@octanejs/tanstack-query",
640
+ "@tanstack/react-router": "@octanejs/tanstack-router",
641
+ "@tanstack/react-router-ssr-query": "@octanejs/tanstack-router-ssr-query",
642
+ "@tanstack/react-store": "@octanejs/tanstack-store",
643
+ "@tanstack/react-table": "@octanejs/tanstack-table",
644
+ "@tanstack/react-virtual": "@octanejs/tanstack-virtual",
645
+ "@testing-library/react": "@octanejs/testing-library",
646
+ "@tiptap/react": "@octanejs/tiptap",
647
+ "@visx/a11y": "@octanejs/visx",
648
+ "@visx/a11y/react": "@octanejs/visx",
649
+ "@visx/a11y/server": "@octanejs/visx",
650
+ "@visx/annotation": "@octanejs/visx",
651
+ "@visx/axis": "@octanejs/visx",
652
+ "@visx/axis/react": "@octanejs/visx",
653
+ "@visx/bounds": "@octanejs/visx",
654
+ "@visx/brush": "@octanejs/visx",
655
+ "@visx/chart": "@octanejs/visx",
656
+ "@visx/chord": "@octanejs/visx",
657
+ "@visx/clip-path": "@octanejs/visx",
658
+ "@visx/curve": "@octanejs/visx",
659
+ "@visx/delaunay": "@octanejs/visx",
660
+ "@visx/drag": "@octanejs/visx",
661
+ "@visx/event": "@octanejs/visx",
662
+ "@visx/geo": "@octanejs/visx",
663
+ "@visx/glyph": "@octanejs/visx",
664
+ "@visx/gradient": "@octanejs/visx",
665
+ "@visx/grid": "@octanejs/visx",
666
+ "@visx/group": "@octanejs/visx",
667
+ "@visx/heatmap": "@octanejs/visx",
668
+ "@visx/hierarchy": "@octanejs/visx",
669
+ "@visx/kernel": "@octanejs/visx",
670
+ "@visx/legend": "@octanejs/visx",
671
+ "@visx/marker": "@octanejs/visx",
672
+ "@visx/mock-data": "@octanejs/visx",
673
+ "@visx/network": "@octanejs/visx",
674
+ "@visx/pattern": "@octanejs/visx",
675
+ "@visx/point": "@octanejs/visx",
676
+ "@visx/react-spring": "@octanejs/visx",
677
+ "@visx/responsive": "@octanejs/visx",
678
+ "@visx/sankey": "@octanejs/visx",
679
+ "@visx/scale": "@octanejs/visx",
680
+ "@visx/scale/react": "@octanejs/visx",
681
+ "@visx/shape": "@octanejs/visx",
682
+ "@visx/shape/react": "@octanejs/visx",
683
+ "@visx/stats": "@octanejs/visx",
684
+ "@visx/text": "@octanejs/visx",
685
+ "@visx/theme": "@octanejs/visx",
686
+ "@visx/theme/react": "@octanejs/visx",
687
+ "@visx/threshold": "@octanejs/visx",
688
+ "@visx/tooltip": "@octanejs/visx",
689
+ "@visx/tooltip/floating": "@octanejs/visx",
690
+ "@visx/visx": "@octanejs/visx",
691
+ "@visx/voronoi": "@octanejs/visx",
692
+ "@visx/voronoi/react": "@octanejs/visx",
693
+ "@visx/wordcloud": "@octanejs/visx",
694
+ "@visx/xychart": "@octanejs/visx",
695
+ "@visx/zoom": "@octanejs/visx",
696
+ "cmdk": "@octanejs/cmdk",
697
+ "dexie-react-hooks": "@octanejs/dexie",
698
+ "framer-motion": "@octanejs/motion",
699
+ "jotai": "@octanejs/jotai",
700
+ "lucide-react": "@octanejs/lucide",
701
+ "motion": "@octanejs/motion",
702
+ "nuqs": "@octanejs/nuqs",
703
+ "radix-ui": "@octanejs/radix",
704
+ "react-aria": "@octanejs/aria",
705
+ "react-aria-components": "@octanejs/aria",
706
+ "react-hook-form": "@octanejs/hook-form",
707
+ "react-i18next": "@octanejs/i18next",
708
+ "react-redux": "@octanejs/redux",
709
+ "react-router": "@octanejs/remix-router",
710
+ "react-router-dom": "@octanejs/remix-router",
711
+ "react-stately": "@octanejs/aria",
712
+ "recharts": "@octanejs/recharts",
713
+ "shadcn": "@octanejs/shadcn",
714
+ "sonner": "@octanejs/sonner",
715
+ "styled-components": "@octanejs/styled-components",
716
+ "valtio": "@octanejs/valtio",
717
+ "zustand": "@octanejs/zustand"
718
+ },
719
+ "errorCodes": {
720
+ "1": {
721
+ "message": "Maximum update depth exceeded. Octane limits the number of nested updates to prevent infinite loops.",
722
+ "runtime": ["client"],
723
+ "status": "active"
724
+ },
725
+ "2": {
726
+ "message": "Children.only expected to receive a single element child.",
727
+ "runtime": ["client", "server"],
728
+ "status": "active"
729
+ },
730
+ "3": {
731
+ "message": "Objects are not valid as an Octane child (found: %s). If you meant to render a collection of children, use an array instead.",
732
+ "runtime": ["client", "server"],
733
+ "status": "active"
734
+ },
735
+ "4": {
736
+ "message": "cloneElement: the first argument must be an element (from createElement / JSX).",
737
+ "runtime": ["client", "server"],
738
+ "status": "active"
739
+ },
740
+ "5": {
741
+ "message": "Can only set one of `children` or `props.dangerouslySetInnerHTML`.",
742
+ "runtime": ["client", "server"],
743
+ "status": "active"
744
+ },
745
+ "6": {
746
+ "message": "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`",
747
+ "runtime": ["client", "server"],
748
+ "status": "active"
749
+ },
750
+ "7": {
751
+ "message": "`%s` is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.",
752
+ "runtime": ["client", "server"],
753
+ "status": "active"
754
+ },
755
+ "8": {
756
+ "message": "`<%s>` is a void element tag and must neither have children nor use `dangerouslySetInnerHTML`.",
757
+ "runtime": ["client", "server"],
758
+ "status": "active"
759
+ },
760
+ "9": {
761
+ "message": "Too many re-renders. Octane limits the number of renders to prevent an infinite loop.",
762
+ "runtime": ["client", "server"],
763
+ "status": "active"
764
+ },
765
+ "10": {
766
+ "message": "lazy: expected the load() promise to resolve to a component function or a module with a component as its default export, got '%s'",
767
+ "runtime": ["client", "server"],
768
+ "status": "active"
769
+ },
770
+ "11": {
771
+ "message": "A function wrapped in useEffectEvent can't be called during rendering.",
772
+ "runtime": ["client", "server"],
773
+ "status": "active"
774
+ },
775
+ "12": {
776
+ "message": "%s(): argument is not a Context nor a thenable",
777
+ "runtime": ["client", "server"],
778
+ "status": "active"
779
+ },
780
+ "13": {
781
+ "message": "Multiple errors were thrown during the render flush.",
782
+ "runtime": ["client"],
783
+ "status": "active"
784
+ },
785
+ "14": {
786
+ "message": "act(): scheduler did not stabilize after %s iterations — likely an infinite render loop",
787
+ "runtime": ["client"],
788
+ "status": "active"
789
+ },
790
+ "15": {
791
+ "message": "%s was called without a hook slot. The octane compiler injects per-call-site keys; ensure your project loads this runtime through the Vite plugin (octane/compiler/vite). To call hooks by hand, pass a stable symbol, e.g. useState(0, Symbol.for('my-stable-id')).",
792
+ "runtime": ["client"],
793
+ "status": "active"
794
+ },
795
+ "16": {
796
+ "message": "Hydrate: `when` must synchronously return a hydration strategy with a valid type.",
797
+ "runtime": ["client"],
798
+ "status": "active"
799
+ },
800
+ "17": {
801
+ "message": "Hydrate: the compiler-generated child loader did not resolve to a component.",
802
+ "runtime": ["client"],
803
+ "status": "active"
804
+ },
805
+ "18": {
806
+ "message": "%s(): a React context can only be read inside a React-hosted Octane island (see octane/react); this component is not rendered under one.",
807
+ "runtime": ["client"],
808
+ "status": "active"
809
+ },
810
+ "19": {
811
+ "message": "A renderer-owned DOM region is missing its universal owner bridge.",
812
+ "runtime": ["client"],
813
+ "status": "active"
814
+ },
815
+ "20": {
816
+ "message": "bindRendererRegionOwner() must run while a DOM component is rendering.",
817
+ "runtime": ["client"],
818
+ "status": "active"
819
+ },
820
+ "21": {
821
+ "message": "bindRendererRegionOwner() must be the first call in a renderer-owned DOM root component.",
822
+ "runtime": ["client"],
823
+ "status": "active"
824
+ },
825
+ "22": {
826
+ "message": "A renderer-owned DOM region requires a live DOM root.",
827
+ "runtime": ["client"],
828
+ "status": "active"
829
+ },
830
+ "23": {
831
+ "message": "Server-rendered use() rejected",
832
+ "runtime": ["client", "server"],
833
+ "status": "active"
834
+ },
835
+ "24": {
836
+ "message": "Element type is invalid: expected a string (for a built-in element) or a function (for a component), but got: %s.",
837
+ "runtime": ["client"],
838
+ "status": "active"
839
+ },
840
+ "25": {
841
+ "message": "Octane: internal — a component descriptor reached the de-opt host reconciler (should have been routed through a Block via hostElementBody/componentSlot).",
842
+ "runtime": ["client"],
843
+ "status": "active"
844
+ },
845
+ "26": {
846
+ "message": "`<%s>` is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.",
847
+ "runtime": ["client"],
848
+ "status": "active"
849
+ },
850
+ "27": {
851
+ "message": "A hosted foreign-context request escaped its renderer-region owner; the owning bridge is gone or declined it.",
852
+ "runtime": ["client"],
853
+ "status": "active"
854
+ },
855
+ "28": {
856
+ "message": "Target container is not a DOM element.",
857
+ "runtime": ["client"],
858
+ "status": "active"
859
+ },
860
+ "29": {
861
+ "message": "Cannot update an unmounted root.",
862
+ "runtime": ["client"],
863
+ "status": "active"
864
+ },
865
+ "30": { "message": "Invalid tag: %s", "runtime": ["server"], "status": "active" },
866
+ "31": {
867
+ "message": "If you supply `defaultValue` on a <textarea>, do not pass children.",
868
+ "runtime": ["server"],
869
+ "status": "active"
870
+ },
871
+ "32": {
872
+ "message": "octane SSR: a use(thenable) did not settle within %sms.",
873
+ "runtime": ["server"],
874
+ "status": "active"
875
+ },
876
+ "33": {
877
+ "message": "octane SSR: exceeded %s suspense passes — a use(thenable) never resolved.",
878
+ "runtime": ["server"],
879
+ "status": "retired"
880
+ },
881
+ "34": {
882
+ "message": "octane SSR: a root suspension no longer has resumable work.",
883
+ "runtime": ["server"],
884
+ "status": "active"
885
+ },
886
+ "35": {
887
+ "message": "octane SSR: %s root streaming passes completed without producing a shell.",
888
+ "runtime": ["server"],
889
+ "status": "active"
890
+ },
891
+ "36": {
892
+ "message": "octane SSR: a pending streamed boundary no longer has resumable work; its error escaped to an ancestor that was already flushed.",
893
+ "runtime": ["server"],
894
+ "status": "active"
895
+ },
896
+ "37": {
897
+ "message": "octane SSR: %s consecutive streaming passes completed no boundary — a use(thenable) never resolved.",
898
+ "runtime": ["server"],
899
+ "status": "retired"
900
+ },
901
+ "38": {
902
+ "message": "The stream destination closed.",
903
+ "runtime": ["server"],
904
+ "status": "active"
905
+ },
906
+ "39": {
907
+ "message": "octane SSR: destination.write() returned false but the destination cannot emit drain.",
908
+ "runtime": ["server"],
909
+ "status": "active"
910
+ },
911
+ "40": {
912
+ "message": "The stream destination is closed.",
913
+ "runtime": ["server"],
914
+ "status": "active"
915
+ },
916
+ "41": {
917
+ "message": "octane SSR: pipe() may only be called once.",
918
+ "runtime": ["server"],
919
+ "status": "active"
920
+ },
921
+ "42": { "message": "The render was aborted.", "runtime": ["server"], "status": "active" },
922
+ "43": {
923
+ "message": "The stream consumer cancelled.",
924
+ "runtime": ["server"],
925
+ "status": "active"
926
+ },
927
+ "44": {
928
+ "message": "The readable stream is closed.",
929
+ "runtime": ["server"],
930
+ "status": "active"
931
+ },
932
+ "45": {
933
+ "message": "Server-rendered use() rejected (function)",
934
+ "runtime": ["server"],
935
+ "status": "active"
936
+ },
937
+ "46": {
938
+ "message": "Expected %s listener to be a function, instead got a value of `%s` type.",
939
+ "runtime": ["client"],
940
+ "status": "active"
941
+ },
942
+ "47": {
943
+ "message": "octane SSR: exceeded %s suspense passes — a use(thenable) never resolved. If promises are re-created on every render pass (e.g. created in an ancestor render and passed down through props), create them at their use() site or hoist them out of render.",
944
+ "runtime": ["server"],
945
+ "status": "active"
946
+ },
947
+ "48": {
948
+ "message": "octane SSR: %s consecutive streaming passes completed no boundary — a use(thenable) never resolved. If promises are re-created on every render pass (e.g. created in an ancestor render and passed down through props), create them at their use() site or hoist them out of render.",
949
+ "runtime": ["server"],
950
+ "status": "active"
951
+ }
952
+ }
953
+ }