@glubean/sdk 0.2.1 → 0.2.3
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/dist/bootstrap-registry.d.ts +38 -0
- package/dist/bootstrap-registry.d.ts.map +1 -0
- package/dist/bootstrap-registry.js +54 -0
- package/dist/bootstrap-registry.js.map +1 -0
- package/dist/configure/http.d.ts +25 -0
- package/dist/configure/http.d.ts.map +1 -0
- package/dist/configure/http.js +88 -0
- package/dist/configure/http.js.map +1 -0
- package/dist/configure/index.d.ts +78 -0
- package/dist/configure/index.d.ts.map +1 -0
- package/dist/configure/index.js +78 -0
- package/dist/configure/index.js.map +1 -0
- package/dist/configure/plugin.d.ts +23 -0
- package/dist/configure/plugin.d.ts.map +1 -0
- package/dist/configure/plugin.js +81 -0
- package/dist/configure/plugin.js.map +1 -0
- package/dist/configure/runtime.d.ts +24 -0
- package/dist/configure/runtime.d.ts.map +1 -0
- package/dist/configure/runtime.js +45 -0
- package/dist/configure/runtime.js.map +1 -0
- package/dist/configure/template.d.ts +22 -0
- package/dist/configure/template.d.ts.map +1 -0
- package/dist/configure/template.js +34 -0
- package/dist/configure/template.js.map +1 -0
- package/dist/configure/vars.d.ts +20 -0
- package/dist/configure/vars.d.ts.map +1 -0
- package/dist/configure/vars.js +48 -0
- package/dist/configure/vars.js.map +1 -0
- package/dist/configure.d.ts +2 -133
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +2 -436
- package/dist/configure.js.map +1 -1
- package/dist/contract-artifacts.d.ts +268 -0
- package/dist/contract-artifacts.d.ts.map +1 -0
- package/dist/contract-artifacts.js +402 -0
- package/dist/contract-artifacts.js.map +1 -0
- package/dist/contract-core.d.ts +43 -1
- package/dist/contract-core.d.ts.map +1 -1
- package/dist/contract-core.js +376 -5
- package/dist/contract-core.js.map +1 -1
- package/dist/contract-http/adapter.d.ts +1 -7
- package/dist/contract-http/adapter.d.ts.map +1 -1
- package/dist/contract-http/adapter.js +221 -199
- package/dist/contract-http/adapter.js.map +1 -1
- package/dist/contract-http/factory.d.ts.map +1 -1
- package/dist/contract-http/factory.js +13 -14
- package/dist/contract-http/factory.js.map +1 -1
- package/dist/contract-http/index.d.ts +1 -0
- package/dist/contract-http/index.d.ts.map +1 -1
- package/dist/contract-http/index.js +1 -0
- package/dist/contract-http/index.js.map +1 -1
- package/dist/contract-http/openapi.d.ts +56 -7
- package/dist/contract-http/openapi.d.ts.map +1 -1
- package/dist/contract-http/openapi.js +371 -21
- package/dist/contract-http/openapi.js.map +1 -1
- package/dist/contract-http/types.d.ts +72 -24
- package/dist/contract-http/types.d.ts.map +1 -1
- package/dist/contract-http/types.js +45 -1
- package/dist/contract-http/types.js.map +1 -1
- package/dist/contract-types.d.ts +270 -30
- package/dist/contract-types.d.ts.map +1 -1
- package/dist/expect.d.ts +13 -0
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +18 -0
- package/dist/expect.js.map +1 -1
- package/dist/index.d.ts +57 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/dist/install-plugin.d.ts +94 -0
- package/dist/install-plugin.d.ts.map +1 -0
- package/dist/install-plugin.js +222 -0
- package/dist/install-plugin.js.map +1 -0
- package/dist/internal.d.ts +2 -0
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +8 -0
- package/dist/internal.js.map +1 -1
- package/dist/plugin.d.ts +45 -34
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +47 -34
- package/dist/plugin.js.map +1 -1
- package/dist/runner-input-channel.d.ts +95 -0
- package/dist/runner-input-channel.d.ts.map +1 -0
- package/dist/runner-input-channel.js +110 -0
- package/dist/runner-input-channel.js.map +1 -0
- package/dist/{test-builder.d.ts → test/builder.d.ts} +2 -2
- package/dist/test/builder.d.ts.map +1 -0
- package/dist/{test-builder.js → test/builder.js} +3 -3
- package/dist/{test-builder.js.map → test/builder.js.map} +1 -1
- package/dist/{each-builder.d.ts → test/each-builder.d.ts} +1 -1
- package/dist/test/each-builder.d.ts.map +1 -0
- package/dist/{each-builder.js → test/each-builder.js} +3 -3
- package/dist/test/each-builder.js.map +1 -0
- package/dist/{test-extend.d.ts → test/extend.d.ts} +3 -3
- package/dist/test/extend.d.ts.map +1 -0
- package/dist/{test-extend.js → test/extend.js} +5 -5
- package/dist/test/extend.js.map +1 -0
- package/dist/{test-utils.d.ts → test/utils.d.ts} +2 -2
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/{test-utils.js → test/utils.js} +1 -1
- package/dist/test/utils.js.map +1 -0
- package/dist/types.d.ts +78 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/contract-http/flow-helpers.d.ts +0 -12
- package/dist/contract-http/flow-helpers.d.ts.map +0 -1
- package/dist/contract-http/flow-helpers.js +0 -34
- package/dist/contract-http/flow-helpers.js.map +0 -1
- package/dist/contract-http/markdown.d.ts +0 -10
- package/dist/contract-http/markdown.d.ts.map +0 -1
- package/dist/contract-http/markdown.js +0 -21
- package/dist/contract-http/markdown.js.map +0 -1
- package/dist/each-builder.d.ts.map +0 -1
- package/dist/each-builder.js.map +0 -1
- package/dist/test-builder.d.ts.map +0 -1
- package/dist/test-extend.d.ts.map +0 -1
- package/dist/test-extend.js.map +0 -1
- package/dist/test-utils.d.ts.map +0 -1
- package/dist/test-utils.js.map +0 -1
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module contract-artifacts
|
|
3
|
+
*
|
|
4
|
+
* Contract artifact registry — declarative extension point for
|
|
5
|
+
* "contracts → X" rendering (markdown / openapi / future proto / sdl /
|
|
6
|
+
* asyncapi / ...).
|
|
7
|
+
*
|
|
8
|
+
* Replaces the v0.1 per-adapter `toMarkdown?` / `toOpenApi?` hooks which
|
|
9
|
+
* (a) polluted the generic `ContractProtocolAdapter` interface with
|
|
10
|
+
* protocol-specific artifacts (OpenAPI is HTTP-only), (b) had dead
|
|
11
|
+
* declarations that nothing called, and (c) gave consumers no way to
|
|
12
|
+
* enumerate "which artifact kinds does this project support".
|
|
13
|
+
*
|
|
14
|
+
* See `internal/40-discovery/proposals/contract-artifact-registry.md` (v6).
|
|
15
|
+
*
|
|
16
|
+
* ## Concepts
|
|
17
|
+
*
|
|
18
|
+
* **ArtifactKind**: first-class description of an output format (name +
|
|
19
|
+
* merge strategy + empty skeleton + optional defaultRender). Per-contract
|
|
20
|
+
* Part and final merged Final are independently typed (markdown renders
|
|
21
|
+
* structured parts that the merge assembles into a document; openapi
|
|
22
|
+
* renders per-contract partial documents that the merge stitches together).
|
|
23
|
+
*
|
|
24
|
+
* **ContractProtocolAdapter.artifacts**: each adapter declares which
|
|
25
|
+
* kinds it produces. Mapping from kind name to per-contract renderer.
|
|
26
|
+
*
|
|
27
|
+
* **Consumers**: `renderArtifact(kind, contracts, options?, control?)`
|
|
28
|
+
* dispatches across all registered adapters; fallback to kind.defaultRender
|
|
29
|
+
* where the adapter doesn't implement the kind; ultimate fallback to
|
|
30
|
+
* kind.empty when no contract contributes a part.
|
|
31
|
+
*
|
|
32
|
+
* ## Types
|
|
33
|
+
*
|
|
34
|
+
* `KnownArtifacts` / `KnownArtifactParts` / `KnownArtifactOptions` are
|
|
35
|
+
* declared at the package root (`packages/sdk/src/index.ts`) so third-
|
|
36
|
+
* party plugins can augment via `declare module "@glubean/sdk"`. This file
|
|
37
|
+
* imports them as types from the root so declaration merging hits the
|
|
38
|
+
* same node.
|
|
39
|
+
*/
|
|
40
|
+
import { getAdapter, listRegisteredProtocols, } from "./contract-core.js";
|
|
41
|
+
import { emptyOpenApiDocument, mergeOpenApiParts, } from "./contract-http/openapi.js";
|
|
42
|
+
// =============================================================================
|
|
43
|
+
// Kind registry
|
|
44
|
+
// =============================================================================
|
|
45
|
+
const _kinds = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* Register an artifact kind by name. Idempotent when re-registering the same
|
|
48
|
+
* kind object; throws when a different object tries to take the same name
|
|
49
|
+
* (protects against typo-level collisions across plugins).
|
|
50
|
+
*
|
|
51
|
+
* `defineArtifactKind` is the ergonomic entry; this is exported for advanced
|
|
52
|
+
* scenarios where a kind is built separately from its registration.
|
|
53
|
+
*/
|
|
54
|
+
export function registerArtifactKind(kind) {
|
|
55
|
+
const existing = _kinds.get(kind.name);
|
|
56
|
+
if (existing) {
|
|
57
|
+
if (existing !== kind) {
|
|
58
|
+
throw new Error(`Artifact kind "${kind.name}" already registered with a different instance. ` +
|
|
59
|
+
`Ensure each kind is defined exactly once per process.`);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
_kinds.set(kind.name, kind);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Look up a registered kind by name. Used by `renderArtifactByName` and any
|
|
67
|
+
* other string-driven consumer (CLI --format, MCP tool inputs, etc.).
|
|
68
|
+
*/
|
|
69
|
+
export function getArtifactKind(name) {
|
|
70
|
+
return _kinds.get(name);
|
|
71
|
+
}
|
|
72
|
+
/** List all registered kind names (insertion order). */
|
|
73
|
+
export function listArtifactKinds() {
|
|
74
|
+
return [..._kinds.keys()];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Define and register an artifact kind in one call. Preferred entry point
|
|
78
|
+
* for kind authors (SDK built-ins + first-party plugins).
|
|
79
|
+
*/
|
|
80
|
+
export function defineArtifactKind(spec) {
|
|
81
|
+
registerArtifactKind(spec);
|
|
82
|
+
return spec;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Test-only: clear the kind registry. Not exposed publicly; imported by
|
|
86
|
+
* `contract-artifacts.test.ts` via relative path.
|
|
87
|
+
*
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
export function __resetArtifactKindsForTesting() {
|
|
91
|
+
_kinds.clear();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Core render pipeline implementation — produces both a value and a
|
|
95
|
+
* detailed summary. `renderArtifact` is a thin wrapper returning just the
|
|
96
|
+
* value; `renderArtifactWithSummary` returns the full summary.
|
|
97
|
+
*
|
|
98
|
+
* Generic type `Final` / `Part` / `Options` instead of referring to the
|
|
99
|
+
* kind's generics directly so runtime-typed callers (renderArtifactByName)
|
|
100
|
+
* can pass `unknown`.
|
|
101
|
+
*/
|
|
102
|
+
function runRender(kind, contracts, options, control) {
|
|
103
|
+
const parts = [];
|
|
104
|
+
const contributions = [];
|
|
105
|
+
const skipped = [];
|
|
106
|
+
for (const c of contracts) {
|
|
107
|
+
const adapter = getAdapter(c.protocol);
|
|
108
|
+
const explicitProducer = !control?.preferDefaultRender
|
|
109
|
+
? adapter?.artifacts?.[kind.name]
|
|
110
|
+
: undefined;
|
|
111
|
+
if (explicitProducer) {
|
|
112
|
+
parts.push(explicitProducer(c, options));
|
|
113
|
+
contributions.push({
|
|
114
|
+
contractId: c.id,
|
|
115
|
+
protocol: c.protocol,
|
|
116
|
+
source: "explicit-producer",
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (kind.defaultRender) {
|
|
121
|
+
parts.push(kind.defaultRender(c, options));
|
|
122
|
+
contributions.push({
|
|
123
|
+
contractId: c.id,
|
|
124
|
+
protocol: c.protocol,
|
|
125
|
+
source: "default-render",
|
|
126
|
+
});
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
skipped.push({
|
|
130
|
+
contractId: c.id,
|
|
131
|
+
protocol: c.protocol,
|
|
132
|
+
reason: control?.preferDefaultRender
|
|
133
|
+
? "prefer-default-render-no-default"
|
|
134
|
+
: "no-producer-no-default-render",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (parts.length === 0) {
|
|
138
|
+
return {
|
|
139
|
+
value: kind.empty,
|
|
140
|
+
contributions,
|
|
141
|
+
skipped,
|
|
142
|
+
usedEmptyFallback: true,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
value: kind.merge(parts, options),
|
|
147
|
+
contributions,
|
|
148
|
+
skipped,
|
|
149
|
+
usedEmptyFallback: false,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Render an artifact of the given kind from a list of contracts. Threads
|
|
154
|
+
* `options` through the producer / defaultRender / merge pipeline. When no
|
|
155
|
+
* contract contributes a part, returns `kind.empty` (guaranteed valid
|
|
156
|
+
* `Final`).
|
|
157
|
+
*
|
|
158
|
+
* Strong-typed entry point: kind argument is a concrete `ArtifactKind<...>`
|
|
159
|
+
* object, so `options` type and return type are inferred at compile time.
|
|
160
|
+
*/
|
|
161
|
+
export function renderArtifact(kind, contracts, options, control) {
|
|
162
|
+
return runRender(kind, contracts, options, control).value;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Render an artifact and return the full summary (value + contributions +
|
|
166
|
+
* skipped + usedEmptyFallback). Use this when you need to distinguish
|
|
167
|
+
* "zero contribution" from "merged to kind.empty-shaped value" — the
|
|
168
|
+
* `usedEmptyFallback` field is the authoritative signal (do not compare
|
|
169
|
+
* `value === kind.empty` yourself for object-typed Final).
|
|
170
|
+
*/
|
|
171
|
+
export function renderArtifactWithSummary(kind, contracts, options, control) {
|
|
172
|
+
return runRender(kind, contracts, options, control);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Look up a kind by name and render. Used by string-driven consumers
|
|
176
|
+
* (CLI --format <name>, MCP tools, agent introspection). Throws when the
|
|
177
|
+
* name is not registered — the error message includes the list of
|
|
178
|
+
* registered kinds so callers can surface it without extra lookups.
|
|
179
|
+
*
|
|
180
|
+
* Returns `unknown` since we don't know the Final type statically;
|
|
181
|
+
* callers that need a typed return should use `renderArtifact` directly
|
|
182
|
+
* with the kind object they import.
|
|
183
|
+
*/
|
|
184
|
+
export function renderArtifactByName(kindName, contracts, options, control) {
|
|
185
|
+
const kind = getArtifactKind(kindName);
|
|
186
|
+
if (!kind) {
|
|
187
|
+
const known = listArtifactKinds();
|
|
188
|
+
const hint = known.length > 0 ? known.join(", ") : "(none)";
|
|
189
|
+
throw new Error(`Unknown artifact kind "${kindName}". Registered kinds: ${hint}`);
|
|
190
|
+
}
|
|
191
|
+
return renderArtifact(kind, contracts, options, control);
|
|
192
|
+
}
|
|
193
|
+
// =============================================================================
|
|
194
|
+
// Introspection
|
|
195
|
+
// =============================================================================
|
|
196
|
+
/**
|
|
197
|
+
* List the protocols whose adapter **explicitly declares a producer** for
|
|
198
|
+
* the given kind. Does NOT include protocols that would fall back to
|
|
199
|
+
* `kind.defaultRender`. Use `listArtifactCapability` for the three-way split.
|
|
200
|
+
*/
|
|
201
|
+
export function listArtifactProducers(kindName) {
|
|
202
|
+
return listRegisteredProtocols().filter((p) => {
|
|
203
|
+
const adapter = getAdapter(p);
|
|
204
|
+
return (adapter !== undefined &&
|
|
205
|
+
adapter.artifacts?.[kindName] !==
|
|
206
|
+
undefined);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Static capability view — **based on installed adapters**, not on any
|
|
211
|
+
* particular project's contracts. Partitions protocols into:
|
|
212
|
+
*
|
|
213
|
+
* - `explicit` : adapter declares a producer for this kind
|
|
214
|
+
* - `fallback` : adapter has no producer but kind.defaultRender exists
|
|
215
|
+
* - `unsupported` : adapter has no producer and kind has no defaultRender
|
|
216
|
+
*
|
|
217
|
+
* To answer "does **this project** produce the artifact?", use
|
|
218
|
+
* `renderArtifactWithSummary` and inspect `contributions` + `usedEmptyFallback`.
|
|
219
|
+
* The capability view cannot know how many contracts of each protocol exist
|
|
220
|
+
* in the caller's project.
|
|
221
|
+
*/
|
|
222
|
+
export function listArtifactCapability(kindName) {
|
|
223
|
+
const kind = getArtifactKind(kindName);
|
|
224
|
+
const allProtocols = listRegisteredProtocols();
|
|
225
|
+
const explicit = listArtifactProducers(kindName);
|
|
226
|
+
const explicitSet = new Set(explicit);
|
|
227
|
+
const rest = allProtocols.filter((p) => !explicitSet.has(p));
|
|
228
|
+
if (kind?.defaultRender) {
|
|
229
|
+
return { explicit, fallback: rest, unsupported: [] };
|
|
230
|
+
}
|
|
231
|
+
return { explicit, fallback: [], unsupported: rest };
|
|
232
|
+
}
|
|
233
|
+
// =============================================================================
|
|
234
|
+
// Built-in kinds
|
|
235
|
+
// =============================================================================
|
|
236
|
+
/**
|
|
237
|
+
* OpenAPI 3.1 artifact kind. Per-contract partials are produced by HTTP
|
|
238
|
+
* adapter's `artifacts.openapi` (see `contract-http/openapi.ts`); merge
|
|
239
|
+
* combines them into a full spec. No `defaultRender` — non-HTTP protocols
|
|
240
|
+
* don't map to OpenAPI and are skipped.
|
|
241
|
+
*
|
|
242
|
+
* Ported from MCP's former `contractsToOpenApi` — CAR-1 Phase 2.
|
|
243
|
+
*/
|
|
244
|
+
export const openapiArtifact = defineArtifactKind({
|
|
245
|
+
name: "openapi",
|
|
246
|
+
merge: (parts, options) => mergeOpenApiParts(parts, options),
|
|
247
|
+
empty: emptyOpenApiDocument,
|
|
248
|
+
});
|
|
249
|
+
/**
|
|
250
|
+
* Protocol-agnostic default renderer. Reads raw fields off the
|
|
251
|
+
* projection; every protocol gets a valid Part even if its adapter
|
|
252
|
+
* doesn't declare `artifacts.markdown`.
|
|
253
|
+
*/
|
|
254
|
+
export function genericMarkdownPart(projection) {
|
|
255
|
+
return {
|
|
256
|
+
contractId: projection.id,
|
|
257
|
+
endpoint: projection.target,
|
|
258
|
+
protocol: projection.protocol,
|
|
259
|
+
description: projection.description,
|
|
260
|
+
feature: projection.feature,
|
|
261
|
+
instanceName: projection.instanceName,
|
|
262
|
+
deprecated: projection.deprecated,
|
|
263
|
+
cases: projection.cases.map((c) => ({
|
|
264
|
+
key: c.key,
|
|
265
|
+
description: c.description,
|
|
266
|
+
lifecycle: c.lifecycle ??
|
|
267
|
+
(c.deprecatedReason
|
|
268
|
+
? "deprecated"
|
|
269
|
+
: c.deferredReason
|
|
270
|
+
? "deferred"
|
|
271
|
+
: "active"),
|
|
272
|
+
severity: c.severity ?? "warning",
|
|
273
|
+
defaultRun: c.defaultRun,
|
|
274
|
+
requires: c.requires,
|
|
275
|
+
deferredReason: c.deferredReason,
|
|
276
|
+
deprecatedReason: c.deprecatedReason,
|
|
277
|
+
})),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function computeMarkdownSummary(parts) {
|
|
281
|
+
let total = 0;
|
|
282
|
+
let deferred = 0;
|
|
283
|
+
let deprecated = 0;
|
|
284
|
+
let gated = 0;
|
|
285
|
+
for (const p of parts) {
|
|
286
|
+
for (const c of p.cases) {
|
|
287
|
+
total++;
|
|
288
|
+
if (c.lifecycle === "deprecated")
|
|
289
|
+
deprecated++;
|
|
290
|
+
else if (c.lifecycle === "deferred")
|
|
291
|
+
deferred++;
|
|
292
|
+
else if (c.requires === "browser" || c.requires === "out-of-band")
|
|
293
|
+
gated++;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
total,
|
|
298
|
+
active: total - deferred - deprecated - gated,
|
|
299
|
+
deferred,
|
|
300
|
+
deprecated,
|
|
301
|
+
gated,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function formatMarkdownCase(c) {
|
|
305
|
+
const desc = c.description ? ` — ${c.description}` : "";
|
|
306
|
+
if (c.lifecycle === "deprecated") {
|
|
307
|
+
const reason = c.deprecatedReason ?? "deprecated";
|
|
308
|
+
return `- ⊘ **${c.key}** — deprecated: ${reason}`;
|
|
309
|
+
}
|
|
310
|
+
if (c.lifecycle === "deferred") {
|
|
311
|
+
const reason = c.deferredReason ?? "deferred";
|
|
312
|
+
return `- ⊘ **${c.key}** — deferred: ${reason}`;
|
|
313
|
+
}
|
|
314
|
+
if (c.requires === "browser" || c.requires === "out-of-band") {
|
|
315
|
+
return `- ⊘ **${c.key}** — requires: ${c.requires}`;
|
|
316
|
+
}
|
|
317
|
+
const severityTag = c.severity === "critical" ? " 🔴" : c.severity === "info" ? " ℹ️" : "";
|
|
318
|
+
const suffix = c.defaultRun === "opt-in" ? " *(opt-in)*" : "";
|
|
319
|
+
return `- **${c.key}**${desc}${suffix}${severityTag}`;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Compute the effective feature key for a part — applies the
|
|
323
|
+
* instanceName-aware transform when the project has any instanced
|
|
324
|
+
* contract (matches CLI `hasInstances` pre-pass behavior).
|
|
325
|
+
*/
|
|
326
|
+
function displayFeature(part, hasInstances) {
|
|
327
|
+
if (hasInstances && part.instanceName) {
|
|
328
|
+
return `${part.instanceName}: ${part.feature ?? part.endpoint}`;
|
|
329
|
+
}
|
|
330
|
+
return part.feature ?? part.endpoint;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Feature-grouped, doc-level markdown assembly. Byte-for-byte output
|
|
334
|
+
* compatible with `formatMdOutline` from `packages/cli/src/commands/
|
|
335
|
+
* contracts.ts` (the legacy CLI markdown path).
|
|
336
|
+
*
|
|
337
|
+
* Structure:
|
|
338
|
+
* # Contract Specification
|
|
339
|
+
* Generated: YYYY-MM-DD | N cases | N active | ...
|
|
340
|
+
*
|
|
341
|
+
* ## <feature>
|
|
342
|
+
* 🚫 **Deprecated:** ... (if contract-level deprecated)
|
|
343
|
+
* <description or endpoint intro>
|
|
344
|
+
* - **case** — ...
|
|
345
|
+
*/
|
|
346
|
+
export function assembleMarkdownDocument(parts) {
|
|
347
|
+
if (parts.length === 0)
|
|
348
|
+
return "";
|
|
349
|
+
const hasInstances = parts.some((p) => !!p.instanceName);
|
|
350
|
+
// Group preserving insertion order
|
|
351
|
+
const groups = new Map();
|
|
352
|
+
for (const part of parts) {
|
|
353
|
+
const key = displayFeature(part, hasInstances);
|
|
354
|
+
const list = groups.get(key) ?? [];
|
|
355
|
+
list.push(part);
|
|
356
|
+
groups.set(key, list);
|
|
357
|
+
}
|
|
358
|
+
const summary = computeMarkdownSummary(parts);
|
|
359
|
+
const lines = [];
|
|
360
|
+
lines.push("# Contract Specification");
|
|
361
|
+
lines.push("");
|
|
362
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
363
|
+
const summaryParts = [`Generated: ${date}`, `${summary.total} cases`];
|
|
364
|
+
if (summary.active > 0)
|
|
365
|
+
summaryParts.push(`${summary.active} active`);
|
|
366
|
+
if (summary.deferred > 0)
|
|
367
|
+
summaryParts.push(`${summary.deferred} deferred`);
|
|
368
|
+
if (summary.deprecated > 0)
|
|
369
|
+
summaryParts.push(`${summary.deprecated} deprecated`);
|
|
370
|
+
if (summary.gated > 0)
|
|
371
|
+
summaryParts.push(`${summary.gated} gated`);
|
|
372
|
+
lines.push(summaryParts.join(" | "));
|
|
373
|
+
lines.push("");
|
|
374
|
+
for (const [featureName, featureParts] of groups.entries()) {
|
|
375
|
+
lines.push(`## ${featureName}`);
|
|
376
|
+
lines.push("");
|
|
377
|
+
for (const contract of featureParts) {
|
|
378
|
+
const intro = contract.description ??
|
|
379
|
+
(featureName !== contract.endpoint ? contract.endpoint : undefined);
|
|
380
|
+
if (contract.deprecated) {
|
|
381
|
+
lines.push(`🚫 **Deprecated:** ${contract.deprecated}`);
|
|
382
|
+
lines.push("");
|
|
383
|
+
}
|
|
384
|
+
if (intro) {
|
|
385
|
+
lines.push(intro);
|
|
386
|
+
lines.push("");
|
|
387
|
+
}
|
|
388
|
+
for (const c of contract.cases) {
|
|
389
|
+
lines.push(formatMarkdownCase(c));
|
|
390
|
+
}
|
|
391
|
+
lines.push("");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
395
|
+
}
|
|
396
|
+
export const markdownArtifact = defineArtifactKind({
|
|
397
|
+
name: "markdown",
|
|
398
|
+
defaultRender: (projection) => genericMarkdownPart(projection),
|
|
399
|
+
merge: (parts) => assembleMarkdownDocument(parts),
|
|
400
|
+
empty: "",
|
|
401
|
+
});
|
|
402
|
+
//# sourceMappingURL=contract-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-artifacts.js","sourceRoot":"","sources":["../src/contract-artifacts.ts"],"names":[],"mappings":"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"}
|
package/dist/contract-core.d.ts
CHANGED
|
@@ -19,9 +19,39 @@
|
|
|
19
19
|
* - `internal/40-discovery/proposals/contract-flow.md` v9
|
|
20
20
|
*/
|
|
21
21
|
import type { TestContext } from "./types.js";
|
|
22
|
-
import type { ContractProtocolAdapter, ExtractedFlowProjection, FieldMapping, FlowBuilder, FlowContract, FlowMeta, RuntimeFlowProjection } from "./contract-types.js";
|
|
22
|
+
import type { Bootstrap, BootstrapAttachment, ContractCaseRef, ContractProtocolAdapter, ExtractedFlowProjection, FieldMapping, FlowBuilder, FlowContract, FlowMeta, RuntimeFlowProjection } from "./contract-types.js";
|
|
23
23
|
/** Internal accessor for plugins / downstream (scanner, runner). */
|
|
24
24
|
export declare function getAdapter(protocol: string): ContractProtocolAdapter<any, any, any, any, any> | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* List all currently registered protocol names. Used by the artifact
|
|
27
|
+
* registry's capability introspection (`listArtifactCapability`) to iterate
|
|
28
|
+
* all adapters and classify them against a given artifact kind.
|
|
29
|
+
*
|
|
30
|
+
* Order is insertion order (Map semantics). Consumers that need stable
|
|
31
|
+
* output should sort.
|
|
32
|
+
*/
|
|
33
|
+
export declare function listRegisteredProtocols(): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Test-only: unregister a protocol adapter + remove its dispatcher from the
|
|
36
|
+
* `contract` namespace. Used by `__resetInstalledPluginsForTesting` in
|
|
37
|
+
* `install-plugin.ts` to restore a clean state between test scenarios.
|
|
38
|
+
*
|
|
39
|
+
* Not exposed via the public `contract` object — callers must import it
|
|
40
|
+
* directly from `@glubean/sdk/internal`. Reserved protocol names
|
|
41
|
+
* (`register`, `flow`, `getAdapter`) are refused.
|
|
42
|
+
*
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export declare function __unregisterProtocolForTesting(protocol: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Test-only: unregister all protocol adapters at once (iterates the current
|
|
48
|
+
* registry and calls `__unregisterProtocolForTesting` for each, including
|
|
49
|
+
* built-in "http"). Used by contract-artifacts tests that need a clean
|
|
50
|
+
* adapter registry between assertions. Reserved names are naturally skipped.
|
|
51
|
+
*
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export declare function __resetAdapterRegistryForTesting(): void;
|
|
25
55
|
/**
|
|
26
56
|
* Register an adapter. Called by built-in HTTP adapter on SDK load, and by
|
|
27
57
|
* external protocol packages (`@glubean/grpc`, `@glubean/graphql` etc.) on
|
|
@@ -32,8 +62,20 @@ declare function register<Spec, RuntimeSchemas = unknown, RuntimeMeta = unknown,
|
|
|
32
62
|
type ContractNamespace = {
|
|
33
63
|
register: typeof register;
|
|
34
64
|
flow: typeof flow;
|
|
65
|
+
bootstrap: typeof bootstrap;
|
|
35
66
|
[protocol: string]: unknown;
|
|
36
67
|
};
|
|
68
|
+
/**
|
|
69
|
+
* Register a bootstrap overlay for a contract case. Standalone-only
|
|
70
|
+
* execution path; flow NEVER invokes bootstrap (non-negotiable invariant
|
|
71
|
+
* from attachment model §0.4 / §14.0).
|
|
72
|
+
*
|
|
73
|
+
* `NoInfer<Needs>` on the spec parameter prevents TypeScript's multi-site
|
|
74
|
+
* inference from silently accepting a mismatched `run` return type —
|
|
75
|
+
* without it, TS merges inferences from ref + spec and produces a
|
|
76
|
+
* compatible Needs, masking real type errors (Spike 0 Finding 1).
|
|
77
|
+
*/
|
|
78
|
+
export declare function bootstrap<Needs, Params = void>(ref: ContractCaseRef<Needs, unknown>, spec: Bootstrap<Params, NoInfer<Needs>>): BootstrapAttachment<Needs, Params>;
|
|
37
79
|
export declare const contract: ContractNamespace;
|
|
38
80
|
/**
|
|
39
81
|
* Protocol-agnostic flow builder. See contract-flow.md v9 §4.1.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-core.d.ts","sourceRoot":"","sources":["../src/contract-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAQ,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAEV,uBAAuB,EAGvB,uBAAuB,EAEvB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EAKR,qBAAqB,EAEtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"contract-core.d.ts","sourceRoot":"","sources":["../src/contract-core.ts"],"names":[],"mappings":"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"}
|