@agentskit/doc-bridge 1.2.3 → 1.2.6
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 +21 -0
- package/CONTRIBUTING.md +6 -0
- package/PRIVACY.md +38 -0
- package/README.md +21 -0
- package/SECURITY.md +7 -2
- package/action.yml +1 -1
- package/dist/cli/program.js +57 -27
- package/dist/cli/program.js.map +1 -1
- package/dist/index.d.ts +41 -9
- package/dist/index.js +57 -27
- package/dist/index.js.map +1 -1
- package/docs/mcp.md +16 -0
- package/ecosystem-claims.json +4 -4
- package/ecosystem-upstream.json +2 -2
- package/ecosystem.json +150 -11
- package/mcpb/.mcpbignore +8 -0
- package/mcpb/icon.png +0 -0
- package/mcpb/manifest.json +96 -0
- package/package.json +12 -10
- package/src/mcp/server.ts +58 -26
- package/src/version.ts +1 -1
package/docs/mcp.md
CHANGED
|
@@ -43,6 +43,19 @@ Or with a global/local bin:
|
|
|
43
43
|
|
|
44
44
|
Run from the repo root (or pass config discovery that resolves to it). Always `ak-docs index` after doc changes (or gate in CI).
|
|
45
45
|
|
|
46
|
+
## Claude Desktop MCP Bundle
|
|
47
|
+
|
|
48
|
+
Maintainers can build the local desktop extension from a clean checkout:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
pnpm install --frozen-lockfile
|
|
52
|
+
pnpm mcpb:pack
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The bundle asks the user to select the repository's `doc-bridge.config.json` and uses that file's directory as the project boundary. It contains a self-contained MCP runtime rather than the optional RAG, chat, or model-provider packages. The build validates the manifest, checks the archive inventory, and exercises all eight tools from the staged runtime.
|
|
56
|
+
|
|
57
|
+
The stdio server accepts the newline-delimited JSON transport used by current MCP clients and the legacy `Content-Length` framing used by older integrations. Responses use the same framing as each request.
|
|
58
|
+
|
|
46
59
|
## Tools
|
|
47
60
|
|
|
48
61
|
| Tool | Purpose |
|
|
@@ -53,6 +66,9 @@ Run from the repo root (or pass config discovery that resolves to it). Always `a
|
|
|
53
66
|
| `gate.status` | Freshness / configured gates |
|
|
54
67
|
| `retriever.query` | Local retriever chunks |
|
|
55
68
|
| `memory.classify` / `memory.promoteDraft` | Memory pipeline |
|
|
69
|
+
| `registry.topology` | Static curator and delegate topology |
|
|
70
|
+
|
|
71
|
+
Every tool is annotated read-only. None of these MCP calls writes project files or publishes a memory promotion.
|
|
56
72
|
|
|
57
73
|
## Agent guidance (paste into AGENTS.md)
|
|
58
74
|
|
package/ecosystem-claims.json
CHANGED
|
@@ -83,9 +83,9 @@
|
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
"id": "skills",
|
|
86
|
-
"value":
|
|
86
|
+
"value": 22,
|
|
87
87
|
"noun": "ready-made skills",
|
|
88
|
-
"conservativeFloor":
|
|
88
|
+
"conservativeFloor": 22,
|
|
89
89
|
"evidence": {
|
|
90
90
|
"type": "repository-derivation",
|
|
91
91
|
"repo": "AgentsKit-io/agentskit",
|
|
@@ -177,8 +177,8 @@
|
|
|
177
177
|
{
|
|
178
178
|
"productId": "akos",
|
|
179
179
|
"source": {
|
|
180
|
-
"type": "
|
|
181
|
-
"
|
|
180
|
+
"type": "repository",
|
|
181
|
+
"repo": "AgentsKit-io/agentskit-os"
|
|
182
182
|
},
|
|
183
183
|
"verification": "declared",
|
|
184
184
|
"claims": []
|
package/ecosystem-upstream.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"repository": "AgentsKit-io/agentskit",
|
|
4
4
|
"ref": "main",
|
|
5
5
|
"files": {
|
|
6
|
-
"ecosystem.json": "
|
|
7
|
-
"ecosystem-claims.json": "
|
|
6
|
+
"ecosystem.json": "8cc227f6838b9927fcaab5fe019e0f869f8a82bcbb1f2488b8b6b94e41779e9e",
|
|
7
|
+
"ecosystem-claims.json": "ab8f83b3fa56d525986485dfeb4f12cd89ce1e76b3c90b2b1c6df51dfe8919bd"
|
|
8
8
|
}
|
|
9
9
|
}
|
package/ecosystem.json
CHANGED
|
@@ -16,6 +16,35 @@
|
|
|
16
16
|
"maturity": "beta",
|
|
17
17
|
"repo": "AgentsKit-io/agentskit",
|
|
18
18
|
"accent": "#2EA043",
|
|
19
|
+
"showcase": {
|
|
20
|
+
"claimSource": {
|
|
21
|
+
"url": "https://www.agentskit.io/api/stats.json",
|
|
22
|
+
"claims": {
|
|
23
|
+
"packages": { "path": "counts.packages" },
|
|
24
|
+
"core-size-kb-gzip": { "path": "coreSizeKbGzip" },
|
|
25
|
+
"catalog-providers": { "path": "counts.catalogProviders" },
|
|
26
|
+
"native-adapters": { "path": "counts.nativeAdapters" },
|
|
27
|
+
"integrations": { "path": "counts.integrations" }
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"stage": "Build",
|
|
31
|
+
"headline": "One foundation. Every layer stays yours.",
|
|
32
|
+
"detail": "Compose runtime, adapters, tools, memory, RAG, and UI without glue code or lock-in.",
|
|
33
|
+
"proof": "{{packages}} packages · <{{core-size-kb-gzip}} KB core",
|
|
34
|
+
"sales": {
|
|
35
|
+
"kind": "integration-stack",
|
|
36
|
+
"headline": "Swap the stack. Keep the agent.",
|
|
37
|
+
"metrics": [
|
|
38
|
+
{ "value": "{{catalog-providers}}", "label": "providers" },
|
|
39
|
+
{ "value": "{{native-adapters}}", "label": "adapters" },
|
|
40
|
+
{ "value": "{{integrations}}", "label": "integrations" }
|
|
41
|
+
],
|
|
42
|
+
"capabilities": ["Tools", "RAG", "Memory", "MCP"],
|
|
43
|
+
"steps": ["Choose any adapter", "Add tools and memory", "Ship without rewrites"]
|
|
44
|
+
},
|
|
45
|
+
"cta": "Build with AgentsKit",
|
|
46
|
+
"ctaSurface": "docs"
|
|
47
|
+
},
|
|
19
48
|
"surfaces": {
|
|
20
49
|
"home": "https://www.agentskit.io",
|
|
21
50
|
"docs": "https://www.agentskit.io/docs",
|
|
@@ -47,6 +76,30 @@
|
|
|
47
76
|
"maturity": "beta",
|
|
48
77
|
"repo": "AgentsKit-io/agentskit-registry",
|
|
49
78
|
"accent": "#58A6FF",
|
|
79
|
+
"showcase": {
|
|
80
|
+
"claimSource": {
|
|
81
|
+
"url": "https://registry.agentskit.io/r/index.json",
|
|
82
|
+
"claims": {
|
|
83
|
+
"agents": { "path": "agents", "aggregate": "length" },
|
|
84
|
+
"remaining-categories": { "path": "agents", "aggregate": "distinct", "field": "category", "subtract": 5 }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"stage": "Discover",
|
|
88
|
+
"headline": "Shadcn-like agents. Installed as source.",
|
|
89
|
+
"detail": "Find a working agent, copy its source into your project, and change every line.",
|
|
90
|
+
"proof": "Ready-made · source-owned",
|
|
91
|
+
"sales": {
|
|
92
|
+
"kind": "registry-install",
|
|
93
|
+
"headline": "Ready-to-use agents from the live Registry.",
|
|
94
|
+
"metric": "{{agents}}",
|
|
95
|
+
"metricLabel": "shadcn-like agents",
|
|
96
|
+
"capabilities": ["Research", "Support", "Coding", "Data", "Marketing", "{{remaining-categories}} additional categories"],
|
|
97
|
+
"steps": ["Find the right agent", "Run npx agentskit add", "Own every line"],
|
|
98
|
+
"command": "npx agentskit add research"
|
|
99
|
+
},
|
|
100
|
+
"cta": "Explore the Registry",
|
|
101
|
+
"ctaSurface": "home"
|
|
102
|
+
},
|
|
50
103
|
"surfaces": {
|
|
51
104
|
"home": "https://registry.agentskit.io",
|
|
52
105
|
"docs": "https://registry.agentskit.io/docs",
|
|
@@ -78,6 +131,28 @@
|
|
|
78
131
|
"maturity": "alpha",
|
|
79
132
|
"repo": "AgentsKit-io/agentskit-chat",
|
|
80
133
|
"accent": "#F59E0B",
|
|
134
|
+
"showcase": {
|
|
135
|
+
"stage": "Deliver",
|
|
136
|
+
"headline": "One agent. Every conversation surface.",
|
|
137
|
+
"detail": "Define the experience once and deliver it across web, desktop, CLI, and mobile.",
|
|
138
|
+
"proof": "Web · Desktop · CLI · Mobile",
|
|
139
|
+
"sales": {
|
|
140
|
+
"kind": "human-agent",
|
|
141
|
+
"headline": "Human ↔ agent. Without losing control.",
|
|
142
|
+
"metric": "4",
|
|
143
|
+
"metricLabel": "surfaces · one conversation",
|
|
144
|
+
"logos": [
|
|
145
|
+
{ "id": "web", "label": "Web" },
|
|
146
|
+
{ "id": "desktop", "label": "Desktop" },
|
|
147
|
+
{ "id": "cli", "label": "CLI" },
|
|
148
|
+
{ "id": "mobile", "label": "Mobile" }
|
|
149
|
+
],
|
|
150
|
+
"capabilities": ["Streaming", "Approvals", "Tool results", "Shared state"],
|
|
151
|
+
"steps": ["Agent requests a protected action", "Human approves", "The conversation continues everywhere"]
|
|
152
|
+
},
|
|
153
|
+
"cta": "Explore AgentsKit Chat",
|
|
154
|
+
"ctaSurface": "home"
|
|
155
|
+
},
|
|
81
156
|
"surfaces": {
|
|
82
157
|
"home": "https://chat.agentskit.io",
|
|
83
158
|
"docs": "https://chat.agentskit.io/docs",
|
|
@@ -104,10 +179,32 @@
|
|
|
104
179
|
"shortName": "Playbook",
|
|
105
180
|
"kind": "methodology",
|
|
106
181
|
"role": "discipline",
|
|
107
|
-
"promise": "
|
|
182
|
+
"promise": "Train coding agents to ship code your team would merge.",
|
|
108
183
|
"maturity": "stable",
|
|
109
184
|
"repo": "AgentsKit-io/agents-playbook",
|
|
110
185
|
"accent": "#8B5CF6",
|
|
186
|
+
"showcase": {
|
|
187
|
+
"stage": "Standardize",
|
|
188
|
+
"headline": "The open engineering harness for coding agents.",
|
|
189
|
+
"detail": "Open rules, prompts, memory, evals, and executable gates turn every correction into behavior coding agents can repeat.",
|
|
190
|
+
"proof": "Train the behavior · not the model",
|
|
191
|
+
"sales": {
|
|
192
|
+
"kind": "standards-flow",
|
|
193
|
+
"headline": "Your standards. Every agent. Every repository.",
|
|
194
|
+
"metric": "1×",
|
|
195
|
+
"metricLabel": "define · reuse everywhere",
|
|
196
|
+
"logos": [
|
|
197
|
+
{ "id": "architecture", "label": "Architecture" },
|
|
198
|
+
{ "id": "tests", "label": "Tests" },
|
|
199
|
+
{ "id": "security", "label": "Security" },
|
|
200
|
+
{ "id": "style", "label": "Style" }
|
|
201
|
+
],
|
|
202
|
+
"capabilities": ["Repository rules", "Review criteria", "Agent guidance", "Team conventions"],
|
|
203
|
+
"steps": ["Define the standard once", "Agents receive executable guidance", "Review consistent output"]
|
|
204
|
+
},
|
|
205
|
+
"cta": "Explore the harness",
|
|
206
|
+
"ctaSurface": "home"
|
|
207
|
+
},
|
|
111
208
|
"surfaces": {
|
|
112
209
|
"home": "https://playbook.agentskit.io",
|
|
113
210
|
"docs": "https://playbook.agentskit.io/docs",
|
|
@@ -139,10 +236,32 @@
|
|
|
139
236
|
"maturity": "stable",
|
|
140
237
|
"repo": "AgentsKit-io/doc-bridge",
|
|
141
238
|
"accent": "#06B6D4",
|
|
239
|
+
"showcase": {
|
|
240
|
+
"stage": "Understand",
|
|
241
|
+
"headline": "Documentation that hands work off precisely.",
|
|
242
|
+
"detail": "Connect repository knowledge to agents with structured, executable context.",
|
|
243
|
+
"proof": "Code → precise handoff",
|
|
244
|
+
"sales": {
|
|
245
|
+
"kind": "knowledge-bridge",
|
|
246
|
+
"headline": "Knowledge flows both ways.",
|
|
247
|
+
"metric": "↔",
|
|
248
|
+
"metricLabel": "humans and agents",
|
|
249
|
+
"logos": [
|
|
250
|
+
{ "id": "human", "label": "Humans" },
|
|
251
|
+
{ "id": "markdown", "label": "Docs" },
|
|
252
|
+
{ "id": "code", "label": "Code" },
|
|
253
|
+
{ "id": "agent", "label": "Agents" }
|
|
254
|
+
],
|
|
255
|
+
"capabilities": ["ADRs", "Handoffs", "Agent findings", "Human-readable docs"],
|
|
256
|
+
"steps": ["Humans document decisions", "Agents receive precise context", "Agent findings return to humans"]
|
|
257
|
+
},
|
|
258
|
+
"cta": "Generate your first handoff",
|
|
259
|
+
"ctaSurface": "home"
|
|
260
|
+
},
|
|
142
261
|
"surfaces": {
|
|
143
|
-
"home": "https://
|
|
144
|
-
"docs": "https://
|
|
145
|
-
"llms": "https://
|
|
262
|
+
"home": "https://doc-bridge.agentskit.io/",
|
|
263
|
+
"docs": "https://doc-bridge.agentskit.io/",
|
|
264
|
+
"llms": "https://doc-bridge.agentskit.io/llms.txt",
|
|
146
265
|
"documentation": "fumadocs",
|
|
147
266
|
"chat": "none"
|
|
148
267
|
},
|
|
@@ -199,11 +318,32 @@
|
|
|
199
318
|
"maturity": "stable",
|
|
200
319
|
"repo": "AgentsKit-io/agentskit-os",
|
|
201
320
|
"accent": "#34D399",
|
|
321
|
+
"showcase": {
|
|
322
|
+
"stage": "Operate",
|
|
323
|
+
"headline": "Run and govern agents in production.",
|
|
324
|
+
"detail": "Add orchestration, governance, and operational control when your system needs it.",
|
|
325
|
+
"proof": "Orchestration · governance · control",
|
|
326
|
+
"sales": {
|
|
327
|
+
"kind": "enterprise-control",
|
|
328
|
+
"headline": "The enterprise control plane for agents.",
|
|
329
|
+
"metric": "Enterprise",
|
|
330
|
+
"metricLabel": "operations and governance",
|
|
331
|
+
"logos": [
|
|
332
|
+
{ "id": "logs", "label": "Logs" },
|
|
333
|
+
{ "id": "approvals", "label": "Approvals" },
|
|
334
|
+
{ "id": "rbac", "label": "RBAC" },
|
|
335
|
+
{ "id": "policies", "label": "Policies" }
|
|
336
|
+
],
|
|
337
|
+
"capabilities": ["Logs", "Approvals", "RBAC", "Policies", "Tracing", "Costs"],
|
|
338
|
+
"steps": ["Agent requests a protected action", "RBAC and policy gates evaluate", "Human approves; logs and trace persist"]
|
|
339
|
+
},
|
|
340
|
+
"cta": "Explore AgentsKit OS",
|
|
341
|
+
"ctaSurface": "home"
|
|
342
|
+
},
|
|
202
343
|
"surfaces": {
|
|
203
344
|
"home": "https://akos.agentskit.io",
|
|
204
345
|
"docs": "https://akos.agentskit.io/docs",
|
|
205
346
|
"llms": "https://akos.agentskit.io/llms.txt",
|
|
206
|
-
"stats": "https://akos.agentskit.io/api/stats.json",
|
|
207
347
|
"documentation": "fumadocs",
|
|
208
348
|
"chat": "none"
|
|
209
349
|
},
|
|
@@ -260,7 +400,7 @@
|
|
|
260
400
|
"domain": "playbook.agentskit.io",
|
|
261
401
|
"url": "https://playbook.agentskit.io",
|
|
262
402
|
"repo": "AgentsKit-io/agents-playbook",
|
|
263
|
-
"tagline": "
|
|
403
|
+
"tagline": "Train coding agents to ship code your team would merge.",
|
|
264
404
|
"kind": "methodology",
|
|
265
405
|
"accent": "#8B5CF6",
|
|
266
406
|
"llms": "https://playbook.agentskit.io/llms.txt",
|
|
@@ -270,13 +410,13 @@
|
|
|
270
410
|
"id": "doc-bridge",
|
|
271
411
|
"name": "Doc Bridge",
|
|
272
412
|
"barLabel": "Doc Bridge",
|
|
273
|
-
"domain": "
|
|
274
|
-
"url": "https://
|
|
413
|
+
"domain": "doc-bridge.agentskit.io",
|
|
414
|
+
"url": "https://doc-bridge.agentskit.io/",
|
|
275
415
|
"repo": "AgentsKit-io/doc-bridge",
|
|
276
416
|
"tagline": "Turn repository documentation into executable agent handoffs.",
|
|
277
417
|
"kind": "developer-tool",
|
|
278
418
|
"accent": "#06B6D4",
|
|
279
|
-
"llms": "https://
|
|
419
|
+
"llms": "https://doc-bridge.agentskit.io/llms.txt"
|
|
280
420
|
},
|
|
281
421
|
{
|
|
282
422
|
"id": "code-review",
|
|
@@ -300,8 +440,7 @@
|
|
|
300
440
|
"tagline": "Run and govern agents in production.",
|
|
301
441
|
"kind": "product",
|
|
302
442
|
"accent": "#34D399",
|
|
303
|
-
"llms": "https://akos.agentskit.io/llms.txt"
|
|
304
|
-
"stats": "https://akos.agentskit.io/api/stats.json"
|
|
443
|
+
"llms": "https://akos.agentskit.io/llms.txt"
|
|
305
444
|
}
|
|
306
445
|
],
|
|
307
446
|
"builder": {
|
package/mcpb/.mcpbignore
ADDED
package/mcpb/icon.png
ADDED
|
Binary file
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest_version": "0.3",
|
|
3
|
+
"name": "doc-bridge",
|
|
4
|
+
"display_name": "Doc Bridge",
|
|
5
|
+
"version": "1.2.6",
|
|
6
|
+
"description": "Deterministic repository handoffs for coding agents, running locally without an LLM or API key.",
|
|
7
|
+
"long_description": "Doc Bridge turns a repository's own documentation and ownership metadata into deterministic handoffs: where an agent should start, which paths it may edit, which checks it must run, and when a human must take over. The local connector exposes the same read-only contract available through Doc Bridge CLI and CI.",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "AgentsKit",
|
|
10
|
+
"url": "https://agentskit.io"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/AgentsKit-io/doc-bridge.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://doc-bridge.agentskit.io/",
|
|
17
|
+
"documentation": "https://doc-bridge.agentskit.io/docs/mcp",
|
|
18
|
+
"support": "https://github.com/AgentsKit-io/doc-bridge/issues",
|
|
19
|
+
"icon": "icon.png",
|
|
20
|
+
"server": {
|
|
21
|
+
"type": "node",
|
|
22
|
+
"entry_point": "server/ak-docs.js",
|
|
23
|
+
"mcp_config": {
|
|
24
|
+
"command": "node",
|
|
25
|
+
"args": [
|
|
26
|
+
"${__dirname}/server/ak-docs.js",
|
|
27
|
+
"mcp",
|
|
28
|
+
"--config",
|
|
29
|
+
"${user_config.project_config}"
|
|
30
|
+
],
|
|
31
|
+
"env": {}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"tools": [
|
|
35
|
+
{
|
|
36
|
+
"name": "handoff.resolve",
|
|
37
|
+
"description": "Resolve a package or ownership id to its deterministic AgentHandoff."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "doc.search",
|
|
41
|
+
"description": "Search the deterministic Doc Bridge index for repository documentation."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "doc.get",
|
|
45
|
+
"description": "Read one indexed agent documentation file by id or indexed path."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "gate.status",
|
|
49
|
+
"description": "Evaluate documentation gates without writing files."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "retriever.query",
|
|
53
|
+
"description": "Return relevant local Doc Bridge index chunks for a query."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "memory.classify",
|
|
57
|
+
"description": "Classify local memory candidates into agent, human, playbook, or discard routes."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "memory.promoteDraft",
|
|
61
|
+
"description": "Build a reviewable draft promotion body from local memory candidates without publishing it."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "registry.topology",
|
|
65
|
+
"description": "Return the static Doc Bridge curator and delegate topology."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"tools_generated": false,
|
|
69
|
+
"keywords": [
|
|
70
|
+
"coding-agents",
|
|
71
|
+
"documentation",
|
|
72
|
+
"handoff",
|
|
73
|
+
"repository",
|
|
74
|
+
"developer-tools"
|
|
75
|
+
],
|
|
76
|
+
"license": "MIT",
|
|
77
|
+
"privacy_policies": [
|
|
78
|
+
"https://github.com/AgentsKit-io/doc-bridge/blob/master/PRIVACY.md"
|
|
79
|
+
],
|
|
80
|
+
"compatibility": {
|
|
81
|
+
"platforms": [
|
|
82
|
+
"darwin"
|
|
83
|
+
],
|
|
84
|
+
"runtimes": {
|
|
85
|
+
"node": ">=22"
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"user_config": {
|
|
89
|
+
"project_config": {
|
|
90
|
+
"type": "file",
|
|
91
|
+
"title": "Doc Bridge configuration",
|
|
92
|
+
"description": "Select the doc-bridge.config.json file at the root of the repository Doc Bridge may read.",
|
|
93
|
+
"required": true
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentskit/doc-bridge",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.6",
|
|
4
|
+
"mcpName": "io.github.AgentsKit-io/doc-bridge",
|
|
4
5
|
"description": "Human↔agent documentation bridge — deterministic handoffs, doc-site links, memory→docs, optional AgentsKit RAG/chat.",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"bin": {
|
|
@@ -30,11 +31,13 @@
|
|
|
30
31
|
"docs",
|
|
31
32
|
"examples",
|
|
32
33
|
"README.md",
|
|
34
|
+
"PRIVACY.md",
|
|
33
35
|
"CONTRIBUTING.md",
|
|
34
36
|
"SECURITY.md",
|
|
35
37
|
"CODE_OF_CONDUCT.md",
|
|
36
38
|
"CHANGELOG.md",
|
|
37
39
|
"LICENSE",
|
|
40
|
+
"mcpb",
|
|
38
41
|
"tsup.config.ts",
|
|
39
42
|
"tsconfig.json",
|
|
40
43
|
"src"
|
|
@@ -52,6 +55,11 @@
|
|
|
52
55
|
"smoke:docsites": "node scripts/smoke-docsites.mjs",
|
|
53
56
|
"smoke:real-docsites": "node scripts/smoke-real-docsites.mjs",
|
|
54
57
|
"smoke:ollama": "node scripts/smoke-ollama.mjs",
|
|
58
|
+
"mcpb:stage": "npm run build && node scripts/build-mcpb.mjs stage",
|
|
59
|
+
"mcpb:validate": "node scripts/build-mcpb.mjs validate",
|
|
60
|
+
"mcpb:smoke": "node scripts/smoke-mcpb.mjs",
|
|
61
|
+
"mcpb:pack": "npm run mcpb:stage && npm run mcpb:smoke && node scripts/build-mcpb.mjs pack",
|
|
62
|
+
"test:mcpb": "node --test scripts/mcpb-contract.test.mjs",
|
|
55
63
|
"coverage:badge": "node scripts/update-coverage-badge.mjs",
|
|
56
64
|
"changeset": "changeset",
|
|
57
65
|
"version-packages": "changeset version && node scripts/sync-version.mjs",
|
|
@@ -131,6 +139,7 @@
|
|
|
131
139
|
"@agentskit/core": "1.12.3",
|
|
132
140
|
"@agentskit/ink": "0.10.4",
|
|
133
141
|
"@agentskit/react": "0.7.4",
|
|
142
|
+
"@anthropic-ai/mcpb": "2.1.2",
|
|
134
143
|
"@changesets/cli": "^2.31.0",
|
|
135
144
|
"@lhci/cli": "^0.15.1",
|
|
136
145
|
"@playwright/test": "1.61.1",
|
|
@@ -139,11 +148,12 @@
|
|
|
139
148
|
"@types/react": "19.2.17",
|
|
140
149
|
"@types/react-dom": "19.2.3",
|
|
141
150
|
"@vitest/coverage-v8": "4.1.10",
|
|
151
|
+
"esbuild": "^0.28.1",
|
|
142
152
|
"fumadocs-core": "15.6.5",
|
|
143
153
|
"fumadocs-mdx": "11.6.4",
|
|
144
154
|
"fumadocs-ui": "15.6.5",
|
|
145
155
|
"lucide-react": "0.460.0",
|
|
146
|
-
"next": "15.5.
|
|
156
|
+
"next": "15.5.21",
|
|
147
157
|
"react": "19.2.0",
|
|
148
158
|
"react-dom": "19.2.0",
|
|
149
159
|
"tailwindcss": "4.3.2",
|
|
@@ -151,14 +161,6 @@
|
|
|
151
161
|
"typescript": "^6.0.3",
|
|
152
162
|
"vitest": "^4.1.9"
|
|
153
163
|
},
|
|
154
|
-
"pnpm": {
|
|
155
|
-
"overrides": {
|
|
156
|
-
"esbuild": "^0.28.1",
|
|
157
|
-
"postcss": "8.5.19",
|
|
158
|
-
"tmp": "0.2.7",
|
|
159
|
-
"uuid": "11.1.1"
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
164
|
"directories": {
|
|
163
165
|
"doc": "docs",
|
|
164
166
|
"example": "examples",
|
package/src/mcp/server.ts
CHANGED
|
@@ -30,7 +30,9 @@ type McpContext = {
|
|
|
30
30
|
export const MCP_TOOLS = [
|
|
31
31
|
{
|
|
32
32
|
name: 'handoff.resolve',
|
|
33
|
-
|
|
33
|
+
title: 'Resolve repository handoff',
|
|
34
|
+
description: 'Resolve a package or ownership id to its deterministic AgentHandoff.',
|
|
35
|
+
annotations: { readOnlyHint: true },
|
|
34
36
|
inputSchema: {
|
|
35
37
|
type: 'object',
|
|
36
38
|
properties: { id: { type: 'string' }, kind: { type: 'string', enum: ['package', 'ownership'] } },
|
|
@@ -39,7 +41,9 @@ export const MCP_TOOLS = [
|
|
|
39
41
|
},
|
|
40
42
|
{
|
|
41
43
|
name: 'doc.search',
|
|
42
|
-
|
|
44
|
+
title: 'Search repository documentation',
|
|
45
|
+
description: 'Search the deterministic Doc Bridge index for repository documentation.',
|
|
46
|
+
annotations: { readOnlyHint: true },
|
|
43
47
|
inputSchema: {
|
|
44
48
|
type: 'object',
|
|
45
49
|
properties: { term: { type: 'string' }, limit: { type: 'number' } },
|
|
@@ -48,7 +52,9 @@ export const MCP_TOOLS = [
|
|
|
48
52
|
},
|
|
49
53
|
{
|
|
50
54
|
name: 'doc.get',
|
|
51
|
-
|
|
55
|
+
title: 'Read indexed documentation',
|
|
56
|
+
description: 'Read one indexed agent documentation file by id or indexed path.',
|
|
57
|
+
annotations: { readOnlyHint: true },
|
|
52
58
|
inputSchema: {
|
|
53
59
|
type: 'object',
|
|
54
60
|
properties: { id: { type: 'string' }, path: { type: 'string' } },
|
|
@@ -56,12 +62,16 @@ export const MCP_TOOLS = [
|
|
|
56
62
|
},
|
|
57
63
|
{
|
|
58
64
|
name: 'gate.status',
|
|
59
|
-
|
|
65
|
+
title: 'Check documentation gates',
|
|
66
|
+
description: 'Evaluate documentation gates without writing files.',
|
|
67
|
+
annotations: { readOnlyHint: true },
|
|
60
68
|
inputSchema: { type: 'object', properties: {} },
|
|
61
69
|
},
|
|
62
70
|
{
|
|
63
71
|
name: 'retriever.query',
|
|
64
|
-
|
|
72
|
+
title: 'Retrieve documentation context',
|
|
73
|
+
description: 'Return relevant local Doc Bridge index chunks for a query.',
|
|
74
|
+
annotations: { readOnlyHint: true },
|
|
65
75
|
inputSchema: {
|
|
66
76
|
type: 'object',
|
|
67
77
|
properties: { query: { type: 'string' }, limit: { type: 'number' } },
|
|
@@ -70,17 +80,23 @@ export const MCP_TOOLS = [
|
|
|
70
80
|
},
|
|
71
81
|
{
|
|
72
82
|
name: 'memory.classify',
|
|
73
|
-
|
|
83
|
+
title: 'Classify memory candidates',
|
|
84
|
+
description: 'Classify local memory candidates into agent, human, playbook, or discard routes.',
|
|
85
|
+
annotations: { readOnlyHint: true },
|
|
74
86
|
inputSchema: { type: 'object', properties: {} },
|
|
75
87
|
},
|
|
76
88
|
{
|
|
77
89
|
name: 'memory.promoteDraft',
|
|
78
|
-
|
|
90
|
+
title: 'Draft memory promotion',
|
|
91
|
+
description: 'Build a reviewable draft promotion body from local memory candidates without publishing it.',
|
|
92
|
+
annotations: { readOnlyHint: true },
|
|
79
93
|
inputSchema: { type: 'object', properties: {} },
|
|
80
94
|
},
|
|
81
95
|
{
|
|
82
96
|
name: 'registry.topology',
|
|
83
|
-
|
|
97
|
+
title: 'Inspect registry topology',
|
|
98
|
+
description: 'Return the static Doc Bridge curator and delegate topology.',
|
|
99
|
+
annotations: { readOnlyHint: true },
|
|
84
100
|
inputSchema: { type: 'object', properties: {} },
|
|
85
101
|
},
|
|
86
102
|
] as const
|
|
@@ -223,12 +239,14 @@ export const handleMcpRequest = (ctx: McpContext, request: JsonRpcRequest): unkn
|
|
|
223
239
|
throw new Error(`Unsupported MCP method "${request.method ?? ''}"`)
|
|
224
240
|
}
|
|
225
241
|
|
|
226
|
-
|
|
242
|
+
type StdioFraming = 'content-length' | 'json-line'
|
|
243
|
+
|
|
244
|
+
const writeFrame = (payload: unknown, framing: StdioFraming): void => {
|
|
227
245
|
const body = JSON.stringify(payload)
|
|
228
|
-
process.stdout.write(`Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`)
|
|
246
|
+
process.stdout.write(framing === 'json-line' ? `${body}\n` : `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`)
|
|
229
247
|
}
|
|
230
248
|
|
|
231
|
-
const respond = (ctx: McpContext, request: JsonRpcRequest): void => {
|
|
249
|
+
const respond = (ctx: McpContext, request: JsonRpcRequest, framing: StdioFraming): void => {
|
|
232
250
|
if (request.id === undefined) {
|
|
233
251
|
try {
|
|
234
252
|
handleMcpRequest(ctx, request)
|
|
@@ -240,13 +258,13 @@ const respond = (ctx: McpContext, request: JsonRpcRequest): void => {
|
|
|
240
258
|
|
|
241
259
|
try {
|
|
242
260
|
const result = handleMcpRequest(ctx, request)
|
|
243
|
-
writeFrame({ jsonrpc: '2.0', id: request.id, result: result ?? {} })
|
|
261
|
+
writeFrame({ jsonrpc: '2.0', id: request.id, result: result ?? {} }, framing)
|
|
244
262
|
} catch (error) {
|
|
245
263
|
writeFrame({
|
|
246
264
|
jsonrpc: '2.0',
|
|
247
265
|
id: request.id,
|
|
248
266
|
error: { code: -32000, message: error instanceof Error ? error.message : String(error) },
|
|
249
|
-
})
|
|
267
|
+
}, framing)
|
|
250
268
|
}
|
|
251
269
|
}
|
|
252
270
|
|
|
@@ -255,21 +273,35 @@ export const startMcpStdioServer = (ctx: McpContext): void => {
|
|
|
255
273
|
process.stdin.on('data', (chunk: Buffer) => {
|
|
256
274
|
buffer = Buffer.concat([buffer, chunk])
|
|
257
275
|
while (true) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
276
|
+
if (/^content-length:/i.test(buffer.subarray(0, Math.min(buffer.length, 32)).toString('utf8'))) {
|
|
277
|
+
const headerEnd = buffer.indexOf('\r\n\r\n')
|
|
278
|
+
if (headerEnd === -1) return
|
|
279
|
+
const header = buffer.subarray(0, headerEnd).toString('utf8')
|
|
280
|
+
const match = /content-length:\s*(\d+)/i.exec(header)
|
|
281
|
+
if (!match?.[1]) {
|
|
282
|
+
buffer = buffer.subarray(headerEnd + 4)
|
|
283
|
+
continue
|
|
284
|
+
}
|
|
285
|
+
const length = Number(match[1])
|
|
286
|
+
const bodyStart = headerEnd + 4
|
|
287
|
+
const bodyEnd = bodyStart + length
|
|
288
|
+
if (buffer.length < bodyEnd) return
|
|
289
|
+
const raw = buffer.subarray(bodyStart, bodyEnd).toString('utf8')
|
|
290
|
+
buffer = buffer.subarray(bodyEnd)
|
|
291
|
+
respond(ctx, JSON.parse(raw) as JsonRpcRequest, 'content-length')
|
|
264
292
|
continue
|
|
265
293
|
}
|
|
266
|
-
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
294
|
+
|
|
295
|
+
const lineEnd = buffer.indexOf('\n')
|
|
296
|
+
if (lineEnd === -1) return
|
|
297
|
+
const raw = buffer.subarray(0, lineEnd).toString('utf8').trim()
|
|
298
|
+
buffer = buffer.subarray(lineEnd + 1)
|
|
299
|
+
if (!raw) continue
|
|
300
|
+
try {
|
|
301
|
+
respond(ctx, JSON.parse(raw) as JsonRpcRequest, 'json-line')
|
|
302
|
+
} catch {
|
|
303
|
+
writeFrame({ jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } }, 'json-line')
|
|
304
|
+
}
|
|
273
305
|
}
|
|
274
306
|
})
|
|
275
307
|
process.stdin.resume()
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '1.2.
|
|
1
|
+
export const PACKAGE_VERSION = '1.2.6'
|