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.
Files changed (46) hide show
  1. package/README.md +91 -38
  2. package/dist/cli/index.js +60 -7
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init.d.ts +0 -5
  5. package/dist/cli/init.d.ts.map +1 -1
  6. package/dist/cli/init.js +10 -37
  7. package/dist/cli/init.js.map +1 -1
  8. package/dist/installer/banner.d.ts +52 -0
  9. package/dist/installer/banner.d.ts.map +1 -0
  10. package/dist/installer/banner.js +112 -0
  11. package/dist/installer/banner.js.map +1 -0
  12. package/dist/installer/index.d.ts +32 -0
  13. package/dist/installer/index.d.ts.map +1 -0
  14. package/dist/installer/index.js +288 -0
  15. package/dist/installer/index.js.map +1 -0
  16. package/dist/installer/operations.d.ts +73 -0
  17. package/dist/installer/operations.d.ts.map +1 -0
  18. package/dist/installer/operations.js +335 -0
  19. package/dist/installer/operations.js.map +1 -0
  20. package/dist/installer/paths.d.ts +50 -0
  21. package/dist/installer/paths.d.ts.map +1 -0
  22. package/dist/installer/paths.js +95 -0
  23. package/dist/installer/paths.js.map +1 -0
  24. package/dist/installer/prompts.d.ts +51 -0
  25. package/dist/installer/prompts.d.ts.map +1 -0
  26. package/dist/installer/prompts.js +196 -0
  27. package/dist/installer/prompts.js.map +1 -0
  28. package/dist/installer/types.d.ts +78 -0
  29. package/dist/installer/types.d.ts.map +1 -0
  30. package/dist/installer/types.js +8 -0
  31. package/dist/installer/types.js.map +1 -0
  32. package/dist/installer/uninstall.d.ts +32 -0
  33. package/dist/installer/uninstall.d.ts.map +1 -0
  34. package/dist/installer/uninstall.js +283 -0
  35. package/dist/installer/uninstall.js.map +1 -0
  36. package/dist/integration/generate.d.ts +3 -1
  37. package/dist/integration/generate.d.ts.map +1 -1
  38. package/dist/integration/generate.js +20 -4
  39. package/dist/integration/generate.js.map +1 -1
  40. package/dist/integration/templates.d.ts +12 -0
  41. package/dist/integration/templates.d.ts.map +1 -1
  42. package/dist/integration/templates.js +335 -16
  43. package/dist/integration/templates.js.map +1 -1
  44. package/dist/integration/types.d.ts +1 -1
  45. package/dist/integration/types.d.ts.map +1 -1
  46. 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":"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"}
@@ -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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -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,EAAmB,MAAM,YAAY,CAAC;AAQrE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsD9B"}
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"}