wangchuan 2.5.1 → 2.7.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 (57) hide show
  1. package/.wangchuan/config.example.json +85 -8
  2. package/dist/bin/wangchuan.d.ts +1 -1
  3. package/dist/bin/wangchuan.js +34 -4
  4. package/dist/bin/wangchuan.js.map +1 -1
  5. package/dist/src/commands/env.d.ts +11 -0
  6. package/dist/src/commands/env.d.ts.map +1 -0
  7. package/dist/src/commands/env.js +133 -0
  8. package/dist/src/commands/env.js.map +1 -0
  9. package/dist/src/commands/list.d.ts.map +1 -1
  10. package/dist/src/commands/list.js +5 -1
  11. package/dist/src/commands/list.js.map +1 -1
  12. package/dist/src/commands/pull.d.ts.map +1 -1
  13. package/dist/src/commands/pull.js +2 -1
  14. package/dist/src/commands/pull.js.map +1 -1
  15. package/dist/src/commands/push.d.ts +1 -1
  16. package/dist/src/commands/push.d.ts.map +1 -1
  17. package/dist/src/commands/push.js +25 -2
  18. package/dist/src/commands/push.js.map +1 -1
  19. package/dist/src/commands/status.d.ts.map +1 -1
  20. package/dist/src/commands/status.js +3 -1
  21. package/dist/src/commands/status.js.map +1 -1
  22. package/dist/src/commands/sync.d.ts +18 -0
  23. package/dist/src/commands/sync.d.ts.map +1 -0
  24. package/dist/src/commands/sync.js +150 -0
  25. package/dist/src/commands/sync.js.map +1 -0
  26. package/dist/src/commands/watch.d.ts +10 -0
  27. package/dist/src/commands/watch.d.ts.map +1 -0
  28. package/dist/src/commands/watch.js +122 -0
  29. package/dist/src/commands/watch.js.map +1 -0
  30. package/dist/src/core/config.d.ts +7 -1
  31. package/dist/src/core/config.d.ts.map +1 -1
  32. package/dist/src/core/config.js +110 -8
  33. package/dist/src/core/config.js.map +1 -1
  34. package/dist/src/core/git.d.ts +11 -0
  35. package/dist/src/core/git.d.ts.map +1 -1
  36. package/dist/src/core/git.js +88 -0
  37. package/dist/src/core/git.js.map +1 -1
  38. package/dist/src/core/migrate.d.ts.map +1 -1
  39. package/dist/src/core/migrate.js +1 -0
  40. package/dist/src/core/migrate.js.map +1 -1
  41. package/dist/src/core/sync.d.ts +9 -0
  42. package/dist/src/core/sync.d.ts.map +1 -1
  43. package/dist/src/core/sync.js +38 -1
  44. package/dist/src/core/sync.js.map +1 -1
  45. package/dist/src/i18n.d.ts.map +1 -1
  46. package/dist/src/i18n.js +81 -2
  47. package/dist/src/i18n.js.map +1 -1
  48. package/dist/src/types.d.ts +20 -1
  49. package/dist/src/types.d.ts.map +1 -1
  50. package/dist/src/types.js +3 -1
  51. package/dist/src/types.js.map +1 -1
  52. package/dist/test/sync.test.js +72 -4
  53. package/dist/test/sync.test.js.map +1 -1
  54. package/package.json +1 -1
  55. package/skill/SKILL.md +21 -3
  56. package/skill/claude/SKILL.md +113 -0
  57. package/skill/wangchuan-skill.sh +2 -2
@@ -0,0 +1,18 @@
1
+ /**
2
+ * sync.ts — wangchuan sync command (bidirectional smart sync)
3
+ *
4
+ * 1. Fetch remote to check for new commits
5
+ * 2. If remote is ahead, pull first
6
+ * 3. Then push local changes
7
+ */
8
+ import type { SyncOptions, RestoreResult, StageResult, CommitResult } from '../types.js';
9
+ export interface SyncCommandResult {
10
+ readonly pulled: boolean;
11
+ readonly pullResult?: RestoreResult | undefined;
12
+ readonly pushed: boolean;
13
+ readonly pushResult?: (CommitResult & {
14
+ readonly stageResult?: StageResult | undefined;
15
+ }) | undefined;
16
+ }
17
+ export declare function cmdSync({ agent, dryRun }?: SyncOptions): Promise<SyncCommandResult>;
18
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,GAAG;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;CACvG;AAED,wBAAsB,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAE,WAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgI7F"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * sync.ts — wangchuan sync command (bidirectional smart sync)
3
+ *
4
+ * 1. Fetch remote to check for new commits
5
+ * 2. If remote is ahead, pull first
6
+ * 3. Then push local changes
7
+ */
8
+ import os from 'os';
9
+ import { config } from '../core/config.js';
10
+ import { resolveGitBranch } from '../core/config.js';
11
+ import { ensureMigrated } from '../core/migrate.js';
12
+ import { gitEngine } from '../core/git.js';
13
+ import { syncEngine } from '../core/sync.js';
14
+ import { validator } from '../utils/validator.js';
15
+ import { logger } from '../utils/logger.js';
16
+ import { t } from '../i18n.js';
17
+ import chalk from 'chalk';
18
+ import ora from 'ora';
19
+ export async function cmdSync({ agent, dryRun } = {}) {
20
+ logger.banner(t('sync.banner'));
21
+ let cfg = config.load();
22
+ validator.requireInit(cfg);
23
+ cfg = ensureMigrated(cfg);
24
+ const repoPath = syncEngine.expandHome(cfg.localRepoPath);
25
+ const hostname = cfg.hostname || os.hostname();
26
+ if (agent)
27
+ logger.info(t('sync.filterAgent', { agent: chalk.cyan(agent) }));
28
+ if (dryRun)
29
+ logger.info(chalk.yellow(t('dryRun.enabled')));
30
+ // ── 1. Fetch and check remote ───────────────────────────────
31
+ let spinner = ora(t('sync.fetching')).start();
32
+ let remoteAhead = 0;
33
+ try {
34
+ remoteAhead = await gitEngine.fetchAndCheckRemoteAhead(repoPath, resolveGitBranch(cfg));
35
+ if (remoteAhead > 0) {
36
+ spinner.succeed(t('sync.remoteAhead', { count: remoteAhead }));
37
+ }
38
+ else {
39
+ spinner.succeed(t('sync.remoteUpToDate'));
40
+ }
41
+ }
42
+ catch (err) {
43
+ spinner.fail(t('sync.fetchFailed'));
44
+ throw new Error(t('sync.fetchFailedDetail', { error: err.message }));
45
+ }
46
+ // ── 2. Pull if remote has new commits ───────────────────────
47
+ let pulled = false;
48
+ let pullResult;
49
+ if (remoteAhead > 0) {
50
+ spinner = ora(t('sync.pulling')).start();
51
+ try {
52
+ await gitEngine.pull(repoPath, resolveGitBranch(cfg));
53
+ spinner.succeed(t('sync.pulled'));
54
+ }
55
+ catch (err) {
56
+ spinner.fail(t('sync.pullFailed'));
57
+ throw new Error(t('sync.pullFailedDetail', { error: err.message }));
58
+ }
59
+ try {
60
+ pullResult = await syncEngine.restoreFromRepo(cfg, agent);
61
+ pulled = true;
62
+ if (pullResult.synced.length > 0) {
63
+ logger.ok(t('sync.pullSummary', {
64
+ count: pullResult.synced.length,
65
+ encrypted: pullResult.decrypted.length,
66
+ }));
67
+ }
68
+ }
69
+ catch (err) {
70
+ throw new Error(t('sync.restoreFailed', { error: err.message }));
71
+ }
72
+ }
73
+ // ── 3. Push local changes ──────────────────────────────────
74
+ spinner = ora(t('sync.staging')).start();
75
+ let stageResult;
76
+ try {
77
+ stageResult = await syncEngine.stageToRepo(cfg, agent);
78
+ spinner.succeed(t('sync.staged', { count: stageResult.synced.length }));
79
+ }
80
+ catch (err) {
81
+ spinner.fail(t('sync.stagingFailed'));
82
+ throw new Error(t('sync.stagingFailedDetail', { error: err.message }));
83
+ }
84
+ let pushResult = { committed: false, pushed: false };
85
+ if (stageResult.synced.length > 0 || stageResult.deleted.length > 0) {
86
+ // ── Dry-run: print summary and skip commit/push ─────────────
87
+ if (dryRun) {
88
+ console.log();
89
+ for (const f of stageResult.synced) {
90
+ logger.ok(` ${chalk.green(f)}`);
91
+ }
92
+ for (const f of stageResult.deleted) {
93
+ logger.info(` ${chalk.red('✕ ' + f)}`);
94
+ }
95
+ logger.ok('\n' + t('dryRun.wouldSync', {
96
+ count: stageResult.synced.length,
97
+ encrypted: stageResult.encrypted.length,
98
+ }));
99
+ if (stageResult.deleted.length > 0) {
100
+ logger.ok(t('dryRun.wouldPrune', { count: stageResult.deleted.length }));
101
+ }
102
+ logger.ok(t('dryRun.wouldCommit', { repo: cfg.repo }));
103
+ pushResult = { committed: false, pushed: false, stageResult };
104
+ }
105
+ else {
106
+ const agentTag = agent ? `[${agent}]` : '';
107
+ const msg = t('sync.commitMsg', { tag: agentTag, host: hostname });
108
+ spinner = ora(t('sync.pushing')).start();
109
+ try {
110
+ const gitResult = await gitEngine.commitAndPush(repoPath, msg, resolveGitBranch(cfg));
111
+ if (gitResult.committed) {
112
+ spinner.succeed(t('sync.pushed', { repo: cfg.repo }));
113
+ }
114
+ else {
115
+ spinner.info(t('sync.nothingToCommit'));
116
+ }
117
+ pushResult = { ...gitResult, stageResult };
118
+ }
119
+ catch (err) {
120
+ spinner.fail(t('sync.pushFailed'));
121
+ try {
122
+ await gitEngine.rollback(repoPath);
123
+ }
124
+ catch (re) {
125
+ logger.error(t('sync.rollbackFailed', { error: re.message }));
126
+ }
127
+ throw new Error(t('sync.pushFailedDetail', { error: err.message }));
128
+ }
129
+ } // end else (non-dry-run)
130
+ }
131
+ else {
132
+ logger.info(t('sync.noChanges'));
133
+ }
134
+ // ── 4. Summary ─────────────────────────────────────────────
135
+ console.log();
136
+ if (pulled && pullResult) {
137
+ logger.ok(t('sync.summaryPull', { count: pullResult.synced.length }));
138
+ }
139
+ if (pushResult.committed && pushResult.stageResult) {
140
+ logger.ok(t('sync.summaryPush', {
141
+ count: pushResult.stageResult.synced.length,
142
+ sha: pushResult.sha ?? '-',
143
+ }));
144
+ }
145
+ if (!pulled && !pushResult.committed) {
146
+ logger.ok(t('sync.alreadyInSync'));
147
+ }
148
+ return { pulled, pullResult, pushed: pushResult.committed, pushResult };
149
+ }
150
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * watch.ts — wangchuan watch command (long-running daemon)
3
+ *
4
+ * Monitors enabled agents' workspace directories for file changes.
5
+ * Debounces changes then auto-triggers sync. Also periodically polls
6
+ * remote for new commits.
7
+ */
8
+ import type { WatchOptions } from '../types.js';
9
+ export declare function cmdWatch({ agent, interval }?: WatchOptions): Promise<void>;
10
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,aAAa,CAAC;AAgC5E,wBAAsB,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFpF"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * watch.ts — wangchuan watch command (long-running daemon)
3
+ *
4
+ * Monitors enabled agents' workspace directories for file changes.
5
+ * Debounces changes then auto-triggers sync. Also periodically polls
6
+ * remote for new commits.
7
+ */
8
+ import fs from 'fs';
9
+ import path from 'path';
10
+ import { config } from '../core/config.js';
11
+ import { ensureMigrated } from '../core/migrate.js';
12
+ import { syncEngine } from '../core/sync.js';
13
+ import { validator } from '../utils/validator.js';
14
+ import { logger } from '../utils/logger.js';
15
+ import { t } from '../i18n.js';
16
+ import { cmdSync } from './sync.js';
17
+ import chalk from 'chalk';
18
+ const DEFAULT_INTERVAL_MINUTES = 5;
19
+ const DEBOUNCE_MS = 5_000;
20
+ /**
21
+ * Collect all absolute paths that should be watched for a given config.
22
+ * Returns a map of absPath → true for quick lookup, plus the list of
23
+ * directories to attach fs.watch() on.
24
+ */
25
+ function collectWatchTargets(cfg, agent) {
26
+ const entries = syncEngine.buildFileEntries(cfg, undefined, agent);
27
+ const watchFiles = new Set();
28
+ const watchDirs = new Set();
29
+ for (const entry of entries) {
30
+ watchFiles.add(entry.srcAbs);
31
+ watchDirs.add(path.dirname(entry.srcAbs));
32
+ }
33
+ return { watchDirs: [...watchDirs], watchFiles };
34
+ }
35
+ function timestamp() {
36
+ return new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false });
37
+ }
38
+ export async function cmdWatch({ agent, interval } = {}) {
39
+ logger.banner(t('watch.banner'));
40
+ let cfg = config.load();
41
+ validator.requireInit(cfg);
42
+ cfg = ensureMigrated(cfg);
43
+ const intervalMinutes = interval ?? DEFAULT_INTERVAL_MINUTES;
44
+ if (agent)
45
+ logger.info(t('watch.filterAgent', { agent: chalk.cyan(agent) }));
46
+ logger.info(t('watch.interval', { minutes: intervalMinutes }));
47
+ const { watchDirs, watchFiles } = collectWatchTargets(cfg, agent);
48
+ if (watchDirs.length === 0) {
49
+ logger.warn(t('watch.noTargets'));
50
+ return;
51
+ }
52
+ logger.info(t('watch.watching', { dirs: watchDirs.length, files: watchFiles.size }));
53
+ // ── Debounce state ──────────────────────────────────────────
54
+ let debounceTimer = null;
55
+ let syncing = false;
56
+ async function triggerSync(reason) {
57
+ if (syncing)
58
+ return;
59
+ syncing = true;
60
+ try {
61
+ logger.step(t('watch.triggerSync', { reason, time: timestamp() }));
62
+ await cmdSync(agent ? { agent } : {});
63
+ }
64
+ catch (err) {
65
+ logger.error(t('watch.syncError', { error: err.message }));
66
+ }
67
+ finally {
68
+ syncing = false;
69
+ }
70
+ }
71
+ function onFileChange(filePath) {
72
+ if (!watchFiles.has(filePath))
73
+ return;
74
+ logger.debug(t('watch.fileChanged', { file: filePath }));
75
+ if (debounceTimer)
76
+ clearTimeout(debounceTimer);
77
+ debounceTimer = setTimeout(() => {
78
+ void triggerSync(t('watch.reasonFileChange'));
79
+ }, DEBOUNCE_MS);
80
+ }
81
+ // ── Attach fs.watch() to directories ─────────────────────────
82
+ const watchers = [];
83
+ for (const dir of watchDirs) {
84
+ if (!fs.existsSync(dir)) {
85
+ logger.debug(t('watch.dirNotFound', { dir }));
86
+ continue;
87
+ }
88
+ try {
89
+ const watcher = fs.watch(dir, { persistent: true }, (_event, filename) => {
90
+ if (!filename)
91
+ return;
92
+ const fullPath = path.join(dir, filename);
93
+ onFileChange(fullPath);
94
+ });
95
+ watchers.push(watcher);
96
+ }
97
+ catch (err) {
98
+ logger.warn(t('watch.watchError', { dir, error: err.message }));
99
+ }
100
+ }
101
+ // ── Periodic remote polling ──────────────────────────────────
102
+ const pollInterval = setInterval(() => {
103
+ void triggerSync(t('watch.reasonPoll'));
104
+ }, intervalMinutes * 60 * 1_000);
105
+ // ── Graceful shutdown ────────────────────────────────────────
106
+ function shutdown() {
107
+ logger.info(t('watch.shutdown'));
108
+ if (debounceTimer)
109
+ clearTimeout(debounceTimer);
110
+ clearInterval(pollInterval);
111
+ for (const w of watchers)
112
+ w.close();
113
+ process.exit(0);
114
+ }
115
+ process.on('SIGINT', shutdown);
116
+ process.on('SIGTERM', shutdown);
117
+ logger.ok(t('watch.started'));
118
+ logger.info(t('watch.stopHint'));
119
+ // Run an initial sync immediately
120
+ await triggerSync(t('watch.reasonInitial'));
121
+ }
122
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  import type { WangchuanConfig, AgentProfiles, SharedConfig } from '../types.js';
8
8
  export declare const CONFIG_VERSION = 2;
9
9
  export declare const config: {
10
- /** 读取配置,不存在时返回 null */
10
+ /** Read config, return null if not found */
11
11
  readonly load: () => WangchuanConfig | null;
12
12
  /** 保存配置到磁盘 */
13
13
  readonly save: (cfg: WangchuanConfig) => void;
@@ -31,4 +31,10 @@ export declare const config: {
31
31
  readonly example: string;
32
32
  };
33
33
  };
34
+ /**
35
+ * Resolve the git branch for the given config's active environment.
36
+ * - environment undefined or 'default' → cfg.branch (typically 'main')
37
+ * - any other value → 'env/{name}'
38
+ */
39
+ export declare function resolveGitBranch(cfg: WangchuanConfig): string;
34
40
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhF,eAAO,MAAM,cAAc,IAAI,CAAC;AAoEhC,eAAO,MAAM,MAAM;IACjB,uBAAuB;yBACf,eAAe,GAAG,IAAI;IAU9B,cAAc;yBACJ,eAAe,KAAG,IAAI;IAMhC,kBAAkB;yCACc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAaxD,2BAA2B;gCACJ,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC;IAiBxD,2BAA2B;2BACf,eAAe,YAAY,OAAO,CAAC,eAAe,CAAC,KAAG,eAAe;IAIjF,kBAAkB;;;;;;IAOlB,aAAa;;;;;;;CAOL,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhF,eAAO,MAAM,cAAc,IAAI,CAAC;AAmJhC,eAAO,MAAM,MAAM;IACjB,4CAA4C;yBACpC,eAAe,GAAG,IAAI;IAsB9B,cAAc;yBACJ,eAAe,KAAG,IAAI;IAMhC,kBAAkB;yCACc,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;IAaxD,2BAA2B;gCACJ,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC;IAiBxD,2BAA2B;2BACf,eAAe,YAAY,OAAO,CAAC,eAAe,CAAC,KAAG,eAAe;IAIjF,kBAAkB;;;;;;IAOlB,aAAa;;;;;;;CAOL,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAK7D"}
@@ -24,9 +24,13 @@ const DEFAULT_PROFILES = {
24
24
  { src: 'MEMORY.md', encrypt: true },
25
25
  { src: 'AGENTS.md', encrypt: false },
26
26
  { src: 'SOUL.md', encrypt: false },
27
+ { src: 'IDENTITY.md', encrypt: false },
28
+ { src: 'USER.md', encrypt: true },
27
29
  ],
28
- // skills/ 移至 shared tier
29
- // USER.md(空模板)、TOOLS.md(环境特有)、config/mcporter.json(移至 shared MCP)已移除
30
+ syncDirs: [
31
+ { src: 'memory/', encrypt: true }, // dated memory logs (memory/SHARED.md etc.)
32
+ ],
33
+ // skills/ → shared tier; TOOLS.md excluded (environment-specific)
30
34
  },
31
35
  claude: {
32
36
  enabled: true,
@@ -35,7 +39,6 @@ const DEFAULT_PROFILES = {
35
39
  { src: 'CLAUDE.md', encrypt: false },
36
40
  { src: 'settings.json', encrypt: true },
37
41
  ],
38
- // .claude.json 整文件不再同步,改用 jsonFields 提取 mcpServers
39
42
  jsonFields: [
40
43
  {
41
44
  src: '.claude.json',
@@ -49,17 +52,89 @@ const DEFAULT_PROFILES = {
49
52
  enabled: true,
50
53
  workspacePath: path.join(os.homedir(), '.gemini'),
51
54
  syncFiles: [],
52
- // projects.json 和 trustedFolders.json 是环境特有路径,不再同步
53
- // settings.internal.json 改用 jsonFields 仅提取有用字段
54
55
  jsonFields: [
55
56
  {
56
57
  src: 'settings.internal.json',
57
- fields: ['security', 'model'],
58
+ fields: ['security', 'model', 'general'],
59
+ repoName: 'settings-sync.json',
60
+ encrypt: true,
61
+ },
62
+ ],
63
+ },
64
+ codebuddy: {
65
+ enabled: true,
66
+ workspacePath: path.join(os.homedir(), '.codebuddy'),
67
+ syncFiles: [
68
+ { src: 'MEMORY.md', encrypt: true },
69
+ { src: 'CODEBUDDY.md', encrypt: false },
70
+ ],
71
+ jsonFields: [
72
+ // MCP config at ~/.codebuddy/mcp.json
73
+ {
74
+ src: 'mcp.json',
75
+ fields: ['mcpServers'],
76
+ repoName: 'mcpServers.json',
77
+ encrypt: true,
78
+ },
79
+ // settings.json → only portable fields (exclude hooks with absolute paths)
80
+ {
81
+ src: 'settings.json',
82
+ fields: ['enabledPlugins'],
83
+ repoName: 'settings-sync.json',
84
+ encrypt: true,
85
+ },
86
+ ],
87
+ },
88
+ workbuddy: {
89
+ enabled: true,
90
+ workspacePath: path.join(os.homedir(), '.workbuddy'),
91
+ syncFiles: [
92
+ { src: 'MEMORY.md', encrypt: true },
93
+ { src: 'IDENTITY.md', encrypt: false },
94
+ { src: 'SOUL.md', encrypt: false },
95
+ { src: 'USER.md', encrypt: true },
96
+ ],
97
+ jsonFields: [
98
+ // MCP config at ~/.workbuddy/mcp.json
99
+ {
100
+ src: 'mcp.json',
101
+ fields: ['mcpServers'],
102
+ repoName: 'mcpServers.json',
103
+ encrypt: true,
104
+ },
105
+ // settings.json → only portable fields
106
+ {
107
+ src: 'settings.json',
108
+ fields: ['enabledPlugins'],
58
109
  repoName: 'settings-sync.json',
59
110
  encrypt: true,
60
111
  },
61
112
  ],
62
113
  },
114
+ cursor: {
115
+ enabled: true,
116
+ workspacePath: path.join(os.homedir(), '.cursor'),
117
+ syncFiles: [],
118
+ syncDirs: [
119
+ { src: 'rules/', encrypt: false }, // global rules directory
120
+ ],
121
+ jsonFields: [
122
+ // MCP config at ~/.cursor/mcp.json
123
+ {
124
+ src: 'mcp.json',
125
+ fields: ['mcpServers'],
126
+ repoName: 'mcpServers.json',
127
+ encrypt: true,
128
+ },
129
+ // cli-config.json → only portable fields (exclude authInfo, privacyCache)
130
+ {
131
+ src: 'cli-config.json',
132
+ fields: ['permissions', 'model', 'enabledPlugins'],
133
+ repoName: 'cli-config-sync.json',
134
+ encrypt: true,
135
+ },
136
+ ],
137
+ },
63
138
  };
64
139
  /** 共享层默认配置 */
65
140
  const DEFAULT_SHARED = {
@@ -67,12 +142,16 @@ const DEFAULT_SHARED = {
67
142
  sources: [
68
143
  { agent: 'claude', dir: 'skills/' },
69
144
  { agent: 'openclaw', dir: 'skills/' },
145
+ { agent: 'codebuddy', dir: 'skills/' },
70
146
  ],
71
147
  },
72
148
  mcp: {
73
149
  sources: [
74
150
  { agent: 'claude', src: '.claude.json', field: 'mcpServers' },
75
151
  { agent: 'openclaw', src: 'config/mcporter.json', field: 'mcpServers' },
152
+ { agent: 'codebuddy', src: 'mcp.json', field: 'mcpServers' },
153
+ { agent: 'workbuddy', src: 'mcp.json', field: 'mcpServers' },
154
+ { agent: 'cursor', src: 'mcp.json', field: 'mcpServers' },
76
155
  ],
77
156
  },
78
157
  syncFiles: [
@@ -80,17 +159,29 @@ const DEFAULT_SHARED = {
80
159
  ],
81
160
  };
82
161
  export const config = {
83
- /** 读取配置,不存在时返回 null */
162
+ /** Read config, return null if not found */
84
163
  load() {
85
164
  if (!fs.existsSync(CONFIG_PATH))
86
165
  return null;
166
+ let parsed;
87
167
  try {
88
168
  const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
89
- return JSON.parse(raw);
169
+ parsed = JSON.parse(raw);
90
170
  }
91
171
  catch (err) {
92
172
  throw new Error(t('config.loadFailed', { error: err.message }));
93
173
  }
174
+ // Validate required fields
175
+ for (const field of ['repo', 'branch', 'localRepoPath', 'keyPath']) {
176
+ if (!parsed[field]) {
177
+ throw new Error(t('config.invalidFormat', { field }));
178
+ }
179
+ }
180
+ const profiles = parsed['profiles'];
181
+ if (!profiles?.['default']) {
182
+ throw new Error(t('config.invalidFormat', { field: 'profiles.default' }));
183
+ }
184
+ return parsed;
94
185
  },
95
186
  /** 保存配置到磁盘 */
96
187
  save(cfg) {
@@ -147,4 +238,15 @@ export const config = {
147
238
  example: EXAMPLE_PATH,
148
239
  },
149
240
  };
241
+ /**
242
+ * Resolve the git branch for the given config's active environment.
243
+ * - environment undefined or 'default' → cfg.branch (typically 'main')
244
+ * - any other value → 'env/{name}'
245
+ */
246
+ export function resolveGitBranch(cfg) {
247
+ if (!cfg.environment || cfg.environment === 'default') {
248
+ return cfg.branch;
249
+ }
250
+ return `env/${cfg.environment}`;
251
+ }
150
252
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,17 @@ export declare const gitEngine: {
13
13
  readonly log: (localPath: string, n?: number) => Promise<readonly DefaultLogFields[]>;
14
14
  readonly getRemoteUrl: (localPath: string) => Promise<string | null>;
15
15
  readonly rollback: (localPath: string) => Promise<void>;
16
+ /**
17
+ * Fetch from remote and check if remote branch is ahead of local.
18
+ * Returns the number of commits the remote is ahead.
19
+ */
20
+ readonly fetchAndCheckRemoteAhead: (localPath: string, branch?: string) => Promise<number>;
16
21
  readonly isGitAvailable: () => Promise<boolean>;
22
+ readonly currentBranch: (localPath: string) => Promise<string>;
23
+ readonly listBranches: (localPath: string) => Promise<readonly string[]>;
24
+ readonly branchExists: (localPath: string, branch: string) => Promise<boolean>;
25
+ readonly createBranch: (localPath: string, branch: string, baseBranch?: string) => Promise<void>;
26
+ readonly switchBranch: (localPath: string, branch: string) => Promise<void>;
27
+ readonly deleteBranch: (localPath: string, branch: string) => Promise<void>;
17
28
  };
18
29
  //# sourceMappingURL=git.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/core/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,eAAO,MAAM,SAAS;uCACU,MAAM,aAAa,MAAM,sBAAoB,OAAO,CAAC,IAAI,CAAC;+BAalE,MAAM;wCAOG,MAAM,WAAW,MAAM,sBAAoB,OAAO,CAAC,YAAY,CAAC;iCAqBvE,MAAM;8BAKT,MAAM,iBAAU,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC;uCAK3C,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;mCAKnC,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;mCAMxB,OAAO,CAAC,OAAO,CAAC;CAQhC,CAAC"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/core/git.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAShD,eAAO,MAAM,SAAS;uCACU,MAAM,aAAa,MAAM,sBAAoB,OAAO,CAAC,IAAI,CAAC;+BAalE,MAAM;wCAOG,MAAM,WAAW,MAAM,sBAAoB,OAAO,CAAC,YAAY,CAAC;iCAqBvE,MAAM;8BAKT,MAAM,iBAAU,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC;uCAK3C,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;mCAKnC,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;IAMhD;;;OAGG;mDACuC,MAAM,sBAAoB,OAAO,CAAC,MAAM,CAAC;mCAW3D,OAAO,CAAC,OAAO,CAAC;wCAST,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;uCAMzB,MAAM,KAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;uCAgBnC,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;uCAazC,MAAM,UAAU,MAAM,eAAe,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;uCAS3D,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;uCActC,MAAM,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;CAc5D,CAAC"}