xiaotime 0.6.0 → 0.7.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/dist/background.d.ts +47 -0
- package/dist/background.d.ts.map +1 -0
- package/dist/background.js +110 -0
- package/dist/background.js.map +1 -0
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/ink/runSessionInk.d.ts.map +1 -1
- package/dist/ink/runSessionInk.js +16 -2
- package/dist/ink/runSessionInk.js.map +1 -1
- package/dist/mcp.d.ts +94 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +282 -0
- package/dist/mcp.js.map +1 -0
- package/dist/settings.d.ts +9 -1
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +46 -4
- package/dist/settings.js.map +1 -1
- package/dist/skills.d.ts +14 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +112 -0
- package/dist/skills.js.map +1 -0
- package/dist/todos.d.ts +26 -0
- package/dist/todos.d.ts.map +1 -0
- package/dist/todos.js +55 -0
- package/dist/todos.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +496 -1
- package/dist/tools.js.map +1 -1
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +23 -2
- package/dist/ws.js.map +1 -1
- package/package.json +1 -1
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) client — SPRINT-CLI-CAPABILITY-PARITY-1
|
|
3
|
+
* (#14608).
|
|
4
|
+
*
|
|
5
|
+
* Lets the terminal agent reach external tool servers (the KB/estate,
|
|
6
|
+
* a browser driver, platform connectors) the same way Claude Code
|
|
7
|
+
* does: spawn the servers declared in `~/.xiaotime/mcp.json`, discover
|
|
8
|
+
* their tools over stdio JSON-RPC, and expose them to the LLM as extra
|
|
9
|
+
* entries in the connect manifest. A tool_use for one of these names is
|
|
10
|
+
* routed to its server's `tools/call` instead of the local executeTool
|
|
11
|
+
* switch.
|
|
12
|
+
*
|
|
13
|
+
* Transport: newline-delimited JSON-RPC 2.0 over the child's stdio
|
|
14
|
+
* (the MCP stdio contract — one JSON message per line, no embedded
|
|
15
|
+
* newlines).
|
|
16
|
+
*
|
|
17
|
+
* Tool naming: `mcp__<server>__<tool>` so two servers can expose a tool
|
|
18
|
+
* of the same bare name without colliding, and the dispatcher can parse
|
|
19
|
+
* the server back out of the name.
|
|
20
|
+
*
|
|
21
|
+
* Config shape (Claude-Code-compatible):
|
|
22
|
+
* { "mcpServers": { "<name>": { "command": "...", "args": [...],
|
|
23
|
+
* "env": { ... } } } }
|
|
24
|
+
*
|
|
25
|
+
* Governance: MCP tools ride the SAME tool_call → tool_result round-trip
|
|
26
|
+
* as the built-in tools, so they surface in the transcript. Per-tool
|
|
27
|
+
* approval on outbound MCP calls lands with the #14605 room; today the
|
|
28
|
+
* mediation is the config file itself (only servers the user declared
|
|
29
|
+
* are spawned).
|
|
30
|
+
*/
|
|
31
|
+
import * as fs from "fs";
|
|
32
|
+
import * as os from "os";
|
|
33
|
+
import * as path from "path";
|
|
34
|
+
import { spawn } from "child_process";
|
|
35
|
+
const PROTOCOL_VERSION = "2024-11-05";
|
|
36
|
+
export const MCP_TOOL_PREFIX = "mcp__";
|
|
37
|
+
export function mcpConfigPath() {
|
|
38
|
+
return (process.env.XIAOTIME_MCP_CONFIG ??
|
|
39
|
+
path.join(os.homedir(), ".xiaotime", "mcp.json"));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Read `~/.xiaotime/mcp.json`. Returns an empty server set for any
|
|
43
|
+
* failure (missing / unreadable / malformed) — a broken MCP config
|
|
44
|
+
* must never stop the CLI from starting (mirrors settings.ts's
|
|
45
|
+
* never-throw allowlist load).
|
|
46
|
+
*/
|
|
47
|
+
export function loadMcpConfig() {
|
|
48
|
+
const p = mcpConfigPath();
|
|
49
|
+
if (!fs.existsSync(p))
|
|
50
|
+
return { mcpServers: {} };
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
53
|
+
const servers = parsed?.mcpServers;
|
|
54
|
+
if (!servers || typeof servers !== "object")
|
|
55
|
+
return { mcpServers: {} };
|
|
56
|
+
return { mcpServers: servers };
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
process.stderr.write(`[xiaotime] ~/.xiaotime/mcp.json unreadable: ${e.message}\n`);
|
|
60
|
+
return { mcpServers: {} };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function isMcpTool(name) {
|
|
64
|
+
return name.startsWith(MCP_TOOL_PREFIX);
|
|
65
|
+
}
|
|
66
|
+
/** Parse `mcp__<server>__<tool>` back into its parts (null if malformed). */
|
|
67
|
+
export function parseMcpToolName(name) {
|
|
68
|
+
if (!isMcpTool(name))
|
|
69
|
+
return null;
|
|
70
|
+
const rest = name.slice(MCP_TOOL_PREFIX.length);
|
|
71
|
+
const idx = rest.indexOf("__");
|
|
72
|
+
if (idx === -1 || idx === 0 || idx + 2 >= rest.length)
|
|
73
|
+
return null;
|
|
74
|
+
return { server: rest.slice(0, idx), tool: rest.slice(idx + 2) };
|
|
75
|
+
}
|
|
76
|
+
/** One live connection to a spawned MCP server. */
|
|
77
|
+
export class McpConnection {
|
|
78
|
+
name;
|
|
79
|
+
cfg;
|
|
80
|
+
child = null;
|
|
81
|
+
buf = "";
|
|
82
|
+
nextId = 1;
|
|
83
|
+
pending = new Map();
|
|
84
|
+
closed = false;
|
|
85
|
+
tools = [];
|
|
86
|
+
constructor(name, cfg) {
|
|
87
|
+
this.name = name;
|
|
88
|
+
this.cfg = cfg;
|
|
89
|
+
}
|
|
90
|
+
async start(timeoutMs = 15000) {
|
|
91
|
+
this.child = spawn(this.cfg.command, this.cfg.args ?? [], {
|
|
92
|
+
env: { ...process.env, ...(this.cfg.env ?? {}) },
|
|
93
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
94
|
+
});
|
|
95
|
+
this.child.stdout.setEncoding("utf-8");
|
|
96
|
+
this.child.stdout.on("data", (chunk) => this._onData(chunk));
|
|
97
|
+
this.child.on("exit", () => this._fail(new Error(`MCP server '${this.name}' exited`)));
|
|
98
|
+
this.child.on("error", (e) => this._fail(e));
|
|
99
|
+
await this._request("initialize", {
|
|
100
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
101
|
+
capabilities: {},
|
|
102
|
+
clientInfo: { name: "xiaotime-cli", version: "0.6.1" },
|
|
103
|
+
}, timeoutMs);
|
|
104
|
+
this._notify("notifications/initialized", {});
|
|
105
|
+
const listed = (await this._request("tools/list", {}, timeoutMs));
|
|
106
|
+
const raw = Array.isArray(listed?.tools) ? listed.tools : [];
|
|
107
|
+
this.tools = raw
|
|
108
|
+
.filter((t) => t && typeof t.name === "string")
|
|
109
|
+
.map((t) => ({
|
|
110
|
+
name: `${MCP_TOOL_PREFIX}${this.name}__${t.name}`,
|
|
111
|
+
description: t.description ?? `(${this.name}) ${t.name}`,
|
|
112
|
+
input_schema: _normalizeSchema(t.inputSchema),
|
|
113
|
+
}));
|
|
114
|
+
}
|
|
115
|
+
async callTool(tool, args, timeoutMs = 120000) {
|
|
116
|
+
const res = (await this._request("tools/call", { name: tool, arguments: args }, timeoutMs));
|
|
117
|
+
const content = Array.isArray(res?.content) ? res.content : [];
|
|
118
|
+
const text = content
|
|
119
|
+
.map((c) => (typeof c?.text === "string" ? c.text : ""))
|
|
120
|
+
.join("\n")
|
|
121
|
+
.trim();
|
|
122
|
+
return { text: text || "(empty result)", isError: Boolean(res?.isError) };
|
|
123
|
+
}
|
|
124
|
+
stop() {
|
|
125
|
+
this.closed = true;
|
|
126
|
+
for (const [, p] of this.pending) {
|
|
127
|
+
clearTimeout(p.timer);
|
|
128
|
+
p.reject(new Error("connection closed"));
|
|
129
|
+
}
|
|
130
|
+
this.pending.clear();
|
|
131
|
+
try {
|
|
132
|
+
this.child?.kill();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
/* already gone */
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
_onData(chunk) {
|
|
139
|
+
this.buf += chunk;
|
|
140
|
+
let nl;
|
|
141
|
+
while ((nl = this.buf.indexOf("\n")) !== -1) {
|
|
142
|
+
const line = this.buf.slice(0, nl).trim();
|
|
143
|
+
this.buf = this.buf.slice(nl + 1);
|
|
144
|
+
if (!line)
|
|
145
|
+
continue;
|
|
146
|
+
let msg;
|
|
147
|
+
try {
|
|
148
|
+
msg = JSON.parse(line);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
continue; // non-JSON stderr-ish noise on stdout — skip
|
|
152
|
+
}
|
|
153
|
+
if (typeof msg.id === "number" && this.pending.has(msg.id)) {
|
|
154
|
+
const p = this.pending.get(msg.id);
|
|
155
|
+
clearTimeout(p.timer);
|
|
156
|
+
this.pending.delete(msg.id);
|
|
157
|
+
if (msg.error)
|
|
158
|
+
p.reject(new Error(msg.error.message ?? "MCP error"));
|
|
159
|
+
else
|
|
160
|
+
p.resolve(msg.result);
|
|
161
|
+
}
|
|
162
|
+
// server-initiated notifications are ignored (no id)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
_request(method, params, timeoutMs) {
|
|
166
|
+
if (this.closed || !this.child) {
|
|
167
|
+
return Promise.reject(new Error("MCP connection not open"));
|
|
168
|
+
}
|
|
169
|
+
const id = this.nextId++;
|
|
170
|
+
const payload = JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n";
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const timer = setTimeout(() => {
|
|
173
|
+
this.pending.delete(id);
|
|
174
|
+
reject(new Error(`MCP '${this.name}' ${method} timed out`));
|
|
175
|
+
}, timeoutMs);
|
|
176
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
177
|
+
try {
|
|
178
|
+
this.child.stdin.write(payload);
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
clearTimeout(timer);
|
|
182
|
+
this.pending.delete(id);
|
|
183
|
+
reject(e);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
_notify(method, params) {
|
|
188
|
+
if (this.closed || !this.child)
|
|
189
|
+
return;
|
|
190
|
+
try {
|
|
191
|
+
this.child.stdin.write(JSON.stringify({ jsonrpc: "2.0", method, params }) + "\n");
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
/* best-effort */
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
_fail(err) {
|
|
198
|
+
if (this.closed)
|
|
199
|
+
return;
|
|
200
|
+
for (const [, p] of this.pending) {
|
|
201
|
+
clearTimeout(p.timer);
|
|
202
|
+
p.reject(err);
|
|
203
|
+
}
|
|
204
|
+
this.pending.clear();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function _normalizeSchema(s) {
|
|
208
|
+
if (s && typeof s === "object" && s.type === "object") {
|
|
209
|
+
const obj = s;
|
|
210
|
+
return {
|
|
211
|
+
type: "object",
|
|
212
|
+
properties: obj.properties ?? {},
|
|
213
|
+
required: Array.isArray(obj.required) ? obj.required : undefined,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
return { type: "object", properties: {} };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Owns every live MCP connection for a session. Connects all configured
|
|
220
|
+
* servers concurrently, aggregates their tools into one manifest slice,
|
|
221
|
+
* and routes tool calls to the right server. A server that fails to
|
|
222
|
+
* start is skipped (reported in `errors`), never fatal.
|
|
223
|
+
*/
|
|
224
|
+
export class McpManager {
|
|
225
|
+
conns = new Map();
|
|
226
|
+
async startAll(cfg = loadMcpConfig()) {
|
|
227
|
+
const errors = [];
|
|
228
|
+
const names = Object.keys(cfg.mcpServers);
|
|
229
|
+
await Promise.all(names.map(async (name) => {
|
|
230
|
+
const conn = new McpConnection(name, cfg.mcpServers[name]);
|
|
231
|
+
try {
|
|
232
|
+
await conn.start();
|
|
233
|
+
this.conns.set(name, conn);
|
|
234
|
+
}
|
|
235
|
+
catch (e) {
|
|
236
|
+
errors.push(`${name}: ${e.message}`);
|
|
237
|
+
conn.stop();
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
const tools = [];
|
|
241
|
+
for (const c of this.conns.values())
|
|
242
|
+
tools.push(...c.tools);
|
|
243
|
+
return { tools, errors };
|
|
244
|
+
}
|
|
245
|
+
hasServers() {
|
|
246
|
+
return this.conns.size > 0;
|
|
247
|
+
}
|
|
248
|
+
serverNames() {
|
|
249
|
+
return [...this.conns.keys()];
|
|
250
|
+
}
|
|
251
|
+
async call(name, input, tool_use_id) {
|
|
252
|
+
const parsed = parseMcpToolName(name);
|
|
253
|
+
if (!parsed) {
|
|
254
|
+
return { tool_use_id, content: `Not an MCP tool: ${name}`, is_error: true };
|
|
255
|
+
}
|
|
256
|
+
const conn = this.conns.get(parsed.server);
|
|
257
|
+
if (!conn) {
|
|
258
|
+
return {
|
|
259
|
+
tool_use_id,
|
|
260
|
+
content: `MCP server not connected: ${parsed.server}`,
|
|
261
|
+
is_error: true,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
const { text, isError } = await conn.callTool(parsed.tool, input);
|
|
266
|
+
return { tool_use_id, content: text, is_error: isError };
|
|
267
|
+
}
|
|
268
|
+
catch (e) {
|
|
269
|
+
return {
|
|
270
|
+
tool_use_id,
|
|
271
|
+
content: `MCP call failed: ${e.message}`,
|
|
272
|
+
is_error: true,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
stopAll() {
|
|
277
|
+
for (const c of this.conns.values())
|
|
278
|
+
c.stop();
|
|
279
|
+
this.conns.clear();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/settings.d.ts
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* managed-task envelope; this is a UX gate for client-side tool
|
|
37
37
|
* approvals. Two allowlists, two audiences, two update cadences.
|
|
38
38
|
*/
|
|
39
|
-
export type AllowlistTool = "shell_command" | "write_file" | "git_commit";
|
|
39
|
+
export type AllowlistTool = "shell_command" | "write_file" | "git_commit" | "edit" | "web_fetch" | "run_background";
|
|
40
40
|
export interface AllowlistEntry {
|
|
41
41
|
tool: AllowlistTool;
|
|
42
42
|
pattern: string;
|
|
@@ -88,6 +88,14 @@ export declare function appendAllowlist(entry: {
|
|
|
88
88
|
* future commits.
|
|
89
89
|
*/
|
|
90
90
|
export declare function derivePattern(tool: AllowlistTool, input: Record<string, unknown>): string | null;
|
|
91
|
+
/**
|
|
92
|
+
* Extract the lowercased host from a URL for web_fetch allowlist
|
|
93
|
+
* scoping. Returns null for anything that isn't a parseable http(s)
|
|
94
|
+
* URL — a non-http scheme must never be allowlistable, and an
|
|
95
|
+
* unparseable string must fall through to the prompt, never persist a
|
|
96
|
+
* broken entry (mirrors the flag-only guard in shell_command).
|
|
97
|
+
*/
|
|
98
|
+
export declare function _urlHost(raw: string): string | null;
|
|
91
99
|
/**
|
|
92
100
|
* Check whether a tool invocation matches any entry in the
|
|
93
101
|
* allowlist. Matching semantics differ per tool:
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAMH,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAMH,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,WAAW,GACX,gBAAgB,CAAC;AAWrB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AASD;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,IAAI,cAAc,EAAE,CAoChD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9C,IAAI,CAwCN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,GAAG,IAAI,CA6Df;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,SAAS,EAAE,cAAc,EAAE,GAC1B,cAAc,GAAG,IAAI,CA2BvB"}
|
package/dist/settings.js
CHANGED
|
@@ -43,6 +43,9 @@ const ALLOWLIST_TOOLS = new Set([
|
|
|
43
43
|
"shell_command",
|
|
44
44
|
"write_file",
|
|
45
45
|
"git_commit",
|
|
46
|
+
"edit",
|
|
47
|
+
"web_fetch",
|
|
48
|
+
"run_background",
|
|
46
49
|
]);
|
|
47
50
|
/**
|
|
48
51
|
* Settings-file location. Resolved lazily per call so the
|
|
@@ -157,7 +160,9 @@ export function appendAllowlist(entry) {
|
|
|
157
160
|
* future commits.
|
|
158
161
|
*/
|
|
159
162
|
export function derivePattern(tool, input) {
|
|
160
|
-
if (tool === "shell_command") {
|
|
163
|
+
if (tool === "shell_command" || tool === "run_background") {
|
|
164
|
+
// run_background executes an arbitrary command line just like
|
|
165
|
+
// shell_command — same command-prefix allowlist derivation (#14608).
|
|
161
166
|
const cmd = String(input.command ?? "").trim();
|
|
162
167
|
if (!cmd)
|
|
163
168
|
return null;
|
|
@@ -184,7 +189,9 @@ export function derivePattern(tool, input) {
|
|
|
184
189
|
}
|
|
185
190
|
return result.join(" ");
|
|
186
191
|
}
|
|
187
|
-
if (tool === "write_file") {
|
|
192
|
+
if (tool === "write_file" || tool === "edit") {
|
|
193
|
+
// `edit` is a path-scoped file mutation, same as write_file — it
|
|
194
|
+
// shares the directory-glob allowlist semantics (#14608).
|
|
188
195
|
const p = String(input.path ?? "");
|
|
189
196
|
if (!p)
|
|
190
197
|
return null;
|
|
@@ -203,8 +210,37 @@ export function derivePattern(tool, input) {
|
|
|
203
210
|
if (tool === "git_commit") {
|
|
204
211
|
return "*";
|
|
205
212
|
}
|
|
213
|
+
if (tool === "web_fetch") {
|
|
214
|
+
// Host-scoped: allowlisting a fetch blesses the whole origin, so
|
|
215
|
+
// "run and don't ask again" on https://docs.foo.com/a permits
|
|
216
|
+
// https://docs.foo.com/b but never a different host (#14608).
|
|
217
|
+
const raw = String(input.url ?? "").trim();
|
|
218
|
+
if (!raw)
|
|
219
|
+
return null;
|
|
220
|
+
const host = _urlHost(raw);
|
|
221
|
+
return host === null ? null : `host:${host}`;
|
|
222
|
+
}
|
|
206
223
|
return null;
|
|
207
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Extract the lowercased host from a URL for web_fetch allowlist
|
|
227
|
+
* scoping. Returns null for anything that isn't a parseable http(s)
|
|
228
|
+
* URL — a non-http scheme must never be allowlistable, and an
|
|
229
|
+
* unparseable string must fall through to the prompt, never persist a
|
|
230
|
+
* broken entry (mirrors the flag-only guard in shell_command).
|
|
231
|
+
*/
|
|
232
|
+
export function _urlHost(raw) {
|
|
233
|
+
let u;
|
|
234
|
+
try {
|
|
235
|
+
u = new URL(raw);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
if (u.protocol !== "http:" && u.protocol !== "https:")
|
|
241
|
+
return null;
|
|
242
|
+
return u.host.toLowerCase();
|
|
243
|
+
}
|
|
208
244
|
/**
|
|
209
245
|
* Check whether a tool invocation matches any entry in the
|
|
210
246
|
* allowlist. Matching semantics differ per tool:
|
|
@@ -228,13 +264,13 @@ export function matchAllowlist(tool, input, allowlist) {
|
|
|
228
264
|
continue;
|
|
229
265
|
if (tool === "git_commit")
|
|
230
266
|
return entry;
|
|
231
|
-
if (tool === "shell_command") {
|
|
267
|
+
if (tool === "shell_command" || tool === "run_background") {
|
|
232
268
|
const derived = derivePattern(tool, input);
|
|
233
269
|
if (derived !== null && derived === entry.pattern)
|
|
234
270
|
return entry;
|
|
235
271
|
continue;
|
|
236
272
|
}
|
|
237
|
-
if (tool === "write_file") {
|
|
273
|
+
if (tool === "write_file" || tool === "edit") {
|
|
238
274
|
const raw = String(input.path ?? "");
|
|
239
275
|
if (!raw)
|
|
240
276
|
continue;
|
|
@@ -247,6 +283,12 @@ export function matchAllowlist(tool, input, allowlist) {
|
|
|
247
283
|
return entry;
|
|
248
284
|
continue;
|
|
249
285
|
}
|
|
286
|
+
if (tool === "web_fetch") {
|
|
287
|
+
const derived = derivePattern(tool, input);
|
|
288
|
+
if (derived !== null && derived === entry.pattern)
|
|
289
|
+
return entry;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
250
292
|
}
|
|
251
293
|
return null;
|
|
252
294
|
}
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SkillMeta {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
dir: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function skillRoots(baseDir?: string): string[];
|
|
7
|
+
export declare function parseFrontmatter(content: string, fallbackName: string): {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function listSkills(baseDir?: string): SkillMeta[];
|
|
12
|
+
export declare function loadSkill(name: string, baseDir?: string): string | null;
|
|
13
|
+
export declare function renderSkillList(skills: SkillMeta[]): string;
|
|
14
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAGD,wBAAgB,UAAU,CAAC,OAAO,GAAE,MAAsB,GAAG,MAAM,EAAE,CAKpE;AAKD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAevC;AAID,wBAAgB,UAAU,CAAC,OAAO,GAAE,MAAsB,GAAG,SAAS,EAAE,CAkCvE;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAWtF;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAO3D"}
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Client-loadable skills -- SPRINT-CLI-CAPABILITY-PARITY-1 (#14608).
|
|
3
|
+
*
|
|
4
|
+
* Skills the agent can discover and pull in the project it is working in:
|
|
5
|
+
* every <dir>/.claude/skills/[slug]/SKILL.md under the session cwd, plus a
|
|
6
|
+
* user-global ~/.xiaotime/skills/. list_skills shows what is available
|
|
7
|
+
* (name + one-line description from the frontmatter); load_skill returns a
|
|
8
|
+
* skill's full instructions for the agent to follow on demand.
|
|
9
|
+
*
|
|
10
|
+
* Scope note (#14608): this is the PULL form -- the agent asks for a local
|
|
11
|
+
* skill and follows it. AMBIENT injection of client skills into the LLM
|
|
12
|
+
* system prompt is server-side (the brain builds the prompt via
|
|
13
|
+
* shared/skills + pipeline.py), so that half is a companion server change,
|
|
14
|
+
* not a CLI one -- the same client/server boundary as sub-agents.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from "fs";
|
|
17
|
+
import * as os from "os";
|
|
18
|
+
import * as path from "path";
|
|
19
|
+
// Skill search roots: the project's .claude/skills + a user-global one.
|
|
20
|
+
export function skillRoots(baseDir = process.cwd()) {
|
|
21
|
+
return [
|
|
22
|
+
path.join(baseDir, ".claude", "skills"),
|
|
23
|
+
path.join(os.homedir(), ".xiaotime", "skills"),
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
// Pull name / description out of a SKILL.md leading frontmatter block
|
|
27
|
+
// (--- ... ---). Minimal on purpose -- a full YAML parse is not worth a
|
|
28
|
+
// dependency for two scalar fields. Falls back to the directory name.
|
|
29
|
+
export function parseFrontmatter(content, fallbackName) {
|
|
30
|
+
let name = fallbackName;
|
|
31
|
+
let description = "";
|
|
32
|
+
const m = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
33
|
+
if (m) {
|
|
34
|
+
for (const line of m[1].split("\n")) {
|
|
35
|
+
const kv = line.match(/^(name|description)\s*:\s*(.+?)\s*$/i);
|
|
36
|
+
if (kv) {
|
|
37
|
+
const val = kv[2].replace(/^["']|["']$/g, "");
|
|
38
|
+
if (kv[1].toLowerCase() === "name")
|
|
39
|
+
name = val;
|
|
40
|
+
else
|
|
41
|
+
description = val;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { name, description };
|
|
46
|
+
}
|
|
47
|
+
// Discover every skill under the search roots, de-duplicated by name
|
|
48
|
+
// (first root wins).
|
|
49
|
+
export function listSkills(baseDir = process.cwd()) {
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const root of skillRoots(baseDir)) {
|
|
53
|
+
let entries;
|
|
54
|
+
try {
|
|
55
|
+
entries = fs.readdirSync(root);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue; // root does not exist -- fine
|
|
59
|
+
}
|
|
60
|
+
entries.sort();
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const dir = path.join(root, entry);
|
|
63
|
+
const skillFile = path.join(dir, "SKILL.md");
|
|
64
|
+
let stat;
|
|
65
|
+
try {
|
|
66
|
+
stat = fs.statSync(dir);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!stat.isDirectory() || !fs.existsSync(skillFile))
|
|
72
|
+
continue;
|
|
73
|
+
let content;
|
|
74
|
+
try {
|
|
75
|
+
content = fs.readFileSync(skillFile, "utf-8");
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const meta = parseFrontmatter(content, entry);
|
|
81
|
+
if (seen.has(meta.name))
|
|
82
|
+
continue;
|
|
83
|
+
seen.add(meta.name);
|
|
84
|
+
out.push({ name: meta.name, description: meta.description, dir });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
// Return a skill's full SKILL.md text, or null if no such skill is found.
|
|
90
|
+
export function loadSkill(name, baseDir = process.cwd()) {
|
|
91
|
+
for (const skill of listSkills(baseDir)) {
|
|
92
|
+
if (skill.name === name) {
|
|
93
|
+
try {
|
|
94
|
+
return fs.readFileSync(path.join(skill.dir, "SKILL.md"), "utf-8");
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
// Render the discovered skills as a name/description list.
|
|
104
|
+
export function renderSkillList(skills) {
|
|
105
|
+
if (skills.length === 0) {
|
|
106
|
+
return "(no local skills found under ./.claude/skills or ~/.xiaotime/skills)";
|
|
107
|
+
}
|
|
108
|
+
return skills
|
|
109
|
+
.map((s) => (s.description ? s.name + " -- " + s.description : s.name))
|
|
110
|
+
.join("\n");
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/todos.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task/todo tracking — SPRINT-CLI-CAPABILITY-PARITY-1 (#14608).
|
|
3
|
+
*
|
|
4
|
+
* A working-memory aid for multi-step work: the agent writes the whole
|
|
5
|
+
* task list each time (the Claude-Code TodoWrite shape — the list is
|
|
6
|
+
* state the model owns, not an append log), and the rendered checklist
|
|
7
|
+
* comes back as the tool result so it lands in the transcript for both
|
|
8
|
+
* the classic and Ink surfaces without either needing bespoke render
|
|
9
|
+
* wiring. Kept in a session-global store so a future status bar can read
|
|
10
|
+
* the current list.
|
|
11
|
+
*/
|
|
12
|
+
export type TodoStatus = "pending" | "in_progress" | "completed";
|
|
13
|
+
export interface Todo {
|
|
14
|
+
content: string;
|
|
15
|
+
status: TodoStatus;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Replace the whole list. Throws on a malformed entry so the tool
|
|
19
|
+
* surfaces a real error instead of silently storing junk.
|
|
20
|
+
*/
|
|
21
|
+
export declare function setTodos(list: unknown): Todo[];
|
|
22
|
+
export declare function getTodos(): Todo[];
|
|
23
|
+
export declare function clearTodos(): void;
|
|
24
|
+
/** Render the list as a plain-text checklist (tool-result body). */
|
|
25
|
+
export declare function renderTodos(list?: Todo[]): string;
|
|
26
|
+
//# sourceMappingURL=todos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../src/todos.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAEjE,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,CAgB9C;AAED,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAEjC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAQD,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,IAAI,GAAE,IAAI,EAAU,GAAG,MAAM,CAKxD"}
|