Skip to content

Commit 77a9938

Browse files
dmealingclaude
andcommitted
docs(claude-md): polyglot layout + framework-integration rules
Reorganize the layout section around the deployment-target → language/ platform → framework-integration principle. Add the dual-role insight (TS as server peer port AND TS as universal web client) explicitly, since this drives the client/web split. Add the framework-integration multi-entry anatomy (codegen + runtime + dynamic in one package, exposed via package.json exports) with concrete tanstack examples. Mirrors drizzle-orm, @tanstack/react-table, Apollo conventions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 5552d74 commit 77a9938

1 file changed

Lines changed: 85 additions & 11 deletions

File tree

CLAUDE.md

Lines changed: 85 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,94 @@ TypeScript reference implementation is at v0.3 — Projects D–G shipped end-to
2020

2121
Cross-language conformance fixtures live at `fixtures/conformance/` (45 fixtures + a `CAPABILITIES.json` manifest). See `spec/roadmap.md` for current + planned work.
2222

23-
## Language, runtime, conventions
23+
## Monorepo layout
24+
25+
This repo holds all implementations of the standard, organized by deployment target → language/platform → framework integration:
26+
27+
```
28+
metaobjects/
29+
├── spec/ # canonical metamodel docs (target-agnostic)
30+
├── fixtures/conformance/ # cross-language test fixtures
31+
32+
├── server/ # runs on a server
33+
│ ├── typescript/ java/ python/ csharp/
34+
35+
└── client/ # runs on an end-user device
36+
├── web/ # browser (TS-only — the browser is TS-native)
37+
└── ios/ android/ # future
38+
```
39+
40+
**TypeScript plays two distinct roles**, and the layout reflects that:
41+
- **Server-side TS** is a peer port to Java/Python/C# at `server/typescript/`.
42+
- **Universal web client TS** at `client/web/` is consumed by ALL backends (a Java backend serving React still uses the TS client packages).
43+
44+
**Where does a new package go?**
45+
1. Server-side or client-side? → top-level dir.
46+
2. What language/platform? → second-level dir.
47+
3. What framework integration? → package name at the third level.
48+
49+
Worked examples: a Drizzle TS-server integration → `server/typescript/packages/...`; an Angular browser integration → `client/web/packages/angular/`; future iOS SwiftUI → `client/ios/packages/swiftui/`.
50+
51+
## TS package layout
52+
53+
**Server-side** (`server/typescript/packages/`):
54+
- `metadata/` (`@metaobjects/metadata`) — metamodel loader, types, constants
55+
- `codegen-ts/` (`@metaobjects/codegen-ts`) — TS codegen engine
56+
- `runtime-ts/` (`@metaobjects/runtime-ts`) — Node-side runtime (Kysely, Drizzle, Fastify helpers)
57+
- `migrate-ts/` (`@metaobjects/migrate-ts`) — migration tooling
58+
- `sdk/` (`@metaobjects/sdk`) — workspace memory, path helpers
59+
- `cli/` (`@metaobjects/cli`, binary `meta`) — CLI commands: `init`, `gen`, `migrate`
60+
61+
**Client-side / universal web** (`client/web/packages/`):
62+
- `runtime-web/` (`@metaobjects/runtime-web`) — framework-agnostic browser core (EntityFetcher contract, JSON shapes).
63+
- `tanstack/` (`@metaobjects/tanstack`) — TanStack React integration: codegen + runtime + dynamic.
64+
- Future: `angular/`, `svelte/`, `react-native/`.
65+
66+
### Framework integration package anatomy
67+
68+
Each framework integration (`tanstack`, future `angular`, etc.) is a **first-class package** combining codegen + runtime + future dynamic metadata-driven capabilities. They are NOT just code generators — naming with a `codegen-` prefix would lock them into one role.
69+
70+
Multi-entry layout:
71+
72+
```
73+
client/web/packages/tanstack/
74+
├── package.json # "name": "@metaobjects/tanstack"
75+
└── src/
76+
├── codegen/ # generators imported in metaobjects.config.ts
77+
├── runtime/ # providers, hooks, helpers imported in app code
78+
├── dynamic/ # future — metadata-driven runtime widgets
79+
└── index.ts # re-exports the stable runtime API
80+
```
81+
82+
`package.json` exports map:
83+
84+
```jsonc
85+
{
86+
"exports": {
87+
".": "./dist/index.js",
88+
"./codegen": "./dist/codegen/index.js",
89+
"./runtime": "./dist/runtime/index.js",
90+
"./dynamic": "./dist/dynamic/index.js"
91+
}
92+
}
93+
```
94+
95+
Consumption:
96+
97+
```ts
98+
// metaobjects.config.ts (server-only deps stay out of browser bundles)
99+
import { tanstackQuery, tanstackGrid } from "@metaobjects/tanstack/codegen";
100+
101+
// React app
102+
import { EntityFetcherProvider, EntityGrid } from "@metaobjects/tanstack/runtime";
103+
```
104+
105+
Mirrors `drizzle-orm` (multi-dialect entry points), `@tanstack/react-table` (state + helpers co-located), Apollo (client + cache + links).
106+
107+
## Other conventions
24108

25-
- **Language**: this repo contains all language implementations under `typescript/`, `java/`, `python/`, `csharp/` directories.
26109
- **TS runtime**: Bun-first for development (zero-config TS, native test runner). Node-compatible for distribution; users install via npm/pnpm/bun without lock-in to Bun's runtime.
27110
- **Module system**: ESM only. No CommonJS, no transpile step required.
28-
- **TS package layout**: `typescript/packages/` — Bun/pnpm workspace.
29-
- `metadata/` (`@metaobjects/metadata`) — metamodel loader, types, constants
30-
- `codegen-ts/` (`@metaobjects/codegen-ts`) — TS codegen engine
31-
- `codegen-ts-tanstack/` (`@metaobjects/codegen-ts-tanstack`) — TanStack Query + Table generators
32-
- `runtime-ts/` (`@metaobjects/runtime-ts`) — Node-side runtime (Kysely, Drizzle, Fastify helpers)
33-
- `runtime-ts-client/` (`@metaobjects/runtime-ts-client`) — browser-safe runtime (hooks, cell renderers, currency)
34-
- `migrate-ts/` (`@metaobjects/migrate-ts`) — migration tooling
35-
- `sdk/` (`@metaobjects/sdk`) — workspace memory, path helpers
36-
- `cli/` (`@metaobjects/cli`, binary `meta`) — CLI commands: `init`, `gen`, `migrate`
37111
- **Storage format**: JSON files in `metaobjects/meta.<concept>.json` at project root. `.metaobjects/.gen-state/` (gitignored) holds the codegen merge base.
38112
- **Codegen substrate**: ts-poet for greenfield emit, ts-morph for in-place edits, Biome for format pass, `git merge-file --diff3` for hand-edit-preserving regen.
39113
- **Runtime substrate**: Kysely for TS (user-provided connection, async-only).

0 commit comments

Comments
 (0)