@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.
Files changed (83) hide show
  1. package/dist/bin.d.ts +3 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +8 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/audit.d.ts +6 -0
  6. package/dist/commands/audit.d.ts.map +1 -0
  7. package/dist/commands/audit.js +25 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/auth.d.ts +6 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +161 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/config.d.ts +6 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +66 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/data.d.ts +8 -0
  18. package/dist/commands/data.d.ts.map +1 -0
  19. package/dist/commands/data.js +223 -0
  20. package/dist/commands/data.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +6 -0
  22. package/dist/commands/doctor.d.ts.map +1 -0
  23. package/dist/commands/doctor.js +49 -0
  24. package/dist/commands/doctor.js.map +1 -0
  25. package/dist/commands/mcp.d.ts +19 -0
  26. package/dist/commands/mcp.d.ts.map +1 -0
  27. package/dist/commands/mcp.js +183 -0
  28. package/dist/commands/mcp.js.map +1 -0
  29. package/dist/commands/raw.d.ts +6 -0
  30. package/dist/commands/raw.d.ts.map +1 -0
  31. package/dist/commands/raw.js +59 -0
  32. package/dist/commands/raw.js.map +1 -0
  33. package/dist/commands/search.d.ts +8 -0
  34. package/dist/commands/search.d.ts.map +1 -0
  35. package/dist/commands/search.js +74 -0
  36. package/dist/commands/search.js.map +1 -0
  37. package/dist/commands/settings.d.ts +6 -0
  38. package/dist/commands/settings.d.ts.map +1 -0
  39. package/dist/commands/settings.js +82 -0
  40. package/dist/commands/settings.js.map +1 -0
  41. package/dist/commands/skill.d.ts +23 -0
  42. package/dist/commands/skill.d.ts.map +1 -0
  43. package/dist/commands/skill.js +280 -0
  44. package/dist/commands/skill.js.map +1 -0
  45. package/dist/commands/stats.d.ts +6 -0
  46. package/dist/commands/stats.d.ts.map +1 -0
  47. package/dist/commands/stats.js +163 -0
  48. package/dist/commands/stats.js.map +1 -0
  49. package/dist/commands/sync.d.ts +6 -0
  50. package/dist/commands/sync.d.ts.map +1 -0
  51. package/dist/commands/sync.js +142 -0
  52. package/dist/commands/sync.js.map +1 -0
  53. package/dist/context.d.ts +28 -0
  54. package/dist/context.d.ts.map +1 -0
  55. package/dist/context.js +54 -0
  56. package/dist/context.js.map +1 -0
  57. package/dist/generate.d.ts +6 -0
  58. package/dist/generate.d.ts.map +1 -0
  59. package/dist/generate.js +163 -0
  60. package/dist/generate.js.map +1 -0
  61. package/dist/index.d.ts +3 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +3 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/output/format.d.ts +19 -0
  66. package/dist/output/format.d.ts.map +1 -0
  67. package/dist/output/format.js +99 -0
  68. package/dist/output/format.js.map +1 -0
  69. package/dist/program.d.ts +3 -0
  70. package/dist/program.d.ts.map +1 -0
  71. package/dist/program.js +59 -0
  72. package/dist/program.js.map +1 -0
  73. package/package.json +54 -0
  74. package/scripts/postinstall.mjs +56 -0
  75. package/skills/zentodo/SKILL.md +231 -0
  76. package/skills/zentodo/examples/plan-my-day.md +12 -0
  77. package/skills/zentodo/examples/sync.md +9 -0
  78. package/skills/zentodo/references/commands.md +1413 -0
  79. package/skills/zentodo/references/error-codes.md +62 -0
  80. package/skills/zentodo/references/mapping.md +115 -0
  81. package/skills/zentodo/references/tools.json +4008 -0
  82. package/skills/zentodo/references/tools.md +1346 -0
  83. 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,6 @@
1
+ /**
2
+ * `zentodo raw` — 直接调用任意未登记的后端接口。
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerRaw(root: Command): void;
6
+ //# sourceMappingURL=raw.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * `zentodo search <query>` — 跨实体关键字搜索。
3
+ *
4
+ * 后端无统一搜索端点,这里拉取各 list-all 表并在客户端做包含匹配。
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function registerSearch(root: Command): void;
8
+ //# sourceMappingURL=search.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * `zentodo settings get|set|unset|export|import` — 本地用户偏好。
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerSettings(root: Command): void;
6
+ //# sourceMappingURL=settings.d.ts.map
@@ -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"}