@zentodo/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/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +8 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/audit.d.ts +6 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +25 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +161 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +66 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/data.d.ts +8 -0
- package/dist/commands/data.d.ts.map +1 -0
- package/dist/commands/data.js +223 -0
- package/dist/commands/data.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +49 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mcp.d.ts +19 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +183 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/raw.d.ts +6 -0
- package/dist/commands/raw.d.ts.map +1 -0
- package/dist/commands/raw.js +59 -0
- package/dist/commands/raw.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +74 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/settings.d.ts +6 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +82 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/skill.d.ts +23 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +280 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/stats.d.ts +6 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +163 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +142 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/context.d.ts +28 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +54 -0
- package/dist/context.js.map +1 -0
- package/dist/generate.d.ts +6 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +163 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/output/format.d.ts +19 -0
- package/dist/output/format.d.ts.map +1 -0
- package/dist/output/format.js +99 -0
- package/dist/output/format.js.map +1 -0
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +59 -0
- package/dist/program.js.map +1 -0
- package/package.json +54 -0
- package/scripts/postinstall.mjs +56 -0
- package/skills/zentodo/SKILL.md +231 -0
- package/skills/zentodo/examples/plan-my-day.md +12 -0
- package/skills/zentodo/examples/sync.md +9 -0
- package/skills/zentodo/references/commands.md +1413 -0
- package/skills/zentodo/references/error-codes.md +62 -0
- package/skills/zentodo/references/mapping.md +115 -0
- package/skills/zentodo/references/tools.json +4008 -0
- package/skills/zentodo/references/tools.md +1346 -0
- package/skills/zentodo/skill.json +15 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo doctor` — 探测配置、网络、Token 状态。
|
|
3
|
+
*/
|
|
4
|
+
import { configFilePath, loadConfig, applyEnvOverrides, getProfile } from '@zentodo/core';
|
|
5
|
+
import { resolveFormat, writeResult } from '../output/format.js';
|
|
6
|
+
export function registerDoctor(root) {
|
|
7
|
+
root
|
|
8
|
+
.command('doctor')
|
|
9
|
+
.description('体检:检查本地配置、服务器可达性、Token 状态')
|
|
10
|
+
.action(async (_opts, thisCmd) => {
|
|
11
|
+
const flags = thisCmd.optsWithGlobals();
|
|
12
|
+
const format = resolveFormat({
|
|
13
|
+
json: !!flags['json'],
|
|
14
|
+
ndjson: !!flags['ndjson'],
|
|
15
|
+
yaml: !!flags['yaml'],
|
|
16
|
+
});
|
|
17
|
+
const results = [];
|
|
18
|
+
try {
|
|
19
|
+
const cfg = loadConfig();
|
|
20
|
+
results.push({ name: 'config.load', ok: true, detail: { path: configFilePath() } });
|
|
21
|
+
const { profile, name } = getProfile(cfg, flags['profile']);
|
|
22
|
+
const effective = applyEnvOverrides(profile);
|
|
23
|
+
results.push({ name: 'config.profile', ok: true, detail: { name, server: effective.server } });
|
|
24
|
+
try {
|
|
25
|
+
const r = await fetch(`${effective.server}/serviceController/getServiceTime`, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
body: new FormData(),
|
|
28
|
+
});
|
|
29
|
+
results.push({ name: 'server.reachable', ok: r.ok, detail: { status: r.status } });
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
results.push({ name: 'server.reachable', ok: false, detail: err.message });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
results.push({ name: 'config.load', ok: false, detail: err.message });
|
|
37
|
+
}
|
|
38
|
+
const allOk = results.every((r) => r.ok);
|
|
39
|
+
writeResult({
|
|
40
|
+
ok: allOk,
|
|
41
|
+
data: { checks: results },
|
|
42
|
+
error: allOk ? null : { code: 'ErrConfig', message: '一个或多个检查未通过' },
|
|
43
|
+
meta: { requestId: 'doctor', durationMs: 0, scopeChecked: [] },
|
|
44
|
+
}, { format });
|
|
45
|
+
if (!allOk)
|
|
46
|
+
process.exit(3);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo mcp install` — 把 zentodo-mcp 注入到 Claude Code / Claude Desktop /
|
|
3
|
+
* Cursor 等 MCP 客户端的配置里,省得用户手写 JSON。
|
|
4
|
+
*
|
|
5
|
+
* 注入的是一个标准 MCP server 条目:
|
|
6
|
+
*
|
|
7
|
+
* {
|
|
8
|
+
* "zentodo": {
|
|
9
|
+
* "command": "node",
|
|
10
|
+
* "args": ["<repo>/packages/mcp-server/dist/bin.js"],
|
|
11
|
+
* "env": { "ZENTODO_SERVER": "...", "ZENTODO_USR_KEY": "..." }
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* 不覆盖用户既有 `mcpServers` 字典里的其他 server。
|
|
16
|
+
*/
|
|
17
|
+
import { Command } from 'commander';
|
|
18
|
+
export declare function registerMcp(root: Command): void;
|
|
19
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkG/C"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo mcp install` — 把 zentodo-mcp 注入到 Claude Code / Claude Desktop /
|
|
3
|
+
* Cursor 等 MCP 客户端的配置里,省得用户手写 JSON。
|
|
4
|
+
*
|
|
5
|
+
* 注入的是一个标准 MCP server 条目:
|
|
6
|
+
*
|
|
7
|
+
* {
|
|
8
|
+
* "zentodo": {
|
|
9
|
+
* "command": "node",
|
|
10
|
+
* "args": ["<repo>/packages/mcp-server/dist/bin.js"],
|
|
11
|
+
* "env": { "ZENTODO_SERVER": "...", "ZENTODO_USR_KEY": "..." }
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
*
|
|
15
|
+
* 不覆盖用户既有 `mcpServers` 字典里的其他 server。
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { homedir, platform } from 'node:os';
|
|
19
|
+
import { dirname, join, resolve } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
import { getProfile, loadConfig } from '@zentodo/core';
|
|
22
|
+
const CLI_DIR = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
// dist/commands/mcp.js -> dist/commands -> dist -> cli -> packages -> repo
|
|
24
|
+
const REPO_ROOT = resolve(CLI_DIR, '..', '..', '..', '..');
|
|
25
|
+
const MCP_BIN = resolve(REPO_ROOT, 'packages', 'mcp-server', 'dist', 'bin.js');
|
|
26
|
+
export function registerMcp(root) {
|
|
27
|
+
const mcp = root.command('mcp').description('辅助把 ZenTodo MCP Server 集成到各 AI 客户端。');
|
|
28
|
+
mcp
|
|
29
|
+
.command('print-config')
|
|
30
|
+
.description('打印一份可以直接粘贴到 MCP 客户端配置里的 JSON 片段(不写文件)')
|
|
31
|
+
.option('--profile <name>', '使用哪个本地 Profile 取得 usrKey / server', undefined)
|
|
32
|
+
.option('--scopes <csv>', '授予的 scope', 'read,write,sync')
|
|
33
|
+
.option('--tool-scopes <csv>', '只注册指定领域的工具(例如 task,project,pomo)')
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
const entry = buildEntry(opts);
|
|
36
|
+
const snippet = {
|
|
37
|
+
mcpServers: {
|
|
38
|
+
zentodo: entry,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
process.stdout.write(JSON.stringify(snippet, null, 2) + '\n');
|
|
42
|
+
process.stderr.write('\n提示:把上面 mcpServers.zentodo 这段合并到你的 MCP 配置文件里即可。\n' +
|
|
43
|
+
' - Claude Code: ~/.claude.json 或 .claude.json\n' +
|
|
44
|
+
' - Claude Desktop macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\n' +
|
|
45
|
+
' - Claude Desktop Win: %APPDATA%\\Claude\\claude_desktop_config.json\n' +
|
|
46
|
+
' - Kiro / Cursor: 看对应 IDE 的 mcp.json\n');
|
|
47
|
+
});
|
|
48
|
+
mcp
|
|
49
|
+
.command('install <target>')
|
|
50
|
+
.description('把 ZenTodo MCP Server 写入指定客户端的配置文件。target: claude-code | claude-desktop | kiro | cursor')
|
|
51
|
+
.option('--profile <name>', '使用哪个本地 Profile 取得 usrKey / server')
|
|
52
|
+
.option('--scopes <csv>', '授予的 scope', 'read,write,sync')
|
|
53
|
+
.option('--tool-scopes <csv>', '只注册指定领域的工具(例如 task,project,pomo)')
|
|
54
|
+
.option('--config <path>', '覆盖默认配置文件路径')
|
|
55
|
+
.option('--name <name>', '写入的 server 名称', 'zentodo')
|
|
56
|
+
.option('--force', '若同名 server 已存在,强制覆盖', false)
|
|
57
|
+
.action(async (target, opts) => {
|
|
58
|
+
const info = resolveTarget(target, opts.config);
|
|
59
|
+
const entry = buildEntry(opts);
|
|
60
|
+
const existing = readJson(info.path);
|
|
61
|
+
if (!existing[info.topLevelKey] || typeof existing[info.topLevelKey] !== 'object') {
|
|
62
|
+
existing[info.topLevelKey] = {};
|
|
63
|
+
}
|
|
64
|
+
const servers = existing[info.topLevelKey];
|
|
65
|
+
if (servers[opts.name] && !opts.force) {
|
|
66
|
+
process.stderr.write(`配置里已经有名为 "${opts.name}" 的 MCP server。加 --force 覆盖,或用 --name 改名。\n`);
|
|
67
|
+
process.exit(2);
|
|
68
|
+
}
|
|
69
|
+
servers[opts.name] = entry;
|
|
70
|
+
writeJson(info.path, existing);
|
|
71
|
+
process.stdout.write([
|
|
72
|
+
`已写入 ${info.label} 配置:`,
|
|
73
|
+
` 文件:${info.path}`,
|
|
74
|
+
` Server 名称:${opts.name}`,
|
|
75
|
+
` MCP 入口:${entry.command} ${entry.args.join(' ')}`,
|
|
76
|
+
'',
|
|
77
|
+
'下一步:',
|
|
78
|
+
' 1. 确保已经执行过 `npm run build` (项目根目录),让 dist/bin.js 存在。',
|
|
79
|
+
' 2. 重启 AI 客户端。',
|
|
80
|
+
' 3. 在客户端里应该能看到名为 `zentodo` 的 MCP server,以及 zentodo.task.* 等工具。',
|
|
81
|
+
].join('\n') + '\n');
|
|
82
|
+
});
|
|
83
|
+
mcp
|
|
84
|
+
.command('uninstall <target>')
|
|
85
|
+
.description('从指定客户端的配置里移除 MCP server(不会删文件)')
|
|
86
|
+
.option('--config <path>', '覆盖默认配置文件路径')
|
|
87
|
+
.option('--name <name>', '要移除的 server 名称', 'zentodo')
|
|
88
|
+
.action(async (target, opts) => {
|
|
89
|
+
const info = resolveTarget(target, opts.config);
|
|
90
|
+
const existing = readJson(info.path);
|
|
91
|
+
const servers = (existing[info.topLevelKey] ?? {});
|
|
92
|
+
if (!servers[opts.name]) {
|
|
93
|
+
process.stdout.write(`配置里没有名为 "${opts.name}" 的 server,无需处理\n`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
delete servers[opts.name];
|
|
97
|
+
writeJson(info.path, existing);
|
|
98
|
+
process.stdout.write(`已从 ${info.path} 移除 MCP server "${opts.name}"\n`);
|
|
99
|
+
});
|
|
100
|
+
mcp
|
|
101
|
+
.command('where <target>')
|
|
102
|
+
.description('打印指定客户端的默认配置文件路径')
|
|
103
|
+
.action((target) => {
|
|
104
|
+
const info = resolveTarget(target);
|
|
105
|
+
process.stdout.write(info.path + '\n');
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function buildEntry(opts) {
|
|
109
|
+
const cfg = loadConfig();
|
|
110
|
+
let server = cfg.profiles[cfg.current_profile]?.server;
|
|
111
|
+
let usrKey = cfg.profiles[cfg.current_profile]?.user_key;
|
|
112
|
+
if (opts.profile) {
|
|
113
|
+
const { profile } = getProfile(cfg, opts.profile);
|
|
114
|
+
server = profile.server;
|
|
115
|
+
usrKey = profile.user_key;
|
|
116
|
+
}
|
|
117
|
+
const env = {
|
|
118
|
+
ZENTODO_SERVER: server ?? 'http://fwq.qmlist.net/xzbbserver',
|
|
119
|
+
ZENTODO_SCOPES: opts.scopes,
|
|
120
|
+
};
|
|
121
|
+
if (usrKey !== undefined && usrKey !== null) {
|
|
122
|
+
env['ZENTODO_USR_KEY'] = String(usrKey);
|
|
123
|
+
}
|
|
124
|
+
if (opts.toolScopes)
|
|
125
|
+
env['ZENTODO_TOOL_SCOPES'] = opts.toolScopes;
|
|
126
|
+
return {
|
|
127
|
+
command: 'node',
|
|
128
|
+
args: [MCP_BIN],
|
|
129
|
+
env,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function resolveTarget(target, override) {
|
|
133
|
+
if (override)
|
|
134
|
+
return { label: target, path: override, topLevelKey: 'mcpServers' };
|
|
135
|
+
const home = homedir();
|
|
136
|
+
const isWin = platform() === 'win32';
|
|
137
|
+
const isMac = platform() === 'darwin';
|
|
138
|
+
switch (target) {
|
|
139
|
+
case 'claude-code':
|
|
140
|
+
return { label: 'Claude Code', path: join(home, '.claude.json'), topLevelKey: 'mcpServers' };
|
|
141
|
+
case 'claude-desktop':
|
|
142
|
+
return {
|
|
143
|
+
label: 'Claude Desktop',
|
|
144
|
+
path: isWin
|
|
145
|
+
? join(process.env['APPDATA'] ?? join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json')
|
|
146
|
+
: isMac
|
|
147
|
+
? join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')
|
|
148
|
+
: join(home, '.config', 'Claude', 'claude_desktop_config.json'),
|
|
149
|
+
topLevelKey: 'mcpServers',
|
|
150
|
+
};
|
|
151
|
+
case 'kiro':
|
|
152
|
+
return { label: 'Kiro', path: join(home, '.kiro', 'settings', 'mcp.json'), topLevelKey: 'mcpServers' };
|
|
153
|
+
case 'cursor':
|
|
154
|
+
return {
|
|
155
|
+
label: 'Cursor',
|
|
156
|
+
path: isWin
|
|
157
|
+
? join(process.env['APPDATA'] ?? join(home, 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'cursor.mcp', 'mcp.json')
|
|
158
|
+
: join(home, '.cursor', 'mcp.json'),
|
|
159
|
+
topLevelKey: 'mcpServers',
|
|
160
|
+
};
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(`未知 target: ${target}。可选:claude-code | claude-desktop | kiro | cursor`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function readJson(path) {
|
|
166
|
+
if (!existsSync(path))
|
|
167
|
+
return {};
|
|
168
|
+
try {
|
|
169
|
+
const text = readFileSync(path, 'utf8');
|
|
170
|
+
if (!text.trim())
|
|
171
|
+
return {};
|
|
172
|
+
const parsed = JSON.parse(text);
|
|
173
|
+
return (parsed && typeof parsed === 'object' ? parsed : {});
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
throw new Error(`读取配置失败 ${path}: ${err.message}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function writeJson(path, data) {
|
|
180
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
181
|
+
writeFileSync(path, JSON.stringify(data, null, 2), 'utf8');
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../src/commands/raw.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyD/C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo raw` — 直接调用任意未登记的后端接口。
|
|
3
|
+
*/
|
|
4
|
+
import { buildContext } from '../context.js';
|
|
5
|
+
import { resolveFormat, writeResult } from '../output/format.js';
|
|
6
|
+
import { ErrCode, exitCodeOf } from '@zentodo/core';
|
|
7
|
+
export function registerRaw(root) {
|
|
8
|
+
root
|
|
9
|
+
.command('raw <path>')
|
|
10
|
+
.description('调用任意 zentodoserver 端点(FormData 参数,未纳入清单的逃生通道)')
|
|
11
|
+
.option('--method <method>', 'HTTP 方法', 'POST')
|
|
12
|
+
.option('--param <kv...>', '一条 FormData 字段,格式 key=value(可重复)', collect, [])
|
|
13
|
+
.action(async (path, opts, thisCmd) => {
|
|
14
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
15
|
+
const format = resolveFormat({
|
|
16
|
+
json: !!globalFlags['json'],
|
|
17
|
+
ndjson: !!globalFlags['ndjson'],
|
|
18
|
+
yaml: !!globalFlags['yaml'],
|
|
19
|
+
});
|
|
20
|
+
const ctx = await buildContext({
|
|
21
|
+
profile: globalFlags['profile'],
|
|
22
|
+
server: globalFlags['server'],
|
|
23
|
+
token: globalFlags['token'],
|
|
24
|
+
});
|
|
25
|
+
const body = new FormData();
|
|
26
|
+
if (ctx.usrKey !== undefined && ctx.usrKey !== null) {
|
|
27
|
+
body.append('usrKey', String(ctx.usrKey));
|
|
28
|
+
}
|
|
29
|
+
for (const p of opts.param) {
|
|
30
|
+
const idx = p.indexOf('=');
|
|
31
|
+
if (idx < 0)
|
|
32
|
+
continue;
|
|
33
|
+
body.append(p.slice(0, idx), p.slice(idx + 1));
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const result = await ctx.http.request({
|
|
37
|
+
method: opts.method === 'GET' ? 'GET' : 'POST',
|
|
38
|
+
path,
|
|
39
|
+
body,
|
|
40
|
+
});
|
|
41
|
+
writeResult({ ok: true, data: result.data, error: null, meta: result.meta }, { format });
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const msg = err.message;
|
|
45
|
+
const code = err.code ?? ErrCode.Unknown;
|
|
46
|
+
writeResult({
|
|
47
|
+
ok: false,
|
|
48
|
+
data: null,
|
|
49
|
+
error: { code, message: msg },
|
|
50
|
+
meta: { requestId: '-', durationMs: 0, scopeChecked: [] },
|
|
51
|
+
}, { format });
|
|
52
|
+
process.exit(exitCodeOf({ code, message: msg }));
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function collect(value, previous) {
|
|
57
|
+
return [...previous, value];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=raw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw.js","sourceRoot":"","sources":["../../src/commands/raw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyDlD"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo search <query>` — 跨实体关键字搜索。
|
|
3
|
+
*
|
|
4
|
+
* 后端无统一搜索端点,这里拉取各 list-all 表并在客户端做包含匹配。
|
|
5
|
+
*/
|
|
6
|
+
import { capabilityById, runCapability } from '@zentodo/core';
|
|
7
|
+
import { buildContext, requireAuth } from '../context.js';
|
|
8
|
+
import { resolveFormat, writeResult } from '../output/format.js';
|
|
9
|
+
const SOURCES = [
|
|
10
|
+
{ type: 'task', capability: 'task.list-all', titleFields: ['taskTitle', 'taskDescription'], keyField: 'taskKey', updatedField: 'taskUpdateTime' },
|
|
11
|
+
{ type: 'project', capability: 'project.list-all', titleFields: ['projectName'], keyField: 'projectKey' },
|
|
12
|
+
{ type: 'scene', capability: 'scene.list-all', titleFields: ['sceneName', 'sceneDescription'], keyField: 'sceneKey' },
|
|
13
|
+
{ type: 'target', capability: 'target.list-all', titleFields: ['targetTitle', 'targetDescription'], keyField: 'targetKey' },
|
|
14
|
+
{ type: 'label', capability: 'label.list-all', titleFields: ['labelName'], keyField: 'labelKey' },
|
|
15
|
+
{ type: 'timeline', capability: 'timeline.list-all', titleFields: ['timeLineTitle', 'timeLineContent'], keyField: 'timeLineKey' },
|
|
16
|
+
{ type: 'diary', capability: 'diary.title.list-all', titleFields: ['title'], keyField: 'mdTitleKey' },
|
|
17
|
+
];
|
|
18
|
+
export function registerSearch(root) {
|
|
19
|
+
root
|
|
20
|
+
.command('search <query>')
|
|
21
|
+
.description('跨任务 / 项目 / 场景 / 日记 / 标签的关键字搜索(客户端完成)')
|
|
22
|
+
.option('--in <csv>', '限制类型,逗号分隔(例如 task,project,diary)')
|
|
23
|
+
.option('--limit <n>', '最多返回结果数', '50')
|
|
24
|
+
.action(async (query, opts, thisCmd) => {
|
|
25
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
26
|
+
const format = resolveFormat({
|
|
27
|
+
json: !!globalFlags['json'],
|
|
28
|
+
ndjson: !!globalFlags['ndjson'],
|
|
29
|
+
yaml: !!globalFlags['yaml'],
|
|
30
|
+
});
|
|
31
|
+
const ctx = await buildContext(globalFlags);
|
|
32
|
+
requireAuth(ctx);
|
|
33
|
+
const filter = opts.in ? new Set(opts.in.split(',').map((s) => s.trim())) : null;
|
|
34
|
+
const needle = query.toLowerCase();
|
|
35
|
+
const hits = [];
|
|
36
|
+
for (const src of SOURCES) {
|
|
37
|
+
if (filter && !filter.has(src.type))
|
|
38
|
+
continue;
|
|
39
|
+
const spec = capabilityById(src.capability);
|
|
40
|
+
if (!spec)
|
|
41
|
+
continue;
|
|
42
|
+
const result = await runCapability(spec, {}, ctx);
|
|
43
|
+
if (!result.ok || !Array.isArray(result.data))
|
|
44
|
+
continue;
|
|
45
|
+
for (const row of result.data) {
|
|
46
|
+
const title = src.titleFields
|
|
47
|
+
.map((f) => row[f] ?? '')
|
|
48
|
+
.find((s) => s.length > 0) ?? '';
|
|
49
|
+
const haystack = src.titleFields
|
|
50
|
+
.map((f) => String(row[f] ?? ''))
|
|
51
|
+
.join('\n')
|
|
52
|
+
.toLowerCase();
|
|
53
|
+
if (!haystack.includes(needle))
|
|
54
|
+
continue;
|
|
55
|
+
hits.push({
|
|
56
|
+
type: src.type,
|
|
57
|
+
key: row[src.keyField] ?? null,
|
|
58
|
+
title,
|
|
59
|
+
snippet: haystack.substring(Math.max(0, haystack.indexOf(needle) - 20), Math.min(haystack.length, haystack.indexOf(needle) + 60)),
|
|
60
|
+
last_updated: src.updatedField ? row[src.updatedField] : undefined,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const limit = Number.parseInt(opts.limit, 10) || 50;
|
|
65
|
+
const limited = hits.slice(0, limit);
|
|
66
|
+
writeResult({
|
|
67
|
+
ok: true,
|
|
68
|
+
data: { total: hits.length, returned: limited.length, hits: limited },
|
|
69
|
+
error: null,
|
|
70
|
+
meta: { requestId: 'search', durationMs: 0, scopeChecked: ['read'] },
|
|
71
|
+
}, { format });
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA0EpD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo settings get|set|unset|export|import` — 本地用户偏好。
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { loadConfig, saveConfig, getProfile } from '@zentodo/core';
|
|
6
|
+
import { resolveFormat, writeResult } from '../output/format.js';
|
|
7
|
+
export function registerSettings(root) {
|
|
8
|
+
const s = root.command('settings').description('管理本地用户偏好(主题 / 布局 / 自定义设置)。');
|
|
9
|
+
s.command('get [key]')
|
|
10
|
+
.description('查看某一项或全部偏好')
|
|
11
|
+
.action(async (key, _opts, thisCmd) => {
|
|
12
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
13
|
+
const format = resolveFormat({
|
|
14
|
+
json: !!globalFlags['json'],
|
|
15
|
+
ndjson: !!globalFlags['ndjson'],
|
|
16
|
+
yaml: !!globalFlags['yaml'],
|
|
17
|
+
});
|
|
18
|
+
const cfg = loadConfig();
|
|
19
|
+
const { profile } = getProfile(cfg, globalFlags['profile']);
|
|
20
|
+
const settings = profile.settings ?? {};
|
|
21
|
+
writeResult({
|
|
22
|
+
ok: true,
|
|
23
|
+
data: key ? { [key]: settings[key] ?? null } : settings,
|
|
24
|
+
error: null,
|
|
25
|
+
meta: { requestId: 'settings.get', durationMs: 0, scopeChecked: [] },
|
|
26
|
+
}, { format });
|
|
27
|
+
});
|
|
28
|
+
s.command('set <key> <value>')
|
|
29
|
+
.description('设置偏好(value 会尝试按 JSON 解析)')
|
|
30
|
+
.action((key, value, _opts, thisCmd) => {
|
|
31
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
32
|
+
const cfg = loadConfig();
|
|
33
|
+
const { name, profile } = getProfile(cfg, globalFlags['profile']);
|
|
34
|
+
const settings = { ...(profile.settings ?? {}) };
|
|
35
|
+
settings[key] = coerce(value);
|
|
36
|
+
cfg.profiles[name] = { ...profile, settings };
|
|
37
|
+
saveConfig(cfg);
|
|
38
|
+
process.stdout.write(`ok\n`);
|
|
39
|
+
});
|
|
40
|
+
s.command('unset <key>')
|
|
41
|
+
.description('删除偏好')
|
|
42
|
+
.action((key, _opts, thisCmd) => {
|
|
43
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
44
|
+
const cfg = loadConfig();
|
|
45
|
+
const { name, profile } = getProfile(cfg, globalFlags['profile']);
|
|
46
|
+
const settings = { ...(profile.settings ?? {}) };
|
|
47
|
+
delete settings[key];
|
|
48
|
+
cfg.profiles[name] = { ...profile, settings };
|
|
49
|
+
saveConfig(cfg);
|
|
50
|
+
process.stdout.write(`ok\n`);
|
|
51
|
+
});
|
|
52
|
+
s.command('export <file>')
|
|
53
|
+
.description('导出当前 Profile 的全部偏好到文件')
|
|
54
|
+
.action((file, _opts, thisCmd) => {
|
|
55
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
56
|
+
const cfg = loadConfig();
|
|
57
|
+
const { profile } = getProfile(cfg, globalFlags['profile']);
|
|
58
|
+
writeFileSync(file, JSON.stringify(profile.settings ?? {}, null, 2), 'utf8');
|
|
59
|
+
process.stdout.write(`已写入 ${file}\n`);
|
|
60
|
+
});
|
|
61
|
+
s.command('import <file>')
|
|
62
|
+
.description('从 JSON 文件合并偏好')
|
|
63
|
+
.action((file, _opts, thisCmd) => {
|
|
64
|
+
const globalFlags = thisCmd.optsWithGlobals();
|
|
65
|
+
const cfg = loadConfig();
|
|
66
|
+
const { name, profile } = getProfile(cfg, globalFlags['profile']);
|
|
67
|
+
const existing = profile.settings ?? {};
|
|
68
|
+
const incoming = JSON.parse(readFileSync(file, 'utf8'));
|
|
69
|
+
cfg.profiles[name] = { ...profile, settings: { ...existing, ...incoming } };
|
|
70
|
+
saveConfig(cfg);
|
|
71
|
+
process.stdout.write(`ok\n`);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function coerce(v) {
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(v);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return v;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zentodo skill ...` — 把 ZenTodo 打包成符合 Claude Agent Skill 规范的目录 / zip。
|
|
3
|
+
*
|
|
4
|
+
* 产物结构:
|
|
5
|
+
*
|
|
6
|
+
* zentodo/
|
|
7
|
+
* SKILL.md <- 带 YAML frontmatter 的主文件
|
|
8
|
+
* references/
|
|
9
|
+
* commands.md <- 自动生成
|
|
10
|
+
* tools.md <- 自动生成
|
|
11
|
+
* error-codes.md <- 自动生成
|
|
12
|
+
* tools.json <- 机器可读工具清单
|
|
13
|
+
* examples/
|
|
14
|
+
* plan-my-day.md
|
|
15
|
+
* sync.md
|
|
16
|
+
* assets/ <- 预留
|
|
17
|
+
*
|
|
18
|
+
* 通过 `--zip` 打包为 `zentodo.zip`,可直接上传到 Claude.ai 或其他支持
|
|
19
|
+
* Skill 上传的客户端。
|
|
20
|
+
*/
|
|
21
|
+
import { Command } from 'commander';
|
|
22
|
+
export declare function registerSkill(root: Command): void;
|
|
23
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA0RjD"}
|