backpack-ontology 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -124
- package/dist/bin/backpack.js +8 -0
- package/dist/bin/backpack.js.map +1 -1
- package/dist/bin/init.d.ts +3 -0
- package/dist/bin/init.d.ts.map +1 -0
- package/dist/bin/init.js +94 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/core/telemetry.d.ts +21 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +203 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +15 -1
- 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 +2 -0
- 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 +4 -0
- package/dist/mcp/tools/edge-tools.js.map +1 -1
- package/dist/mcp/tools/node-tools.d.ts.map +1 -1
- package/dist/mcp/tools/node-tools.js +8 -0
- 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 +5 -0
- package/dist/mcp/tools/ontology-tools.js.map +1 -1
- package/hooks/auto-capture-prompt.md +40 -0
- package/hooks/hooks.json +29 -0
- package/hooks/suggest-viewer.sh +4 -0
- package/package.json +9 -4
package/README.md
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
# Backpack
|
|
1
|
+
# Backpack Ontology
|
|
2
2
|
|
|
3
|
-
A persistent
|
|
3
|
+
A persistent knowledge graph engine for Claude Code, delivered as an MCP server. Backpack gives AI agents structured, searchable memory that persists across sessions.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## Quick Start
|
|
8
|
-
|
|
9
|
-
### Install
|
|
5
|
+
## Installation
|
|
10
6
|
|
|
11
7
|
```bash
|
|
12
8
|
npm install -g backpack-ontology
|
|
13
9
|
```
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
## Setup
|
|
16
12
|
|
|
17
|
-
Add to your project
|
|
13
|
+
Add Backpack to your Claude Code project (`.mcp.json`):
|
|
18
14
|
|
|
19
15
|
```json
|
|
20
16
|
{
|
|
@@ -27,51 +23,42 @@ Add to your project's `.mcp.json`:
|
|
|
27
23
|
}
|
|
28
24
|
```
|
|
29
25
|
|
|
30
|
-
Or
|
|
26
|
+
Or register it globally:
|
|
31
27
|
|
|
32
28
|
```bash
|
|
33
29
|
claude mcp add backpack -- npx backpack-ontology
|
|
34
30
|
```
|
|
35
31
|
|
|
36
|
-
Restart Claude Code
|
|
37
|
-
|
|
38
|
-
### Use It
|
|
39
|
-
|
|
40
|
-
Tell Claude to put something in the backpack:
|
|
41
|
-
|
|
42
|
-
> "Create an ontology about our codebase architecture"
|
|
43
|
-
|
|
44
|
-
> "Put a cooking ontology in the backpack with recipes and ingredients"
|
|
45
|
-
|
|
46
|
-
> "Search the backpack for anything related to authentication"
|
|
47
|
-
|
|
48
|
-
Claude will use the backpack tools to create ontologies, add nodes and edges, search, and traverse the knowledge graph — all without flooding your context window.
|
|
32
|
+
Restart Claude Code to activate.
|
|
49
33
|
|
|
50
|
-
##
|
|
34
|
+
## Usage
|
|
51
35
|
|
|
52
|
-
Backpack
|
|
36
|
+
Backpack organizes knowledge as typed graphs — nodes (entities) connected by edges (relationships). There are no enforced schemas. The LLM decides what structure fits the domain.
|
|
53
37
|
|
|
54
38
|
```
|
|
55
39
|
[Ingredient: garlic] --USED_IN--> [Recipe: Aglio e Olio]
|
|
56
|
-
[
|
|
57
|
-
[Recipe: Aglio e Olio] --CUISINE--> [Cuisine: Italian]
|
|
40
|
+
[Module: auth] --DEPENDS_ON--> [Module: database]
|
|
58
41
|
```
|
|
59
42
|
|
|
60
|
-
|
|
43
|
+
Tell Claude what to store:
|
|
44
|
+
|
|
45
|
+
> "Create an ontology about our codebase architecture"
|
|
46
|
+
|
|
47
|
+
> "Search the backpack for anything related to authentication"
|
|
48
|
+
|
|
49
|
+
> "Add the deployment pipeline to the infrastructure ontology"
|
|
61
50
|
|
|
62
51
|
### Progressive Discovery
|
|
63
52
|
|
|
64
|
-
Tools are organized in layers
|
|
53
|
+
Tools are organized in layers so the context window stays clean. Claude starts broad and drills down — only pulling in what it needs.
|
|
65
54
|
|
|
66
|
-
| Layer | Tools |
|
|
67
|
-
|
|
55
|
+
| Layer | Tools | Returns |
|
|
56
|
+
|-------|-------|---------|
|
|
68
57
|
| **Discover** | `backpack_list`, `backpack_create`, `backpack_describe` | Ontology names, descriptions, type counts |
|
|
69
58
|
| **Browse** | `backpack_list_nodes`, `backpack_node_types`, `backpack_search` | Paginated node summaries (id, type, label) |
|
|
70
59
|
| **Inspect** | `backpack_get_node`, `backpack_get_neighbors` | Full node data, graph traversal |
|
|
71
60
|
| **Mutate** | `backpack_add_node`, `backpack_update_node`, `backpack_add_edge`, ... | Create and modify data |
|
|
72
61
|
|
|
73
|
-
Claude starts at the top and drills down. A `backpack_list` call returns a few lines. A `backpack_get_node` returns one node. The context window stays clean.
|
|
74
|
-
|
|
75
62
|
## Tools Reference
|
|
76
63
|
|
|
77
64
|
### Discovery
|
|
@@ -81,7 +68,7 @@ Claude starts at the top and drills down. A `backpack_list` call returns a few l
|
|
|
81
68
|
| `backpack_list` | List all ontologies with names, descriptions, and summary counts |
|
|
82
69
|
| `backpack_create` | Create a new empty ontology |
|
|
83
70
|
| `backpack_delete` | Permanently delete an ontology and all its data |
|
|
84
|
-
| `backpack_describe` |
|
|
71
|
+
| `backpack_describe` | Inspect ontology structure: node types, edge types, counts |
|
|
85
72
|
|
|
86
73
|
### Browsing
|
|
87
74
|
|
|
@@ -95,140 +82,122 @@ Claude starts at the top and drills down. A `backpack_list` call returns a few l
|
|
|
95
82
|
|
|
96
83
|
| Tool | Description |
|
|
97
84
|
|------|-------------|
|
|
98
|
-
| `backpack_get_node` | Full node with all properties
|
|
85
|
+
| `backpack_get_node` | Full node with all properties and connected edge summaries |
|
|
99
86
|
| `backpack_get_neighbors` | BFS graph traversal from a node (max depth 3) |
|
|
100
87
|
|
|
101
88
|
### Mutation
|
|
102
89
|
|
|
103
90
|
| Tool | Description |
|
|
104
91
|
|------|-------------|
|
|
105
|
-
| `backpack_add_node` | Add a node with freeform type and properties |
|
|
92
|
+
| `backpack_add_node` | Add a node with a freeform type and properties |
|
|
106
93
|
| `backpack_update_node` | Merge new properties into an existing node |
|
|
107
94
|
| `backpack_remove_node` | Remove a node and cascade-delete its edges |
|
|
108
95
|
| `backpack_add_edge` | Create a typed relationship between two nodes |
|
|
109
96
|
| `backpack_remove_edge` | Remove a relationship |
|
|
110
|
-
| `backpack_import_nodes` | Bulk-add multiple nodes
|
|
97
|
+
| `backpack_import_nodes` | Bulk-add multiple nodes in a single operation |
|
|
111
98
|
|
|
112
|
-
##
|
|
99
|
+
## Programmatic API
|
|
113
100
|
|
|
114
|
-
|
|
101
|
+
The core engine has no MCP dependency and can be used as a library:
|
|
115
102
|
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
└── config.json # Optional config overrides
|
|
119
|
-
|
|
120
|
-
~/.local/share/backpack/ # Data
|
|
121
|
-
└── ontologies/
|
|
122
|
-
├── cooking/
|
|
123
|
-
│ └── ontology.json # One file per ontology
|
|
124
|
-
└── codebase-arch/
|
|
125
|
-
└── ontology.json
|
|
126
|
-
```
|
|
103
|
+
```typescript
|
|
104
|
+
import { Backpack, JsonFileBackend } from "backpack-ontology";
|
|
127
105
|
|
|
128
|
-
|
|
106
|
+
const backpack = new Backpack(new JsonFileBackend());
|
|
107
|
+
await backpack.initialize();
|
|
129
108
|
|
|
130
|
-
|
|
109
|
+
await backpack.createOntology("my-graph", "A knowledge graph");
|
|
110
|
+
const node = await backpack.addNode("my-graph", "Person", { name: "Alice" });
|
|
111
|
+
await backpack.addEdge("my-graph", "KNOWS", node.id, otherNodeId);
|
|
131
112
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
| `XDG_CONFIG_HOME` | Override config location (default: `~/.config`) |
|
|
135
|
-
| `XDG_DATA_HOME` | Override data location (default: `~/.local/share`) |
|
|
136
|
-
| `BACKPACK_DIR` | Override everything — config goes to `$BACKPACK_DIR/config`, data to `$BACKPACK_DIR/data` |
|
|
113
|
+
// Search across all node properties (case-insensitive)
|
|
114
|
+
const results = await backpack.searchNodes("my-graph", "alice");
|
|
137
115
|
|
|
138
|
-
|
|
116
|
+
// BFS traversal from a node (depth 1–3)
|
|
117
|
+
const neighbors = await backpack.getNeighbors("my-graph", node.id, undefined, "both", 2);
|
|
118
|
+
```
|
|
139
119
|
|
|
140
|
-
|
|
120
|
+
### Pluggable Storage
|
|
141
121
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
122
|
+
The `StorageBackend` interface allows custom persistence implementations:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { Backpack, StorageBackend } from "backpack-ontology";
|
|
126
|
+
|
|
127
|
+
class SqliteBackend implements StorageBackend {
|
|
128
|
+
// initialize, listOntologies, loadOntology, saveOntology,
|
|
129
|
+
// createOntology, deleteOntology, ontologyExists
|
|
145
130
|
}
|
|
131
|
+
|
|
132
|
+
const backpack = new Backpack(new SqliteBackend());
|
|
146
133
|
```
|
|
147
134
|
|
|
148
|
-
##
|
|
135
|
+
## Data Storage
|
|
149
136
|
|
|
150
|
-
Backpack
|
|
137
|
+
Backpack follows the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/):
|
|
151
138
|
|
|
152
139
|
```
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
│
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
│ The single entry point for all ops │ Graph + StorageBackend
|
|
159
|
-
├─────────────┬───────────────────────────┤
|
|
160
|
-
│ Graph │ StorageBackend │
|
|
161
|
-
│ In-memory │ (pluggable interface) │
|
|
162
|
-
│ operations │ │ │
|
|
163
|
-
│ │ JsonFileBackend │ Default: JSON on disk
|
|
164
|
-
│ │ (future: SQLite) │
|
|
165
|
-
│ │ (future: Remote API) │
|
|
166
|
-
└─────────────┴───────────────────────────┘
|
|
140
|
+
~/.local/share/backpack/ontologies/
|
|
141
|
+
├── cooking/
|
|
142
|
+
│ └── ontology.json
|
|
143
|
+
└── codebase-arch/
|
|
144
|
+
└── ontology.json
|
|
167
145
|
```
|
|
168
146
|
|
|
169
|
-
|
|
147
|
+
Ontology files are human-readable JSON. They can be inspected, edited, backed up, or version-controlled directly.
|
|
170
148
|
|
|
171
|
-
|
|
172
|
-
|
|
149
|
+
| Variable | Effect |
|
|
150
|
+
|----------|--------|
|
|
151
|
+
| `XDG_DATA_HOME` | Override data location (default: `~/.local/share`) |
|
|
152
|
+
| `XDG_CONFIG_HOME` | Override config location (default: `~/.config`) |
|
|
153
|
+
| `BACKPACK_DIR` | Override both — config at `$BACKPACK_DIR/config`, data at `$BACKPACK_DIR/data` |
|
|
173
154
|
|
|
174
|
-
|
|
175
|
-
await backpack.initialize();
|
|
155
|
+
## Telemetry
|
|
176
156
|
|
|
177
|
-
|
|
178
|
-
await backpack.addNode("my-graph", "Person", { name: "Alice" });
|
|
179
|
-
```
|
|
157
|
+
Backpack collects anonymous usage telemetry to improve the product. No personal data, ontology content, or tool arguments are ever collected.
|
|
180
158
|
|
|
181
|
-
|
|
159
|
+
**What is collected:**
|
|
160
|
+
- Tool call counts (which tools are used, not what data is passed)
|
|
161
|
+
- Session duration
|
|
162
|
+
- Aggregate ontology statistics (total node/edge counts, not names or content)
|
|
163
|
+
- Runtime environment (Node.js version, OS, platform)
|
|
182
164
|
|
|
183
|
-
|
|
165
|
+
**What is never collected:**
|
|
166
|
+
- Ontology names, descriptions, or content
|
|
167
|
+
- Node or edge properties
|
|
168
|
+
- File paths or user identifiers
|
|
169
|
+
- Tool arguments or query strings
|
|
184
170
|
|
|
185
|
-
|
|
186
|
-
import { Backpack, StorageBackend } from "backpack-ontology";
|
|
171
|
+
**To opt out**, use any of the following:
|
|
187
172
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
173
|
+
```bash
|
|
174
|
+
# Environment variable (standard)
|
|
175
|
+
export DO_NOT_TRACK=1
|
|
192
176
|
|
|
193
|
-
|
|
177
|
+
# Backpack-specific environment variable
|
|
178
|
+
export BACKPACK_TELEMETRY_DISABLED=1
|
|
194
179
|
```
|
|
195
180
|
|
|
196
|
-
|
|
181
|
+
Or add to `~/.config/backpack/config.json`:
|
|
197
182
|
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
npm run build # Compile TypeScript
|
|
203
|
-
npm test # Run all tests (40 tests)
|
|
204
|
-
npm run dev # Run MCP server in dev mode (via tsx)
|
|
183
|
+
```json
|
|
184
|
+
{
|
|
185
|
+
"telemetry": false
|
|
186
|
+
}
|
|
205
187
|
```
|
|
206
188
|
|
|
207
|
-
|
|
189
|
+
## Visualization
|
|
208
190
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
│ ├── backpack.ts # Public API composing Graph + Storage
|
|
215
|
-
│ ├── paths.ts # XDG directory resolution
|
|
216
|
-
│ ├── config.ts # Config loading
|
|
217
|
-
│ └── ids.ts # Prefixed nanoid generation
|
|
218
|
-
├── storage/
|
|
219
|
-
│ └── json-file-backend.ts # Default storage: JSON files on disk
|
|
220
|
-
├── mcp/
|
|
221
|
-
│ ├── server.ts # MCP server factory
|
|
222
|
-
│ └── tools/ # Tool registrations (ontology, node, edge, bulk)
|
|
223
|
-
├── index.ts # Library exports
|
|
224
|
-
└── bin/
|
|
225
|
-
└── backpack.ts # CLI entry point
|
|
226
|
-
```
|
|
191
|
+
Use [backpack-viewer](https://www.npmjs.com/package/backpack-viewer) to visualize ontologies in a web-based graph explorer with force-directed layout and live reload.
|
|
192
|
+
|
|
193
|
+
## Support
|
|
194
|
+
|
|
195
|
+
For questions, feedback, or sponsorship inquiries: **support@backpackontology.com**
|
|
227
196
|
|
|
228
197
|
## License
|
|
229
198
|
|
|
230
|
-
[Apache 2.0](./LICENSE)
|
|
199
|
+
Licensed under the [Apache License, Version 2.0](./LICENSE).
|
|
231
200
|
|
|
232
201
|
## Contributing
|
|
233
202
|
|
|
234
|
-
Issues and
|
|
203
|
+
Issues and pull requests are welcome on [GitHub](https://github.com/noahirzinger/backpack-ontology).
|
package/dist/bin/backpack.js
CHANGED
|
@@ -3,6 +3,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
3
3
|
import { createMcpServer } from "../mcp/server.js";
|
|
4
4
|
import { JsonFileBackend } from "../storage/json-file-backend.js";
|
|
5
5
|
import { loadConfig } from "../core/config.js";
|
|
6
|
+
import { shutdown as shutdownTelemetry } from "../core/telemetry.js";
|
|
6
7
|
async function main() {
|
|
7
8
|
const config = await loadConfig();
|
|
8
9
|
// Config dataDir overrides the default XDG path
|
|
@@ -13,6 +14,13 @@ async function main() {
|
|
|
13
14
|
// Log to stderr because stdout is reserved for the MCP protocol
|
|
14
15
|
console.error("Backpack MCP server running on stdio");
|
|
15
16
|
}
|
|
17
|
+
// Graceful shutdown — flush telemetry before exit
|
|
18
|
+
async function gracefulShutdown() {
|
|
19
|
+
await shutdownTelemetry();
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
process.on("SIGINT", gracefulShutdown);
|
|
23
|
+
process.on("SIGTERM", gracefulShutdown);
|
|
16
24
|
main().catch((error) => {
|
|
17
25
|
console.error("Fatal error:", error);
|
|
18
26
|
process.exit(1);
|
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,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
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,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAErE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,gDAAgD;IAChD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":""}
|
package/dist/bin/init.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
/** Check if a hook rule array already contains a backpack-originated rule. */
|
|
6
|
+
function hasBackpackRule(rules) {
|
|
7
|
+
return rules.some((r) => r.hooks?.some((h) => (h.prompt && h.prompt.includes("Backpack")) ||
|
|
8
|
+
(h.command && h.command.includes("backpack"))) ?? false);
|
|
9
|
+
}
|
|
10
|
+
async function main() {
|
|
11
|
+
const projectDir = process.cwd();
|
|
12
|
+
const claudeDir = path.join(projectDir, ".claude");
|
|
13
|
+
const settingsPath = path.join(claudeDir, "settings.json");
|
|
14
|
+
// Load the hooks configuration shipped with backpack-ontology
|
|
15
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
16
|
+
const packageRoot = path.resolve(path.dirname(thisFile), "..", "..");
|
|
17
|
+
const hooksJsonPath = path.join(packageRoot, "hooks", "hooks.json");
|
|
18
|
+
let hooksConfig;
|
|
19
|
+
try {
|
|
20
|
+
const raw = await fs.readFile(hooksJsonPath, "utf-8");
|
|
21
|
+
hooksConfig = JSON.parse(raw);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
console.error("Error: could not read hooks configuration from backpack-ontology package.");
|
|
25
|
+
console.error(`Expected at: ${hooksJsonPath}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Ensure .claude directory exists
|
|
29
|
+
await fs.mkdir(claudeDir, { recursive: true });
|
|
30
|
+
// Read existing settings or start fresh
|
|
31
|
+
let settings = {};
|
|
32
|
+
try {
|
|
33
|
+
const raw = await fs.readFile(settingsPath, "utf-8");
|
|
34
|
+
settings = JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// File doesn't exist or isn't valid JSON — start fresh
|
|
38
|
+
}
|
|
39
|
+
// Merge hooks — backpack hooks are added alongside any existing hooks
|
|
40
|
+
if (!settings.hooks) {
|
|
41
|
+
settings.hooks = {};
|
|
42
|
+
}
|
|
43
|
+
const existingHooks = settings.hooks;
|
|
44
|
+
const newHooks = (hooksConfig.hooks ?? {});
|
|
45
|
+
let alreadyConfigured = false;
|
|
46
|
+
for (const [event, rules] of Object.entries(newHooks)) {
|
|
47
|
+
if (!existingHooks[event]) {
|
|
48
|
+
existingHooks[event] = rules;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const existing = existingHooks[event];
|
|
52
|
+
if (Array.isArray(existing) && hasBackpackRule(existing)) {
|
|
53
|
+
// Backpack hooks already present for this event — skip to avoid duplicates
|
|
54
|
+
alreadyConfigured = true;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Append backpack hook rules to existing event rules
|
|
58
|
+
if (Array.isArray(existing) && Array.isArray(rules)) {
|
|
59
|
+
existingHooks[event] = [...existing, ...rules];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
existingHooks[event] = rules;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (alreadyConfigured) {
|
|
67
|
+
console.log("");
|
|
68
|
+
console.log(" Backpack hooks are already configured in: " + settingsPath);
|
|
69
|
+
console.log(" No changes made. To reconfigure, remove the existing backpack hooks first.");
|
|
70
|
+
console.log("");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
settings.hooks = existingHooks;
|
|
74
|
+
// Write settings
|
|
75
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
76
|
+
console.log("");
|
|
77
|
+
console.log(" Backpack hooks configured successfully!");
|
|
78
|
+
console.log("");
|
|
79
|
+
console.log(" Enabled in: " + settingsPath);
|
|
80
|
+
console.log("");
|
|
81
|
+
console.log(" What's enabled:");
|
|
82
|
+
console.log(" - Auto-capture: a background agent reviews your Claude conversations");
|
|
83
|
+
console.log(" and automatically builds knowledge graphs from meaningful discussions.");
|
|
84
|
+
console.log(" - Viewer suggestions: after ontology updates, you'll be reminded to");
|
|
85
|
+
console.log(" visualize your knowledge graph with `npx backpack-viewer`.");
|
|
86
|
+
console.log("");
|
|
87
|
+
console.log(" To disable, remove the backpack hooks from .claude/settings.json");
|
|
88
|
+
console.log("");
|
|
89
|
+
}
|
|
90
|
+
main().catch((error) => {
|
|
91
|
+
console.error("Error:", error.message ?? error);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/bin/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous usage telemetry for Backpack.
|
|
3
|
+
*
|
|
4
|
+
* Collects tool call counts, session duration, and aggregate ontology stats.
|
|
5
|
+
* No personal data, ontology content, or tool arguments are ever collected.
|
|
6
|
+
*
|
|
7
|
+
* Opt out:
|
|
8
|
+
* - Set DO_NOT_TRACK=1
|
|
9
|
+
* - Set BACKPACK_TELEMETRY_DISABLED=1
|
|
10
|
+
* - Add {"telemetry": false} to ~/.config/backpack/config.json
|
|
11
|
+
*/
|
|
12
|
+
import type { Backpack } from "./backpack.js";
|
|
13
|
+
/** Initialize telemetry. Call once at server startup. */
|
|
14
|
+
export declare function initTelemetry(backpack?: Backpack): Promise<void>;
|
|
15
|
+
/** Track a tool call. Synchronous — never throws, never blocks. */
|
|
16
|
+
export declare function trackEvent(event: string, properties?: Record<string, unknown>): void;
|
|
17
|
+
/** Flush the event queue to the ingest endpoint. */
|
|
18
|
+
export declare function flush(): Promise<void>;
|
|
19
|
+
/** Gather final stats and flush. Call on server shutdown. */
|
|
20
|
+
export declare function shutdown(): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAgH9C,yDAAyD;AACzD,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BtE;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACvC,IAAI,CAQN;AAED,oDAAoD;AACpD,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB3C;AAED,6DAA6D;AAC7D,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAsC9C"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymous usage telemetry for Backpack.
|
|
3
|
+
*
|
|
4
|
+
* Collects tool call counts, session duration, and aggregate ontology stats.
|
|
5
|
+
* No personal data, ontology content, or tool arguments are ever collected.
|
|
6
|
+
*
|
|
7
|
+
* Opt out:
|
|
8
|
+
* - Set DO_NOT_TRACK=1
|
|
9
|
+
* - Set BACKPACK_TELEMETRY_DISABLED=1
|
|
10
|
+
* - Add {"telemetry": false} to ~/.config/backpack/config.json
|
|
11
|
+
*/
|
|
12
|
+
import * as crypto from "node:crypto";
|
|
13
|
+
import * as fs from "node:fs/promises";
|
|
14
|
+
import * as os from "node:os";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import { configDir } from "./paths.js";
|
|
17
|
+
const ENDPOINT = process.env.BACKPACK_TELEMETRY_URL ?? "https://diagnostics.backpackontology.com/api/telemetry";
|
|
18
|
+
const FLUSH_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
19
|
+
const VERSION = "0.1.3";
|
|
20
|
+
// Module-level state
|
|
21
|
+
const sessionId = crypto.randomUUID();
|
|
22
|
+
const sessionStartTime = Date.now();
|
|
23
|
+
let machineId = null;
|
|
24
|
+
let eventQueue = [];
|
|
25
|
+
let toolCallCount = 0;
|
|
26
|
+
let flushTimer = null;
|
|
27
|
+
let disabled = null;
|
|
28
|
+
let backpackRef = null;
|
|
29
|
+
let initialized = false;
|
|
30
|
+
async function isDisabled() {
|
|
31
|
+
if (disabled !== null)
|
|
32
|
+
return disabled;
|
|
33
|
+
if (process.env.DO_NOT_TRACK === "1") {
|
|
34
|
+
disabled = true;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
if (process.env.BACKPACK_TELEMETRY_DISABLED === "1") {
|
|
38
|
+
disabled = true;
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const configPath = path.join(configDir(), "config.json");
|
|
43
|
+
const raw = await fs.readFile(configPath, "utf-8");
|
|
44
|
+
const config = JSON.parse(raw);
|
|
45
|
+
if (config.telemetry === false) {
|
|
46
|
+
disabled = true;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Config file doesn't exist or is invalid — telemetry stays enabled
|
|
52
|
+
}
|
|
53
|
+
disabled = false;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
async function getMachineId() {
|
|
57
|
+
if (machineId)
|
|
58
|
+
return machineId;
|
|
59
|
+
const idPath = path.join(configDir(), "machine-id");
|
|
60
|
+
let isNew = false;
|
|
61
|
+
try {
|
|
62
|
+
machineId = (await fs.readFile(idPath, "utf-8")).trim();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// File doesn't exist — generate a new ID
|
|
66
|
+
const hash = crypto
|
|
67
|
+
.createHash("sha256")
|
|
68
|
+
.update(os.hostname() + os.platform())
|
|
69
|
+
.digest("hex")
|
|
70
|
+
.slice(0, 16);
|
|
71
|
+
await fs.mkdir(configDir(), { recursive: true });
|
|
72
|
+
await fs.writeFile(idPath, hash, "utf-8");
|
|
73
|
+
machineId = hash;
|
|
74
|
+
isNew = true;
|
|
75
|
+
}
|
|
76
|
+
if (isNew) {
|
|
77
|
+
showFirstRunNotice();
|
|
78
|
+
}
|
|
79
|
+
return machineId;
|
|
80
|
+
}
|
|
81
|
+
function showFirstRunNotice() {
|
|
82
|
+
console.error([
|
|
83
|
+
"",
|
|
84
|
+
"Backpack collects anonymous usage telemetry to improve the product.",
|
|
85
|
+
"Only tool names, session duration, and aggregate stats are collected.",
|
|
86
|
+
"No personal data, ontology content, or tool arguments are sent.",
|
|
87
|
+
"",
|
|
88
|
+
"To opt out:",
|
|
89
|
+
" export BACKPACK_TELEMETRY_DISABLED=1",
|
|
90
|
+
' or add {"telemetry": false} to ~/.config/backpack/config.json',
|
|
91
|
+
"",
|
|
92
|
+
].join("\n"));
|
|
93
|
+
}
|
|
94
|
+
function enqueue(event, properties) {
|
|
95
|
+
if (!machineId)
|
|
96
|
+
return;
|
|
97
|
+
eventQueue.push({
|
|
98
|
+
event,
|
|
99
|
+
machineId,
|
|
100
|
+
sessionId,
|
|
101
|
+
timestamp: new Date().toISOString(),
|
|
102
|
+
properties,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Initialize telemetry. Call once at server startup. */
|
|
106
|
+
export async function initTelemetry(backpack) {
|
|
107
|
+
try {
|
|
108
|
+
if (await isDisabled())
|
|
109
|
+
return;
|
|
110
|
+
backpackRef = backpack ?? null;
|
|
111
|
+
await getMachineId();
|
|
112
|
+
initialized = true;
|
|
113
|
+
enqueue("session_start", {
|
|
114
|
+
nodeVersion: process.version,
|
|
115
|
+
os: os.platform(),
|
|
116
|
+
arch: os.arch(),
|
|
117
|
+
backpackVersion: VERSION,
|
|
118
|
+
});
|
|
119
|
+
// Flush immediately so session_start is sent right away
|
|
120
|
+
flush().catch(() => { });
|
|
121
|
+
flushTimer = setInterval(() => {
|
|
122
|
+
flush().catch(() => { });
|
|
123
|
+
}, FLUSH_INTERVAL_MS);
|
|
124
|
+
flushTimer.unref();
|
|
125
|
+
process.on("beforeExit", () => {
|
|
126
|
+
shutdown().catch(() => { });
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Telemetry init failed — continue silently
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Track a tool call. Synchronous — never throws, never blocks. */
|
|
134
|
+
export function trackEvent(event, properties = {}) {
|
|
135
|
+
try {
|
|
136
|
+
if (disabled || !initialized)
|
|
137
|
+
return;
|
|
138
|
+
if (event === "tool_call")
|
|
139
|
+
toolCallCount++;
|
|
140
|
+
enqueue(event, properties);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Silently ignore
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Flush the event queue to the ingest endpoint. */
|
|
147
|
+
export async function flush() {
|
|
148
|
+
try {
|
|
149
|
+
if (eventQueue.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
const batch = eventQueue;
|
|
152
|
+
eventQueue = [];
|
|
153
|
+
await fetch(ENDPOINT, {
|
|
154
|
+
method: "POST",
|
|
155
|
+
headers: { "Content-Type": "application/json" },
|
|
156
|
+
body: JSON.stringify({ events: batch }),
|
|
157
|
+
signal: AbortSignal.timeout(5000),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Failed to send — drop the batch
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Gather final stats and flush. Call on server shutdown. */
|
|
165
|
+
export async function shutdown() {
|
|
166
|
+
try {
|
|
167
|
+
if (disabled || !initialized)
|
|
168
|
+
return;
|
|
169
|
+
if (flushTimer) {
|
|
170
|
+
clearInterval(flushTimer);
|
|
171
|
+
flushTimer = null;
|
|
172
|
+
}
|
|
173
|
+
// Gather aggregate ontology stats
|
|
174
|
+
if (backpackRef) {
|
|
175
|
+
try {
|
|
176
|
+
const ontologies = await backpackRef.listOntologies();
|
|
177
|
+
let totalNodes = 0;
|
|
178
|
+
let totalEdges = 0;
|
|
179
|
+
for (const o of ontologies) {
|
|
180
|
+
totalNodes += o.nodeCount;
|
|
181
|
+
totalEdges += o.edgeCount;
|
|
182
|
+
}
|
|
183
|
+
enqueue("ontology_stats", {
|
|
184
|
+
ontologyCount: ontologies.length,
|
|
185
|
+
totalNodes,
|
|
186
|
+
totalEdges,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Can't gather stats — skip
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
enqueue("session_end", {
|
|
194
|
+
durationMs: Date.now() - sessionStartTime,
|
|
195
|
+
toolCalls: toolCallCount,
|
|
196
|
+
});
|
|
197
|
+
await flush();
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Silently ignore
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,5 +5,6 @@ export { loadConfig } from "./core/config.js";
|
|
|
5
5
|
export type { BackpackConfig } from "./core/config.js";
|
|
6
6
|
export type { Node, Edge, OntologyData, OntologyMetadata, OntologySummary, NodeSummary, EdgeSummary, NodeTypeInfo, EdgeTypeInfo, ListNodesResult, GetNodeResult, NeighborResult, NeighborEntry, StorageBackend, } from "./core/types.js";
|
|
7
7
|
export { JsonFileBackend } from "./storage/json-file-backend.js";
|
|
8
|
+
export { initTelemetry, trackEvent, shutdown as shutdownTelemetry } from "./core/telemetry.js";
|
|
8
9
|
export { createMcpServer } from "./mcp/server.js";
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export { configDir, dataDir, configFile } from "./core/paths.js";
|
|
|
6
6
|
export { loadConfig } from "./core/config.js";
|
|
7
7
|
// Storage backends
|
|
8
8
|
export { JsonFileBackend } from "./storage/json-file-backend.js";
|
|
9
|
+
// Telemetry
|
|
10
|
+
export { initTelemetry, trackEvent, shutdown as shutdownTelemetry } from "./core/telemetry.js";
|
|
9
11
|
// MCP server factory
|
|
10
12
|
export { createMcpServer } from "./mcp/server.js";
|
|
11
13
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmB9C,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmB9C,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/F,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAQvD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,SAAS,CAAC,CA+BpB"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { Backpack } from "../core/backpack.js";
|
|
3
3
|
import { JsonFileBackend } from "../storage/json-file-backend.js";
|
|
4
|
+
import { initTelemetry } from "../core/telemetry.js";
|
|
4
5
|
import { registerOntologyTools } from "./tools/ontology-tools.js";
|
|
5
6
|
import { registerNodeTools } from "./tools/node-tools.js";
|
|
6
7
|
import { registerEdgeTools } from "./tools/edge-tools.js";
|
|
@@ -15,9 +16,22 @@ export async function createMcpServer(storage) {
|
|
|
15
16
|
const backend = storage ?? new JsonFileBackend();
|
|
16
17
|
const backpack = new Backpack(backend);
|
|
17
18
|
await backpack.initialize();
|
|
19
|
+
// Initialize telemetry (non-blocking, fails silently)
|
|
20
|
+
try {
|
|
21
|
+
await initTelemetry(backpack);
|
|
22
|
+
}
|
|
23
|
+
catch { /* noop */ }
|
|
18
24
|
const server = new McpServer({
|
|
19
25
|
name: "backpack",
|
|
20
|
-
version: "0.
|
|
26
|
+
version: "0.2.0",
|
|
27
|
+
}, {
|
|
28
|
+
instructions: `Backpack is a persistent knowledge graph that remembers what matters across conversations.
|
|
29
|
+
|
|
30
|
+
When you learn something meaningful — a business relationship, a technical decision, a process, a domain concept — consider adding it to backpack. Use backpack_list to see what ontologies exist and backpack_describe to understand their structure before adding to them. Create a new ontology when the topic is distinct from existing ones.
|
|
31
|
+
|
|
32
|
+
After updating an ontology, let the user know they can visualize their knowledge graph by running: npx backpack-viewer (opens http://localhost:5173)
|
|
33
|
+
|
|
34
|
+
Be selective — not every conversation needs to be captured. Focus on knowledge with lasting value: relationships, decisions, architecture, processes, domain concepts, conventions.`,
|
|
21
35
|
});
|
|
22
36
|
// Register all tool groups
|
|
23
37
|
registerOntologyTools(server, backpack);
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,eAAe,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,IAAI,SAAS,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,eAAe,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAE5B,sDAAsD;IACtD,IAAI,CAAC;QAAC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;;;;;;oLAMgK;KAC/K,CACF,CAAC;IAEF,2BAA2B;IAC3B,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"bulk-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAiDN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { trackEvent } from "../../core/telemetry.js";
|
|
2
3
|
export function registerBulkTools(server, backpack) {
|
|
3
4
|
server.registerTool("backpack_import_nodes", {
|
|
4
5
|
title: "Import Nodes",
|
|
@@ -17,6 +18,7 @@ export function registerBulkTools(server, backpack) {
|
|
|
17
18
|
}, async ({ ontology, nodes }) => {
|
|
18
19
|
try {
|
|
19
20
|
const result = await backpack.importNodes(ontology, nodes);
|
|
21
|
+
trackEvent("tool_call", { tool: "backpack_import_nodes" });
|
|
20
22
|
return {
|
|
21
23
|
content: [
|
|
22
24
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"bulk-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/bulk-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,QAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,wFAAwF;QAC1F,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACrD,KAAK,EAAE,CAAC;iBACL,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACtC,UAAU,EAAE,CAAC;qBACV,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC/B,QAAQ,CAAC,8BAA8B,CAAC;aAC5C,CAAC,CACH;iBACA,QAAQ,CAAC,0BAA0B,CAAC;SACxC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CACvC,QAAQ,EACR,KAGE,CACH,CAAC;YACF,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,YAAY,MAAM,CAAC,KAAK,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBAC9E;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE;iBACpE;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/edge-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"edge-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/edge-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAqIN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { trackEvent } from "../../core/telemetry.js";
|
|
2
3
|
export function registerEdgeTools(server, backpack) {
|
|
3
4
|
server.registerTool("backpack_add_edge", {
|
|
4
5
|
title: "Add Edge",
|
|
@@ -18,6 +19,7 @@ export function registerEdgeTools(server, backpack) {
|
|
|
18
19
|
}, async ({ ontology, type, sourceId, targetId, properties }) => {
|
|
19
20
|
try {
|
|
20
21
|
const edge = await backpack.addEdge(ontology, type, sourceId, targetId, properties ?? {});
|
|
22
|
+
trackEvent("tool_call", { tool: "backpack_add_edge" });
|
|
21
23
|
return {
|
|
22
24
|
content: [
|
|
23
25
|
{ type: "text", text: JSON.stringify(edge, null, 2) },
|
|
@@ -44,6 +46,7 @@ export function registerEdgeTools(server, backpack) {
|
|
|
44
46
|
}, async ({ ontology, edgeId }) => {
|
|
45
47
|
try {
|
|
46
48
|
await backpack.removeEdge(ontology, edgeId);
|
|
49
|
+
trackEvent("tool_call", { tool: "backpack_remove_edge" });
|
|
47
50
|
return {
|
|
48
51
|
content: [
|
|
49
52
|
{ type: "text", text: `Removed edge ${edgeId}.` },
|
|
@@ -85,6 +88,7 @@ export function registerEdgeTools(server, backpack) {
|
|
|
85
88
|
}, async ({ ontology, nodeId, edgeType, direction, depth }) => {
|
|
86
89
|
try {
|
|
87
90
|
const result = await backpack.getNeighbors(ontology, nodeId, edgeType, direction, depth);
|
|
91
|
+
trackEvent("tool_call", { tool: "backpack_get_neighbors" });
|
|
88
92
|
return {
|
|
89
93
|
content: [
|
|
90
94
|
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/edge-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"edge-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/edge-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/node-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/node-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CA6QN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { trackEvent } from "../../core/telemetry.js";
|
|
2
3
|
export function registerNodeTools(server, backpack) {
|
|
3
4
|
server.registerTool("backpack_node_types", {
|
|
4
5
|
title: "List Node Types",
|
|
@@ -10,6 +11,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
10
11
|
}, async ({ ontology }) => {
|
|
11
12
|
try {
|
|
12
13
|
const types = await backpack.getNodeTypes(ontology);
|
|
14
|
+
trackEvent("tool_call", { tool: "backpack_node_types" });
|
|
13
15
|
return {
|
|
14
16
|
content: [
|
|
15
17
|
{ type: "text", text: JSON.stringify(types, null, 2) },
|
|
@@ -51,6 +53,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
51
53
|
}, async ({ ontology, type, limit, offset }) => {
|
|
52
54
|
try {
|
|
53
55
|
const result = await backpack.listNodes(ontology, type, limit, offset);
|
|
56
|
+
trackEvent("tool_call", { tool: "backpack_list_nodes" });
|
|
54
57
|
return {
|
|
55
58
|
content: [
|
|
56
59
|
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
@@ -81,6 +84,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
81
84
|
}, async ({ ontology, query, type }) => {
|
|
82
85
|
try {
|
|
83
86
|
const results = await backpack.searchNodes(ontology, query, type);
|
|
87
|
+
trackEvent("tool_call", { tool: "backpack_search" });
|
|
84
88
|
return {
|
|
85
89
|
content: [
|
|
86
90
|
{
|
|
@@ -112,6 +116,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
112
116
|
}, async ({ ontology, nodeId }) => {
|
|
113
117
|
try {
|
|
114
118
|
const result = await backpack.getNode(ontology, nodeId);
|
|
119
|
+
trackEvent("tool_call", { tool: "backpack_get_node" });
|
|
115
120
|
return {
|
|
116
121
|
content: [
|
|
117
122
|
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
@@ -142,6 +147,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
142
147
|
}, async ({ ontology, type, properties }) => {
|
|
143
148
|
try {
|
|
144
149
|
const node = await backpack.addNode(ontology, type, properties);
|
|
150
|
+
trackEvent("tool_call", { tool: "backpack_add_node" });
|
|
145
151
|
return {
|
|
146
152
|
content: [
|
|
147
153
|
{ type: "text", text: JSON.stringify(node, null, 2) },
|
|
@@ -170,6 +176,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
170
176
|
}, async ({ ontology, nodeId, properties }) => {
|
|
171
177
|
try {
|
|
172
178
|
const node = await backpack.updateNode(ontology, nodeId, properties);
|
|
179
|
+
trackEvent("tool_call", { tool: "backpack_update_node" });
|
|
173
180
|
return {
|
|
174
181
|
content: [
|
|
175
182
|
{ type: "text", text: JSON.stringify(node, null, 2) },
|
|
@@ -196,6 +203,7 @@ export function registerNodeTools(server, backpack) {
|
|
|
196
203
|
}, async ({ ontology, nodeId }) => {
|
|
197
204
|
try {
|
|
198
205
|
const result = await backpack.removeNode(ontology, nodeId);
|
|
206
|
+
trackEvent("tool_call", { tool: "backpack_remove_node" });
|
|
199
207
|
return {
|
|
200
208
|
content: [
|
|
201
209
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/node-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"node-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/node-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ontology-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/ontology-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ontology-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/ontology-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGvD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAoIN"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { trackEvent } from "../../core/telemetry.js";
|
|
2
3
|
export function registerOntologyTools(server, backpack) {
|
|
3
4
|
server.registerTool("backpack_list", {
|
|
4
5
|
title: "List Ontologies",
|
|
@@ -6,6 +7,7 @@ export function registerOntologyTools(server, backpack) {
|
|
|
6
7
|
annotations: { readOnlyHint: true },
|
|
7
8
|
}, async () => {
|
|
8
9
|
const ontologies = await backpack.listOntologies();
|
|
10
|
+
trackEvent("tool_call", { tool: "backpack_list" });
|
|
9
11
|
return {
|
|
10
12
|
content: [
|
|
11
13
|
{
|
|
@@ -31,6 +33,7 @@ export function registerOntologyTools(server, backpack) {
|
|
|
31
33
|
}, async ({ name, description }) => {
|
|
32
34
|
try {
|
|
33
35
|
const metadata = await backpack.createOntology(name, description);
|
|
36
|
+
trackEvent("tool_call", { tool: "backpack_create" });
|
|
34
37
|
return {
|
|
35
38
|
content: [
|
|
36
39
|
{
|
|
@@ -59,6 +62,7 @@ export function registerOntologyTools(server, backpack) {
|
|
|
59
62
|
}, async ({ ontology }) => {
|
|
60
63
|
try {
|
|
61
64
|
await backpack.deleteOntology(ontology);
|
|
65
|
+
trackEvent("tool_call", { tool: "backpack_delete" });
|
|
62
66
|
return {
|
|
63
67
|
content: [
|
|
64
68
|
{
|
|
@@ -87,6 +91,7 @@ export function registerOntologyTools(server, backpack) {
|
|
|
87
91
|
}, async ({ ontology }) => {
|
|
88
92
|
try {
|
|
89
93
|
const info = await backpack.describeOntology(ontology);
|
|
94
|
+
trackEvent("tool_call", { tool: "backpack_describe" });
|
|
90
95
|
return {
|
|
91
96
|
content: [
|
|
92
97
|
{ type: "text", text: JSON.stringify(info, null, 2) },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ontology-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/ontology-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ontology-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/ontology-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,QAAkB;IAElB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KACpC,EACD,KAAK,IAAI,EAAE;QACT,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QACnD,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,UAAU,CAAC,MAAM,KAAK,CAAC;wBACrB,CAAC,CAAC,oEAAoE;wBACtE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,kFAAkF;QACpF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CACP,2FAA2F,CAC5F;YACH,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,CACP,yDAAyD,CAC1D;SACJ;KACF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAClE,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACrD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,qBAAqB,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;qBAC1E;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE;iBACpE;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,yEAAyE;QAC3E,WAAW,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;QACtC,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;SAChE;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACxC,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACrD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,qBAAqB,QAAQ,qBAAqB;qBACzD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE;iBACpE;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,kLAAkL;QACpL,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QACnC,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAClE;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACvD,UAAU,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACvD,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;iBAC/D;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE;iBACpE;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
You are a knowledge-capture agent for Backpack, a knowledge graph system. Your job is to review the conversation that just happened and decide whether meaningful knowledge should be preserved in an ontology.
|
|
2
|
+
|
|
3
|
+
## Instructions
|
|
4
|
+
|
|
5
|
+
1. **Review the conversation transcript** — understand what was discussed, decided, or worked on.
|
|
6
|
+
|
|
7
|
+
2. **Decide if anything is worth capturing.** Look for:
|
|
8
|
+
- **Business knowledge**: client details, vendor info, pricing, partnerships, workflows
|
|
9
|
+
- **Technical knowledge**: architecture, APIs, data flows, integrations, design decisions
|
|
10
|
+
- **Domain knowledge**: industry concepts, terminology, regulations, best practices
|
|
11
|
+
- **Operational knowledge**: decisions made, problems solved, processes established, conventions agreed upon
|
|
12
|
+
- **Relationships**: how people, systems, concepts, or processes connect to each other
|
|
13
|
+
|
|
14
|
+
3. **Skip trivial interactions.** Do NOT capture:
|
|
15
|
+
- Simple Q&A with no lasting value
|
|
16
|
+
- Debugging sessions that led nowhere
|
|
17
|
+
- Casual conversation or greetings
|
|
18
|
+
- Knowledge that was already captured in a previous pass
|
|
19
|
+
- Temporary state or in-progress work that will change
|
|
20
|
+
|
|
21
|
+
4. **If there IS something worth capturing:**
|
|
22
|
+
a. Call `backpack_list` to see existing ontologies
|
|
23
|
+
b. Call `backpack_describe` on relevant ontologies to check what's already there
|
|
24
|
+
c. Decide: update an existing ontology (if the topic fits) or create a new one (if the topic is distinct)
|
|
25
|
+
d. Use `backpack_import_nodes` for efficient bulk node creation
|
|
26
|
+
e. Use `backpack_add_edge` to create relationships between nodes
|
|
27
|
+
f. Use clear, descriptive node types and edge types that make the graph readable
|
|
28
|
+
|
|
29
|
+
5. **If there is NOTHING worth capturing**, simply stop. Do not force it.
|
|
30
|
+
|
|
31
|
+
6. **After making updates**, briefly tell the user what was added to their knowledge graph and suggest they can visualize it:
|
|
32
|
+
> "Your backpack knowledge graph was updated with [brief summary]. View it by running `npx backpack-viewer` and opening http://localhost:5173"
|
|
33
|
+
|
|
34
|
+
## Guidelines for good ontology entries
|
|
35
|
+
|
|
36
|
+
- **Node types** should be clear nouns: `Person`, `Company`, `API`, `Decision`, `Process`, `Concept`, `Tool`, `Service`, `Regulation`, etc.
|
|
37
|
+
- **Edge types** should be clear relationships: `WORKS_WITH`, `DEPENDS_ON`, `DECIDED_TO`, `MANAGES`, `IMPLEMENTS`, `RELATES_TO`, etc.
|
|
38
|
+
- **Properties** should include enough context to be useful later: names, descriptions, dates, reasons, status.
|
|
39
|
+
- **Be selective but thorough** — capture the important things well rather than everything poorly.
|
|
40
|
+
- **Prefer updating existing nodes** over creating duplicates. Check if a concept already exists before adding it.
|
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hooks": {
|
|
3
|
+
"Stop": [
|
|
4
|
+
{
|
|
5
|
+
"matcher": "",
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "agent",
|
|
9
|
+
"prompt": "You are a knowledge-capture agent for Backpack, a knowledge graph system. Review the conversation that just happened and decide whether meaningful knowledge should be preserved in an ontology.\n\n## What to capture\n- Business knowledge: client details, vendor info, pricing, partnerships, workflows\n- Technical knowledge: architecture, APIs, data flows, integrations, design decisions\n- Domain knowledge: industry concepts, terminology, regulations, best practices\n- Operational knowledge: decisions made, problems solved, processes established, conventions\n- Relationships: how people, systems, concepts, or processes connect\n\n## What to skip\n- Simple Q&A with no lasting value\n- Debugging that led nowhere\n- Casual conversation or greetings\n- Knowledge already captured in a previous pass\n- Temporary or in-progress state\n\n## If there IS something worth capturing\n1. Call `backpack_list` to see existing ontologies\n2. Call `backpack_describe` on relevant ones to check existing content\n3. Decide: update an existing ontology (if topic fits) or create a new one (if distinct)\n4. Use `backpack_import_nodes` for bulk node creation\n5. Use `backpack_add_edge` to create relationships\n6. Use clear node types (Person, Company, API, Decision, Process, Concept, Tool, Service) and edge types (WORKS_WITH, DEPENDS_ON, DECIDED_TO, MANAGES, IMPLEMENTS, RELATES_TO)\n\n## If NOTHING is worth capturing, just stop.\n\n## After updates, tell the user:\n\"Your backpack knowledge graph was updated with [brief summary]. View it by running `npx backpack-viewer` (http://localhost:5173)\"",
|
|
10
|
+
"timeout": 120,
|
|
11
|
+
"async": true
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"PostToolUse": [
|
|
17
|
+
{
|
|
18
|
+
"matcher": "backpack_create|backpack_add_node|backpack_update_node|backpack_import_nodes|backpack_add_edge",
|
|
19
|
+
"hooks": [
|
|
20
|
+
{
|
|
21
|
+
"type": "command",
|
|
22
|
+
"command": "echo 'The user'\"'\"'s backpack ontology was just updated. Let the user know they can visualize their knowledge graph by running: npx backpack-viewer (opens http://localhost:5173)'",
|
|
23
|
+
"timeout": 5
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# PostToolUse hook: suggest the viewer after backpack write operations.
|
|
3
|
+
# Output is injected into Claude's context as additional information.
|
|
4
|
+
echo 'The user'\''s backpack ontology was just updated. Let the user know they can visualize their knowledge graph by running: npx backpack-viewer (opens http://localhost:5173)'
|
package/package.json
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "backpack-ontology",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A persistent ontology engine for Claude Code via MCP — progressive discovery of structured knowledge graphs",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Noah Irzinger",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"backpack": "./dist/bin/backpack.js"
|
|
9
|
+
"backpack": "./dist/bin/backpack.js",
|
|
10
|
+
"backpack-init": "./dist/bin/init.js"
|
|
10
11
|
},
|
|
11
12
|
"main": "./dist/index.js",
|
|
12
13
|
"types": "./dist/index.d.ts",
|
|
13
14
|
"files": [
|
|
14
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"hooks"
|
|
15
17
|
],
|
|
16
18
|
"scripts": {
|
|
17
19
|
"build": "tsc",
|
|
18
20
|
"dev": "tsx src/bin/backpack.ts",
|
|
19
21
|
"test": "vitest run",
|
|
20
22
|
"test:watch": "vitest",
|
|
21
|
-
"prepublishOnly": "npm run build"
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
|
+
"release:patch": "npm version patch && git push && git push --tags",
|
|
25
|
+
"release:minor": "npm version minor && git push && git push --tags",
|
|
26
|
+
"release:major": "npm version major && git push && git push --tags"
|
|
22
27
|
},
|
|
23
28
|
"dependencies": {
|
|
24
29
|
"@modelcontextprotocol/sdk": "^1.27.0",
|