247-cli 2.23.2 → 2.23.4

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 (94) hide show
  1. package/agent/dist/db/index.d.ts +0 -1
  2. package/agent/dist/db/index.d.ts.map +1 -1
  3. package/agent/dist/db/index.js +85 -382
  4. package/agent/dist/db/index.js.map +1 -1
  5. package/agent/dist/db/schema.d.ts +3 -49
  6. package/agent/dist/db/schema.d.ts.map +1 -1
  7. package/agent/dist/db/schema.js +34 -44
  8. package/agent/dist/db/schema.js.map +1 -1
  9. package/agent/dist/db/sessions.d.ts +2 -52
  10. package/agent/dist/db/sessions.d.ts.map +1 -1
  11. package/agent/dist/db/sessions.js +8 -194
  12. package/agent/dist/db/sessions.js.map +1 -1
  13. package/agent/dist/routes/index.d.ts +0 -1
  14. package/agent/dist/routes/index.d.ts.map +1 -1
  15. package/agent/dist/routes/index.js +0 -1
  16. package/agent/dist/routes/index.js.map +1 -1
  17. package/agent/dist/routes/sessions.d.ts +1 -0
  18. package/agent/dist/routes/sessions.d.ts.map +1 -1
  19. package/agent/dist/routes/sessions.js +16 -375
  20. package/agent/dist/routes/sessions.js.map +1 -1
  21. package/agent/dist/server.d.ts.map +1 -1
  22. package/agent/dist/server.js +22 -17
  23. package/agent/dist/server.js.map +1 -1
  24. package/agent/dist/services/index.d.ts +1 -6
  25. package/agent/dist/services/index.d.ts.map +1 -1
  26. package/agent/dist/services/index.js +4 -4
  27. package/agent/dist/services/index.js.map +1 -1
  28. package/agent/dist/terminal.d.ts +0 -11
  29. package/agent/dist/terminal.d.ts.map +1 -1
  30. package/agent/dist/terminal.js +6 -60
  31. package/agent/dist/terminal.js.map +1 -1
  32. package/agent/dist/updater.d.ts +1 -2
  33. package/agent/dist/updater.d.ts.map +1 -1
  34. package/agent/dist/updater.js +3 -25
  35. package/agent/dist/updater.js.map +1 -1
  36. package/agent/dist/websocket-handlers.d.ts +17 -3
  37. package/agent/dist/websocket-handlers.d.ts.map +1 -1
  38. package/agent/dist/websocket-handlers.js +81 -127
  39. package/agent/dist/websocket-handlers.js.map +1 -1
  40. package/agent/node_modules/247-shared/dist/types/index.d.ts +1 -111
  41. package/agent/node_modules/247-shared/dist/types/index.d.ts.map +1 -1
  42. package/agent/node_modules/247-shared/dist/types/index.js +1 -47
  43. package/agent/node_modules/247-shared/dist/types/index.js.map +1 -1
  44. package/agent/node_modules/247-shared/package.json +1 -1
  45. package/dist/commands/doctor.d.ts.map +1 -1
  46. package/dist/commands/doctor.js +5 -23
  47. package/dist/commands/doctor.js.map +1 -1
  48. package/dist/commands/status.d.ts.map +1 -1
  49. package/dist/commands/status.js +0 -11
  50. package/dist/commands/status.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -3
  53. package/dist/index.js.map +1 -1
  54. package/dist/lib/paths.d.ts +1 -3
  55. package/dist/lib/paths.d.ts.map +1 -1
  56. package/dist/lib/paths.js +1 -2
  57. package/dist/lib/paths.js.map +1 -1
  58. package/package.json +1 -1
  59. package/agent/dist/db/history.d.ts +0 -37
  60. package/agent/dist/db/history.d.ts.map +0 -1
  61. package/agent/dist/db/history.js +0 -98
  62. package/agent/dist/db/history.js.map +0 -1
  63. package/agent/dist/routes/attention.d.ts +0 -10
  64. package/agent/dist/routes/attention.d.ts.map +0 -1
  65. package/agent/dist/routes/attention.js +0 -123
  66. package/agent/dist/routes/attention.js.map +0 -1
  67. package/agent/dist/services/cleanup.d.ts +0 -45
  68. package/agent/dist/services/cleanup.d.ts.map +0 -1
  69. package/agent/dist/services/cleanup.js +0 -130
  70. package/agent/dist/services/cleanup.js.map +0 -1
  71. package/agent/dist/services/execution.d.ts +0 -53
  72. package/agent/dist/services/execution.d.ts.map +0 -1
  73. package/agent/dist/services/execution.js +0 -75
  74. package/agent/dist/services/execution.js.map +0 -1
  75. package/agent/dist/services/worktree.d.ts +0 -41
  76. package/agent/dist/services/worktree.d.ts.map +0 -1
  77. package/agent/dist/services/worktree.js +0 -139
  78. package/agent/dist/services/worktree.js.map +0 -1
  79. package/agent/dist/setup-hooks.d.ts +0 -10
  80. package/agent/dist/setup-hooks.d.ts.map +0 -1
  81. package/agent/dist/setup-hooks.js +0 -157
  82. package/agent/dist/setup-hooks.js.map +0 -1
  83. package/agent/dist/status.d.ts +0 -51
  84. package/agent/dist/status.d.ts.map +0 -1
  85. package/agent/dist/status.js +0 -142
  86. package/agent/dist/status.js.map +0 -1
  87. package/dist/commands/hooks.d.ts +0 -3
  88. package/dist/commands/hooks.d.ts.map +0 -1
  89. package/dist/commands/hooks.js +0 -85
  90. package/dist/commands/hooks.js.map +0 -1
  91. package/dist/hooks/installer.d.ts +0 -21
  92. package/dist/hooks/installer.d.ts.map +0 -1
  93. package/dist/hooks/installer.js +0 -114
  94. package/dist/hooks/installer.js.map +0 -1
@@ -1,51 +0,0 @@
1
- /**
2
- * Session status management and WebSocket broadcast utilities.
3
- * Handles real-time status updates between Claude Code hooks and the dashboard.
4
- */
5
- import { WebSocket } from 'ws';
6
- import type { SessionStatus, AttentionReason, WSSessionInfo } from '247-shared';
7
- export interface HookStatus {
8
- status: SessionStatus;
9
- hasBeenWorking?: boolean;
10
- attentionReason?: AttentionReason;
11
- lastEvent: string;
12
- lastActivity: number;
13
- lastStatusChange: number;
14
- project?: string;
15
- transcriptPath?: string;
16
- model?: string;
17
- costUsd?: number;
18
- contextUsage?: number;
19
- linesAdded?: number;
20
- linesRemoved?: number;
21
- }
22
- export declare const tmuxSessionStatus: Map<string, HookStatus>;
23
- export declare const activeConnections: Map<string, Set<WebSocket>>;
24
- export declare const statusSubscribers: Set<WebSocket>;
25
- /**
26
- * Broadcast status update to all subscribers
27
- */
28
- export declare function broadcastStatusUpdate(session: WSSessionInfo): void;
29
- /**
30
- * Broadcast session removed to all subscribers
31
- */
32
- export declare function broadcastSessionRemoved(sessionName: string): void;
33
- /**
34
- * Broadcast session archived to all subscribers
35
- */
36
- export declare function broadcastSessionArchived(sessionName: string, session: WSSessionInfo): void;
37
- /**
38
- * Generate human-readable session names with project prefix
39
- * @param project - Project name
40
- * @param prefix - Optional prefix to add after project (e.g., 'spawn' -> project--spawn-adj-noun-num)
41
- */
42
- export declare function generateSessionName(project: string, prefix?: string): string;
43
- /**
44
- * Clean up stale status entries (called periodically)
45
- */
46
- export declare function cleanupStatusMaps(): void;
47
- /**
48
- * Get active tmux sessions from the system
49
- */
50
- export declare function getActiveTmuxSessions(): Set<string>;
51
- //# sourceMappingURL=status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,aAAa,EAEd,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,eAAO,MAAM,iBAAiB,yBAAgC,CAAC;AAG/D,eAAO,MAAM,iBAAiB,6BAAoC,CAAC;AAGnE,eAAO,MAAM,iBAAiB,gBAAuB,CAAC;AAEtD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAelE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAYjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAY1F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CA0CxC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,GAAG,CAAC,MAAM,CAAC,CASnD"}
@@ -1,142 +0,0 @@
1
- /**
2
- * Session status management and WebSocket broadcast utilities.
3
- * Handles real-time status updates between Claude Code hooks and the dashboard.
4
- */
5
- import { WebSocket } from 'ws';
6
- import { execSync } from 'child_process';
7
- import { RETENTION_CONFIG } from './db/index.js';
8
- import * as sessionsDb from './db/sessions.js';
9
- import * as historyDb from './db/history.js';
10
- // Store by tmux session name - single source of truth for status
11
- export const tmuxSessionStatus = new Map();
12
- // Track active WebSocket connections per session
13
- export const activeConnections = new Map();
14
- // Track WebSocket subscribers for status updates (real-time push)
15
- export const statusSubscribers = new Set();
16
- /**
17
- * Broadcast status update to all subscribers
18
- */
19
- export function broadcastStatusUpdate(session) {
20
- // Send WebSocket update to connected clients
21
- if (statusSubscribers.size > 0) {
22
- const message = { type: 'status-update', session };
23
- const messageStr = JSON.stringify(message);
24
- for (const ws of statusSubscribers) {
25
- if (ws.readyState === WebSocket.OPEN) {
26
- ws.send(messageStr);
27
- }
28
- }
29
- console.log(`[Status WS] Broadcast status update for ${session.name}: ${session.status} to ${statusSubscribers.size} subscribers`);
30
- }
31
- }
32
- /**
33
- * Broadcast session removed to all subscribers
34
- */
35
- export function broadcastSessionRemoved(sessionName) {
36
- if (statusSubscribers.size === 0)
37
- return;
38
- const message = { type: 'session-removed', sessionName };
39
- const messageStr = JSON.stringify(message);
40
- for (const ws of statusSubscribers) {
41
- if (ws.readyState === WebSocket.OPEN) {
42
- ws.send(messageStr);
43
- }
44
- }
45
- console.log(`[Status WS] Broadcast session removed: ${sessionName}`);
46
- }
47
- /**
48
- * Broadcast session archived to all subscribers
49
- */
50
- export function broadcastSessionArchived(sessionName, session) {
51
- if (statusSubscribers.size === 0)
52
- return;
53
- const message = { type: 'session-archived', sessionName, session };
54
- const messageStr = JSON.stringify(message);
55
- for (const ws of statusSubscribers) {
56
- if (ws.readyState === WebSocket.OPEN) {
57
- ws.send(messageStr);
58
- }
59
- }
60
- console.log(`[Status WS] Broadcast session archived: ${sessionName}`);
61
- }
62
- /**
63
- * Generate human-readable session names with project prefix
64
- * @param project - Project name
65
- * @param prefix - Optional prefix to add after project (e.g., 'spawn' -> project--spawn-adj-noun-num)
66
- */
67
- export function generateSessionName(project, prefix) {
68
- // Sanitize project name for tmux session names (no slashes, colons, or dots)
69
- const sanitizedProject = project.replace(/[/:.]/g, '-');
70
- const adjectives = [
71
- 'brave',
72
- 'swift',
73
- 'calm',
74
- 'bold',
75
- 'wise',
76
- 'keen',
77
- 'fair',
78
- 'wild',
79
- 'bright',
80
- 'cool',
81
- ];
82
- const nouns = ['lion', 'hawk', 'wolf', 'bear', 'fox', 'owl', 'deer', 'lynx', 'eagle', 'tiger'];
83
- const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
84
- const noun = nouns[Math.floor(Math.random() * nouns.length)];
85
- const num = Math.floor(Math.random() * 100);
86
- if (prefix) {
87
- return `${sanitizedProject}--${prefix}-${adj}-${noun}-${num}`;
88
- }
89
- return `${sanitizedProject}--${adj}-${noun}-${num}`;
90
- }
91
- /**
92
- * Clean up stale status entries (called periodically)
93
- */
94
- export function cleanupStatusMaps() {
95
- const now = Date.now();
96
- const STALE_THRESHOLD = RETENTION_CONFIG.sessionMaxAge;
97
- let cleanedTmux = 0;
98
- // Get active tmux sessions
99
- let activeSessions = new Set();
100
- try {
101
- const output = execSync('tmux list-sessions -F "#{session_name}" 2>/dev/null', {
102
- encoding: 'utf-8',
103
- });
104
- activeSessions = new Set(output.trim().split('\n').filter(Boolean));
105
- }
106
- catch {
107
- // No tmux sessions exist
108
- }
109
- // Clean tmuxSessionStatus - remove if session doesn't exist OR is stale
110
- for (const [sessionName, status] of tmuxSessionStatus) {
111
- const sessionExists = activeSessions.has(sessionName);
112
- const isStale = now - status.lastActivity > STALE_THRESHOLD;
113
- if (!sessionExists || isStale) {
114
- tmuxSessionStatus.delete(sessionName);
115
- cleanedTmux++;
116
- }
117
- }
118
- if (cleanedTmux > 0) {
119
- console.log(`[Status Cleanup] Removed ${cleanedTmux} stale status entries from memory`);
120
- }
121
- // Also cleanup SQLite database
122
- const dbSessionsCleaned = sessionsDb.cleanupStaleSessions(STALE_THRESHOLD, RETENTION_CONFIG.archivedMaxAge);
123
- const dbHistoryCleaned = historyDb.cleanupOldHistory(RETENTION_CONFIG.historyMaxAge);
124
- if (dbSessionsCleaned > 0 || dbHistoryCleaned > 0) {
125
- console.log(`[DB Cleanup] Sessions: ${dbSessionsCleaned}, History: ${dbHistoryCleaned}`);
126
- }
127
- }
128
- /**
129
- * Get active tmux sessions from the system
130
- */
131
- export function getActiveTmuxSessions() {
132
- try {
133
- const output = execSync('tmux list-sessions -F "#{session_name}" 2>/dev/null', {
134
- encoding: 'utf-8',
135
- });
136
- return new Set(output.trim().split('\n').filter(Boolean));
137
- }
138
- catch {
139
- return new Set();
140
- }
141
- }
142
- //# sourceMappingURL=status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const hooksCommand: Command;
3
- //# sourceMappingURL=hooks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SAExB,CAAC"}
@@ -1,85 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import ora from 'ora';
4
- import { uninstallHooks, getHooksStatus } from '../hooks/installer.js';
5
- export const hooksCommand = new Command('hooks').description('Manage Claude Code hooks (deprecated - now uses statusLine)');
6
- hooksCommand
7
- .command('install')
8
- .description('Install Claude Code hooks (deprecated)')
9
- .action(async () => {
10
- console.log(chalk.yellow('\n⚠️ The hooks system has been deprecated.\n'));
11
- console.log("247 now uses Claude Code's statusLine API for status tracking.");
12
- console.log('The agent automatically configures this when it starts.\n');
13
- console.log(chalk.dim('No manual installation is required anymore.'));
14
- console.log(chalk.dim('Just run "247 start" and the agent will handle everything.\n'));
15
- const status = getHooksStatus();
16
- if (status.installed) {
17
- console.log(chalk.yellow('Old hooks detected at: ' + status.path));
18
- console.log('Run "247 hooks uninstall" to clean up the old hooks.\n');
19
- }
20
- });
21
- hooksCommand
22
- .command('uninstall')
23
- .description('Uninstall old Claude Code hooks')
24
- .action(async () => {
25
- const spinner = ora('Checking for old hooks...').start();
26
- try {
27
- const status = getHooksStatus();
28
- if (!status.installed) {
29
- spinner.succeed('No old hooks installed - nothing to clean up');
30
- return;
31
- }
32
- spinner.text = 'Removing old hooks...';
33
- const result = uninstallHooks();
34
- if (result.success) {
35
- spinner.succeed('Old hooks removed successfully');
36
- if (status.settingsHooksFound) {
37
- console.log(chalk.dim('\nCleaned: ~/.claude/settings.json (removed deprecated hooks)'));
38
- }
39
- if (status.path) {
40
- console.log(chalk.dim(`Cleaned: ${status.path}`));
41
- }
42
- console.log(chalk.dim('\nThe new statusLine system is automatically configured by the agent.\n'));
43
- }
44
- else {
45
- spinner.fail(`Failed to remove hooks: ${result.error}`);
46
- process.exit(1);
47
- }
48
- }
49
- catch (err) {
50
- spinner.fail(`Error: ${err.message}`);
51
- process.exit(1);
52
- }
53
- });
54
- hooksCommand
55
- .command('status')
56
- .description('Show hooks status')
57
- .action(async () => {
58
- console.log(chalk.bold('\n247 Status Tracking\n'));
59
- console.log(chalk.green('✓ Using new statusLine API'));
60
- console.log(chalk.dim(' Status tracking is automatically configured when the agent starts.'));
61
- console.log(chalk.dim(' Claude Code sends heartbeats every ~300ms while working.\n'));
62
- const status = getHooksStatus();
63
- if (status.installed) {
64
- console.log(chalk.yellow('⚠️ Old hooks still installed'));
65
- if (status.settingsHooksFound) {
66
- console.log(chalk.dim(' Found in: ~/.claude/settings.json'));
67
- }
68
- if (status.path) {
69
- console.log(chalk.dim(` Found in: ${status.path}`));
70
- }
71
- console.log(chalk.dim(' Run "247 hooks uninstall" to clean up.\n'));
72
- }
73
- else {
74
- console.log(chalk.green('✓ No old hooks installed\n'));
75
- }
76
- });
77
- hooksCommand
78
- .command('update')
79
- .description('Update hooks (deprecated)')
80
- .action(async () => {
81
- console.log(chalk.yellow('\n⚠️ The hooks system has been deprecated.\n'));
82
- console.log("247 now uses Claude Code's statusLine API for status tracking.");
83
- console.log('No manual updates are required - the agent configures everything automatically.\n');
84
- });
85
- //# sourceMappingURL=hooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- export interface HooksStatus {
2
- installed: boolean;
3
- path: string;
4
- isSymlink: boolean;
5
- settingsHooksFound: boolean;
6
- }
7
- /**
8
- * Get old hooks installation status.
9
- * Used for detecting legacy hooks that need cleanup.
10
- */
11
- export declare function getHooksStatus(): HooksStatus;
12
- /**
13
- * Uninstall old hooks from ~/.claude-plugins/247-hooks/ and ~/.claude/settings.json.
14
- * Used for cleaning up the deprecated plugin-based hooks system.
15
- */
16
- export declare function uninstallHooks(): {
17
- success: boolean;
18
- error?: string;
19
- cleanedSettings?: boolean;
20
- };
21
- //# sourceMappingURL=installer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/hooks/installer.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAiDD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAuB5C;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAkChG"}
@@ -1,114 +0,0 @@
1
- import { existsSync, lstatSync, unlinkSync, rmSync, readFileSync, writeFileSync } from 'fs';
2
- import { join } from 'path';
3
- import { homedir } from 'os';
4
- import { getAgentPaths } from '../lib/paths.js';
5
- const CLAUDE_SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');
6
- const OLD_HOOK_PATTERN = /notify-status\.sh|packages\/hooks/;
7
- /**
8
- * Check if settings.json contains old 247 hooks.
9
- */
10
- function hasOldHooksInSettings() {
11
- try {
12
- if (!existsSync(CLAUDE_SETTINGS_PATH))
13
- return false;
14
- const content = readFileSync(CLAUDE_SETTINGS_PATH, 'utf-8');
15
- const settings = JSON.parse(content);
16
- if (!settings.hooks)
17
- return false;
18
- // Check if any hook command contains our old pattern
19
- const hooksJson = JSON.stringify(settings.hooks);
20
- return OLD_HOOK_PATTERN.test(hooksJson);
21
- }
22
- catch {
23
- return false;
24
- }
25
- }
26
- /**
27
- * Remove old 247 hooks from settings.json.
28
- */
29
- function removeHooksFromSettings() {
30
- try {
31
- if (!existsSync(CLAUDE_SETTINGS_PATH))
32
- return { success: true };
33
- const content = readFileSync(CLAUDE_SETTINGS_PATH, 'utf-8');
34
- const settings = JSON.parse(content);
35
- if (!settings.hooks)
36
- return { success: true };
37
- // Check if hooks contain our old pattern
38
- const hooksJson = JSON.stringify(settings.hooks);
39
- if (!OLD_HOOK_PATTERN.test(hooksJson))
40
- return { success: true };
41
- // Remove the hooks section entirely
42
- delete settings.hooks;
43
- writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2));
44
- return { success: true };
45
- }
46
- catch (err) {
47
- return { success: false, error: err.message };
48
- }
49
- }
50
- /**
51
- * Get old hooks installation status.
52
- * Used for detecting legacy hooks that need cleanup.
53
- */
54
- export function getHooksStatus() {
55
- const paths = getAgentPaths();
56
- const dest = paths.hooksDestination;
57
- const pluginJsonPath = join(dest, '.claude-plugin', 'plugin.json');
58
- const pluginInstalled = existsSync(pluginJsonPath);
59
- const settingsHooksFound = hasOldHooksInSettings();
60
- let isSymlink = false;
61
- if (pluginInstalled) {
62
- try {
63
- isSymlink = lstatSync(dest).isSymbolicLink();
64
- }
65
- catch {
66
- // Not a symlink
67
- }
68
- }
69
- return {
70
- installed: pluginInstalled || settingsHooksFound,
71
- path: dest,
72
- isSymlink,
73
- settingsHooksFound,
74
- };
75
- }
76
- /**
77
- * Uninstall old hooks from ~/.claude-plugins/247-hooks/ and ~/.claude/settings.json.
78
- * Used for cleaning up the deprecated plugin-based hooks system.
79
- */
80
- export function uninstallHooks() {
81
- const paths = getAgentPaths();
82
- const dest = paths.hooksDestination;
83
- const errors = [];
84
- let cleanedSettings = false;
85
- // 1. Remove plugin directory if exists
86
- if (existsSync(dest)) {
87
- try {
88
- const isSymlink = lstatSync(dest).isSymbolicLink();
89
- if (isSymlink) {
90
- unlinkSync(dest);
91
- }
92
- else {
93
- rmSync(dest, { recursive: true, force: true });
94
- }
95
- }
96
- catch (err) {
97
- errors.push(`Plugin dir: ${err.message}`);
98
- }
99
- }
100
- // 2. Remove hooks from settings.json
101
- const settingsResult = removeHooksFromSettings();
102
- if (!settingsResult.success) {
103
- errors.push(`Settings: ${settingsResult.error}`);
104
- }
105
- else if (hasOldHooksInSettings() === false && existsSync(CLAUDE_SETTINGS_PATH)) {
106
- // Check if we actually removed something
107
- cleanedSettings = true;
108
- }
109
- if (errors.length > 0) {
110
- return { success: false, error: errors.join('; ') };
111
- }
112
- return { success: true, cleanedSettings };
113
- }
114
- //# sourceMappingURL=installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/hooks/installer.ts"],"names":[],"mappings":"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"}