@kaitranntt/ccs 4.4.0 → 5.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 +14 -7
- package/VERSION +1 -1
- package/config/base-agy.settings.json +10 -0
- package/config/base-codex.settings.json +10 -0
- package/config/base-gemini.settings.json +10 -0
- package/dist/auth/auth-commands.d.ts +52 -0
- package/dist/auth/auth-commands.d.ts.map +1 -0
- package/dist/auth/auth-commands.js +479 -0
- package/dist/auth/auth-commands.js.map +1 -0
- package/dist/auth/profile-detector.d.ts +68 -0
- package/dist/auth/profile-detector.d.ts.map +1 -0
- package/dist/auth/profile-detector.js +209 -0
- package/dist/auth/profile-detector.js.map +1 -0
- package/dist/auth/profile-registry.d.ts +60 -0
- package/dist/auth/profile-registry.d.ts.map +1 -0
- package/dist/auth/profile-registry.js +188 -0
- package/dist/auth/profile-registry.js.map +1 -0
- package/dist/ccs.d.ts +10 -0
- package/dist/ccs.d.ts.map +1 -0
- package/dist/ccs.js +320 -0
- package/dist/ccs.js.map +1 -0
- package/dist/cliproxy/auth-handler.d.ts +93 -0
- package/dist/cliproxy/auth-handler.d.ts.map +1 -0
- package/dist/cliproxy/auth-handler.js +402 -0
- package/dist/cliproxy/auth-handler.js.map +1 -0
- package/dist/cliproxy/base-config-loader.d.ts +42 -0
- package/dist/cliproxy/base-config-loader.d.ts.map +1 -0
- package/dist/cliproxy/base-config-loader.js +123 -0
- package/dist/cliproxy/base-config-loader.js.map +1 -0
- package/dist/cliproxy/binary-manager.d.ts +104 -0
- package/dist/cliproxy/binary-manager.d.ts.map +1 -0
- package/dist/cliproxy/binary-manager.js +567 -0
- package/dist/cliproxy/binary-manager.js.map +1 -0
- package/dist/cliproxy/cliproxy-executor.d.ts +33 -0
- package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -0
- package/dist/cliproxy/cliproxy-executor.js +297 -0
- package/dist/cliproxy/cliproxy-executor.js.map +1 -0
- package/dist/cliproxy/config-generator.d.ts +89 -0
- package/dist/cliproxy/config-generator.d.ts.map +1 -0
- package/dist/cliproxy/config-generator.js +263 -0
- package/dist/cliproxy/config-generator.js.map +1 -0
- package/dist/cliproxy/index.d.ts +13 -0
- package/dist/cliproxy/index.d.ts.map +1 -0
- package/dist/cliproxy/index.js +62 -0
- package/dist/cliproxy/index.js.map +1 -0
- package/dist/cliproxy/platform-detector.d.ts +48 -0
- package/dist/cliproxy/platform-detector.d.ts.map +1 -0
- package/dist/cliproxy/platform-detector.js +118 -0
- package/dist/cliproxy/platform-detector.js.map +1 -0
- package/dist/cliproxy/types.d.ts +169 -0
- package/dist/cliproxy/types.d.ts.map +1 -0
- package/dist/cliproxy/types.js +7 -0
- package/dist/cliproxy/types.js.map +1 -0
- package/dist/commands/doctor-command.d.ts +10 -0
- package/dist/commands/doctor-command.d.ts.map +1 -0
- package/dist/commands/doctor-command.js +44 -0
- package/dist/commands/doctor-command.js.map +1 -0
- package/dist/commands/help-command.d.ts +5 -0
- package/dist/commands/help-command.d.ts.map +1 -0
- package/dist/commands/help-command.js +104 -0
- package/dist/commands/help-command.js.map +1 -0
- package/dist/commands/install-command.d.ts +14 -0
- package/dist/commands/install-command.d.ts.map +1 -0
- package/dist/commands/install-command.js +39 -0
- package/dist/commands/install-command.js.map +1 -0
- package/dist/commands/shell-completion-command.d.ts +10 -0
- package/dist/commands/shell-completion-command.d.ts.map +1 -0
- package/dist/commands/shell-completion-command.js +85 -0
- package/dist/commands/shell-completion-command.js.map +1 -0
- package/dist/commands/sync-command.d.ts +10 -0
- package/dist/commands/sync-command.d.ts.map +1 -0
- package/dist/commands/sync-command.js +59 -0
- package/dist/commands/sync-command.js.map +1 -0
- package/dist/commands/update-command.d.ts +12 -0
- package/dist/commands/update-command.d.ts.map +1 -0
- package/dist/commands/update-command.js +295 -0
- package/dist/commands/update-command.js.map +1 -0
- package/dist/commands/version-command.d.ts +10 -0
- package/dist/commands/version-command.d.ts.map +1 -0
- package/dist/commands/version-command.js +100 -0
- package/dist/commands/version-command.js.map +1 -0
- package/dist/delegation/delegation-handler.d.ts +60 -0
- package/dist/delegation/delegation-handler.d.ts.map +1 -0
- package/dist/delegation/delegation-handler.js +174 -0
- package/dist/delegation/delegation-handler.js.map +1 -0
- package/dist/delegation/headless-executor.d.ts +114 -0
- package/dist/delegation/headless-executor.d.ts.map +1 -0
- package/dist/delegation/headless-executor.js +562 -0
- package/dist/delegation/headless-executor.js.map +1 -0
- package/dist/delegation/result-formatter.d.ts +108 -0
- package/dist/delegation/result-formatter.d.ts.map +1 -0
- package/dist/delegation/result-formatter.js +391 -0
- package/dist/delegation/result-formatter.js.map +1 -0
- package/dist/delegation/session-manager.d.ts +58 -0
- package/dist/delegation/session-manager.d.ts.map +1 -0
- package/dist/delegation/session-manager.js +153 -0
- package/dist/delegation/session-manager.js.map +1 -0
- package/dist/delegation/settings-parser.d.ts +31 -0
- package/dist/delegation/settings-parser.d.ts.map +1 -0
- package/dist/delegation/settings-parser.js +107 -0
- package/dist/delegation/settings-parser.js.map +1 -0
- package/dist/glmt/delta-accumulator.d.ts +210 -0
- package/dist/glmt/delta-accumulator.d.ts.map +1 -0
- package/dist/glmt/delta-accumulator.js +351 -0
- package/dist/glmt/delta-accumulator.js.map +1 -0
- package/dist/glmt/glmt-proxy.d.ts +72 -0
- package/dist/glmt/glmt-proxy.d.ts.map +1 -0
- package/dist/glmt/glmt-proxy.js +427 -0
- package/dist/glmt/glmt-proxy.js.map +1 -0
- package/dist/glmt/glmt-transformer.d.ts +265 -0
- package/dist/glmt/glmt-transformer.d.ts.map +1 -0
- package/dist/glmt/glmt-transformer.js +832 -0
- package/dist/glmt/glmt-transformer.js.map +1 -0
- package/dist/glmt/locale-enforcer.d.ts +38 -0
- package/dist/glmt/locale-enforcer.d.ts.map +1 -0
- package/dist/glmt/locale-enforcer.js +69 -0
- package/dist/glmt/locale-enforcer.js.map +1 -0
- package/dist/glmt/reasoning-enforcer.d.ts +52 -0
- package/dist/glmt/reasoning-enforcer.d.ts.map +1 -0
- package/dist/glmt/reasoning-enforcer.js +151 -0
- package/dist/glmt/reasoning-enforcer.js.map +1 -0
- package/dist/glmt/sse-parser.d.ts +47 -0
- package/dist/glmt/sse-parser.d.ts.map +1 -0
- package/dist/glmt/sse-parser.js +93 -0
- package/dist/glmt/sse-parser.js.map +1 -0
- package/dist/management/doctor.d.ts +104 -0
- package/dist/management/doctor.d.ts.map +1 -0
- package/dist/management/doctor.js +673 -0
- package/dist/management/doctor.js.map +1 -0
- package/dist/management/instance-manager.d.ts +57 -0
- package/dist/management/instance-manager.d.ts.map +1 -0
- package/dist/management/instance-manager.js +195 -0
- package/dist/management/instance-manager.js.map +1 -0
- package/dist/management/recovery-manager.d.ts +39 -0
- package/dist/management/recovery-manager.d.ts.map +1 -0
- package/dist/management/recovery-manager.js +141 -0
- package/dist/management/recovery-manager.js.map +1 -0
- package/dist/management/shared-manager.d.ts +47 -0
- package/dist/management/shared-manager.d.ts.map +1 -0
- package/dist/management/shared-manager.js +388 -0
- package/dist/management/shared-manager.js.map +1 -0
- package/dist/types/cli.d.ts +50 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +16 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +51 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +26 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/delegation.d.ts +61 -0
- package/dist/types/delegation.d.ts.map +1 -0
- package/dist/types/delegation.js +6 -0
- package/dist/types/delegation.js.map +1 -0
- package/dist/types/glmt.d.ts +95 -0
- package/dist/types/glmt.d.ts.map +1 -0
- package/dist/types/glmt.js +7 -0
- package/dist/types/glmt.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/utils.d.ts +36 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +22 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/utils/claude-detector.d.ts +14 -0
- package/dist/utils/claude-detector.d.ts.map +1 -0
- package/dist/utils/claude-detector.js +112 -0
- package/dist/utils/claude-detector.js.map +1 -0
- package/dist/utils/claude-dir-installer.d.ts +46 -0
- package/dist/utils/claude-dir-installer.d.ts.map +1 -0
- package/dist/utils/claude-dir-installer.js +289 -0
- package/dist/utils/claude-dir-installer.js.map +1 -0
- package/dist/utils/claude-symlink-manager.d.ts +61 -0
- package/dist/utils/claude-symlink-manager.d.ts.map +1 -0
- package/dist/utils/claude-symlink-manager.js +291 -0
- package/dist/utils/claude-symlink-manager.js.map +1 -0
- package/dist/utils/config-manager.d.ts +32 -0
- package/dist/utils/config-manager.d.ts.map +1 -0
- package/dist/utils/config-manager.js +143 -0
- package/dist/utils/config-manager.js.map +1 -0
- package/dist/utils/delegation-validator.d.ts +39 -0
- package/dist/utils/delegation-validator.d.ts.map +1 -0
- package/dist/utils/delegation-validator.js +161 -0
- package/dist/utils/delegation-validator.js.map +1 -0
- package/dist/utils/error-codes.d.ts +36 -0
- package/dist/utils/error-codes.d.ts.map +1 -0
- package/dist/utils/error-codes.js +63 -0
- package/dist/utils/error-codes.js.map +1 -0
- package/dist/utils/error-manager.d.ts +59 -0
- package/dist/utils/error-manager.d.ts.map +1 -0
- package/dist/utils/error-manager.js +228 -0
- package/dist/utils/error-manager.js.map +1 -0
- package/dist/utils/helpers.d.ts +27 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +150 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/package-manager-detector.d.ts +14 -0
- package/dist/utils/package-manager-detector.d.ts.map +1 -0
- package/dist/utils/package-manager-detector.js +162 -0
- package/dist/utils/package-manager-detector.js.map +1 -0
- package/dist/utils/progress-indicator.d.ts +52 -0
- package/dist/utils/progress-indicator.d.ts.map +1 -0
- package/dist/utils/progress-indicator.js +102 -0
- package/dist/utils/progress-indicator.js.map +1 -0
- package/dist/utils/prompt.d.ts +29 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +116 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/shell-completion.d.ts +52 -0
- package/dist/utils/shell-completion.d.ts.map +1 -0
- package/dist/utils/shell-completion.js +231 -0
- package/dist/utils/shell-completion.js.map +1 -0
- package/dist/utils/shell-executor.d.ts +15 -0
- package/dist/utils/shell-executor.d.ts.map +1 -0
- package/dist/utils/shell-executor.js +57 -0
- package/dist/utils/shell-executor.js.map +1 -0
- package/dist/utils/update-checker.d.ts +48 -0
- package/dist/utils/update-checker.d.ts.map +1 -0
- package/dist/utils/update-checker.js +241 -0
- package/dist/utils/update-checker.js.map +1 -0
- package/lib/ccs +21 -1907
- package/lib/ccs.ps1 +26 -1800
- package/lib/error-codes.ps1 +2 -1
- package/lib/prompt.ps1 +2 -2
- package/package.json +31 -11
- package/scripts/add-shebang.js +39 -0
- package/scripts/bump-version.sh +25 -37
- package/scripts/dev-install.sh +32 -11
- package/scripts/postinstall.js +29 -29
- package/bin/auth/auth-commands.js +0 -499
- package/bin/auth/profile-detector.js +0 -204
- package/bin/auth/profile-registry.js +0 -225
- package/bin/ccs.js +0 -1034
- package/bin/delegation/README.md +0 -191
- package/bin/delegation/delegation-handler.js +0 -212
- package/bin/delegation/headless-executor.js +0 -618
- package/bin/delegation/result-formatter.js +0 -485
- package/bin/delegation/session-manager.js +0 -157
- package/bin/delegation/settings-parser.js +0 -109
- package/bin/glmt/delta-accumulator.js +0 -276
- package/bin/glmt/glmt-proxy.js +0 -495
- package/bin/glmt/glmt-transformer.js +0 -999
- package/bin/glmt/locale-enforcer.js +0 -72
- package/bin/glmt/reasoning-enforcer.js +0 -173
- package/bin/glmt/sse-parser.js +0 -96
- package/bin/management/doctor.js +0 -721
- package/bin/management/instance-manager.js +0 -202
- package/bin/management/recovery-manager.js +0 -135
- package/bin/management/shared-manager.js +0 -402
- package/bin/utils/claude-detector.js +0 -73
- package/bin/utils/claude-dir-installer.js +0 -283
- package/bin/utils/claude-symlink-manager.js +0 -289
- package/bin/utils/config-manager.js +0 -103
- package/bin/utils/delegation-validator.js +0 -154
- package/bin/utils/error-codes.js +0 -59
- package/bin/utils/error-manager.js +0 -165
- package/bin/utils/helpers.js +0 -136
- package/bin/utils/progress-indicator.js +0 -111
- package/bin/utils/prompt.js +0 -134
- package/bin/utils/shell-completion.js +0 -256
- package/bin/utils/update-checker.js +0 -243
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClaudeDirInstaller - Manages copying .claude/ directory from package to ~/.ccs/.claude/
|
|
4
|
+
* v4.1.1: Fix for npm install not copying .claude/ directory
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
|
+
if (mod && mod.__esModule) return mod;
|
|
24
|
+
var result = {};
|
|
25
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
26
|
+
__setModuleDefault(result, mod);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.ClaudeDirInstaller = void 0;
|
|
31
|
+
const fs = __importStar(require("fs"));
|
|
32
|
+
const path = __importStar(require("path"));
|
|
33
|
+
const os = __importStar(require("os"));
|
|
34
|
+
const helpers_1 = require("./helpers");
|
|
35
|
+
// Make ora optional (might not be available during npm install postinstall)
|
|
36
|
+
let ora = null;
|
|
37
|
+
try {
|
|
38
|
+
const oraModule = require('ora');
|
|
39
|
+
ora = oraModule.default || oraModule;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// ora not available, create fallback spinner that uses console.log
|
|
43
|
+
ora = function (text) {
|
|
44
|
+
return {
|
|
45
|
+
start: () => ({
|
|
46
|
+
succeed: (msg) => console.log(msg || `[OK] ${text}`),
|
|
47
|
+
fail: (msg) => console.log(msg || `[X] ${text}`),
|
|
48
|
+
warn: (msg) => console.log(msg || `[!] ${text}`),
|
|
49
|
+
info: (msg) => console.log(msg || `[i] ${text}`),
|
|
50
|
+
text: '',
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* ClaudeDirInstaller - Manages copying .claude/ directory from package to ~/.ccs/.claude/
|
|
57
|
+
*/
|
|
58
|
+
class ClaudeDirInstaller {
|
|
59
|
+
constructor() {
|
|
60
|
+
this.homeDir = os.homedir();
|
|
61
|
+
this.ccsClaudeDir = path.join(this.homeDir, '.ccs', '.claude');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Copy .claude/ directory from package to ~/.ccs/.claude/
|
|
65
|
+
* @param packageDir - Package installation directory (default: auto-detect)
|
|
66
|
+
* @param silent - Suppress spinner output
|
|
67
|
+
*/
|
|
68
|
+
install(packageDir, silent = false) {
|
|
69
|
+
const spinner = silent || !ora ? null : ora('Copying .claude/ items to ~/.ccs/.claude/').start();
|
|
70
|
+
try {
|
|
71
|
+
// Auto-detect package directory if not provided
|
|
72
|
+
if (!packageDir) {
|
|
73
|
+
// Try to find package root by going up from this file
|
|
74
|
+
packageDir = path.join(__dirname, '..', '..');
|
|
75
|
+
}
|
|
76
|
+
const packageClaudeDir = path.join(packageDir, '.claude');
|
|
77
|
+
if (!fs.existsSync(packageClaudeDir)) {
|
|
78
|
+
const msg = 'Package .claude/ directory not found';
|
|
79
|
+
if (spinner) {
|
|
80
|
+
spinner.warn(`[!] ${msg}`);
|
|
81
|
+
console.log(` Searched in: ${packageClaudeDir}`);
|
|
82
|
+
console.log(' This may be a development installation');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log(`[!] ${msg}`);
|
|
86
|
+
console.log(` Searched in: ${packageClaudeDir}`);
|
|
87
|
+
console.log(' This may be a development installation');
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
// Remove old version before copying new one
|
|
92
|
+
if (fs.existsSync(this.ccsClaudeDir)) {
|
|
93
|
+
if (spinner)
|
|
94
|
+
spinner.text = 'Removing old .claude/ items...';
|
|
95
|
+
fs.rmSync(this.ccsClaudeDir, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
// Use fs.cpSync for recursive copy (Node.js 16.7.0+)
|
|
98
|
+
if (spinner)
|
|
99
|
+
spinner.text = 'Copying .claude/ items...';
|
|
100
|
+
if (fs.cpSync) {
|
|
101
|
+
fs.cpSync(packageClaudeDir, this.ccsClaudeDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Fallback for Node.js < 16.7.0
|
|
105
|
+
this.copyDirRecursive(packageClaudeDir, this.ccsClaudeDir);
|
|
106
|
+
}
|
|
107
|
+
// Count files and directories
|
|
108
|
+
const itemCount = this.countItems(this.ccsClaudeDir);
|
|
109
|
+
const msg = `Copied .claude/ items (${itemCount.files} files, ${itemCount.dirs} directories)`;
|
|
110
|
+
if (spinner) {
|
|
111
|
+
spinner.succeed((0, helpers_1.colored)('[OK]', 'green') + ` ${msg}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(`[OK] ${msg}`);
|
|
115
|
+
}
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
const error = err;
|
|
120
|
+
const msg = `Failed to copy .claude/ directory: ${error.message}`;
|
|
121
|
+
if (spinner) {
|
|
122
|
+
spinner.fail((0, helpers_1.colored)('[!]', 'yellow') + ` ${msg}`);
|
|
123
|
+
console.warn(' CCS items may not be available');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.warn(`[!] ${msg}`);
|
|
127
|
+
console.warn(' CCS items may not be available');
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Recursively copy directory (fallback for Node.js < 16.7.0)
|
|
134
|
+
*/
|
|
135
|
+
copyDirRecursive(src, dest) {
|
|
136
|
+
// Create destination directory
|
|
137
|
+
if (!fs.existsSync(dest)) {
|
|
138
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
139
|
+
}
|
|
140
|
+
// Read source directory
|
|
141
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
142
|
+
for (const entry of entries) {
|
|
143
|
+
const srcPath = path.join(src, entry.name);
|
|
144
|
+
const destPath = path.join(dest, entry.name);
|
|
145
|
+
if (entry.isDirectory()) {
|
|
146
|
+
// Recursively copy subdirectory
|
|
147
|
+
this.copyDirRecursive(srcPath, destPath);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Copy file
|
|
151
|
+
fs.copyFileSync(srcPath, destPath);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Count files and directories in a path
|
|
157
|
+
*/
|
|
158
|
+
countItems(dirPath) {
|
|
159
|
+
let files = 0;
|
|
160
|
+
let dirs = 0;
|
|
161
|
+
const countRecursive = (p) => {
|
|
162
|
+
const entries = fs.readdirSync(p, { withFileTypes: true });
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
if (entry.isDirectory()) {
|
|
165
|
+
dirs++;
|
|
166
|
+
countRecursive(path.join(p, entry.name));
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
files++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
countRecursive(dirPath);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Ignore errors
|
|
178
|
+
}
|
|
179
|
+
return { files, dirs };
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Clean up deprecated files from previous installations
|
|
183
|
+
* Removes ccs-delegator.md that was deprecated in v4.3.2
|
|
184
|
+
*/
|
|
185
|
+
cleanupDeprecated(silent = false) {
|
|
186
|
+
const deprecatedFile = path.join(this.ccsClaudeDir, 'agents', 'ccs-delegator.md');
|
|
187
|
+
const userSymlinkFile = path.join(this.homeDir, '.claude', 'agents', 'ccs-delegator.md');
|
|
188
|
+
const migrationMarker = path.join(this.homeDir, '.ccs', '.migrations', 'v435-delegator-cleanup');
|
|
189
|
+
const cleanedFiles = [];
|
|
190
|
+
try {
|
|
191
|
+
// Check if cleanup already done
|
|
192
|
+
if (fs.existsSync(migrationMarker)) {
|
|
193
|
+
return { success: true, cleanedFiles: [] }; // Already cleaned
|
|
194
|
+
}
|
|
195
|
+
// Clean up user symlink in ~/.claude/agents/ccs-delegator.md FIRST
|
|
196
|
+
try {
|
|
197
|
+
const userStats = fs.lstatSync(userSymlinkFile);
|
|
198
|
+
if (userStats.isSymbolicLink()) {
|
|
199
|
+
fs.unlinkSync(userSymlinkFile);
|
|
200
|
+
cleanedFiles.push('user symlink');
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// It's not a symlink (user created their own file), backup it
|
|
204
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
205
|
+
const backupPath = `${userSymlinkFile}.backup-${timestamp}`;
|
|
206
|
+
fs.renameSync(userSymlinkFile, backupPath);
|
|
207
|
+
if (!silent)
|
|
208
|
+
console.log(`[i] Backed up user file to ${path.basename(backupPath)}`);
|
|
209
|
+
cleanedFiles.push('user file (backed up)');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
const error = err;
|
|
214
|
+
// File doesn't exist or other error - that's okay
|
|
215
|
+
if (error.code !== 'ENOENT' && !silent) {
|
|
216
|
+
console.log(`[!] Failed to remove user symlink: ${error.message}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Clean up package copy in ~/.ccs/.claude/agents/ccs-delegator.md
|
|
220
|
+
if (fs.existsSync(deprecatedFile)) {
|
|
221
|
+
try {
|
|
222
|
+
// Check if file was modified by user (compare with expected content)
|
|
223
|
+
const shouldBackup = this.shouldBackupDeprecatedFile(deprecatedFile);
|
|
224
|
+
if (shouldBackup) {
|
|
225
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
226
|
+
const backupPath = `${deprecatedFile}.backup-${timestamp}`;
|
|
227
|
+
fs.renameSync(deprecatedFile, backupPath);
|
|
228
|
+
if (!silent)
|
|
229
|
+
console.log(`[i] Backed up modified deprecated file to ${path.basename(backupPath)}`);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
fs.rmSync(deprecatedFile, { force: true });
|
|
233
|
+
}
|
|
234
|
+
cleanedFiles.push('package copy');
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
const error = err;
|
|
238
|
+
if (!silent)
|
|
239
|
+
console.log(`[!] Failed to remove package copy: ${error.message}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Create migration marker
|
|
243
|
+
if (cleanedFiles.length > 0) {
|
|
244
|
+
const migrationsDir = path.dirname(migrationMarker);
|
|
245
|
+
if (!fs.existsSync(migrationsDir)) {
|
|
246
|
+
fs.mkdirSync(migrationsDir, { recursive: true, mode: 0o700 });
|
|
247
|
+
}
|
|
248
|
+
fs.writeFileSync(migrationMarker, new Date().toISOString());
|
|
249
|
+
if (!silent) {
|
|
250
|
+
console.log(`[OK] Cleaned up deprecated agent files: ${cleanedFiles.join(', ')}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return { success: true, cleanedFiles };
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
const error = err;
|
|
257
|
+
if (!silent)
|
|
258
|
+
console.log(`[!] Cleanup failed: ${error.message}`);
|
|
259
|
+
return { success: false, error: error.message, cleanedFiles };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Check if deprecated file should be backed up (user modified)
|
|
264
|
+
*/
|
|
265
|
+
shouldBackupDeprecatedFile(filePath) {
|
|
266
|
+
try {
|
|
267
|
+
// Simple heuristic: if file size differs significantly from expected, assume user modified
|
|
268
|
+
// Expected size for ccs-delegator.md was around 2-3KB
|
|
269
|
+
const stats = fs.statSync(filePath);
|
|
270
|
+
const expectedMinSize = 1000; // 1KB minimum
|
|
271
|
+
const expectedMaxSize = 10000; // 10KB maximum
|
|
272
|
+
// If size is outside expected range, likely user modified
|
|
273
|
+
return stats.size < expectedMinSize || stats.size > expectedMaxSize;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// If we can't determine, err on side of caution and backup
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Check if ~/.ccs/.claude/ exists and is valid
|
|
282
|
+
*/
|
|
283
|
+
isInstalled() {
|
|
284
|
+
return fs.existsSync(this.ccsClaudeDir);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
exports.ClaudeDirInstaller = ClaudeDirInstaller;
|
|
288
|
+
exports.default = ClaudeDirInstaller;
|
|
289
|
+
//# sourceMappingURL=claude-dir-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-dir-installer.js","sourceRoot":"","sources":["../../src/utils/claude-dir-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeSymlinkManager - Manages selective symlinks from ~/.ccs/.claude/ to ~/.claude/
|
|
3
|
+
* v4.1.0: Selective symlinking for CCS items
|
|
4
|
+
*
|
|
5
|
+
* Purpose: Ship CCS items (.claude/) with package and symlink them to user's ~/.claude/
|
|
6
|
+
* Architecture:
|
|
7
|
+
* - ~/.ccs/.claude/* (source, ships with CCS)
|
|
8
|
+
* - ~/.claude/* (target, gets selective symlinks)
|
|
9
|
+
* - ~/.ccs/shared/ (UNTOUCHED, existing profile mechanism)
|
|
10
|
+
*
|
|
11
|
+
* Symlink Chain:
|
|
12
|
+
* profile -> ~/.ccs/shared/ -> ~/.claude/ (which has symlinks to ~/.ccs/.claude/)
|
|
13
|
+
*/
|
|
14
|
+
interface HealthCheckResult {
|
|
15
|
+
healthy: boolean;
|
|
16
|
+
issues: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ClaudeSymlinkManager - Manages selective symlinks from ~/.ccs/.claude/ to ~/.claude/
|
|
20
|
+
*/
|
|
21
|
+
export declare class ClaudeSymlinkManager {
|
|
22
|
+
private homeDir;
|
|
23
|
+
private ccsClaudeDir;
|
|
24
|
+
private userClaudeDir;
|
|
25
|
+
private ccsItems;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Install CCS items to user's ~/.claude/ via selective symlinks
|
|
29
|
+
* Safe: backs up existing files before creating symlinks
|
|
30
|
+
*/
|
|
31
|
+
install(silent?: boolean): void;
|
|
32
|
+
/**
|
|
33
|
+
* Install a single CCS item with conflict handling
|
|
34
|
+
*/
|
|
35
|
+
private installItem;
|
|
36
|
+
/**
|
|
37
|
+
* Check if target is already the correct symlink pointing to source
|
|
38
|
+
*/
|
|
39
|
+
private isOurSymlink;
|
|
40
|
+
/**
|
|
41
|
+
* Backup existing item before replacing with symlink
|
|
42
|
+
*/
|
|
43
|
+
private backupItem;
|
|
44
|
+
/**
|
|
45
|
+
* Uninstall CCS items from ~/.claude/ (remove symlinks only)
|
|
46
|
+
* Safe: only removes items that are CCS symlinks
|
|
47
|
+
*/
|
|
48
|
+
uninstall(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Check symlink health and report issues
|
|
51
|
+
* Used by 'ccs doctor' command
|
|
52
|
+
*/
|
|
53
|
+
checkHealth(): HealthCheckResult;
|
|
54
|
+
/**
|
|
55
|
+
* Sync delegation commands and skills to ~/.claude/ (used by 'ccs sync' command)
|
|
56
|
+
* Same as install() but with explicit sync message
|
|
57
|
+
*/
|
|
58
|
+
sync(): void;
|
|
59
|
+
}
|
|
60
|
+
export default ClaudeSymlinkManager;
|
|
61
|
+
//# sourceMappingURL=claude-symlink-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-symlink-manager.d.ts","sourceRoot":"","sources":["../../src/utils/claude-symlink-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8CH,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAY;;IAe5B;;;OAGG;IACH,OAAO,CAAC,MAAM,UAAQ,GAAG,IAAI;IAwC7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgDnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;;OAGG;IACH,SAAS,IAAI,IAAI;IA2BjB;;;OAGG;IACH,WAAW,IAAI,iBAAiB;IAoChC;;;OAGG;IACH,IAAI,IAAI,IAAI;CAMb;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClaudeSymlinkManager - Manages selective symlinks from ~/.ccs/.claude/ to ~/.claude/
|
|
4
|
+
* v4.1.0: Selective symlinking for CCS items
|
|
5
|
+
*
|
|
6
|
+
* Purpose: Ship CCS items (.claude/) with package and symlink them to user's ~/.claude/
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - ~/.ccs/.claude/* (source, ships with CCS)
|
|
9
|
+
* - ~/.claude/* (target, gets selective symlinks)
|
|
10
|
+
* - ~/.ccs/shared/ (UNTOUCHED, existing profile mechanism)
|
|
11
|
+
*
|
|
12
|
+
* Symlink Chain:
|
|
13
|
+
* profile -> ~/.ccs/shared/ -> ~/.claude/ (which has symlinks to ~/.ccs/.claude/)
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ClaudeSymlinkManager = void 0;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const helpers_1 = require("./helpers");
|
|
44
|
+
// Make ora optional (might not be available during npm install postinstall)
|
|
45
|
+
let ora = null;
|
|
46
|
+
try {
|
|
47
|
+
const oraModule = require('ora');
|
|
48
|
+
ora = oraModule.default || oraModule;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// ora not available, create fallback spinner that uses console.log
|
|
52
|
+
ora = function (text) {
|
|
53
|
+
return {
|
|
54
|
+
start: () => ({
|
|
55
|
+
succeed: (msg) => console.log(msg || `[OK] ${text}`),
|
|
56
|
+
fail: (msg) => console.log(msg || `[X] ${text}`),
|
|
57
|
+
warn: (msg) => console.log(msg || `[!] ${text}`),
|
|
58
|
+
info: (msg) => console.log(msg || `[i] ${text}`),
|
|
59
|
+
text: '',
|
|
60
|
+
}),
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* ClaudeSymlinkManager - Manages selective symlinks from ~/.ccs/.claude/ to ~/.claude/
|
|
66
|
+
*/
|
|
67
|
+
class ClaudeSymlinkManager {
|
|
68
|
+
constructor() {
|
|
69
|
+
this.homeDir = os.homedir();
|
|
70
|
+
this.ccsClaudeDir = path.join(this.homeDir, '.ccs', '.claude');
|
|
71
|
+
this.userClaudeDir = path.join(this.homeDir, '.claude');
|
|
72
|
+
// CCS items to symlink (selective, item-level)
|
|
73
|
+
this.ccsItems = [
|
|
74
|
+
{ source: 'commands/ccs.md', target: 'commands/ccs.md', type: 'file' },
|
|
75
|
+
{ source: 'commands/ccs', target: 'commands/ccs', type: 'directory' },
|
|
76
|
+
{ source: 'skills/ccs-delegation', target: 'skills/ccs-delegation', type: 'directory' },
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Install CCS items to user's ~/.claude/ via selective symlinks
|
|
81
|
+
* Safe: backs up existing files before creating symlinks
|
|
82
|
+
*/
|
|
83
|
+
install(silent = false) {
|
|
84
|
+
const spinner = silent || !ora ? null : ora('Installing CCS items to ~/.claude/').start();
|
|
85
|
+
// Ensure ~/.ccs/.claude/ exists (should be shipped with package)
|
|
86
|
+
if (!fs.existsSync(this.ccsClaudeDir)) {
|
|
87
|
+
const msg = 'CCS .claude/ directory not found, skipping symlink installation';
|
|
88
|
+
if (spinner) {
|
|
89
|
+
spinner.warn(`[!] ${msg}`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(`[!] ${msg}`);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Create ~/.claude/ if missing
|
|
97
|
+
if (!fs.existsSync(this.userClaudeDir)) {
|
|
98
|
+
if (!silent) {
|
|
99
|
+
if (spinner)
|
|
100
|
+
spinner.text = 'Creating ~/.claude/ directory';
|
|
101
|
+
}
|
|
102
|
+
fs.mkdirSync(this.userClaudeDir, { recursive: true, mode: 0o700 });
|
|
103
|
+
}
|
|
104
|
+
// Install each CCS item
|
|
105
|
+
let installed = 0;
|
|
106
|
+
for (const item of this.ccsItems) {
|
|
107
|
+
if (!silent && spinner) {
|
|
108
|
+
spinner.text = `Installing ${item.target}...`;
|
|
109
|
+
}
|
|
110
|
+
const result = this.installItem(item, silent);
|
|
111
|
+
if (result)
|
|
112
|
+
installed++;
|
|
113
|
+
}
|
|
114
|
+
const msg = `${installed}/${this.ccsItems.length} items installed to ~/.claude/`;
|
|
115
|
+
if (spinner) {
|
|
116
|
+
spinner.succeed((0, helpers_1.colored)('[OK]', 'green') + ` ${msg}`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(`[OK] ${msg}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Install a single CCS item with conflict handling
|
|
124
|
+
*/
|
|
125
|
+
installItem(item, silent = false) {
|
|
126
|
+
const sourcePath = path.join(this.ccsClaudeDir, item.source);
|
|
127
|
+
const targetPath = path.join(this.userClaudeDir, item.target);
|
|
128
|
+
const targetDir = path.dirname(targetPath);
|
|
129
|
+
// Ensure source exists
|
|
130
|
+
if (!fs.existsSync(sourcePath)) {
|
|
131
|
+
if (!silent)
|
|
132
|
+
console.log(`[!] Source not found: ${item.source}, skipping`);
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
// Create target parent directory if needed
|
|
136
|
+
if (!fs.existsSync(targetDir)) {
|
|
137
|
+
fs.mkdirSync(targetDir, { recursive: true, mode: 0o700 });
|
|
138
|
+
}
|
|
139
|
+
// Check if target already exists
|
|
140
|
+
if (fs.existsSync(targetPath)) {
|
|
141
|
+
// Check if it's already the correct symlink
|
|
142
|
+
if (this.isOurSymlink(targetPath, sourcePath)) {
|
|
143
|
+
return true; // Already correct, counts as success
|
|
144
|
+
}
|
|
145
|
+
// Backup existing file/directory
|
|
146
|
+
this.backupItem(targetPath, silent);
|
|
147
|
+
}
|
|
148
|
+
// Create symlink
|
|
149
|
+
try {
|
|
150
|
+
const symlinkType = item.type === 'directory' ? 'dir' : 'file';
|
|
151
|
+
fs.symlinkSync(sourcePath, targetPath, symlinkType);
|
|
152
|
+
if (!silent)
|
|
153
|
+
console.log(`[OK] Symlinked ${item.target}`);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
// Windows fallback: stub for now, full implementation in v4.2
|
|
158
|
+
if (process.platform === 'win32') {
|
|
159
|
+
if (!silent) {
|
|
160
|
+
console.log(`[!] Symlink failed for ${item.target} (Windows fallback deferred to v4.2)`);
|
|
161
|
+
console.log(`[i] Enable Developer Mode or wait for next update`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const error = err;
|
|
166
|
+
if (!silent)
|
|
167
|
+
console.log(`[!] Failed to symlink ${item.target}: ${error.message}`);
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Check if target is already the correct symlink pointing to source
|
|
174
|
+
*/
|
|
175
|
+
isOurSymlink(targetPath, expectedSource) {
|
|
176
|
+
try {
|
|
177
|
+
const stats = fs.lstatSync(targetPath);
|
|
178
|
+
if (!stats.isSymbolicLink()) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const actualTarget = fs.readlinkSync(targetPath);
|
|
182
|
+
const resolvedTarget = path.resolve(path.dirname(targetPath), actualTarget);
|
|
183
|
+
return resolvedTarget === expectedSource;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Backup existing item before replacing with symlink
|
|
191
|
+
*/
|
|
192
|
+
backupItem(itemPath, silent = false) {
|
|
193
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
194
|
+
const backupPath = `${itemPath}.backup-${timestamp}`;
|
|
195
|
+
try {
|
|
196
|
+
// If backup already exists, use counter
|
|
197
|
+
let finalBackupPath = backupPath;
|
|
198
|
+
let counter = 1;
|
|
199
|
+
while (fs.existsSync(finalBackupPath)) {
|
|
200
|
+
finalBackupPath = `${backupPath}-${counter}`;
|
|
201
|
+
counter++;
|
|
202
|
+
}
|
|
203
|
+
fs.renameSync(itemPath, finalBackupPath);
|
|
204
|
+
if (!silent)
|
|
205
|
+
console.log(`[i] Backed up existing item to ${path.basename(finalBackupPath)}`);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
const error = err;
|
|
209
|
+
if (!silent)
|
|
210
|
+
console.log(`[!] Failed to backup ${itemPath}: ${error.message}`);
|
|
211
|
+
throw err; // Don't proceed if backup fails
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Uninstall CCS items from ~/.claude/ (remove symlinks only)
|
|
216
|
+
* Safe: only removes items that are CCS symlinks
|
|
217
|
+
*/
|
|
218
|
+
uninstall() {
|
|
219
|
+
let removed = 0;
|
|
220
|
+
for (const item of this.ccsItems) {
|
|
221
|
+
const targetPath = path.join(this.userClaudeDir, item.target);
|
|
222
|
+
const sourcePath = path.join(this.ccsClaudeDir, item.source);
|
|
223
|
+
// Only remove if it's our symlink
|
|
224
|
+
if (fs.existsSync(targetPath) && this.isOurSymlink(targetPath, sourcePath)) {
|
|
225
|
+
try {
|
|
226
|
+
fs.unlinkSync(targetPath);
|
|
227
|
+
console.log(`[OK] Removed ${item.target}`);
|
|
228
|
+
removed++;
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
const error = err;
|
|
232
|
+
console.log(`[!] Failed to remove ${item.target}: ${error.message}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (removed > 0) {
|
|
237
|
+
console.log(`[OK] Removed ${removed} delegation commands and skills from ~/.claude/`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.log('[i] No delegation commands or skills to remove');
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check symlink health and report issues
|
|
245
|
+
* Used by 'ccs doctor' command
|
|
246
|
+
*/
|
|
247
|
+
checkHealth() {
|
|
248
|
+
const issues = [];
|
|
249
|
+
let healthy = true;
|
|
250
|
+
// Check if ~/.ccs/.claude/ exists
|
|
251
|
+
if (!fs.existsSync(this.ccsClaudeDir)) {
|
|
252
|
+
issues.push('CCS .claude/ directory missing (reinstall CCS)');
|
|
253
|
+
healthy = false;
|
|
254
|
+
return { healthy, issues };
|
|
255
|
+
}
|
|
256
|
+
// Check each item
|
|
257
|
+
for (const item of this.ccsItems) {
|
|
258
|
+
const sourcePath = path.join(this.ccsClaudeDir, item.source);
|
|
259
|
+
const targetPath = path.join(this.userClaudeDir, item.target);
|
|
260
|
+
// Check source exists
|
|
261
|
+
if (!fs.existsSync(sourcePath)) {
|
|
262
|
+
issues.push(`Source missing: ${item.source}`);
|
|
263
|
+
healthy = false;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
// Check target
|
|
267
|
+
if (!fs.existsSync(targetPath)) {
|
|
268
|
+
issues.push(`Not installed: ${item.target} (run 'ccs sync' to install)`);
|
|
269
|
+
healthy = false;
|
|
270
|
+
}
|
|
271
|
+
else if (!this.isOurSymlink(targetPath, sourcePath)) {
|
|
272
|
+
issues.push(`Not a CCS symlink: ${item.target} (run 'ccs sync' to fix)`);
|
|
273
|
+
healthy = false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return { healthy, issues };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Sync delegation commands and skills to ~/.claude/ (used by 'ccs sync' command)
|
|
280
|
+
* Same as install() but with explicit sync message
|
|
281
|
+
*/
|
|
282
|
+
sync() {
|
|
283
|
+
console.log('');
|
|
284
|
+
console.log((0, helpers_1.colored)('Syncing CCS Components...', 'cyan'));
|
|
285
|
+
console.log('');
|
|
286
|
+
this.install(false);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
exports.ClaudeSymlinkManager = ClaudeSymlinkManager;
|
|
290
|
+
exports.default = ClaudeSymlinkManager;
|
|
291
|
+
//# sourceMappingURL=claude-symlink-manager.js.map
|