@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 @@
|
|
|
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"}
|
package/dist/context.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/generate.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/program.js
ADDED
|
@@ -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();
|