@birdmichael/ccsync 1.0.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/README.md +241 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +5 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +111 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +9 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +51 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/hello/index.d.ts +13 -0
- package/dist/commands/hello/index.d.ts.map +1 -0
- package/dist/commands/hello/index.js +20 -0
- package/dist/commands/hello/index.js.map +1 -0
- package/dist/commands/hello/world.d.ts +9 -0
- package/dist/commands/hello/world.d.ts.map +1 -0
- package/dist/commands/hello/world.js +15 -0
- package/dist/commands/hello/world.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +101 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/menu.d.ts +13 -0
- package/dist/commands/menu.d.ts.map +1 -0
- package/dist/commands/menu.js +190 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +270 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +7 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +16 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +7 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +16 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +33 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/test.d.ts +8 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +27 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/toggle.d.ts +7 -0
- package/dist/commands/toggle.d.ts.map +1 -0
- package/dist/commands/toggle.js +22 -0
- package/dist/commands/toggle.js.map +1 -0
- package/dist/core/config-manager.d.ts +19 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +174 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/launch-agent.d.ts +12 -0
- package/dist/core/launch-agent.d.ts.map +1 -0
- package/dist/core/launch-agent.js +89 -0
- package/dist/core/launch-agent.js.map +1 -0
- package/dist/core/permission-manager.d.ts +18 -0
- package/dist/core/permission-manager.d.ts.map +1 -0
- package/dist/core/permission-manager.js +94 -0
- package/dist/core/permission-manager.js.map +1 -0
- package/dist/core/service-manager.d.ts +33 -0
- package/dist/core/service-manager.d.ts.map +1 -0
- package/dist/core/service-manager.js +108 -0
- package/dist/core/service-manager.js.map +1 -0
- package/dist/core/sync-service.d.ts +29 -0
- package/dist/core/sync-service.d.ts.map +1 -0
- package/dist/core/sync-service.js +180 -0
- package/dist/core/sync-service.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/syncers/base-syncer.d.ts +5 -0
- package/dist/syncers/base-syncer.d.ts.map +1 -0
- package/dist/syncers/base-syncer.js +3 -0
- package/dist/syncers/base-syncer.js.map +1 -0
- package/dist/syncers/mcp-syncer.d.ts +16 -0
- package/dist/syncers/mcp-syncer.d.ts.map +1 -0
- package/dist/syncers/mcp-syncer.js +116 -0
- package/dist/syncers/mcp-syncer.js.map +1 -0
- package/dist/syncers/skills-syncer.d.ts +13 -0
- package/dist/syncers/skills-syncer.d.ts.map +1 -0
- package/dist/syncers/skills-syncer.js +153 -0
- package/dist/syncers/skills-syncer.js.map +1 -0
- package/dist/types/config.d.ts +53 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +33 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/mcp.d.ts +20 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +3 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/sync.d.ts +44 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +3 -0
- package/dist/types/sync.js.map +1 -0
- package/dist/types/ui.d.ts +263 -0
- package/dist/types/ui.d.ts.map +1 -0
- package/dist/types/ui.js +3 -0
- package/dist/types/ui.js.map +1 -0
- package/dist/ui/config/index.d.ts +12 -0
- package/dist/ui/config/index.d.ts.map +1 -0
- package/dist/ui/config/index.js +43 -0
- package/dist/ui/config/index.js.map +1 -0
- package/dist/ui/dashboard/index.d.ts +14 -0
- package/dist/ui/dashboard/index.d.ts.map +1 -0
- package/dist/ui/dashboard/index.js +90 -0
- package/dist/ui/dashboard/index.js.map +1 -0
- package/dist/ui/error/index.d.ts +13 -0
- package/dist/ui/error/index.d.ts.map +1 -0
- package/dist/ui/error/index.js +27 -0
- package/dist/ui/error/index.js.map +1 -0
- package/dist/ui/setup/index.d.ts +11 -0
- package/dist/ui/setup/index.d.ts.map +1 -0
- package/dist/ui/setup/index.js +18 -0
- package/dist/ui/setup/index.js.map +1 -0
- package/dist/utils/error-handler.d.ts +21 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +178 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/file-watcher.d.ts +17 -0
- package/dist/utils/file-watcher.d.ts.map +1 -0
- package/dist/utils/file-watcher.js +92 -0
- package/dist/utils/file-watcher.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/texts.d.ts +263 -0
- package/dist/utils/texts.d.ts.map +1 -0
- package/dist/utils/texts.js +270 -0
- package/dist/utils/texts.js.map +1 -0
- package/dist/utils/time-helper.d.ts +8 -0
- package/dist/utils/time-helper.d.ts.map +1 -0
- package/dist/utils/time-helper.js +67 -0
- package/dist/utils/time-helper.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
import { serviceManager } from '../core/service-manager';
|
|
4
|
+
import { TEXTS } from '../utils/texts';
|
|
5
|
+
export default class Start extends Command {
|
|
6
|
+
static description = TEXTS.commands.start;
|
|
7
|
+
async run() {
|
|
8
|
+
try {
|
|
9
|
+
await serviceManager.start();
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
this.error(`启动失败:${error instanceof Error ? error.message : String(error)}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IAE1C,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
import { configManager } from '../core/config-manager';
|
|
4
|
+
import { TEXTS } from '../utils/texts';
|
|
5
|
+
import { formatUptime } from '../utils/time-helper';
|
|
6
|
+
class Status extends Command {
|
|
7
|
+
static description = TEXTS.commands.status;
|
|
8
|
+
async run() {
|
|
9
|
+
const config = configManager.getConfig();
|
|
10
|
+
console.log('');
|
|
11
|
+
console.log('┌──────────────────────────────────────┐');
|
|
12
|
+
console.log('│' + TEXTS.status.title + ' '.repeat(34) + '│');
|
|
13
|
+
console.log('├──────────────────────────────────────┤');
|
|
14
|
+
console.log('');
|
|
15
|
+
// 服务状态
|
|
16
|
+
const serviceStatus = config.service.running ? '● ' : '○ ';
|
|
17
|
+
const statusText = config.service.running ? TEXTS.status.running : TEXTS.status.stopped;
|
|
18
|
+
console.log('│ 服务:' + serviceStatus + ' ' + statusText);
|
|
19
|
+
if (config.service.running && config.service.pid) {
|
|
20
|
+
console.log('│ ' + TEXTS.status.pid + ':' + config.service.pid + ' '.repeat(28) + '│');
|
|
21
|
+
}
|
|
22
|
+
if (config.service.uptime) {
|
|
23
|
+
console.log('│ ' + TEXTS.status.uptime + ':' + formatUptime(config.service.uptime) + ' '.repeat(22) + '│');
|
|
24
|
+
}
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log('├─────────────────────────────────────────────┤');
|
|
27
|
+
// Skills 状态
|
|
28
|
+
console.log('│ ' + TEXTS.status.skills + ':' + TEXTS.status.synced + ' ' + (config.skills ? config.skills.count : 0));
|
|
29
|
+
if (config.skills && config.skills.claude) {
|
|
30
|
+
console.log('│ └─ ' + TEXTS.dashboard.skills.claudeSkills + ':' + config.skills.claude.length + ' 个 Skills' + ' '.repeat(18) + '│');
|
|
31
|
+
}
|
|
32
|
+
if (config.skills && config.skills.codex) {
|
|
33
|
+
console.log('│ └─ ' + TEXTS.dashboard.skills.codexSkills + ':' + config.skills.codex.length + ' 个 Skills' + ' '.repeat(17) + '│');
|
|
34
|
+
}
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log('├─────────────────────────────────────────────┤');
|
|
37
|
+
// MCP 状态
|
|
38
|
+
console.log('│ ' + TEXTS.status.mcp + ':' + TEXTS.status.synced + ' ' + (config.mcp ? config.mcp.count : 0));
|
|
39
|
+
if (config.mcp && config.mcp.platforms) {
|
|
40
|
+
for (const [platform, data] of Object.entries(config.mcp.platforms)) {
|
|
41
|
+
const platformStatus = data.enabled ? '✓' : '✗';
|
|
42
|
+
console.log('│ ' + platform + ' ' + platformStatus + ' ' + data.count + TEXTS.dashboard.mcp.serversSynced + ' '.repeat(19) + '│');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
console.log('');
|
|
46
|
+
console.log('├─────────────────────────────────────────────┤');
|
|
47
|
+
// 设置
|
|
48
|
+
console.log('│ ' + TEXTS.dashboard.settings.section);
|
|
49
|
+
console.log('│ ' + TEXTS.dashboard.settings.syncInterval + ':' + config.service.interval + TEXTS.dashboard.settings.seconds);
|
|
50
|
+
console.log('│ ' + TEXTS.dashboard.settings.autostart + ':' + (config.autostart.enabled ? '✓' : '✗'));
|
|
51
|
+
console.log('│ ' + TEXTS.dashboard.settings.logLevel + ':' + config.service.logLevel);
|
|
52
|
+
console.log('├─────────────────────────────────────────────┤');
|
|
53
|
+
// 错误
|
|
54
|
+
const errors = config.errors || 0;
|
|
55
|
+
console.log('│ ' + TEXTS.status.errors + ':' + errors);
|
|
56
|
+
console.log('├─────────────────────────────────────────────┤');
|
|
57
|
+
console.log('│ ' + TEXTS.status.tip + ' ' + TEXTS.status.forOptions);
|
|
58
|
+
console.log('');
|
|
59
|
+
console.log('└──────────────────────────────────────────────┘');
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,mBAAuB;IAEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
import { serviceManager } from '../core/service-manager';
|
|
4
|
+
import { TEXTS } from '../utils/texts';
|
|
5
|
+
export default class Stop extends Command {
|
|
6
|
+
static description = TEXTS.commands.stop;
|
|
7
|
+
async run() {
|
|
8
|
+
try {
|
|
9
|
+
await serviceManager.stop();
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
this.error(`停止失败:${error instanceof Error ? error.message : String(error)}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IAEzC,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,aAAuB;IAEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2B3B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
import { serviceManager } from '../core/service-manager';
|
|
4
|
+
import { TEXTS } from '../utils/texts';
|
|
5
|
+
export default class Sync extends Command {
|
|
6
|
+
static description = TEXTS.commands.sync;
|
|
7
|
+
async run() {
|
|
8
|
+
try {
|
|
9
|
+
this.log('开始同步...');
|
|
10
|
+
const result = await serviceManager.sync();
|
|
11
|
+
this.log('');
|
|
12
|
+
this.log('同步结果:');
|
|
13
|
+
this.log(` Skills:${result.skills.synced} 个已同步`);
|
|
14
|
+
this.log(` MCP:${result.mcp.synced} 个已同步`);
|
|
15
|
+
this.log(` 耗时:${result.duration}ms`);
|
|
16
|
+
const totalErrors = result.skills.errors.length + result.mcp.errors.length;
|
|
17
|
+
if (totalErrors > 0) {
|
|
18
|
+
this.log('');
|
|
19
|
+
this.log(`错误:${totalErrors} 个`);
|
|
20
|
+
for (const [index, err] of result.skills.errors.entries()) {
|
|
21
|
+
this.log(` ${index + 1}. ${err}`);
|
|
22
|
+
}
|
|
23
|
+
for (const [index, err] of result.mcp.errors.entries()) {
|
|
24
|
+
this.log(` ${result.skills.errors.length + index + 1}. ${err}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.error(`同步失败:${error instanceof Error ? error.message : String(error)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IAEzC,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;YAE3C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;YAEtC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAC3E,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;gBAChC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC1D,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACrC,CAAC;gBAED,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;oBACvD,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,SAAY;IAExB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB3B;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
export default class Test extends Command {
|
|
4
|
+
static description = '测试基本功能';
|
|
5
|
+
async run() {
|
|
6
|
+
try {
|
|
7
|
+
this.log('开始测试...');
|
|
8
|
+
// 测试 1:读取配置
|
|
9
|
+
this.log('测试 1:读取配置文件...');
|
|
10
|
+
const { configManager } = await import('../core/config-manager');
|
|
11
|
+
const config = configManager.getConfig();
|
|
12
|
+
this.log(`✓ 配置已加载`);
|
|
13
|
+
// 测试 2:显示配置
|
|
14
|
+
this.log('测试 2:显示配置...');
|
|
15
|
+
console.log(JSON.stringify(config, null, 2));
|
|
16
|
+
// 测试 3:编译检查
|
|
17
|
+
this.log('测试 3:检查 TypeScript 编译...');
|
|
18
|
+
console.log('✓ 项目结构正确');
|
|
19
|
+
this.log('所有测试通过!');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
this.error(`测试失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export { Test };
|
|
27
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO;IACvC,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;IAE9B,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpB,YAAY;YACZ,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAEpB,YAAY;YACZ,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAE7C,YAAY;YACZ,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAExB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;;AAGH,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAKtC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,WAAW,4BAAyB;IAErC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAY3B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from '@oclif/core';
|
|
3
|
+
import { serviceManager } from '../core/service-manager';
|
|
4
|
+
import { TEXTS } from '../utils/texts';
|
|
5
|
+
export default class Toggle extends Command {
|
|
6
|
+
static description = TEXTS.commands.toggle;
|
|
7
|
+
async run() {
|
|
8
|
+
try {
|
|
9
|
+
const isRunning = await serviceManager.toggle();
|
|
10
|
+
if (isRunning) {
|
|
11
|
+
this.log('服务已启动');
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
this.log('服务已停止');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
this.error(`切换失败:${error instanceof Error ? error.message : String(error)}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle.js","sourceRoot":"","sources":["../../src/commands/toggle.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE3C,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SyncConfig } from '../types/config';
|
|
2
|
+
declare class ConfigManager {
|
|
3
|
+
private config;
|
|
4
|
+
constructor();
|
|
5
|
+
get<T>(path: string): T;
|
|
6
|
+
getConfig(): SyncConfig;
|
|
7
|
+
saveConfig(): void;
|
|
8
|
+
set<T>(path: string, value: T): void;
|
|
9
|
+
validate(config: any): {
|
|
10
|
+
errors: string[];
|
|
11
|
+
valid: boolean;
|
|
12
|
+
};
|
|
13
|
+
private fixConfig;
|
|
14
|
+
private loadConfig;
|
|
15
|
+
private saveDefaultConfig;
|
|
16
|
+
}
|
|
17
|
+
export declare const configManager: ConfigManager;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAO7D,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAa;;IAM3B,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;IAevB,SAAS,IAAI,UAAU;IAIvB,UAAU,IAAI,IAAI;IAYlB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAkBpC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;KAAE;IAkE5D,OAAO,CAAC,SAAS;IAgCjB,OAAO,CAAC,UAAU;IAkClB,OAAO,CAAC,iBAAiB;CAM1B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import yaml from 'yaml';
|
|
4
|
+
import { DEFAULT_CONFIG } from '../types/config';
|
|
5
|
+
import { logger } from '../utils/logger';
|
|
6
|
+
import { expandPath, getHomeDir } from '../utils/time-helper';
|
|
7
|
+
const CONFIG_DIR = path.join(getHomeDir(), '.config', 'ccsync');
|
|
8
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.yaml');
|
|
9
|
+
class ConfigManager {
|
|
10
|
+
config;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.config = this.loadConfig();
|
|
13
|
+
}
|
|
14
|
+
get(path) {
|
|
15
|
+
const keys = path.split('.');
|
|
16
|
+
let value = this.config;
|
|
17
|
+
for (const key of keys) {
|
|
18
|
+
if (value && typeof value === 'object' && key in value) {
|
|
19
|
+
value = value[key];
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
getConfig() {
|
|
28
|
+
return this.config;
|
|
29
|
+
}
|
|
30
|
+
saveConfig() {
|
|
31
|
+
try {
|
|
32
|
+
const yamlContent = yaml.stringify(this.config);
|
|
33
|
+
fs.ensureDirSync(CONFIG_DIR);
|
|
34
|
+
fs.writeFileSync(CONFIG_FILE, yamlContent, 'utf-8');
|
|
35
|
+
logger.debug('配置已保存');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error('保存配置失败', { error: error instanceof Error ? error.message : String(error) });
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
set(path, value) {
|
|
43
|
+
const keys = path.split('.');
|
|
44
|
+
let { config } = this;
|
|
45
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
46
|
+
const key = keys[i];
|
|
47
|
+
if (config && typeof config === 'object' && key in config) {
|
|
48
|
+
config = config[key];
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
throw new Error(`无效的配置路径:${path}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
config[keys.at(-1)] = value;
|
|
55
|
+
this.config = config;
|
|
56
|
+
this.saveConfig();
|
|
57
|
+
}
|
|
58
|
+
validate(config) {
|
|
59
|
+
const errors = [];
|
|
60
|
+
// 验证服务配置
|
|
61
|
+
if (config.service) {
|
|
62
|
+
if (!config.service.interval || config.service.interval < 5) {
|
|
63
|
+
errors.push('同步间隔必须至少 5 秒');
|
|
64
|
+
}
|
|
65
|
+
if (!['debug', 'error', 'info', 'warn'].includes(config.service.logLevel)) {
|
|
66
|
+
errors.push('无效的日志级别');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// 验证 Skills 配置
|
|
70
|
+
if (config.sync && config.sync.skills) {
|
|
71
|
+
if (typeof config.sync.skills.sources !== 'object') {
|
|
72
|
+
errors.push('Skills sources 必须是对象');
|
|
73
|
+
}
|
|
74
|
+
if (config.sync.skills.sources.claude === undefined || config.sync.skills.sources.codex === undefined) {
|
|
75
|
+
errors.push('必须至少选择一个 Skills 来源');
|
|
76
|
+
}
|
|
77
|
+
if (!config.sync.skills.target) {
|
|
78
|
+
errors.push('必须指定 Skills 目标目录');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// 验证 MCP 配置
|
|
82
|
+
if (config.sync && config.sync.mcp) {
|
|
83
|
+
if (typeof config.sync.mcp.platforms !== 'object' || !Array.isArray(config.sync.mcp.platforms)) {
|
|
84
|
+
errors.push('MCP platforms 必须是数组');
|
|
85
|
+
}
|
|
86
|
+
if (config.sync.mcp.platforms.length === 0) {
|
|
87
|
+
errors.push('必须至少选择一个 MCP 平台');
|
|
88
|
+
}
|
|
89
|
+
const validPlatforms = new Set(['all', 'claude', 'codex', 'gemini']);
|
|
90
|
+
for (const platform of config.sync.mcp.platforms) {
|
|
91
|
+
if (!validPlatforms.has(platform)) {
|
|
92
|
+
errors.push(`无效的 MCP 平台:${platform}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!config.sync.mcp.dbPath) {
|
|
96
|
+
errors.push('必须指定 MCP 数据库路径');
|
|
97
|
+
}
|
|
98
|
+
if (!config.sync.mcp.target) {
|
|
99
|
+
errors.push('必须指定 OpenCode 配置文件路径');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// 验证开机启动配置
|
|
103
|
+
if (config.autostart && typeof config.autostart.enabled !== 'boolean') {
|
|
104
|
+
errors.push('autostart.enabled 必须是布尔值');
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
errors,
|
|
108
|
+
valid: errors.length === 0,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
fixConfig(config) {
|
|
112
|
+
const fixed = JSON.parse(JSON.stringify(config));
|
|
113
|
+
// 修复 Skills sources
|
|
114
|
+
if (config.sync && config.sync.skills) {
|
|
115
|
+
if (typeof fixed.sync.skills.sources !== 'object') {
|
|
116
|
+
fixed.sync.skills.sources = DEFAULT_CONFIG.sync.skills.sources;
|
|
117
|
+
}
|
|
118
|
+
if (fixed.sync.skills.sources.claude === undefined) {
|
|
119
|
+
fixed.sync.skills.sources.claude = DEFAULT_CONFIG.sync.skills.sources.claude;
|
|
120
|
+
}
|
|
121
|
+
if (fixed.sync.skills.sources.codex === undefined) {
|
|
122
|
+
fixed.sync.skills.sources.codex = DEFAULT_CONFIG.sync.skills.sources.codex;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// 修复 MCP platforms
|
|
126
|
+
if (config.sync && config.sync.mcp) {
|
|
127
|
+
if (!Array.isArray(fixed.sync.mcp.platforms)) {
|
|
128
|
+
fixed.sync.mcp.platforms = DEFAULT_CONFIG.sync.mcp.platforms;
|
|
129
|
+
}
|
|
130
|
+
if (fixed.sync.mcp.platforms.length === 0) {
|
|
131
|
+
fixed.sync.mcp.platforms = DEFAULT_CONFIG.sync.mcp.platforms;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return fixed;
|
|
135
|
+
}
|
|
136
|
+
loadConfig() {
|
|
137
|
+
const configPath = expandPath(CONFIG_FILE);
|
|
138
|
+
try {
|
|
139
|
+
if (!fs.existsSync(configPath)) {
|
|
140
|
+
logger.info('配置文件不存在,使用默认配置');
|
|
141
|
+
fs.ensureDirSync(CONFIG_DIR);
|
|
142
|
+
this.saveDefaultConfig();
|
|
143
|
+
return DEFAULT_CONFIG;
|
|
144
|
+
}
|
|
145
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
146
|
+
const parsedConfig = yaml.parse(content);
|
|
147
|
+
const validation = this.validate(parsedConfig);
|
|
148
|
+
if (!validation.valid) {
|
|
149
|
+
logger.warn('配置文件包含错误');
|
|
150
|
+
for (const error of validation.errors)
|
|
151
|
+
logger.warn(` - ${error}`);
|
|
152
|
+
// 修复配置为默认值
|
|
153
|
+
const fixedConfig = this.fixConfig(parsedConfig);
|
|
154
|
+
this.saveConfig();
|
|
155
|
+
logger.info('已修复配置文件');
|
|
156
|
+
return fixedConfig;
|
|
157
|
+
}
|
|
158
|
+
return parsedConfig;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
logger.error('加载配置失败', { error: error instanceof Error ? error.message : String(error) });
|
|
162
|
+
logger.info('使用默认配置');
|
|
163
|
+
return DEFAULT_CONFIG;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
saveDefaultConfig() {
|
|
167
|
+
const defaultConfigPath = path.join(CONFIG_DIR, 'config.yaml.default');
|
|
168
|
+
const yamlContent = yaml.stringify(DEFAULT_CONFIG);
|
|
169
|
+
fs.writeFileSync(defaultConfigPath, yamlContent, 'utf-8');
|
|
170
|
+
fs.writeFileSync(CONFIG_FILE, yamlContent, 'utf-8');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
export const configManager = new ConfigManager();
|
|
174
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/core/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,cAAc,EAAc,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,aAAa;IACT,MAAM,CAAa;IAE3B;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,GAAG,CAAI,IAAY;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,GAAQ,IAAI,CAAC,MAAM,CAAC;QAE7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACvD,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,KAAU,CAAC;IACpB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChD,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC7B,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1F,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,GAAG,CAAI,IAAY,EAAE,KAAQ;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBAC1D,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAoB,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,MAAW;QAClB,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,SAAS;QACT,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1E,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/F,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACjD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;QAEH,OAAO;YACL,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;SAC3B,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,MAAkB;QAClC,MAAM,KAAK,GAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtD,oBAAoB;QACpB,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YACjE,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/E,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAC/D,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,OAAO,KAAmB,CAAC;IAC7B,CAAC;IAEO,UAAU;QAChB,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC9B,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,OAAO,cAAc,CAAC;YACxB,CAAC;YAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;YAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM;oBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;gBAEnE,WAAW;gBACX,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;gBACjD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,OAAO,YAAY,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACnD,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class LaunchAgentManager {
|
|
2
|
+
private readonly agentName;
|
|
3
|
+
private readonly launchAgentsDir;
|
|
4
|
+
private readonly agentPath;
|
|
5
|
+
disable(): Promise<boolean>;
|
|
6
|
+
enable(): Promise<boolean>;
|
|
7
|
+
getAgentPath(): string;
|
|
8
|
+
isEnabled(): Promise<boolean>;
|
|
9
|
+
private generatePlist;
|
|
10
|
+
}
|
|
11
|
+
export { LaunchAgentManager };
|
|
12
|
+
//# sourceMappingURL=launch-agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-agent.d.ts","sourceRoot":"","sources":["../../src/core/launch-agent.ts"],"names":[],"mappings":"AAUA,cAAM,kBAAkB;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsD;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8D;IAElF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAiB3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBhC,YAAY,IAAI,MAAM;IAIhB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAanC,OAAO,CAAC,aAAa;CA+BtB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import { exec } from 'node:child_process';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { logger } from '../utils/logger';
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
class LaunchAgentManager {
|
|
9
|
+
agentName = 'com.user.ccsync';
|
|
10
|
+
launchAgentsDir = path.join(os.homedir(), 'Library', 'LaunchAgents');
|
|
11
|
+
agentPath = path.join(this.launchAgentsDir, `${this.agentName}.plist`);
|
|
12
|
+
async disable() {
|
|
13
|
+
try {
|
|
14
|
+
logger.info('正在禁用开机启动...');
|
|
15
|
+
if (await fs.pathExists(this.agentPath)) {
|
|
16
|
+
await execAsync(`launchctl unload ${this.agentPath}`);
|
|
17
|
+
await fs.remove(this.agentPath);
|
|
18
|
+
}
|
|
19
|
+
logger.info('开机启动已禁用');
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
logger.error('禁用开机启动失败', { error: error instanceof Error ? error.message : String(error) });
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async enable() {
|
|
28
|
+
try {
|
|
29
|
+
logger.info('正在启用开机启动...');
|
|
30
|
+
await fs.ensureDir(this.launchAgentsDir);
|
|
31
|
+
const plistContent = this.generatePlist();
|
|
32
|
+
await fs.writeFile(this.agentPath, plistContent, 'utf-8');
|
|
33
|
+
await execAsync(`launchctl load ${this.agentPath}`);
|
|
34
|
+
logger.info('开机启动已启用');
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.error('启用开机启动失败', { error: error instanceof Error ? error.message : String(error) });
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
getAgentPath() {
|
|
43
|
+
return this.agentPath;
|
|
44
|
+
}
|
|
45
|
+
async isEnabled() {
|
|
46
|
+
try {
|
|
47
|
+
if (!await fs.pathExists(this.agentPath)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const { stdout } = await execAsync(`launchctl list | grep ${this.agentName}`);
|
|
51
|
+
return stdout.trim().includes(this.agentName);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
generatePlist() {
|
|
58
|
+
const homeDir = os.homedir();
|
|
59
|
+
const ccsyncPath = path.join(homeDir, '.npm', 'global', 'lib', 'node_modules', 'ccsync', 'bin', 'run.js');
|
|
60
|
+
const logPath = path.join(homeDir, '.local', 'share', 'ccsync', 'logs', 'autostart.log');
|
|
61
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
62
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
63
|
+
<plist version="1.0">
|
|
64
|
+
<dict>
|
|
65
|
+
<key>Label</key>
|
|
66
|
+
<string>${this.agentName}</string>
|
|
67
|
+
<key>ProgramArguments</key>
|
|
68
|
+
<array>
|
|
69
|
+
<string>/usr/bin/env</string>
|
|
70
|
+
<string>node</string>
|
|
71
|
+
<string>${ccsyncPath}</string>
|
|
72
|
+
<string>start</string>
|
|
73
|
+
</array>
|
|
74
|
+
<key>RunAtLoad</key>
|
|
75
|
+
<true/>
|
|
76
|
+
<key>KeepAlive</key>
|
|
77
|
+
<true/>
|
|
78
|
+
<key>StandardOutPath</key>
|
|
79
|
+
<string>${logPath}</string>
|
|
80
|
+
<key>StandardErrorPath</key>
|
|
81
|
+
<string>${logPath}</string>
|
|
82
|
+
<key>WorkingDirectory</key>
|
|
83
|
+
<string>${homeDir}</string>
|
|
84
|
+
</dict>
|
|
85
|
+
</plist>`;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export { LaunchAgentManager };
|
|
89
|
+
//# sourceMappingURL=launch-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-agent.js","sourceRoot":"","sources":["../../src/core/launch-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare class PermissionManager {
|
|
2
|
+
private readonly paths;
|
|
3
|
+
constructor(paths: string[]);
|
|
4
|
+
check(): Promise<{
|
|
5
|
+
issues: string[];
|
|
6
|
+
valid: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
ensureDirectories(): Promise<{
|
|
9
|
+
created: string[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
}>;
|
|
12
|
+
fix(): Promise<{
|
|
13
|
+
fixed: boolean;
|
|
14
|
+
issues: string[];
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
export { PermissionManager };
|
|
18
|
+
//# sourceMappingURL=permission-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-manager.d.ts","sourceRoot":"","sources":["../../src/core/permission-manager.ts"],"names":[],"mappings":"AAMA,cAAM,iBAAiB;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;gBAErB,KAAK,EAAE,MAAM,EAAE;IAUrB,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;KAAE,CAAC;IAyBvD,iBAAiB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAqBrE,GAAG,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAsC3D;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|