agents-reverse-engineer 0.1.1 → 0.2.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.
- package/README.md +91 -38
- package/dist/cli/index.js +60 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +0 -5
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +10 -37
- package/dist/cli/init.js.map +1 -1
- package/dist/installer/banner.d.ts +52 -0
- package/dist/installer/banner.d.ts.map +1 -0
- package/dist/installer/banner.js +112 -0
- package/dist/installer/banner.js.map +1 -0
- package/dist/installer/index.d.ts +32 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +288 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/operations.d.ts +73 -0
- package/dist/installer/operations.d.ts.map +1 -0
- package/dist/installer/operations.js +335 -0
- package/dist/installer/operations.js.map +1 -0
- package/dist/installer/paths.d.ts +50 -0
- package/dist/installer/paths.d.ts.map +1 -0
- package/dist/installer/paths.js +95 -0
- package/dist/installer/paths.js.map +1 -0
- package/dist/installer/prompts.d.ts +51 -0
- package/dist/installer/prompts.d.ts.map +1 -0
- package/dist/installer/prompts.js +196 -0
- package/dist/installer/prompts.js.map +1 -0
- package/dist/installer/types.d.ts +78 -0
- package/dist/installer/types.d.ts.map +1 -0
- package/dist/installer/types.js +8 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/installer/uninstall.d.ts +32 -0
- package/dist/installer/uninstall.d.ts.map +1 -0
- package/dist/installer/uninstall.js +283 -0
- package/dist/installer/uninstall.js.map +1 -0
- package/dist/integration/generate.d.ts +3 -1
- package/dist/integration/generate.d.ts.map +1 -1
- package/dist/integration/generate.js +20 -4
- package/dist/integration/generate.js.map +1 -1
- package/dist/integration/templates.d.ts +12 -0
- package/dist/integration/templates.d.ts.map +1 -1
- package/dist/integration/templates.js +335 -16
- package/dist/integration/templates.js.map +1 -1
- package/dist/integration/types.d.ts +1 -1
- package/dist/integration/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive prompts module for the installer
|
|
3
|
+
*
|
|
4
|
+
* Provides arrow key selection in TTY mode with numbered fallback for CI/non-interactive.
|
|
5
|
+
* Uses Node.js readline module with raw mode for keypress handling.
|
|
6
|
+
*
|
|
7
|
+
* CRITICAL: Raw mode is always cleaned up via try/finally and process exit handlers.
|
|
8
|
+
*/
|
|
9
|
+
import * as readline from 'node:readline';
|
|
10
|
+
import pc from 'picocolors';
|
|
11
|
+
/**
|
|
12
|
+
* Check if stdin is a TTY (interactive terminal)
|
|
13
|
+
*
|
|
14
|
+
* @returns true if running in interactive terminal, false for CI/piped input
|
|
15
|
+
*/
|
|
16
|
+
export function isInteractive() {
|
|
17
|
+
return process.stdin.isTTY === true;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Raw mode state tracker for cleanup
|
|
21
|
+
*/
|
|
22
|
+
let rawModeActive = false;
|
|
23
|
+
/**
|
|
24
|
+
* Cleanup function to restore terminal state
|
|
25
|
+
*/
|
|
26
|
+
function cleanupRawMode() {
|
|
27
|
+
if (rawModeActive && process.stdin.isTTY) {
|
|
28
|
+
try {
|
|
29
|
+
process.stdin.setRawMode(false);
|
|
30
|
+
process.stdin.pause();
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Ignore errors during cleanup
|
|
34
|
+
}
|
|
35
|
+
rawModeActive = false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Register global cleanup handlers
|
|
39
|
+
process.on('exit', cleanupRawMode);
|
|
40
|
+
process.on('SIGINT', () => {
|
|
41
|
+
cleanupRawMode();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
});
|
|
44
|
+
/**
|
|
45
|
+
* Generic option selector that uses arrow keys in TTY, numbered in non-TTY
|
|
46
|
+
*
|
|
47
|
+
* @param prompt - Question to display
|
|
48
|
+
* @param options - Array of options with labels and values
|
|
49
|
+
* @returns Selected value
|
|
50
|
+
*/
|
|
51
|
+
export async function selectOption(prompt, options) {
|
|
52
|
+
if (isInteractive()) {
|
|
53
|
+
return arrowKeySelect(prompt, options);
|
|
54
|
+
}
|
|
55
|
+
return numberedSelect(prompt, options);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Arrow key selection for interactive terminals
|
|
59
|
+
*
|
|
60
|
+
* Uses raw mode to capture keypresses for up/down/enter navigation.
|
|
61
|
+
* Always cleans up raw mode even on error or Ctrl+C.
|
|
62
|
+
*
|
|
63
|
+
* @param prompt - Question to display
|
|
64
|
+
* @param options - Array of options with labels and values
|
|
65
|
+
* @returns Selected value
|
|
66
|
+
*/
|
|
67
|
+
async function arrowKeySelect(prompt, options) {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
let selectedIndex = 0;
|
|
70
|
+
// Render the current selection state
|
|
71
|
+
const render = (clear = false) => {
|
|
72
|
+
// Move cursor up and clear lines if re-rendering
|
|
73
|
+
if (clear) {
|
|
74
|
+
process.stdout.write(`\x1b[${options.length + 1}A`);
|
|
75
|
+
for (let i = 0; i <= options.length; i++) {
|
|
76
|
+
process.stdout.write('\x1b[2K\x1b[1B');
|
|
77
|
+
}
|
|
78
|
+
process.stdout.write(`\x1b[${options.length + 1}A`);
|
|
79
|
+
}
|
|
80
|
+
console.log(pc.bold(prompt));
|
|
81
|
+
options.forEach((opt, idx) => {
|
|
82
|
+
const prefix = idx === selectedIndex ? pc.cyan('> ') : ' ';
|
|
83
|
+
const label = idx === selectedIndex ? pc.cyan(opt.label) : opt.label;
|
|
84
|
+
console.log(prefix + label);
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
// Handle keypress events
|
|
88
|
+
const handleKeypress = (_str, key) => {
|
|
89
|
+
if (key.ctrl && key.name === 'c') {
|
|
90
|
+
cleanupRawMode();
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
switch (key.name) {
|
|
94
|
+
case 'up':
|
|
95
|
+
selectedIndex = Math.max(0, selectedIndex - 1);
|
|
96
|
+
render(true);
|
|
97
|
+
break;
|
|
98
|
+
case 'down':
|
|
99
|
+
selectedIndex = Math.min(options.length - 1, selectedIndex + 1);
|
|
100
|
+
render(true);
|
|
101
|
+
break;
|
|
102
|
+
case 'return':
|
|
103
|
+
// Cleanup and resolve
|
|
104
|
+
process.stdin.off('keypress', handleKeypress);
|
|
105
|
+
cleanupRawMode();
|
|
106
|
+
console.log();
|
|
107
|
+
resolve(options[selectedIndex].value);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
try {
|
|
112
|
+
// Setup raw mode for keypress handling
|
|
113
|
+
readline.emitKeypressEvents(process.stdin);
|
|
114
|
+
if (process.stdin.isTTY) {
|
|
115
|
+
process.stdin.setRawMode(true);
|
|
116
|
+
rawModeActive = true;
|
|
117
|
+
}
|
|
118
|
+
process.stdin.resume();
|
|
119
|
+
process.stdin.on('keypress', handleKeypress);
|
|
120
|
+
// Initial render
|
|
121
|
+
render(false);
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
cleanupRawMode();
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Numbered selection for non-interactive environments
|
|
131
|
+
*
|
|
132
|
+
* Prints numbered options and reads a number from stdin.
|
|
133
|
+
* Used in CI environments or when stdin is piped.
|
|
134
|
+
*
|
|
135
|
+
* @param prompt - Question to display
|
|
136
|
+
* @param options - Array of options with labels and values
|
|
137
|
+
* @returns Selected value
|
|
138
|
+
*/
|
|
139
|
+
async function numberedSelect(prompt, options) {
|
|
140
|
+
return new Promise((resolve, reject) => {
|
|
141
|
+
console.log(pc.bold(prompt));
|
|
142
|
+
options.forEach((opt, idx) => {
|
|
143
|
+
console.log(` ${idx + 1}. ${opt.label}`);
|
|
144
|
+
});
|
|
145
|
+
const rl = readline.createInterface({
|
|
146
|
+
input: process.stdin,
|
|
147
|
+
output: process.stdout,
|
|
148
|
+
});
|
|
149
|
+
rl.question('Enter number: ', (answer) => {
|
|
150
|
+
rl.close();
|
|
151
|
+
const num = parseInt(answer, 10);
|
|
152
|
+
if (isNaN(num) || num < 1 || num > options.length) {
|
|
153
|
+
reject(new Error(`Invalid selection: ${answer}. Expected 1-${options.length}`));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
resolve(options[num - 1].value);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Prompt user to select a runtime
|
|
162
|
+
*
|
|
163
|
+
* @returns Selected runtime value
|
|
164
|
+
*/
|
|
165
|
+
export async function selectRuntime() {
|
|
166
|
+
return selectOption('Select runtime to install:', [
|
|
167
|
+
{ label: 'Claude Code', value: 'claude' },
|
|
168
|
+
{ label: 'OpenCode', value: 'opencode' },
|
|
169
|
+
{ label: 'Gemini CLI', value: 'gemini' },
|
|
170
|
+
{ label: 'All runtimes', value: 'all' },
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Prompt user to select installation location
|
|
175
|
+
*
|
|
176
|
+
* @returns Selected location value
|
|
177
|
+
*/
|
|
178
|
+
export async function selectLocation() {
|
|
179
|
+
return selectOption('Select installation location:', [
|
|
180
|
+
{ label: 'Global (~/.claude, ~/.config/opencode, etc.)', value: 'global' },
|
|
181
|
+
{ label: 'Local (./.claude, ./.opencode, etc.)', value: 'local' },
|
|
182
|
+
]);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Prompt user to confirm an action
|
|
186
|
+
*
|
|
187
|
+
* @param message - Confirmation message to display
|
|
188
|
+
* @returns true if confirmed, false if declined
|
|
189
|
+
*/
|
|
190
|
+
export async function confirmAction(message) {
|
|
191
|
+
return selectOption(message, [
|
|
192
|
+
{ label: 'Yes', value: true },
|
|
193
|
+
{ label: 'No', value: false },
|
|
194
|
+
]);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/installer/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;AACtC,CAAC;AAUD;;GAEG;AACH,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;GAEG;AACH,SAAS,cAAc;IACrB,IAAI,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,OAA0B;IAE1B,IAAI,aAAa,EAAE,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,OAA0B;IAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,qCAAqC;QACrC,MAAM,MAAM,GAAG,CAAC,QAAiB,KAAK,EAAQ,EAAE;YAC9C,iDAAiD;YACjD,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBACzC,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC3B,MAAM,MAAM,GAAG,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5D,MAAM,KAAK,GAAG,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,yBAAyB;QACzB,MAAM,cAAc,GAAG,CACrB,IAAwB,EACxB,GAAsC,EAChC,EAAE;YACR,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,IAAI;oBACP,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,MAAM;oBACT,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACb,MAAM;gBACR,KAAK,QAAQ;oBACX,sBAAsB;oBACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;oBAC9C,cAAc,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM;YACV,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,uCAAuC;YACvC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC/B,aAAa,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YAE7C,iBAAiB;YACjB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,OAA0B;IAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,EAAE;YACvC,EAAE,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,MAAM,gBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,YAAY,CAAU,4BAA4B,EAAE;QACzD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;QACzC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;QACxC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE;QACxC,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;KACxC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,YAAY,CAAW,+BAA+B,EAAE;QAC7D,EAAE,KAAK,EAAE,8CAA8C,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC1E,EAAE,KAAK,EAAE,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE;KAClE,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,OAAO,YAAY,CAAU,OAAO,EAAE;QACpC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;QAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;KAC9B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installer types for npx installation workflow
|
|
3
|
+
*
|
|
4
|
+
* Defines types for the interactive installer that copies command files and hooks
|
|
5
|
+
* to runtime-specific directories (Claude Code, OpenCode, Gemini).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Supported AI coding assistant runtimes for installation
|
|
9
|
+
*
|
|
10
|
+
* - 'claude': Claude Code (~/.claude or .claude)
|
|
11
|
+
* - 'opencode': OpenCode (~/.config/opencode or .opencode)
|
|
12
|
+
* - 'gemini': Gemini (~/.gemini or .gemini)
|
|
13
|
+
* - 'all': Install to all supported runtimes
|
|
14
|
+
*/
|
|
15
|
+
export type Runtime = 'claude' | 'opencode' | 'gemini' | 'all';
|
|
16
|
+
/**
|
|
17
|
+
* Installation location target
|
|
18
|
+
*
|
|
19
|
+
* - 'global': User-level installation (~/.claude, ~/.config/opencode, etc.)
|
|
20
|
+
* - 'local': Project-level installation (.claude, .opencode, etc.)
|
|
21
|
+
*/
|
|
22
|
+
export type Location = 'global' | 'local';
|
|
23
|
+
/**
|
|
24
|
+
* Arguments parsed from installer command line
|
|
25
|
+
*
|
|
26
|
+
* Supports both interactive mode (prompts) and non-interactive mode (flags).
|
|
27
|
+
*/
|
|
28
|
+
export interface InstallerArgs {
|
|
29
|
+
/** Target runtime (claude, opencode, gemini, or all) */
|
|
30
|
+
runtime?: Runtime;
|
|
31
|
+
/** Install to global/user location */
|
|
32
|
+
global: boolean;
|
|
33
|
+
/** Install to local/project location */
|
|
34
|
+
local: boolean;
|
|
35
|
+
/** Uninstall instead of install */
|
|
36
|
+
uninstall: boolean;
|
|
37
|
+
/** Force overwrite existing files */
|
|
38
|
+
force: boolean;
|
|
39
|
+
/** Show help and exit */
|
|
40
|
+
help: boolean;
|
|
41
|
+
/** Suppress banner and info messages */
|
|
42
|
+
quiet: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of an installation operation for a single runtime/location
|
|
46
|
+
*/
|
|
47
|
+
export interface InstallerResult {
|
|
48
|
+
/** Whether the installation succeeded */
|
|
49
|
+
success: boolean;
|
|
50
|
+
/** Runtime that was installed */
|
|
51
|
+
runtime: Exclude<Runtime, 'all'>;
|
|
52
|
+
/** Location that was installed to */
|
|
53
|
+
location: Location;
|
|
54
|
+
/** Files that were successfully created */
|
|
55
|
+
filesCreated: string[];
|
|
56
|
+
/** Files that were skipped (already exist, no --force) */
|
|
57
|
+
filesSkipped: string[];
|
|
58
|
+
/** Error messages if any */
|
|
59
|
+
errors: string[];
|
|
60
|
+
/** Whether hook was registered in settings.json (Claude only) */
|
|
61
|
+
hookRegistered?: boolean;
|
|
62
|
+
/** Whether VERSION file was written */
|
|
63
|
+
versionWritten?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Path configuration for a specific runtime
|
|
67
|
+
*
|
|
68
|
+
* Contains resolved paths for global and local installation locations.
|
|
69
|
+
*/
|
|
70
|
+
export interface RuntimePaths {
|
|
71
|
+
/** Global installation path (e.g., ~/.claude) */
|
|
72
|
+
global: string;
|
|
73
|
+
/** Local installation path (e.g., .claude) */
|
|
74
|
+
local: string;
|
|
75
|
+
/** Path to settings.json for hook registration */
|
|
76
|
+
settingsFile: string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjC,qCAAqC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,iEAAiE;IACjE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall module for agents-reverse-engineer installer
|
|
3
|
+
*
|
|
4
|
+
* Handles removing installed command files, hooks, and hook registrations.
|
|
5
|
+
* Mirrors the installation logic in operations.ts for clean reversal.
|
|
6
|
+
*/
|
|
7
|
+
import type { Runtime, Location, InstallerResult } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Uninstall files for one or all runtimes
|
|
10
|
+
*
|
|
11
|
+
* If runtime is 'all', uninstalls from all supported runtimes.
|
|
12
|
+
* Otherwise, uninstalls from the specified runtime only.
|
|
13
|
+
*
|
|
14
|
+
* @param runtime - Target runtime or 'all'
|
|
15
|
+
* @param location - Installation location (global or local)
|
|
16
|
+
* @param dryRun - If true, don't actually delete files
|
|
17
|
+
* @returns Array of uninstallation results (one per runtime)
|
|
18
|
+
*/
|
|
19
|
+
export declare function uninstallFiles(runtime: Runtime, location: Location, dryRun?: boolean): InstallerResult[];
|
|
20
|
+
/**
|
|
21
|
+
* Unregister session-end hook from settings.json
|
|
22
|
+
*
|
|
23
|
+
* Removes the ARE hook entry from the SessionEnd hooks array.
|
|
24
|
+
* Cleans up empty hooks structures. Handles both old and new hook paths.
|
|
25
|
+
*
|
|
26
|
+
* @param basePath - Base installation path (e.g., ~/.claude or ~/.gemini)
|
|
27
|
+
* @param runtime - Target runtime (claude or gemini)
|
|
28
|
+
* @param dryRun - If true, don't write changes
|
|
29
|
+
* @returns true if hook was removed, false if not found
|
|
30
|
+
*/
|
|
31
|
+
export declare function unregisterHooks(basePath: string, runtime: Exclude<Runtime, 'all'>, dryRun: boolean): boolean;
|
|
32
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/installer/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA6CrE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,GAAE,OAAe,GACtB,eAAe,EAAE,CAKnB;AA8HD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAChC,MAAM,EAAE,OAAO,GACd,OAAO,CAKT"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall module for agents-reverse-engineer installer
|
|
3
|
+
*
|
|
4
|
+
* Handles removing installed command files, hooks, and hook registrations.
|
|
5
|
+
* Mirrors the installation logic in operations.ts for clean reversal.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, unlinkSync, readFileSync, writeFileSync, readdirSync, rmdirSync } from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { resolveInstallPath, getAllRuntimes } from './paths.js';
|
|
10
|
+
import { getClaudeTemplates, getOpenCodeTemplates, getGeminiTemplates, } from '../integration/templates.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get templates for a specific runtime
|
|
13
|
+
*
|
|
14
|
+
* @param runtime - Target runtime (claude, opencode, or gemini)
|
|
15
|
+
* @returns Array of template objects for the runtime
|
|
16
|
+
*/
|
|
17
|
+
function getTemplatesForRuntime(runtime) {
|
|
18
|
+
switch (runtime) {
|
|
19
|
+
case 'claude':
|
|
20
|
+
return getClaudeTemplates();
|
|
21
|
+
case 'opencode':
|
|
22
|
+
return getOpenCodeTemplates();
|
|
23
|
+
case 'gemini':
|
|
24
|
+
return getGeminiTemplates();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Uninstall files for one or all runtimes
|
|
29
|
+
*
|
|
30
|
+
* If runtime is 'all', uninstalls from all supported runtimes.
|
|
31
|
+
* Otherwise, uninstalls from the specified runtime only.
|
|
32
|
+
*
|
|
33
|
+
* @param runtime - Target runtime or 'all'
|
|
34
|
+
* @param location - Installation location (global or local)
|
|
35
|
+
* @param dryRun - If true, don't actually delete files
|
|
36
|
+
* @returns Array of uninstallation results (one per runtime)
|
|
37
|
+
*/
|
|
38
|
+
export function uninstallFiles(runtime, location, dryRun = false) {
|
|
39
|
+
if (runtime === 'all') {
|
|
40
|
+
return getAllRuntimes().map((r) => uninstallFilesForRuntime(r, location, dryRun));
|
|
41
|
+
}
|
|
42
|
+
return [uninstallFilesForRuntime(runtime, location, dryRun)];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Uninstall files for a specific runtime
|
|
46
|
+
*
|
|
47
|
+
* Removes command templates, hook files, and VERSION file from the installation directory.
|
|
48
|
+
* Also unregisters hooks from settings.json for Claude global installs.
|
|
49
|
+
*
|
|
50
|
+
* @param runtime - Target runtime (claude, opencode, or gemini)
|
|
51
|
+
* @param location - Installation location (global or local)
|
|
52
|
+
* @param dryRun - If true, don't actually delete files
|
|
53
|
+
* @returns Uninstallation result with files deleted
|
|
54
|
+
*/
|
|
55
|
+
function uninstallFilesForRuntime(runtime, location, dryRun) {
|
|
56
|
+
const basePath = resolveInstallPath(runtime, location);
|
|
57
|
+
const templates = getTemplatesForRuntime(runtime);
|
|
58
|
+
const filesCreated = []; // In uninstall context, this tracks files deleted
|
|
59
|
+
const filesSkipped = []; // Files that didn't exist
|
|
60
|
+
const errors = [];
|
|
61
|
+
// Remove command templates
|
|
62
|
+
for (const template of templates) {
|
|
63
|
+
// Template path is relative (e.g., .claude/commands/are/generate.md)
|
|
64
|
+
// Extract the part after the runtime directory (e.g., commands/are/generate.md)
|
|
65
|
+
const relativePath = template.path.split('/').slice(1).join('/');
|
|
66
|
+
const fullPath = path.join(basePath, relativePath);
|
|
67
|
+
if (existsSync(fullPath)) {
|
|
68
|
+
if (!dryRun) {
|
|
69
|
+
try {
|
|
70
|
+
unlinkSync(fullPath);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
errors.push(`Failed to delete ${fullPath}: ${err}`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
filesCreated.push(fullPath); // Track as "deleted"
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
filesSkipped.push(fullPath); // File didn't exist
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// For Claude and Gemini runtimes, also remove the session hook file
|
|
84
|
+
let hookUnregistered = false;
|
|
85
|
+
if (runtime === 'claude' || runtime === 'gemini') {
|
|
86
|
+
const hookPath = path.join(basePath, 'hooks', 'are-session-end.js');
|
|
87
|
+
if (existsSync(hookPath)) {
|
|
88
|
+
if (!dryRun) {
|
|
89
|
+
try {
|
|
90
|
+
unlinkSync(hookPath);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
errors.push(`Failed to delete hook ${hookPath}: ${err}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (!errors.some((e) => e.includes(hookPath))) {
|
|
97
|
+
filesCreated.push(hookPath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Unregister hook from settings.json
|
|
101
|
+
hookUnregistered = unregisterHooks(basePath, runtime, dryRun);
|
|
102
|
+
}
|
|
103
|
+
// Remove VERSION file if exists
|
|
104
|
+
const versionPath = path.join(basePath, 'VERSION');
|
|
105
|
+
if (existsSync(versionPath)) {
|
|
106
|
+
if (!dryRun) {
|
|
107
|
+
try {
|
|
108
|
+
unlinkSync(versionPath);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
errors.push(`Failed to delete VERSION: ${err}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!errors.some((e) => e.includes('VERSION'))) {
|
|
115
|
+
filesCreated.push(versionPath);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Try to clean up empty directories
|
|
119
|
+
if (!dryRun) {
|
|
120
|
+
// Clean up are/ commands directory
|
|
121
|
+
const areCommandsDir = path.join(basePath, 'commands', 'are');
|
|
122
|
+
cleanupEmptyDirs(areCommandsDir);
|
|
123
|
+
// Clean up commands/ directory if empty
|
|
124
|
+
const commandsDir = path.join(basePath, 'commands');
|
|
125
|
+
cleanupEmptyDirs(commandsDir);
|
|
126
|
+
// Clean up hooks/ directory if empty (Claude and Gemini)
|
|
127
|
+
if (runtime === 'claude' || runtime === 'gemini') {
|
|
128
|
+
const hooksDir = path.join(basePath, 'hooks');
|
|
129
|
+
cleanupEmptyDirs(hooksDir);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
success: errors.length === 0,
|
|
134
|
+
runtime,
|
|
135
|
+
location,
|
|
136
|
+
filesCreated, // Actually files deleted in uninstall context
|
|
137
|
+
filesSkipped, // Files that didn't exist
|
|
138
|
+
errors,
|
|
139
|
+
hookRegistered: hookUnregistered, // Repurpose: true if hook was unregistered
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Unregister session-end hook from settings.json
|
|
144
|
+
*
|
|
145
|
+
* Removes the ARE hook entry from the SessionEnd hooks array.
|
|
146
|
+
* Cleans up empty hooks structures. Handles both old and new hook paths.
|
|
147
|
+
*
|
|
148
|
+
* @param basePath - Base installation path (e.g., ~/.claude or ~/.gemini)
|
|
149
|
+
* @param runtime - Target runtime (claude or gemini)
|
|
150
|
+
* @param dryRun - If true, don't write changes
|
|
151
|
+
* @returns true if hook was removed, false if not found
|
|
152
|
+
*/
|
|
153
|
+
export function unregisterHooks(basePath, runtime, dryRun) {
|
|
154
|
+
if (runtime === 'gemini') {
|
|
155
|
+
return unregisterGeminiHook(basePath, dryRun);
|
|
156
|
+
}
|
|
157
|
+
return unregisterClaudeHook(basePath, dryRun);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Unregister hook from Claude Code settings.json
|
|
161
|
+
*/
|
|
162
|
+
function unregisterClaudeHook(basePath, dryRun) {
|
|
163
|
+
const settingsPath = path.join(basePath, 'settings.json');
|
|
164
|
+
// Settings file must exist
|
|
165
|
+
if (!existsSync(settingsPath)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
// Load settings
|
|
169
|
+
let settings;
|
|
170
|
+
try {
|
|
171
|
+
const content = readFileSync(settingsPath, 'utf-8');
|
|
172
|
+
settings = JSON.parse(content);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
// Check if hooks.SessionEnd exists
|
|
178
|
+
if (!settings.hooks?.SessionEnd) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
// Match both old and new hook command paths
|
|
182
|
+
const hookPatterns = [
|
|
183
|
+
'node hooks/are-session-end.js',
|
|
184
|
+
'node .claude/hooks/are-session-end.js',
|
|
185
|
+
];
|
|
186
|
+
const originalLength = settings.hooks.SessionEnd.length;
|
|
187
|
+
settings.hooks.SessionEnd = settings.hooks.SessionEnd.filter((event) => !event.hooks?.some((h) => hookPatterns.includes(h.command)));
|
|
188
|
+
// Check if we actually removed something
|
|
189
|
+
if (settings.hooks.SessionEnd.length === originalLength) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
// Clean up empty structures
|
|
193
|
+
if (settings.hooks.SessionEnd.length === 0) {
|
|
194
|
+
delete settings.hooks.SessionEnd;
|
|
195
|
+
}
|
|
196
|
+
if (settings.hooks && Object.keys(settings.hooks).length === 0) {
|
|
197
|
+
delete settings.hooks;
|
|
198
|
+
}
|
|
199
|
+
// Write updated settings
|
|
200
|
+
if (!dryRun) {
|
|
201
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Unregister hook from Gemini CLI settings.json
|
|
207
|
+
*/
|
|
208
|
+
function unregisterGeminiHook(basePath, dryRun) {
|
|
209
|
+
const settingsPath = path.join(basePath, 'settings.json');
|
|
210
|
+
// Settings file must exist
|
|
211
|
+
if (!existsSync(settingsPath)) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
// Load settings
|
|
215
|
+
let settings;
|
|
216
|
+
try {
|
|
217
|
+
const content = readFileSync(settingsPath, 'utf-8');
|
|
218
|
+
settings = JSON.parse(content);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
// Check if hooks.SessionEnd exists
|
|
224
|
+
if (!settings.hooks?.SessionEnd) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
// Match both old and new hook command paths
|
|
228
|
+
const hookPatterns = [
|
|
229
|
+
'node hooks/are-session-end.js',
|
|
230
|
+
'node .gemini/hooks/are-session-end.js',
|
|
231
|
+
];
|
|
232
|
+
const originalLength = settings.hooks.SessionEnd.length;
|
|
233
|
+
settings.hooks.SessionEnd = settings.hooks.SessionEnd.filter((h) => !hookPatterns.includes(h.command));
|
|
234
|
+
// Check if we actually removed something
|
|
235
|
+
if (settings.hooks.SessionEnd.length === originalLength) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
// Clean up empty structures
|
|
239
|
+
if (settings.hooks.SessionEnd.length === 0) {
|
|
240
|
+
delete settings.hooks.SessionEnd;
|
|
241
|
+
}
|
|
242
|
+
if (settings.hooks && Object.keys(settings.hooks).length === 0) {
|
|
243
|
+
delete settings.hooks;
|
|
244
|
+
}
|
|
245
|
+
// Write updated settings
|
|
246
|
+
if (!dryRun) {
|
|
247
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Clean up empty directories recursively
|
|
253
|
+
*
|
|
254
|
+
* Removes a directory if it's empty, then tries parent directories.
|
|
255
|
+
* Stops when hitting a non-empty directory or the runtime root.
|
|
256
|
+
*
|
|
257
|
+
* @param dirPath - Directory path to check and potentially remove
|
|
258
|
+
*/
|
|
259
|
+
function cleanupEmptyDirs(dirPath) {
|
|
260
|
+
try {
|
|
261
|
+
if (!existsSync(dirPath)) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const entries = readdirSync(dirPath);
|
|
265
|
+
if (entries.length === 0) {
|
|
266
|
+
rmdirSync(dirPath);
|
|
267
|
+
// Try parent directory (but don't go above runtime root)
|
|
268
|
+
const parent = path.dirname(dirPath);
|
|
269
|
+
// Stop at common runtime roots (.claude, .opencode, .gemini)
|
|
270
|
+
const baseName = path.basename(parent);
|
|
271
|
+
if (baseName !== '.claude' &&
|
|
272
|
+
baseName !== '.opencode' &&
|
|
273
|
+
baseName !== '.gemini' &&
|
|
274
|
+
baseName !== '.config') {
|
|
275
|
+
cleanupEmptyDirs(parent);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Ignore errors - directory might be in use or we don't have permissions
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/installer/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Generates command files and hooks for detected AI assistant environments.
|
|
5
5
|
* Handles file creation with directory creation and skip-if-exists behavior.
|
|
6
6
|
*/
|
|
7
|
-
import type { IntegrationResult } from './types.js';
|
|
7
|
+
import type { IntegrationResult, EnvironmentType } from './types.js';
|
|
8
8
|
/**
|
|
9
9
|
* Options for generating integration files
|
|
10
10
|
*/
|
|
@@ -13,6 +13,8 @@ export interface GenerateOptions {
|
|
|
13
13
|
dryRun?: boolean;
|
|
14
14
|
/** If true, overwrite existing files instead of skipping them */
|
|
15
15
|
force?: boolean;
|
|
16
|
+
/** Specific environment to generate for (bypasses auto-detection) */
|
|
17
|
+
environment?: EnvironmentType;
|
|
16
18
|
}
|
|
17
19
|
/**
|
|
18
20
|
* Generate integration files for all detected AI assistant environments
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/integration/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/integration/generate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASrE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmE9B"}
|