backpack-ontology 0.2.24 → 0.3.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/README.md +153 -3
- package/dist/bin/backpack-benchmark.d.ts +3 -0
- package/dist/bin/backpack-benchmark.d.ts.map +1 -0
- package/dist/bin/backpack-benchmark.js +213 -0
- package/dist/bin/backpack-benchmark.js.map +1 -0
- package/dist/bin/backpack.js +3 -3
- package/dist/bin/backpack.js.map +1 -1
- package/dist/bin/init.js +8 -11
- package/dist/bin/init.js.map +1 -1
- package/dist/core/backpack.d.ts +78 -2
- package/dist/core/backpack.d.ts.map +1 -1
- package/dist/core/backpack.js +226 -3
- package/dist/core/backpack.js.map +1 -1
- package/dist/core/draft.d.ts +42 -0
- package/dist/core/draft.d.ts.map +1 -0
- package/dist/core/draft.js +232 -0
- package/dist/core/draft.js.map +1 -0
- package/dist/core/events.d.ts +114 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +375 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/graph.d.ts +3 -1
- package/dist/core/graph.d.ts.map +1 -1
- package/dist/core/graph.js +50 -0
- package/dist/core/graph.js.map +1 -1
- package/dist/core/hooks.d.ts +11 -3
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +53 -47
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/normalize.d.ts +28 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/normalize.js +133 -0
- package/dist/core/normalize.js.map +1 -0
- package/dist/core/remote-fetch.d.ts +50 -0
- package/dist/core/remote-fetch.d.ts.map +1 -0
- package/dist/core/remote-fetch.js +338 -0
- package/dist/core/remote-fetch.js.map +1 -0
- package/dist/core/remote-registry.d.ts +95 -0
- package/dist/core/remote-registry.d.ts.map +1 -0
- package/dist/core/remote-registry.js +296 -0
- package/dist/core/remote-registry.js.map +1 -0
- package/dist/core/remote-schema.d.ts +31 -0
- package/dist/core/remote-schema.d.ts.map +1 -0
- package/dist/core/remote-schema.js +252 -0
- package/dist/core/remote-schema.js.map +1 -0
- package/dist/core/role-audit.d.ts +20 -0
- package/dist/core/role-audit.d.ts.map +1 -0
- package/dist/core/role-audit.js +197 -0
- package/dist/core/role-audit.js.map +1 -0
- package/dist/core/telemetry.d.ts +2 -0
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +27 -0
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/token-estimate.d.ts +16 -0
- package/dist/core/token-estimate.d.ts.map +1 -0
- package/dist/core/token-estimate.js +29 -0
- package/dist/core/token-estimate.js.map +1 -0
- package/dist/core/types.d.ts +30 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +11 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/bulk-tools.d.ts.map +1 -1
- package/dist/mcp/tools/bulk-tools.js +80 -12
- package/dist/mcp/tools/bulk-tools.js.map +1 -1
- package/dist/mcp/tools/edge-tools.d.ts.map +1 -1
- package/dist/mcp/tools/edge-tools.js +14 -18
- package/dist/mcp/tools/edge-tools.js.map +1 -1
- package/dist/mcp/tools/error-helpers.d.ts +16 -0
- package/dist/mcp/tools/error-helpers.d.ts.map +1 -0
- package/dist/mcp/tools/error-helpers.js +34 -0
- package/dist/mcp/tools/error-helpers.js.map +1 -0
- package/dist/mcp/tools/intelligence-tools.d.ts +4 -0
- package/dist/mcp/tools/intelligence-tools.d.ts.map +1 -0
- package/dist/mcp/tools/intelligence-tools.js +184 -0
- package/dist/mcp/tools/intelligence-tools.js.map +1 -0
- package/dist/mcp/tools/node-tools.d.ts.map +1 -1
- package/dist/mcp/tools/node-tools.js +43 -40
- package/dist/mcp/tools/node-tools.js.map +1 -1
- package/dist/mcp/tools/ontology-tools.d.ts.map +1 -1
- package/dist/mcp/tools/ontology-tools.js +237 -12
- package/dist/mcp/tools/ontology-tools.js.map +1 -1
- package/dist/mcp/tools/remote-tools.d.ts +5 -0
- package/dist/mcp/tools/remote-tools.d.ts.map +1 -0
- package/dist/mcp/tools/remote-tools.js +295 -0
- package/dist/mcp/tools/remote-tools.js.map +1 -0
- package/dist/mcp/tools/version-tools.d.ts.map +1 -1
- package/dist/mcp/tools/version-tools.js +86 -0
- package/dist/mcp/tools/version-tools.js.map +1 -1
- package/dist/storage/backpack-app-backend.d.ts +1 -1
- package/dist/storage/backpack-app-backend.d.ts.map +1 -1
- package/dist/storage/backpack-app-backend.js +3 -1
- package/dist/storage/backpack-app-backend.js.map +1 -1
- package/dist/storage/event-sourced-backend.d.ts +174 -0
- package/dist/storage/event-sourced-backend.d.ts.map +1 -0
- package/dist/storage/event-sourced-backend.js +840 -0
- package/dist/storage/event-sourced-backend.js.map +1 -0
- package/dist/storage/json-file-backend.d.ts +1 -54
- package/dist/storage/json-file-backend.d.ts.map +1 -1
- package/dist/storage/json-file-backend.js +11 -470
- package/dist/storage/json-file-backend.js.map +1 -1
- package/package.json +3 -3
- package/hooks/auto-capture-prompt.md +0 -40
- package/hooks/hooks.json +0 -16
- package/hooks/suggest-viewer.sh +0 -4
package/README.md
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
# Backpack
|
|
2
2
|
|
|
3
|
-
**Carry your knowledge forward.**
|
|
3
|
+
**Carry your knowledge forward.**
|
|
4
|
+
|
|
5
|
+
LLMs are incredible at reasoning but have zero memory of your world. Every new conversation starts from scratch — you repeat clients, projects, decisions, and preferences over and over.
|
|
6
|
+
|
|
7
|
+
Backpack fixes that. It gives your AI a persistent, structured knowledge base that carries forward across every session.
|
|
8
|
+
|
|
9
|
+

|
|
4
10
|
|
|
5
11
|
## What it does
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
Tell your AI something once, and it remembers — next conversation, next week, next month.
|
|
8
14
|
|
|
9
15
|
```
|
|
10
16
|
You: "We just signed Acme Corp, they're on the Enterprise tier, main contact is Sarah Chen"
|
|
@@ -20,6 +26,22 @@ Claude: "Acme Corp is on the Enterprise tier, main contact is Sarah Chen..."
|
|
|
20
26
|
|
|
21
27
|
No copy-pasting. No re-explaining. Your knowledge carries forward.
|
|
22
28
|
|
|
29
|
+
## The graph viewer
|
|
30
|
+
|
|
31
|
+
An interactive canvas where you can actually see and explore your knowledge base.
|
|
32
|
+
|
|
33
|
+

|
|
34
|
+
|
|
35
|
+
- Force-directed layout with live updates as you add knowledge
|
|
36
|
+
- Click nodes to explore relationships, properties, and connections
|
|
37
|
+
- Focus mode to zoom into a subgraph, walk mode to trace paths between ideas
|
|
38
|
+
- Type hulls group related things visually
|
|
39
|
+
- Vim-style keyboard navigation, undo/redo, search
|
|
40
|
+
|
|
41
|
+
This is where human understanding meets AI-generated knowledge — turning structured data into something you can see, navigate, and build on.
|
|
42
|
+
|
|
43
|
+
[Backpack Viewer repo](https://github.com/NoahIrzinger/backpack-viewer)
|
|
44
|
+
|
|
23
45
|
## Get started
|
|
24
46
|
|
|
25
47
|
### Recommended: Backpack App (free cloud account)
|
|
@@ -42,6 +64,112 @@ claude mcp add backpack-local -s user -- npx backpack-ontology@latest
|
|
|
42
64
|
|
|
43
65
|
You can always move to Backpack App later by telling Claude "sync my backpack to the cloud".
|
|
44
66
|
|
|
67
|
+
### Works with other AI tools
|
|
68
|
+
|
|
69
|
+
Backpack works with any tool that supports MCP. Here's how to set it up:
|
|
70
|
+
|
|
71
|
+
<details>
|
|
72
|
+
<summary><strong>Cursor</strong></summary>
|
|
73
|
+
|
|
74
|
+
Add to `~/.cursor/mcp.json` (or `.cursor/mcp.json` in your project):
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"mcpServers": {
|
|
79
|
+
"backpack": {
|
|
80
|
+
"command": "npx",
|
|
81
|
+
"args": ["backpack-ontology@latest"]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Or configure through Cursor Settings > MCP.
|
|
88
|
+
</details>
|
|
89
|
+
|
|
90
|
+
<details>
|
|
91
|
+
<summary><strong>Windsurf</strong></summary>
|
|
92
|
+
|
|
93
|
+
Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"mcpServers": {
|
|
98
|
+
"backpack": {
|
|
99
|
+
"command": "npx",
|
|
100
|
+
"args": ["backpack-ontology@latest"]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
</details>
|
|
106
|
+
|
|
107
|
+
<details>
|
|
108
|
+
<summary><strong>OpenAI Codex CLI</strong></summary>
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
codex mcp add backpack -- npx backpack-ontology@latest
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Or add to `~/.codex/config.toml`:
|
|
115
|
+
|
|
116
|
+
```toml
|
|
117
|
+
[mcp_servers.backpack]
|
|
118
|
+
command = "npx"
|
|
119
|
+
args = ["backpack-ontology@latest"]
|
|
120
|
+
```
|
|
121
|
+
</details>
|
|
122
|
+
|
|
123
|
+
<details>
|
|
124
|
+
<summary><strong>Cline (VS Code)</strong></summary>
|
|
125
|
+
|
|
126
|
+
Click the MCP Servers icon in Cline's top bar, then add:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"mcpServers": {
|
|
131
|
+
"backpack": {
|
|
132
|
+
"command": "npx",
|
|
133
|
+
"args": ["backpack-ontology@latest"]
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
</details>
|
|
139
|
+
|
|
140
|
+
<details>
|
|
141
|
+
<summary><strong>Continue.dev</strong></summary>
|
|
142
|
+
|
|
143
|
+
Add to `~/.continue/config.yaml`:
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
mcpServers:
|
|
147
|
+
- name: backpack
|
|
148
|
+
command: npx
|
|
149
|
+
args:
|
|
150
|
+
- "backpack-ontology@latest"
|
|
151
|
+
```
|
|
152
|
+
</details>
|
|
153
|
+
|
|
154
|
+
<details>
|
|
155
|
+
<summary><strong>Zed</strong></summary>
|
|
156
|
+
|
|
157
|
+
Add to `~/.config/zed/settings.json`:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"context_servers": {
|
|
162
|
+
"backpack": {
|
|
163
|
+
"command": "npx",
|
|
164
|
+
"args": ["backpack-ontology@latest"]
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Note: Zed uses `context_servers`, not `mcpServers`.
|
|
171
|
+
</details>
|
|
172
|
+
|
|
45
173
|
### Switching from Backpack Local to Backpack App
|
|
46
174
|
|
|
47
175
|
Already using Backpack Local and want to move to the cloud? One command uploads everything:
|
|
@@ -92,6 +220,28 @@ Claude will open the graph visualizer so you can explore your knowledge visually
|
|
|
92
220
|
|
|
93
221
|
You have one backpack. It goes everywhere with you. Inside it, you organize knowledge into **learning graphs**, each covering a different topic (clients, processes, compliance, etc.). Within each graph, information is stored as things connected by relationships. You don't need to think about the structure. Claude handles it automatically.
|
|
94
222
|
|
|
223
|
+
## Token efficiency
|
|
224
|
+
|
|
225
|
+
Backpack uses progressive disclosure — it never loads the full graph into context. Each tool returns only what's needed.
|
|
226
|
+
|
|
227
|
+
Here's what a typical interaction looks like against a real 81-node graph (~12,000 tokens if loaded raw):
|
|
228
|
+
|
|
229
|
+
| What the AI does | Tokens returned | % of full graph |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| Describe structure | ~2,478 | 20% |
|
|
232
|
+
| Search for a topic (17 results) | ~429 | 3% |
|
|
233
|
+
| Get one node's full details | ~154 | 1% |
|
|
234
|
+
|
|
235
|
+
A describe → search → get_node interaction uses **~3,000 tokens** instead of ~12,000. For smaller graphs (13 nodes, ~1,700 tokens), the savings are smaller because the metadata is a larger fraction of total data.
|
|
236
|
+
|
|
237
|
+
Results vary by graph size and operation. Node lookups and searches consistently use under 5% of the full graph. Describe uses 20–67% depending on graph size. Run the benchmark on your own graphs:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
npx -p backpack-ontology@latest backpack-benchmark
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Across sessions, the real value is that the graph exists at all. It's built once and queried forever — every future conversation uses structured lookups instead of re-explaining context from scratch.
|
|
244
|
+
|
|
95
245
|
## Data and privacy
|
|
96
246
|
|
|
97
247
|
**Backpack Local**: your data is stored as readable JSON files on your computer at `~/.local/share/backpack/ontologies/`. You can inspect, edit, back up, or version-control these files directly.
|
|
@@ -110,7 +260,7 @@ You have one backpack. It goes everywhere with you. Inside it, you organize know
|
|
|
110
260
|
| `claude mcp add backpack-app ... --transport sse` | Connect to Backpack App cloud MCP |
|
|
111
261
|
| `npx -p backpack-ontology@latest backpack-sync` | Upload local learning graphs to Backpack App |
|
|
112
262
|
| `npx backpack-viewer` | Open the graph visualizer (http://localhost:5173) |
|
|
113
|
-
| `npx -p backpack-ontology@latest backpack-init` |
|
|
263
|
+
| `npx -p backpack-ontology@latest backpack-init` | Remove any leftover Backpack hooks from `.claude/settings.json` |
|
|
114
264
|
|
|
115
265
|
### Tools
|
|
116
266
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backpack-benchmark.d.ts","sourceRoot":"","sources":["../../src/bin/backpack-benchmark.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Backpack } from "../core/backpack.js";
|
|
3
|
+
import { JsonFileBackend } from "../storage/json-file-backend.js";
|
|
4
|
+
import { estimateTokens } from "../core/token-estimate.js";
|
|
5
|
+
function pct(response, full) {
|
|
6
|
+
if (full <= 0)
|
|
7
|
+
return 0;
|
|
8
|
+
return Math.round((1 - response / full) * 100);
|
|
9
|
+
}
|
|
10
|
+
function median(nums) {
|
|
11
|
+
const sorted = [...nums].sort((a, b) => a - b);
|
|
12
|
+
const mid = Math.floor(sorted.length / 2);
|
|
13
|
+
return sorted.length % 2 ? sorted[mid] : Math.round((sorted[mid - 1] + sorted[mid]) / 2);
|
|
14
|
+
}
|
|
15
|
+
function mean(nums) {
|
|
16
|
+
return Math.round(nums.reduce((a, b) => a + b, 0) / nums.length);
|
|
17
|
+
}
|
|
18
|
+
function tok(response) {
|
|
19
|
+
return estimateTokens(JSON.stringify(JSON.parse(response), null, 2));
|
|
20
|
+
}
|
|
21
|
+
function pad(s, n, align = "left") {
|
|
22
|
+
return align === "right" ? s.padStart(n) : s.padEnd(n);
|
|
23
|
+
}
|
|
24
|
+
/** Pick a search term from the graph — first word of first node's first string property. */
|
|
25
|
+
function pickSearchTerm(backpackApi, data) {
|
|
26
|
+
for (const node of data.nodes) {
|
|
27
|
+
for (const val of Object.values(node.properties)) {
|
|
28
|
+
if (typeof val === "string" && val.length > 2) {
|
|
29
|
+
const word = val.split(/\s+/)[0].toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
30
|
+
if (word.length >= 3)
|
|
31
|
+
return word;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return data.nodes[0]?.type?.toLowerCase() ?? "test";
|
|
36
|
+
}
|
|
37
|
+
/** Pick the median-connectivity node. */
|
|
38
|
+
function pickMedianNode(data) {
|
|
39
|
+
const edgeCounts = new Map();
|
|
40
|
+
for (const n of data.nodes)
|
|
41
|
+
edgeCounts.set(n.id, 0);
|
|
42
|
+
for (const e of data.edges) {
|
|
43
|
+
edgeCounts.set(e.sourceId, (edgeCounts.get(e.sourceId) ?? 0) + 1);
|
|
44
|
+
edgeCounts.set(e.targetId, (edgeCounts.get(e.targetId) ?? 0) + 1);
|
|
45
|
+
}
|
|
46
|
+
const sorted = [...edgeCounts.entries()].sort((a, b) => a[1] - b[1]);
|
|
47
|
+
return sorted[Math.floor(sorted.length / 2)][0];
|
|
48
|
+
}
|
|
49
|
+
async function run() {
|
|
50
|
+
const bp = new Backpack(new JsonFileBackend());
|
|
51
|
+
await bp.initialize();
|
|
52
|
+
const summaries = await bp.listOntologies();
|
|
53
|
+
const results = [];
|
|
54
|
+
let skipped = 0;
|
|
55
|
+
for (const summary of summaries) {
|
|
56
|
+
if (summary.nodeCount === 0) {
|
|
57
|
+
skipped++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const name = summary.name;
|
|
61
|
+
process.stderr.write(` benchmarking ${name}...\n`);
|
|
62
|
+
try {
|
|
63
|
+
const graphTokens = await bp.getGraphTokens(name);
|
|
64
|
+
// Load raw data for search term and node selection
|
|
65
|
+
const graph = await bp.getGraph(name);
|
|
66
|
+
const data = graph.data;
|
|
67
|
+
// describe
|
|
68
|
+
const desc = await bp.describeOntology(name);
|
|
69
|
+
const descTokens = estimateTokens(JSON.stringify(desc, null, 2));
|
|
70
|
+
// node_types
|
|
71
|
+
const types = await bp.getNodeTypes(name);
|
|
72
|
+
const typesTokens = estimateTokens(JSON.stringify(types, null, 2));
|
|
73
|
+
// list_nodes (page of 20)
|
|
74
|
+
const list = await bp.listNodes(name, undefined, 20, 0);
|
|
75
|
+
const listTokens = estimateTokens(JSON.stringify(list, null, 2));
|
|
76
|
+
// search
|
|
77
|
+
const searchTerm = pickSearchTerm(bp, data);
|
|
78
|
+
const searchResults = await bp.searchNodes(name, searchTerm);
|
|
79
|
+
const searchTokens = estimateTokens(JSON.stringify(searchResults, null, 2));
|
|
80
|
+
// get_node (median connectivity node)
|
|
81
|
+
const nodeId = pickMedianNode(data);
|
|
82
|
+
const nodeResult = await bp.getNode(name, nodeId);
|
|
83
|
+
const nodeTokens = estimateTokens(JSON.stringify(nodeResult, null, 2));
|
|
84
|
+
// get_neighbors
|
|
85
|
+
const neighbors = await bp.getNeighbors(name, nodeId, undefined, "both", 1);
|
|
86
|
+
const neighborsTokens = estimateTokens(JSON.stringify(neighbors, null, 2));
|
|
87
|
+
results.push({
|
|
88
|
+
name,
|
|
89
|
+
nodes: summary.nodeCount,
|
|
90
|
+
edges: summary.edgeCount,
|
|
91
|
+
fullTokens: graphTokens,
|
|
92
|
+
describe: descTokens,
|
|
93
|
+
search: searchTokens,
|
|
94
|
+
searchResults: searchResults.length,
|
|
95
|
+
getNode: nodeTokens,
|
|
96
|
+
getNeighbors: neighborsTokens,
|
|
97
|
+
listNodes: listTokens,
|
|
98
|
+
nodeTypes: typesTokens,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
process.stderr.write(` skipped ${name}: ${err.message}\n`);
|
|
103
|
+
skipped++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Sort by node count
|
|
107
|
+
results.sort((a, b) => a.nodes - b.nodes);
|
|
108
|
+
console.log("");
|
|
109
|
+
console.log("Backpack Token Efficiency Benchmark");
|
|
110
|
+
console.log("====================================");
|
|
111
|
+
console.log(`Graphs: ${results.length} (skipped ${skipped} empty)`);
|
|
112
|
+
console.log("");
|
|
113
|
+
// --- Per-graph token counts ---
|
|
114
|
+
console.log("Per-graph token counts:");
|
|
115
|
+
const nameW = Math.max(12, ...results.map((r) => r.name.length)) + 2;
|
|
116
|
+
const hdr1 = [
|
|
117
|
+
pad("Graph", nameW),
|
|
118
|
+
pad("Nodes", 7, "right"),
|
|
119
|
+
pad("Edges", 7, "right"),
|
|
120
|
+
pad("Full", 8, "right"),
|
|
121
|
+
pad("describe", 10, "right"),
|
|
122
|
+
pad("search", 10, "right"),
|
|
123
|
+
pad("get_node", 10, "right"),
|
|
124
|
+
pad("neighbors", 11, "right"),
|
|
125
|
+
pad("list_20", 9, "right"),
|
|
126
|
+
pad("types", 8, "right"),
|
|
127
|
+
].join(" ");
|
|
128
|
+
console.log(hdr1);
|
|
129
|
+
console.log("-".repeat(hdr1.length));
|
|
130
|
+
for (const r of results) {
|
|
131
|
+
console.log([
|
|
132
|
+
pad(r.name, nameW),
|
|
133
|
+
pad(String(r.nodes), 7, "right"),
|
|
134
|
+
pad(String(r.edges), 7, "right"),
|
|
135
|
+
pad(r.fullTokens.toLocaleString(), 8, "right"),
|
|
136
|
+
pad(r.describe.toLocaleString(), 10, "right"),
|
|
137
|
+
pad(`${r.search.toLocaleString()} (${r.searchResults})`, 10, "right"),
|
|
138
|
+
pad(r.getNode.toLocaleString(), 10, "right"),
|
|
139
|
+
pad(r.getNeighbors.toLocaleString(), 11, "right"),
|
|
140
|
+
pad(r.listNodes.toLocaleString(), 9, "right"),
|
|
141
|
+
pad(r.nodeTypes.toLocaleString(), 8, "right"),
|
|
142
|
+
].join(" "));
|
|
143
|
+
}
|
|
144
|
+
console.log("");
|
|
145
|
+
// --- Per-graph reduction percentages ---
|
|
146
|
+
console.log("Token reduction vs. full graph:");
|
|
147
|
+
const hdr2 = [
|
|
148
|
+
pad("Graph", nameW),
|
|
149
|
+
pad("describe", 10, "right"),
|
|
150
|
+
pad("search", 8, "right"),
|
|
151
|
+
pad("get_node", 10, "right"),
|
|
152
|
+
pad("neighbors", 11, "right"),
|
|
153
|
+
pad("list_20", 9, "right"),
|
|
154
|
+
pad("types", 7, "right"),
|
|
155
|
+
].join(" ");
|
|
156
|
+
console.log(hdr2);
|
|
157
|
+
console.log("-".repeat(hdr2.length));
|
|
158
|
+
for (const r of results) {
|
|
159
|
+
console.log([
|
|
160
|
+
pad(r.name, nameW),
|
|
161
|
+
pad(pct(r.describe, r.fullTokens) + "%", 10, "right"),
|
|
162
|
+
pad(pct(r.search, r.fullTokens) + "%", 8, "right"),
|
|
163
|
+
pad(pct(r.getNode, r.fullTokens) + "%", 10, "right"),
|
|
164
|
+
pad(pct(r.getNeighbors, r.fullTokens) + "%", 11, "right"),
|
|
165
|
+
pad(pct(r.listNodes, r.fullTokens) + "%", 9, "right"),
|
|
166
|
+
pad(pct(r.nodeTypes, r.fullTokens) + "%", 7, "right"),
|
|
167
|
+
].join(" "));
|
|
168
|
+
}
|
|
169
|
+
console.log("");
|
|
170
|
+
// --- Aggregate stats ---
|
|
171
|
+
const ops = [
|
|
172
|
+
{ name: "describe", values: results.map((r) => pct(r.describe, r.fullTokens)) },
|
|
173
|
+
{ name: "search", values: results.map((r) => pct(r.search, r.fullTokens)) },
|
|
174
|
+
{ name: "get_node", values: results.map((r) => pct(r.getNode, r.fullTokens)) },
|
|
175
|
+
{ name: "neighbors", values: results.map((r) => pct(r.getNeighbors, r.fullTokens)) },
|
|
176
|
+
{ name: "list_20", values: results.map((r) => pct(r.listNodes, r.fullTokens)) },
|
|
177
|
+
{ name: "node_types", values: results.map((r) => pct(r.nodeTypes, r.fullTokens)) },
|
|
178
|
+
];
|
|
179
|
+
console.log(`Aggregate (across ${results.length} graphs):`);
|
|
180
|
+
const hdr3 = [
|
|
181
|
+
pad("Operation", 12),
|
|
182
|
+
pad("Min", 5, "right"),
|
|
183
|
+
pad("Max", 5, "right"),
|
|
184
|
+
pad("Median", 8, "right"),
|
|
185
|
+
pad("Mean", 6, "right"),
|
|
186
|
+
].join(" ");
|
|
187
|
+
console.log(hdr3);
|
|
188
|
+
console.log("-".repeat(hdr3.length));
|
|
189
|
+
for (const op of ops) {
|
|
190
|
+
const sorted = [...op.values].sort((a, b) => a - b);
|
|
191
|
+
console.log([
|
|
192
|
+
pad(op.name, 12),
|
|
193
|
+
pad(Math.min(...op.values) + "%", 5, "right"),
|
|
194
|
+
pad(Math.max(...op.values) + "%", 5, "right"),
|
|
195
|
+
pad(median(op.values) + "%", 8, "right"),
|
|
196
|
+
pad(mean(op.values) + "%", 6, "right"),
|
|
197
|
+
].join(" "));
|
|
198
|
+
}
|
|
199
|
+
console.log("");
|
|
200
|
+
// --- Typical interaction ---
|
|
201
|
+
const typicalReductions = results.map((r) => {
|
|
202
|
+
const interaction = r.describe + r.search + r.getNode;
|
|
203
|
+
return pct(interaction, r.fullTokens);
|
|
204
|
+
});
|
|
205
|
+
console.log("Typical interaction (describe + search + get_node):");
|
|
206
|
+
console.log(` Median reduction: ${median(typicalReductions)}% | Range: ${Math.min(...typicalReductions)}%–${Math.max(...typicalReductions)}%`);
|
|
207
|
+
console.log("");
|
|
208
|
+
}
|
|
209
|
+
run().catch((err) => {
|
|
210
|
+
console.error("Benchmark failed:", err.message);
|
|
211
|
+
process.exit(1);
|
|
212
|
+
});
|
|
213
|
+
//# sourceMappingURL=backpack-benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backpack-benchmark.js","sourceRoot":"","sources":["../../src/bin/backpack-benchmark.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/backpack.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
3
|
import { createMcpServer } from "../mcp/server.js";
|
|
4
4
|
import { loadConfig } from "../core/config.js";
|
|
5
|
-
import {
|
|
5
|
+
import { removeBackpackHooks } from "../core/hooks.js";
|
|
6
6
|
import { shutdown as shutdownTelemetry } from "../core/telemetry.js";
|
|
7
7
|
async function main() {
|
|
8
8
|
const config = await loadConfig();
|
|
9
|
-
//
|
|
10
|
-
|
|
9
|
+
// Clean up any hooks installed by older versions (silent, non-blocking)
|
|
10
|
+
removeBackpackHooks().catch(() => { });
|
|
11
11
|
const server = await createMcpServer({ mode: "local", dataDir: config.dataDir });
|
|
12
12
|
const transport = new StdioServerTransport();
|
|
13
13
|
await server.connect(transport);
|
package/dist/bin/backpack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backpack.js","sourceRoot":"","sources":["../../src/bin/backpack.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"backpack.js","sourceRoot":"","sources":["../../src/bin/backpack.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAErE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,wEAAwE;IACxE,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,gEAAgE;IAChE,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;AACxD,CAAC;AAED,kDAAkD;AAClD,KAAK,UAAU,gBAAgB;IAC7B,MAAM,iBAAiB,EAAE,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AACvC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;AAExC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/bin/init.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { removeBackpackHooks } from "../core/hooks.js";
|
|
3
3
|
/**
|
|
4
|
-
* `backpack-init` —
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* `backpack-init` — clean up any Backpack hooks left in .claude/settings.json
|
|
5
|
+
* by older versions. Auto-installation of hooks is no longer supported; this
|
|
6
|
+
* command exists so users can explicitly run the cleanup without restarting
|
|
7
|
+
* their MCP server.
|
|
8
8
|
*/
|
|
9
9
|
async function main() {
|
|
10
|
-
await
|
|
10
|
+
await removeBackpackHooks();
|
|
11
11
|
console.log("");
|
|
12
|
-
console.log(" Backpack
|
|
12
|
+
console.log(" Backpack hook cleanup complete.");
|
|
13
13
|
console.log("");
|
|
14
|
-
console.log("
|
|
15
|
-
console.log(" - Update notifications: confirms when your backpack is updated.");
|
|
16
|
-
console.log("");
|
|
17
|
-
console.log(" To disable, remove the backpack hooks from .claude/settings.json");
|
|
14
|
+
console.log(" Backpack no longer installs hooks into .claude/settings.json.");
|
|
18
15
|
console.log("");
|
|
19
16
|
}
|
|
20
17
|
main().catch((error) => {
|
package/dist/bin/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;GAKG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,mBAAmB,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/core/backpack.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { StorageBackend, Node, Edge, LearningGraphMetadata, LearningGraphSummary, NodeSummary, NodeTypeInfo, EdgeTypeInfo, ListNodesResult, GetNodeResult, NeighborResult, GraphStats, GraphAudit } from "./types.js";
|
|
1
|
+
import type { StorageBackend, Node, Edge, LearningGraphData, LearningGraphMetadata, LearningGraphSummary, NodeSummary, NodeTypeInfo, EdgeTypeInfo, ListNodesResult, GetNodeResult, NeighborResult, GraphStats, GraphAudit, GraphDegreeTable } from "./types.js";
|
|
2
|
+
import { type RoleAuditResult } from "./role-audit.js";
|
|
3
|
+
import { type DraftResult, type ProposedNode, type ProposedEdge } from "./draft.js";
|
|
4
|
+
import { planSummary, type NormalizationPlan } from "./normalize.js";
|
|
2
5
|
/**
|
|
3
6
|
* The main Backpack API. Composes a StorageBackend with the Graph engine.
|
|
4
7
|
*
|
|
@@ -13,16 +16,44 @@ import type { StorageBackend, Node, Edge, LearningGraphMetadata, LearningGraphSu
|
|
|
13
16
|
export declare class Backpack {
|
|
14
17
|
private storage;
|
|
15
18
|
private graphs;
|
|
19
|
+
private versions;
|
|
20
|
+
private tokenCache;
|
|
16
21
|
constructor(storage: StorageBackend);
|
|
17
22
|
initialize(): Promise<void>;
|
|
18
23
|
/** Get or load a Graph for an ontology. Caches in memory. */
|
|
19
24
|
private getGraph;
|
|
20
|
-
|
|
25
|
+
private getVersionIfSupported;
|
|
26
|
+
/**
|
|
27
|
+
* Save the current state of an ontology back to storage. Passes the
|
|
28
|
+
* version recorded at load time so the storage backend can detect
|
|
29
|
+
* concurrent modifications and reject the write. On conflict, the
|
|
30
|
+
* cache is invalidated and the underlying ConcurrencyError propagates.
|
|
31
|
+
*/
|
|
21
32
|
private persist;
|
|
33
|
+
/**
|
|
34
|
+
* Read the current lock heartbeat for a graph, if the storage backend
|
|
35
|
+
* supports it. Returns null when no fresh lock is held.
|
|
36
|
+
*/
|
|
37
|
+
getLockInfo(name: string): Promise<unknown | null>;
|
|
22
38
|
getTermsContext(ontologyName: string): Promise<string | null>;
|
|
23
39
|
listOntologies(): Promise<LearningGraphSummary[]>;
|
|
40
|
+
ontologyExists(name: string): Promise<boolean>;
|
|
41
|
+
loadOntology(name: string): Promise<LearningGraphData>;
|
|
24
42
|
createOntology(name: string, description: string): Promise<LearningGraphMetadata>;
|
|
25
43
|
deleteOntology(name: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a new ontology from a full LearningGraphData payload, preserving
|
|
46
|
+
* node and edge IDs. Used by remote graph import (where we want the local
|
|
47
|
+
* copy to have the same IDs as the source) and any other situation where
|
|
48
|
+
* a complete graph is constructed externally.
|
|
49
|
+
*
|
|
50
|
+
* Throws if an ontology with this name already exists.
|
|
51
|
+
*/
|
|
52
|
+
createOntologyFromData(name: string, data: LearningGraphData): Promise<void>;
|
|
53
|
+
extractSubgraph(sourceName: string, nodeIds: string[], newName: string, description?: string): Promise<{
|
|
54
|
+
nodeCount: number;
|
|
55
|
+
edgeCount: number;
|
|
56
|
+
}>;
|
|
26
57
|
renameOntology(oldName: string, newName: string): Promise<void>;
|
|
27
58
|
describeOntology(name: string): Promise<{
|
|
28
59
|
metadata: LearningGraphMetadata;
|
|
@@ -58,7 +89,43 @@ export declare class Backpack {
|
|
|
58
89
|
edgeCount: number;
|
|
59
90
|
edgeIds: string[];
|
|
60
91
|
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Validate a proposed batch of nodes and edges against the current
|
|
94
|
+
* graph state. Returns warnings (non-fatal — type drift, duplicates,
|
|
95
|
+
* three-role rule violations) and errors (fatal — broken edges,
|
|
96
|
+
* invalid property shapes).
|
|
97
|
+
*
|
|
98
|
+
* Pure check: does NOT modify the graph. Used by `backpack_import_nodes`
|
|
99
|
+
* for the always-on validation pass and by `dryRun` mode for explicit
|
|
100
|
+
* propose-only invocations.
|
|
101
|
+
*/
|
|
102
|
+
validateImport(ontologyName: string, nodes: ProposedNode[], edges?: ProposedEdge[]): Promise<DraftResult>;
|
|
103
|
+
getGraphTokens(name: string): Promise<number>;
|
|
61
104
|
auditOntology(name: string): Promise<GraphAudit>;
|
|
105
|
+
/**
|
|
106
|
+
* Plan a normalization pass: detect type drift clusters and pick
|
|
107
|
+
* the dominant variant in each. Returns the plan without applying it.
|
|
108
|
+
*/
|
|
109
|
+
planNormalization(name: string): Promise<NormalizationPlan>;
|
|
110
|
+
/**
|
|
111
|
+
* Apply a normalization plan to the graph: rename non-canonical
|
|
112
|
+
* node and edge types to their canonical variants. Uses the existing
|
|
113
|
+
* persist path, which emits retype events under the hood.
|
|
114
|
+
*
|
|
115
|
+
* Returns the plan that was applied plus a summary of counts.
|
|
116
|
+
*/
|
|
117
|
+
applyNormalization(name: string): Promise<{
|
|
118
|
+
plan: NormalizationPlan;
|
|
119
|
+
summary: ReturnType<typeof planSummary>;
|
|
120
|
+
}>;
|
|
121
|
+
/**
|
|
122
|
+
* Three-role-rule audit. Scans the graph for nodes that look like
|
|
123
|
+
* procedural content (should be a skill) or briefing content (should
|
|
124
|
+
* be in CLAUDE.md). Heuristic-based; conservative on purpose to avoid
|
|
125
|
+
* false positives.
|
|
126
|
+
*/
|
|
127
|
+
auditRoles(name: string): Promise<RoleAuditResult>;
|
|
128
|
+
getDegreeTable(name: string): Promise<GraphDegreeTable>;
|
|
62
129
|
connectEdges(ontologyName: string, edges: Array<{
|
|
63
130
|
type: string;
|
|
64
131
|
sourceId: string;
|
|
@@ -75,6 +142,15 @@ export declare class Backpack {
|
|
|
75
142
|
createSnapshot(name: string, label?: string): Promise<number>;
|
|
76
143
|
listSnapshots(name: string): Promise<any>;
|
|
77
144
|
rollback(name: string, version: number): Promise<void>;
|
|
145
|
+
saveSnippet(name: string, snippet: {
|
|
146
|
+
label: string;
|
|
147
|
+
description?: string;
|
|
148
|
+
nodeIds: string[];
|
|
149
|
+
edgeIds: string[];
|
|
150
|
+
}): Promise<string>;
|
|
151
|
+
listSnippets(name: string): Promise<any>;
|
|
152
|
+
loadSnippet(name: string, snippetId: string): Promise<any>;
|
|
153
|
+
deleteSnippet(name: string, snippetId: string): Promise<void>;
|
|
78
154
|
diffWithSnapshot(name: string, version: number): Promise<{
|
|
79
155
|
nodesAdded: {
|
|
80
156
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backpack.d.ts","sourceRoot":"","sources":["../../src/core/backpack.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,IAAI,EACJ,IAAI,
|
|
1
|
+
{"version":3,"file":"backpack.d.ts","sourceRoot":"","sources":["../../src/core/backpack.ts"],"names":[],"mappings":"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"}
|