@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 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Resolve runtime context from config + env + CLI flags for every command.
3
+ */
4
+ import { type RunContext } from '@zentodo/core';
5
+ export interface GlobalFlags {
6
+ profile?: string;
7
+ server?: string;
8
+ token?: string;
9
+ logLevel?: string;
10
+ logFile?: string;
11
+ noRetry?: boolean;
12
+ noColor?: boolean;
13
+ dryRun?: boolean;
14
+ yes?: boolean;
15
+ local?: boolean;
16
+ remote?: boolean;
17
+ json?: boolean;
18
+ ndjson?: boolean;
19
+ yaml?: boolean;
20
+ quiet?: boolean;
21
+ }
22
+ export interface CliContext extends RunContext {
23
+ profileName: string;
24
+ flags: GlobalFlags;
25
+ }
26
+ export declare function buildContext(flags: GlobalFlags): Promise<CliContext>;
27
+ export declare function requireAuth(ctx: CliContext): void;
28
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAUL,KAAK,UAAU,EAEhB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA2C1E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAMjD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Resolve runtime context from config + env + CLI flags for every command.
3
+ */
4
+ import { HttpClient, applyEnvOverrides, createSecretStore, ensureHome, getProfile, loadConfig, verifyToken, ZenError, ErrCode, } from '@zentodo/core';
5
+ export async function buildContext(flags) {
6
+ ensureHome();
7
+ const cfg = loadConfig();
8
+ const { name, profile } = getProfile(cfg, flags.profile);
9
+ const effective = applyEnvOverrides(profile);
10
+ if (flags.server)
11
+ effective.server = flags.server;
12
+ const secrets = await createSecretStore();
13
+ const tokenRaw = flags.token ?? process.env['ZENTODO_TOKEN'] ?? (await secrets.get(name)) ?? '';
14
+ let usrKey = effective.user_key;
15
+ let grantedScopes = [];
16
+ if (tokenRaw) {
17
+ const secretMaterial = await secrets.get(`${name}:hmac-secret`);
18
+ if (secretMaterial) {
19
+ try {
20
+ const payload = verifyToken(tokenRaw, secretMaterial);
21
+ usrKey = payload.usrKey;
22
+ grantedScopes = payload.scopes;
23
+ }
24
+ catch {
25
+ // Fall back to the embedded config usrKey with no scopes.
26
+ }
27
+ }
28
+ }
29
+ const http = new HttpClient({
30
+ baseUrl: effective.server,
31
+ qps: effective.rate_limit_qps,
32
+ retry: effective.retry
33
+ ? { attempts: effective.retry.attempts, baseMs: effective.retry.base_ms }
34
+ : undefined,
35
+ noRetry: flags.noRetry,
36
+ userAgent: 'zentodo-cli/0.1.0',
37
+ });
38
+ return {
39
+ profileName: name,
40
+ flags,
41
+ http,
42
+ usrKey,
43
+ grantedScopes,
44
+ dryRun: flags.dryRun,
45
+ };
46
+ }
47
+ export function requireAuth(ctx) {
48
+ if (ctx.usrKey === undefined || ctx.usrKey === null || ctx.usrKey === '') {
49
+ throw new ZenError(ErrCode.EnoAuth, 'no credentials for this profile', {
50
+ hint: 'Run `zentodo auth login-password --email ... --password ...` first.',
51
+ });
52
+ }
53
+ }
54
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,GAGR,MAAM,eAAe,CAAC;AAyBvB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAkB;IACnD,UAAU,EAAE,CAAC;IACb,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GACZ,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACjF,IAAI,MAAM,GAAgC,SAAS,CAAC,QAAQ,CAAC;IAC7D,IAAI,aAAa,GAAqB,EAAE,CAAC;IACzC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBACtD,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;gBACxB,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,0DAA0D;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;QAC1B,OAAO,EAAE,SAAS,CAAC,MAAM;QACzB,GAAG,EAAE,SAAS,CAAC,cAAc;QAC7B,KAAK,EAAE,SAAS,CAAC,KAAK;YACpB,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE;YACzE,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,mBAAmB;KAC/B,CAAC,CAAC;IAEH,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,KAAK;QACL,IAAI;QACJ,MAAM;QACN,aAAa;QACb,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAe;IACzC,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACzE,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,iCAAiC,EAAE;YACrE,IAAI,EAAE,qEAAqE;SAC5E,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 根据清单自动注册 CLI 子命令。
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function registerGenerated(root: Command): void;
6
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAW5C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA6DrD"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * 根据清单自动注册 CLI 子命令。
3
+ */
4
+ import { Option } from 'commander';
5
+ import { CAPABILITIES, exitCodeOf, runCapability, } from '@zentodo/core';
6
+ import { buildContext } from './context.js';
7
+ import { resolveFormat, writeResult } from './output/format.js';
8
+ export function registerGenerated(root) {
9
+ const groups = new Map();
10
+ for (const existing of root.commands) {
11
+ groups.set(existing.name(), existing);
12
+ }
13
+ for (const cap of CAPABILITIES) {
14
+ if (!cap.cli)
15
+ continue;
16
+ const groupName = cap.cli.group;
17
+ let group = groups.get(groupName);
18
+ if (!group) {
19
+ group = root
20
+ .command(groupName)
21
+ .description(describeGroup(groupName));
22
+ groups.set(groupName, group);
23
+ }
24
+ if (group.commands.some((c) => c.name() === cap.cli.command))
25
+ continue;
26
+ const cmd = group
27
+ .command(cap.cli.command)
28
+ .description(cap.summary);
29
+ for (const alias of cap.cli.aliases ?? [])
30
+ cmd.alias(alias);
31
+ for (const p of cap.params)
32
+ attachOption(cmd, p);
33
+ if (cap.destructive) {
34
+ cmd.option('--yes', '跳过破坏性操作的确认');
35
+ }
36
+ cmd.action(async (_args, thisCmd) => {
37
+ const flags = thisCmd.optsWithGlobals();
38
+ const globalFlags = pickGlobalFlags(flags);
39
+ const format = resolveFormat(globalFlags);
40
+ try {
41
+ const ctx = await buildContext(globalFlags);
42
+ const input = optsToInput(cap, flags);
43
+ const result = await runCapability(cap, input, ctx);
44
+ writeResult(result, { format, color: !globalFlags.noColor });
45
+ if (!result.ok)
46
+ process.exit(exitCodeOf(result.error));
47
+ }
48
+ catch (err) {
49
+ const msg = err.message || String(err);
50
+ if (format === 'json' || format === 'ndjson') {
51
+ process.stdout.write(JSON.stringify({
52
+ ok: false,
53
+ data: null,
54
+ error: { code: err.code ?? 'ErrUnknown', message: msg },
55
+ meta: { requestId: '-', durationMs: 0, scopeChecked: cap.scopes },
56
+ }) + '\n');
57
+ }
58
+ else {
59
+ process.stderr.write(`错误: ${msg}\n`);
60
+ }
61
+ process.exit(exitCodeOf({ code: err.code ?? 'ErrUnknown', message: msg }));
62
+ }
63
+ });
64
+ }
65
+ }
66
+ function attachOption(cmd, p) {
67
+ const flag = `--${toKebab(p.name)} <value>`;
68
+ const option = new Option(flag, p.description);
69
+ if (p.default !== undefined)
70
+ option.default(p.default);
71
+ if (p.type === 'enum' && p.enumValues)
72
+ option.choices([...p.enumValues]);
73
+ if (p.required)
74
+ option.makeOptionMandatory(true);
75
+ cmd.addOption(option);
76
+ }
77
+ function optsToInput(cap, opts) {
78
+ const input = {};
79
+ for (const p of cap.params) {
80
+ const key = toCamel(p.name);
81
+ const v = opts[key];
82
+ if (v === undefined)
83
+ continue;
84
+ input[p.name] = coerce(p, v);
85
+ }
86
+ return input;
87
+ }
88
+ function coerce(p, v) {
89
+ if (typeof v !== 'string')
90
+ return v;
91
+ switch (p.type) {
92
+ case 'integer':
93
+ return Number.parseInt(v, 10);
94
+ case 'number':
95
+ return Number.parseFloat(v);
96
+ case 'boolean':
97
+ return v === 'true' || v === '1' || v === 'yes';
98
+ case 'array':
99
+ return v.split(',').map((s) => s.trim()).filter(Boolean);
100
+ default:
101
+ return v;
102
+ }
103
+ }
104
+ function toKebab(name) {
105
+ return name.replace(/_/g, '-');
106
+ }
107
+ function toCamel(name) {
108
+ return name.replace(/-([a-z0-9])/g, (_, c) => c.toUpperCase())
109
+ .replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
110
+ }
111
+ function pickGlobalFlags(flags) {
112
+ return {
113
+ profile: flags['profile'],
114
+ server: flags['server'],
115
+ token: flags['token'],
116
+ logLevel: flags['logLevel'],
117
+ logFile: flags['logFile'],
118
+ noRetry: !!flags['noRetry'],
119
+ noColor: !!flags['noColor'],
120
+ dryRun: !!flags['dryRun'],
121
+ yes: !!flags['yes'],
122
+ local: !!flags['local'],
123
+ remote: !!flags['remote'],
124
+ json: !!flags['json'],
125
+ ndjson: !!flags['ndjson'],
126
+ yaml: !!flags['yaml'],
127
+ quiet: !!flags['quiet'],
128
+ };
129
+ }
130
+ /**
131
+ * 给自动生成的命令组一段中文描述。
132
+ */
133
+ function describeGroup(name) {
134
+ const map = {
135
+ auth: '登录与 Token 管理',
136
+ user: '用户资料与奖励币 / VIP',
137
+ task: '任务增删改查 / 完成 / MIT / 四象限 / 日历',
138
+ subtask: '子任务管理',
139
+ project: '项目管理',
140
+ subproject: '子项目管理',
141
+ scene: '场景管理',
142
+ target: '长期目标管理',
143
+ label: '标签管理(含背景图上传)',
144
+ toplabel: '顶级标签管理',
145
+ quadrant: '四象限配置',
146
+ timeline: '时间轴条目',
147
+ attach: '附件上传与同步',
148
+ pomo: '番茄钟启动 / 停止 / 历史 / 配置',
149
+ timer: '自由计时(非番茄钟)',
150
+ workstate: '工作状态(开始 / 结束 / 当前)',
151
+ diary: '晨间日记(标题 + 内容)',
152
+ mindmap: '思维导图元数据',
153
+ reward: '奖励商店与兑换记录',
154
+ fasttime: '快速时间记录',
155
+ wheel: '滚轮视图配置',
156
+ invite: '邀请列表',
157
+ app: 'App 版本与服务器时间',
158
+ pay: '价格 / 订单信息 / 优惠券(只读)',
159
+ sync: '同步编排(状态 / 增量 / 全量)',
160
+ };
161
+ return map[name] ?? `${name} 命令`;
162
+ }
163
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { buildProgram } from './program.js';
2
+ export { buildContext } from './context.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { buildProgram } from './program.js';
2
+ export { buildContext } from './context.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI 输出格式化。
3
+ *
4
+ * 不变式:`--json` 的结构与 MCP 工具的 outputSchema 严格一致(单一真相)。
5
+ */
6
+ import { type ApiResult } from '@zentodo/core';
7
+ export type OutputFormat = 'text' | 'json' | 'ndjson' | 'yaml';
8
+ export interface FormatOptions {
9
+ format: OutputFormat;
10
+ color?: boolean;
11
+ }
12
+ export declare function writeResult<T>(result: ApiResult<T>, opts: FormatOptions): void;
13
+ export declare function resolveFormat(flags: {
14
+ json?: boolean;
15
+ ndjson?: boolean;
16
+ yaml?: boolean;
17
+ quiet?: boolean;
18
+ }): OutputFormat;
19
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/output/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAmB9E;AA4DD,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,YAAY,CAUf"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * CLI 输出格式化。
3
+ *
4
+ * 不变式:`--json` 的结构与 MCP 工具的 outputSchema 严格一致(单一真相)。
5
+ */
6
+ export function writeResult(result, opts) {
7
+ if (opts.format === 'json') {
8
+ process.stdout.write(JSON.stringify(result, null, 2) + '\n');
9
+ return;
10
+ }
11
+ if (opts.format === 'ndjson') {
12
+ process.stdout.write(JSON.stringify(result) + '\n');
13
+ return;
14
+ }
15
+ if (opts.format === 'yaml') {
16
+ process.stdout.write(toYaml(result) + '\n');
17
+ return;
18
+ }
19
+ // text
20
+ if (!result.ok) {
21
+ process.stderr.write(formatError(result, opts) + '\n');
22
+ return;
23
+ }
24
+ process.stdout.write(formatSuccess(result, opts) + '\n');
25
+ }
26
+ function formatSuccess(result, _opts) {
27
+ const data = result.data;
28
+ if (data === null || data === undefined)
29
+ return '完成';
30
+ if (typeof data === 'string' || typeof data === 'number' || typeof data === 'boolean') {
31
+ return String(data);
32
+ }
33
+ if (Array.isArray(data)) {
34
+ return data.length === 0 ? '(空列表)' : data.map((row) => stringifyRow(row)).join('\n');
35
+ }
36
+ return stringifyRow(data);
37
+ }
38
+ function formatError(result, _opts) {
39
+ const err = result.error;
40
+ const lines = [`错误: ${err.code}: ${err.message}`];
41
+ if (err.hint)
42
+ lines.push(`提示: ${err.hint}`);
43
+ if (err.detail)
44
+ lines.push(`详情: ${safeStringify(err.detail)}`);
45
+ return lines.join('\n');
46
+ }
47
+ function stringifyRow(v) {
48
+ if (v === null || v === undefined)
49
+ return '-';
50
+ if (typeof v !== 'object')
51
+ return String(v);
52
+ try {
53
+ return JSON.stringify(v);
54
+ }
55
+ catch {
56
+ return String(v);
57
+ }
58
+ }
59
+ function safeStringify(v) {
60
+ try {
61
+ return JSON.stringify(v);
62
+ }
63
+ catch {
64
+ return String(v);
65
+ }
66
+ }
67
+ function toYaml(v, indent = 0) {
68
+ const pad = ' '.repeat(indent);
69
+ if (v === null || v === undefined)
70
+ return `${pad}null`;
71
+ if (typeof v !== 'object')
72
+ return `${pad}${String(v)}`;
73
+ if (Array.isArray(v)) {
74
+ if (v.length === 0)
75
+ return `${pad}[]`;
76
+ return v.map((item) => `${pad}- ${toYaml(item, indent + 1).trim()}`).join('\n');
77
+ }
78
+ const entries = Object.entries(v);
79
+ if (entries.length === 0)
80
+ return `${pad}{}`;
81
+ return entries
82
+ .map(([k, val]) => {
83
+ if (val !== null && typeof val === 'object') {
84
+ return `${pad}${k}:\n${toYaml(val, indent + 1)}`;
85
+ }
86
+ return `${pad}${k}: ${stringifyRow(val)}`;
87
+ })
88
+ .join('\n');
89
+ }
90
+ export function resolveFormat(flags) {
91
+ const picks = [flags.json && 'json', flags.ndjson && 'ndjson', flags.yaml && 'yaml'].filter(Boolean);
92
+ if (picks.length > 1) {
93
+ throw Object.assign(new Error('只能同时使用 --json / --ndjson / --yaml 中的一个'), {
94
+ code: 'ErrInvalidFlags',
95
+ });
96
+ }
97
+ return (picks[0] ?? 'text');
98
+ }
99
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/output/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function buildProgram(): Command;
3
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,YAAY,IAAI,OAAO,CA8CtC"}
@@ -0,0 +1,59 @@
1
+ import { Command } from 'commander';
2
+ import { registerAudit } from './commands/audit.js';
3
+ import { registerAuth } from './commands/auth.js';
4
+ import { registerConfig } from './commands/config.js';
5
+ import { registerData } from './commands/data.js';
6
+ import { registerDoctor } from './commands/doctor.js';
7
+ import { registerMcp } from './commands/mcp.js';
8
+ import { registerRaw } from './commands/raw.js';
9
+ import { registerSearch } from './commands/search.js';
10
+ import { registerSettings } from './commands/settings.js';
11
+ import { registerSkill } from './commands/skill.js';
12
+ import { registerStats } from './commands/stats.js';
13
+ import { registerSync } from './commands/sync.js';
14
+ import { registerGenerated } from './generate.js';
15
+ export function buildProgram() {
16
+ const program = new Command();
17
+ program
18
+ .name('zentodo')
19
+ .description('ZenTodo 命令行工具 — 基于清单驱动,连接 ZenTodo 后端。所有请求使用 FormData。')
20
+ .version('0.1.0', '-V, --version', '打印 CLI 版本')
21
+ .helpOption('-h, --help', '显示帮助信息')
22
+ .addHelpCommand('help [command]', '查看命令帮助')
23
+ .option('--profile <name>', '使用指定 Profile(默认使用 current_profile)')
24
+ .option('--server <url>', '覆盖后端地址')
25
+ .option('--token <token>', '覆盖本地 Token')
26
+ .option('--log-level <level>', '日志级别:trace|debug|info|warn|error', 'info')
27
+ .option('--log-file <path>', '追加日志到指定文件')
28
+ .option('--no-retry', '禁用自动重试')
29
+ .option('--no-color', '关闭彩色输出')
30
+ .option('--dry-run', '只打印将发送的请求,不真正调用后端')
31
+ .option('--yes', '跳过破坏性操作的确认提示')
32
+ .option('--local', '优先使用本地 SQLite(若可用)')
33
+ .option('--remote', '强制使用远程 HTTP 模式')
34
+ .option('--json', 'JSON 输出')
35
+ .option('--ndjson', '按行输出 JSON(适合流式处理)')
36
+ .option('--yaml', 'YAML 输出')
37
+ .option('--quiet', '隐藏非必要输出');
38
+ program
39
+ .command('version-full')
40
+ .description('打印版本号与协议兼容版本')
41
+ .action(() => {
42
+ process.stdout.write(JSON.stringify({ version: '0.1.0', apiCompat: 'v1' }) + '\n');
43
+ });
44
+ registerAuth(program);
45
+ registerConfig(program);
46
+ registerDoctor(program);
47
+ registerRaw(program);
48
+ registerSync(program);
49
+ registerStats(program);
50
+ registerSearch(program);
51
+ registerData(program);
52
+ registerSettings(program);
53
+ registerAudit(program);
54
+ registerMcp(program);
55
+ registerSkill(program);
56
+ registerGenerated(program);
57
+ return program;
58
+ }
59
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@zentodo/cli",
3
+ "version": "0.1.0",
4
+ "description": "ZenTodo 命令行工具 — 为 AI Agent 和开发者设计,覆盖任务、项目、番茄钟、日记、同步等全部能力。安装后自动配置 Claude Agent Skill。",
5
+ "type": "module",
6
+ "bin": {
7
+ "zentodo": "./dist/bin.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist/",
13
+ "skills/",
14
+ "scripts/postinstall.mjs",
15
+ "README.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.json",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit",
20
+ "test": "vitest run",
21
+ "clean": "rimraf dist *.tsbuildinfo skills/",
22
+ "start": "node dist/bin.js",
23
+ "postinstall": "node scripts/postinstall.mjs",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "zentodo",
28
+ "todo",
29
+ "task",
30
+ "pomodoro",
31
+ "cli",
32
+ "ai-agent",
33
+ "skill",
34
+ "claude"
35
+ ],
36
+ "dependencies": {
37
+ "@zentodo/core": "*",
38
+ "commander": "^12.1.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^22.5.0",
42
+ "rimraf": "^5.0.10",
43
+ "typescript": "^5.5.4",
44
+ "vitest": "^2.0.5"
45
+ },
46
+ "engines": {
47
+ "node": ">=18"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/YOUR_GITHUB_USERNAME/ZenTodoProject.git"
52
+ },
53
+ "homepage": "https://github.com/YOUR_GITHUB_USERNAME/ZenTodoProject#readme"
54
+ }
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * npm install -g @zentodo/cli 之后自动运行。
4
+ *
5
+ * 把打包在 npm 包里的 skills/zentodo/ 目录复制到
6
+ * ~/.claude/skills/zentodo/,让 Claude Code / Claude Desktop
7
+ * 下次启动时自动加载 ZenTodo Skill。
8
+ *
9
+ * 如果复制失败(权限问题、目录不存在等),只打印警告,不中断安装。
10
+ */
11
+
12
+ import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs';
13
+ import { homedir } from 'node:os';
14
+ import { dirname, join } from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+
17
+ const PKG_DIR = dirname(fileURLToPath(import.meta.url));
18
+ // scripts/postinstall.mjs -> scripts -> cli package root
19
+ const CLI_ROOT = join(PKG_DIR, '..');
20
+ const SKILL_SRC = join(CLI_ROOT, 'skills', 'zentodo');
21
+ const SKILL_DEST = join(homedir(), '.claude', 'skills', 'zentodo');
22
+
23
+ function run() {
24
+ if (!existsSync(SKILL_SRC)) {
25
+ // 开发环境直接跑源码时 skills/ 可能还没生成,静默跳过
26
+ return;
27
+ }
28
+
29
+ try {
30
+ if (existsSync(SKILL_DEST)) {
31
+ rmSync(SKILL_DEST, { recursive: true, force: true });
32
+ }
33
+ mkdirSync(SKILL_DEST, { recursive: true });
34
+ cpSync(SKILL_SRC, SKILL_DEST, { recursive: true });
35
+
36
+ console.log('');
37
+ console.log('✅ ZenTodo Skill 已安装到:', SKILL_DEST);
38
+ console.log('');
39
+ console.log('下一步:');
40
+ console.log(' 1. 登录 ZenTodo:');
41
+ console.log(' zentodo auth login-password --email 你的邮箱 --password 你的密码');
42
+ console.log('');
43
+ console.log(' 2. 重启 Claude Code / Claude Desktop');
44
+ console.log('');
45
+ console.log(' 3. 在 Claude 里说: "帮我看看 ZenTodo 今天的 MIT 任务"');
46
+ console.log('');
47
+ } catch (err) {
48
+ // 不中断安装,只警告
49
+ console.warn('');
50
+ console.warn('⚠️ ZenTodo Skill 自动安装失败:', err.message);
51
+ console.warn(' 手动安装: zentodo skill install claude-code');
52
+ console.warn('');
53
+ }
54
+ }
55
+
56
+ run();