@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,52 @@
1
+ /**
2
+ * Simple Progress Indicator (no external dependencies)
3
+ *
4
+ * Features:
5
+ * - ASCII-only spinner frames (cross-platform compatible)
6
+ * - TTY detection (no spinners in pipes/logs)
7
+ * - Elapsed time display
8
+ * - CI environment detection
9
+ */
10
+ interface ProgressOptions {
11
+ frames?: string[];
12
+ interval?: number;
13
+ }
14
+ export declare class ProgressIndicator {
15
+ private message;
16
+ private frames;
17
+ private frameIndex;
18
+ private interval;
19
+ private startTime;
20
+ private isTTY;
21
+ /**
22
+ * Create a progress indicator
23
+ * @param message - Message to display
24
+ * @param options - Options
25
+ */
26
+ constructor(message: string, options?: ProgressOptions);
27
+ /**
28
+ * Start the spinner
29
+ */
30
+ start(): void;
31
+ /**
32
+ * Stop spinner with success message
33
+ * @param message - Optional success message (defaults to original message)
34
+ */
35
+ succeed(message?: string): void;
36
+ /**
37
+ * Stop spinner with failure message
38
+ * @param message - Optional failure message (defaults to original message)
39
+ */
40
+ fail(message?: string): void;
41
+ /**
42
+ * Update spinner message (while running)
43
+ * @param newMessage - New message to display
44
+ */
45
+ update(newMessage: string): void;
46
+ /**
47
+ * Stop the spinner without showing success/failure
48
+ */
49
+ stop(): void;
50
+ }
51
+ export default ProgressIndicator;
52
+ //# sourceMappingURL=progress-indicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-indicator.d.ts","sourceRoot":"","sources":["../../src/utils/progress-indicator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAU;IAEvB;;;;OAIG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAY1D;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb;;;OAGG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAc/B;;;OAGG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAa5B;;;OAGG;IACH,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,IAAI,IAAI,IAAI;CAWb;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * Simple Progress Indicator (no external dependencies)
4
+ *
5
+ * Features:
6
+ * - ASCII-only spinner frames (cross-platform compatible)
7
+ * - TTY detection (no spinners in pipes/logs)
8
+ * - Elapsed time display
9
+ * - CI environment detection
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProgressIndicator = void 0;
13
+ class ProgressIndicator {
14
+ /**
15
+ * Create a progress indicator
16
+ * @param message - Message to display
17
+ * @param options - Options
18
+ */
19
+ constructor(message, options = {}) {
20
+ this.message = message;
21
+ // ASCII-only frames for cross-platform compatibility
22
+ this.frames = options.frames || ['|', '/', '-', '\\'];
23
+ this.frameIndex = 0;
24
+ this.interval = null;
25
+ this.startTime = Date.now();
26
+ // TTY detection: only animate if stderr is TTY and not in CI
27
+ this.isTTY = process.stderr.isTTY === true && !process.env.CI && !process.env.NO_COLOR;
28
+ }
29
+ /**
30
+ * Start the spinner
31
+ */
32
+ start() {
33
+ if (!this.isTTY) {
34
+ // Non-TTY: just print message once
35
+ process.stderr.write(`[i] ${this.message}...\n`);
36
+ return;
37
+ }
38
+ // TTY: animate spinner
39
+ this.interval = setInterval(() => {
40
+ const frame = this.frames[this.frameIndex];
41
+ const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(1);
42
+ process.stderr.write(`\r[${frame}] ${this.message}... (${elapsed}s)`);
43
+ this.frameIndex = (this.frameIndex + 1) % this.frames.length;
44
+ }, 80); // 12.5fps for smooth animation
45
+ }
46
+ /**
47
+ * Stop spinner with success message
48
+ * @param message - Optional success message (defaults to original message)
49
+ */
50
+ succeed(message) {
51
+ this.stop();
52
+ const finalMessage = message || this.message;
53
+ const elapsed = ((Date.now() - this.startTime) / 1000).toFixed(1);
54
+ if (this.isTTY) {
55
+ // Clear spinner line and show success
56
+ process.stderr.write(`\r[OK] ${finalMessage} (${elapsed}s)\n`);
57
+ }
58
+ else {
59
+ // Non-TTY: just show completion
60
+ process.stderr.write(`[OK] ${finalMessage}\n`);
61
+ }
62
+ }
63
+ /**
64
+ * Stop spinner with failure message
65
+ * @param message - Optional failure message (defaults to original message)
66
+ */
67
+ fail(message) {
68
+ this.stop();
69
+ const finalMessage = message || this.message;
70
+ if (this.isTTY) {
71
+ // Clear spinner line and show failure
72
+ process.stderr.write(`\r[X] ${finalMessage}\n`);
73
+ }
74
+ else {
75
+ // Non-TTY: just show failure
76
+ process.stderr.write(`[X] ${finalMessage}\n`);
77
+ }
78
+ }
79
+ /**
80
+ * Update spinner message (while running)
81
+ * @param newMessage - New message to display
82
+ */
83
+ update(newMessage) {
84
+ this.message = newMessage;
85
+ }
86
+ /**
87
+ * Stop the spinner without showing success/failure
88
+ */
89
+ stop() {
90
+ if (this.interval) {
91
+ clearInterval(this.interval);
92
+ this.interval = null;
93
+ if (this.isTTY) {
94
+ // Clear the spinner line
95
+ process.stderr.write('\r\x1b[K');
96
+ }
97
+ }
98
+ }
99
+ }
100
+ exports.ProgressIndicator = ProgressIndicator;
101
+ exports.default = ProgressIndicator;
102
+ //# sourceMappingURL=progress-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-indicator.js","sourceRoot":"","sources":["../../src/utils/progress-indicator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Interactive Prompt Utilities (NO external dependencies)
3
+ *
4
+ * Features:
5
+ * - TTY detection (auto-confirm in non-TTY)
6
+ * - --yes flag support for automation
7
+ * - --no-input flag support for CI
8
+ * - Safe defaults (N for destructive actions)
9
+ * - Input validation with retry
10
+ */
11
+ interface ConfirmOptions {
12
+ default?: boolean;
13
+ }
14
+ interface InputOptions {
15
+ default?: string;
16
+ validate?: (value: string) => string | null;
17
+ }
18
+ export declare class InteractivePrompt {
19
+ /**
20
+ * Ask for confirmation
21
+ */
22
+ static confirm(message: string, options?: ConfirmOptions): Promise<boolean>;
23
+ /**
24
+ * Get text input from user
25
+ */
26
+ static input(message: string, options?: InputOptions): Promise<string>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,qBAAa,iBAAiB;IAC5B;;OAEG;WACU,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IA6DrF;;OAEG;WACU,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuCjF"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.InteractivePrompt = void 0;
27
+ const readline = __importStar(require("readline"));
28
+ class InteractivePrompt {
29
+ /**
30
+ * Ask for confirmation
31
+ */
32
+ static async confirm(message, options = {}) {
33
+ const { default: defaultValue = false } = options;
34
+ // Check for --yes flag (automation) - always returns true
35
+ if (process.env.CCS_YES === '1' ||
36
+ process.argv.includes('--yes') ||
37
+ process.argv.includes('-y')) {
38
+ return true;
39
+ }
40
+ // Check for --no-input flag (CI)
41
+ if (process.env.CCS_NO_INPUT === '1' || process.argv.includes('--no-input')) {
42
+ throw new Error('Interactive input required but --no-input specified');
43
+ }
44
+ // Non-TTY: use default
45
+ if (!process.stdin.isTTY) {
46
+ return defaultValue;
47
+ }
48
+ // Interactive prompt
49
+ const rl = readline.createInterface({
50
+ input: process.stdin,
51
+ output: process.stderr,
52
+ terminal: true,
53
+ });
54
+ const promptText = defaultValue ? `${message} [Y/n]: ` : `${message} [y/N]: `;
55
+ return new Promise((resolve) => {
56
+ rl.question(promptText, (answer) => {
57
+ rl.close();
58
+ const normalized = answer.trim().toLowerCase();
59
+ // Empty answer: use default
60
+ if (normalized === '') {
61
+ resolve(defaultValue);
62
+ return;
63
+ }
64
+ // Valid answers
65
+ if (normalized === 'y' || normalized === 'yes') {
66
+ resolve(true);
67
+ return;
68
+ }
69
+ if (normalized === 'n' || normalized === 'no') {
70
+ resolve(false);
71
+ return;
72
+ }
73
+ // Invalid input: retry
74
+ console.error('[!] Please answer y or n');
75
+ resolve(InteractivePrompt.confirm(message, options));
76
+ });
77
+ });
78
+ }
79
+ /**
80
+ * Get text input from user
81
+ */
82
+ static async input(message, options = {}) {
83
+ const { default: defaultValue = '', validate = null } = options;
84
+ // Non-TTY: use default or error
85
+ if (!process.stdin.isTTY) {
86
+ if (defaultValue) {
87
+ return defaultValue;
88
+ }
89
+ throw new Error('Interactive input required but stdin is not a TTY');
90
+ }
91
+ const rl = readline.createInterface({
92
+ input: process.stdin,
93
+ output: process.stderr,
94
+ terminal: true,
95
+ });
96
+ const promptText = defaultValue ? `${message} [${defaultValue}]: ` : `${message}: `;
97
+ return new Promise((resolve) => {
98
+ rl.question(promptText, (answer) => {
99
+ rl.close();
100
+ const value = answer.trim() || defaultValue;
101
+ // Validate input if validator provided
102
+ if (validate) {
103
+ const error = validate(value);
104
+ if (error) {
105
+ console.error(`[!] ${error}`);
106
+ resolve(InteractivePrompt.input(message, options));
107
+ return;
108
+ }
109
+ }
110
+ resolve(value);
111
+ });
112
+ });
113
+ }
114
+ }
115
+ exports.InteractivePrompt = InteractivePrompt;
116
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ type ShellType = 'bash' | 'zsh' | 'fish' | 'powershell' | null;
2
+ interface InstallResult {
3
+ success: boolean;
4
+ alreadyInstalled?: boolean;
5
+ message?: string;
6
+ reload?: string;
7
+ }
8
+ /**
9
+ * Shell Completion Installer
10
+ * Auto-configures shell completion for bash, zsh, fish, PowerShell
11
+ */
12
+ export declare class ShellCompletionInstaller {
13
+ private homeDir;
14
+ private ccsDir;
15
+ private completionDir;
16
+ private scriptsDir;
17
+ constructor();
18
+ /**
19
+ * Detect current shell
20
+ */
21
+ detectShell(): ShellType;
22
+ /**
23
+ * Ensure completion files are in ~/.ccs/completions/
24
+ */
25
+ ensureCompletionFiles(): void;
26
+ /**
27
+ * Safely create directory, checking for file conflicts
28
+ */
29
+ private ensureDirectory;
30
+ /**
31
+ * Install bash completion
32
+ */
33
+ private installBash;
34
+ /**
35
+ * Install zsh completion
36
+ */
37
+ private installZsh;
38
+ /**
39
+ * Install fish completion
40
+ */
41
+ private installFish;
42
+ /**
43
+ * Install PowerShell completion
44
+ */
45
+ private installPowerShell;
46
+ /**
47
+ * Install for detected or specified shell
48
+ */
49
+ install(shell?: ShellType): InstallResult;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=shell-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-completion.d.ts","sourceRoot":"","sources":["../../src/utils/shell-completion.ts"],"names":[],"mappings":"AAKA,KAAK,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;AAE/D,UAAU,aAAa;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAS;;IAS3B;;OAEG;IACH,WAAW,IAAI,SAAS;IAWxB;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAiB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAsClB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,KAAK,GAAE,SAAgB,GAAG,aAAa;CA0BhD"}
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ShellCompletionInstaller = void 0;
27
+ const fs = __importStar(require("fs"));
28
+ const path = __importStar(require("path"));
29
+ const os = __importStar(require("os"));
30
+ /**
31
+ * Shell Completion Installer
32
+ * Auto-configures shell completion for bash, zsh, fish, PowerShell
33
+ */
34
+ class ShellCompletionInstaller {
35
+ constructor() {
36
+ this.homeDir = os.homedir();
37
+ this.ccsDir = path.join(this.homeDir, '.ccs');
38
+ this.completionDir = path.join(this.ccsDir, 'completions');
39
+ this.scriptsDir = path.join(__dirname, '../../scripts/completion');
40
+ }
41
+ /**
42
+ * Detect current shell
43
+ */
44
+ detectShell() {
45
+ const shell = process.env.SHELL || '';
46
+ if (shell.includes('bash'))
47
+ return 'bash';
48
+ if (shell.includes('zsh'))
49
+ return 'zsh';
50
+ if (shell.includes('fish'))
51
+ return 'fish';
52
+ if (process.platform === 'win32')
53
+ return 'powershell';
54
+ return null;
55
+ }
56
+ /**
57
+ * Ensure completion files are in ~/.ccs/completions/
58
+ */
59
+ ensureCompletionFiles() {
60
+ if (!fs.existsSync(this.completionDir)) {
61
+ fs.mkdirSync(this.completionDir, { recursive: true });
62
+ }
63
+ // Copy completion scripts
64
+ const files = ['ccs.bash', 'ccs.zsh', 'ccs.fish', 'ccs.ps1'];
65
+ files.forEach((file) => {
66
+ const src = path.join(this.scriptsDir, file);
67
+ const dest = path.join(this.completionDir, file);
68
+ if (fs.existsSync(src)) {
69
+ fs.copyFileSync(src, dest);
70
+ }
71
+ });
72
+ }
73
+ /**
74
+ * Safely create directory, checking for file conflicts
75
+ */
76
+ ensureDirectory(dirPath) {
77
+ if (fs.existsSync(dirPath)) {
78
+ const stat = fs.statSync(dirPath);
79
+ if (!stat.isDirectory()) {
80
+ throw new Error(`Cannot create directory: ${dirPath} exists but is a file.\n` +
81
+ `Please remove or rename this file and try again.`);
82
+ }
83
+ // Directory exists, nothing to do
84
+ return;
85
+ }
86
+ // Check parent directories recursively
87
+ const parentDir = path.dirname(dirPath);
88
+ if (parentDir !== dirPath) {
89
+ this.ensureDirectory(parentDir);
90
+ }
91
+ // Create the directory
92
+ fs.mkdirSync(dirPath);
93
+ }
94
+ /**
95
+ * Install bash completion
96
+ */
97
+ installBash() {
98
+ const rcFile = path.join(this.homeDir, '.bashrc');
99
+ const completionPath = path.join(this.completionDir, 'ccs.bash');
100
+ if (!fs.existsSync(completionPath)) {
101
+ throw new Error('Completion file not found. Please reinstall CCS.');
102
+ }
103
+ const marker = '# CCS shell completion';
104
+ const sourceCmd = `source "${completionPath}"`;
105
+ const block = `\n${marker}\n${sourceCmd}\n`;
106
+ // Check if already installed
107
+ if (fs.existsSync(rcFile)) {
108
+ const content = fs.readFileSync(rcFile, 'utf8');
109
+ if (content.includes(marker)) {
110
+ return { success: true, alreadyInstalled: true };
111
+ }
112
+ }
113
+ // Append to .bashrc
114
+ fs.appendFileSync(rcFile, block);
115
+ return {
116
+ success: true,
117
+ message: `Added to ${rcFile}`,
118
+ reload: 'source ~/.bashrc',
119
+ };
120
+ }
121
+ /**
122
+ * Install zsh completion
123
+ */
124
+ installZsh() {
125
+ const rcFile = path.join(this.homeDir, '.zshrc');
126
+ const completionPath = path.join(this.completionDir, 'ccs.zsh');
127
+ const zshCompDir = path.join(this.homeDir, '.zsh', 'completion');
128
+ if (!fs.existsSync(completionPath)) {
129
+ throw new Error('Completion file not found. Please reinstall CCS.');
130
+ }
131
+ // Create zsh completion directory (with file conflict checking)
132
+ this.ensureDirectory(zshCompDir);
133
+ // Copy to zsh completion directory
134
+ const destFile = path.join(zshCompDir, '_ccs');
135
+ fs.copyFileSync(completionPath, destFile);
136
+ const marker = '# CCS shell completion';
137
+ const setupCmds = ['fpath=(~/.zsh/completion $fpath)', 'autoload -Uz compinit && compinit'];
138
+ const block = `\n${marker}\n${setupCmds.join('\n')}\n`;
139
+ // Check if already installed
140
+ if (fs.existsSync(rcFile)) {
141
+ const content = fs.readFileSync(rcFile, 'utf8');
142
+ if (content.includes(marker)) {
143
+ return { success: true, alreadyInstalled: true };
144
+ }
145
+ }
146
+ // Append to .zshrc
147
+ fs.appendFileSync(rcFile, block);
148
+ return {
149
+ success: true,
150
+ message: `Added to ${rcFile}`,
151
+ reload: 'source ~/.zshrc',
152
+ };
153
+ }
154
+ /**
155
+ * Install fish completion
156
+ */
157
+ installFish() {
158
+ const completionPath = path.join(this.completionDir, 'ccs.fish');
159
+ const fishCompDir = path.join(this.homeDir, '.config', 'fish', 'completions');
160
+ if (!fs.existsSync(completionPath)) {
161
+ throw new Error('Completion file not found. Please reinstall CCS.');
162
+ }
163
+ // Create fish completion directory (with file conflict checking)
164
+ this.ensureDirectory(fishCompDir);
165
+ // Copy to fish completion directory (fish auto-loads from here)
166
+ const destFile = path.join(fishCompDir, 'ccs.fish');
167
+ fs.copyFileSync(completionPath, destFile);
168
+ return {
169
+ success: true,
170
+ message: `Installed to ${destFile}`,
171
+ reload: 'Fish auto-loads completions (no reload needed)',
172
+ };
173
+ }
174
+ /**
175
+ * Install PowerShell completion
176
+ */
177
+ installPowerShell() {
178
+ const profilePath = process.env.PROFILE ||
179
+ path.join(this.homeDir, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1');
180
+ const completionPath = path.join(this.completionDir, 'ccs.ps1');
181
+ if (!fs.existsSync(completionPath)) {
182
+ throw new Error('Completion file not found. Please reinstall CCS.');
183
+ }
184
+ const marker = '# CCS shell completion';
185
+ const sourceCmd = `. "${completionPath.replace(/\\/g, '\\\\')}"`;
186
+ const block = `\n${marker}\n${sourceCmd}\n`;
187
+ // Create profile directory if needed (with file conflict checking)
188
+ const profileDir = path.dirname(profilePath);
189
+ this.ensureDirectory(profileDir);
190
+ // Check if already installed
191
+ if (fs.existsSync(profilePath)) {
192
+ const content = fs.readFileSync(profilePath, 'utf8');
193
+ if (content.includes(marker)) {
194
+ return { success: true, alreadyInstalled: true };
195
+ }
196
+ }
197
+ // Append to PowerShell profile
198
+ fs.appendFileSync(profilePath, block);
199
+ return {
200
+ success: true,
201
+ message: `Added to ${profilePath}`,
202
+ reload: '. $PROFILE',
203
+ };
204
+ }
205
+ /**
206
+ * Install for detected or specified shell
207
+ */
208
+ install(shell = null) {
209
+ const targetShell = shell || this.detectShell();
210
+ if (!targetShell) {
211
+ throw new Error('Could not detect shell. Please specify: --bash, --zsh, --fish, or --powershell');
212
+ }
213
+ // Ensure completion files exist
214
+ this.ensureCompletionFiles();
215
+ // Install for target shell
216
+ switch (targetShell) {
217
+ case 'bash':
218
+ return this.installBash();
219
+ case 'zsh':
220
+ return this.installZsh();
221
+ case 'fish':
222
+ return this.installFish();
223
+ case 'powershell':
224
+ return this.installPowerShell();
225
+ default:
226
+ throw new Error(`Unsupported shell: ${targetShell}`);
227
+ }
228
+ }
229
+ }
230
+ exports.ShellCompletionInstaller = ShellCompletionInstaller;
231
+ //# sourceMappingURL=shell-completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-completion.js","sourceRoot":"","sources":["../../src/utils/shell-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shell Executor Utilities
3
+ *
4
+ * Cross-platform shell execution utilities for CCS.
5
+ */
6
+ /// <reference types="node" />
7
+ /**
8
+ * Escape arguments for shell execution (Windows compatibility)
9
+ */
10
+ export declare function escapeShellArg(arg: string): string;
11
+ /**
12
+ * Execute Claude CLI with unified spawn logic
13
+ */
14
+ export declare function execClaude(claudeCli: string, args: string[], envVars?: NodeJS.ProcessEnv | null): void;
15
+ //# sourceMappingURL=shell-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-executor.d.ts","sourceRoot":"","sources":["../../src/utils/shell-executor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;AAKH;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,MAAM,CAAC,UAAU,GAAG,IAAW,GACvC,IAAI,CAmCN"}