docspack 0.3.0 → 1.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/dist/agent.d.ts +48 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +243 -0
- package/dist/agent.js.map +1 -0
- package/dist/artifact.d.ts +32 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +78 -0
- package/dist/artifact.js.map +1 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +75 -9
- package/dist/build.js.map +1 -1
- package/dist/changed.d.ts +31 -0
- package/dist/changed.d.ts.map +1 -0
- package/dist/changed.js +71 -0
- package/dist/changed.js.map +1 -0
- package/dist/cli.js +131 -10
- package/dist/cli.js.map +1 -1
- package/dist/coverage.d.ts +35 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +64 -0
- package/dist/coverage.js.map +1 -0
- package/dist/db.d.ts +38 -2
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +109 -6
- package/dist/db.js.map +1 -1
- package/dist/discovery.d.ts +14 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +31 -6
- package/dist/discovery.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +90 -3
- package/dist/doctor.js.map +1 -1
- package/dist/document.d.ts +2 -0
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +7 -3
- package/dist/document.js.map +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +65 -4
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +3 -0
- package/dist/mcp.js.map +1 -1
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +1 -0
- package/dist/preview.js.map +1 -1
- package/dist/search.d.ts +17 -3
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +116 -21
- package/dist/search.js.map +1 -1
- package/dist/spec.d.ts +6 -0
- package/dist/spec.d.ts.map +1 -1
- package/dist/spec.js +12 -3
- package/dist/spec.js.map +1 -1
- package/dist/surface.d.ts +45 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +208 -0
- package/dist/surface.js.map +1 -0
- package/dist/sync.d.ts +8 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +50 -1
- package/dist/sync.js.map +1 -1
- package/dist/verify.d.ts +9 -0
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +55 -27
- package/dist/verify.js.map +1 -1
- package/package.json +1 -1
- package/src/agent.ts +308 -0
- package/src/artifact.ts +110 -0
- package/src/build.ts +103 -10
- package/src/changed.ts +99 -0
- package/src/cli.ts +167 -10
- package/src/coverage.ts +96 -0
- package/src/db.ts +168 -7
- package/src/discovery.ts +40 -5
- package/src/doctor.ts +100 -4
- package/src/document.ts +13 -4
- package/src/help.ts +65 -4
- package/src/index.ts +30 -0
- package/src/mcp.ts +3 -0
- package/src/preview.ts +1 -0
- package/src/search.ts +158 -24
- package/src/spec.ts +21 -3
- package/src/surface.ts +265 -0
- package/src/sync.ts +66 -2
- package/src/verify.ts +57 -27
package/dist/sync.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { readArtifact } from "./artifact.js";
|
|
3
|
+
import { discoverLibraries, discoverPackages } from "./discovery.js";
|
|
3
4
|
import { chunkId, estimateTokens, resolveChunkFile } from "./spec.js";
|
|
4
5
|
/**
|
|
5
6
|
* Indexes every documentation package this project depends on. Packages already present in the
|
|
@@ -20,6 +21,7 @@ export async function syncProject(options) {
|
|
|
20
21
|
tokens: 0,
|
|
21
22
|
status: "cached",
|
|
22
23
|
trusted: pkg.trusted,
|
|
24
|
+
kind: "docs",
|
|
23
25
|
});
|
|
24
26
|
continue;
|
|
25
27
|
}
|
|
@@ -39,10 +41,57 @@ export async function syncProject(options) {
|
|
|
39
41
|
tokens: chunks.reduce((total, chunk) => total + chunk.tokens, 0),
|
|
40
42
|
status: "indexed",
|
|
41
43
|
trusted: pkg.trusted,
|
|
44
|
+
kind: "docs",
|
|
42
45
|
});
|
|
43
46
|
}
|
|
47
|
+
if (options.artifacts !== false)
|
|
48
|
+
synced.push(...(await syncArtifacts(options)));
|
|
44
49
|
return { packages: synced, problems };
|
|
45
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Indexes each installed library's exported declarations.
|
|
53
|
+
*
|
|
54
|
+
* These are not ranked alongside prose. They are addressed by name, so a question that names a
|
|
55
|
+
* symbol can be answered from the installed build even when nobody documented it — and a corpus
|
|
56
|
+
* of generated type machinery cannot crowd out the documentation that does exist.
|
|
57
|
+
*/
|
|
58
|
+
async function syncArtifacts(options) {
|
|
59
|
+
const synced = [];
|
|
60
|
+
for (const library of await discoverLibraries(options.cwd)) {
|
|
61
|
+
const id = `${library.name}@${library.version}`;
|
|
62
|
+
if (options.force !== true && options.store.hasPackage(id)) {
|
|
63
|
+
synced.push({
|
|
64
|
+
id,
|
|
65
|
+
name: library.name,
|
|
66
|
+
version: library.version,
|
|
67
|
+
chunks: options.store.countChunks(id),
|
|
68
|
+
tokens: 0,
|
|
69
|
+
status: "cached",
|
|
70
|
+
trusted: true,
|
|
71
|
+
kind: "artifact",
|
|
72
|
+
});
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
options.onProgress?.(`reading ${id}`);
|
|
76
|
+
const artifact = await readArtifact(library.dir);
|
|
77
|
+
// A dependency that ships no type declarations has nothing to derive, which is ordinary
|
|
78
|
+
// rather than a problem worth reporting on every sync.
|
|
79
|
+
if (artifact === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
options.store.indexPackage({ id: artifact.id, name: artifact.name, version: artifact.version, kind: "artifact" }, artifact.chunks, artifact.symbols);
|
|
82
|
+
synced.push({
|
|
83
|
+
id: artifact.id,
|
|
84
|
+
name: artifact.name,
|
|
85
|
+
version: artifact.version,
|
|
86
|
+
chunks: artifact.chunks.length,
|
|
87
|
+
tokens: artifact.chunks.reduce((total, chunk) => total + chunk.tokens, 0),
|
|
88
|
+
status: "indexed",
|
|
89
|
+
trusted: true,
|
|
90
|
+
kind: "artifact",
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return synced;
|
|
94
|
+
}
|
|
46
95
|
async function readChunks(pkg) {
|
|
47
96
|
const chunks = [];
|
|
48
97
|
const problems = [];
|
package/dist/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/verify.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DocumentedLibrary, type PackageManifest } from "./spec.js";
|
|
1
2
|
export interface DriftFinding {
|
|
2
3
|
readonly chunkId: string;
|
|
3
4
|
readonly file: string;
|
|
@@ -47,4 +48,12 @@ export interface VerifyOptions {
|
|
|
47
48
|
* Precision matters more than recall here: a check that cries wolf is worse than no check.
|
|
48
49
|
*/
|
|
49
50
|
export declare function verifyProject(options: VerifyOptions): Promise<VerifyReport>;
|
|
51
|
+
/**
|
|
52
|
+
* What a package says it documents.
|
|
53
|
+
*
|
|
54
|
+
* The manifest is the answer when it carries one, because that is the only copy a consumer of an
|
|
55
|
+
* installed package can see. The `docspack` key is read as a fallback: it is build configuration
|
|
56
|
+
* rather than payload, and a package built before `documents` reached the manifest has only that.
|
|
57
|
+
*/
|
|
58
|
+
export declare function documentedLibraries(packageDir: string, manifest: PackageManifest): Promise<readonly DocumentedLibrary[]>;
|
|
50
59
|
//# sourceMappingURL=verify.d.ts.map
|
package/dist/verify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,iBAAiB,EAItB,KAAK,eAAe,EAGrB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAyFD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAOjF;AAkJD;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAIvC"}
|
package/dist/verify.js
CHANGED
|
@@ -125,44 +125,61 @@ async function verifyOne(cwd, packageDir) {
|
|
|
125
125
|
}
|
|
126
126
|
async function verifyPackage(cwd, id, packageDir, manifest) {
|
|
127
127
|
const empty = { id, checked: 0, matched: 0, unrecognised: 0, findings: [] };
|
|
128
|
-
const
|
|
129
|
-
|
|
128
|
+
const packageLibraries = await documentedLibraries(packageDir, manifest);
|
|
129
|
+
// A chunk may name its own libraries, which is how a monorepo says that one chunk describes
|
|
130
|
+
// `@acme/api@1.2.0` and its neighbour describes `@acme/cli@3.0.0`. Those are what that chunk
|
|
131
|
+
// is checked against; the package's list covers every chunk that names none.
|
|
132
|
+
const scopes = manifest.chunks.map((chunk) => chunk.documents ?? packageLibraries);
|
|
133
|
+
if (packageLibraries.length === 0 && scopes.every((scope) => scope.length === 0)) {
|
|
130
134
|
return {
|
|
131
135
|
...empty,
|
|
132
136
|
status: "skipped",
|
|
133
137
|
reason: `declares no "documents", so there is nothing to check against`,
|
|
134
138
|
};
|
|
135
139
|
}
|
|
136
|
-
const documents =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
const documents = [
|
|
141
|
+
...new Set([...packageLibraries, ...scopes.flat()].map(formatDocumentedLibrary)),
|
|
142
|
+
];
|
|
143
|
+
// One resolution per library, however many chunks name it: reading a type surface is the
|
|
144
|
+
// expensive part, and a monorepo pack names the same eighteen libraries throughout.
|
|
145
|
+
const surfaces = new Map();
|
|
146
|
+
const resolve = async (library) => {
|
|
147
|
+
const cached = surfaces.get(library.name);
|
|
148
|
+
if (cached !== undefined)
|
|
149
|
+
return cached;
|
|
142
150
|
const libraryDir = (await resolvePackageDir(library.name, packageDir)) ??
|
|
143
151
|
(await resolvePackageDir(library.name, cwd));
|
|
144
152
|
const surface = libraryDir === undefined ? undefined : await readExportSurface(libraryDir);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
for (const name of surface.names)
|
|
150
|
-
names.add(name);
|
|
151
|
-
}
|
|
152
|
-
if (names.size === 0) {
|
|
153
|
-
return {
|
|
154
|
-
...empty,
|
|
155
|
-
status: "skipped",
|
|
156
|
-
documents,
|
|
157
|
-
reason: `${missing.join(", ")} ${missing.length === 1 ? "is" : "are"} not installed, or ship no type declarations`,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
const declared = new Set([...names].map(normalize));
|
|
153
|
+
const names = surface?.names ?? new Set();
|
|
154
|
+
surfaces.set(library.name, names);
|
|
155
|
+
return names;
|
|
156
|
+
};
|
|
161
157
|
const findings = [];
|
|
158
|
+
const missing = new Set();
|
|
162
159
|
let checked = 0;
|
|
163
160
|
let matched = 0;
|
|
164
161
|
let unrecognised = 0;
|
|
165
|
-
|
|
162
|
+
let readAny = false;
|
|
163
|
+
for (const [index, chunk] of manifest.chunks.entries()) {
|
|
164
|
+
const scope = scopes[index] ?? packageLibraries;
|
|
165
|
+
if (scope.length === 0)
|
|
166
|
+
continue;
|
|
167
|
+
// An entity is fine if any library in scope declares it: a monorepo documents eighteen
|
|
168
|
+
// packages from one surface, and a name belongs to whichever of them exports it.
|
|
169
|
+
const names = new Set();
|
|
170
|
+
for (const library of scope) {
|
|
171
|
+
const surface = await resolve(library);
|
|
172
|
+
if (surface.size === 0) {
|
|
173
|
+
missing.add(library.name);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
for (const name of surface)
|
|
177
|
+
names.add(name);
|
|
178
|
+
}
|
|
179
|
+
if (names.size === 0)
|
|
180
|
+
continue;
|
|
181
|
+
readAny = true;
|
|
182
|
+
const declared = new Set([...names].map(normalize));
|
|
166
183
|
for (const entity of chunk.entities) {
|
|
167
184
|
const symbol = checkableSymbol(entity);
|
|
168
185
|
if (symbol === undefined)
|
|
@@ -188,11 +205,22 @@ async function verifyPackage(cwd, id, packageDir, manifest) {
|
|
|
188
205
|
});
|
|
189
206
|
}
|
|
190
207
|
}
|
|
208
|
+
if (!readAny) {
|
|
209
|
+
const unread = [...missing];
|
|
210
|
+
return {
|
|
211
|
+
...empty,
|
|
212
|
+
status: "skipped",
|
|
213
|
+
documents,
|
|
214
|
+
reason: unread.length === 0
|
|
215
|
+
? "has no chunk naming a library to check against"
|
|
216
|
+
: `${unread.join(", ")} ${unread.length === 1 ? "is" : "are"} not installed, or ship no type declarations`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
191
219
|
return {
|
|
192
220
|
id,
|
|
193
221
|
status: "verified",
|
|
194
222
|
documents,
|
|
195
|
-
...(missing.
|
|
223
|
+
...(missing.size === 0 ? {} : { unchecked: [...missing] }),
|
|
196
224
|
checked,
|
|
197
225
|
matched,
|
|
198
226
|
unrecognised,
|
|
@@ -206,7 +234,7 @@ async function verifyPackage(cwd, id, packageDir, manifest) {
|
|
|
206
234
|
* installed package can see. The `docspack` key is read as a fallback: it is build configuration
|
|
207
235
|
* rather than payload, and a package built before `documents` reached the manifest has only that.
|
|
208
236
|
*/
|
|
209
|
-
async function documentedLibraries(packageDir, manifest) {
|
|
237
|
+
export async function documentedLibraries(packageDir, manifest) {
|
|
210
238
|
if (manifest.documents !== undefined && manifest.documents.length > 0)
|
|
211
239
|
return manifest.documents;
|
|
212
240
|
const { documents } = await readBuildConfig(packageDir);
|
package/dist/verify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/agent.ts
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { DocspackError } from "./errors.js";
|
|
5
|
+
import { AGENTS_SNIPPET, FEEDBACK_SNIPPET } from "./snippet.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Wiring docspack into the agent tooling a project already uses.
|
|
9
|
+
*
|
|
10
|
+
* The documented setup is "paste two lines into AGENTS.md", which is manual, easy to forget, and
|
|
11
|
+
* drifts: a line pasted once says whatever docspack did at the time. This writes the same thing
|
|
12
|
+
* from the code that defines it, into a marked block that can be rewritten in place.
|
|
13
|
+
*/
|
|
14
|
+
export type SurfaceKind = "instructions" | "skill" | "hook" | "mcp";
|
|
15
|
+
|
|
16
|
+
export interface AgentFile {
|
|
17
|
+
/** Path relative to the project root. */
|
|
18
|
+
readonly path: string;
|
|
19
|
+
readonly kind: SurfaceKind;
|
|
20
|
+
readonly contents: string;
|
|
21
|
+
readonly status: "create" | "update" | "unchanged";
|
|
22
|
+
/** Why this file is in the plan, for the line the CLI prints. */
|
|
23
|
+
readonly reason: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AgentPlan {
|
|
27
|
+
readonly files: readonly AgentFile[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface AgentOptions {
|
|
31
|
+
readonly cwd: string;
|
|
32
|
+
/**
|
|
33
|
+
* The three surfaces beyond the instruction block. Left unset, each is inferred from what is
|
|
34
|
+
* already on disk, so `docspack agent check` needs no flags to say whether what a project
|
|
35
|
+
* chose is still current — which is the only form of the check CI can run.
|
|
36
|
+
*/
|
|
37
|
+
readonly feedback?: boolean;
|
|
38
|
+
/** Write a SessionStart hook that keeps the index in step with the lockfile. */
|
|
39
|
+
readonly hooks?: boolean;
|
|
40
|
+
/** Write the MCP server into `.mcp.json`. */
|
|
41
|
+
readonly mcp?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const START = "<!-- docspack:start -->";
|
|
45
|
+
const END = "<!-- docspack:end -->";
|
|
46
|
+
|
|
47
|
+
/** Files an agent reads as standing instructions, in the order they are checked. */
|
|
48
|
+
const INSTRUCTION_FILES = ["AGENTS.md", "CLAUDE.md"] as const;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* What to write, and where. Nothing is written for a tool the project does not use: the presence
|
|
52
|
+
* of `.claude/` is what says a Claude Code user works here, and a project with neither an
|
|
53
|
+
* AGENTS.md nor a CLAUDE.md gets AGENTS.md, which is the cross-tool convention.
|
|
54
|
+
*/
|
|
55
|
+
export async function planAgentSetup(options: AgentOptions): Promise<AgentPlan> {
|
|
56
|
+
const root = resolve(options.cwd);
|
|
57
|
+
if (!existsSync(join(root, "package.json"))) {
|
|
58
|
+
throw new DocspackError(`No package.json found in ${root}`, {
|
|
59
|
+
hint: "Run docspack from a project directory, or pass --cwd <dir>.",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const existing = INSTRUCTION_FILES.filter((name) => existsSync(join(root, name)));
|
|
64
|
+
const feedback = options.feedback ?? (await wantsFeedback(root, existing));
|
|
65
|
+
const files: AgentFile[] = [];
|
|
66
|
+
const block = instructionBlock(feedback);
|
|
67
|
+
|
|
68
|
+
const targets = existing.length > 0 ? existing : ["AGENTS.md"];
|
|
69
|
+
for (const name of targets) {
|
|
70
|
+
const before = await read(join(root, name));
|
|
71
|
+
const after = withBlock(before ?? "", block);
|
|
72
|
+
files.push({
|
|
73
|
+
path: name,
|
|
74
|
+
kind: "instructions",
|
|
75
|
+
contents: after,
|
|
76
|
+
status: before === undefined ? "create" : after === before ? "unchanged" : "update",
|
|
77
|
+
reason:
|
|
78
|
+
before === undefined
|
|
79
|
+
? "the cross-tool convention for standing agent instructions"
|
|
80
|
+
: "already read by the agents working here",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (existsSync(join(root, ".claude"))) {
|
|
85
|
+
const path = join(".claude", "skills", "docspack", "SKILL.md");
|
|
86
|
+
const before = await read(join(root, path));
|
|
87
|
+
const contents = skill(feedback);
|
|
88
|
+
files.push({
|
|
89
|
+
path,
|
|
90
|
+
kind: "skill",
|
|
91
|
+
contents,
|
|
92
|
+
status: before === undefined ? "create" : before === contents ? "unchanged" : "update",
|
|
93
|
+
// A skill's body is loaded when it is used; instructions are loaded every session. Both
|
|
94
|
+
// are written, because only one of them survives a session that never asks a question.
|
|
95
|
+
reason: "loaded on demand, so it costs nothing in a session that asks no questions",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const settings = await read(join(root, ".claude", "settings.json"));
|
|
100
|
+
const wantsHook = options.hooks ?? (settings ?? "").includes("docspack sync");
|
|
101
|
+
if (wantsHook) files.push(await hook(root));
|
|
102
|
+
|
|
103
|
+
const mcpConfig = await read(join(root, ".mcp.json"));
|
|
104
|
+
const wantsMcp = options.mcp ?? /"docspack"\s*:/.test(mcpConfig ?? "");
|
|
105
|
+
if (wantsMcp) files.push(await mcpEntry(root));
|
|
106
|
+
|
|
107
|
+
return { files };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Writes a plan. A file that already carries the current text is left alone. */
|
|
111
|
+
export async function applyAgentSetup(
|
|
112
|
+
options: AgentOptions,
|
|
113
|
+
plan: AgentPlan,
|
|
114
|
+
): Promise<readonly AgentFile[]> {
|
|
115
|
+
const root = resolve(options.cwd);
|
|
116
|
+
const written: AgentFile[] = [];
|
|
117
|
+
|
|
118
|
+
for (const file of plan.files) {
|
|
119
|
+
if (file.status === "unchanged") continue;
|
|
120
|
+
const target = join(root, file.path);
|
|
121
|
+
await mkdir(dirname(target), { recursive: true });
|
|
122
|
+
await writeFile(target, file.contents, "utf8");
|
|
123
|
+
written.push(file);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return written;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Replaces the marked block, or appends one. Everything outside the markers is left exactly as
|
|
131
|
+
* it was: these files are written by people, and a tool that rewrites them wholesale is a tool
|
|
132
|
+
* nobody runs twice.
|
|
133
|
+
*/
|
|
134
|
+
export function withBlock(document: string, block: string): string {
|
|
135
|
+
const start = document.indexOf(START);
|
|
136
|
+
const end = document.indexOf(END);
|
|
137
|
+
|
|
138
|
+
if (start !== -1 && end > start) {
|
|
139
|
+
return `${document.slice(0, start)}${block}${document.slice(end + END.length)}`;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const body = document.trimEnd();
|
|
143
|
+
return body.length === 0 ? `${block}\n` : `${body}\n\n${block}\n`;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Whether a project already asked for the feedback half, read from what it has on disk. */
|
|
147
|
+
async function wantsFeedback(root: string, files: readonly string[]): Promise<boolean> {
|
|
148
|
+
for (const name of files) {
|
|
149
|
+
if ((await read(join(root, name)))?.includes("docspack feedback add") === true) return true;
|
|
150
|
+
}
|
|
151
|
+
const skillFile = await read(join(root, ".claude", "skills", "docspack", "SKILL.md"));
|
|
152
|
+
return skillFile?.includes("docspack feedback add") === true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function instructionBlock(feedback: boolean): string {
|
|
156
|
+
const lines = [
|
|
157
|
+
START,
|
|
158
|
+
"## Documentation for this project's dependencies",
|
|
159
|
+
"",
|
|
160
|
+
...AGENTS_SNIPPET,
|
|
161
|
+
...(feedback ? ["", ...FEEDBACK_SNIPPET] : []),
|
|
162
|
+
"",
|
|
163
|
+
"<!-- Written by `docspack agent install`. Re-run it to update this block. -->",
|
|
164
|
+
END,
|
|
165
|
+
];
|
|
166
|
+
return lines.join("\n");
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The Claude Code skill. Its description is what decides whether the skill is reached for, and
|
|
171
|
+
* the body is loaded only once it is — so the description names the situations rather than the
|
|
172
|
+
* tool, and the body carries what the two-line instruction cannot afford to.
|
|
173
|
+
*/
|
|
174
|
+
function skill(feedback: boolean): string {
|
|
175
|
+
return [
|
|
176
|
+
"---",
|
|
177
|
+
"name: docspack",
|
|
178
|
+
"description: >-",
|
|
179
|
+
" Answer questions about this project's installed dependencies from local, version-matched",
|
|
180
|
+
" documentation instead of memory. Use before writing or reviewing code that calls a",
|
|
181
|
+
" dependency, when an API's shape is uncertain, when an import or a signature may have",
|
|
182
|
+
" changed between versions, or when a name is not in any documentation at all.",
|
|
183
|
+
"allowed-tools: Bash",
|
|
184
|
+
"---",
|
|
185
|
+
"",
|
|
186
|
+
"# Documentation for installed dependencies",
|
|
187
|
+
"",
|
|
188
|
+
'Run `docspack ask "<question>"` for anything about a dependency of this project. It answers',
|
|
189
|
+
"from the versions in `node_modules`, offline, in about 100ms, and bounded to 3,000 tokens.",
|
|
190
|
+
"",
|
|
191
|
+
"Prefer it over recalling an API from training data. The installed version is usually newer",
|
|
192
|
+
"than the training data and the answer states which release it came from.",
|
|
193
|
+
"",
|
|
194
|
+
"## What the answer can tell you",
|
|
195
|
+
"",
|
|
196
|
+
"- A passage from a documentation package, headed by its chunk id and the version it documents.",
|
|
197
|
+
"- A declaration read from the installed build, when the question names something the",
|
|
198
|
+
" documentation never mentions. It carries the import to write and the signature as installed.",
|
|
199
|
+
"- A note saying the name is exported but documented nowhere. That is a real answer: it means",
|
|
200
|
+
" no prose exists, not that the search failed.",
|
|
201
|
+
"",
|
|
202
|
+
"## Other commands",
|
|
203
|
+
"",
|
|
204
|
+
"- `docspack changed <library>` — what a library's exports gained and lost between two",
|
|
205
|
+
" installed versions. Use it when an upgrade broke something, or before writing code against",
|
|
206
|
+
" a version newer than what you remember.",
|
|
207
|
+
"- `docspack list` — which packages are indexed here.",
|
|
208
|
+
"- `docspack sync` — index them. Run it if `ask` reports something installed but not indexed.",
|
|
209
|
+
...(feedback
|
|
210
|
+
? [
|
|
211
|
+
"",
|
|
212
|
+
"## Recording a problem",
|
|
213
|
+
"",
|
|
214
|
+
"If the documentation contradicts the installed package, record it:",
|
|
215
|
+
"",
|
|
216
|
+
"```bash",
|
|
217
|
+
'docspack feedback add --chunk <id> --kind <drift|incorrect|missing> --evidence "<claim>"',
|
|
218
|
+
"```",
|
|
219
|
+
"",
|
|
220
|
+
"Only claims that can be shown false. `incorrect` and `missing` also need `--expected`,",
|
|
221
|
+
"`--actual` and `--repro`, so record those only after running something. It appends to a",
|
|
222
|
+
"local file for a human to review and sends nothing.",
|
|
223
|
+
]
|
|
224
|
+
: []),
|
|
225
|
+
"",
|
|
226
|
+
].join("\n");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* A SessionStart hook, so the index follows the lockfile without anyone remembering to sync.
|
|
231
|
+
*
|
|
232
|
+
* `--quiet` keeps it silent: a hook that prints on every session start spends context on a
|
|
233
|
+
* message saying nothing changed.
|
|
234
|
+
*/
|
|
235
|
+
async function hook(root: string): Promise<AgentFile> {
|
|
236
|
+
const path = join(".claude", "settings.json");
|
|
237
|
+
const before = await read(join(root, path));
|
|
238
|
+
const settings = parseJson(before, path);
|
|
239
|
+
// Silent and never failing: a session must not break, or print, because an index is stale.
|
|
240
|
+
const command = "npx --no-install docspack sync --quiet >/dev/null 2>&1 || true";
|
|
241
|
+
|
|
242
|
+
const hooks = (settings.hooks ?? {}) as Record<string, unknown>;
|
|
243
|
+
const sessionStart = Array.isArray(hooks.SessionStart) ? [...hooks.SessionStart] : [];
|
|
244
|
+
const already = JSON.stringify(sessionStart).includes("docspack sync");
|
|
245
|
+
if (!already) sessionStart.push({ hooks: [{ type: "command", command }] });
|
|
246
|
+
|
|
247
|
+
const contents = `${JSON.stringify(
|
|
248
|
+
{ ...settings, hooks: { ...hooks, SessionStart: sessionStart } },
|
|
249
|
+
null,
|
|
250
|
+
2,
|
|
251
|
+
)}\n`;
|
|
252
|
+
|
|
253
|
+
return {
|
|
254
|
+
path,
|
|
255
|
+
kind: "hook",
|
|
256
|
+
contents,
|
|
257
|
+
status: before === undefined ? "create" : before === contents ? "unchanged" : "update",
|
|
258
|
+
reason: "keeps the index in step with the lockfile without anyone remembering to sync",
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async function mcpEntry(root: string): Promise<AgentFile> {
|
|
263
|
+
const path = ".mcp.json";
|
|
264
|
+
const before = await read(join(root, path));
|
|
265
|
+
const config = parseJson(before, path);
|
|
266
|
+
const servers = (config.mcpServers ?? {}) as Record<string, unknown>;
|
|
267
|
+
const contents = `${JSON.stringify(
|
|
268
|
+
{
|
|
269
|
+
...config,
|
|
270
|
+
mcpServers: {
|
|
271
|
+
...servers,
|
|
272
|
+
docspack: { command: "npx", args: ["-y", "docspack", "mcp"] },
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
null,
|
|
276
|
+
2,
|
|
277
|
+
)}\n`;
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
path,
|
|
281
|
+
kind: "mcp",
|
|
282
|
+
contents,
|
|
283
|
+
status: before === undefined ? "create" : before === contents ? "unchanged" : "update",
|
|
284
|
+
reason: "a declared tool, for clients that would rather have one than a shell command",
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function parseJson(raw: string | undefined, path: string): Record<string, unknown> {
|
|
289
|
+
if (raw === undefined || raw.trim().length === 0) return {};
|
|
290
|
+
try {
|
|
291
|
+
const parsed: unknown = JSON.parse(raw);
|
|
292
|
+
if (typeof parsed !== "object" || parsed === null) throw new Error("not an object");
|
|
293
|
+
return parsed as Record<string, unknown>;
|
|
294
|
+
} catch (error) {
|
|
295
|
+
throw new DocspackError(`${path} is not valid JSON`, {
|
|
296
|
+
hint: "Fix it, or move it aside and run this again.",
|
|
297
|
+
cause: error,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async function read(path: string): Promise<string | undefined> {
|
|
303
|
+
try {
|
|
304
|
+
return await readFile(path, "utf8");
|
|
305
|
+
} catch {
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
}
|