@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 +21 -0
- package/README.md +136 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +234 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -0
- package/package.json +53 -0
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
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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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
|
+
}
|