@kaitranntt/ccs 4.4.0 → 5.0.1

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 (262) hide show
  1. package/README.md +98 -7
  2. package/VERSION +1 -1
  3. package/config/base-agy.settings.json +10 -0
  4. package/config/base-codex.settings.json +10 -0
  5. package/config/base-gemini.settings.json +10 -0
  6. package/dist/auth/auth-commands.d.ts +52 -0
  7. package/dist/auth/auth-commands.d.ts.map +1 -0
  8. package/dist/auth/auth-commands.js +479 -0
  9. package/dist/auth/auth-commands.js.map +1 -0
  10. package/dist/auth/profile-detector.d.ts +68 -0
  11. package/dist/auth/profile-detector.d.ts.map +1 -0
  12. package/dist/auth/profile-detector.js +209 -0
  13. package/dist/auth/profile-detector.js.map +1 -0
  14. package/dist/auth/profile-registry.d.ts +60 -0
  15. package/dist/auth/profile-registry.d.ts.map +1 -0
  16. package/dist/auth/profile-registry.js +188 -0
  17. package/dist/auth/profile-registry.js.map +1 -0
  18. package/dist/ccs.d.ts +10 -0
  19. package/dist/ccs.d.ts.map +1 -0
  20. package/dist/ccs.js +320 -0
  21. package/dist/ccs.js.map +1 -0
  22. package/dist/cliproxy/auth-handler.d.ts +95 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +443 -0
  25. package/dist/cliproxy/auth-handler.js.map +1 -0
  26. package/dist/cliproxy/base-config-loader.d.ts +42 -0
  27. package/dist/cliproxy/base-config-loader.d.ts.map +1 -0
  28. package/dist/cliproxy/base-config-loader.js +123 -0
  29. package/dist/cliproxy/base-config-loader.js.map +1 -0
  30. package/dist/cliproxy/binary-manager.d.ts +104 -0
  31. package/dist/cliproxy/binary-manager.d.ts.map +1 -0
  32. package/dist/cliproxy/binary-manager.js +567 -0
  33. package/dist/cliproxy/binary-manager.js.map +1 -0
  34. package/dist/cliproxy/cliproxy-executor.d.ts +33 -0
  35. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -0
  36. package/dist/cliproxy/cliproxy-executor.js +297 -0
  37. package/dist/cliproxy/cliproxy-executor.js.map +1 -0
  38. package/dist/cliproxy/config-generator.d.ts +89 -0
  39. package/dist/cliproxy/config-generator.d.ts.map +1 -0
  40. package/dist/cliproxy/config-generator.js +263 -0
  41. package/dist/cliproxy/config-generator.js.map +1 -0
  42. package/dist/cliproxy/index.d.ts +13 -0
  43. package/dist/cliproxy/index.d.ts.map +1 -0
  44. package/dist/cliproxy/index.js +62 -0
  45. package/dist/cliproxy/index.js.map +1 -0
  46. package/dist/cliproxy/platform-detector.d.ts +48 -0
  47. package/dist/cliproxy/platform-detector.d.ts.map +1 -0
  48. package/dist/cliproxy/platform-detector.js +118 -0
  49. package/dist/cliproxy/platform-detector.js.map +1 -0
  50. package/dist/cliproxy/types.d.ts +169 -0
  51. package/dist/cliproxy/types.d.ts.map +1 -0
  52. package/dist/cliproxy/types.js +7 -0
  53. package/dist/cliproxy/types.js.map +1 -0
  54. package/dist/commands/doctor-command.d.ts +10 -0
  55. package/dist/commands/doctor-command.d.ts.map +1 -0
  56. package/dist/commands/doctor-command.js +44 -0
  57. package/dist/commands/doctor-command.js.map +1 -0
  58. package/dist/commands/help-command.d.ts +5 -0
  59. package/dist/commands/help-command.d.ts.map +1 -0
  60. package/dist/commands/help-command.js +104 -0
  61. package/dist/commands/help-command.js.map +1 -0
  62. package/dist/commands/install-command.d.ts +14 -0
  63. package/dist/commands/install-command.d.ts.map +1 -0
  64. package/dist/commands/install-command.js +39 -0
  65. package/dist/commands/install-command.js.map +1 -0
  66. package/dist/commands/shell-completion-command.d.ts +10 -0
  67. package/dist/commands/shell-completion-command.d.ts.map +1 -0
  68. package/dist/commands/shell-completion-command.js +85 -0
  69. package/dist/commands/shell-completion-command.js.map +1 -0
  70. package/dist/commands/sync-command.d.ts +10 -0
  71. package/dist/commands/sync-command.d.ts.map +1 -0
  72. package/dist/commands/sync-command.js +59 -0
  73. package/dist/commands/sync-command.js.map +1 -0
  74. package/dist/commands/update-command.d.ts +12 -0
  75. package/dist/commands/update-command.d.ts.map +1 -0
  76. package/dist/commands/update-command.js +295 -0
  77. package/dist/commands/update-command.js.map +1 -0
  78. package/dist/commands/version-command.d.ts +10 -0
  79. package/dist/commands/version-command.d.ts.map +1 -0
  80. package/dist/commands/version-command.js +100 -0
  81. package/dist/commands/version-command.js.map +1 -0
  82. package/dist/delegation/delegation-handler.d.ts +60 -0
  83. package/dist/delegation/delegation-handler.d.ts.map +1 -0
  84. package/dist/delegation/delegation-handler.js +174 -0
  85. package/dist/delegation/delegation-handler.js.map +1 -0
  86. package/dist/delegation/headless-executor.d.ts +114 -0
  87. package/dist/delegation/headless-executor.d.ts.map +1 -0
  88. package/dist/delegation/headless-executor.js +562 -0
  89. package/dist/delegation/headless-executor.js.map +1 -0
  90. package/dist/delegation/result-formatter.d.ts +108 -0
  91. package/dist/delegation/result-formatter.d.ts.map +1 -0
  92. package/dist/delegation/result-formatter.js +391 -0
  93. package/dist/delegation/result-formatter.js.map +1 -0
  94. package/dist/delegation/session-manager.d.ts +58 -0
  95. package/dist/delegation/session-manager.d.ts.map +1 -0
  96. package/dist/delegation/session-manager.js +153 -0
  97. package/dist/delegation/session-manager.js.map +1 -0
  98. package/dist/delegation/settings-parser.d.ts +31 -0
  99. package/dist/delegation/settings-parser.d.ts.map +1 -0
  100. package/dist/delegation/settings-parser.js +107 -0
  101. package/dist/delegation/settings-parser.js.map +1 -0
  102. package/dist/glmt/delta-accumulator.d.ts +210 -0
  103. package/dist/glmt/delta-accumulator.d.ts.map +1 -0
  104. package/dist/glmt/delta-accumulator.js +351 -0
  105. package/dist/glmt/delta-accumulator.js.map +1 -0
  106. package/dist/glmt/glmt-proxy.d.ts +72 -0
  107. package/dist/glmt/glmt-proxy.d.ts.map +1 -0
  108. package/dist/glmt/glmt-proxy.js +427 -0
  109. package/dist/glmt/glmt-proxy.js.map +1 -0
  110. package/dist/glmt/glmt-transformer.d.ts +265 -0
  111. package/dist/glmt/glmt-transformer.d.ts.map +1 -0
  112. package/dist/glmt/glmt-transformer.js +832 -0
  113. package/dist/glmt/glmt-transformer.js.map +1 -0
  114. package/dist/glmt/locale-enforcer.d.ts +38 -0
  115. package/dist/glmt/locale-enforcer.d.ts.map +1 -0
  116. package/dist/glmt/locale-enforcer.js +69 -0
  117. package/dist/glmt/locale-enforcer.js.map +1 -0
  118. package/dist/glmt/reasoning-enforcer.d.ts +52 -0
  119. package/dist/glmt/reasoning-enforcer.d.ts.map +1 -0
  120. package/dist/glmt/reasoning-enforcer.js +151 -0
  121. package/dist/glmt/reasoning-enforcer.js.map +1 -0
  122. package/dist/glmt/sse-parser.d.ts +47 -0
  123. package/dist/glmt/sse-parser.d.ts.map +1 -0
  124. package/dist/glmt/sse-parser.js +93 -0
  125. package/dist/glmt/sse-parser.js.map +1 -0
  126. package/dist/management/doctor.d.ts +104 -0
  127. package/dist/management/doctor.d.ts.map +1 -0
  128. package/dist/management/doctor.js +673 -0
  129. package/dist/management/doctor.js.map +1 -0
  130. package/dist/management/instance-manager.d.ts +57 -0
  131. package/dist/management/instance-manager.d.ts.map +1 -0
  132. package/dist/management/instance-manager.js +195 -0
  133. package/dist/management/instance-manager.js.map +1 -0
  134. package/dist/management/recovery-manager.d.ts +39 -0
  135. package/dist/management/recovery-manager.d.ts.map +1 -0
  136. package/dist/management/recovery-manager.js +141 -0
  137. package/dist/management/recovery-manager.js.map +1 -0
  138. package/dist/management/shared-manager.d.ts +47 -0
  139. package/dist/management/shared-manager.d.ts.map +1 -0
  140. package/dist/management/shared-manager.js +388 -0
  141. package/dist/management/shared-manager.js.map +1 -0
  142. package/dist/types/cli.d.ts +50 -0
  143. package/dist/types/cli.d.ts.map +1 -0
  144. package/dist/types/cli.js +16 -0
  145. package/dist/types/cli.js.map +1 -0
  146. package/dist/types/config.d.ts +51 -0
  147. package/dist/types/config.d.ts.map +1 -0
  148. package/dist/types/config.js +26 -0
  149. package/dist/types/config.js.map +1 -0
  150. package/dist/types/delegation.d.ts +61 -0
  151. package/dist/types/delegation.d.ts.map +1 -0
  152. package/dist/types/delegation.js +6 -0
  153. package/dist/types/delegation.js.map +1 -0
  154. package/dist/types/glmt.d.ts +95 -0
  155. package/dist/types/glmt.d.ts.map +1 -0
  156. package/dist/types/glmt.js +7 -0
  157. package/dist/types/glmt.js.map +1 -0
  158. package/dist/types/index.d.ts +13 -0
  159. package/dist/types/index.d.ts.map +1 -0
  160. package/dist/types/index.js +16 -0
  161. package/dist/types/index.js.map +1 -0
  162. package/dist/types/utils.d.ts +36 -0
  163. package/dist/types/utils.d.ts.map +1 -0
  164. package/dist/types/utils.js +22 -0
  165. package/dist/types/utils.js.map +1 -0
  166. package/dist/utils/claude-detector.d.ts +14 -0
  167. package/dist/utils/claude-detector.d.ts.map +1 -0
  168. package/dist/utils/claude-detector.js +112 -0
  169. package/dist/utils/claude-detector.js.map +1 -0
  170. package/dist/utils/claude-dir-installer.d.ts +46 -0
  171. package/dist/utils/claude-dir-installer.d.ts.map +1 -0
  172. package/dist/utils/claude-dir-installer.js +289 -0
  173. package/dist/utils/claude-dir-installer.js.map +1 -0
  174. package/dist/utils/claude-symlink-manager.d.ts +61 -0
  175. package/dist/utils/claude-symlink-manager.d.ts.map +1 -0
  176. package/dist/utils/claude-symlink-manager.js +291 -0
  177. package/dist/utils/claude-symlink-manager.js.map +1 -0
  178. package/dist/utils/config-manager.d.ts +32 -0
  179. package/dist/utils/config-manager.d.ts.map +1 -0
  180. package/dist/utils/config-manager.js +143 -0
  181. package/dist/utils/config-manager.js.map +1 -0
  182. package/dist/utils/delegation-validator.d.ts +39 -0
  183. package/dist/utils/delegation-validator.d.ts.map +1 -0
  184. package/dist/utils/delegation-validator.js +161 -0
  185. package/dist/utils/delegation-validator.js.map +1 -0
  186. package/dist/utils/error-codes.d.ts +36 -0
  187. package/dist/utils/error-codes.d.ts.map +1 -0
  188. package/dist/utils/error-codes.js +63 -0
  189. package/dist/utils/error-codes.js.map +1 -0
  190. package/dist/utils/error-manager.d.ts +59 -0
  191. package/dist/utils/error-manager.d.ts.map +1 -0
  192. package/dist/utils/error-manager.js +228 -0
  193. package/dist/utils/error-manager.js.map +1 -0
  194. package/dist/utils/helpers.d.ts +27 -0
  195. package/dist/utils/helpers.d.ts.map +1 -0
  196. package/dist/utils/helpers.js +150 -0
  197. package/dist/utils/helpers.js.map +1 -0
  198. package/dist/utils/package-manager-detector.d.ts +14 -0
  199. package/dist/utils/package-manager-detector.d.ts.map +1 -0
  200. package/dist/utils/package-manager-detector.js +162 -0
  201. package/dist/utils/package-manager-detector.js.map +1 -0
  202. package/dist/utils/progress-indicator.d.ts +52 -0
  203. package/dist/utils/progress-indicator.d.ts.map +1 -0
  204. package/dist/utils/progress-indicator.js +102 -0
  205. package/dist/utils/progress-indicator.js.map +1 -0
  206. package/dist/utils/prompt.d.ts +29 -0
  207. package/dist/utils/prompt.d.ts.map +1 -0
  208. package/dist/utils/prompt.js +116 -0
  209. package/dist/utils/prompt.js.map +1 -0
  210. package/dist/utils/shell-completion.d.ts +52 -0
  211. package/dist/utils/shell-completion.d.ts.map +1 -0
  212. package/dist/utils/shell-completion.js +231 -0
  213. package/dist/utils/shell-completion.js.map +1 -0
  214. package/dist/utils/shell-executor.d.ts +15 -0
  215. package/dist/utils/shell-executor.d.ts.map +1 -0
  216. package/dist/utils/shell-executor.js +57 -0
  217. package/dist/utils/shell-executor.js.map +1 -0
  218. package/dist/utils/update-checker.d.ts +48 -0
  219. package/dist/utils/update-checker.d.ts.map +1 -0
  220. package/dist/utils/update-checker.js +241 -0
  221. package/dist/utils/update-checker.js.map +1 -0
  222. package/lib/ccs +21 -1907
  223. package/lib/ccs.ps1 +26 -1800
  224. package/lib/error-codes.ps1 +2 -1
  225. package/lib/prompt.ps1 +2 -2
  226. package/package.json +31 -11
  227. package/scripts/add-shebang.js +39 -0
  228. package/scripts/bump-version.sh +25 -37
  229. package/scripts/dev-install.sh +32 -11
  230. package/scripts/postinstall.js +29 -29
  231. package/bin/auth/auth-commands.js +0 -499
  232. package/bin/auth/profile-detector.js +0 -204
  233. package/bin/auth/profile-registry.js +0 -225
  234. package/bin/ccs.js +0 -1034
  235. package/bin/delegation/README.md +0 -191
  236. package/bin/delegation/delegation-handler.js +0 -212
  237. package/bin/delegation/headless-executor.js +0 -618
  238. package/bin/delegation/result-formatter.js +0 -485
  239. package/bin/delegation/session-manager.js +0 -157
  240. package/bin/delegation/settings-parser.js +0 -109
  241. package/bin/glmt/delta-accumulator.js +0 -276
  242. package/bin/glmt/glmt-proxy.js +0 -495
  243. package/bin/glmt/glmt-transformer.js +0 -999
  244. package/bin/glmt/locale-enforcer.js +0 -72
  245. package/bin/glmt/reasoning-enforcer.js +0 -173
  246. package/bin/glmt/sse-parser.js +0 -96
  247. package/bin/management/doctor.js +0 -721
  248. package/bin/management/instance-manager.js +0 -202
  249. package/bin/management/recovery-manager.js +0 -135
  250. package/bin/management/shared-manager.js +0 -402
  251. package/bin/utils/claude-detector.js +0 -73
  252. package/bin/utils/claude-dir-installer.js +0 -283
  253. package/bin/utils/claude-symlink-manager.js +0 -289
  254. package/bin/utils/config-manager.js +0 -103
  255. package/bin/utils/delegation-validator.js +0 -154
  256. package/bin/utils/error-codes.js +0 -59
  257. package/bin/utils/error-manager.js +0 -165
  258. package/bin/utils/helpers.js +0 -136
  259. package/bin/utils/progress-indicator.js +0 -111
  260. package/bin/utils/prompt.js +0 -134
  261. package/bin/utils/shell-completion.js +0 -256
  262. 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