@agent-teams/docs-protocol 0.0.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 +7 -0
- package/LICENSE +201 -0
- package/README.md +92 -0
- package/dist/adapters/adoption-input.d.ts +9 -0
- package/dist/adapters/adoption-input.d.ts.map +1 -0
- package/dist/adapters/adoption-input.js +72 -0
- package/dist/adapters/adoption-input.js.map +1 -0
- package/dist/adapters/adoption-package-identity.d.ts +7 -0
- package/dist/adapters/adoption-package-identity.d.ts.map +1 -0
- package/dist/adapters/adoption-package-identity.js +69 -0
- package/dist/adapters/adoption-package-identity.js.map +1 -0
- package/dist/adapters/docs-command-envelope-schema-validator.d.ts +2 -0
- package/dist/adapters/docs-command-envelope-schema-validator.d.ts.map +1 -0
- package/dist/adapters/docs-command-envelope-schema-validator.js +24 -0
- package/dist/adapters/docs-command-envelope-schema-validator.js.map +1 -0
- package/dist/adapters/docs-profile-schema-validator.d.ts +2 -0
- package/dist/adapters/docs-profile-schema-validator.d.ts.map +1 -0
- package/dist/adapters/docs-profile-schema-validator.js +28 -0
- package/dist/adapters/docs-profile-schema-validator.js.map +1 -0
- package/dist/adapters/foundation-docs-port.d.ts +12 -0
- package/dist/adapters/foundation-docs-port.d.ts.map +1 -0
- package/dist/adapters/foundation-docs-port.js +108 -0
- package/dist/adapters/foundation-docs-port.js.map +1 -0
- package/dist/adapters/node-adoption-inspector.d.ts +5 -0
- package/dist/adapters/node-adoption-inspector.d.ts.map +1 -0
- package/dist/adapters/node-adoption-inspector.js +102 -0
- package/dist/adapters/node-adoption-inspector.js.map +1 -0
- package/dist/adapters/node-code-anchor-matcher.d.ts +5 -0
- package/dist/adapters/node-code-anchor-matcher.d.ts.map +1 -0
- package/dist/adapters/node-code-anchor-matcher.js +65 -0
- package/dist/adapters/node-code-anchor-matcher.js.map +1 -0
- package/dist/adapters/node-profile-reader.d.ts +9 -0
- package/dist/adapters/node-profile-reader.d.ts.map +1 -0
- package/dist/adapters/node-profile-reader.js +118 -0
- package/dist/adapters/node-profile-reader.js.map +1 -0
- package/dist/application/authority-handshake.d.ts +14 -0
- package/dist/application/authority-handshake.d.ts.map +1 -0
- package/dist/application/authority-handshake.js +15 -0
- package/dist/application/authority-handshake.js.map +1 -0
- package/dist/application/docs-new-completion.d.ts +33 -0
- package/dist/application/docs-new-completion.d.ts.map +1 -0
- package/dist/application/docs-new-completion.js +226 -0
- package/dist/application/docs-new-completion.js.map +1 -0
- package/dist/application/docs-protocol.d.ts +168 -0
- package/dist/application/docs-protocol.d.ts.map +1 -0
- package/dist/application/docs-protocol.js +450 -0
- package/dist/application/docs-protocol.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/composition/cli.d.ts +4 -0
- package/dist/composition/cli.d.ts.map +1 -0
- package/dist/composition/cli.js +436 -0
- package/dist/composition/cli.js.map +1 -0
- package/dist/composition/node-docs-api.d.ts +148 -0
- package/dist/composition/node-docs-api.d.ts.map +1 -0
- package/dist/composition/node-docs-api.js +38 -0
- package/dist/composition/node-docs-api.js.map +1 -0
- package/dist/domain/document-semantics.d.ts +7 -0
- package/dist/domain/document-semantics.d.ts.map +1 -0
- package/dist/domain/document-semantics.js +146 -0
- package/dist/domain/document-semantics.js.map +1 -0
- package/dist/domain/model.d.ts +285 -0
- package/dist/domain/model.d.ts.map +1 -0
- package/dist/domain/model.js +3 -0
- package/dist/domain/model.js.map +1 -0
- package/dist/domain/profile-policy.d.ts +7 -0
- package/dist/domain/profile-policy.d.ts.map +1 -0
- package/dist/domain/profile-policy.js +109 -0
- package/dist/domain/profile-policy.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/qualification/index.d.ts +23 -0
- package/dist/qualification/index.d.ts.map +1 -0
- package/dist/qualification/index.js +462 -0
- package/dist/qualification/index.js.map +1 -0
- package/package.json +64 -0
- package/schemas/docs-protocol/v1.schema.json +12 -0
- package/schemas/docs-protocol-command-envelope/v1.schema.json +239 -0
- package/schemas/docs-protocol-profile/v1.schema.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DocsFindQuery, DocsNewRequest } from "../domain/model.js";
|
|
2
|
+
export type { DocsFindQuery, DocsNewRequest } from "../domain/model.js";
|
|
3
|
+
export interface DocsProtocolQualificationScenario {
|
|
4
|
+
readonly find: {
|
|
5
|
+
readonly expectedIds: readonly string[];
|
|
6
|
+
readonly query: DocsFindQuery;
|
|
7
|
+
};
|
|
8
|
+
readonly newDocument: Omit<DocsNewRequest, "apply" | "consumerRoot" | "profilePath" | "signal">;
|
|
9
|
+
}
|
|
10
|
+
export interface DocsProtocolQualificationRequest {
|
|
11
|
+
readonly fixtureRoot: string;
|
|
12
|
+
readonly profilePath?: string;
|
|
13
|
+
readonly scenario: DocsProtocolQualificationScenario;
|
|
14
|
+
readonly signal?: AbortSignal;
|
|
15
|
+
}
|
|
16
|
+
export interface DocsProtocolQualificationReceipt {
|
|
17
|
+
readonly appliedDocumentPath: string;
|
|
18
|
+
readonly checks: readonly ["info", "find", "preview", "crash", "doctor", "recover", "receipt", "parent", "apply", "index", "check", "source-unchanged"];
|
|
19
|
+
readonly projectId: string;
|
|
20
|
+
readonly schemaVersion: 1;
|
|
21
|
+
}
|
|
22
|
+
export declare function runDocsProtocolQualification(request: DocsProtocolQualificationRequest): Promise<DocsProtocolQualificationReceipt>;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/qualification/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,CAAC,CAAC;CACjG;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,iCAAiC,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACxJ,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;CAC3B;AAuZD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAwEvI"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { cp, lstat, mkdir, mkdtemp, open, opendir, readFile, realpath, rename, rm, symlink, writeFile } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { basename, dirname, join, relative, resolve as resolvePath, sep } from "node:path";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { planDocumentationDocumentV2 } from "@agent-teams/engineering-foundation/document-authoring";
|
|
9
|
+
import { DocsProtocol } from "../application/docs-protocol.js";
|
|
10
|
+
import { NodeDocsAdoptionInspector } from "../adapters/node-adoption-inspector.js";
|
|
11
|
+
import { NodeCodeAnchorMatcher } from "../adapters/node-code-anchor-matcher.js";
|
|
12
|
+
import { NodeFoundationDocsPort } from "../adapters/foundation-docs-port.js";
|
|
13
|
+
import { NodeDocsProfileReader } from "../adapters/node-profile-reader.js";
|
|
14
|
+
import { normalizeCodeAnchors, normalizeDocumentIds } from "../domain/document-semantics.js";
|
|
15
|
+
async function treeEntries(root) {
|
|
16
|
+
const entries = [];
|
|
17
|
+
async function visit(directory) {
|
|
18
|
+
const handle = await opendir(directory);
|
|
19
|
+
for await (const entry of handle) {
|
|
20
|
+
const absolute = join(directory, entry.name);
|
|
21
|
+
const repositoryPath = relative(root, absolute).split(sep).join("/");
|
|
22
|
+
if (repositoryPath === "node_modules") {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (entry.isSymbolicLink()) {
|
|
26
|
+
throw new Error(`Qualification fixtures cannot contain symlinks: ${repositoryPath}`);
|
|
27
|
+
}
|
|
28
|
+
if (entry.isDirectory()) {
|
|
29
|
+
entries.push({ kind: "directory", path: repositoryPath });
|
|
30
|
+
await visit(absolute);
|
|
31
|
+
}
|
|
32
|
+
else if (entry.isFile()) {
|
|
33
|
+
entries.push({ kind: "file", path: repositoryPath });
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error(`Qualification fixtures must contain only directories and regular files: ${repositoryPath}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
await visit(root);
|
|
41
|
+
return Object.freeze(entries.toSorted((left, right) => Buffer.compare(Buffer.from(`${left.kind}\0${left.path}`), Buffer.from(`${right.kind}\0${right.path}`))));
|
|
42
|
+
}
|
|
43
|
+
async function bootstrapQualificationInstallation(consumerRoot) {
|
|
44
|
+
const docsManifestPath = fileURLToPath(new URL("../../package.json", import.meta.url));
|
|
45
|
+
const foundationManifestPath = fileURLToPath(import.meta.resolve("@agent-teams/engineering-foundation/package.json"));
|
|
46
|
+
const [docsManifest, foundationManifest, consumerManifest] = await Promise.all([
|
|
47
|
+
readFile(docsManifestPath, "utf8").then((source) => JSON.parse(source)),
|
|
48
|
+
readFile(foundationManifestPath, "utf8").then((source) => JSON.parse(source)),
|
|
49
|
+
readFile(join(consumerRoot, "package.json"), "utf8").then((source) => JSON.parse(source))
|
|
50
|
+
]);
|
|
51
|
+
await writeFile(join(consumerRoot, "package.json"), `${JSON.stringify({
|
|
52
|
+
...consumerManifest,
|
|
53
|
+
devDependencies: {
|
|
54
|
+
"@agent-teams/docs-protocol": docsManifest.version,
|
|
55
|
+
"@agent-teams/engineering-foundation": foundationManifest.version
|
|
56
|
+
}
|
|
57
|
+
}, null, 2)}\n`, "utf8");
|
|
58
|
+
const scope = join(consumerRoot, "node_modules", "@agent-teams");
|
|
59
|
+
await mkdir(scope, { recursive: true });
|
|
60
|
+
await Promise.all([
|
|
61
|
+
symlink(dirname(docsManifestPath), join(scope, "docs-protocol"), process.platform === "win32" ? "junction" : "dir"),
|
|
62
|
+
symlink(dirname(foundationManifestPath), join(scope, "engineering-foundation"), process.platform === "win32" ? "junction" : "dir")
|
|
63
|
+
]);
|
|
64
|
+
await writeFile(join(consumerRoot, ".agent-teams-document-authoring-qualification-fixture.json"), `${JSON.stringify({
|
|
65
|
+
schemaVersion: 1,
|
|
66
|
+
kind: "agent-teams-document-authoring-qualification-fixture",
|
|
67
|
+
consumerRoot: await realpath(consumerRoot)
|
|
68
|
+
})}\n`, "utf8");
|
|
69
|
+
}
|
|
70
|
+
async function snapshot(root) {
|
|
71
|
+
const hash = createHash("sha256");
|
|
72
|
+
for (const entry of await treeEntries(root)) {
|
|
73
|
+
hash.update(entry.kind);
|
|
74
|
+
hash.update("\0");
|
|
75
|
+
hash.update(entry.path);
|
|
76
|
+
hash.update("\0");
|
|
77
|
+
if (entry.kind === "file") {
|
|
78
|
+
hash.update(await readFile(join(root, entry.path)));
|
|
79
|
+
hash.update("\0");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return `sha256:${hash.digest("hex")}`;
|
|
83
|
+
}
|
|
84
|
+
async function fileSnapshot(root) {
|
|
85
|
+
const result = new Map();
|
|
86
|
+
for (const entry of await treeEntries(root)) {
|
|
87
|
+
const key = `${entry.kind}:${entry.path}`;
|
|
88
|
+
result.set(key, entry.kind === "directory"
|
|
89
|
+
? "directory"
|
|
90
|
+
: `sha256:${createHash("sha256").update(await readFile(join(root, entry.path))).digest("hex")}`);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
async function crashAtDurablePublishing(consumerRoot, plan) {
|
|
95
|
+
const planPath = join(consumerRoot, ".qualification-crash-plan.json");
|
|
96
|
+
const workerPath = join(consumerRoot, ".qualification-crash-worker.mjs");
|
|
97
|
+
await writeFile(planPath, `${JSON.stringify(plan)}\n`, "utf8");
|
|
98
|
+
await writeFile(workerPath, [
|
|
99
|
+
'import { readFile } from "node:fs/promises";',
|
|
100
|
+
'import { runDocumentAuthoringCrashQualification } from "@agent-teams/engineering-foundation/document-authoring/qualification";',
|
|
101
|
+
"const [consumerRoot, planPath] = process.argv.slice(2);",
|
|
102
|
+
'const plan = JSON.parse(await readFile(planPath, "utf8"));',
|
|
103
|
+
'await runDocumentAuthoringCrashQualification({ consumerRoot, plan, crashPoint: "after-publishing-journal-durable" });',
|
|
104
|
+
""
|
|
105
|
+
].join("\n"), "utf8");
|
|
106
|
+
const child = spawn(process.execPath, [workerPath, consumerRoot, planPath], {
|
|
107
|
+
cwd: consumerRoot,
|
|
108
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
109
|
+
});
|
|
110
|
+
let stderr = "";
|
|
111
|
+
let stdout = "";
|
|
112
|
+
child.stderr.setEncoding("utf8");
|
|
113
|
+
child.stderr.on("data", (chunk) => { stderr += chunk; });
|
|
114
|
+
const exited = new Promise((resolve) => {
|
|
115
|
+
child.once("exit", (code, signal) => { resolve({ code, signal }); });
|
|
116
|
+
});
|
|
117
|
+
try {
|
|
118
|
+
await new Promise((resolve, reject) => {
|
|
119
|
+
const deadline = setTimeout(() => { reject(new Error(`Qualification crash driver did not reach durable PUBLISHING: ${stderr}`)); }, 30_000);
|
|
120
|
+
child.stdout.setEncoding("utf8");
|
|
121
|
+
child.stdout.on("data", (chunk) => {
|
|
122
|
+
stdout += chunk;
|
|
123
|
+
if (stdout.includes('{"schemaVersion":1,"event":"document-authoring-qualification-crash-point","crashPoint":"after-publishing-journal-durable"}\n')) {
|
|
124
|
+
clearTimeout(deadline);
|
|
125
|
+
resolve();
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
child.once("error", (error) => { clearTimeout(deadline); reject(error); });
|
|
129
|
+
child.once("exit", (code, signal) => {
|
|
130
|
+
clearTimeout(deadline);
|
|
131
|
+
reject(new Error(`Qualification crash driver exited before checkpoint: ${code}/${signal}: ${stderr}`));
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
if (!child.kill("SIGKILL")) {
|
|
135
|
+
throw new Error("Qualification could not terminate its disposable crash driver.");
|
|
136
|
+
}
|
|
137
|
+
const termination = await exited;
|
|
138
|
+
if (termination.signal !== "SIGKILL") {
|
|
139
|
+
throw new Error(`Qualification crash driver did not terminate through SIGKILL: ${termination.code}/${termination.signal}.`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
144
|
+
child.kill("SIGKILL");
|
|
145
|
+
}
|
|
146
|
+
await rm(workerPath, { force: true });
|
|
147
|
+
await rm(planPath, { force: true });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function changedPaths(before, after) {
|
|
151
|
+
return Object.freeze([...new Set([...before.keys(), ...after.keys()])]
|
|
152
|
+
.filter((path) => before.get(path) !== after.get(path))
|
|
153
|
+
.toSorted((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right))));
|
|
154
|
+
}
|
|
155
|
+
function requireSuccess(label, execution) {
|
|
156
|
+
if (execution.exitCode !== 0) {
|
|
157
|
+
throw new Error(`Docs Protocol qualification ${label} failed with exit code ${execution.exitCode}.`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function documentResult(execution) {
|
|
161
|
+
requireSuccess("document", execution);
|
|
162
|
+
const result = execution.envelope.result;
|
|
163
|
+
if (typeof result["documentPath"] !== "string" || typeof result["planDigest"] !== "string" || !("reachability" in result)) {
|
|
164
|
+
throw new Error("Docs Protocol qualification expected a successful document result.");
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
documentPath: result["documentPath"],
|
|
168
|
+
planDigest: result["planDigest"],
|
|
169
|
+
...(typeof result["receiptDigest"] === "string" ? { receiptDigest: result["receiptDigest"] } : {}),
|
|
170
|
+
reachability: result["reachability"]
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
async function parentState(root, documentPath) {
|
|
174
|
+
const repositoryParent = dirname(documentPath);
|
|
175
|
+
const absolute = resolvePath(root, repositoryParent);
|
|
176
|
+
const relativeParent = relative(resolvePath(root), absolute);
|
|
177
|
+
if (relativeParent === ".." || relativeParent.startsWith(`..${sep}`)) {
|
|
178
|
+
throw new Error("Qualification document parent escapes its owned temporary consumer.");
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const metadata = await lstat(absolute);
|
|
182
|
+
if (metadata.isSymbolicLink() || !metadata.isDirectory()) {
|
|
183
|
+
throw new Error("Qualification document parent must be a real directory.");
|
|
184
|
+
}
|
|
185
|
+
return "directory";
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
if (error.code === "ENOENT") {
|
|
189
|
+
return "missing";
|
|
190
|
+
}
|
|
191
|
+
throw error;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const MAX_REACHABILITY_INDEX_BYTES = 8 * 1024 * 1024;
|
|
195
|
+
function sameFileObservation(left, right) {
|
|
196
|
+
return left.dev === right.dev && left.ino === right.ino && left.mtimeNs === right.mtimeNs && left.size === right.size;
|
|
197
|
+
}
|
|
198
|
+
async function readAtMost(handle, maximumBytes) {
|
|
199
|
+
const chunks = [];
|
|
200
|
+
let total = 0;
|
|
201
|
+
while (total <= maximumBytes) {
|
|
202
|
+
const remaining = maximumBytes + 1 - total;
|
|
203
|
+
const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, remaining));
|
|
204
|
+
const { bytesRead } = await handle.read(chunk, 0, chunk.byteLength, null);
|
|
205
|
+
if (bytesRead === 0) {
|
|
206
|
+
return Buffer.concat(chunks, total);
|
|
207
|
+
}
|
|
208
|
+
chunks.push(chunk.subarray(0, bytesRead));
|
|
209
|
+
total += bytesRead;
|
|
210
|
+
}
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
async function verifyCurrentRegularFile(path, expected) {
|
|
214
|
+
const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
|
|
215
|
+
const handle = await open(path, constants.O_RDONLY | noFollow);
|
|
216
|
+
try {
|
|
217
|
+
const metadata = await handle.stat({ bigint: true });
|
|
218
|
+
if (!metadata.isFile() || metadata.dev !== expected.dev || metadata.ino !== expected.ino) {
|
|
219
|
+
throw new Error("Qualification reachability index identity changed before atomic publication.");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
await handle.close();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async function verifyPublishedFile(path, expected) {
|
|
227
|
+
const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
|
|
228
|
+
const handle = await open(path, constants.O_RDONLY | noFollow);
|
|
229
|
+
try {
|
|
230
|
+
const before = await handle.stat({ bigint: true });
|
|
231
|
+
const bytes = await readAtMost(handle, MAX_REACHABILITY_INDEX_BYTES);
|
|
232
|
+
const after = await handle.stat({ bigint: true });
|
|
233
|
+
if (!before.isFile() || bytes === undefined || !sameFileObservation(before, after) || !bytes.equals(expected)) {
|
|
234
|
+
throw new Error("Qualification reachability index atomic publication could not be verified.");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
await handle.close();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function syncDirectory(path) {
|
|
242
|
+
try {
|
|
243
|
+
const handle = await open(path, "r");
|
|
244
|
+
try {
|
|
245
|
+
await handle.sync();
|
|
246
|
+
}
|
|
247
|
+
finally {
|
|
248
|
+
await handle.close();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
const code = error.code;
|
|
253
|
+
if (process.platform !== "win32" || !["EACCES", "EINVAL", "EISDIR", "EPERM"].includes(code ?? "")) {
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function createProtocol() {
|
|
259
|
+
return new DocsProtocol({
|
|
260
|
+
adoption: new NodeDocsAdoptionInspector(),
|
|
261
|
+
anchors: new NodeCodeAnchorMatcher(),
|
|
262
|
+
foundation: new NodeFoundationDocsPort(),
|
|
263
|
+
profiles: new NodeDocsProfileReader()
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
async function applyReachability(root, reachability) {
|
|
267
|
+
const action = reachability;
|
|
268
|
+
if (action["state"] === "not-required") {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (action["state"] !== "manual-required" || typeof action["indexPath"] !== "string" || typeof action["markdownLink"] !== "string") {
|
|
272
|
+
throw new Error("Qualification apply did not emit one explicit reachability action.");
|
|
273
|
+
}
|
|
274
|
+
const indexPath = resolvePath(root, action["indexPath"]);
|
|
275
|
+
const physicalRoot = await realpath(root);
|
|
276
|
+
const noFollow = process.platform === "win32" ? 0 : constants.O_NOFOLLOW;
|
|
277
|
+
const nonBlocking = process.platform === "win32" ? 0 : constants.O_NONBLOCK;
|
|
278
|
+
const sourceHandle = await open(indexPath, constants.O_RDONLY | noFollow | nonBlocking);
|
|
279
|
+
let source;
|
|
280
|
+
let identity;
|
|
281
|
+
let mode;
|
|
282
|
+
try {
|
|
283
|
+
const before = await sourceHandle.stat({ bigint: true });
|
|
284
|
+
if (!before.isFile() || before.size > BigInt(MAX_REACHABILITY_INDEX_BYTES)) {
|
|
285
|
+
throw new Error("Qualification reachability index is not a bounded regular file.");
|
|
286
|
+
}
|
|
287
|
+
const physicalIndex = await realpath(indexPath);
|
|
288
|
+
const pathFromRoot = relative(physicalRoot, physicalIndex);
|
|
289
|
+
if (pathFromRoot === ".." || pathFromRoot.startsWith(`..${sep}`) || physicalIndex !== indexPath) {
|
|
290
|
+
throw new Error("Qualification reachability index is not a contained regular file without symlinks.");
|
|
291
|
+
}
|
|
292
|
+
await verifyCurrentRegularFile(physicalIndex, before);
|
|
293
|
+
const bytes = await readAtMost(sourceHandle, MAX_REACHABILITY_INDEX_BYTES);
|
|
294
|
+
const after = await sourceHandle.stat({ bigint: true });
|
|
295
|
+
if (bytes === undefined || !sameFileObservation(before, after) || after.size !== BigInt(bytes.byteLength)) {
|
|
296
|
+
throw new Error("Qualification reachability index changed during its bounded read.");
|
|
297
|
+
}
|
|
298
|
+
source = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
299
|
+
identity = { dev: after.dev, ino: after.ino };
|
|
300
|
+
mode = Number(after.mode & 511n);
|
|
301
|
+
}
|
|
302
|
+
finally {
|
|
303
|
+
await sourceHandle.close();
|
|
304
|
+
}
|
|
305
|
+
const next = Buffer.from(`${source.replace(/\n?$/u, "\n")}- ${action["markdownLink"]}\n`);
|
|
306
|
+
if (next.byteLength > MAX_REACHABILITY_INDEX_BYTES) {
|
|
307
|
+
throw new Error("Qualification reachability index update exceeds its bounded size.");
|
|
308
|
+
}
|
|
309
|
+
const parent = dirname(indexPath);
|
|
310
|
+
const temporary = join(parent, `.${basename(indexPath)}.docs-protocol-${randomUUID()}.tmp`);
|
|
311
|
+
let temporaryExists = false;
|
|
312
|
+
try {
|
|
313
|
+
const temporaryHandle = await open(temporary, "wx", mode);
|
|
314
|
+
temporaryExists = true;
|
|
315
|
+
try {
|
|
316
|
+
await temporaryHandle.writeFile(next);
|
|
317
|
+
await temporaryHandle.chmod(mode);
|
|
318
|
+
await temporaryHandle.sync();
|
|
319
|
+
}
|
|
320
|
+
finally {
|
|
321
|
+
await temporaryHandle.close();
|
|
322
|
+
}
|
|
323
|
+
await verifyCurrentRegularFile(indexPath, identity);
|
|
324
|
+
await rename(temporary, indexPath);
|
|
325
|
+
temporaryExists = false;
|
|
326
|
+
await verifyPublishedFile(indexPath, next);
|
|
327
|
+
await syncDirectory(parent);
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
if (temporaryExists) {
|
|
331
|
+
await rm(temporary, { force: true });
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function qualificationMetadata(base, blockedBy, codeAnchors) {
|
|
336
|
+
return {
|
|
337
|
+
...base.additionalMetadata,
|
|
338
|
+
...(blockedBy.length === 0 ? {} : { blocked_by: blockedBy }),
|
|
339
|
+
...(codeAnchors.length === 0
|
|
340
|
+
? {}
|
|
341
|
+
: { code_anchors: codeAnchors.map(({ enforcement, pattern }) => ({ enforcement, pattern })) })
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
async function interruptAndRecover(input) {
|
|
345
|
+
const profile = await new NodeDocsProfileReader().read({
|
|
346
|
+
consumerRoot: input.consumerRoot,
|
|
347
|
+
profilePath: input.profilePath,
|
|
348
|
+
...(input.base.signal === undefined ? {} : { signal: input.base.signal })
|
|
349
|
+
});
|
|
350
|
+
const blockedBy = normalizeDocumentIds(input.base.blockedBy ?? [], "blocked_by");
|
|
351
|
+
const related = normalizeDocumentIds([...(input.base.related ?? []), ...blockedBy], "related");
|
|
352
|
+
const codeAnchors = normalizeCodeAnchors(input.base.codeAnchors ?? []);
|
|
353
|
+
const additionalMetadata = qualificationMetadata(input.base, blockedBy, codeAnchors);
|
|
354
|
+
const crashPlan = await planDocumentationDocumentV2({
|
|
355
|
+
consumerRoot: input.consumerRoot,
|
|
356
|
+
profilePath: profile.foundationProfile.path,
|
|
357
|
+
parentPolicy: "create-missing-real-directories",
|
|
358
|
+
intent: {
|
|
359
|
+
schemaVersion: 1,
|
|
360
|
+
...input.base.intent,
|
|
361
|
+
...(related.length === 0 ? {} : { related }),
|
|
362
|
+
...(Object.keys(additionalMetadata).length === 0 ? {} : { additionalMetadata })
|
|
363
|
+
},
|
|
364
|
+
...(input.base.signal === undefined ? {} : { signal: input.base.signal })
|
|
365
|
+
});
|
|
366
|
+
if (crashPlan.destination !== input.previewResult.documentPath || crashPlan.planDigest !== input.previewResult.planDigest) {
|
|
367
|
+
throw new Error("Qualification crash Plan differs from the unified Docs Protocol preview.");
|
|
368
|
+
}
|
|
369
|
+
await crashAtDurablePublishing(input.consumerRoot, crashPlan);
|
|
370
|
+
const interruptedDoctor = await input.protocol.doctor({ consumerRoot: input.consumerRoot, profilePath: input.profilePath });
|
|
371
|
+
if (interruptedDoctor.exitCode !== 1 || interruptedDoctor.envelope.outcome !== "recovery-required" ||
|
|
372
|
+
interruptedDoctor.envelope.result.transaction.state !== "recoverable") {
|
|
373
|
+
throw new Error("Qualification doctor did not observe its genuine interrupted transaction.");
|
|
374
|
+
}
|
|
375
|
+
const recovered = await input.protocol.recover({
|
|
376
|
+
consumerRoot: input.consumerRoot,
|
|
377
|
+
profilePath: input.profilePath,
|
|
378
|
+
...(input.base.signal === undefined ? {} : { signal: input.base.signal })
|
|
379
|
+
});
|
|
380
|
+
requireSuccess("recover", recovered);
|
|
381
|
+
if (recovered.envelope.result.transactionState !== "recovered" || recovered.envelope.result.writeState !== "committed" ||
|
|
382
|
+
typeof recovered.envelope.result.receiptDigest !== "string" || recovered.envelope.result.receipt.outcome !== "applied" ||
|
|
383
|
+
recovered.envelope.result.receipt.commit.state !== "committed" || recovered.envelope.result.receipt.commit.publication !== "published") {
|
|
384
|
+
throw new Error("Qualification recovery did not return truthful committed Receipt evidence.");
|
|
385
|
+
}
|
|
386
|
+
return recovered.envelope.result;
|
|
387
|
+
}
|
|
388
|
+
export async function runDocsProtocolQualification(request) {
|
|
389
|
+
const sourceRoot = await realpath(resolvePath(request.fixtureRoot));
|
|
390
|
+
const before = await snapshot(sourceRoot);
|
|
391
|
+
const temporary = await realpath(await mkdtemp(join(tmpdir(), "agent-teams-docs-qualification-")));
|
|
392
|
+
const consumerRoot = join(temporary, "consumer");
|
|
393
|
+
const profilePath = request.profilePath ?? "architecture/foundation/docs-protocol.yaml";
|
|
394
|
+
try {
|
|
395
|
+
request.signal?.throwIfAborted();
|
|
396
|
+
await cp(sourceRoot, consumerRoot, { recursive: true, errorOnExist: true, force: false, dereference: false });
|
|
397
|
+
await bootstrapQualificationInstallation(consumerRoot);
|
|
398
|
+
const protocol = createProtocol();
|
|
399
|
+
const info = await protocol.info({ consumerRoot, profilePath });
|
|
400
|
+
requireSuccess("info", info);
|
|
401
|
+
const find = await protocol.find({ consumerRoot, profilePath, query: request.scenario.find.query, ...(request.signal === undefined ? {} : { signal: request.signal }) });
|
|
402
|
+
requireSuccess("find", find);
|
|
403
|
+
const ids = find.envelope.result.documents.map(({ id }) => id);
|
|
404
|
+
if (JSON.stringify(ids) !== JSON.stringify(request.scenario.find.expectedIds)) {
|
|
405
|
+
throw new Error(`Docs Protocol qualification find mismatch: ${JSON.stringify(ids)}.`);
|
|
406
|
+
}
|
|
407
|
+
const base = { ...request.scenario.newDocument, consumerRoot, profilePath, ...(request.signal === undefined ? {} : { signal: request.signal }) };
|
|
408
|
+
const beforePreview = await fileSnapshot(consumerRoot);
|
|
409
|
+
const preview = await protocol.newDocument({ ...base, apply: false });
|
|
410
|
+
requireSuccess("preview", preview);
|
|
411
|
+
if (changedPaths(beforePreview, await fileSnapshot(consumerRoot)).length !== 0) {
|
|
412
|
+
throw new Error("Preview mutated its owned disposable consumer.");
|
|
413
|
+
}
|
|
414
|
+
const previewResult = documentResult(preview);
|
|
415
|
+
const parentBeforeApply = await parentState(consumerRoot, previewResult.documentPath);
|
|
416
|
+
const recovered = await interruptAndRecover({ base, consumerRoot, previewResult, profilePath, protocol });
|
|
417
|
+
const appliedResult = {
|
|
418
|
+
...previewResult,
|
|
419
|
+
receiptDigest: recovered.receiptDigest
|
|
420
|
+
};
|
|
421
|
+
const applyChanges = changedPaths(beforePreview, await fileSnapshot(consumerRoot));
|
|
422
|
+
const expectedDirectories = new Set(recovered.receipt.directoryMaterialization?.observedCreatedDirectories ?? []);
|
|
423
|
+
const unexpectedApplyChanges = applyChanges.filter((entry) => {
|
|
424
|
+
const path = entry.slice(entry.indexOf(":") + 1);
|
|
425
|
+
return path !== appliedResult.documentPath &&
|
|
426
|
+
path !== ".agent-teams-local" &&
|
|
427
|
+
!expectedDirectories.has(path) &&
|
|
428
|
+
!path.startsWith(".agent-teams-local/") &&
|
|
429
|
+
!path.endsWith("/.foundation-retired-evidence-") &&
|
|
430
|
+
!path.includes("/.foundation-retired-evidence-/");
|
|
431
|
+
});
|
|
432
|
+
if (unexpectedApplyChanges.length > 0) {
|
|
433
|
+
throw new Error(`Apply changed paths outside its exact document and Foundation transaction lifecycle: ${JSON.stringify(unexpectedApplyChanges)}.`);
|
|
434
|
+
}
|
|
435
|
+
if (await parentState(consumerRoot, appliedResult.documentPath) !== "directory") {
|
|
436
|
+
throw new Error("Apply did not leave a real document parent directory.");
|
|
437
|
+
}
|
|
438
|
+
if (parentBeforeApply === "missing" && recovered.receipt.directoryMaterialization?.state !== "created-and-retained") {
|
|
439
|
+
throw new Error("Missing-parent qualification recovery did not truthfully report retained Plan v2 materialization.");
|
|
440
|
+
}
|
|
441
|
+
await applyReachability(consumerRoot, appliedResult.reachability);
|
|
442
|
+
const check = await protocol.check({ consumerRoot, profilePath });
|
|
443
|
+
if (check.exitCode !== 0) {
|
|
444
|
+
throw new Error(`Docs Protocol qualification check failed: ${JSON.stringify(check.envelope)}.`);
|
|
445
|
+
}
|
|
446
|
+
const doctor = await protocol.doctor({ consumerRoot, profilePath });
|
|
447
|
+
requireSuccess("doctor", doctor);
|
|
448
|
+
if (await snapshot(sourceRoot) !== before) {
|
|
449
|
+
throw new Error("Qualification modified its source fixture.");
|
|
450
|
+
}
|
|
451
|
+
return Object.freeze({
|
|
452
|
+
appliedDocumentPath: appliedResult.documentPath,
|
|
453
|
+
checks: Object.freeze(["info", "find", "preview", "crash", "doctor", "recover", "receipt", "parent", "apply", "index", "check", "source-unchanged"]),
|
|
454
|
+
projectId: info.envelope.result.projectId,
|
|
455
|
+
schemaVersion: 1
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
finally {
|
|
459
|
+
await rm(temporary, { recursive: true, force: true });
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qualification/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-teams/docs-protocol",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Unified deterministic documentation authoring protocol for Agent Teams repositories.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"bin": {
|
|
9
|
+
"agent-teams-docs": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./qualification": {
|
|
17
|
+
"types": "./dist/qualification/index.d.ts",
|
|
18
|
+
"import": "./dist/qualification/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./schemas/*": "./schemas/*",
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"schemas/docs-protocol/v1.schema.json",
|
|
26
|
+
"schemas/docs-protocol-profile/v1.schema.json",
|
|
27
|
+
"schemas/docs-protocol-command-envelope/v1.schema.json",
|
|
28
|
+
"README.md",
|
|
29
|
+
"CHANGELOG.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=24.18.0 <25",
|
|
34
|
+
"pnpm": ">=11.17.0 <12"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public",
|
|
38
|
+
"provenance": true,
|
|
39
|
+
"registry": "https://registry.npmjs.org/"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "git+https://github.com/agent-teams-ai/engineering-foundation.git",
|
|
44
|
+
"directory": "packages/docs-protocol"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/agent-teams-ai/engineering-foundation#readme",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/agent-teams-ai/engineering-foundation/issues"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"ajv": "8.20.0",
|
|
52
|
+
"ajv-formats": "3.0.1",
|
|
53
|
+
"yaml": "2.9.0",
|
|
54
|
+
"@agent-teams/engineering-foundation": "0.17.0-rc.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/node": "24.13.3",
|
|
58
|
+
"typescript": "7.0.2"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsc --build tsconfig.json --pretty false",
|
|
62
|
+
"test": "pnpm build && node --test tests/*.test.mjs"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://agent-teams.ai/schemas/docs-protocol/v1",
|
|
4
|
+
"title": "Agent Teams Docs Protocol Identity",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["id", "version"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": { "const": "agent-teams.docs-protocol" },
|
|
10
|
+
"version": { "const": 1 }
|
|
11
|
+
}
|
|
12
|
+
}
|