@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.
- package/dist/api/services/profile-writer.d.ts.map +1 -1
- package/dist/api/services/profile-writer.js +6 -2
- package/dist/api/services/profile-writer.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +4 -3
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/auth/profile-registry.d.ts.map +1 -1
- package/dist/auth/profile-registry.js +2 -2
- package/dist/auth/profile-registry.js.map +1 -1
- package/dist/ccs.js +6 -0
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/services/variant-settings.d.ts.map +1 -1
- package/dist/cliproxy/services/variant-settings.js +5 -0
- package/dist/cliproxy/services/variant-settings.js.map +1 -1
- package/dist/commands/install-command.d.ts.map +1 -1
- package/dist/commands/install-command.js +26 -4
- package/dist/commands/install-command.js.map +1 -1
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +2 -2
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/delegation/session-manager.js +2 -2
- package/dist/delegation/session-manager.js.map +1 -1
- package/dist/glmt/glmt-transformer.d.ts.map +1 -1
- package/dist/glmt/glmt-transformer.js +2 -2
- package/dist/glmt/glmt-transformer.js.map +1 -1
- package/dist/management/checks/config-check.d.ts.map +1 -1
- package/dist/management/checks/config-check.js +2 -1
- package/dist/management/checks/config-check.js.map +1 -1
- package/dist/management/checks/profile-check.d.ts.map +1 -1
- package/dist/management/checks/profile-check.js +4 -4
- package/dist/management/checks/profile-check.js.map +1 -1
- package/dist/management/checks/symlink-check.d.ts.map +1 -1
- package/dist/management/checks/symlink-check.js +14 -4
- package/dist/management/checks/symlink-check.js.map +1 -1
- package/dist/management/checks/system-check.d.ts.map +1 -1
- package/dist/management/checks/system-check.js +2 -3
- package/dist/management/checks/system-check.js.map +1 -1
- package/dist/management/instance-manager.js +2 -2
- package/dist/management/instance-manager.js.map +1 -1
- package/dist/management/shared-manager.d.ts.map +1 -1
- package/dist/management/shared-manager.js +4 -2
- package/dist/management/shared-manager.js.map +1 -1
- package/dist/utils/claude-dir-installer.js +3 -3
- package/dist/utils/claude-dir-installer.js.map +1 -1
- package/dist/utils/claude-symlink-manager.d.ts +2 -1
- package/dist/utils/claude-symlink-manager.d.ts.map +1 -1
- package/dist/utils/claude-symlink-manager.js +6 -3
- package/dist/utils/claude-symlink-manager.js.map +1 -1
- package/dist/utils/update-checker.js +2 -2
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/utils/websearch/hook-config.d.ts +10 -0
- package/dist/utils/websearch/hook-config.d.ts.map +1 -1
- package/dist/utils/websearch/hook-config.js +68 -5
- package/dist/utils/websearch/hook-config.js.map +1 -1
- package/dist/utils/websearch/hook-installer.d.ts +3 -0
- package/dist/utils/websearch/hook-installer.d.ts.map +1 -1
- package/dist/utils/websearch/hook-installer.js +11 -6
- package/dist/utils/websearch/hook-installer.js.map +1 -1
- package/dist/utils/websearch/index.d.ts +2 -0
- package/dist/utils/websearch/index.d.ts.map +1 -1
- package/dist/utils/websearch/index.js +8 -1
- package/dist/utils/websearch/index.js.map +1 -1
- package/dist/utils/websearch/profile-hook-injector.d.ts +20 -0
- package/dist/utils/websearch/profile-hook-injector.d.ts.map +1 -0
- package/dist/utils/websearch/profile-hook-injector.js +236 -0
- package/dist/utils/websearch/profile-hook-injector.js.map +1 -0
- package/dist/utils/websearch-manager.d.ts +1 -0
- package/dist/utils/websearch-manager.d.ts.map +1 -1
- package/dist/utils/websearch-manager.js +5 -1
- package/dist/utils/websearch-manager.js.map +1 -1
- package/package.json +2 -1
- 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;
|
|
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.
|
|
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();
|