@agent-teams/docs-protocol 0.1.4 → 0.2.0
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/CHANGELOG.md +11 -0
- package/README.md +51 -2
- package/assets/catalog.json +1 -1
- package/assets/transition-catalog.json +1 -1
- package/dist/adapters/docs-command-envelope-schema-validator.d.ts.map +1 -1
- package/dist/adapters/docs-command-envelope-schema-validator.js +30 -8
- package/dist/adapters/docs-command-envelope-schema-validator.js.map +1 -1
- package/dist/adapters/docs-profile-schema-validator.d.ts.map +1 -1
- package/dist/adapters/docs-profile-schema-validator.js +13 -7
- package/dist/adapters/docs-profile-schema-validator.js.map +1 -1
- package/dist/adapters/foundation-docs-port.d.ts +10 -9
- package/dist/adapters/foundation-docs-port.d.ts.map +1 -1
- package/dist/adapters/foundation-docs-port.js +15 -10
- package/dist/adapters/foundation-docs-port.js.map +1 -1
- package/dist/adapters/node-adoption-inspector.js +2 -2
- package/dist/adapters/node-adoption-inspector.js.map +1 -1
- package/dist/adapters/node-profile-reader.d.ts +3 -3
- package/dist/adapters/node-profile-reader.d.ts.map +1 -1
- package/dist/application/authority-handshake.d.ts +4 -4
- package/dist/application/authority-handshake.d.ts.map +1 -1
- package/dist/application/compiled-document.d.ts +11 -0
- package/dist/application/compiled-document.d.ts.map +1 -0
- package/dist/application/compiled-document.js +31 -0
- package/dist/application/compiled-document.js.map +1 -0
- package/dist/application/docs-new-completion.d.ts +5 -4
- package/dist/application/docs-new-completion.d.ts.map +1 -1
- package/dist/application/docs-new-completion.js.map +1 -1
- package/dist/application/docs-protocol-v1-presenter.d.ts +140 -0
- package/dist/application/docs-protocol-v1-presenter.d.ts.map +1 -0
- package/dist/application/docs-protocol-v1-presenter.js +77 -0
- package/dist/application/docs-protocol-v1-presenter.js.map +1 -0
- package/dist/application/docs-protocol.d.ts +210 -3
- package/dist/application/docs-protocol.d.ts.map +1 -1
- package/dist/application/docs-protocol.js +46 -13
- package/dist/application/docs-protocol.js.map +1 -1
- package/dist/composition/cli-input.d.ts +12 -0
- package/dist/composition/cli-input.d.ts.map +1 -0
- package/dist/composition/cli-input.js +66 -0
- package/dist/composition/cli-input.js.map +1 -0
- package/dist/composition/cli.d.ts +4 -4
- package/dist/composition/cli.d.ts.map +1 -1
- package/dist/composition/cli.js +21 -144
- package/dist/composition/cli.js.map +1 -1
- package/dist/composition/docs-human-renderer.d.ts +5 -0
- package/dist/composition/docs-human-renderer.d.ts.map +1 -0
- package/dist/composition/docs-human-renderer.js +94 -0
- package/dist/composition/docs-human-renderer.js.map +1 -0
- package/dist/composition/node-docs-api.d.ts +191 -0
- package/dist/composition/node-docs-api.d.ts.map +1 -1
- package/dist/composition/node-docs-api.js +18 -0
- package/dist/composition/node-docs-api.js.map +1 -1
- package/dist/composition/qualification-cli.d.ts +2 -0
- package/dist/composition/qualification-cli.d.ts.map +1 -0
- package/dist/composition/qualification-cli.js +119 -0
- package/dist/composition/qualification-cli.js.map +1 -0
- package/dist/consumer-integration/adapters/consumer-integration-schema-validator.d.ts.map +1 -1
- package/dist/consumer-integration/adapters/consumer-integration-schema-validator.js +8 -3
- package/dist/consumer-integration/adapters/consumer-integration-schema-validator.js.map +1 -1
- package/dist/consumer-integration/adapters/node-consumer-integration-repository.d.ts.map +1 -1
- package/dist/consumer-integration/adapters/node-consumer-integration-repository.js +10 -3
- package/dist/consumer-integration/adapters/node-consumer-integration-repository.js.map +1 -1
- package/dist/consumer-integration/application/policies/consumer-integration-assets.d.ts +2 -1
- package/dist/consumer-integration/application/policies/consumer-integration-assets.d.ts.map +1 -1
- package/dist/consumer-integration/application/policies/consumer-integration-assets.js +12 -5
- package/dist/consumer-integration/application/policies/consumer-integration-assets.js.map +1 -1
- package/dist/consumer-integration/application/policies/consumer-integration-prior-cohort.js +2 -2
- package/dist/consumer-integration/application/policies/consumer-integration-prior-cohort.js.map +1 -1
- package/dist/consumer-integration/application/use-cases/plan-consumer-integration.js +2 -2
- package/dist/consumer-integration/application/use-cases/plan-consumer-integration.js.map +1 -1
- package/dist/consumer-integration/composition/canonical-docs-skill-v2.d.ts +2 -0
- package/dist/consumer-integration/composition/canonical-docs-skill-v2.d.ts.map +1 -0
- package/dist/consumer-integration/composition/canonical-docs-skill-v2.js +2 -0
- package/dist/consumer-integration/composition/canonical-docs-skill-v2.js.map +1 -0
- package/dist/consumer-integration/generated/canonical-assets.d.ts +2 -1
- package/dist/consumer-integration/generated/canonical-assets.d.ts.map +1 -1
- package/dist/consumer-integration/generated/canonical-assets.js +2 -1
- package/dist/consumer-integration/generated/canonical-assets.js.map +1 -1
- package/dist/domain/model-v2.d.ts +170 -0
- package/dist/domain/model-v2.d.ts.map +1 -0
- package/dist/domain/model-v2.js +2 -0
- package/dist/domain/model-v2.js.map +1 -0
- package/dist/domain/model.d.ts +1 -99
- package/dist/domain/model.d.ts.map +1 -1
- package/dist/domain/model.js.map +1 -1
- package/dist/domain/profile-policy.d.ts +2 -1
- package/dist/domain/profile-policy.d.ts.map +1 -1
- package/dist/domain/profile-policy.js +20 -12
- package/dist/domain/profile-policy.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/qualification/filesystem-evidence.d.ts +15 -0
- package/dist/qualification/filesystem-evidence.d.ts.map +1 -0
- package/dist/qualification/filesystem-evidence.js +325 -0
- package/dist/qualification/filesystem-evidence.js.map +1 -0
- package/dist/qualification/index.d.ts +3 -0
- package/dist/qualification/index.d.ts.map +1 -1
- package/dist/qualification/index.js +12 -326
- package/dist/qualification/index.js.map +1 -1
- package/dist/qualification/qualification-runtime.d.ts +58 -0
- package/dist/qualification/qualification-runtime.d.ts.map +1 -0
- package/dist/qualification/qualification-runtime.js +160 -0
- package/dist/qualification/qualification-runtime.js.map +1 -0
- package/dist/qualification/qualification-v2-runner.d.ts +4 -0
- package/dist/qualification/qualification-v2-runner.d.ts.map +1 -0
- package/dist/qualification/qualification-v2-runner.js +306 -0
- package/dist/qualification/qualification-v2-runner.js.map +1 -0
- package/dist/qualification/v2-contract.d.ts +91 -0
- package/dist/qualification/v2-contract.d.ts.map +1 -0
- package/dist/qualification/v2-contract.js +2 -0
- package/dist/qualification/v2-contract.js.map +1 -0
- package/package.json +7 -2
- package/schemas/docs-consumer-integration-profile/v2.schema.json +283 -0
- package/schemas/docs-protocol-command-envelope/v2.schema.json +285 -0
- package/schemas/docs-protocol-profile/v2.schema.json +46 -0
- package/schemas/docs-protocol-qualification/v2.schema.json +78 -0
- package/schemas/docs-protocol-qualification-receipt/v2.schema.json +113 -0
- package/skills/docs/SKILL.md +3 -2
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, readFile, realpath, symlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, relative, resolve as resolvePath, sep } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { planDocumentationDocumentV2 } from "@agent-teams/engineering-foundation/document-authoring";
|
|
6
|
+
import { NodeDocsAdoptionInspector } from "../adapters/node-adoption-inspector.js";
|
|
7
|
+
import { NodeCodeAnchorMatcher } from "../adapters/node-code-anchor-matcher.js";
|
|
8
|
+
import { NodeFoundationDocsPort } from "../adapters/foundation-docs-port.js";
|
|
9
|
+
import { NodeDocsProfileReader } from "../adapters/node-profile-reader.js";
|
|
10
|
+
import { DocsProtocol } from "../application/docs-protocol.js";
|
|
11
|
+
import { normalizeCodeAnchors, normalizeDocumentIds } from "../domain/document-semantics.js";
|
|
12
|
+
import { crashAtDurablePublishing } from "./crash-driver.js";
|
|
13
|
+
const MAX_QUALIFICATION_AUTHORITY_BYTES = 8 * 1024 * 1024;
|
|
14
|
+
export function digest(value) {
|
|
15
|
+
return `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
16
|
+
}
|
|
17
|
+
export async function readContainedBoundedFile(root, repositoryPath, label, maximumBytes = MAX_QUALIFICATION_AUTHORITY_BYTES) {
|
|
18
|
+
if (repositoryPath.startsWith("/") || repositoryPath.split("/").some((segment) => segment === "" || segment === "." || segment === "..")) {
|
|
19
|
+
throw new Error(`${label} must be one canonical repository-relative path.`);
|
|
20
|
+
}
|
|
21
|
+
const absolute = resolvePath(root, repositoryPath);
|
|
22
|
+
const relativePath = relative(root, absolute);
|
|
23
|
+
if (relativePath === ".." || relativePath.startsWith(`..${sep}`)) {
|
|
24
|
+
throw new Error(`${label} escapes the consumer root.`);
|
|
25
|
+
}
|
|
26
|
+
const metadata = await lstat(absolute);
|
|
27
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > maximumBytes) {
|
|
28
|
+
throw new Error(`${label} must be one bounded regular file.`);
|
|
29
|
+
}
|
|
30
|
+
const physical = await realpath(absolute);
|
|
31
|
+
if (physical !== absolute) {
|
|
32
|
+
throw new Error(`${label} must not traverse a symlink.`);
|
|
33
|
+
}
|
|
34
|
+
const bytes = await readFile(physical);
|
|
35
|
+
if (bytes.byteLength !== metadata.size || bytes.byteLength > maximumBytes) {
|
|
36
|
+
throw new Error(`${label} changed during its bounded read.`);
|
|
37
|
+
}
|
|
38
|
+
return Object.freeze({ bytes, digest: digest(bytes), path: repositoryPath });
|
|
39
|
+
}
|
|
40
|
+
export async function bootstrapQualificationInstallation(consumerRoot, rewriteManifest) {
|
|
41
|
+
const docsManifestPath = fileURLToPath(new URL("../../package.json", import.meta.url));
|
|
42
|
+
const foundationManifestPath = fileURLToPath(import.meta.resolve("@agent-teams/engineering-foundation/package.json"));
|
|
43
|
+
const [docsManifest, foundationManifest, consumerManifest] = await Promise.all([
|
|
44
|
+
readFile(docsManifestPath, "utf8").then((source) => JSON.parse(source)),
|
|
45
|
+
readFile(foundationManifestPath, "utf8").then((source) => JSON.parse(source)),
|
|
46
|
+
readFile(join(consumerRoot, "package.json"), "utf8").then((source) => JSON.parse(source))
|
|
47
|
+
]);
|
|
48
|
+
if (rewriteManifest) {
|
|
49
|
+
await writeFile(join(consumerRoot, "package.json"), `${JSON.stringify({
|
|
50
|
+
...consumerManifest,
|
|
51
|
+
devDependencies: {
|
|
52
|
+
...((typeof consumerManifest["devDependencies"] === "object" && consumerManifest["devDependencies"] !== null)
|
|
53
|
+
? consumerManifest["devDependencies"]
|
|
54
|
+
: {}),
|
|
55
|
+
"@agent-teams/docs-protocol": docsManifest.version,
|
|
56
|
+
"@agent-teams/engineering-foundation": foundationManifest.version
|
|
57
|
+
}
|
|
58
|
+
}, null, 2)}\n`, "utf8");
|
|
59
|
+
}
|
|
60
|
+
const scope = join(consumerRoot, "node_modules", "@agent-teams");
|
|
61
|
+
await mkdir(scope, { recursive: true });
|
|
62
|
+
await Promise.all([
|
|
63
|
+
symlink(dirname(docsManifestPath), join(scope, "docs-protocol"), process.platform === "win32" ? "junction" : "dir"),
|
|
64
|
+
symlink(dirname(foundationManifestPath), join(scope, "engineering-foundation"), process.platform === "win32" ? "junction" : "dir")
|
|
65
|
+
]);
|
|
66
|
+
await writeFile(join(consumerRoot, ".agent-teams-document-authoring-qualification-fixture.json"), `${JSON.stringify({
|
|
67
|
+
schemaVersion: 1,
|
|
68
|
+
kind: "agent-teams-document-authoring-qualification-fixture",
|
|
69
|
+
consumerRoot: await realpath(consumerRoot)
|
|
70
|
+
})}\n`, "utf8");
|
|
71
|
+
return Object.freeze({ docsVersion: docsManifest.version, foundationVersion: foundationManifest.version });
|
|
72
|
+
}
|
|
73
|
+
export function requireSuccess(label, execution) {
|
|
74
|
+
if (execution.exitCode !== 0) {
|
|
75
|
+
throw new Error(`Docs Protocol qualification ${label} failed with exit code ${execution.exitCode}: ${JSON.stringify(execution.envelope ?? {})}.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function documentResult(execution) {
|
|
79
|
+
requireSuccess("document", execution);
|
|
80
|
+
const result = execution.envelope.result;
|
|
81
|
+
if (typeof result["documentPath"] !== "string" || typeof result["planDigest"] !== "string" || !("reachability" in result)) {
|
|
82
|
+
throw new Error("Docs Protocol qualification expected a successful document result.");
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
documentPath: result["documentPath"],
|
|
86
|
+
planDigest: result["planDigest"],
|
|
87
|
+
...((typeof result["compiled"] === "object" && result["compiled"] !== null) ? { compiled: result["compiled"] } : {}),
|
|
88
|
+
...(typeof result["receiptDigest"] === "string" ? { receiptDigest: result["receiptDigest"] } : {}),
|
|
89
|
+
reachability: result["reachability"]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function createProtocol() {
|
|
93
|
+
return new DocsProtocol({
|
|
94
|
+
adoption: new NodeDocsAdoptionInspector(),
|
|
95
|
+
anchors: new NodeCodeAnchorMatcher(),
|
|
96
|
+
foundation: new NodeFoundationDocsPort(),
|
|
97
|
+
profiles: new NodeDocsProfileReader()
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function qualificationMetadata(base, blockedBy, codeAnchors) {
|
|
101
|
+
return {
|
|
102
|
+
...base.additionalMetadata,
|
|
103
|
+
...(blockedBy.length === 0 ? {} : { blocked_by: blockedBy }),
|
|
104
|
+
...(codeAnchors.length === 0
|
|
105
|
+
? {}
|
|
106
|
+
: { code_anchors: codeAnchors.map(({ enforcement, pattern }) => ({ enforcement, pattern })) })
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export function signalOption(signal) {
|
|
110
|
+
return signal === undefined ? {} : { signal };
|
|
111
|
+
}
|
|
112
|
+
export async function interruptAndRecover(input) {
|
|
113
|
+
const profile = await new NodeDocsProfileReader().read({
|
|
114
|
+
consumerRoot: input.consumerRoot,
|
|
115
|
+
profilePath: input.profilePath,
|
|
116
|
+
...signalOption(input.base.signal)
|
|
117
|
+
});
|
|
118
|
+
const blockedBy = normalizeDocumentIds(input.base.blockedBy ?? [], "blocked_by");
|
|
119
|
+
const related = normalizeDocumentIds([...(input.base.related ?? []), ...blockedBy], "related");
|
|
120
|
+
const codeAnchors = normalizeCodeAnchors(input.base.codeAnchors ?? []);
|
|
121
|
+
const additionalMetadata = qualificationMetadata(input.base, blockedBy, codeAnchors);
|
|
122
|
+
const crashPlan = await planDocumentationDocumentV2({
|
|
123
|
+
consumerRoot: input.consumerRoot,
|
|
124
|
+
profilePath: profile.foundationProfile.path,
|
|
125
|
+
parentPolicy: "create-missing-real-directories",
|
|
126
|
+
intent: {
|
|
127
|
+
schemaVersion: 1,
|
|
128
|
+
...input.base.intent,
|
|
129
|
+
...(related.length === 0 ? {} : { related }),
|
|
130
|
+
...(Object.keys(additionalMetadata).length === 0 ? {} : { additionalMetadata })
|
|
131
|
+
},
|
|
132
|
+
...signalOption(input.base.signal)
|
|
133
|
+
});
|
|
134
|
+
if (crashPlan.destination !== input.previewResult.documentPath || crashPlan.planDigest !== input.previewResult.planDigest) {
|
|
135
|
+
throw new Error("Qualification crash Plan differs from the unified Docs Protocol preview.");
|
|
136
|
+
}
|
|
137
|
+
await crashAtDurablePublishing(input.consumerRoot, crashPlan, input.base.signal);
|
|
138
|
+
const interruptedDoctor = await input.protocol.doctorV2({
|
|
139
|
+
consumerRoot: input.consumerRoot,
|
|
140
|
+
profilePath: input.profilePath,
|
|
141
|
+
...signalOption(input.base.signal)
|
|
142
|
+
});
|
|
143
|
+
if (interruptedDoctor.exitCode !== 1 || interruptedDoctor.envelope.outcome !== "recovery-required" ||
|
|
144
|
+
interruptedDoctor.envelope.result.transaction.state !== "recoverable") {
|
|
145
|
+
throw new Error("Qualification doctor did not observe its genuine interrupted transaction.");
|
|
146
|
+
}
|
|
147
|
+
const recovered = await input.protocol.recoverV2({
|
|
148
|
+
consumerRoot: input.consumerRoot,
|
|
149
|
+
profilePath: input.profilePath,
|
|
150
|
+
...signalOption(input.base.signal)
|
|
151
|
+
});
|
|
152
|
+
requireSuccess("recover", recovered);
|
|
153
|
+
if (recovered.envelope.result.transactionState !== "recovered" || recovered.envelope.result.writeState !== "committed" ||
|
|
154
|
+
typeof recovered.envelope.result.receiptDigest !== "string" || recovered.envelope.result.receipt.outcome !== "applied" ||
|
|
155
|
+
recovered.envelope.result.receipt.commit.state !== "committed" || recovered.envelope.result.receipt.commit.publication !== "published") {
|
|
156
|
+
throw new Error("Qualification recovery did not return truthful committed Receipt evidence.");
|
|
157
|
+
}
|
|
158
|
+
return recovered.envelope.result;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=qualification-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualification-runtime.js","sourceRoot":"","sources":["../../src/qualification/qualification-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,IAAI,WAAW,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AAErG,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE7F,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,iCAAiC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D,MAAM,UAAU,MAAM,CAAC,KAA0B;IAC/C,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAY,EACZ,cAAsB,EACtB,KAAa,EACb,YAAY,GAAG,iCAAiC;IAEhD,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QACzI,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,kDAAkD,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oCAAoC,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mCAAmC,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CAAC,YAAoB,EAAE,eAAwB;IAIrG,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,MAAM,sBAAsB,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,CAAC;IACtH,MAAM,CAAC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiC,CAAC;QACvG,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiC,CAAC;QAC7G,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;KACrH,CAAC,CAAC;IACH,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;YACpE,GAAG,gBAAgB;YACnB,eAAe,EAAE;gBACf,GAAG,CAAC,CAAC,OAAO,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,QAAQ,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;oBAC3G,CAAC,CAAC,gBAAgB,CAAC,iBAAiB,CAA4B;oBAChE,CAAC,CAAC,EAAE,CAAC;gBACP,4BAA4B,EAAE,YAAY,CAAC,OAAO;gBAClD,qCAAqC,EAAE,kBAAkB,CAAC,OAAO;aAClE;SACF,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;QACnH,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;KACnI,CAAC,CAAC;IACH,MAAM,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,4DAA4D,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAClH,aAAa,EAAE,CAAC;QAChB,IAAI,EAAE,sDAAsD;QAC5D,YAAY,EAAE,MAAM,QAAQ,CAAC,YAAY,CAAC;KAC3C,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,SAAqE;IACjH,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,0BAA0B,SAAS,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;IACpJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAyF;IAOtH,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAiC,CAAC;IACpE,IAAI,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC,EAAE,CAAC;QAC1H,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO;QACL,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC;QAChC,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpH,GAAG,CAAC,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,YAAY,CAAC;QACtB,QAAQ,EAAE,IAAI,yBAAyB,EAAE;QACzC,OAAO,EAAE,IAAI,qBAAqB,EAAE;QACpC,UAAU,EAAE,IAAI,sBAAsB,EAAE;QACxC,QAAQ,EAAE,IAAI,qBAAqB,EAAE;KACtC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAmC,EACnC,SAA4B,EAC5B,WAAmG;IAEnG,OAAO;QACL,GAAG,IAAI,CAAC,kBAAkB;QAC1B,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QAC5D,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAC1B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;KACjG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA+B;IAC1D,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAMzC;IAWC,MAAM,OAAO,GAAG,MAAM,IAAI,qBAAqB,EAAE,CAAC,IAAI,CAAC;QACrD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,oBAAoB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/F,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC;QAClD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,IAAI;QAC3C,YAAY,EAAE,iCAAiC;QAC/C,MAAM,EAAE;YACN,aAAa,EAAE,CAAC;YAChB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM;YACpB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC;SAChF;QACD,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,WAAW,KAAK,KAAK,CAAC,aAAa,CAAC,YAAY,IAAI,SAAS,CAAC,UAAU,KAAK,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;QAC1H,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,wBAAwB,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjF,MAAM,iBAAiB,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,iBAAiB,CAAC,QAAQ,KAAK,CAAC,IAAI,iBAAiB,CAAC,QAAQ,CAAC,OAAO,KAAK,mBAAmB;QAChG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;KACnC,CAAC,CAAC;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,KAAK,WAAW;QACpH,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS;QACtH,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,WAAW,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACzI,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,MAOzB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DocsProtocolQualificationReceiptV2, DocsProtocolQualificationV2Request } from "./v2-contract.js";
|
|
2
|
+
export declare function overlayLocalDevelopmentSkill(consumerRoot: string, skillPath: string, enabled: boolean): Promise<void>;
|
|
3
|
+
export declare function runDocsProtocolQualificationV2(request: DocsProtocolQualificationV2Request): Promise<DocsProtocolQualificationReceiptV2>;
|
|
4
|
+
//# sourceMappingURL=qualification-v2-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualification-v2-runner.d.ts","sourceRoot":"","sources":["../../src/qualification/qualification-v2-runner.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAEV,kCAAkC,EAElC,kCAAkC,EACnC,MAAM,kBAAkB,CAAC;AAgE1B,wBAAsB,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B3H;AAoJD,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,kCAAkC,CAAC,CAyG7C"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { cp, lstat, mkdtemp, open, readFile, realpath, rm } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, relative, resolve as resolvePath, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { Ajv2020 } from "ajv/dist/2020.js";
|
|
7
|
+
import { assertConsumerIntegrationProfileSchema } from "../consumer-integration/adapters/consumer-integration-schema-validator.js";
|
|
8
|
+
import { checkConsumerIntegration } from "../consumer-integration/index.js";
|
|
9
|
+
import { applyReachability, changedPaths, fileSnapshot, isQualificationEvidenceExcludedPath, qualificationEvidencePolicy, snapshot } from "./filesystem-evidence.js";
|
|
10
|
+
import { bootstrapQualificationInstallation, createProtocol, digest, documentResult, interruptAndRecover, readContainedBoundedFile, requireSuccess, signalOption } from "./qualification-runtime.js";
|
|
11
|
+
function canonicalJson(value) {
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
14
|
+
}
|
|
15
|
+
if (value !== null && typeof value === "object") {
|
|
16
|
+
return `{${Object.entries(value).toSorted(([left], [right]) => Buffer.compare(Buffer.from(left), Buffer.from(right)))
|
|
17
|
+
.map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(",")}}`;
|
|
18
|
+
}
|
|
19
|
+
return JSON.stringify(value);
|
|
20
|
+
}
|
|
21
|
+
async function readQualificationContractV2(root, path) {
|
|
22
|
+
const source = await readContainedBoundedFile(root, path, "Qualification contract");
|
|
23
|
+
const value = JSON.parse(source.bytes.toString("utf8"));
|
|
24
|
+
if (value.schemaVersion === 1) {
|
|
25
|
+
throw new Error("DOCS_QUALIFICATION_V1_MIGRATION_REQUIRED: replace fixtureRoot/tests/pins/paths/gate with schemaVersion 2 scenarios; managed integration owns package and route authority.");
|
|
26
|
+
}
|
|
27
|
+
const schema = JSON.parse(await readFile(new URL("../../schemas/docs-protocol-qualification/v2.schema.json", import.meta.url), "utf8"));
|
|
28
|
+
const validate = new Ajv2020({ allErrors: true, strict: true }).compile(schema);
|
|
29
|
+
if (!validate(value)) {
|
|
30
|
+
const details = (validate.errors ?? []).slice(0, 8).map(({ instancePath, message }) => `${instancePath || "/"} ${message ?? "is invalid"}`).join("; ");
|
|
31
|
+
throw new TypeError(`docs-protocol-qualification/v2 validation failed: ${details}`);
|
|
32
|
+
}
|
|
33
|
+
return Object.freeze({
|
|
34
|
+
contract: value,
|
|
35
|
+
evidence: Object.freeze({ path: source.path, digest: source.digest })
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function copyDisposableConsumer(sourceRoot, consumerRoot, policy) {
|
|
39
|
+
await cp(sourceRoot, consumerRoot, {
|
|
40
|
+
recursive: true,
|
|
41
|
+
errorOnExist: true,
|
|
42
|
+
force: false,
|
|
43
|
+
dereference: false,
|
|
44
|
+
async filter(source) {
|
|
45
|
+
const repositoryPath = relative(sourceRoot, source).split(sep).join("/");
|
|
46
|
+
if (repositoryPath === "") {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const metadata = await lstat(source);
|
|
50
|
+
const entryKind = metadata.isDirectory() ? "directory"
|
|
51
|
+
: metadata.isFile() ? "file"
|
|
52
|
+
: metadata.isSymbolicLink() ? "symbolic-link"
|
|
53
|
+
: "other";
|
|
54
|
+
return !await isQualificationEvidenceExcludedPath(sourceRoot, repositoryPath, policy, "source", entryKind);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
export async function overlayLocalDevelopmentSkill(consumerRoot, skillPath, enabled) {
|
|
59
|
+
if (!enabled) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const target = join(consumerRoot, skillPath);
|
|
63
|
+
const canonicalSkill = await readFile(new URL("../../skills/docs/SKILL.md", import.meta.url));
|
|
64
|
+
let handle;
|
|
65
|
+
try {
|
|
66
|
+
handle = await open(target, constants.O_WRONLY |
|
|
67
|
+
(process.platform === "win32" ? 0 : constants.O_NOFOLLOW));
|
|
68
|
+
const [opened, named] = await Promise.all([
|
|
69
|
+
handle.stat({ bigint: true }),
|
|
70
|
+
lstat(target, { bigint: true })
|
|
71
|
+
]);
|
|
72
|
+
if (!opened.isFile() || opened.nlink !== 1n || !named.isFile() || named.isSymbolicLink() ||
|
|
73
|
+
opened.dev !== named.dev || opened.ino !== named.ino || opened.birthtimeNs !== named.birthtimeNs) {
|
|
74
|
+
throw new Error("unsafe Skill target");
|
|
75
|
+
}
|
|
76
|
+
await handle.truncate(0);
|
|
77
|
+
await handle.writeFile(canonicalSkill);
|
|
78
|
+
const written = await handle.stat({ bigint: true });
|
|
79
|
+
if (!written.isFile() || written.nlink !== 1n || written.dev !== opened.dev || written.ino !== opened.ino ||
|
|
80
|
+
written.birthtimeNs !== opened.birthtimeNs || written.size !== BigInt(canonicalSkill.byteLength)) {
|
|
81
|
+
throw new Error("unstable Skill target");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (cause) {
|
|
85
|
+
throw new Error("Local-development qualification Skill target must be one stable, non-hardlinked regular file.", { cause });
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await handle?.close();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function scenarioRequest(scenario, consumerRoot, profilePath, signal) {
|
|
92
|
+
return {
|
|
93
|
+
consumerRoot,
|
|
94
|
+
profilePath,
|
|
95
|
+
intent: {
|
|
96
|
+
type: scenario.type,
|
|
97
|
+
id: scenario.intent.id,
|
|
98
|
+
title: scenario.intent.title,
|
|
99
|
+
owner: scenario.intent.owner,
|
|
100
|
+
summary: scenario.intent.summary,
|
|
101
|
+
...(scenario.intent.slug === undefined ? {} : { slug: scenario.intent.slug }),
|
|
102
|
+
...(scenario.intent.destination === undefined ? {} : { destination: scenario.intent.destination })
|
|
103
|
+
},
|
|
104
|
+
...(scenario.intent.related === undefined ? {} : { related: scenario.intent.related }),
|
|
105
|
+
...(scenario.intent.blockedBy === undefined ? {} : { blockedBy: scenario.intent.blockedBy }),
|
|
106
|
+
...(scenario.intent.codeAnchors === undefined ? {} : { codeAnchors: scenario.intent.codeAnchors }),
|
|
107
|
+
...(scenario.intent.metadata === undefined ? {} : { additionalMetadata: scenario.intent.metadata }),
|
|
108
|
+
...(signal === undefined ? {} : { signal })
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function assertExpectedScenario(scenario, result) {
|
|
112
|
+
if (result.documentPath !== scenario.expected.documentPath) {
|
|
113
|
+
throw new Error(`Qualification scenario ${scenario.id} path mismatch: ${result.documentPath}.`);
|
|
114
|
+
}
|
|
115
|
+
if (canonicalJson(result.reachability) !== canonicalJson(scenario.expected.reachability)) {
|
|
116
|
+
throw new Error(`Qualification scenario ${scenario.id} reachability mismatch.`);
|
|
117
|
+
}
|
|
118
|
+
if (scenario.expected.goldenDigest !== undefined && result.compiled.document.digest !== scenario.expected.goldenDigest) {
|
|
119
|
+
throw new Error(`Qualification scenario ${scenario.id} golden digest mismatch.`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function assertScenarioCoverage(contract, declaredTypes) {
|
|
123
|
+
const scenarioTypes = contract.scenarios.map(({ type }) => type);
|
|
124
|
+
if (new Set(contract.scenarios.map(({ id }) => id)).size !== contract.scenarios.length ||
|
|
125
|
+
new Set(scenarioTypes).size !== scenarioTypes.length || canonicalJson(scenarioTypes.toSorted()) !== canonicalJson(declaredTypes.toSorted())) {
|
|
126
|
+
throw new Error(`Qualification scenarios must cover every authorable type exactly once; expected ${declaredTypes.join(", ")}.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function assertManagedIntegrationAuthority(integration) {
|
|
130
|
+
await assertConsumerIntegrationProfileSchema(integration);
|
|
131
|
+
if (integration.schemaVersion !== 2 || integration.qualification === undefined) {
|
|
132
|
+
throw new Error("DOCS_QUALIFICATION_V1_MIGRATION_REQUIRED: managed integration schemaVersion 2 with qualification authority is required.");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function assertReleasedIntegrationCurrent(sourceRoot, integrationPath) {
|
|
136
|
+
const managed = await checkConsumerIntegration({
|
|
137
|
+
consumerRoot: sourceRoot,
|
|
138
|
+
integrationProfilePath: integrationPath
|
|
139
|
+
});
|
|
140
|
+
if (managed.outcome !== "current") {
|
|
141
|
+
throw new Error(`Released-cohort qualification requires a current exact managed integration: ${JSON.stringify(managed.issues)}.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function qualifyScenarios(input) {
|
|
145
|
+
const receipts = [];
|
|
146
|
+
for (const [index, scenario] of input.contract.scenarios.entries()) {
|
|
147
|
+
const scenarioBase = scenarioRequest(scenario, input.base.consumerRoot, input.base.profilePath, input.base.signal);
|
|
148
|
+
const beforePreview = await fileSnapshot(input.base.consumerRoot, input.evidencePolicy);
|
|
149
|
+
const preview = await input.protocol.newDocumentV2({ ...scenarioBase, apply: false });
|
|
150
|
+
const previewResult = documentResult(preview);
|
|
151
|
+
if (changedPaths(beforePreview, await fileSnapshot(input.base.consumerRoot, input.evidencePolicy)).length !== 0) {
|
|
152
|
+
throw new Error(`Qualification scenario ${scenario.id} preview mutated the disposable consumer.`);
|
|
153
|
+
}
|
|
154
|
+
assertExpectedScenario(scenario, previewResult);
|
|
155
|
+
if (scenario.expected.goldenFile !== undefined) {
|
|
156
|
+
const golden = await readContainedBoundedFile(input.base.consumerRoot, scenario.expected.goldenFile, `Qualification scenario ${scenario.id} golden file`);
|
|
157
|
+
if (golden.bytes.toString("utf8") !== previewResult.compiled.document.content) {
|
|
158
|
+
throw new Error(`Qualification scenario ${scenario.id} golden file mismatch.`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (index === 0) {
|
|
162
|
+
await interruptAndRecover({
|
|
163
|
+
base: scenarioBase,
|
|
164
|
+
consumerRoot: input.base.consumerRoot,
|
|
165
|
+
previewResult,
|
|
166
|
+
profilePath: input.base.profilePath,
|
|
167
|
+
protocol: input.protocol
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const applied = await input.protocol.newDocumentV2({ ...scenarioBase, apply: true });
|
|
172
|
+
const appliedResult = documentResult(applied);
|
|
173
|
+
if (appliedResult.planDigest !== previewResult.planDigest || appliedResult.compiled.document.content !== previewResult.compiled.document.content) {
|
|
174
|
+
throw new Error(`Qualification scenario ${scenario.id} preview/apply parity mismatch.`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const actual = await readFile(join(input.base.consumerRoot, previewResult.documentPath), "utf8");
|
|
178
|
+
if (actual !== previewResult.compiled.document.content) {
|
|
179
|
+
throw new Error(`Qualification scenario ${scenario.id} materialized bytes differ from preview.`);
|
|
180
|
+
}
|
|
181
|
+
await applyReachability(input.base.consumerRoot, previewResult.reachability);
|
|
182
|
+
requireSuccess(`check after ${scenario.id}`, await input.protocol.checkV2(input.base));
|
|
183
|
+
receipts.push({
|
|
184
|
+
id: scenario.id,
|
|
185
|
+
type: scenario.type,
|
|
186
|
+
documentPath: previewResult.documentPath,
|
|
187
|
+
outputDigest: previewResult.compiled.document.digest
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return Object.freeze(receipts.map((receipt) => Object.freeze(receipt)));
|
|
191
|
+
}
|
|
192
|
+
async function collectEvidence(input) {
|
|
193
|
+
const [profile, skill, packageManifest, lockfile, executingModule] = await Promise.all([
|
|
194
|
+
readContainedBoundedFile(input.consumerRoot, input.integration.profilePath, "Docs Protocol profile"),
|
|
195
|
+
readContainedBoundedFile(input.consumerRoot, input.integration.skillPath, "Documentation Skill"),
|
|
196
|
+
readContainedBoundedFile(input.consumerRoot, "package.json", "Package manifest"),
|
|
197
|
+
readContainedBoundedFile(input.consumerRoot, "pnpm-lock.yaml", "pnpm lockfile", 64 * 1024 * 1024),
|
|
198
|
+
readFile(fileURLToPath(import.meta.url))
|
|
199
|
+
]);
|
|
200
|
+
return {
|
|
201
|
+
executingModule,
|
|
202
|
+
lockfileDigest: lockfile.digest,
|
|
203
|
+
packageManifestDigest: packageManifest.digest,
|
|
204
|
+
profile: { path: profile.path, digest: profile.digest },
|
|
205
|
+
skill: { path: skill.path, digest: skill.digest }
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export async function runDocsProtocolQualificationV2(request) {
|
|
209
|
+
const sourceRoot = await realpath(resolvePath(request.consumerRoot));
|
|
210
|
+
const integrationPath = request.integrationPath ?? "architecture/foundation/docs-consumer-integration.json";
|
|
211
|
+
const integrationFile = await readContainedBoundedFile(sourceRoot, integrationPath, "Managed integration profile");
|
|
212
|
+
const integration = JSON.parse(integrationFile.bytes.toString("utf8"));
|
|
213
|
+
await assertManagedIntegrationAuthority(integration);
|
|
214
|
+
const qualifiedIntegration = integration;
|
|
215
|
+
const evidencePolicy = qualificationEvidencePolicy(qualifiedIntegration.governedDocsRoots ?? []);
|
|
216
|
+
const before = await snapshot(sourceRoot, evidencePolicy);
|
|
217
|
+
const qualification = await readQualificationContractV2(sourceRoot, qualifiedIntegration.qualification.contractPath);
|
|
218
|
+
if (request.localDevelopment !== true) {
|
|
219
|
+
await assertReleasedIntegrationCurrent(sourceRoot, integrationPath);
|
|
220
|
+
}
|
|
221
|
+
const temporary = await realpath(await mkdtemp(join(tmpdir(), "atd-q2-")));
|
|
222
|
+
const consumerRoot = join(temporary, "consumer");
|
|
223
|
+
try {
|
|
224
|
+
request.signal?.throwIfAborted();
|
|
225
|
+
await copyDisposableConsumer(sourceRoot, consumerRoot, evidencePolicy);
|
|
226
|
+
const executingPackages = await bootstrapQualificationInstallation(consumerRoot, request.localDevelopment === true);
|
|
227
|
+
await overlayLocalDevelopmentSkill(consumerRoot, qualifiedIntegration.skillPath, request.localDevelopment === true);
|
|
228
|
+
const manifest = JSON.parse(await readFile(join(consumerRoot, "package.json"), "utf8"));
|
|
229
|
+
if (typeof manifest.scripts?.["docs:protocol:check"] !== "string") {
|
|
230
|
+
throw new Error(`Managed qualification gate ${qualifiedIntegration.qualification.gateCommand} must resolve to a package script; it is never executed by qualification.`);
|
|
231
|
+
}
|
|
232
|
+
const protocol = createProtocol();
|
|
233
|
+
const base = { consumerRoot, profilePath: qualifiedIntegration.profilePath, ...signalOption(request.signal) };
|
|
234
|
+
const info = await protocol.infoV2(base);
|
|
235
|
+
requireSuccess("info", info);
|
|
236
|
+
const infoResult = info.envelope.result;
|
|
237
|
+
assertScenarioCoverage(qualification.contract, infoResult.types.map(({ type }) => type));
|
|
238
|
+
requireSuccess("find", await protocol.findV2({ ...base, query: {} }));
|
|
239
|
+
requireSuccess("check", await protocol.checkV2(base));
|
|
240
|
+
const initialDoctor = await protocol.doctorV2(base);
|
|
241
|
+
requireSuccess("doctor", initialDoctor);
|
|
242
|
+
const idleRecovery = await protocol.recoverV2(base);
|
|
243
|
+
requireSuccess("recover", idleRecovery);
|
|
244
|
+
if (idleRecovery.envelope.result.transactionState !== "no-pending-transaction") {
|
|
245
|
+
throw new Error("Qualification recover did not prove the initial idle state.");
|
|
246
|
+
}
|
|
247
|
+
const receipts = await qualifyScenarios({ base, contract: qualification.contract, evidencePolicy, protocol });
|
|
248
|
+
requireSuccess("doctor", await protocol.doctorV2(base));
|
|
249
|
+
requireSuccess("recover", await protocol.recoverV2(base));
|
|
250
|
+
if (await snapshot(sourceRoot, evidencePolicy) !== before) {
|
|
251
|
+
throw new Error("Qualification modified its source consumer.");
|
|
252
|
+
}
|
|
253
|
+
const evidence = await collectEvidence({
|
|
254
|
+
consumerRoot,
|
|
255
|
+
integration: qualifiedIntegration
|
|
256
|
+
});
|
|
257
|
+
const environment = initialDoctor.envelope.result.environment;
|
|
258
|
+
if (request.localDevelopment !== true && (executingPackages.docsVersion !== qualifiedIntegration.cohort.packages.docsProtocol.version ||
|
|
259
|
+
executingPackages.foundationVersion !== qualifiedIntegration.cohort.packages.engineeringFoundation.version ||
|
|
260
|
+
environment.installedFoundationVersion !== qualifiedIntegration.cohort.packages.engineeringFoundation.version)) {
|
|
261
|
+
throw new Error("Released-cohort qualification execution identity does not match the exact cohort package versions.");
|
|
262
|
+
}
|
|
263
|
+
const hasGolden = qualification.contract.scenarios.some(({ expected }) => expected.goldenFile !== undefined || expected.goldenDigest !== undefined);
|
|
264
|
+
const body = Object.freeze({
|
|
265
|
+
schemaVersion: 2,
|
|
266
|
+
cohortAdmissible: request.localDevelopment !== true,
|
|
267
|
+
evidenceClass: request.localDevelopment === true ? "local-development" : "released-cohort",
|
|
268
|
+
projectId: infoResult.projectId,
|
|
269
|
+
scenarios: receipts,
|
|
270
|
+
checks: Object.freeze([
|
|
271
|
+
"info", "find", "check", "doctor", "recover", "preview", "apply", "path", "reachability",
|
|
272
|
+
...(hasGolden ? ["golden"] : []),
|
|
273
|
+
"source-unchanged"
|
|
274
|
+
]),
|
|
275
|
+
derived: Object.freeze({
|
|
276
|
+
contractPath: qualifiedIntegration.qualification.contractPath,
|
|
277
|
+
gateCommand: qualifiedIntegration.qualification.gateCommand,
|
|
278
|
+
packageVersions: Object.freeze({
|
|
279
|
+
docsProtocol: qualifiedIntegration.cohort.packages.docsProtocol.version,
|
|
280
|
+
engineeringFoundation: qualifiedIntegration.cohort.packages.engineeringFoundation.version
|
|
281
|
+
}),
|
|
282
|
+
profilePath: qualifiedIntegration.profilePath
|
|
283
|
+
}),
|
|
284
|
+
evidence: Object.freeze({
|
|
285
|
+
sourceDigest: before,
|
|
286
|
+
integration: Object.freeze({ path: integrationPath, digest: integrationFile.digest }),
|
|
287
|
+
contract: qualification.evidence,
|
|
288
|
+
profile: Object.freeze(evidence.profile),
|
|
289
|
+
skill: Object.freeze(evidence.skill),
|
|
290
|
+
packageManifestDigest: evidence.packageManifestDigest,
|
|
291
|
+
lockfileDigest: evidence.lockfileDigest,
|
|
292
|
+
executingDocsProtocol: Object.freeze({ version: executingPackages.docsVersion, buildDigest: digest(evidence.executingModule) }),
|
|
293
|
+
executingFoundation: Object.freeze({
|
|
294
|
+
version: environment.installedFoundationVersion,
|
|
295
|
+
buildIdentity: environment.installedFoundationBuildIdentity
|
|
296
|
+
}),
|
|
297
|
+
cohort: Object.freeze({ ...qualifiedIntegration.cohort })
|
|
298
|
+
})
|
|
299
|
+
});
|
|
300
|
+
return Object.freeze({ ...body, receiptDigest: digest(canonicalJson(body)) });
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
await rm(temporary, { recursive: true, force: true });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=qualification-v2-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qualification-v2-runner.js","sourceRoot":"","sources":["../../src/qualification/qualification-v2-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { DocumentJsonValue } from "@agent-teams/engineering-foundation/document-authoring";
|
|
2
|
+
export interface DocsProtocolQualificationScenarioV2 {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly type: string;
|
|
5
|
+
readonly intent: {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly title: string;
|
|
8
|
+
readonly owner: string;
|
|
9
|
+
readonly summary: string;
|
|
10
|
+
readonly slug?: string;
|
|
11
|
+
readonly destination?: string;
|
|
12
|
+
readonly related?: readonly string[];
|
|
13
|
+
readonly blockedBy?: readonly string[];
|
|
14
|
+
readonly codeAnchors?: readonly {
|
|
15
|
+
readonly enforcement: "advisory" | "required";
|
|
16
|
+
readonly pattern: string;
|
|
17
|
+
}[];
|
|
18
|
+
readonly metadata?: Readonly<Record<string, DocumentJsonValue>>;
|
|
19
|
+
};
|
|
20
|
+
readonly expected: {
|
|
21
|
+
readonly documentPath: string;
|
|
22
|
+
readonly metadataStorage: "frontmatter";
|
|
23
|
+
readonly reachability: unknown;
|
|
24
|
+
readonly goldenFile?: string;
|
|
25
|
+
readonly goldenDigest?: `sha256:${string}`;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface DocsProtocolQualificationContractV2 {
|
|
29
|
+
readonly schemaVersion: 2;
|
|
30
|
+
readonly scenarios: readonly DocsProtocolQualificationScenarioV2[];
|
|
31
|
+
}
|
|
32
|
+
export interface DocsProtocolQualificationV2Request {
|
|
33
|
+
readonly consumerRoot: string;
|
|
34
|
+
readonly integrationPath?: string;
|
|
35
|
+
readonly localDevelopment?: boolean;
|
|
36
|
+
readonly signal?: AbortSignal;
|
|
37
|
+
}
|
|
38
|
+
export interface DocsProtocolQualificationReceiptV2 {
|
|
39
|
+
readonly schemaVersion: 2;
|
|
40
|
+
readonly receiptDigest: `sha256:${string}`;
|
|
41
|
+
readonly cohortAdmissible: boolean;
|
|
42
|
+
readonly evidenceClass: "local-development" | "released-cohort";
|
|
43
|
+
readonly projectId: string;
|
|
44
|
+
readonly scenarios: readonly {
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly type: string;
|
|
47
|
+
readonly documentPath: string;
|
|
48
|
+
readonly outputDigest: string;
|
|
49
|
+
}[];
|
|
50
|
+
readonly checks: readonly ("info" | "find" | "check" | "doctor" | "recover" | "preview" | "apply" | "path" | "reachability" | "golden" | "source-unchanged")[];
|
|
51
|
+
readonly derived: {
|
|
52
|
+
readonly contractPath: string;
|
|
53
|
+
readonly gateCommand: string;
|
|
54
|
+
readonly packageVersions: {
|
|
55
|
+
readonly docsProtocol: string;
|
|
56
|
+
readonly engineeringFoundation: string;
|
|
57
|
+
};
|
|
58
|
+
readonly profilePath: string;
|
|
59
|
+
};
|
|
60
|
+
readonly evidence: {
|
|
61
|
+
readonly sourceDigest: `sha256:${string}`;
|
|
62
|
+
readonly integration: {
|
|
63
|
+
readonly path: string;
|
|
64
|
+
readonly digest: `sha256:${string}`;
|
|
65
|
+
};
|
|
66
|
+
readonly contract: {
|
|
67
|
+
readonly path: string;
|
|
68
|
+
readonly digest: `sha256:${string}`;
|
|
69
|
+
};
|
|
70
|
+
readonly profile: {
|
|
71
|
+
readonly path: string;
|
|
72
|
+
readonly digest: `sha256:${string}`;
|
|
73
|
+
};
|
|
74
|
+
readonly skill: {
|
|
75
|
+
readonly path: string;
|
|
76
|
+
readonly digest: `sha256:${string}`;
|
|
77
|
+
};
|
|
78
|
+
readonly packageManifestDigest: `sha256:${string}`;
|
|
79
|
+
readonly lockfileDigest: `sha256:${string}`;
|
|
80
|
+
readonly executingDocsProtocol: {
|
|
81
|
+
readonly version: string;
|
|
82
|
+
readonly buildDigest: `sha256:${string}`;
|
|
83
|
+
};
|
|
84
|
+
readonly executingFoundation: {
|
|
85
|
+
readonly version: string;
|
|
86
|
+
readonly buildIdentity: `sha256:${string}`;
|
|
87
|
+
};
|
|
88
|
+
readonly cohort: Readonly<Record<string, unknown>>;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=v2-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-contract.d.ts","sourceRoot":"","sources":["../../src/qualification/v2-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-contract.js","sourceRoot":"","sources":["../../src/qualification/v2-contract.ts"],"names":[],"mappings":""}
|