@kavienw/deepseek-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.
Files changed (64) hide show
  1. package/README.md +470 -0
  2. package/dist/agent.js +864 -0
  3. package/dist/agent.js.map +1 -0
  4. package/dist/attachments.js +54 -0
  5. package/dist/attachments.js.map +1 -0
  6. package/dist/btw.js +52 -0
  7. package/dist/btw.js.map +1 -0
  8. package/dist/client.js +88 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands.js +922 -0
  11. package/dist/commands.js.map +1 -0
  12. package/dist/config.js +98 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/hooks.js +90 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.js +149 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/mcp.js +408 -0
  19. package/dist/mcp.js.map +1 -0
  20. package/dist/permissions.js +30 -0
  21. package/dist/permissions.js.map +1 -0
  22. package/dist/plugins.js +341 -0
  23. package/dist/plugins.js.map +1 -0
  24. package/dist/project.js +114 -0
  25. package/dist/project.js.map +1 -0
  26. package/dist/session.js +57 -0
  27. package/dist/session.js.map +1 -0
  28. package/dist/skills.js +147 -0
  29. package/dist/skills.js.map +1 -0
  30. package/dist/todo.js +67 -0
  31. package/dist/todo.js.map +1 -0
  32. package/dist/tools/bash.js +61 -0
  33. package/dist/tools/bash.js.map +1 -0
  34. package/dist/tools/diff.js +26 -0
  35. package/dist/tools/diff.js.map +1 -0
  36. package/dist/tools/edit.js +73 -0
  37. package/dist/tools/edit.js.map +1 -0
  38. package/dist/tools/glob.js +47 -0
  39. package/dist/tools/glob.js.map +1 -0
  40. package/dist/tools/grep.js +133 -0
  41. package/dist/tools/grep.js.map +1 -0
  42. package/dist/tools/index.js +60 -0
  43. package/dist/tools/index.js.map +1 -0
  44. package/dist/tools/read.js +62 -0
  45. package/dist/tools/read.js.map +1 -0
  46. package/dist/tools/setThinking.js +46 -0
  47. package/dist/tools/setThinking.js.map +1 -0
  48. package/dist/tools/task.js +40 -0
  49. package/dist/tools/task.js.map +1 -0
  50. package/dist/tools/todo.js +73 -0
  51. package/dist/tools/todo.js.map +1 -0
  52. package/dist/tools/types.js +2 -0
  53. package/dist/tools/types.js.map +1 -0
  54. package/dist/tools/webFetch.js +64 -0
  55. package/dist/tools/webFetch.js.map +1 -0
  56. package/dist/tools/webSearch.js +200 -0
  57. package/dist/tools/webSearch.js.map +1 -0
  58. package/dist/tools/write.js +46 -0
  59. package/dist/tools/write.js.map +1 -0
  60. package/dist/ui/render.js +248 -0
  61. package/dist/ui/render.js.map +1 -0
  62. package/dist/ui/repl.js +429 -0
  63. package/dist/ui/repl.js.map +1 -0
  64. package/package.json +48 -0
@@ -0,0 +1,46 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { makeDiff } from "./diff.js";
4
+ export const writeTool = {
5
+ name: "write_file",
6
+ description: "Write content to a file, creating it (and parent directories) or overwriting it entirely. " +
7
+ "Prefer edit_file for modifying existing files.",
8
+ needsApproval: true,
9
+ parameters: {
10
+ type: "object",
11
+ properties: {
12
+ path: {
13
+ type: "string",
14
+ description: "Path to the file to write (absolute or relative to the working directory).",
15
+ },
16
+ content: {
17
+ type: "string",
18
+ description: "The full content to write to the file.",
19
+ },
20
+ },
21
+ required: ["path", "content"],
22
+ },
23
+ preview(args, ctx) {
24
+ const rel = String(args.path);
25
+ const abs = path.isAbsolute(rel) ? rel : path.join(ctx.cwd, rel);
26
+ const exists = fs.existsSync(abs);
27
+ const lines = String(args.content ?? "").split("\n").length;
28
+ return `${exists ? "overwrite" : "create"} ${rel} (${lines} lines)`;
29
+ },
30
+ async run(args, ctx) {
31
+ const rel = String(args.path);
32
+ const content = String(args.content ?? "");
33
+ const abs = path.isAbsolute(rel) ? rel : path.join(ctx.cwd, rel);
34
+ const existed = fs.existsSync(abs);
35
+ const previous = existed ? fs.readFileSync(abs, "utf8") : "";
36
+ ctx.recordFileBackup?.(abs, existed ? previous : null);
37
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
38
+ fs.writeFileSync(abs, content, "utf8");
39
+ return {
40
+ content: `${existed ? "Overwrote" : "Created"} ${rel} (${content.split("\n").length} lines).`,
41
+ summary: `${existed ? "Overwrote" : "Created"} ${rel}`,
42
+ display: existed ? makeDiff(rel, previous, content) : undefined,
43
+ };
44
+ },
45
+ };
46
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,4FAA4F;QAC5F,gDAAgD;IAClD,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4EAA4E;aAC1F;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACtD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;KAC9B;IACD,OAAO,CAAC,IAAI,EAAE,GAAG;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC5D,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC;IACtE,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG;QACjB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEvC,OAAO;YACL,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU;YAC7F,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE;YACtD,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;SAChE,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,248 @@
1
+ import chalk from "chalk";
2
+ import os from "node:os";
3
+ const CLI_VERSION = "0.1.0";
4
+ function stripAnsi(text) {
5
+ return text.replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, "");
6
+ }
7
+ function isFullWidthCodePoint(codePoint) {
8
+ return (codePoint >= 0x1100 &&
9
+ (codePoint <= 0x115f ||
10
+ codePoint === 0x2329 ||
11
+ codePoint === 0x232a ||
12
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||
13
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
14
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
15
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
16
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
17
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
18
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6)));
19
+ }
20
+ function displayWidth(text) {
21
+ let width = 0;
22
+ for (const char of stripAnsi(text)) {
23
+ const codePoint = char.codePointAt(0) ?? 0;
24
+ if (codePoint === 0 || codePoint < 32 || (codePoint >= 0x7f && codePoint < 0xa0))
25
+ continue;
26
+ width += isFullWidthCodePoint(codePoint) ? 2 : 1;
27
+ }
28
+ return width;
29
+ }
30
+ function clip(text, width) {
31
+ if (displayWidth(text) <= width)
32
+ return text;
33
+ if (width <= 1)
34
+ return "";
35
+ let out = "";
36
+ let used = 0;
37
+ const suffix = "...";
38
+ const suffixWidth = displayWidth(suffix);
39
+ for (const char of text) {
40
+ const charWidth = displayWidth(char);
41
+ if (used + charWidth + suffixWidth > width)
42
+ break;
43
+ out += char;
44
+ used += charWidth;
45
+ }
46
+ return out + suffix;
47
+ }
48
+ function padEndDisplay(text, width) {
49
+ const clipped = clip(text, width);
50
+ return clipped + " ".repeat(Math.max(0, width - displayWidth(clipped)));
51
+ }
52
+ function centerDisplay(text, width) {
53
+ const clipped = clip(text, width);
54
+ const remaining = Math.max(0, width - displayWidth(clipped));
55
+ const left = Math.floor(remaining / 2);
56
+ return " ".repeat(left) + clipped + " ".repeat(remaining - left);
57
+ }
58
+ function panelLine(content, width) {
59
+ return chalk.hex("#f4b860")("│") + padEndDisplay(content, width) + chalk.hex("#f4b860")("│");
60
+ }
61
+ function twoColumnLine(left, right, leftWidth, rightWidth, width) {
62
+ return panelLine(padEndDisplay(left, leftWidth) + " " + chalk.dim("│") + " " + padEndDisplay(right, rightWidth), width);
63
+ }
64
+ function deepSeekLogo() {
65
+ const cyan = chalk.hex("#28d4c3");
66
+ const blue = chalk.hex("#38bdf8");
67
+ const dark = chalk.hex("#0f766e");
68
+ const eye = chalk.whiteBright;
69
+ return [
70
+ " " + blue("▄████████▄") + " ",
71
+ " " + blue("▄██") + cyan("▓▓▓▓▓▓▓▓") + blue("██▄") + " ",
72
+ " " + blue("▄█") + cyan("▓▓ ") + eye("●") + cyan(" ") + eye("●") + cyan(" ▓▓") + blue("█▄") + " ",
73
+ " " + blue("██") + cyan("▓▓ ▄▄ ▓▓") + blue("██") + " ",
74
+ " " + blue("██") + cyan("▓▓ ▄████▄ ▓▓") + blue("██") + " ",
75
+ " " + blue("▀█") + cyan("▓▓ ▀▄▄▀ ▓▓") + blue("█▀") + " ",
76
+ " " + blue("▀██") + cyan("▓▓▓▓") + blue("██▀") + " ",
77
+ " " + dark("██ ██") + " ",
78
+ ];
79
+ }
80
+ export const ui = {
81
+ banner(model, cwd, sessionMsgOrOptions) {
82
+ const options = typeof sessionMsgOrOptions === "string"
83
+ ? { sessionMsg: sessionMsgOrOptions }
84
+ : (sessionMsgOrOptions ?? {});
85
+ const columns = process.stdout.columns || 100;
86
+ const outerWidth = Math.min(Math.max(columns - 4, 76), 150);
87
+ const innerWidth = outerWidth - 2;
88
+ const accent = chalk.hex("#f4b860");
89
+ const title = "─ DeepSeek CLI v" + CLI_VERSION + " ";
90
+ const top = accent("╭" + title + "─".repeat(Math.max(0, innerWidth - displayWidth(title))) + "╮");
91
+ const bottom = accent("╰" + "─".repeat(innerWidth) + "╯");
92
+ const user = os.userInfo().username || "there";
93
+ const mcpText = options.mcpTools && options.mcpTools > 0
94
+ ? options.mcpTools + " tool" + (options.mcpTools === 1 ? "" : "s") + " loaded"
95
+ : "/mcp init to add tools";
96
+ const mcpErrorText = options.mcpErrors && options.mcpErrors > 0
97
+ ? " · " + options.mcpErrors + " issue" + (options.mcpErrors === 1 ? "" : "s")
98
+ : "";
99
+ const sessionText = options.sessionMsg ?? "new session";
100
+ const sessionLine = sessionText.startsWith("session:") ? sessionText : "session: " + sessionText;
101
+ console.log();
102
+ console.log(top);
103
+ if (innerWidth >= 96) {
104
+ const leftWidth = Math.floor((innerWidth - 3) * 0.49);
105
+ const rightWidth = innerWidth - leftWidth - 3;
106
+ const logo = deepSeekLogo();
107
+ const leftLines = [
108
+ "",
109
+ centerDisplay(chalk.bold("Welcome back " + user + "!"), leftWidth),
110
+ "",
111
+ ...logo.map((line) => centerDisplay(line, leftWidth)),
112
+ "",
113
+ centerDisplay(chalk.green(model) + chalk.dim(" · agentic coding"), leftWidth),
114
+ centerDisplay(chalk.dim(cwd), leftWidth),
115
+ ];
116
+ const rightLines = [
117
+ "",
118
+ chalk.bold.hex("#f4b860")("Tips for getting started"),
119
+ "Run " + chalk.cyan("/init") + " to create project memory",
120
+ "Type " + chalk.cyan("/") + " to browse and fuzzy-search commands",
121
+ "Use " + chalk.cyan("@file") + " or " + chalk.cyan("drag a file in") + " to attach",
122
+ "Use " + chalk.cyan("#note") + " to write memory quickly",
123
+ "Use " + chalk.cyan("!cmd") + " for direct shell commands",
124
+ "",
125
+ chalk.bold.hex("#f4b860")("What's new"),
126
+ chalk.cyan("/mcp") + " loads stdio MCP servers as tools",
127
+ chalk.cyan("/model") + " chooses DeepSeek model with arrows",
128
+ chalk.cyan("/skills") + " turns markdown prompts into commands",
129
+ "",
130
+ chalk.dim(sessionLine),
131
+ chalk.dim("MCP: ") + chalk.dim(mcpText + mcpErrorText),
132
+ ];
133
+ const rows = Math.max(leftLines.length, rightLines.length);
134
+ for (let i = 0; i < rows; i++) {
135
+ twoColumnLine(leftLines[i] ?? "", rightLines[i] ?? "", leftWidth, rightWidth, innerWidth);
136
+ }
137
+ }
138
+ else {
139
+ const logo = deepSeekLogo();
140
+ const lines = [
141
+ "",
142
+ centerDisplay(chalk.bold("Welcome back " + user + "!"), innerWidth),
143
+ "",
144
+ ...logo.map((line) => centerDisplay(line, innerWidth)),
145
+ "",
146
+ centerDisplay(chalk.green(model) + chalk.dim(" · agentic coding"), innerWidth),
147
+ centerDisplay(chalk.dim(cwd), innerWidth),
148
+ centerDisplay(chalk.dim(sessionLine), innerWidth),
149
+ centerDisplay(chalk.dim("MCP: " + mcpText + mcpErrorText), innerWidth),
150
+ "",
151
+ " " + accent.bold("Tips") + " " + chalk.dim("/init · / · @file · drag-in · #note · !cmd · /mcp"),
152
+ "",
153
+ ];
154
+ for (const line of lines)
155
+ console.log(panelLine(line, innerWidth));
156
+ }
157
+ console.log(bottom);
158
+ console.log(chalk.dim(" Type " + chalk.cyan("/") + " for commands, " + chalk.cyan("/exit") + " to quit."));
159
+ console.log();
160
+ },
161
+ /** A label for assistant output. */
162
+ assistantLabel() {
163
+ process.stdout.write(chalk.bold.magenta("\n● "));
164
+ },
165
+ toolCall(summary) {
166
+ console.log(chalk.blue(" ⚙ ") + chalk.cyan(summary));
167
+ },
168
+ toolResult(summary, isError) {
169
+ const icon = isError ? chalk.red(" ✗ ") : chalk.green(" ✓ ");
170
+ console.log(icon + chalk.dim(summary));
171
+ },
172
+ /** Render a unified diff (lines prefixed with +/-/@@) with colour. */
173
+ diff(text) {
174
+ for (const line of text.split("\n")) {
175
+ if (line.startsWith("@@"))
176
+ console.log(chalk.cyan(" " + line));
177
+ else if (line.startsWith("+"))
178
+ console.log(chalk.green(" " + line));
179
+ else if (line.startsWith("-"))
180
+ console.log(chalk.red(" " + line));
181
+ else
182
+ console.log(chalk.dim(" " + line));
183
+ }
184
+ },
185
+ reasoning(text) {
186
+ console.log(chalk.dim.italic("\n [thinking] " + text.trim().replace(/\n/g, "\n ")));
187
+ },
188
+ usage(usage, model) {
189
+ const prompt = `${usage.promptTokens.toLocaleString()} in`;
190
+ const comp = `${usage.completionTokens.toLocaleString()} out`;
191
+ let line = ` ⟐ tokens: ${prompt} · ${comp} · ${usage.totalTokens.toLocaleString()} total`;
192
+ if (model) {
193
+ // Estimate cost using DeepSeek pricing.
194
+ const pricing = {
195
+ "deepseek-v4-pro": { input: 0.435, output: 0.87 },
196
+ "deepseek-v4-flash": { input: 0.14, output: 0.28 },
197
+ };
198
+ const p = pricing[model] ?? pricing["deepseek-v4-pro"];
199
+ const blended = (p.input + p.output) / 2;
200
+ const cost = (usage.totalTokens / 1_000_000) * blended;
201
+ line += chalk.dim(` · ~$${cost.toFixed(4)}`);
202
+ }
203
+ console.log(chalk.dim(line));
204
+ },
205
+ info(msg) {
206
+ console.log(chalk.dim(msg));
207
+ },
208
+ success(msg) {
209
+ console.log(chalk.green(msg));
210
+ },
211
+ warn(msg) {
212
+ console.log(chalk.yellow(msg));
213
+ },
214
+ error(msg) {
215
+ console.log(chalk.red(msg));
216
+ },
217
+ divider() {
218
+ console.log(chalk.dim("─".repeat(Math.min(process.stdout.columns || 60, 60))));
219
+ },
220
+ };
221
+ /** Minimal terminal spinner shown while waiting for the first token. */
222
+ export class Spinner {
223
+ label;
224
+ frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
225
+ timer = null;
226
+ i = 0;
227
+ constructor(label) {
228
+ this.label = label;
229
+ }
230
+ start() {
231
+ if (!process.stdout.isTTY)
232
+ return;
233
+ this.timer = setInterval(() => {
234
+ process.stdout.write(`\r${chalk.magenta(this.frames[this.i])} ${chalk.dim(this.label)}`);
235
+ this.i = (this.i + 1) % this.frames.length;
236
+ }, 80);
237
+ }
238
+ stop() {
239
+ if (this.timer) {
240
+ clearInterval(this.timer);
241
+ this.timer = null;
242
+ // Clear the spinner line.
243
+ process.stdout.write("\r" + " ".repeat((this.label.length + 4)) + "\r");
244
+ }
245
+ }
246
+ }
247
+ export { chalk };
248
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}