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.
- package/AGENTS.md +4 -1
- package/DOMAINS.md +2 -6
- package/GOVERNANCE.md +10 -9
- package/README.md +29 -127
- package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
- package/consumer-reference/agent-native/v2/material-registry.json +1 -0
- package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
- package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
- package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
- package/consumer-reference/contract.md +1 -1
- package/consumer-reference/index.md +5 -3
- package/layout/index.md +124 -0
- package/log.md +57 -0
- package/package.json +183 -22
- package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
- package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
- package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
- package/scripts/agent-native/v2/material-admission.mjs +295 -0
- package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
- package/scripts/agent-native/v2/material-context.mjs +251 -0
- package/scripts/agent-native/v2/material-identity.mjs +71 -0
- package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
- package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
- package/scripts/agent-native/v2/material-queries.mjs +398 -0
- package/scripts/agent-native/v2/material-registry.mjs +319 -0
- package/scripts/sg-material-mcp.mjs +98 -0
- package/scripts/sg-material.mjs +27 -0
- package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
- package/consumer-reference/baselines/calibration.json +0 -260
- package/consumer-reference/baselines/manifest.json +0 -21
- package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
- package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
- package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
- package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
- package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
- package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
- package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
- package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
- package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
- package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
- package/consumer-reference/fixtures/promotion/manifest.json +0 -15
- package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
- package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
- package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
- package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
- package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
- package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
- package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
- package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
- package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
- package/consumer-reference/fixtures/valid-deprecated.json +0 -21
- package/consumer-reference/fixtures/valid-experimental.json +0 -19
- package/consumer-reference/generated/manifest.json +0 -40
- package/consumer-reference/generated/tokens.css +0 -12
- package/consumer-reference/policies/shared-experimental.json +0 -37
- package/consumer-reference/schema/ax-evidence.schema.json +0 -30
- package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
- package/consumer-reference/schema/calibration-record.schema.json +0 -190
- package/consumer-reference/schema/capture-session.schema.json +0 -161
- package/consumer-reference/schema/component-state.schema.json +0 -150
- package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
- package/consumer-reference/schema/dom-evidence.schema.json +0 -38
- package/consumer-reference/schema/evidence-record.schema.json +0 -81
- package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
- package/consumer-reference/schema/item.schema.json +0 -188
- package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
- package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
- package/consumer-reference/schema/portable-tokens.schema.json +0 -104
- package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
- package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
- package/consumer-reference/schema/visual-evidence.schema.json +0 -31
- package/design-engineering/consumer-migration-readiness.md +0 -124
- package/design-engineering/interface-craft.md +0 -107
- package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
- package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
- package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
- package/game-ui/classification.md +0 -82
- package/game-ui/reference-record.md +0 -62
- package/game-ui/screen-hierarchy.md +0 -107
- package/game-ui/unity/architecture.md +0 -166
- package/game-ui/unity/cli-loop.md +0 -84
- package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
- package/game-ui/unity/org-wiki.md +0 -146
- package/game-ui/unity/repository-map.md +0 -102
- package/game-ui/unity/ui-systems.md +0 -85
- package/motion/practice-reference.md +0 -145
- package/motion/review-workflow.md +0 -86
- package/motion/vocabulary.md +0 -82
- package/platform-guides/apple-interaction.md +0 -89
- package/scripts/agent-native/events.mjs +0 -113
- package/scripts/agent-native/immutable-store.mjs +0 -102
- package/scripts/artifact-metadata.mjs +0 -20
- package/scripts/audit-evidence-freshness.mjs +0 -308
- package/scripts/baseline-contract.mjs +0 -189
- package/scripts/baseline-schema-parity.mjs +0 -40
- package/scripts/build-reference-artifacts.mjs +0 -127
- package/scripts/calibration-raw-contract.mjs +0 -172
- package/scripts/capture-session-contract.mjs +0 -187
- package/scripts/component-state-artifact-fixture.mjs +0 -44
- package/scripts/component-state-contract.mjs +0 -99
- package/scripts/component-state-semantics.mjs +0 -128
- package/scripts/component-state-workflow-contract.mjs +0 -67
- package/scripts/component-state-workflow-negative-cases.mjs +0 -64
- package/scripts/consumer-conformance-contract.mjs +0 -198
- package/scripts/consumer-evidence-governance-contract.mjs +0 -210
- package/scripts/consumer-reference-case-runner.mjs +0 -93
- package/scripts/consumer-reference-schema.mjs +0 -155
- package/scripts/create-component-state-session.mjs +0 -100
- package/scripts/create-page-evidence-session.mjs +0 -139
- package/scripts/domain-document-boundaries.mjs +0 -40
- package/scripts/domain-validation-checks.mjs +0 -141
- package/scripts/evidence-artifact-contract.mjs +0 -191
- package/scripts/finalize-component-state-evidence.mjs +0 -165
- package/scripts/finalize-page-evidence.mjs +0 -197
- package/scripts/generate-consumer-reference-evidence.mjs +0 -154
- package/scripts/generate-patterns.mjs +0 -218
- package/scripts/governance-matrix-contract.mjs +0 -73
- package/scripts/governance-matrix-negative-cases.mjs +0 -114
- package/scripts/governance-policy-contract.mjs +0 -49
- package/scripts/governance-test-fixture.mjs +0 -321
- package/scripts/governance-workflow-negative-cases.mjs +0 -241
- package/scripts/governed-profile-registry.mjs +0 -125
- package/scripts/json-schema-formats.mjs +0 -31
- package/scripts/markdown-structure.mjs +0 -45
- package/scripts/page-artifact-metadata.mjs +0 -124
- package/scripts/page-evidence-contract.mjs +0 -297
- package/scripts/page-evidence-fixture.mjs +0 -271
- package/scripts/pattern-data.mjs +0 -325
- package/scripts/profile-record-contract.mjs +0 -140
- package/scripts/promotion-attestation-contract.mjs +0 -91
- package/scripts/promotion-boundary-test-contract.mjs +0 -92
- package/scripts/promotion-fixture-inventory.mjs +0 -109
- package/scripts/promotion-governance-contract.mjs +0 -28
- package/scripts/reference-artifact-path-contract.mjs +0 -28
- package/scripts/reference-profile-contract.mjs +0 -114
- package/scripts/reference-token-contract.mjs +0 -156
- package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
- package/scripts/summarize-sentinel-calibration.mjs +0 -98
- package/scripts/test-agent-adapter-conformance.mjs +0 -250
- package/scripts/test-agent-conformance-receipt.mjs +0 -106
- package/scripts/test-agent-events.mjs +0 -81
- package/scripts/test-agent-execution-effects.mjs +0 -114
- package/scripts/test-agent-execution-fixtures.mjs +0 -140
- package/scripts/test-agent-execution-kernel.mjs +0 -39
- package/scripts/test-agent-execution-learning.mjs +0 -130
- package/scripts/test-agent-execution-lifecycle.mjs +0 -143
- package/scripts/test-agent-execution-safety.mjs +0 -158
- package/scripts/test-agent-execution-views.mjs +0 -117
- package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
- package/scripts/test-agent-knowledge-kernel.mjs +0 -183
- package/scripts/test-agent-learning.mjs +0 -246
- package/scripts/test-agent-mcp.mjs +0 -246
- package/scripts/test-agent-native-schemas.mjs +0 -215
- package/scripts/test-agent-projections.mjs +0 -249
- package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
- package/scripts/test-agent-registry-mutations.mjs +0 -110
- package/scripts/test-audit-evidence-freshness.mjs +0 -177
- package/scripts/test-component-state-sentinel.mjs +0 -35
- package/scripts/test-component-state-source-contract.mjs +0 -83
- package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
- package/scripts/test-consumer-reference-sentinel.mjs +0 -31
- package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
- package/scripts/test-json-cli-output.mjs +0 -151
- package/scripts/test-json-schema-formats.mjs +0 -40
- package/scripts/test-reference-adapters.mjs +0 -199
- package/scripts/test-renderer-purity.mjs +0 -34
- package/scripts/test-sg-cli.mjs +0 -129
- package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
- package/scripts/test-validate-baseline-manifest.mjs +0 -234
- package/scripts/test-validate-component-state-artifacts.mjs +0 -243
- package/scripts/test-validate-component-state.mjs +0 -106
- package/scripts/test-validate-consumer-conformance.mjs +0 -427
- package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
- package/scripts/test-validate-consumer-reference.mjs +0 -263
- package/scripts/test-validate-domains.mjs +0 -357
- package/scripts/test-validate-governance.mjs +0 -292
- package/scripts/test-validate-ia.mjs +0 -262
- package/scripts/test-validate-okf.mjs +0 -73
- package/scripts/test-validate-page-evidence.mjs +0 -302
- package/scripts/test-validate-patterns.mjs +0 -157
- package/scripts/test-validate-promotion-rfc.mjs +0 -250
- package/scripts/test-validate-reference-profiles.mjs +0 -170
- package/scripts/test-validate-unity-org-wiki.mjs +0 -57
- package/scripts/test-validate-unity-source-contracts.mjs +0 -67
- package/scripts/test-validate-vocabulary.mjs +0 -174
- package/scripts/test-validate-webpage-workflow.mjs +0 -293
- package/scripts/validate-baseline-manifest.mjs +0 -44
- package/scripts/validate-catalog.mjs +0 -65
- package/scripts/validate-component-state.mjs +0 -141
- package/scripts/validate-consumer-conformance.mjs +0 -477
- package/scripts/validate-consumer-reference.mjs +0 -288
- package/scripts/validate-domains.mjs +0 -237
- package/scripts/validate-governance.mjs +0 -248
- package/scripts/validate-ia.mjs +0 -136
- package/scripts/validate-links.mjs +0 -66
- package/scripts/validate-okf.mjs +0 -104
- package/scripts/validate-page-evidence.mjs +0 -191
- package/scripts/validate-patterns.mjs +0 -246
- package/scripts/validate-promotion-rfc.mjs +0 -224
- package/scripts/validate-reference-artifacts.mjs +0 -125
- package/scripts/validate-renderer-purity.mjs +0 -56
- package/scripts/validate-unity-org-wiki.mjs +0 -146
- package/scripts/validate-unity-source-contracts.mjs +0 -107
- package/scripts/validate-vocabulary.mjs +0 -115
- package/scripts/validate-webpage-workflow.mjs +0 -254
- package/scripts/visual-expectation-contract.mjs +0 -20
- 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
|
-
}
|