Skip to content

Commit a2cd18a

Browse files
os-zhuangclaude
andauthored
feat(spec)!: 双源 C2 收敛 — MetadataEvent / MetadataBulkRegisterRequest 归 ./api,./kernel 侧死删 (#4587) (#4603)
* feat(spec)!: resolve the MetadataEvent/MetadataBulkRegisterRequest dual source — ./kernel copies removed, ./api keeps the bare names (#4587) The three #4535-C2 baseline rows were the #4411 trap on the kernel metadata family: MetadataEvent(Schema) and MetadataBulkRegisterRequestSchema each had a second, different declaration in ./kernel, and which shape a consumer got depended only on the import path. Import-statement-level scan across framework, cloud and objectui: - ./kernel copies: zero importers outside their own unit test in all three repos. The kernel MetadataEvent lifecycle vocabulary (metadata.registered/.../exported) has NO producer anywhere; the kernel bulk-register per-item `namespace` field matches no enforced write path (IMetadataService.bulkRegister and MetadataManager.bulkRegister both take {type,name,data} items only). - ./api MetadataEvent is the live realtime contract: MetadataManager publishes metadata.{type}.{created|deleted} events and @objectstack/client / client-react subscribe against the type. - ./api MetadataBulkRegisterRequestSchema is the POST /api/meta/bulk/register contract whose item shape matches the runtime. Disposal (route 1, dead-side delete, v17 major window): both kernel copies removed; ./api is the sole owner of the bare names. Name continuity for the kernel-only type alias: `MetadataBulkRegisterRequest` (z.input) is now exported from ./api beside its schema, per the family convention and the #4570 docs-import concern. Compile-time pin (typeof import conditional type, #4581 pattern) keeps the bare names out of ./kernel; new events.test.ts covers the surviving ./api declarations. dual-source-exports.baseline.json: exactly the 3 named rows removed (31 -> 28). json-schema.manifest: kernel/MetadataEvent and kernel/MetadataBulkRegisterRequest retired deliberately; their 11 authorable-surface rows hand-deleted per the #4458/#4568/#4581 precedent (plugin TS types, schema bodies deleted — no silent-strip path, misuse fails at the import site at compile time). Changeset: @objectstack/spec major with FROM -> TO migration lines. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL * chore(spec): regenerate api-surface + reference docs for #4587 (check:generated --fix, 2 proved stale) api-surface.json: ./kernel loses MetadataEvent(type)/MetadataEventSchema and MetadataBulkRegisterRequest(type)/MetadataBulkRegisterRequestSchema; ./api gains the MetadataBulkRegisterRequest type alias beside its schema. Reference docs: the api/metadata-plugin.mdx page (which documented the removed kernel pair under the api section and advertised a then-nonexistent ./api type import) is no longer emitted; api/events.mdx now documents MetadataEvent, api/metadata.mdx documents MetadataBulkRegisterRequest, and kernel/metadata-plugin.mdx drops the removed schemas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL * chore(spec): regenerate reference docs after merging main's import-surface gate (#4595) The merge brought in build-docs' new import-surface ratchet. This PR's MetadataBulkRegisterRequest type alias on ./api closes the gap the fresh baseline had accepted, so its line is deleted (shrink-only ratchet). --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 45a5787 commit a2cd18a

16 files changed

Lines changed: 292 additions & 271 deletions
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
---
2+
"@objectstack/spec": major
3+
---
4+
5+
feat(spec)!: `@objectstack/spec/kernel` no longer exports `MetadataEvent(Schema)` / `MetadataBulkRegisterRequest(Schema)` — the bare names belong to `./api` alone (#4587)
6+
7+
The names `MetadataEvent` / `MetadataEventSchema` /
8+
`MetadataBulkRegisterRequestSchema` resolved to **two different declarations**
9+
depending on the import path (`./api` vs `./kernel`) — the #4411 dual-source
10+
trap. Resolution (three-repo, import-statement-level consumer scan: framework,
11+
cloud, objectui — the `./kernel` copies had zero importers outside their own
12+
unit test):
13+
14+
- **Removed** `MetadataEventSchema` / `MetadataEvent` from
15+
`@objectstack/spec/kernel`. This was a lifecycle-event envelope
16+
(`event: 'metadata.registered' | … | 'metadata.exported'`, plus
17+
`actor`/`payload`/`namespace`) that **nothing ever emitted or consumed**
18+
the vocabulary appears in no producer in any of the three repos. The live
19+
contract is `./api`'s `MetadataEvent(Schema)`
20+
(`type: 'metadata.{type}.{created|updated|deleted}'`, with `id` / `definition`
21+
/ `userId`): `MetadataManager` publishes those events to the realtime
22+
service and `@objectstack/client` / `@objectstack/client-react` subscribe to
23+
them.
24+
- FROM `import { MetadataEvent } from '@objectstack/spec/kernel'`
25+
TO `import type { MetadataEvent } from '@objectstack/spec/api'`.
26+
**Shape change**: the api event has `id` (uuid), `type`
27+
(`metadata.{type}.{created|updated|deleted}`), `definition`, `userId`; the
28+
removed kernel shape's `event` / `actor` / `payload` / `namespace` fields
29+
do not exist there. If you needed runtime *watch* events, that contract is
30+
`MetadataWatchEvent` in `@objectstack/spec/system`; repository change-log
31+
events are `MetadataEvent` from `@objectstack/metadata-core` (ADR-0008) —
32+
a third, unrelated declaration that is not part of `@objectstack/spec`.
33+
- **Removed** `MetadataBulkRegisterRequestSchema` /
34+
`MetadataBulkRegisterRequest` from `@objectstack/spec/kernel`. It was a dead
35+
near-duplicate of the REST contract that also diverged from the enforced
36+
write path: its per-item `namespace` field exists neither in
37+
`IMetadataService.bulkRegister` (contracts) nor in
38+
`MetadataManager.bulkRegister`, and `namespace` is deprecated platform-wide.
39+
- FROM `import { MetadataBulkRegisterRequestSchema, MetadataBulkRegisterRequest } from '@objectstack/spec/kernel'`
40+
TO `import { MetadataBulkRegisterRequestSchema, type MetadataBulkRegisterRequest } from '@objectstack/spec/api'`
41+
(the `POST /api/meta/bulk/register` contract; the type export is new on
42+
`./api` in this release). **Shape change**: items are strictly
43+
`{ type, name, data }` — a per-item `namespace` no longer parses into the
44+
accepted shape. `MetadataBulkRegisterRequest` is the authoring-side type
45+
(`z.input`): `continueOnError` / `validate` stay optional and carry
46+
defaults, as before.
47+
- `@objectstack/spec/api`'s `MetadataEvent(Schema)` and
48+
`MetadataBulkRegisterRequestSchema` are **unchanged** and are now the sole
49+
owners of the bare names. Imports from `./api` need no migration.
50+
- `@objectstack/spec/kernel`'s `MetadataBulkResultSchema` /
51+
`MetadataBulkResult` are **unchanged** — only the bulk *register request*
52+
pair moved.
53+
54+
`dual-source-exports.baseline.json` shrinks by exactly these 3 rows (31 → 28,
55+
#4535 C2).

content/docs/references/api/events.mdx

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ Examples:
2626
## TypeScript Usage
2727

2828
```typescript
29-
import { DataEventSchema, DataEventType, MetadataEventType } from '@objectstack/spec/api';
30-
import type { DataEvent, DataEventType, MetadataEventType } from '@objectstack/spec/api';
29+
import { DataEventSchema, DataEventType, MetadataEventSchema, MetadataEventType } from '@objectstack/spec/api';
30+
import type { DataEvent, DataEventType, MetadataEvent, MetadataEventType } from '@objectstack/spec/api';
3131

3232
// Validate data
3333
const result = DataEventSchema.parse(data);
@@ -64,6 +64,24 @@ const result = DataEventSchema.parse(data);
6464
* `data.field.changed`
6565

6666

67+
---
68+
69+
## MetadataEvent
70+
71+
### Properties
72+
73+
| Property | Type | Required | Description |
74+
| :--- | :--- | :--- | :--- |
75+
| **id** | `string` || Unique event identifier |
76+
| **type** | `Enum<'metadata.object.created' \| 'metadata.object.updated' \| 'metadata.object.deleted' \| 'metadata.field.created' \| 'metadata.field.updated' \| 'metadata.field.deleted' \| 'metadata.view.created' \| 'metadata.view.updated' \| 'metadata.view.deleted' \| 'metadata.app.created' \| 'metadata.app.updated' \| 'metadata.app.deleted' \| 'metadata.agent.created' \| 'metadata.agent.updated' \| 'metadata.agent.deleted' \| 'metadata.tool.created' \| 'metadata.tool.updated' \| 'metadata.tool.deleted' \| 'metadata.flow.created' \| 'metadata.flow.updated' \| 'metadata.flow.deleted' \| 'metadata.action.created' \| 'metadata.action.updated' \| 'metadata.action.deleted' \| 'metadata.workflow.created' \| 'metadata.workflow.updated' \| 'metadata.workflow.deleted' \| 'metadata.dashboard.created' \| 'metadata.dashboard.updated' \| 'metadata.dashboard.deleted' \| 'metadata.report.created' \| 'metadata.report.updated' \| 'metadata.report.deleted' \| 'metadata.role.created' \| 'metadata.role.updated' \| 'metadata.role.deleted' \| 'metadata.permission.created' \| 'metadata.permission.updated' \| 'metadata.permission.deleted'>` | ✅ | Event type |
77+
| **metadataType** | `string` || Metadata type (object, view, agent, etc.) |
78+
| **name** | `string` || Metadata item name |
79+
| **packageId** | `string` | optional | Package ID |
80+
| **definition** | `any` | optional | Full definition (create/update only) |
81+
| **userId** | `string` | optional | User who triggered the event |
82+
| **timestamp** | `string` || Event timestamp |
83+
84+
6785
---
6886

6987
## MetadataEventType

content/docs/references/api/meta.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
"export",
3333
"identity",
3434
"metadata",
35-
"metadata-plugin",
3635
"notification",
3736
"package-api",
3837
"package-registry",

content/docs/references/api/metadata-plugin.mdx

Lines changed: 0 additions & 50 deletions
This file was deleted.

content/docs/references/api/metadata.mdx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ the entire platform, including Hono, Next.js, and NestJS adapters.
5050
## TypeScript Usage
5151

5252
```typescript
53-
import { AppDefinitionResponseSchema, ConceptListResponseSchema, MetadataBulkResponseSchema, MetadataBulkUnregisterRequestSchema, MetadataDeleteResponseSchema, MetadataDependenciesResponseSchema, MetadataDependentsResponseSchema, MetadataEffectiveResponseSchema, MetadataExistsResponseSchema, MetadataExportRequestSchema, MetadataExportResponseSchema, MetadataImportRequestSchema, MetadataImportResponseSchema, MetadataItemResponseSchema, MetadataListResponseSchema, MetadataNamesResponseSchema, MetadataOverlayResponseSchema, MetadataOverlaySaveRequestSchema, MetadataQueryRequestSchema, MetadataQueryResponseSchema, MetadataRegisterRequestSchema, MetadataTypeInfoResponseSchema, MetadataTypesResponseSchema, MetadataValidateRequestSchema, MetadataValidateResponseSchema, ObjectDefinitionResponseSchema } from '@objectstack/spec/api';
54-
import type { AppDefinitionResponse, ConceptListResponse, MetadataBulkResponse, MetadataDeleteResponse, MetadataDependenciesResponse, MetadataDependentsResponse, MetadataEffectiveResponse, MetadataExistsResponse, MetadataExportResponse, MetadataImportResponse, MetadataItemResponse, MetadataListResponse, MetadataNamesResponse, MetadataOverlayResponse, MetadataQueryResponse, MetadataRegisterRequest, MetadataTypeInfoResponse, MetadataTypesResponse, MetadataValidateResponse, ObjectDefinitionResponse } from '@objectstack/spec/api';
53+
import { AppDefinitionResponseSchema, ConceptListResponseSchema, MetadataBulkRegisterRequestSchema, MetadataBulkResponseSchema, MetadataBulkUnregisterRequestSchema, MetadataDeleteResponseSchema, MetadataDependenciesResponseSchema, MetadataDependentsResponseSchema, MetadataEffectiveResponseSchema, MetadataExistsResponseSchema, MetadataExportRequestSchema, MetadataExportResponseSchema, MetadataImportRequestSchema, MetadataImportResponseSchema, MetadataItemResponseSchema, MetadataListResponseSchema, MetadataNamesResponseSchema, MetadataOverlayResponseSchema, MetadataOverlaySaveRequestSchema, MetadataQueryRequestSchema, MetadataQueryResponseSchema, MetadataRegisterRequestSchema, MetadataTypeInfoResponseSchema, MetadataTypesResponseSchema, MetadataValidateRequestSchema, MetadataValidateResponseSchema, ObjectDefinitionResponseSchema } from '@objectstack/spec/api';
54+
import type { AppDefinitionResponse, ConceptListResponse, MetadataBulkRegisterRequest, MetadataBulkResponse, MetadataDeleteResponse, MetadataDependenciesResponse, MetadataDependentsResponse, MetadataEffectiveResponse, MetadataExistsResponse, MetadataExportResponse, MetadataImportResponse, MetadataItemResponse, MetadataListResponse, MetadataNamesResponse, MetadataOverlayResponse, MetadataQueryResponse, MetadataRegisterRequest, MetadataTypeInfoResponse, MetadataTypesResponse, MetadataValidateResponse, ObjectDefinitionResponse } from '@objectstack/spec/api';
5555

5656
// Validate data
5757
const result = AppDefinitionResponseSchema.parse(data);
@@ -85,6 +85,19 @@ const result = AppDefinitionResponseSchema.parse(data);
8585
| **data** | `{ name: string; label: string; icon?: string; description?: string }[]` || List of available concepts (Objects, Apps, Flows) |
8686

8787

88+
---
89+
90+
## MetadataBulkRegisterRequest
91+
92+
### Properties
93+
94+
| Property | Type | Required | Description |
95+
| :--- | :--- | :--- | :--- |
96+
| **items** | `{ type: string; name: string; data: Record<string, any> }[]` || Items to register |
97+
| **continueOnError** | `boolean` || Continue on individual failure |
98+
| **validate** | `boolean` || Validate before registering |
99+
100+
88101
---
89102

90103
## MetadataBulkResponse

content/docs/references/kernel/metadata-plugin.mdx

Lines changed: 3 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -72,26 +72,13 @@ cohesive plugin that "takes over" the entire platform's metadata management:
7272
## TypeScript Usage
7373

7474
```typescript
75-
import { MetadataBulkRegisterRequestSchema, MetadataBulkResultSchema, MetadataDependencySchema, MetadataEventSchema, MetadataPluginConfigSchema, MetadataPluginManifestSchema, MetadataQuerySchema, MetadataQueryResultSchema, MetadataTypeSchema, MetadataTypeRegistryEntrySchema, MetadataValidationResultSchema } from '@objectstack/spec/kernel';
76-
import type { MetadataBulkRegisterRequest, MetadataBulkResult, MetadataDependency, MetadataEvent, MetadataPluginConfig, MetadataPluginManifest, MetadataQuery, MetadataQueryResult, MetadataType, MetadataTypeRegistryEntry, MetadataValidationResult } from '@objectstack/spec/kernel';
75+
import { MetadataBulkResultSchema, MetadataDependencySchema, MetadataPluginConfigSchema, MetadataPluginManifestSchema, MetadataQuerySchema, MetadataQueryResultSchema, MetadataTypeSchema, MetadataTypeRegistryEntrySchema, MetadataValidationResultSchema } from '@objectstack/spec/kernel';
76+
import type { MetadataBulkResult, MetadataDependency, MetadataPluginConfig, MetadataPluginManifest, MetadataQuery, MetadataQueryResult, MetadataType, MetadataTypeRegistryEntry, MetadataValidationResult } from '@objectstack/spec/kernel';
7777

7878
// Validate data
79-
const result = MetadataBulkRegisterRequestSchema.parse(data);
79+
const result = MetadataBulkResultSchema.parse(data);
8080
```
8181

82-
---
83-
84-
## MetadataBulkRegisterRequest
85-
86-
### Properties
87-
88-
| Property | Type | Required | Description |
89-
| :--- | :--- | :--- | :--- |
90-
| **items** | `{ type: string; name: string; data: Record<string, any>; namespace?: string }[]` || Items to register |
91-
| **continueOnError** | `boolean` || Continue if individual item fails |
92-
| **validate** | `boolean` || Validate before register |
93-
94-
9582
---
9683

9784
## MetadataBulkResult
@@ -121,24 +108,6 @@ const result = MetadataBulkRegisterRequestSchema.parse(data);
121108
| **kind** | `Enum<'reference' \| 'extends' \| 'includes' \| 'triggers'>` || How the dependency is formed |
122109

123110

124-
---
125-
126-
## MetadataEvent
127-
128-
### Properties
129-
130-
| Property | Type | Required | Description |
131-
| :--- | :--- | :--- | :--- |
132-
| **event** | `Enum<'metadata.registered' \| 'metadata.updated' \| 'metadata.unregistered' \| 'metadata.validated' \| 'metadata.deployed' \| 'metadata.overlay.applied' \| 'metadata.overlay.removed' \| 'metadata.imported' \| 'metadata.exported'>` || Event type |
133-
| **metadataType** | `Enum<'object' \| 'field' \| 'hook' \| 'seed' \| 'mapping' \| 'view' \| 'page' \| 'dashboard' \| 'app' \| 'action' \| 'report' \| 'dataset' \| 'flow' \| 'job' \| 'datasource' \| 'external_catalog' \| 'translation' \| 'email_template' \| 'doc' \| 'book' \| 'permission' \| 'position' \| 'agent' \| 'tool' \| 'skill'>` || Metadata type |
134-
| **name** | `string` || Metadata item name |
135-
| **namespace** | `string` | optional | Namespace |
136-
| **packageId** | `string` | optional | Owning package ID |
137-
| **timestamp** | `string` || Event timestamp |
138-
| **actor** | `string` | optional | User or system that triggered the event |
139-
| **payload** | `Record<string, any>` | optional | Event-specific payload |
140-
141-
142111
---
143112

144113
## MetadataPluginConfig

packages/spec/api-surface.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,8 +1620,6 @@
16201620
"MergeResultSchema (const)",
16211621
"MergeStrategyConfig (type)",
16221622
"MergeStrategyConfigSchema (const)",
1623-
"MetadataBulkRegisterRequest (type)",
1624-
"MetadataBulkRegisterRequestSchema (const)",
16251623
"MetadataBulkResult (type)",
16261624
"MetadataBulkResultSchema (const)",
16271625
"MetadataCategory (type)",
@@ -1636,8 +1634,6 @@
16361634
"MetadataDependencySchema (const)",
16371635
"MetadataDiffItem (type)",
16381636
"MetadataDiffItemSchema (const)",
1639-
"MetadataEvent (type)",
1640-
"MetadataEventSchema (const)",
16411637
"MetadataFallbackStrategy (type)",
16421638
"MetadataFallbackStrategySchema (const)",
16431639
"MetadataLock (type)",
@@ -2855,6 +2851,7 @@
28552851
"MarkNotificationsReadRequestSchema (const)",
28562852
"MarkNotificationsReadResponse (type)",
28572853
"MarkNotificationsReadResponseSchema (const)",
2854+
"MetadataBulkRegisterRequest (type)",
28582855
"MetadataBulkRegisterRequestSchema (const)",
28592856
"MetadataBulkResponse (type)",
28602857
"MetadataBulkResponseSchema (const)",

packages/spec/authorable-surface.json

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4639,9 +4639,6 @@
46394639
"kernel/MergeStrategyConfig:alwaysKeepCustom",
46404640
"kernel/MergeStrategyConfig:autoResolveNonConflicting",
46414641
"kernel/MergeStrategyConfig:defaultStrategy",
4642-
"kernel/MetadataBulkRegisterRequest:continueOnError",
4643-
"kernel/MetadataBulkRegisterRequest:items",
4644-
"kernel/MetadataBulkRegisterRequest:validate",
46454642
"kernel/MetadataBulkResult:errors",
46464643
"kernel/MetadataBulkResult:failed",
46474644
"kernel/MetadataBulkResult:succeeded",
@@ -4657,14 +4654,6 @@
46574654
"kernel/MetadataDiffItem:previousName",
46584655
"kernel/MetadataDiffItem:summary",
46594656
"kernel/MetadataDiffItem:type",
4660-
"kernel/MetadataEvent:actor",
4661-
"kernel/MetadataEvent:event",
4662-
"kernel/MetadataEvent:metadataType",
4663-
"kernel/MetadataEvent:name",
4664-
"kernel/MetadataEvent:namespace",
4665-
"kernel/MetadataEvent:packageId",
4666-
"kernel/MetadataEvent:payload",
4667-
"kernel/MetadataEvent:timestamp",
46684657
"kernel/MetadataManagerConfig:cache",
46694658
"kernel/MetadataManagerConfig:datasource",
46704659
"kernel/MetadataManagerConfig:fallback",

packages/spec/docs-import-surface.baseline.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
"api/Discovery — no type export",
1212
"api/GetAnalyticsMetaRequest — no type export",
1313
"api/HttpFindQueryParams — no type export",
14-
"api/MetadataBulkRegisterRequest — no type export",
1514
"api/MetadataBulkUnregisterRequest — no type export",
1615
"api/MetadataExportRequest — no type export",
1716
"api/MetadataImportRequest — no type export",

packages/spec/dual-source-exports.baseline.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
"FieldMappingSchema — [./data (const)] ≠ [./integration (const)] ≠ [./shared (const)]",
1616
"HttpMethod — [./api, ./shared (type)] ≠ [./ui (type)]",
1717
"HttpRequest — [./shared (type)] ≠ [./ui (type)]",
18-
"MetadataBulkRegisterRequestSchema — [./api (const)] ≠ [./kernel (const)]",
19-
"MetadataEvent — [./api (type)] ≠ [./kernel (type)]",
20-
"MetadataEventSchema — [./api (const)] ≠ [./kernel (const)]",
2118
"Notification — [./api (type)] ≠ [./ui (type)]",
2219
"NotificationConfig — [./system (type)] ≠ [./ui (type)]",
2320
"NotificationConfigSchema — [./system (const)] ≠ [./ui (const)]",

0 commit comments

Comments
 (0)