@heyditto/cli 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ditto AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,136 @@
1
+ # Ditto CLI
2
+
3
+ `@heyditto/cli` — save, search, fetch, and traverse the [Ditto](https://heyditto.ai) memory graph from the shell.
4
+
5
+ ```bash
6
+ npm install -g @heyditto/cli
7
+ export DITTO_API_KEY=ditto_mcp_… # https://app.heyditto.ai/mcp/newkey
8
+
9
+ ditto save "I prefer TypeScript over JS for new projects"
10
+ ditto search "language preferences"
11
+ ditto subjects "memory architecture" --top-k 5
12
+ ```
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install -g @heyditto/cli
18
+ # or one-shot via npx
19
+ npx -y @heyditto/cli search "what did I say about X"
20
+ ```
21
+
22
+ ## Auth
23
+
24
+ Set `DITTO_API_KEY` in your environment. Get a key at **https://app.heyditto.ai/mcp/newkey**.
25
+
26
+ ```bash
27
+ export DITTO_API_KEY=ditto_mcp_…
28
+ # add to ~/.zshrc / ~/.bashrc to persist
29
+ ```
30
+
31
+ ## Commands
32
+
33
+ ```
34
+ ditto save <content> [--source <s>] [--source-context <c>]
35
+ ditto search <query>...
36
+ ditto fetch <pair-id>...
37
+ ditto subjects <query> [--top-k <n>]
38
+ ditto memories <subject-id>...
39
+ ditto network <pair-id> [--limit <n>]
40
+ ditto status
41
+ ditto config
42
+ ditto help
43
+ ```
44
+
45
+ ### `save`
46
+
47
+ Persist a memory pair from an external source.
48
+
49
+ ```bash
50
+ ditto save "Project X uses Bun + SolidJS, deployed to Cloud Run"
51
+ ditto save "$(cat note.md)" --source document --source-context note.md
52
+ ```
53
+
54
+ ### `search`
55
+
56
+ Semantic search across memories. Multiple positional args become an array of queries.
57
+
58
+ ```bash
59
+ ditto search "typescript preferences"
60
+ ditto search "typescript" "language choices"
61
+ ```
62
+
63
+ ### `fetch`
64
+
65
+ Fetch the full conversation text for memory pair ids (output of `search`).
66
+
67
+ ```bash
68
+ ditto fetch 3a1084ae-235a-433d-9493-2335a0dfeb57
69
+ ```
70
+
71
+ ### `subjects`
72
+
73
+ Search the subject (topic) graph. Returns subject ids you can pass to `memories` or `network`.
74
+
75
+ ```bash
76
+ ditto subjects "memory architecture"
77
+ ditto subjects "performance" --top-k 5
78
+ ```
79
+
80
+ ### `memories`
81
+
82
+ Fetch memory previews scoped to specific subjects.
83
+
84
+ ```bash
85
+ ditto memories <subject-id>
86
+ ```
87
+
88
+ ### `network`
89
+
90
+ Traverse a memory's network (related memories via shared subjects).
91
+
92
+ ```bash
93
+ ditto network <pair-id> --limit 30
94
+ ```
95
+
96
+ ### `status`
97
+
98
+ Print whether `DITTO_API_KEY` is set and the configured MCP endpoint resolves.
99
+
100
+ ### `config`
101
+
102
+ Print a Claude Desktop / Cursor / generic-MCP-client config snippet for the Ditto memory server.
103
+
104
+ ## Environment
105
+
106
+ - `DITTO_API_KEY` (required) — MCP API key. https://app.heyditto.ai/mcp/newkey
107
+ - `DITTO_API_BASE` (optional) — API base URL. Defaults to `https://api.heyditto.ai`. Useful for local dev (`http://localhost:3400`).
108
+
109
+ ## Output
110
+
111
+ Defaults to JSON. Pipe through `jq` for filtering:
112
+
113
+ ```bash
114
+ ditto search "X" | jq '.results[] | {id, similarity, preview: .userPreview}'
115
+ ```
116
+
117
+ ## Related
118
+
119
+ - **[`@heyditto/mcp`](https://github.com/ditto-assistant/ditto-mcp)** — local stdio MCP bridge with OAuth (different surface; pair with Claude Desktop / Cursor).
120
+ - **[ditto-clawhub](https://github.com/ditto-assistant/ditto-clawhub)** — the ClawHub / OpenClaw skill that ships alongside this CLI.
121
+ - **Web app:** https://app.heyditto.ai
122
+
123
+ ## Development
124
+
125
+ ```bash
126
+ just install
127
+ just check # tsc --noEmit
128
+ just build # tsc to dist/
129
+ just verify # check + build + pack --dry-run
130
+ ```
131
+
132
+ Releases are automated via [semantic-release](https://github.com/semantic-release/semantic-release) on push to `main`. npm provenance is enabled — every published version is signed by the GitHub Actions OIDC identity. Trusted publishing is configured at the npm registry.
133
+
134
+ ## License
135
+
136
+ MIT — see [LICENSE](LICENSE).
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,234 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
5
+ import { apiBaseURL, apiKey, mcpServerURL, newKeyURL, packageName, packageVersion, } from "./config.js";
6
+ function usage() {
7
+ return `${packageName} ${packageVersion}
8
+
9
+ Usage:
10
+ ditto save <content> [--source <s>] [--source-context <c>]
11
+ ditto search <query>...
12
+ ditto fetch <pair-id>...
13
+ ditto subjects <query> [--top-k <n>]
14
+ ditto memories <subject-id>...
15
+ ditto network <pair-id> [--limit <n>]
16
+ ditto status
17
+ ditto config
18
+ ditto help
19
+
20
+ Environment:
21
+ DITTO_API_KEY Required. Get one at ${newKeyURL()}.
22
+ DITTO_API_BASE Optional. Defaults to https://api.heyditto.ai.
23
+ `;
24
+ }
25
+ async function getClient() {
26
+ const key = apiKey();
27
+ if (!key) {
28
+ process.stderr.write(`error: DITTO_API_KEY is not set.\nGet a key at ${newKeyURL()}, then export DITTO_API_KEY=ditto_mcp_…\n`);
29
+ process.exit(1);
30
+ }
31
+ const client = new Client({ name: packageName, version: packageVersion });
32
+ const transport = new StreamableHTTPClientTransport(new URL(mcpServerURL()), {
33
+ requestInit: {
34
+ headers: { Authorization: `Bearer ${key}` },
35
+ },
36
+ });
37
+ await client.connect(transport);
38
+ return client;
39
+ }
40
+ async function callAndPrint(name, args) {
41
+ const client = await getClient();
42
+ try {
43
+ const result = await client.callTool({ name, arguments: args });
44
+ const block = Array.isArray(result.content) ? result.content[0] : undefined;
45
+ if (block && typeof block === "object" && "type" in block && block.type === "text" && "text" in block) {
46
+ process.stdout.write(`${block.text}\n`);
47
+ }
48
+ else {
49
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
50
+ }
51
+ }
52
+ finally {
53
+ await client.close();
54
+ }
55
+ }
56
+ function requirePositionals(positionals, minimum, label) {
57
+ if (positionals.length < minimum) {
58
+ throw new Error(`${label}: expected at least ${minimum} argument(s), got ${positionals.length}`);
59
+ }
60
+ }
61
+ async function cmdSave(rest) {
62
+ const { values, positionals } = parseArgs({
63
+ args: rest,
64
+ options: {
65
+ source: { type: "string", default: "cli" },
66
+ "source-context": { type: "string" },
67
+ },
68
+ allowPositionals: true,
69
+ });
70
+ requirePositionals(positionals, 1, "save");
71
+ await callAndPrint("save_memory", {
72
+ content: positionals.join(" "),
73
+ source: values.source,
74
+ sourceContext: values["source-context"],
75
+ });
76
+ }
77
+ async function cmdSearch(rest) {
78
+ const { positionals } = parseArgs({
79
+ args: rest,
80
+ options: {},
81
+ allowPositionals: true,
82
+ });
83
+ requirePositionals(positionals, 1, "search");
84
+ await callAndPrint("search_memories", { queries: positionals });
85
+ }
86
+ async function cmdFetch(rest) {
87
+ const { positionals } = parseArgs({
88
+ args: rest,
89
+ options: {},
90
+ allowPositionals: true,
91
+ });
92
+ requirePositionals(positionals, 1, "fetch");
93
+ await callAndPrint("fetch_memories", { pairIds: positionals });
94
+ }
95
+ async function cmdSubjects(rest) {
96
+ const { values, positionals } = parseArgs({
97
+ args: rest,
98
+ options: {
99
+ "top-k": { type: "string" },
100
+ },
101
+ allowPositionals: true,
102
+ });
103
+ requirePositionals(positionals, 1, "subjects");
104
+ const args = { query: positionals.join(" ") };
105
+ if (values["top-k"]) {
106
+ const n = Number.parseInt(values["top-k"], 10);
107
+ if (!Number.isFinite(n))
108
+ throw new Error("--top-k must be an integer");
109
+ args.topK = n;
110
+ }
111
+ await callAndPrint("search_subjects", args);
112
+ }
113
+ async function cmdMemories(rest) {
114
+ const { positionals } = parseArgs({
115
+ args: rest,
116
+ options: {},
117
+ allowPositionals: true,
118
+ });
119
+ requirePositionals(positionals, 1, "memories");
120
+ await callAndPrint("search_memories_in_subjects", { subjectIds: positionals });
121
+ }
122
+ async function cmdNetwork(rest) {
123
+ const { values, positionals } = parseArgs({
124
+ args: rest,
125
+ options: {
126
+ limit: { type: "string" },
127
+ },
128
+ allowPositionals: true,
129
+ });
130
+ requirePositionals(positionals, 1, "network");
131
+ const args = { pairId: positionals[0] };
132
+ if (values.limit) {
133
+ const n = Number.parseInt(values.limit, 10);
134
+ if (!Number.isFinite(n))
135
+ throw new Error("--limit must be an integer");
136
+ args.limit = n;
137
+ }
138
+ await callAndPrint("get_memory_network", args);
139
+ }
140
+ async function cmdStatus() {
141
+ const key = apiKey();
142
+ const lines = [
143
+ `${packageName} ${packageVersion}`,
144
+ `endpoint: ${mcpServerURL()}`,
145
+ `api key: ${key ? "set" : "MISSING (export DITTO_API_KEY)"}`,
146
+ ];
147
+ if (!key) {
148
+ lines.push(`new key: ${newKeyURL()}`);
149
+ process.stdout.write(`${lines.join("\n")}\n`);
150
+ process.exitCode = 1;
151
+ return;
152
+ }
153
+ try {
154
+ const client = await getClient();
155
+ try {
156
+ const tools = await client.listTools();
157
+ lines.push(`tools: ${tools.tools.map((t) => t.name).join(", ")}`);
158
+ }
159
+ finally {
160
+ await client.close();
161
+ }
162
+ }
163
+ catch (err) {
164
+ lines.push(`connect: FAILED — ${err instanceof Error ? err.message : String(err)}`);
165
+ process.exitCode = 1;
166
+ }
167
+ process.stdout.write(`${lines.join("\n")}\n`);
168
+ }
169
+ function cmdConfig() {
170
+ const config = {
171
+ mcpServers: {
172
+ ditto: {
173
+ url: mcpServerURL(),
174
+ headers: {
175
+ Authorization: "Bearer ${DITTO_API_KEY}",
176
+ },
177
+ },
178
+ },
179
+ notes: {
180
+ apiBase: apiBaseURL(),
181
+ newKey: newKeyURL(),
182
+ },
183
+ };
184
+ process.stdout.write(`${JSON.stringify(config, null, 2)}\n`);
185
+ }
186
+ async function main() {
187
+ const argv = process.argv.slice(2);
188
+ const command = argv[0];
189
+ const rest = argv.slice(1);
190
+ switch (command) {
191
+ case "save":
192
+ await cmdSave(rest);
193
+ return;
194
+ case "search":
195
+ await cmdSearch(rest);
196
+ return;
197
+ case "fetch":
198
+ await cmdFetch(rest);
199
+ return;
200
+ case "subjects":
201
+ await cmdSubjects(rest);
202
+ return;
203
+ case "memories":
204
+ await cmdMemories(rest);
205
+ return;
206
+ case "network":
207
+ await cmdNetwork(rest);
208
+ return;
209
+ case "status":
210
+ await cmdStatus();
211
+ return;
212
+ case "config":
213
+ cmdConfig();
214
+ return;
215
+ case undefined:
216
+ case "help":
217
+ case "--help":
218
+ case "-h":
219
+ process.stdout.write(usage());
220
+ return;
221
+ case "--version":
222
+ case "-v":
223
+ process.stdout.write(`${packageVersion}\n`);
224
+ return;
225
+ default:
226
+ process.stderr.write(`Unknown command: ${command}\n\n${usage()}`);
227
+ process.exitCode = 2;
228
+ }
229
+ }
230
+ main().catch((error) => {
231
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
232
+ process.exitCode = 1;
233
+ });
234
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const packageName = "@heyditto/cli";
2
+ export declare const packageVersion = "0.1.0";
3
+ export declare function apiBaseURL(): string;
4
+ export declare function mcpServerURL(): string;
5
+ export declare function apiKey(): string | undefined;
6
+ export declare function newKeyURL(): string;
package/dist/config.js ADDED
@@ -0,0 +1,15 @@
1
+ export const packageName = "@heyditto/cli";
2
+ export const packageVersion = "0.1.0";
3
+ export function apiBaseURL() {
4
+ return (process.env.DITTO_API_BASE || "https://api.heyditto.ai").replace(/\/+$/, "");
5
+ }
6
+ export function mcpServerURL() {
7
+ return `${apiBaseURL()}/mcp`;
8
+ }
9
+ export function apiKey() {
10
+ return process.env.DITTO_API_KEY;
11
+ }
12
+ export function newKeyURL() {
13
+ return "https://app.heyditto.ai/mcp/newkey";
14
+ }
15
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,yBAAyB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,GAAG,UAAU,EAAE,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,oCAAoC,CAAC;AAC9C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@heyditto/cli",
3
+ "version": "0.1.0",
4
+ "description": "Ditto Memory CLI — save, search, fetch, and traverse the Ditto memory graph from the shell.",
5
+ "type": "module",
6
+ "bin": {
7
+ "ditto": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.json",
19
+ "check": "tsc -p tsconfig.json --noEmit",
20
+ "prepack": "npm run build",
21
+ "release": "semantic-release"
22
+ },
23
+ "keywords": [
24
+ "ditto",
25
+ "heyditto",
26
+ "memory",
27
+ "cli",
28
+ "mcp",
29
+ "model-context-protocol"
30
+ ],
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/ditto-assistant/ditto-cli.git"
35
+ },
36
+ "homepage": "https://github.com/ditto-assistant/ditto-cli",
37
+ "bugs": "https://github.com/ditto-assistant/ditto-app/issues/1212",
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.29.0"
40
+ },
41
+ "devDependencies": {
42
+ "@semantic-release/commit-analyzer": "^13.0.1",
43
+ "@semantic-release/github": "^11.0.6",
44
+ "@semantic-release/npm": "^13.1.5",
45
+ "@semantic-release/release-notes-generator": "^14.1.0",
46
+ "@types/node": "^22.15.3",
47
+ "semantic-release": "^25.0.3",
48
+ "typescript": "^5.8.3"
49
+ },
50
+ "engines": {
51
+ "node": ">=20"
52
+ }
53
+ }