@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
@@ -36,7 +36,8 @@ $script:E_INVALID_STATE = "E901"
36
36
  # Get error documentation URL
37
37
  function Get-ErrorDocUrl {
38
38
  param([string]$ErrorCode)
39
- return "https://github.com/kaitranntt/ccs/blob/main/docs/errors/README.md#$($ErrorCode.ToLower())"
39
+ $LowerCode = $ErrorCode.ToLower()
40
+ return "https://github.com/kaitranntt/ccs/blob/main/docs/errors/README.md#$LowerCode"
40
41
  }
41
42
 
42
43
  # Get error category from code
package/lib/prompt.ps1 CHANGED
@@ -77,9 +77,9 @@ function Read-Input {
77
77
 
78
78
  # Interactive prompt
79
79
  $PromptText = if ($Default) {
80
- "$Message [$Default]: "
80
+ "${Message} [$Default]: "
81
81
  } else {
82
- "$Message: "
82
+ "${Message}: "
83
83
  }
84
84
 
85
85
  while ($true) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaitranntt/ccs",
3
- "version": "4.4.0",
3
+ "version": "5.0.1",
4
4
  "description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6",
5
5
  "keywords": [
6
6
  "cli",
@@ -23,11 +23,13 @@
23
23
  "name": "Tam Nhu Tran (Kai)",
24
24
  "email": "kaitranntt@users.noreply.github.com"
25
25
  },
26
+ "main": "dist/ccs.js",
27
+ "types": "dist/ccs.d.ts",
26
28
  "bin": {
27
- "ccs": "bin/ccs.js"
29
+ "ccs": "dist/ccs.js"
28
30
  },
29
31
  "files": [
30
- "bin/",
32
+ "dist/",
31
33
  "lib/",
32
34
  "scripts/",
33
35
  "config/",
@@ -37,8 +39,10 @@
37
39
  "LICENSE"
38
40
  ],
39
41
  "engines": {
40
- "node": ">=14.0.0"
42
+ "node": ">=14.0.0",
43
+ "bun": ">=1.0.0"
41
44
  },
45
+ "packageManager": "bun@1.2.21",
42
46
  "os": [
43
47
  "darwin",
44
48
  "linux",
@@ -46,14 +50,23 @@
46
50
  ],
47
51
  "preferGlobal": true,
48
52
  "scripts": {
49
- "test": "npm run test:all",
50
- "test:all": "npm run test:unit && npm run test:npm",
51
- "test:unit": "npx mocha tests/shared/unit/**/*.test.js --timeout 5000",
52
- "test:npm": "npx mocha tests/npm/**/*.test.js --timeout 10000",
53
+ "build": "tsc && node scripts/add-shebang.js",
54
+ "build:watch": "tsc --watch",
55
+ "prebuild": "rm -rf dist tsconfig.tsbuildinfo",
56
+ "typecheck": "tsc --noEmit",
57
+ "lint": "eslint src/",
58
+ "lint:fix": "eslint src/ --fix",
59
+ "format": "prettier --write src/",
60
+ "format:check": "prettier --check src/",
61
+ "validate": "bun run typecheck && bun run lint && bun run format:check && bun run test",
62
+ "test": "bun run build && bun run test:all",
63
+ "test:all": "bun run test:unit && bun run test:npm",
64
+ "test:unit": "mocha tests/shared/unit/**/*.test.js --timeout 5000",
65
+ "test:npm": "mocha tests/npm/**/*.test.js --timeout 10000",
53
66
  "test:native": "bash tests/native/unix/edge-cases.sh",
54
67
  "test:edge-cases": "bash tests/edge-cases.sh",
55
- "prepublishOnly": "node scripts/sync-version.js",
56
- "prepack": "node scripts/sync-version.js",
68
+ "prepublishOnly": "npm run validate && node scripts/sync-version.js",
69
+ "prepack": "npm run validate && node scripts/sync-version.js",
57
70
  "prepare": "node scripts/check-executables.js",
58
71
  "postinstall": "node scripts/postinstall.js"
59
72
  },
@@ -62,6 +75,13 @@
62
75
  "ora": "^9.0.0"
63
76
  },
64
77
  "devDependencies": {
65
- "mocha": "^11.7.5"
78
+ "@types/node": "^20.19.25",
79
+ "@typescript-eslint/eslint-plugin": "^8.48.0",
80
+ "@typescript-eslint/parser": "^8.48.0",
81
+ "eslint": "^9.39.1",
82
+ "eslint-config-prettier": "^10.1.8",
83
+ "mocha": "^11.7.5",
84
+ "prettier": "^3.6.2",
85
+ "typescript": "5.3"
66
86
  }
67
87
  }
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+
7
+ /**
8
+ * Add shebang to dist/ccs.js and make executable
9
+ * Run after: tsc
10
+ */
11
+ function addShebang() {
12
+ const ccsPath = path.join(__dirname, '../dist/ccs.js');
13
+
14
+ if (!fs.existsSync(ccsPath)) {
15
+ console.error('[X] dist/ccs.js not found. Run tsc first.');
16
+ process.exit(1);
17
+ }
18
+
19
+ let content = fs.readFileSync(ccsPath, 'utf8');
20
+
21
+ // Add shebang if missing
22
+ if (!content.startsWith('#!/usr/bin/env node')) {
23
+ content = '#!/usr/bin/env node\n' + content;
24
+ fs.writeFileSync(ccsPath, content);
25
+ console.log('[OK] Shebang added to dist/ccs.js');
26
+ }
27
+
28
+ // Make executable (Unix-like systems)
29
+ if (process.platform !== 'win32') {
30
+ try {
31
+ fs.chmodSync(ccsPath, 0o755);
32
+ console.log('[OK] dist/ccs.js is now executable');
33
+ } catch (err) {
34
+ console.warn('[!] Could not chmod dist/ccs.js:', err.message);
35
+ }
36
+ }
37
+ }
38
+
39
+ addShebang();
@@ -1,6 +1,9 @@
1
1
  #!/usr/bin/env bash
2
2
  # Bump CCS version
3
3
  # Usage: ./scripts/bump-version.sh [major|minor|patch]
4
+ #
5
+ # v4.5.0+: Bootstrap architecture - shell scripts delegate to Node.js
6
+ # Version is maintained in: VERSION, package.json, installers/*
4
7
 
5
8
  set -euo pipefail
6
9
 
@@ -10,7 +13,7 @@ VERSION_FILE="$CCS_DIR/VERSION"
10
13
 
11
14
  # Check VERSION file exists
12
15
  if [[ ! -f "$VERSION_FILE" ]]; then
13
- echo " Error: VERSION file not found at $VERSION_FILE"
16
+ echo "[X] Error: VERSION file not found at $VERSION_FILE"
14
17
  exit 1
15
18
  fi
16
19
 
@@ -20,7 +23,7 @@ echo "Current version: $CURRENT_VERSION"
20
23
 
21
24
  # Parse version
22
25
  if [[ ! "$CURRENT_VERSION" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
23
- echo " Error: Invalid version format in VERSION file"
26
+ echo "[X] Error: Invalid version format in VERSION file"
24
27
  echo "Expected: MAJOR.MINOR.PATCH (e.g., 1.2.3)"
25
28
  exit 1
26
29
  fi
@@ -46,7 +49,7 @@ case "$BUMP_TYPE" in
46
49
  PATCH=$((PATCH + 1))
47
50
  ;;
48
51
  *)
49
- echo " Error: Invalid bump type '$BUMP_TYPE'"
52
+ echo "[X] Error: Invalid bump type '$BUMP_TYPE'"
50
53
  echo "Usage: $0 [major|minor|patch]"
51
54
  exit 1
52
55
  ;;
@@ -58,11 +61,12 @@ echo "New version: $NEW_VERSION"
58
61
  echo ""
59
62
  echo "This will update hardcoded versions in:"
60
63
  echo " 1. VERSION file"
61
- echo " 2. lib/ccs (bash executable)"
62
- echo " 3. lib/ccs.ps1 (PowerShell executable)"
63
- echo " 4. package.json (via sync-version.js)"
64
- echo " 5. installers/install.sh"
65
- echo " 6. installers/install.ps1"
64
+ echo " 2. package.json (via sync-version.js)"
65
+ echo " 3. installers/install.sh"
66
+ echo " 4. installers/install.ps1"
67
+ echo ""
68
+ echo "Note: lib/ccs and lib/ccs.ps1 are now bootstraps"
69
+ echo " (delegate to Node.js, no version hardcoded)"
66
70
  echo ""
67
71
  read -p "Continue? (y/N) " -n 1 -r
68
72
  echo
@@ -74,63 +78,47 @@ fi
74
78
 
75
79
  # Update VERSION file
76
80
  echo "$NEW_VERSION" > "$VERSION_FILE"
77
- echo " Updated VERSION file to $NEW_VERSION"
78
-
79
- # Update ccs (bash executable)
80
- CCS_BASH="$CCS_DIR/lib/ccs"
81
- if [[ -f "$CCS_BASH" ]]; then
82
- sed -i.bak "s/^CCS_VERSION=\".*\"/CCS_VERSION=\"$NEW_VERSION\"/" "$CCS_BASH"
83
- rm -f "$CCS_BASH.bak"
84
- echo "✓ Updated lib/ccs (bash executable)"
85
- else
86
- echo "⚠ lib/ccs not found, skipping"
87
- fi
81
+ echo "[OK] Updated VERSION file to $NEW_VERSION"
88
82
 
89
- # Update ccs.ps1 (PowerShell executable)
90
- CCS_PS1="$CCS_DIR/lib/ccs.ps1"
91
- if [[ -f "$CCS_PS1" ]]; then
92
- sed -i.bak "s/^\$CcsVersion = \".*\"/\$CcsVersion = \"$NEW_VERSION\"/" "$CCS_PS1"
93
- rm -f "$CCS_PS1.bak"
94
- echo "✓ Updated lib/ccs.ps1 (PowerShell executable)"
95
- else
96
- echo "⚠ lib/ccs.ps1 not found, skipping"
97
- fi
83
+ # Note: lib/ccs and lib/ccs.ps1 are now lightweight bootstraps
84
+ # They delegate to Node.js via npx - no version variable needed
85
+ # Version is determined by the npm package at runtime
98
86
 
99
87
  # Update installers/install.sh
100
88
  INSTALL_SH="$CCS_DIR/installers/install.sh"
101
89
  if [[ -f "$INSTALL_SH" ]]; then
102
90
  sed -i.bak "s/^CCS_VERSION=\".*\"/CCS_VERSION=\"$NEW_VERSION\"/" "$INSTALL_SH"
103
91
  rm -f "$INSTALL_SH.bak"
104
- echo " Updated installers/install.sh"
92
+ echo "[OK] Updated installers/install.sh"
105
93
  else
106
- echo "installers/install.sh not found, skipping"
94
+ echo "[!] installers/install.sh not found, skipping"
107
95
  fi
108
96
 
109
97
  # Update installers/install.ps1
110
98
  INSTALL_PS1="$CCS_DIR/installers/install.ps1"
111
99
  if [[ -f "$INSTALL_PS1" ]]; then
112
- sed -i.bak "s/^\$CcsVersion = \".*\"/\$CcsVersion = \"$NEW_VERSION\"/" "$INSTALL_PS1"
100
+ sed -i.bak "s/^\\\$CcsVersion = \".*\"/\\\$CcsVersion = \"$NEW_VERSION\"/" "$INSTALL_PS1"
113
101
  rm -f "$INSTALL_PS1.bak"
114
- echo " Updated installers/install.ps1"
102
+ echo "[OK] Updated installers/install.ps1"
115
103
  else
116
- echo "installers/install.ps1 not found, skipping"
104
+ echo "[!] installers/install.ps1 not found, skipping"
117
105
  fi
118
106
 
119
107
  # Sync version to package.json
120
108
  echo "Syncing version to package.json..."
121
109
  if node "$SCRIPT_DIR/sync-version.js"; then
122
- echo " Synced version to package.json"
110
+ echo "[OK] Synced version to package.json"
123
111
  else
124
- echo " Error: Failed to sync version to package.json"
112
+ echo "[X] Error: Failed to sync version to package.json"
125
113
  exit 1
126
114
  fi
127
115
 
128
116
  echo ""
129
- echo " Version bumped to $NEW_VERSION"
117
+ echo "[OK] Version bumped to $NEW_VERSION"
130
118
  echo ""
131
119
  echo "Next steps:"
132
120
  echo " 1. Review changes: git diff"
133
- echo " 2. Commit: git add VERSION package.json lib/ccs lib/ccs.ps1 installers/install.sh installers/install.ps1"
121
+ echo " 2. Commit: git add VERSION package.json installers/install.sh installers/install.ps1"
134
122
  echo " 3. Commit: git commit -m \"chore: bump version to $NEW_VERSION\""
135
123
  echo " 4. Tag: git tag v$NEW_VERSION"
136
124
  echo " 5. Push: git push origin main && git push origin v$NEW_VERSION"
@@ -1,35 +1,56 @@
1
1
  #!/bin/bash
2
2
  # Auto-install CCS locally for testing changes
3
+ # Usage: ./scripts/dev-install.sh
4
+ #
5
+ # Options:
6
+ # --skip-validate Skip validation (faster, use when you're sure code is good)
3
7
 
4
8
  set -e
5
9
 
6
- echo "[CCS Dev Install] Starting..."
10
+ SKIP_VALIDATE=false
11
+ for arg in "$@"; do
12
+ case $arg in
13
+ --skip-validate) SKIP_VALIDATE=true ;;
14
+ esac
15
+ done
16
+
17
+ echo "[i] CCS Dev Install - Starting..."
7
18
 
8
19
  # Get to the right directory
9
20
  cd "$(dirname "$0")/.."
10
21
 
22
+ # Build TypeScript first
23
+ echo "[i] Building TypeScript..."
24
+ bun run build
25
+
11
26
  # Pack the npm package
12
- echo "[CCS Dev Install] Creating package..."
13
- npm pack
27
+ echo "[i] Creating package..."
28
+ if [ "$SKIP_VALIDATE" = true ]; then
29
+ # Skip validation, just pack
30
+ bun pm pack --ignore-scripts
31
+ else
32
+ # Full pack with validation (runs prepublishOnly)
33
+ bun pm pack
34
+ fi
14
35
 
15
36
  # Find the tarball
16
- TARBALL=$(ls -t kaitranntt-ccs-*.tgz | head -1)
37
+ TARBALL=$(ls -t kaitranntt-ccs-*.tgz 2>/dev/null | head -1)
17
38
 
18
39
  if [ -z "$TARBALL" ]; then
19
- echo "[CCS Dev Install] ERROR: No tarball found"
40
+ echo "[X] ERROR: No tarball found"
20
41
  exit 1
21
42
  fi
22
43
 
23
- echo "[CCS Dev Install] Found tarball: $TARBALL"
44
+ echo "[i] Found tarball: $TARBALL"
24
45
 
25
- # Install globally
26
- echo "[CCS Dev Install] Installing globally..."
46
+ # Install globally using npm (handles bin linking correctly)
47
+ echo "[i] Installing globally with npm..."
27
48
  npm install -g "$TARBALL"
28
49
 
29
50
  # Clean up
30
- echo "[CCS Dev Install] Cleaning up..."
51
+ echo "[i] Cleaning up..."
31
52
  rm "$TARBALL"
32
53
 
33
- echo "[CCS Dev Install] Complete! CCS is now updated."
54
+ echo "[OK] Complete! CCS is now updated."
34
55
  echo ""
35
- echo "Test with: ccs glmt --version"
56
+ echo "Test with: ccs --version"
@@ -12,14 +12,24 @@ const os = require('os');
12
12
  * Runs when: npm install -g @kaitranntt/ccs
13
13
  * Idempotent: Safe to run multiple times (won't overwrite existing configs)
14
14
  * Cross-platform: Works on Unix, macOS, Windows
15
+ *
16
+ * Test isolation: Set CCS_HOME env var to redirect all operations to a test directory
17
+ */
18
+
19
+ /**
20
+ * Get the CCS home directory (respects CCS_HOME env var for test isolation)
21
+ * @returns {string} Home directory path
15
22
  */
23
+ function getCcsHome() {
24
+ return process.env.CCS_HOME || os.homedir();
25
+ }
16
26
 
17
27
  /**
18
28
  * Validate created configuration files
19
29
  * @returns {object} { success: boolean, errors: string[], warnings: string[] }
20
30
  */
21
31
  function validateConfiguration() {
22
- const homedir = os.homedir();
32
+ const homedir = getCcsHome();
23
33
  const errors = [];
24
34
  const warnings = [];
25
35
 
@@ -63,8 +73,8 @@ function validateConfiguration() {
63
73
 
64
74
  function createConfigFiles() {
65
75
  try {
66
- // Get user home directory (cross-platform)
67
- const homedir = os.homedir();
76
+ // Get user home directory (cross-platform, respects CCS_HOME for test isolation)
77
+ const homedir = getCcsHome();
68
78
  const ccsDir = path.join(homedir, '.ccs');
69
79
 
70
80
  // Create ~/.ccs/ directory if missing
@@ -93,7 +103,7 @@ function createConfigFiles() {
93
103
  // Migrate from v3.1.1 to v3.2.0 (symlink architecture)
94
104
  console.log('');
95
105
  try {
96
- const SharedManager = require('../bin/management/shared-manager');
106
+ const SharedManager = require('../dist/management/shared-manager').default;
97
107
  const sharedManager = new SharedManager();
98
108
  sharedManager.migrateFromV311();
99
109
  sharedManager.ensureSharedDirectories();
@@ -106,32 +116,13 @@ function createConfigFiles() {
106
116
  }
107
117
  console.log('');
108
118
 
109
- // Copy .claude/ directory from package to ~/.ccs/.claude/ (v4.1.1)
110
- try {
111
- const ClaudeDirInstaller = require('../bin/utils/claude-dir-installer');
112
- const installer = new ClaudeDirInstaller();
113
- const packageDir = path.join(__dirname, '..');
114
- installer.install(packageDir);
115
-
116
- // Clean up deprecated files (v4.3.2)
117
- installer.cleanupDeprecated();
118
- } catch (err) {
119
- console.warn('[!] Failed to install .claude/ directory:', err.message);
120
- console.warn(' CCS items may not be available');
121
- }
122
-
123
- // Install CCS items to ~/.claude/ (v4.1.0)
124
- try {
125
- const ClaudeSymlinkManager = require('../bin/utils/claude-symlink-manager');
126
- const claudeSymlinkManager = new ClaudeSymlinkManager();
127
- claudeSymlinkManager.install();
128
- } catch (err) {
129
- console.warn('[!] CCS item installation warning:', err.message);
130
- console.warn(' Run "ccs sync" to retry');
131
- }
132
- console.log('');
119
+ // NOTE: .claude/ directory installation moved to "ccs sync" command
120
+ // Users can run "ccs sync" to install CCS commands/skills to ~/.claude/
121
+ // This gives users control over when to modify their Claude configuration
133
122
 
134
123
  // Create config.json if missing
124
+ // NOTE: gemini/codex profiles NOT included - they are added on-demand when user
125
+ // runs `ccs gemini` or `ccs codex` for first time (requires OAuth auth first)
135
126
  const configPath = path.join(ccsDir, 'config.json');
136
127
  if (!fs.existsSync(configPath)) {
137
128
  const config = {
@@ -156,12 +147,17 @@ function createConfigFiles() {
156
147
  if (!config.profiles) {
157
148
  config.profiles = {};
158
149
  }
150
+ let configUpdated = false;
159
151
  if (!config.profiles.glmt) {
160
152
  config.profiles.glmt = '~/.ccs/glmt.settings.json';
153
+ configUpdated = true;
154
+ }
155
+ // NOTE: gemini/codex profiles added on-demand, not during migration
156
+ if (configUpdated) {
161
157
  const tmpPath = `${configPath}.tmp`;
162
158
  fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
163
159
  fs.renameSync(tmpPath, configPath);
164
- console.log('[OK] Updated config with GLMT profile');
160
+ console.log('[OK] Updated config with glmt profile');
165
161
  } else {
166
162
  console.log('[OK] Config exists: ~/.ccs/config.json (preserved)');
167
163
  }
@@ -310,6 +306,10 @@ function createConfigFiles() {
310
306
  console.log('[OK] Kimi profile exists: ~/.ccs/kimi.settings.json (preserved)');
311
307
  }
312
308
 
309
+ // NOTE: gemini.settings.json and codex.settings.json are NOT created during install
310
+ // They are created on-demand when user runs `ccs gemini` or `ccs codex` for the first time
311
+ // This prevents confusion - users need to run `--auth` first anyway
312
+
313
313
  // Migrate existing Kimi configs to remove deprecated model fields (v4.1.2)
314
314
  // Kimi API changed - model fields now cause 401 errors
315
315
  if (fs.existsSync(kimiSettingsPath)) {