@octanejs/mcp-server 0.2.0 → 0.2.2

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.
package/README.md CHANGED
@@ -73,7 +73,11 @@ exists, an overall verdict (`bridgeable`, `bridgeable-with-rewrites`,
73
73
  ### `octane_bindings`
74
74
 
75
75
  Returns the map of React packages with maintained `@octanejs/*` ports
76
- (zustand, query, motion, stylex, router, lexical, floating-ui, radix).
76
+ (zustand, tanstack-query, motion, stylex, tanstack-router, lexical,
77
+ floating-ui, radix, hook-form, base-ui, recharts, redux, testing-library,
78
+ mdx). The map lives in `src/bridge.js` (`KNOWN_BINDINGS`) and its tests derive
79
+ the expected set from the workspace manifests, so it cannot silently drift from
80
+ the published bindings.
77
81
 
78
82
  ### `octane_skill`
79
83
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@octanejs/mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "description": "MCP server exposing Octane repository automation for coding agents.",
6
6
  "license": "MIT",
@@ -10,10 +10,13 @@ of bridging by hand:
10
10
  | React package | Octane binding |
11
11
  | --- | --- |
12
12
  | `zustand` | `@octanejs/zustand` |
13
- | `@tanstack/react-query` | `@octanejs/query` |
13
+ | `jotai` | `@octanejs/jotai` |
14
+ | `@tanstack/react-query` | `@octanejs/tanstack-query` |
15
+ | `@tanstack/react-table` | `@octanejs/tanstack-table` |
16
+ | `@tanstack/react-virtual` | `@octanejs/tanstack-virtual` |
14
17
  | `framer-motion` / `motion` | `@octanejs/motion` |
15
18
  | `@stylexjs/stylex` | `@octanejs/stylex` |
16
- | `react-router` / `react-router-dom` | `@octanejs/router` |
19
+ | `react-router` / `react-router-dom` | `@octanejs/tanstack-router` |
17
20
  | `@lexical/react` | `@octanejs/lexical` |
18
21
  | `@floating-ui/react` | `@octanejs/floating-ui` |
19
22
  | `radix-ui` | `@octanejs/radix` |
package/src/bridge.js CHANGED
@@ -1,17 +1,29 @@
1
1
  import { readdir, readFile } from 'node:fs/promises';
2
2
  import { join, resolve } from 'node:path';
3
3
 
4
+ // React package → maintained @octanejs binding. bridge.test.js derives the
5
+ // expected value set from the workspace manifests, so publishing a new binding
6
+ // without registering it here fails the mcp-server tests.
4
7
  export const KNOWN_BINDINGS = {
5
8
  zustand: '@octanejs/zustand',
6
- '@tanstack/react-query': '@octanejs/query',
9
+ jotai: '@octanejs/jotai',
10
+ '@tanstack/react-query': '@octanejs/tanstack-query',
11
+ '@tanstack/react-table': '@octanejs/tanstack-table',
12
+ '@tanstack/react-virtual': '@octanejs/tanstack-virtual',
7
13
  'framer-motion': '@octanejs/motion',
8
14
  motion: '@octanejs/motion',
9
15
  '@stylexjs/stylex': '@octanejs/stylex',
10
- 'react-router': '@octanejs/router',
11
- 'react-router-dom': '@octanejs/router',
16
+ 'react-router': '@octanejs/tanstack-router',
17
+ 'react-router-dom': '@octanejs/tanstack-router',
12
18
  '@lexical/react': '@octanejs/lexical',
13
19
  '@floating-ui/react': '@octanejs/floating-ui',
14
20
  'radix-ui': '@octanejs/radix',
21
+ 'react-hook-form': '@octanejs/hook-form',
22
+ '@base-ui-components/react': '@octanejs/base-ui',
23
+ recharts: '@octanejs/recharts',
24
+ 'react-redux': '@octanejs/redux',
25
+ '@testing-library/react': '@octanejs/testing-library',
26
+ '@mdx-js/react': '@octanejs/mdx',
15
27
  };
16
28
 
17
29
  export const KNOWN_VANILLA_CORES = {
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { mkdir, mkdtemp, writeFile } from 'node:fs/promises';
2
+ import { mkdir, mkdtemp, readdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { fileURLToPath } from 'node:url';
3
4
  import { tmpdir } from 'node:os';
4
5
  import { join } from 'node:path';
5
6
  import { bridgeReport, detectVanillaCore, scanSource, KNOWN_BINDINGS } from './bridge.js';
@@ -137,18 +138,34 @@ describe('bridgeReport', () => {
137
138
  });
138
139
 
139
140
  describe('KNOWN_BINDINGS', () => {
140
- it('covers every published @octanejs binding', () => {
141
- expect(new Set(Object.values(KNOWN_BINDINGS))).toEqual(
142
- new Set([
143
- '@octanejs/zustand',
144
- '@octanejs/query',
145
- '@octanejs/motion',
146
- '@octanejs/stylex',
147
- '@octanejs/router',
148
- '@octanejs/lexical',
149
- '@octanejs/floating-ui',
150
- '@octanejs/radix',
151
- ]),
152
- );
141
+ it('covers every published @octanejs binding (derived from workspace manifests)', async () => {
142
+ // The expected set is DERIVED from packages/*/package.json rather than
143
+ // hand-maintained, so publishing a new binding without registering it in
144
+ // KNOWN_BINDINGS fails here. Only genuinely-not-a-binding packages (the
145
+ // core runtime, build/deploy infrastructure, this MCP server) are
146
+ // excluded by name.
147
+ const NON_BINDINGS = new Set([
148
+ 'octane',
149
+ '@octanejs/vite-plugin',
150
+ '@octanejs/adapter-vercel',
151
+ '@octanejs/mcp-server',
152
+ ]);
153
+ const packagesRoot = fileURLToPath(new URL('../..', import.meta.url));
154
+ const bindings = [];
155
+ for (const entry of await readdir(packagesRoot, { withFileTypes: true })) {
156
+ if (!entry.isDirectory()) continue;
157
+ let manifest;
158
+ try {
159
+ manifest = JSON.parse(
160
+ await readFile(join(packagesRoot, entry.name, 'package.json'), 'utf8'),
161
+ );
162
+ } catch {
163
+ continue; // not a package dir
164
+ }
165
+ if (manifest.private || NON_BINDINGS.has(manifest.name)) continue;
166
+ bindings.push(manifest.name);
167
+ }
168
+ expect(bindings.length).toBeGreaterThan(0);
169
+ expect(new Set(Object.values(KNOWN_BINDINGS))).toEqual(new Set(bindings));
153
170
  });
154
171
  });