@kaitranntt/ccs 4.3.10 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/README.md +27 -42
  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 +93 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +402 -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 +32 -29
  231. package/README.ja.md +0 -649
  232. package/README.vi.md +0 -649
  233. package/bin/auth/auth-commands.js +0 -499
  234. package/bin/auth/profile-detector.js +0 -204
  235. package/bin/auth/profile-registry.js +0 -225
  236. package/bin/ccs.js +0 -1034
  237. package/bin/delegation/README.md +0 -191
  238. package/bin/delegation/delegation-handler.js +0 -212
  239. package/bin/delegation/headless-executor.js +0 -618
  240. package/bin/delegation/result-formatter.js +0 -485
  241. package/bin/delegation/session-manager.js +0 -157
  242. package/bin/delegation/settings-parser.js +0 -109
  243. package/bin/glmt/delta-accumulator.js +0 -276
  244. package/bin/glmt/glmt-proxy.js +0 -495
  245. package/bin/glmt/glmt-transformer.js +0 -999
  246. package/bin/glmt/locale-enforcer.js +0 -72
  247. package/bin/glmt/reasoning-enforcer.js +0 -173
  248. package/bin/glmt/sse-parser.js +0 -96
  249. package/bin/management/doctor.js +0 -599
  250. package/bin/management/instance-manager.js +0 -207
  251. package/bin/management/recovery-manager.js +0 -135
  252. package/bin/management/shared-manager.js +0 -285
  253. package/bin/utils/claude-detector.js +0 -73
  254. package/bin/utils/claude-dir-installer.js +0 -283
  255. package/bin/utils/claude-symlink-manager.js +0 -289
  256. package/bin/utils/config-manager.js +0 -103
  257. package/bin/utils/delegation-validator.js +0 -154
  258. package/bin/utils/error-codes.js +0 -59
  259. package/bin/utils/error-manager.js +0 -165
  260. package/bin/utils/helpers.js +0 -136
  261. package/bin/utils/progress-indicator.js +0 -111
  262. package/bin/utils/prompt.js +0 -134
  263. package/bin/utils/shell-completion.js +0 -256
  264. 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.3.10",
3
+ "version": "5.0.0",
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
15
17
  */
16
18
 
19
+ /**
20
+ * Get the CCS home directory (respects CCS_HOME env var for test isolation)
21
+ * @returns {string} Home directory path
22
+ */
23
+ function getCcsHome() {
24
+ return process.env.CCS_HOME || os.homedir();
25
+ }
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,42 +103,26 @@ 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();
110
+
111
+ // Run v4.4 migration: Migrate instances to shared settings.json
112
+ sharedManager.migrateToSharedSettings();
100
113
  } catch (err) {
101
114
  console.warn('[!] Migration warning:', err.message);
102
115
  console.warn(' Migration will retry on next run');
103
116
  }
104
117
  console.log('');
105
118
 
106
- // Copy .claude/ directory from package to ~/.ccs/.claude/ (v4.1.1)
107
- try {
108
- const ClaudeDirInstaller = require('../bin/utils/claude-dir-installer');
109
- const installer = new ClaudeDirInstaller();
110
- const packageDir = path.join(__dirname, '..');
111
- installer.install(packageDir);
112
-
113
- // Clean up deprecated files (v4.3.2)
114
- installer.cleanupDeprecated();
115
- } catch (err) {
116
- console.warn('[!] Failed to install .claude/ directory:', err.message);
117
- console.warn(' CCS items may not be available');
118
- }
119
-
120
- // Install CCS items to ~/.claude/ (v4.1.0)
121
- try {
122
- const ClaudeSymlinkManager = require('../bin/utils/claude-symlink-manager');
123
- const claudeSymlinkManager = new ClaudeSymlinkManager();
124
- claudeSymlinkManager.install();
125
- } catch (err) {
126
- console.warn('[!] CCS item installation warning:', err.message);
127
- console.warn(' Run "ccs sync" to retry');
128
- }
129
- 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
130
122
 
131
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)
132
126
  const configPath = path.join(ccsDir, 'config.json');
133
127
  if (!fs.existsSync(configPath)) {
134
128
  const config = {
@@ -153,12 +147,17 @@ function createConfigFiles() {
153
147
  if (!config.profiles) {
154
148
  config.profiles = {};
155
149
  }
150
+ let configUpdated = false;
156
151
  if (!config.profiles.glmt) {
157
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) {
158
157
  const tmpPath = `${configPath}.tmp`;
159
158
  fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
160
159
  fs.renameSync(tmpPath, configPath);
161
- console.log('[OK] Updated config with GLMT profile');
160
+ console.log('[OK] Updated config with glmt profile');
162
161
  } else {
163
162
  console.log('[OK] Config exists: ~/.ccs/config.json (preserved)');
164
163
  }
@@ -307,6 +306,10 @@ function createConfigFiles() {
307
306
  console.log('[OK] Kimi profile exists: ~/.ccs/kimi.settings.json (preserved)');
308
307
  }
309
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
+
310
313
  // Migrate existing Kimi configs to remove deprecated model fields (v4.1.2)
311
314
  // Kimi API changed - model fields now cause 401 errors
312
315
  if (fs.existsSync(kimiSettingsPath)) {