stylegallery 0.1.0 → 0.1.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.
Files changed (230) hide show
  1. package/AGENTS.md +4 -1
  2. package/DOMAINS.md +2 -6
  3. package/GOVERNANCE.md +10 -9
  4. package/README.md +29 -127
  5. package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
  6. package/consumer-reference/agent-native/v2/material-registry.json +1 -0
  7. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
  8. package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
  10. package/consumer-reference/contract.md +1 -1
  11. package/consumer-reference/index.md +5 -3
  12. package/layout/index.md +124 -0
  13. package/log.md +57 -0
  14. package/package.json +183 -22
  15. package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
  16. package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
  17. package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
  18. package/scripts/agent-native/v2/material-admission.mjs +295 -0
  19. package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
  20. package/scripts/agent-native/v2/material-context.mjs +251 -0
  21. package/scripts/agent-native/v2/material-identity.mjs +71 -0
  22. package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
  23. package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
  24. package/scripts/agent-native/v2/material-queries.mjs +398 -0
  25. package/scripts/agent-native/v2/material-registry.mjs +319 -0
  26. package/scripts/sg-material-mcp.mjs +98 -0
  27. package/scripts/sg-material.mjs +27 -0
  28. package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
  29. package/consumer-reference/baselines/calibration.json +0 -260
  30. package/consumer-reference/baselines/manifest.json +0 -21
  31. package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
  32. package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
  33. package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
  34. package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
  35. package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
  36. package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
  37. package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
  38. package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
  39. package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
  40. package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
  41. package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
  42. package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
  43. package/consumer-reference/fixtures/promotion/manifest.json +0 -15
  44. package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
  45. package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
  46. package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
  47. package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
  48. package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
  49. package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
  50. package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
  51. package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
  52. package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
  53. package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
  54. package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
  55. package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
  56. package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
  57. package/consumer-reference/fixtures/valid-deprecated.json +0 -21
  58. package/consumer-reference/fixtures/valid-experimental.json +0 -19
  59. package/consumer-reference/generated/manifest.json +0 -40
  60. package/consumer-reference/generated/tokens.css +0 -12
  61. package/consumer-reference/policies/shared-experimental.json +0 -37
  62. package/consumer-reference/schema/ax-evidence.schema.json +0 -30
  63. package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
  64. package/consumer-reference/schema/calibration-record.schema.json +0 -190
  65. package/consumer-reference/schema/capture-session.schema.json +0 -161
  66. package/consumer-reference/schema/component-state.schema.json +0 -150
  67. package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
  68. package/consumer-reference/schema/dom-evidence.schema.json +0 -38
  69. package/consumer-reference/schema/evidence-record.schema.json +0 -81
  70. package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
  71. package/consumer-reference/schema/item.schema.json +0 -188
  72. package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
  73. package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
  74. package/consumer-reference/schema/portable-tokens.schema.json +0 -104
  75. package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
  76. package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
  77. package/consumer-reference/schema/visual-evidence.schema.json +0 -31
  78. package/design-engineering/consumer-migration-readiness.md +0 -124
  79. package/design-engineering/interface-craft.md +0 -107
  80. package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
  81. package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
  82. package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
  83. package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
  84. package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
  85. package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
  86. package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
  87. package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
  88. package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
  89. package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
  90. package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
  91. package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
  92. package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
  93. package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
  94. package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
  95. package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
  96. package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
  97. package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
  98. package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
  99. package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
  100. package/game-ui/classification.md +0 -82
  101. package/game-ui/reference-record.md +0 -62
  102. package/game-ui/screen-hierarchy.md +0 -107
  103. package/game-ui/unity/architecture.md +0 -166
  104. package/game-ui/unity/cli-loop.md +0 -84
  105. package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
  106. package/game-ui/unity/org-wiki.md +0 -146
  107. package/game-ui/unity/repository-map.md +0 -102
  108. package/game-ui/unity/ui-systems.md +0 -85
  109. package/motion/practice-reference.md +0 -145
  110. package/motion/review-workflow.md +0 -86
  111. package/motion/vocabulary.md +0 -82
  112. package/platform-guides/apple-interaction.md +0 -89
  113. package/scripts/agent-native/events.mjs +0 -113
  114. package/scripts/agent-native/immutable-store.mjs +0 -102
  115. package/scripts/artifact-metadata.mjs +0 -20
  116. package/scripts/audit-evidence-freshness.mjs +0 -308
  117. package/scripts/baseline-contract.mjs +0 -189
  118. package/scripts/baseline-schema-parity.mjs +0 -40
  119. package/scripts/build-reference-artifacts.mjs +0 -127
  120. package/scripts/calibration-raw-contract.mjs +0 -172
  121. package/scripts/capture-session-contract.mjs +0 -187
  122. package/scripts/component-state-artifact-fixture.mjs +0 -44
  123. package/scripts/component-state-contract.mjs +0 -99
  124. package/scripts/component-state-semantics.mjs +0 -128
  125. package/scripts/component-state-workflow-contract.mjs +0 -67
  126. package/scripts/component-state-workflow-negative-cases.mjs +0 -64
  127. package/scripts/consumer-conformance-contract.mjs +0 -198
  128. package/scripts/consumer-evidence-governance-contract.mjs +0 -210
  129. package/scripts/consumer-reference-case-runner.mjs +0 -93
  130. package/scripts/consumer-reference-schema.mjs +0 -155
  131. package/scripts/create-component-state-session.mjs +0 -100
  132. package/scripts/create-page-evidence-session.mjs +0 -139
  133. package/scripts/domain-document-boundaries.mjs +0 -40
  134. package/scripts/domain-validation-checks.mjs +0 -141
  135. package/scripts/evidence-artifact-contract.mjs +0 -191
  136. package/scripts/finalize-component-state-evidence.mjs +0 -165
  137. package/scripts/finalize-page-evidence.mjs +0 -197
  138. package/scripts/generate-consumer-reference-evidence.mjs +0 -154
  139. package/scripts/generate-patterns.mjs +0 -218
  140. package/scripts/governance-matrix-contract.mjs +0 -73
  141. package/scripts/governance-matrix-negative-cases.mjs +0 -114
  142. package/scripts/governance-policy-contract.mjs +0 -49
  143. package/scripts/governance-test-fixture.mjs +0 -321
  144. package/scripts/governance-workflow-negative-cases.mjs +0 -241
  145. package/scripts/governed-profile-registry.mjs +0 -125
  146. package/scripts/json-schema-formats.mjs +0 -31
  147. package/scripts/markdown-structure.mjs +0 -45
  148. package/scripts/page-artifact-metadata.mjs +0 -124
  149. package/scripts/page-evidence-contract.mjs +0 -297
  150. package/scripts/page-evidence-fixture.mjs +0 -271
  151. package/scripts/pattern-data.mjs +0 -325
  152. package/scripts/profile-record-contract.mjs +0 -140
  153. package/scripts/promotion-attestation-contract.mjs +0 -91
  154. package/scripts/promotion-boundary-test-contract.mjs +0 -92
  155. package/scripts/promotion-fixture-inventory.mjs +0 -109
  156. package/scripts/promotion-governance-contract.mjs +0 -28
  157. package/scripts/reference-artifact-path-contract.mjs +0 -28
  158. package/scripts/reference-profile-contract.mjs +0 -114
  159. package/scripts/reference-token-contract.mjs +0 -156
  160. package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
  161. package/scripts/summarize-sentinel-calibration.mjs +0 -98
  162. package/scripts/test-agent-adapter-conformance.mjs +0 -250
  163. package/scripts/test-agent-conformance-receipt.mjs +0 -106
  164. package/scripts/test-agent-events.mjs +0 -81
  165. package/scripts/test-agent-execution-effects.mjs +0 -114
  166. package/scripts/test-agent-execution-fixtures.mjs +0 -140
  167. package/scripts/test-agent-execution-kernel.mjs +0 -39
  168. package/scripts/test-agent-execution-learning.mjs +0 -130
  169. package/scripts/test-agent-execution-lifecycle.mjs +0 -143
  170. package/scripts/test-agent-execution-safety.mjs +0 -158
  171. package/scripts/test-agent-execution-views.mjs +0 -117
  172. package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
  173. package/scripts/test-agent-knowledge-kernel.mjs +0 -183
  174. package/scripts/test-agent-learning.mjs +0 -246
  175. package/scripts/test-agent-mcp.mjs +0 -246
  176. package/scripts/test-agent-native-schemas.mjs +0 -215
  177. package/scripts/test-agent-projections.mjs +0 -249
  178. package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
  179. package/scripts/test-agent-registry-mutations.mjs +0 -110
  180. package/scripts/test-audit-evidence-freshness.mjs +0 -177
  181. package/scripts/test-component-state-sentinel.mjs +0 -35
  182. package/scripts/test-component-state-source-contract.mjs +0 -83
  183. package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
  184. package/scripts/test-consumer-reference-sentinel.mjs +0 -31
  185. package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
  186. package/scripts/test-json-cli-output.mjs +0 -151
  187. package/scripts/test-json-schema-formats.mjs +0 -40
  188. package/scripts/test-reference-adapters.mjs +0 -199
  189. package/scripts/test-renderer-purity.mjs +0 -34
  190. package/scripts/test-sg-cli.mjs +0 -129
  191. package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
  192. package/scripts/test-validate-baseline-manifest.mjs +0 -234
  193. package/scripts/test-validate-component-state-artifacts.mjs +0 -243
  194. package/scripts/test-validate-component-state.mjs +0 -106
  195. package/scripts/test-validate-consumer-conformance.mjs +0 -427
  196. package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
  197. package/scripts/test-validate-consumer-reference.mjs +0 -263
  198. package/scripts/test-validate-domains.mjs +0 -357
  199. package/scripts/test-validate-governance.mjs +0 -292
  200. package/scripts/test-validate-ia.mjs +0 -262
  201. package/scripts/test-validate-okf.mjs +0 -73
  202. package/scripts/test-validate-page-evidence.mjs +0 -302
  203. package/scripts/test-validate-patterns.mjs +0 -157
  204. package/scripts/test-validate-promotion-rfc.mjs +0 -250
  205. package/scripts/test-validate-reference-profiles.mjs +0 -170
  206. package/scripts/test-validate-unity-org-wiki.mjs +0 -57
  207. package/scripts/test-validate-unity-source-contracts.mjs +0 -67
  208. package/scripts/test-validate-vocabulary.mjs +0 -174
  209. package/scripts/test-validate-webpage-workflow.mjs +0 -293
  210. package/scripts/validate-baseline-manifest.mjs +0 -44
  211. package/scripts/validate-catalog.mjs +0 -65
  212. package/scripts/validate-component-state.mjs +0 -141
  213. package/scripts/validate-consumer-conformance.mjs +0 -477
  214. package/scripts/validate-consumer-reference.mjs +0 -288
  215. package/scripts/validate-domains.mjs +0 -237
  216. package/scripts/validate-governance.mjs +0 -248
  217. package/scripts/validate-ia.mjs +0 -136
  218. package/scripts/validate-links.mjs +0 -66
  219. package/scripts/validate-okf.mjs +0 -104
  220. package/scripts/validate-page-evidence.mjs +0 -191
  221. package/scripts/validate-patterns.mjs +0 -246
  222. package/scripts/validate-promotion-rfc.mjs +0 -224
  223. package/scripts/validate-reference-artifacts.mjs +0 -125
  224. package/scripts/validate-renderer-purity.mjs +0 -56
  225. package/scripts/validate-unity-org-wiki.mjs +0 -146
  226. package/scripts/validate-unity-source-contracts.mjs +0 -107
  227. package/scripts/validate-vocabulary.mjs +0 -115
  228. package/scripts/validate-webpage-workflow.mjs +0 -254
  229. package/scripts/visual-expectation-contract.mjs +0 -20
  230. package/scripts/workflow-action-contract.mjs +0 -163
@@ -1,246 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * MCP adapter contract harness.
5
- *
6
- * This is deliberately an in-memory test: it exercises the official stable
7
- * MCP SDK's initialize/list/read/call path without making stdio, network, or
8
- * filesystem state part of the proof. The StyleGallery adapter remains the
9
- * only domain implementation under test.
10
- */
11
-
12
- function parseTextContent(response) {
13
- const text = response?.content?.find((item) => item?.type === "text")?.text;
14
- if (typeof text !== "string") return null;
15
- try {
16
- return JSON.parse(text);
17
- } catch {
18
- return text;
19
- }
20
- }
21
-
22
- function responseEnvelope(response) {
23
- if (response?.structuredContent && typeof response.structuredContent === "object") {
24
- return response.structuredContent;
25
- }
26
- return parseTextContent(response);
27
- }
28
-
29
- function result(name, expected, actual, ok) {
30
- return { actual, expected, name, ok };
31
- }
32
-
33
- function denialObserved(error, response) {
34
- if (error) {
35
- const code = error?.code ?? error?.data?.code;
36
- const message = String(error?.message ?? error);
37
- return {
38
- code,
39
- message,
40
- observed: ["-32601", "-32602", "method_not_found", "operation_not_exposed", "read_only_denied"]
41
- .some((item) => String(code) === item || message.toLowerCase().includes(item.replaceAll("_", " ")))
42
- || /unknown|not found|not exposed|read.?only|proposal/i.test(message),
43
- };
44
- }
45
- const envelope = responseEnvelope(response);
46
- const codes = Array.isArray(envelope?.failures)
47
- ? envelope.failures.map((item) => item?.code).filter((item) => typeof item === "string")
48
- : [];
49
- const message = typeof envelope === "string"
50
- ? envelope
51
- : String(response?.content?.find((item) => item?.type === "text")?.text ?? "");
52
- const protocolCode = message.match(/-326\d+/)?.[0] ?? null;
53
- const codeDenied = codes.some((code) => /denied|not.?exposed|not.?found|read.?only|unknown/i.test(code));
54
- const messageDenied = /unknown|not found|not exposed|read.?only|proposal|(-32601)|(-32602)/i.test(message);
55
- return {
56
- code: codes[0] ?? protocolCode,
57
- message,
58
- isError: response?.isError === true,
59
- observed: response?.isError === true && (codeDenied || messageDenied),
60
- };
61
- }
62
-
63
- async function importDependencies(results) {
64
- let sdk;
65
- try {
66
- sdk = {
67
- ...(await import("@modelcontextprotocol/sdk/server/mcp.js")),
68
- ...(await import("@modelcontextprotocol/sdk/client/index.js")),
69
- ...(await import("@modelcontextprotocol/sdk/inMemory.js")),
70
- };
71
- } catch (error) {
72
- results.push(result(
73
- "stable_sdk_available",
74
- "official @modelcontextprotocol/sdk v1 can be imported",
75
- { code: "mcp_sdk_unavailable", error: error instanceof Error ? error.message : String(error) },
76
- false,
77
- ));
78
- return null;
79
- }
80
- results.push(result(
81
- "stable_sdk_available",
82
- "official McpServer, Client, and InMemoryTransport exports are available",
83
- { exports: ["McpServer", "Client", "InMemoryTransport"].filter((name) => typeof sdk[name] === "function") },
84
- typeof sdk.McpServer === "function" && typeof sdk.Client === "function" && typeof sdk.InMemoryTransport?.createLinkedPair === "function",
85
- ));
86
- if (typeof sdk.McpServer !== "function" || typeof sdk.Client !== "function" || typeof sdk.InMemoryTransport?.createLinkedPair !== "function") return null;
87
- return sdk;
88
- }
89
-
90
- async function importAdapter(results) {
91
- try {
92
- const adapter = await import("./agent-native/mcp-adapter.mjs");
93
- const factory = adapter.createStyleGalleryMcpServer ?? adapter.createMcpServer;
94
- results.push(result(
95
- "adapter_factory_available",
96
- "mcp-adapter exports createStyleGalleryMcpServer",
97
- { exports: Object.keys(adapter).sort() },
98
- typeof factory === "function",
99
- ));
100
- return factory;
101
- } catch (error) {
102
- results.push(result(
103
- "adapter_factory_available",
104
- "mcp-adapter exports createStyleGalleryMcpServer",
105
- { code: "mcp_adapter_unavailable", error: error instanceof Error ? error.message : String(error) },
106
- false,
107
- ));
108
- return null;
109
- }
110
- }
111
-
112
- async function main() {
113
- const results = [];
114
- const sdk = await importDependencies(results);
115
- const createServer = await importAdapter(results);
116
- if (!sdk || !createServer) {
117
- const report = { ok: false, results };
118
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
119
- process.exitCode = 1;
120
- return;
121
- }
122
-
123
- const server = await createServer();
124
- const [clientTransport, serverTransport] = sdk.InMemoryTransport.createLinkedPair();
125
- const client = new sdk.Client({ name: "stylegallery-mcp-conformance", version: "1.0.0" });
126
- try {
127
- await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]);
128
- const capabilities = client.getServerCapabilities?.() ?? {};
129
- results.push(result(
130
- "initialize_capability_negotiation",
131
- "initialized client/server expose resources and tools",
132
- { capabilities },
133
- Boolean(capabilities && typeof capabilities === "object"
134
- && capabilities.resources && capabilities.tools),
135
- ));
136
-
137
- const listedTools = await client.listTools();
138
- const toolNames = (listedTools?.tools ?? []).map((item) => item?.name).filter((item) => typeof item === "string").sort();
139
- const expectedTools = ["claims", "context", "discover", "ops", "resolve", "retrieve"];
140
- results.push(result(
141
- "read_only_tool_allowlist",
142
- "exactly the six public read operations are advertised",
143
- { toolNames, expectedTools },
144
- expectedTools.every((name) => toolNames.includes(name))
145
- && toolNames.length === expectedTools.length
146
- && !toolNames.some((name) => /proposal|promote|decide|reconcile|write|delete|execute/i.test(name)),
147
- ));
148
-
149
- const listedResources = await client.listResources();
150
- const resourceUris = (listedResources?.resources ?? []).map((item) => item?.uri).filter((item) => typeof item === "string").sort();
151
- const expectedResources = ["sg://manifest", "sg://self"];
152
- results.push(result(
153
- "read_only_resource_catalog",
154
- "sg://self and sg://manifest are advertised as immutable resources",
155
- { resourceUris, expectedResources },
156
- expectedResources.every((uri) => resourceUris.includes(uri)),
157
- ));
158
-
159
- for (const uri of expectedResources) {
160
- let response;
161
- try {
162
- response = await client.readResource({ uri });
163
- const contents = response?.contents ?? [];
164
- const text = contents.find((item) => item?.uri === uri)?.text;
165
- let parsed = null;
166
- try { parsed = JSON.parse(text); } catch { /* structured resource text is checked below */ }
167
- results.push(result(
168
- `read_resource_${uri.slice("sg://".length)}`,
169
- "one JSON resource content with the requested immutable URI",
170
- { contents: contents.length, parsedType: parsed === null ? typeof text : typeof parsed, response },
171
- contents.length > 0 && typeof text === "string" && text.length > 0 && parsed !== null && typeof parsed === "object",
172
- ));
173
- } catch (error) {
174
- results.push(result(
175
- `read_resource_${uri.slice("sg://".length)}`,
176
- "resource/read succeeds over the official SDK",
177
- { code: "resource_read_failed", error: error instanceof Error ? error.message : String(error) },
178
- false,
179
- ));
180
- }
181
- }
182
-
183
- for (const name of ["discover", "ops"]) {
184
- try {
185
- const response = await client.callTool({ name, arguments: {} });
186
- const envelope = responseEnvelope(response);
187
- results.push(result(
188
- `call_read_tool_${name}`,
189
- "tools/call returns a successful structured domain envelope",
190
- { response, envelope },
191
- response?.isError !== true && envelope?.ok === true && envelope?.operation === name && envelope?.result && typeof envelope.result === "object",
192
- ));
193
- } catch (error) {
194
- results.push(result(
195
- `call_read_tool_${name}`,
196
- "tools/call returns a successful structured domain envelope",
197
- { code: "tool_call_failed", error: error instanceof Error ? error.message : String(error) },
198
- false,
199
- ));
200
- }
201
- }
202
-
203
- let denial;
204
- try {
205
- const response = await client.callTool({ name: "proposal.create", arguments: {} });
206
- denial = denialObserved(null, response);
207
- } catch (error) {
208
- denial = denialObserved(error, null);
209
- }
210
- results.push(result(
211
- "mutating_tool_denied",
212
- "a mutating operation is not exposed and is denied by the read-only MCP surface",
213
- denial,
214
- denial.observed === true,
215
- ));
216
- } catch (error) {
217
- results.push(result(
218
- "sdk_round_trip",
219
- "MCP initialize/list/read/call completes without transport failure",
220
- { code: "mcp_round_trip_failed", error: error instanceof Error ? error.message : String(error) },
221
- false,
222
- ));
223
- } finally {
224
- await client.close().catch(() => {});
225
- const closed = server.close?.();
226
- if (closed && typeof closed.catch === "function") await closed.catch(() => {});
227
- }
228
-
229
- const report = { ok: results.every((item) => item.ok), results };
230
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
231
- process.exitCode = report.ok ? 0 : 1;
232
- }
233
-
234
- await main().catch((error) => {
235
- const report = {
236
- ok: false,
237
- results: [result(
238
- "mcp_harness_runtime",
239
- "harness emits structured JSON instead of crashing",
240
- { code: "mcp_harness_runtime", error: error instanceof Error ? error.message : String(error) },
241
- false,
242
- )],
243
- };
244
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
245
- process.exitCode = 1;
246
- });
@@ -1,215 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import assert from "node:assert/strict";
4
- import fs from "node:fs";
5
- import path from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import Ajv2020 from "ajv/dist/2020.js";
8
- import addFormats from "ajv-formats";
9
-
10
- import { agentNativeFixture } from "./agent-native/fixture.mjs";
11
- import {
12
- authorizeOperation,
13
- createReceipt,
14
- createTask,
15
- defineOperation,
16
- recordEffectAttempt,
17
- startRun,
18
- } from "./agent-native/execution.mjs";
19
- import { appendEvent } from "./agent-native/events.mjs";
20
- import {
21
- createClaim,
22
- createEvidenceLink,
23
- createGovernanceDecision,
24
- createValidationReport,
25
- } from "./agent-native/knowledge.mjs";
26
- import {
27
- createProposal,
28
- decideProposal,
29
- promoteProposal,
30
- verifyProposal,
31
- } from "./agent-native/learning.mjs";
32
- import { buildContextPackage, buildViewSnapshot } from "./agent-native/retrieval.mjs";
33
- import { createAgentCard } from "./agent-native/a2a-projection.mjs";
34
- import { projectAgUiEvents } from "./agent-native/agui-projection.mjs";
35
- import { agentNativeRegistry } from "./agent-native/registry.mjs";
36
-
37
- const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
38
- const schemaDirectory = path.join(root, "consumer-reference", "agent-native", "schema");
39
- const rootSchema = JSON.parse(fs.readFileSync(path.join(schemaDirectory, "agent-native.schema.json"), "utf8"));
40
- const ajv = new Ajv2020({ allErrors: true, strict: true, strictRequired: false });
41
- addFormats(ajv);
42
- ajv.addSchema(rootSchema);
43
-
44
- const wrapperNames = ["identity", "manifest", "epistemic", "operation", "execution", "protocol-binding", "retrieval", "learning"];
45
- for (const name of wrapperNames) {
46
- const schema = JSON.parse(fs.readFileSync(path.join(schemaDirectory, `${name}.schema.json`), "utf8"));
47
- ajv.addSchema(schema);
48
- }
49
-
50
- const rows = [];
51
- function validator(name) {
52
- const fn = ajv.getSchema(`${rootSchema.$id}#/$defs/${name}`);
53
- assert.equal(typeof fn, "function", `missing validator for ${name}`);
54
- return fn;
55
- }
56
-
57
- function valid(name, schemaName, value) {
58
- const fn = validator(schemaName);
59
- const ok = fn(value);
60
- rows.push({ name, schema: schemaName, ok, errors: ok ? [] : fn.errors });
61
- assert.equal(ok, true, `${name} did not satisfy ${schemaName}: ${JSON.stringify(fn.errors)}`);
62
- }
63
-
64
- function invalid(name, schemaName, value) {
65
- const fn = validator(schemaName);
66
- const ok = fn(value);
67
- rows.push({ name, schema: schemaName, ok: !ok, errors: ok ? [] : fn.errors });
68
- assert.equal(ok, false, `${name} unexpectedly satisfied ${schemaName}`);
69
- }
70
-
71
- function fixtureSchema(recordKind) {
72
- return {
73
- artifact_projection: "artifactProjection",
74
- executable_fixture: "executableFixture",
75
- profile_projection: "profileProjection",
76
- agent_description: "agentDescription",
77
- validator: "validator",
78
- execution_receipt: "executionReceipt",
79
- conformance_profile: "conformanceProfile",
80
- claim: "claim",
81
- evidence_link: "evidenceLink",
82
- validation_report: "validationReport",
83
- governance_decision: "governanceDecision",
84
- policy_disposition: "policyDisposition",
85
- operation: "operationSpec",
86
- }[recordKind];
87
- }
88
-
89
- function buildSamples() {
90
- const claim = createClaim({
91
- actor: "sg:agent/schema-fixture",
92
- stable_ref: "sg:claim/schema-fixture",
93
- statement: "Closed schemas reject undeclared fields.",
94
- subject_ref: "sg:profile/editorial-reference-profile",
95
- });
96
- const evidence = createEvidenceLink({
97
- claim_ref: claim.stable_ref,
98
- claim_version: claim.version_id,
99
- independence_group: "schema-fixture",
100
- polarity: "SUPPORT",
101
- source_ref: "sg:artifact/schema-fixture",
102
- stable_ref: "sg:evidence/schema-fixture",
103
- });
104
- const validation = createValidationReport({
105
- claim_ref: claim.stable_ref,
106
- claim_version: claim.version_id,
107
- stable_ref: "sg:validation/schema-fixture",
108
- status: "PASS",
109
- suite: "schema-fixture",
110
- validator_ref: "sg:validator/schema-fixture",
111
- validator_version: "schema-validator@1",
112
- });
113
- const governance = createGovernanceDecision({
114
- actor: "sg:governor/schema-fixture",
115
- claim_ref: claim.stable_ref,
116
- claim_version: claim.version_id,
117
- decision: "ACCEPT",
118
- policy_version: "schema-policy@1",
119
- stable_ref: "sg:governance/schema-fixture",
120
- });
121
- const operation = defineOperation({
122
- adapters: ["cli", "mcp"],
123
- description: "Schema fixture operation.",
124
- effect_class: "NONE",
125
- input_schema: { additionalProperties: false, type: "object" },
126
- name: "schema-fixture",
127
- output_schema: { type: "object" },
128
- required_capability: null,
129
- stable_ref: "sg:operation/schema-fixture",
130
- });
131
- const grant = {
132
- capability: "wiki.read",
133
- operations: ["schema-fixture"],
134
- resource_scope: ["sg:profile/*"],
135
- subject: "agent:schema-fixture",
136
- };
137
- const authorization = authorizeOperation({
138
- grant,
139
- now: "2099-01-01T00:00:00.000Z",
140
- operation,
141
- resource: "sg:profile/editorial-reference-profile",
142
- subject: "agent:schema-fixture",
143
- });
144
- const task = createTask({ intent: { operation: operation.name }, required_result: {}, stable_ref: "sg:task/schema-fixture" });
145
- const run = startRun({ input: {}, run_id: "sg:run/schema-fixture", task });
146
- const effect = recordEffectAttempt({ effect_class: "LOCAL", effect_id: "sg:effect/schema-fixture", run, task });
147
- const receipt = createReceipt({ effects: [effect], input: {}, operation, output: {}, run, task, policy_decision: authorization.decision });
148
- const event = appendEvent({ event: { event_id: "sg:event/schema-fixture", parents: [], payload: { task_id: task.task_id }, type: "task.created" }, events: [] })[0];
149
- const snapshot = buildViewSnapshot({ heads: [event.event_id], members: [claim], snapshot_ref: "sg:view/schema-fixture", view_spec: { query: "schema" } });
150
- const context = buildContextPackage({ budget: { tokens: 128 }, members: [claim], query: "schema", snapshot });
151
- const proposal = createProposal({
152
- changes: [{ path: "claim.statement", value: "A governed change." }],
153
- claim: { stable_ref: claim.stable_ref, statement: claim.statement },
154
- evidence: [evidence],
155
- proposer: "agent:proposer",
156
- stable_ref: "sg:proposal/schema-fixture",
157
- validation: { status: "PASS", validator: "agent:validator" },
158
- });
159
- const proposalEvidence = proposal.evidence.map(({ version_id: _version_id, ...item }) => item);
160
- const proposalValidation = (({ version_id: _version_id, ...item }) => item)(proposal.validation);
161
- const verification = verifyProposal({ evidence: proposalEvidence, proposal, validation: proposalValidation, verifier: "agent:verifier" });
162
- const decision = decideProposal({ decision: "ACCEPT", governance_decision: { actor: "agent:governor", decision: "ACCEPT" }, proposal, verification });
163
- const promotion = promoteProposal({ decision, proposal, verification });
164
- return { claim, evidence, validation, governance, operation, grant, authorization, task, run, effect, receipt, event, snapshot, context, proposal, verification, decision, promotion, card: createAgentCard(), agui: projectAgUiEvents({ task, run, text: "schema", toolCall: { id: "schema-tool", name: operation.name }, state: snapshot }) };
165
- }
166
-
167
- function run() {
168
- valid("fixture manifest is closed", "manifest", agentNativeFixture.manifest);
169
- for (const record of agentNativeFixture.records) {
170
- const schemaName = fixtureSchema(record.record_kind);
171
- assert.ok(schemaName, `fixture record kind ${record.record_kind} has no closed schema`);
172
- valid(`fixture ${record.stable_ref}`, schemaName, record);
173
- }
174
- const sample = buildSamples();
175
- const wrapperSamples = {
176
- identity: sample.claim.stable_ref,
177
- manifest: agentNativeFixture.manifest,
178
- epistemic: sample.claim,
179
- operation: sample.operation,
180
- execution: sample.task,
181
- "protocol-binding": { protocol: "a2a", protocolBindingId: "sg:binding/schema-fixture" },
182
- retrieval: sample.snapshot,
183
- learning: sample.proposal,
184
- };
185
- for (const name of wrapperNames) {
186
- const fn = ajv.getSchema(`https://stylegallery.local/consumer-reference/agent-native/schema/${name}.schema.json`);
187
- assert.equal(typeof fn, "function", `missing wrapper validator ${name}`);
188
- const ok = fn(wrapperSamples[name]);
189
- rows.push({ name: `wrapper ${name}`, schema: `${name}.schema.json`, ok, errors: ok ? [] : fn.errors });
190
- assert.equal(ok, true, `wrapper ${name} rejected its representative value: ${JSON.stringify(fn.errors)}`);
191
- }
192
- for (const [name, schemaName] of Object.entries({ claim: "claim", evidence: "evidenceLink", validation: "validationReport", governance: "governanceDecision", operation: "operationSpec", grant: "capabilityGrant", authorization: "authorizationResult", task: "task", run: "run", effect: "effect", receipt: "invocationReceipt", event: "event", snapshot: "viewSnapshot", context: "contextPackage", proposal: "learningProposal", verification: "learningVerification", decision: "governanceDecision", promotionVersion: "governedVersion", promotionReceipt: "promotionReceipt", card: "agentCard", agui: "aguiProjection" })) valid(`generated ${name}`, schemaName, name === "promotionVersion" ? sample.promotion.version : name === "promotionReceipt" ? sample.promotion.receipt : sample[name]);
193
- valid("generated A2A binding", "protocolBinding", sample.card ? { protocol: "a2a", protocolBindingId: "sg:binding/schema-fixture" } : {});
194
- valid("generated self-description", "selfDescription", agentNativeRegistry.selfDescription);
195
- invalid("manifest unknown property is rejected", "manifest", { ...agentNativeFixture.manifest, unexpected: true });
196
- invalid("claim unknown property is rejected", "claim", { ...sample.claim, unexpected: true });
197
- invalid("malformed StableRef is rejected", "claim", { ...sample.claim, stable_ref: "claim/schema-fixture" });
198
- invalid("malformed VersionID is rejected", "claim", { ...sample.claim, version_id: `${sample.claim.stable_ref}@sha256:${"0".repeat(63)}z` });
199
- return rows;
200
- }
201
-
202
- if (process.argv.slice(2).some((arg) => arg !== "--json")) {
203
- process.stdout.write(`${JSON.stringify({ ok: false, status: "RED", failures: [{ code: "argument_unknown" }], results: [] }, null, 2)}\n`);
204
- process.exitCode = 1;
205
- } else {
206
- try {
207
- const results = run();
208
- const report = { contract: "agent-native-closed-schemas", ok: true, results };
209
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
210
- } catch (error) {
211
- const report = { contract: "agent-native-closed-schemas", ok: false, results: rows, failure: { message: error instanceof Error ? error.message : String(error) } };
212
- process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
213
- process.exitCode = 1;
214
- }
215
- }