@metaobjectsdev/sdk 0.15.17 → 0.15.18

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.
@@ -89,11 +89,18 @@ classify it (using the classification scheme in `SKILL.md`) and route the cutove
89
89
 
90
90
  - **`identity.primary`** (`@generation`) — hunt hand-assigned primary keys / ID generation
91
91
  the primary identity's `@generation` strategy models.
92
- - **`identity.secondary`** (`@unique`, `@where`, `@expr`) — hunt raw-SQL partial or functional
93
- unique indexes a secondary identity with `@where` / `@expr` describes.
92
+ - **`identity.secondary`** (`@fields`; physical escapes `@using`/`@expr`/`@where`/`@orders`) — a
93
+ UNIQUE alternate key (uniqueness is the type the legacy `@unique` attr was removed from it);
94
+ hunt hand-rolled unique constraints or raw-SQL partial/functional unique indexes it models.
94
95
  - **`identity.reference`** (`@references`, `@enforce`) — hunt hand-written FK constraints /
95
96
  reference enforcement the reference identity already declares.
96
97
 
98
+ ## Index — `index.*` (non-unique retrieval)
99
+
100
+ - **`index.lookup`** (`@fields` required; physical escapes `@using`/`@expr`/`@where`/`@orders`) —
101
+ a NON-unique retrieval index (uniqueness is what distinguishes it from `identity.secondary`);
102
+ hunt hand-created lookup / recency indexes (`CREATE INDEX …`) it models.
103
+
97
104
  ## Origin — `origin.*` (projection-field derivation)
98
105
 
99
106
  - **`origin.aggregate`** (`@agg`, `@of`, `@via`) — hunt hand `COUNT` / `SUM` / `AVG`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: metaobjects-codegen
3
- description: Use when configuring or running MetaObjects code generation: generators/targets/dialect config, the gen command, and hand-edit-preserving regeneration.
3
+ description: Use when configuring or running MetaObjects code generation generators/targets/dialect config, the gen command, and hand-edit-preserving regeneration.
4
4
  ---
5
5
 
6
6
  # MetaObjects code generation
@@ -20,13 +20,12 @@ command is `dotnet-meta`).
20
20
  ## Run
21
21
 
22
22
  ```bash
23
- dotnet meta gen \
24
- --metadata-dir metaobjects \
25
- --output-dir Generated \
23
+ dotnet meta gen metaobjects \
24
+ --out Generated \
26
25
  --namespace Acme.Generated
27
26
  dotnet meta gen --list # list registered generators
28
- dotnet meta gen --generators entity,db-context,routes # select a subset
29
- dotnet meta verify --codegen # codegen-drift gate (regenerate + diff vs committed)
27
+ dotnet meta gen metaobjects --out Generated --generators entity,db-context,routes # select a subset
28
+ dotnet meta verify metaobjects --codegen --out Generated # codegen-drift gate (regenerate + diff vs committed)
30
29
  ```
31
30
 
32
31
  `dotnet meta verify` defaults to `--templates` (the FR-004 prompt/template drift
@@ -82,6 +81,8 @@ consuming fields reference a hand-written/third-party enum, and the C# namespace
82
81
 
83
82
  ## Re-scaffold this context
84
83
 
85
- `dotnet meta agent-docs --server csharp [--out <dir>]` (re)scaffolds the slim
86
- always-on Markdown + these `metaobjects-*` skills into the project the C# tool
87
- bundles the agent-context tree, so a C# consumer needs no Node `meta`.
84
+ Agent-context scaffolding is owned by the Node `meta` CLI (ADR-0015). `dotnet meta
85
+ agent-docs` only prints a redirect and exits non-zeroit does **not** scaffold.
86
+ (Re)scaffold the slim always-on Markdown + these `metaobjects-*` skills with
87
+ `npx meta agent-docs --server csharp [--client <fw>] [--out <dir>]`. A C# consumer
88
+ needs Node `meta` (npx) for this one scaffold step; codegen + verify stay on `dotnet meta`.
@@ -32,7 +32,11 @@ comes from `@metaobjectsdev/cli`; the generators come from their packages.
32
32
 
33
33
  ```ts
34
34
  import { defineConfig } from "@metaobjectsdev/cli";
35
- import { entityFile, queriesFile, routesFile, barrel } from "@metaobjectsdev/codegen-ts/generators";
35
+ // Owned generators scaffolded by `meta init` (ADR-0034 scaffold-and-own).
36
+ import { entityFile } from "./codegen/generators/entity";
37
+ import { queriesFile } from "./codegen/generators/queries";
38
+ import { routesFile } from "./codegen/generators/routes";
39
+ import { barrel } from "./codegen/generators/barrel";
36
40
  import { formFile } from "@metaobjectsdev/codegen-ts-react";
37
41
  import { tanstackQuery, tanstackGrid } from "@metaobjectsdev/codegen-ts-tanstack";
38
42
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: metaobjects-prompts
3
- description: Use when declaring or using MetaObjects prompt construction: template.prompt/template.output, typed payload projections, provider-resolved text, deterministic render, prompt-drift verify, and parser-on-receipt.
3
+ description: Use when declaring or using MetaObjects prompt construction template.prompt/template.output, typed payload projections, provider-resolved text, deterministic render, prompt-drift verify, and parser-on-receipt.
4
4
  ---
5
5
 
6
6
  # MetaObjects prompt construction
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: metaobjects-runtime-ui
3
- description: Use when wiring MetaObjects generated code into an app: runtime queries/CRUD, REST routes, and the web client (forms, grids, filters).
3
+ description: Use when wiring MetaObjects generated code into an app runtime queries/CRUD, REST routes, and the web client (forms, grids, filters).
4
4
  ---
5
5
 
6
6
  # Wiring MetaObjects runtime + web client
@@ -33,7 +33,10 @@ validation rule) rides along automatically:
33
33
  ```ts
34
34
  // metaobjects.config.ts
35
35
  import { defineConfig } from "@metaobjectsdev/cli";
36
- import { entityFile, queriesFile, barrel } from "@metaobjectsdev/codegen-ts/generators";
36
+ // Owned generators scaffolded by `meta init` (ADR-0034 scaffold-and-own).
37
+ import { entityFile } from "./codegen/generators/entity";
38
+ import { queriesFile } from "./codegen/generators/queries";
39
+ import { barrel } from "./codegen/generators/barrel";
37
40
  import { formFile } from "@metaobjectsdev/codegen-ts-react";
38
41
 
39
42
  export default defineConfig({
@@ -75,11 +75,11 @@ projections):
75
75
 
76
76
  | Hook | Verb / Path |
77
77
  |---|---|
78
- | `useAuthor(id)` | `GET /api/author/:id` |
79
- | `useAuthors(filter?)` | `GET /api/author?filter[..]=..&sort=..&limit=N&offset=N` |
80
- | `useCreateAuthor()` | `POST /api/author` |
81
- | `useUpdateAuthor()` | `PATCH /api/author/:id` |
82
- | `useDeleteAuthor()` | `DELETE /api/author/:id` |
78
+ | `useAuthor(id)` | `GET /api/authors/:id` |
79
+ | `useAuthors(filter?)` | `GET /api/authors?filter[..]=..&sort=..&limit=N&offset=N` |
80
+ | `useCreateAuthor()` | `POST /api/authors` |
81
+ | `useUpdateAuthor()` | `PATCH /api/authors/:id` |
82
+ | `useDeleteAuthor()` | `DELETE /api/authors/:id` |
83
83
 
84
84
  Query hooks return `UseQueryResult`; mutation hooks return `UseMutationResult` and
85
85
  invalidate the entity's query keys so lists re-fetch after writes.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: metaobjects-verify
3
- description: Use when verifying MetaObjects: drift checks (verify --db/--codegen/--templates), schema migrations, and interpreting conformance/test failures.
3
+ description: Use when verifying MetaObjects drift checks (verify --db/--codegen/--templates), schema migrations, and interpreting conformance/test failures.
4
4
  ---
5
5
 
6
6
  # MetaObjects verify + migrations
@@ -105,16 +105,25 @@ DB didn't follow.
105
105
 
106
106
  ## Index modeling (Postgres)
107
107
 
108
- Secondary indexes carry physical-shape attributes contributed by the db provider
109
- (they live on `identity.secondary`, not core):
108
+ Two index types, distinguished by uniqueness (ADR-0040) both carry the same
109
+ physical-shape escapes contributed by the db provider:
110
+
111
+ - **`identity.secondary`** — a UNIQUE alternate key (uniqueness is the type; the legacy
112
+ `@unique` attr was removed from it).
113
+ - **`index.lookup`** — a NON-unique retrieval index (`@fields` required).
114
+
115
+ Shared physical escapes:
110
116
 
111
117
  - `@orders` — per-key sort direction, positional to `@fields` (`["asc", "desc"]`).
112
118
  Omit for all-ascending; drives `DESC`-ordered index keys (e.g. a recency index).
113
119
  - `@where` — a partial-index predicate (raw SQL, e.g. `"delivered_at IS NULL"`),
114
120
  emitted as `WHERE (<pred>)`. The index then covers only matching rows.
121
+ - `@using` / `@expr` — index method and functional-expression escapes.
122
+
123
+ A non-unique recency index is `index.lookup`:
115
124
 
116
125
  ```json
117
- { "identity.secondary": { "@fields": ["userId", "createdAt"],
126
+ { "index.lookup": { "@fields": ["userId", "createdAt"],
118
127
  "@orders": ["asc", "desc"], "@where": "archived_at IS NULL" } }
119
128
  ```
120
129
 
@@ -1 +1 @@
1
- {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/agent-context/assemble.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAiCzE,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,aAAa,EAAE,CAsCrF"}
1
+ {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/agent-context/assemble.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAqC1G,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GAAG,aAAa,EAAE,CAyCrF"}
@@ -1,6 +1,9 @@
1
1
  import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { SKILL_NAMES } from "./types.js";
3
+ import { SKILL_NAMES, SERVER_LANGS, CLIENT_FRAMEWORKS } from "./types.js";
4
+ // Language/framework reference fragments are stack-scoped; any other fragment
5
+ // (e.g. capability-checklist) is universal and always installs.
6
+ const LANGUAGE_FRAGMENT_TOKENS = new Set([...SERVER_LANGS, ...CLIENT_FRAMEWORKS]);
4
7
  function readServerMeta(contentRoot, server) {
5
8
  const p = join(contentRoot, "servers", `${server}.meta.json`);
6
9
  if (!existsSync(p))
@@ -46,14 +49,18 @@ export function assemble(opts) {
46
49
  out.push({ path: `.claude/skills/${skill}/SKILL.md`, contents: body });
47
50
  const refDir = join(skillDir, "references");
48
51
  if (existsSync(refDir) && statSync(refDir).isDirectory()) {
49
- // Deploy-all: every reference fragment is installed; the agent reads the
50
- // one(s) matching its stack (SKILL.md points to them). Robust to
51
- // stack-detection misses a narrow/empty stack never starves the agent.
52
+ // Stack-scoped: a language/framework fragment installs only when its token
53
+ // is in the resolved stack (Stack.tokens = servers ∪ clients ∪ {migration}).
54
+ // Non-language fragments (e.g. capability-checklist) are universal and always
55
+ // install. Keeps each skill's references/ to what the project actually uses,
56
+ // so the SKILL.md "read every references/*.md" footer stays accurate.
52
57
  const refs = readdirSync(refDir)
53
58
  .filter((f) => f.endsWith(".md"))
54
59
  .map((f) => f.replace(/\.md$/, ""))
55
60
  .sort();
56
61
  for (const token of refs) {
62
+ if (LANGUAGE_FRAGMENT_TOKENS.has(token) && !stack.tokens.has(token))
63
+ continue;
57
64
  out.push({
58
65
  path: `.claude/skills/${skill}/references/${token}.md`,
59
66
  contents: readFileSync(join(refDir, `${token}.md`), "utf8"),
@@ -1 +1 @@
1
- {"version":3,"file":"assemble.js","sourceRoot":"","sources":["../../src/agent-context/assemble.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assemble.js","sourceRoot":"","sources":["../../src/agent-context/assemble.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/sdk",
3
- "version": "0.15.17",
3
+ "version": "0.15.18",
4
4
  "description": "Workspace helpers and agent-docs utilities for MetaObjects projects.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -56,7 +56,7 @@
56
56
  "access": "public"
57
57
  },
58
58
  "dependencies": {
59
- "@metaobjectsdev/metadata": "0.15.17",
59
+ "@metaobjectsdev/metadata": "0.15.18",
60
60
  "zod": "^3.23.0"
61
61
  },
62
62
  "devDependencies": {
@@ -1,6 +1,10 @@
1
1
  import { readFileSync, readdirSync, existsSync, statSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { SKILL_NAMES, type AssembledFile, type Stack } from "./types.js";
3
+ import { SKILL_NAMES, SERVER_LANGS, CLIENT_FRAMEWORKS, type AssembledFile, type Stack } from "./types.js";
4
+
5
+ // Language/framework reference fragments are stack-scoped; any other fragment
6
+ // (e.g. capability-checklist) is universal and always installs.
7
+ const LANGUAGE_FRAGMENT_TOKENS = new Set<string>([...SERVER_LANGS, ...CLIENT_FRAMEWORKS]);
4
8
 
5
9
  interface ServerMeta { displayName: string; install: string; codegenCommand: string; }
6
10
 
@@ -53,14 +57,17 @@ export function assemble(opts: { contentRoot: string; stack: Stack }): Assembled
53
57
 
54
58
  const refDir = join(skillDir, "references");
55
59
  if (existsSync(refDir) && statSync(refDir).isDirectory()) {
56
- // Deploy-all: every reference fragment is installed; the agent reads the
57
- // one(s) matching its stack (SKILL.md points to them). Robust to
58
- // stack-detection misses a narrow/empty stack never starves the agent.
60
+ // Stack-scoped: a language/framework fragment installs only when its token
61
+ // is in the resolved stack (Stack.tokens = servers ∪ clients ∪ {migration}).
62
+ // Non-language fragments (e.g. capability-checklist) are universal and always
63
+ // install. Keeps each skill's references/ to what the project actually uses,
64
+ // so the SKILL.md "read every references/*.md" footer stays accurate.
59
65
  const refs = readdirSync(refDir)
60
66
  .filter((f) => f.endsWith(".md"))
61
67
  .map((f) => f.replace(/\.md$/, ""))
62
68
  .sort();
63
69
  for (const token of refs) {
70
+ if (LANGUAGE_FRAGMENT_TOKENS.has(token) && !stack.tokens.has(token)) continue;
64
71
  out.push({
65
72
  path: `.claude/skills/${skill}/references/${token}.md`,
66
73
  contents: readFileSync(join(refDir, `${token}.md`), "utf8"),