@metaobjectsdev/sdk 0.15.17 → 0.15.18-rc.1
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/agent-context/skills/metaobjects-audit/references/capability-checklist.md +9 -2
- package/agent-context/skills/metaobjects-codegen/SKILL.md +1 -1
- package/agent-context/skills/metaobjects-codegen/references/csharp.md +9 -8
- package/agent-context/skills/metaobjects-codegen/references/typescript.md +5 -1
- package/agent-context/skills/metaobjects-prompts/SKILL.md +1 -1
- package/agent-context/skills/metaobjects-runtime-ui/SKILL.md +1 -1
- package/agent-context/skills/metaobjects-runtime-ui/references/react.md +4 -1
- package/agent-context/skills/metaobjects-runtime-ui/references/tanstack.md +5 -5
- package/agent-context/skills/metaobjects-verify/SKILL.md +1 -1
- package/agent-context/skills/metaobjects-verify/references/migration.md +12 -3
- package/dist/agent-context/assemble.d.ts.map +1 -1
- package/dist/agent-context/assemble.js +11 -4
- package/dist/agent-context/assemble.js.map +1 -1
- package/package.json +2 -2
- package/src/agent-context/assemble.ts +11 -4
|
@@ -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`** (`@
|
|
93
|
-
|
|
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
|
|
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
|
-
--
|
|
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
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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-zero — it 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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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/
|
|
79
|
-
| `useAuthors(filter?)` | `GET /api/
|
|
80
|
-
| `useCreateAuthor()` | `POST /api/
|
|
81
|
-
| `useUpdateAuthor()` | `PATCH /api/
|
|
82
|
-
| `useDeleteAuthor()` | `DELETE /api/
|
|
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
|
|
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
|
-
|
|
109
|
-
|
|
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
|
-
{ "
|
|
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,
|
|
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
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAC;
|
|
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.
|
|
3
|
+
"version": "0.15.18-rc.1",
|
|
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.
|
|
59
|
+
"@metaobjectsdev/metadata": "0.15.18-rc.1",
|
|
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
|
-
//
|
|
57
|
-
//
|
|
58
|
-
//
|
|
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"),
|