@kaitranntt/ccs 7.27.0-dev.1 → 7.27.0-dev.2

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 (72) hide show
  1. package/dist/api/services/profile-writer.d.ts.map +1 -1
  2. package/dist/api/services/profile-writer.js +6 -2
  3. package/dist/api/services/profile-writer.js.map +1 -1
  4. package/dist/auth/profile-detector.d.ts.map +1 -1
  5. package/dist/auth/profile-detector.js +4 -3
  6. package/dist/auth/profile-detector.js.map +1 -1
  7. package/dist/auth/profile-registry.d.ts.map +1 -1
  8. package/dist/auth/profile-registry.js +2 -2
  9. package/dist/auth/profile-registry.js.map +1 -1
  10. package/dist/ccs.js +6 -0
  11. package/dist/ccs.js.map +1 -1
  12. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
  13. package/dist/cliproxy/services/variant-settings.js +5 -0
  14. package/dist/cliproxy/services/variant-settings.js.map +1 -1
  15. package/dist/commands/install-command.d.ts.map +1 -1
  16. package/dist/commands/install-command.js +26 -4
  17. package/dist/commands/install-command.js.map +1 -1
  18. package/dist/delegation/headless-executor.d.ts.map +1 -1
  19. package/dist/delegation/headless-executor.js +2 -2
  20. package/dist/delegation/headless-executor.js.map +1 -1
  21. package/dist/delegation/session-manager.js +2 -2
  22. package/dist/delegation/session-manager.js.map +1 -1
  23. package/dist/glmt/glmt-transformer.d.ts.map +1 -1
  24. package/dist/glmt/glmt-transformer.js +2 -2
  25. package/dist/glmt/glmt-transformer.js.map +1 -1
  26. package/dist/management/checks/config-check.d.ts.map +1 -1
  27. package/dist/management/checks/config-check.js +2 -1
  28. package/dist/management/checks/config-check.js.map +1 -1
  29. package/dist/management/checks/profile-check.d.ts.map +1 -1
  30. package/dist/management/checks/profile-check.js +4 -4
  31. package/dist/management/checks/profile-check.js.map +1 -1
  32. package/dist/management/checks/symlink-check.d.ts.map +1 -1
  33. package/dist/management/checks/symlink-check.js +14 -4
  34. package/dist/management/checks/symlink-check.js.map +1 -1
  35. package/dist/management/checks/system-check.d.ts.map +1 -1
  36. package/dist/management/checks/system-check.js +2 -3
  37. package/dist/management/checks/system-check.js.map +1 -1
  38. package/dist/management/instance-manager.js +2 -2
  39. package/dist/management/instance-manager.js.map +1 -1
  40. package/dist/management/shared-manager.d.ts.map +1 -1
  41. package/dist/management/shared-manager.js +4 -2
  42. package/dist/management/shared-manager.js.map +1 -1
  43. package/dist/utils/claude-dir-installer.js +3 -3
  44. package/dist/utils/claude-dir-installer.js.map +1 -1
  45. package/dist/utils/claude-symlink-manager.d.ts +2 -1
  46. package/dist/utils/claude-symlink-manager.d.ts.map +1 -1
  47. package/dist/utils/claude-symlink-manager.js +6 -3
  48. package/dist/utils/claude-symlink-manager.js.map +1 -1
  49. package/dist/utils/update-checker.js +2 -2
  50. package/dist/utils/update-checker.js.map +1 -1
  51. package/dist/utils/websearch/hook-config.d.ts +10 -0
  52. package/dist/utils/websearch/hook-config.d.ts.map +1 -1
  53. package/dist/utils/websearch/hook-config.js +68 -5
  54. package/dist/utils/websearch/hook-config.js.map +1 -1
  55. package/dist/utils/websearch/hook-installer.d.ts +3 -0
  56. package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
  57. package/dist/utils/websearch/hook-installer.js +11 -6
  58. package/dist/utils/websearch/hook-installer.js.map +1 -1
  59. package/dist/utils/websearch/index.d.ts +2 -0
  60. package/dist/utils/websearch/index.d.ts.map +1 -1
  61. package/dist/utils/websearch/index.js +8 -1
  62. package/dist/utils/websearch/index.js.map +1 -1
  63. package/dist/utils/websearch/profile-hook-injector.d.ts +20 -0
  64. package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -0
  65. package/dist/utils/websearch/profile-hook-injector.js +236 -0
  66. package/dist/utils/websearch/profile-hook-injector.js.map +1 -0
  67. package/dist/utils/websearch-manager.d.ts +1 -0
  68. package/dist/utils/websearch-manager.d.ts.map +1 -1
  69. package/dist/utils/websearch-manager.js +5 -1
  70. package/dist/utils/websearch-manager.js.map +1 -1
  71. package/package.json +2 -1
  72. package/scripts/postuninstall.js +42 -0
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Profile Hook Injector
4
+ *
5
+ * Injects WebSearch hooks into per-profile settings files.
6
+ * This replaces the global ~/.claude/settings.json approach.
7
+ *
8
+ * @module utils/websearch/profile-hook-injector
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || function (mod) {
27
+ if (mod && mod.__esModule) return mod;
28
+ var result = {};
29
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
30
+ __setModuleDefault(result, mod);
31
+ return result;
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.removeMigrationMarker = exports.ensureProfileHooks = void 0;
35
+ const fs = __importStar(require("fs"));
36
+ const path = __importStar(require("path"));
37
+ const ui_1 = require("../ui");
38
+ const hook_config_1 = require("./hook-config");
39
+ const unified_config_loader_1 = require("../../config/unified-config-loader");
40
+ const hook_config_2 = require("./hook-config");
41
+ const config_manager_1 = require("../config-manager");
42
+ // Valid profile name pattern (alphanumeric, dash, underscore only)
43
+ const VALID_PROFILE_NAME = /^[a-zA-Z0-9_-]+$/;
44
+ /**
45
+ * Get migration marker path (respects CCS_HOME for test isolation)
46
+ */
47
+ function getMigrationMarkerPath() {
48
+ return path.join((0, config_manager_1.getCcsDir)(), '.hook-migrated');
49
+ }
50
+ /**
51
+ * Check if CCS WebSearch hook exists in settings
52
+ */
53
+ function hasCcsHook(settings) {
54
+ const hooks = settings.hooks;
55
+ if (!hooks?.PreToolUse)
56
+ return false;
57
+ return hooks.PreToolUse.some((h) => {
58
+ const hook = h;
59
+ if (hook.matcher !== 'WebSearch')
60
+ return false;
61
+ const hookArray = hook.hooks;
62
+ if (!hookArray?.[0]?.command)
63
+ return false;
64
+ const command = hookArray[0].command;
65
+ return command.includes('.ccs/hooks/websearch-transformer');
66
+ });
67
+ }
68
+ /**
69
+ * Migrate CCS hook from global settings to profile settings (one-time)
70
+ */
71
+ function migrateGlobalHook() {
72
+ const markerPath = getMigrationMarkerPath();
73
+ if (fs.existsSync(markerPath)) {
74
+ return; // Already migrated
75
+ }
76
+ try {
77
+ const removed = (0, hook_config_2.removeHookConfig)();
78
+ if (removed && process.env.CCS_DEBUG) {
79
+ console.error((0, ui_1.info)('Migrated WebSearch hook from global settings'));
80
+ }
81
+ // Ensure CCS dir exists before creating marker
82
+ const ccsDir = (0, config_manager_1.getCcsDir)();
83
+ if (!fs.existsSync(ccsDir)) {
84
+ fs.mkdirSync(ccsDir, { recursive: true, mode: 0o700 });
85
+ }
86
+ // Create marker file
87
+ fs.writeFileSync(markerPath, new Date().toISOString(), 'utf8');
88
+ }
89
+ catch (error) {
90
+ if (process.env.CCS_DEBUG) {
91
+ console.error((0, ui_1.warn)(`Migration failed: ${error.message}`));
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * Ensure WebSearch hook is configured in profile's settings file
97
+ *
98
+ * @param profileName - Name of the profile (e.g., 'agy', 'gemini', 'glm')
99
+ * @returns true if hook is configured (existing or newly added)
100
+ */
101
+ function ensureProfileHooks(profileName) {
102
+ try {
103
+ // Validate profile name to prevent path traversal
104
+ if (!VALID_PROFILE_NAME.test(profileName)) {
105
+ if (process.env.CCS_DEBUG) {
106
+ console.error((0, ui_1.warn)(`Invalid profile name: ${profileName}`));
107
+ }
108
+ return false;
109
+ }
110
+ const wsConfig = (0, unified_config_loader_1.getWebSearchConfig)();
111
+ // Skip if WebSearch is disabled
112
+ if (!wsConfig.enabled) {
113
+ return false;
114
+ }
115
+ // One-time migration from global settings
116
+ migrateGlobalHook();
117
+ // Get CCS directory (respects CCS_HOME for test isolation)
118
+ const ccsDir = (0, config_manager_1.getCcsDir)();
119
+ // Ensure CCS dir exists
120
+ if (!fs.existsSync(ccsDir)) {
121
+ fs.mkdirSync(ccsDir, { recursive: true, mode: 0o700 });
122
+ }
123
+ const settingsPath = path.join(ccsDir, `${profileName}.settings.json`);
124
+ // Read existing settings or create empty
125
+ let settings = {};
126
+ if (fs.existsSync(settingsPath)) {
127
+ try {
128
+ const content = fs.readFileSync(settingsPath, 'utf8');
129
+ settings = JSON.parse(content);
130
+ }
131
+ catch {
132
+ if (process.env.CCS_DEBUG) {
133
+ console.error((0, ui_1.warn)(`Malformed ${profileName}.settings.json - creating fresh hooks`));
134
+ }
135
+ // Continue with empty settings, will add hooks
136
+ }
137
+ }
138
+ // Check if CCS hook already present
139
+ if (hasCcsHook(settings)) {
140
+ // Update timeout if needed
141
+ return updateHookTimeoutIfNeeded(settings, settingsPath);
142
+ }
143
+ // Get hook config
144
+ const hookConfig = (0, hook_config_1.getWebSearchHookConfig)();
145
+ // Ensure hooks structure exists
146
+ if (!settings.hooks) {
147
+ settings.hooks = {};
148
+ }
149
+ const settingsHooks = settings.hooks;
150
+ if (!settingsHooks.PreToolUse) {
151
+ settingsHooks.PreToolUse = [];
152
+ }
153
+ // Add CCS hook
154
+ const preToolUseHooks = hookConfig.PreToolUse;
155
+ settingsHooks.PreToolUse.push(...preToolUseHooks);
156
+ // Write updated settings
157
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
158
+ if (process.env.CCS_DEBUG) {
159
+ console.error((0, ui_1.info)(`Added WebSearch hook to ${profileName}.settings.json`));
160
+ }
161
+ return true;
162
+ }
163
+ catch (error) {
164
+ if (process.env.CCS_DEBUG) {
165
+ console.error((0, ui_1.warn)(`Failed to inject hook: ${error.message}`));
166
+ }
167
+ return false;
168
+ }
169
+ }
170
+ exports.ensureProfileHooks = ensureProfileHooks;
171
+ /**
172
+ * Update hook timeout if it differs from current config
173
+ */
174
+ function updateHookTimeoutIfNeeded(settings, settingsPath) {
175
+ try {
176
+ const hooks = settings.hooks;
177
+ const hookConfig = (0, hook_config_1.getWebSearchHookConfig)();
178
+ const expectedHookPath = (0, hook_config_1.getHookPath)();
179
+ const expectedCommand = `node "${expectedHookPath}"`;
180
+ const expectedHooks = hookConfig.PreToolUse[0]
181
+ .hooks;
182
+ const expectedTimeout = expectedHooks[0].timeout;
183
+ let needsUpdate = false;
184
+ for (const h of hooks.PreToolUse) {
185
+ const hook = h;
186
+ if (hook.matcher !== 'WebSearch')
187
+ continue;
188
+ const hookArray = hook.hooks;
189
+ if (!hookArray?.[0]?.command)
190
+ continue;
191
+ const command = hookArray[0].command;
192
+ if (!command.includes('.ccs/hooks/websearch-transformer'))
193
+ continue;
194
+ // Found CCS hook - check if needs update
195
+ if (hookArray[0].command !== expectedCommand) {
196
+ hookArray[0].command = expectedCommand;
197
+ needsUpdate = true;
198
+ }
199
+ if (hookArray[0].timeout !== expectedTimeout) {
200
+ hookArray[0].timeout = expectedTimeout;
201
+ needsUpdate = true;
202
+ }
203
+ }
204
+ if (needsUpdate) {
205
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
206
+ if (process.env.CCS_DEBUG) {
207
+ console.error((0, ui_1.info)('Updated WebSearch hook timeout in profile settings'));
208
+ }
209
+ }
210
+ return true;
211
+ }
212
+ catch (error) {
213
+ if (process.env.CCS_DEBUG) {
214
+ console.error((0, ui_1.warn)(`updateHookTimeoutIfNeeded failed: ${error.message}`));
215
+ }
216
+ return false;
217
+ }
218
+ }
219
+ /**
220
+ * Remove migration marker (called during uninstall)
221
+ */
222
+ function removeMigrationMarker() {
223
+ try {
224
+ const markerPath = getMigrationMarkerPath();
225
+ if (fs.existsSync(markerPath)) {
226
+ fs.unlinkSync(markerPath);
227
+ }
228
+ }
229
+ catch (error) {
230
+ if (process.env.CCS_DEBUG) {
231
+ console.error((0, ui_1.warn)(`removeMigrationMarker failed: ${error.message}`));
232
+ }
233
+ }
234
+ }
235
+ exports.removeMigrationMarker = removeMigrationMarker;
236
+ //# sourceMappingURL=profile-hook-injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-hook-injector.js","sourceRoot":"","sources":["../../../src/utils/websearch/profile-hook-injector.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ export { getOpenCodeCliStatus, hasOpenCodeCli, clearOpenCodeCliCache, } from './
19
19
  export { getHookPath, hasWebSearchHook, getWebSearchHookConfig, installWebSearchHook, uninstallWebSearchHook, } from './websearch/hook-installer';
20
20
  export { getWebSearchHookEnv } from './websearch/hook-env';
21
21
  export { getWebSearchCliProviders, hasAnyWebSearchCli, getCliInstallHints, getWebSearchReadiness, displayWebSearchStatus, } from './websearch/status';
22
+ export { ensureProfileHooks, removeMigrationMarker } from './websearch/profile-hook-injector';
22
23
  /**
23
24
  * Clear all CLI caches
24
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"websearch-manager.d.ts","sourceRoot":"","sources":["../../src/utils/websearch-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAK5B;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
1
+ {"version":3,"file":"websearch-manager.d.ts","sourceRoot":"","sources":["../../src/utils/websearch-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAK9F;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAIxC;AAID;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
@@ -14,7 +14,7 @@
14
14
  * @module utils/websearch-manager
15
15
  */
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.ensureMcpWebSearch = exports.clearAllCliCaches = exports.displayWebSearchStatus = exports.getWebSearchReadiness = exports.getCliInstallHints = exports.hasAnyWebSearchCli = exports.getWebSearchCliProviders = exports.getWebSearchHookEnv = exports.uninstallWebSearchHook = exports.installWebSearchHook = exports.getWebSearchHookConfig = exports.hasWebSearchHook = exports.getHookPath = exports.clearOpenCodeCliCache = exports.hasOpenCodeCli = exports.getOpenCodeCliStatus = exports.clearGrokCliCache = exports.hasGrokCli = exports.getGrokCliStatus = exports.clearGeminiCliCache = exports.isGeminiAuthenticated = exports.hasGeminiCli = exports.getGeminiCliStatus = void 0;
17
+ exports.ensureMcpWebSearch = exports.clearAllCliCaches = exports.removeMigrationMarker = exports.ensureProfileHooks = exports.displayWebSearchStatus = exports.getWebSearchReadiness = exports.getCliInstallHints = exports.hasAnyWebSearchCli = exports.getWebSearchCliProviders = exports.getWebSearchHookEnv = exports.uninstallWebSearchHook = exports.installWebSearchHook = exports.getWebSearchHookConfig = exports.hasWebSearchHook = exports.getHookPath = exports.clearOpenCodeCliCache = exports.hasOpenCodeCli = exports.getOpenCodeCliStatus = exports.clearGrokCliCache = exports.hasGrokCli = exports.getGrokCliStatus = exports.clearGeminiCliCache = exports.isGeminiAuthenticated = exports.hasGeminiCli = exports.getGeminiCliStatus = void 0;
18
18
  // Re-export CLI detection functions
19
19
  var gemini_cli_1 = require("./websearch/gemini-cli");
20
20
  Object.defineProperty(exports, "getGeminiCliStatus", { enumerable: true, get: function () { return gemini_cli_1.getGeminiCliStatus; } });
@@ -46,6 +46,10 @@ Object.defineProperty(exports, "hasAnyWebSearchCli", { enumerable: true, get: fu
46
46
  Object.defineProperty(exports, "getCliInstallHints", { enumerable: true, get: function () { return status_1.getCliInstallHints; } });
47
47
  Object.defineProperty(exports, "getWebSearchReadiness", { enumerable: true, get: function () { return status_1.getWebSearchReadiness; } });
48
48
  Object.defineProperty(exports, "displayWebSearchStatus", { enumerable: true, get: function () { return status_1.displayWebSearchStatus; } });
49
+ // Re-export profile hook injection
50
+ var profile_hook_injector_1 = require("./websearch/profile-hook-injector");
51
+ Object.defineProperty(exports, "ensureProfileHooks", { enumerable: true, get: function () { return profile_hook_injector_1.ensureProfileHooks; } });
52
+ Object.defineProperty(exports, "removeMigrationMarker", { enumerable: true, get: function () { return profile_hook_injector_1.removeMigrationMarker; } });
49
53
  // Import for local use
50
54
  const websearch_1 = require("./websearch");
51
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"websearch-manager.js","sourceRoot":"","sources":["../../src/utils/websearch-manager.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAYH,oCAAoC;AACpC,qDAKgC;AAJ9B,gHAAA,kBAAkB,OAAA;AAClB,0GAAA,YAAY,OAAA;AACZ,mHAAA,qBAAqB,OAAA;AACrB,iHAAA,mBAAmB,OAAA;AAGrB,iDAAuF;AAA9E,4GAAA,gBAAgB,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAExD,yDAIkC;AAHhC,oHAAA,oBAAoB,OAAA;AACpB,8GAAA,cAAc,OAAA;AACd,qHAAA,qBAAqB,OAAA;AAGvB,sCAAsC;AACtC,6DAMoC;AALlC,6GAAA,WAAW,OAAA;AACX,kHAAA,gBAAgB,OAAA;AAChB,wHAAA,sBAAsB,OAAA;AACtB,sHAAA,oBAAoB,OAAA;AACpB,wHAAA,sBAAsB,OAAA;AAGxB,6BAA6B;AAC7B,iDAA2D;AAAlD,+GAAA,mBAAmB,OAAA;AAE5B,2CAA2C;AAC3C,6CAM4B;AAL1B,kHAAA,wBAAwB,OAAA;AACxB,4GAAA,kBAAkB,OAAA;AAClB,4GAAA,kBAAkB,OAAA;AAClB,+GAAA,qBAAqB,OAAA;AACrB,gHAAA,sBAAsB,OAAA;AAGxB,uBAAuB;AACvB,2CAA4F;AAE5F;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,IAAA,+BAAmB,GAAE,CAAC;IACtB,IAAA,6BAAiB,GAAE,CAAC;IACpB,IAAA,iCAAqB,GAAE,CAAC;AAC1B,CAAC;AAJD,8CAIC;AAED,uDAAuD;AAEvD;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAFD,gDAEC"}
1
+ {"version":3,"file":"websearch-manager.js","sourceRoot":"","sources":["../../src/utils/websearch-manager.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAYH,oCAAoC;AACpC,qDAKgC;AAJ9B,gHAAA,kBAAkB,OAAA;AAClB,0GAAA,YAAY,OAAA;AACZ,mHAAA,qBAAqB,OAAA;AACrB,iHAAA,mBAAmB,OAAA;AAGrB,iDAAuF;AAA9E,4GAAA,gBAAgB,OAAA;AAAE,sGAAA,UAAU,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAExD,yDAIkC;AAHhC,oHAAA,oBAAoB,OAAA;AACpB,8GAAA,cAAc,OAAA;AACd,qHAAA,qBAAqB,OAAA;AAGvB,sCAAsC;AACtC,6DAMoC;AALlC,6GAAA,WAAW,OAAA;AACX,kHAAA,gBAAgB,OAAA;AAChB,wHAAA,sBAAsB,OAAA;AACtB,sHAAA,oBAAoB,OAAA;AACpB,wHAAA,sBAAsB,OAAA;AAGxB,6BAA6B;AAC7B,iDAA2D;AAAlD,+GAAA,mBAAmB,OAAA;AAE5B,2CAA2C;AAC3C,6CAM4B;AAL1B,kHAAA,wBAAwB,OAAA;AACxB,4GAAA,kBAAkB,OAAA;AAClB,4GAAA,kBAAkB,OAAA;AAClB,+GAAA,qBAAqB,OAAA;AACrB,gHAAA,sBAAsB,OAAA;AAGxB,mCAAmC;AACnC,2EAA8F;AAArF,2HAAA,kBAAkB,OAAA;AAAE,8HAAA,qBAAqB,OAAA;AAElD,uBAAuB;AACvB,2CAA4F;AAE5F;;GAEG;AACH,SAAgB,iBAAiB;IAC/B,IAAA,+BAAmB,GAAE,CAAC;IACtB,IAAA,6BAAiB,GAAE,CAAC;IACpB,IAAA,iCAAqB,GAAE,CAAC;AAC1B,CAAC;AAJD,8CAIC;AAED,uDAAuD;AAEvD;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAFD,gDAEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaitranntt/ccs",
3
- "version": "7.27.0-dev.1",
3
+ "version": "7.27.0-dev.2",
4
4
  "description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6",
5
5
  "keywords": [
6
6
  "cli",
@@ -51,6 +51,7 @@
51
51
  "preferGlobal": true,
52
52
  "scripts": {
53
53
  "preinstall": "node scripts/preinstall.js",
54
+ "postuninstall": "node scripts/postuninstall.js",
54
55
  "build": "tsc && node scripts/add-shebang.js",
55
56
  "build:watch": "tsc --watch",
56
57
  "build:server": "tsc && node scripts/add-shebang.js",
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CCS Postuninstall Script
4
+ *
5
+ * Cleans up CCS-specific files after npm uninstall.
6
+ * Does NOT touch global ~/.claude/settings.json (hooks are per-profile now).
7
+ *
8
+ * Self-contained, no external dependencies.
9
+ */
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const os = require('os');
14
+
15
+ // Note: Uses os.homedir() directly because this script runs during npm uninstall,
16
+ // not in test context. CCS_HOME isolation is for src/ code only.
17
+ const CCS_DIR = path.join(os.homedir(), '.ccs');
18
+ const HOOKS_DIR = path.join(CCS_DIR, 'hooks');
19
+ const MIGRATION_MARKER = path.join(CCS_DIR, '.hook-migrated');
20
+
21
+ function cleanupCcsFiles() {
22
+ try {
23
+ // Remove WebSearch hook file
24
+ const hookPath = path.join(HOOKS_DIR, 'websearch-transformer.cjs');
25
+ if (fs.existsSync(hookPath)) {
26
+ fs.unlinkSync(hookPath);
27
+ }
28
+
29
+ // Remove migration marker (so fresh install re-runs migration)
30
+ if (fs.existsSync(MIGRATION_MARKER)) {
31
+ fs.unlinkSync(MIGRATION_MARKER);
32
+ }
33
+
34
+ // Note: Do NOT touch ~/.claude/settings.json
35
+ // Per-profile hooks in ~/.ccs/*.settings.json will be cleaned up
36
+ // when the user removes ~/.ccs/ directory.
37
+ } catch {
38
+ // Silent fail - not critical
39
+ }
40
+ }
41
+
42
+ cleanupCcsFiles();