247-cli 1.0.4 → 1.1.0

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.
@@ -4,11 +4,12 @@
4
4
  *
5
5
  * Logic:
6
6
  * - Heartbeat received → status "working"
7
- * - No heartbeat for 3s → status "idle" (Claude stopped working, but NOT needs_attention)
7
+ * - Notification hook received → status "needs_attention" (permission request, etc.)
8
+ * - No heartbeat for 3s (and no notification) → status "idle" (Claude stopped)
8
9
  * - tmux session removed → cleanup (handled by cleanupStatusMaps)
9
10
  *
10
- * Note: "needs_attention" should only be set when Claude explicitly needs user input,
11
- * not just because heartbeats stopped. A timeout means Claude is idle, not blocked.
11
+ * The Notification hook handles "needs_attention" cases. This monitor only handles
12
+ * the transition to "idle" when Claude has truly stopped working.
12
13
  */
13
14
  /**
14
15
  * Start the heartbeat timeout monitor.
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-monitor.d.ts","sourceRoot":"","sources":["../src/heartbeat-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAiF5C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C"}
1
+ {"version":3,"file":"heartbeat-monitor.d.ts","sourceRoot":"","sources":["../src/heartbeat-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CA6E5C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAM3C"}
@@ -4,18 +4,19 @@
4
4
  *
5
5
  * Logic:
6
6
  * - Heartbeat received → status "working"
7
- * - No heartbeat for 3s → status "idle" (Claude stopped working, but NOT needs_attention)
7
+ * - Notification hook received → status "needs_attention" (permission request, etc.)
8
+ * - No heartbeat for 3s (and no notification) → status "idle" (Claude stopped)
8
9
  * - tmux session removed → cleanup (handled by cleanupStatusMaps)
9
10
  *
10
- * Note: "needs_attention" should only be set when Claude explicitly needs user input,
11
- * not just because heartbeats stopped. A timeout means Claude is idle, not blocked.
11
+ * The Notification hook handles "needs_attention" cases. This monitor only handles
12
+ * the transition to "idle" when Claude has truly stopped working.
12
13
  */
13
14
  import { lastHeartbeat } from './routes/heartbeat.js';
14
15
  import { tmuxSessionStatus, broadcastStatusUpdate } from './status.js';
15
16
  import * as sessionsDb from './db/sessions.js';
16
17
  import { getEnvironmentMetadata, getSessionEnvironment } from './db/environments.js';
17
18
  // Timeout threshold: if no heartbeat for 3 seconds, Claude has stopped working
18
- // Increased from 2s to reduce false-positive "needs_attention" during brief API pauses
19
+ // Note: "needs_attention" is now handled by the Notification hook, not timeout
19
20
  const HEARTBEAT_TIMEOUT_MS = 3000;
20
21
  // Check interval: how often we check for timeouts
21
22
  const CHECK_INTERVAL_MS = 1000;
@@ -34,12 +35,10 @@ export function startHeartbeatMonitor() {
34
35
  for (const [sessionName, lastBeat] of lastHeartbeat) {
35
36
  const timeSinceLastBeat = now - lastBeat;
36
37
  const status = tmuxSessionStatus.get(sessionName);
37
- // Only transition if currently "working", timeout exceeded, AND session has never been working
38
- // This prevents false idle states during long operations (file reads, agent calls)
39
- // Once a session has received a heartbeat (hasBeenWorking=true), it should never go back to idle
40
- if (timeSinceLastBeat > HEARTBEAT_TIMEOUT_MS &&
41
- status?.status === 'working' &&
42
- !status?.hasBeenWorking) {
38
+ // Transition to idle if currently "working" and timeout exceeded
39
+ // Note: The Notification hook handles "needs_attention" cases (permission requests, etc.)
40
+ // This timeout only fires when Claude has truly stopped (no heartbeats AND no notification)
41
+ if (timeSinceLastBeat > HEARTBEAT_TIMEOUT_MS && status?.status === 'working') {
43
42
  const newStatus = {
44
43
  ...status,
45
44
  status: 'idle',
@@ -1 +1 @@
1
- {"version":3,"file":"heartbeat-monitor.js","sourceRoot":"","sources":["../src/heartbeat-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"heartbeat-monitor.js","sourceRoot":"","sources":["../src/heartbeat-monitor.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export { createProjectRoutes } from './projects.js';
5
5
  export { createEnvironmentRoutes } from './environments.js';
6
6
  export { createSessionRoutes } from './sessions.js';
7
7
  export { createHeartbeatRoutes } from './heartbeat.js';
8
+ export { createNotificationRoutes } from './notification.js';
8
9
  export { createEditorRoutes, isProjectAllowed, updateEditorActivity, getOrStartEditor, } from './editor.js';
9
10
  export { createFilesRoutes } from './files.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -5,6 +5,7 @@ export { createProjectRoutes } from './projects.js';
5
5
  export { createEnvironmentRoutes } from './environments.js';
6
6
  export { createSessionRoutes } from './sessions.js';
7
7
  export { createHeartbeatRoutes } from './heartbeat.js';
8
+ export { createNotificationRoutes } from './notification.js';
8
9
  export { createEditorRoutes, isProjectAllowed, updateEditorActivity, getOrStartEditor, } from './editor.js';
9
10
  export { createFilesRoutes } from './files.js';
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Notification API route: receives hook notifications from Claude Code.
3
+ * Handles permission requests, input prompts, and other attention-requiring events.
4
+ */
5
+ import { type Router as RouterType } from 'express';
6
+ declare const router: RouterType;
7
+ export declare function createNotificationRoutes(): RouterType;
8
+ export default router;
9
+ //# sourceMappingURL=notification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/routes/notification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,KAAK,MAAM,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AAQ5D,QAAA,MAAM,MAAM,EAAE,UAAqB,CAAC;AAiJpC,wBAAgB,wBAAwB,IAAI,UAAU,CAErD;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Notification API route: receives hook notifications from Claude Code.
3
+ * Handles permission requests, input prompts, and other attention-requiring events.
4
+ */
5
+ import { Router } from 'express';
6
+ import path from 'path';
7
+ import { execSync } from 'child_process';
8
+ import { tmuxSessionStatus, broadcastStatusUpdate } from '../status.js';
9
+ import * as sessionsDb from '../db/sessions.js';
10
+ import { getEnvironmentMetadata, getSessionEnvironment } from '../db/environments.js';
11
+ const router = Router();
12
+ /**
13
+ * Check if a tmux session exists.
14
+ * Prevents ghost sessions from being created by stale notifications.
15
+ */
16
+ function tmuxSessionExists(sessionName) {
17
+ try {
18
+ execSync(`tmux has-session -t "${sessionName}" 2>/dev/null`);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Determine attention reason from notification payload
27
+ */
28
+ function getAttentionReason(payload) {
29
+ // If there's a tool_name, Claude is asking for permission to use that tool
30
+ if (payload.tool_name) {
31
+ return 'permission';
32
+ }
33
+ // Default to input if we can't determine the reason
34
+ return 'input';
35
+ }
36
+ /**
37
+ * Receive notification from Claude Code hook.
38
+ * Updates session status to 'needs_attention'.
39
+ */
40
+ router.post('/', (req, res) => {
41
+ const payload = req.body;
42
+ const { tmux_session } = payload;
43
+ if (!tmux_session) {
44
+ return res.status(400).json({ error: 'Missing tmux_session' });
45
+ }
46
+ // Validate that the tmux session actually exists
47
+ if (!tmuxSessionExists(tmux_session)) {
48
+ return res.status(404).json({ error: 'Session not found' });
49
+ }
50
+ const now = Date.now();
51
+ // Extract project from cwd or session name
52
+ const project = payload.cwd
53
+ ? path.basename(payload.cwd)
54
+ : tmux_session.split('--')[0] || undefined;
55
+ const existing = tmuxSessionStatus.get(tmux_session);
56
+ const attentionReason = getAttentionReason(payload);
57
+ const statusChanged = !existing || existing.status !== 'needs_attention';
58
+ const hookData = {
59
+ status: 'needs_attention',
60
+ attentionReason,
61
+ hasBeenWorking: existing?.hasBeenWorking ?? true,
62
+ lastEvent: payload.tool_name ? `Permission: ${payload.tool_name}` : 'Notification',
63
+ lastActivity: now,
64
+ lastStatusChange: statusChanged ? now : existing?.lastStatusChange || now,
65
+ project,
66
+ transcriptPath: payload.transcript_path,
67
+ // Preserve existing metrics
68
+ model: existing?.model,
69
+ costUsd: existing?.costUsd,
70
+ contextUsage: existing?.contextUsage,
71
+ linesAdded: existing?.linesAdded,
72
+ linesRemoved: existing?.linesRemoved,
73
+ };
74
+ tmuxSessionStatus.set(tmux_session, hookData);
75
+ // Persist to database
76
+ const dbSession = sessionsDb.upsertSession(tmux_session, {
77
+ project: project || tmux_session.split('--')[0] || '',
78
+ status: 'needs_attention',
79
+ attentionReason,
80
+ lastEvent: hookData.lastEvent,
81
+ lastActivity: now,
82
+ lastStatusChange: statusChanged ? now : (existing?.lastStatusChange ?? now),
83
+ // Preserve existing metrics
84
+ model: existing?.model,
85
+ costUsd: existing?.costUsd,
86
+ contextUsage: existing?.contextUsage,
87
+ linesAdded: existing?.linesAdded,
88
+ linesRemoved: existing?.linesRemoved,
89
+ });
90
+ // Broadcast status change to dashboard
91
+ if (statusChanged) {
92
+ const envId = getSessionEnvironment(tmux_session);
93
+ const envMeta = envId ? getEnvironmentMetadata(envId) : undefined;
94
+ broadcastStatusUpdate({
95
+ name: tmux_session,
96
+ project: project || '',
97
+ status: 'needs_attention',
98
+ attentionReason,
99
+ statusSource: 'hook',
100
+ lastEvent: hookData.lastEvent,
101
+ lastStatusChange: hookData.lastStatusChange,
102
+ createdAt: dbSession?.created_at || now,
103
+ lastActivity: now,
104
+ environmentId: envId,
105
+ environment: envMeta
106
+ ? {
107
+ id: envMeta.id,
108
+ name: envMeta.name,
109
+ provider: envMeta.provider,
110
+ icon: envMeta.icon,
111
+ isDefault: envMeta.isDefault,
112
+ }
113
+ : undefined,
114
+ model: hookData.model,
115
+ costUsd: hookData.costUsd,
116
+ contextUsage: hookData.contextUsage,
117
+ linesAdded: hookData.linesAdded,
118
+ linesRemoved: hookData.linesRemoved,
119
+ });
120
+ console.log(`[Notification] ${tmux_session}: → needs_attention (${attentionReason}${payload.tool_name ? `: ${payload.tool_name}` : ''})`);
121
+ }
122
+ res.json({ ok: true });
123
+ });
124
+ export function createNotificationRoutes() {
125
+ return router;
126
+ }
127
+ export default router;
128
+ //# sourceMappingURL=notification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/routes/notification.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmCH,wBAAsB,YAAY,gHAuIjC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoCH,wBAAsB,YAAY,gHAwIjC"}
@@ -13,7 +13,7 @@ import { ensureDefaultEnvironment } from './db/environments.js';
13
13
  import * as sessionsDb from './db/sessions.js';
14
14
  import { config } from './config.js';
15
15
  // Routes
16
- import { createProjectRoutes, createEnvironmentRoutes, createSessionRoutes, createHeartbeatRoutes, createEditorRoutes, createFilesRoutes, isProjectAllowed, updateEditorActivity, getOrStartEditor, } from './routes/index.js';
16
+ import { createProjectRoutes, createEnvironmentRoutes, createSessionRoutes, createHeartbeatRoutes, createNotificationRoutes, createEditorRoutes, createFilesRoutes, isProjectAllowed, updateEditorActivity, getOrStartEditor, } from './routes/index.js';
17
17
  // StatusLine setup and heartbeat monitor
18
18
  import { ensureStatusLineConfigured } from './setup-statusline.js';
19
19
  import { startHeartbeatMonitor, stopHeartbeatMonitor } from './heartbeat-monitor.js';
@@ -60,6 +60,7 @@ export async function createServer() {
60
60
  app.use('/api/environments', createEnvironmentRoutes());
61
61
  app.use('/api/sessions', createSessionRoutes());
62
62
  app.use('/api/heartbeat', createHeartbeatRoutes());
63
+ app.use('/api/notification', createNotificationRoutes());
63
64
  app.use('/api/editor', createEditorRoutes());
64
65
  app.use('/api/files', createFilesRoutes());
65
66
  // Editor proxy middleware
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  * Creates the statusline script and configures Claude settings at agent startup.
4
4
  */
5
5
  /**
6
- * Ensure statusLine is configured for 247 integration.
6
+ * Ensure statusLine and hooks are configured for 247 integration.
7
7
  * Called at agent startup.
8
8
  */
9
9
  export declare function ensureStatusLineConfigured(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"setup-statusline.d.ts","sourceRoot":"","sources":["../src/setup-statusline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAQjD"}
1
+ {"version":3,"file":"setup-statusline.d.ts","sourceRoot":"","sources":["../src/setup-statusline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CASjD"}
@@ -8,17 +8,19 @@ import { join } from 'path';
8
8
  const CLAUDE_SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');
9
9
  const STATUSLINE_DIR = join(homedir(), '.247');
10
10
  const STATUSLINE_SCRIPT_PATH = join(STATUSLINE_DIR, 'statusline.sh');
11
+ const NOTIFICATION_SCRIPT_PATH = join(STATUSLINE_DIR, 'notification.sh');
11
12
  // Pattern to detect old 247 hooks that need cleanup
12
13
  const OLD_HOOK_PATTERN = /notify-status\.sh|packages\/hooks/;
13
14
  /**
14
- * Ensure statusLine is configured for 247 integration.
15
+ * Ensure statusLine and hooks are configured for 247 integration.
15
16
  * Called at agent startup.
16
17
  */
17
18
  export function ensureStatusLineConfigured() {
18
19
  try {
19
20
  ensureStatusLineScript();
21
+ ensureNotificationScript();
20
22
  ensureClaudeSettings();
21
- console.log('[Setup] StatusLine configured successfully');
23
+ console.log('[Setup] StatusLine and hooks configured successfully');
22
24
  }
23
25
  catch (err) {
24
26
  console.error('[Setup] Failed to configure statusLine:', err);
@@ -53,6 +55,36 @@ exit 0
53
55
  chmodSync(STATUSLINE_SCRIPT_PATH, 0o755);
54
56
  console.log(`[Setup] Created statusLine script at ${STATUSLINE_SCRIPT_PATH}`);
55
57
  }
58
+ /**
59
+ * Create the notification.sh script that forwards Claude Code hook notifications to the agent.
60
+ * This script is called by the Notification hook when Claude needs user attention.
61
+ */
62
+ function ensureNotificationScript() {
63
+ if (!existsSync(STATUSLINE_DIR)) {
64
+ mkdirSync(STATUSLINE_DIR, { recursive: true });
65
+ }
66
+ const script = `#!/bin/bash
67
+ # 247 Notification Hook - forwards Claude Code notifications to agent
68
+ # Auto-generated by 247 agent - do not edit manually
69
+
70
+ INPUT=$(cat)
71
+ TMUX_SESSION="\${CLAUDE_TMUX_SESSION:-}"
72
+
73
+ # Only forward if we're in a tmux session managed by 247
74
+ [ -z "$TMUX_SESSION" ] && exit 0
75
+
76
+ # Forward JSON to agent (add tmux_session field)
77
+ echo "$INPUT" | jq --arg ts "$TMUX_SESSION" '. + {tmux_session: $ts}' | \\
78
+ curl -s -X POST "http://localhost:4678/api/notification" \\
79
+ -H "Content-Type: application/json" \\
80
+ -d @- > /dev/null 2>&1 &
81
+
82
+ exit 0
83
+ `;
84
+ writeFileSync(NOTIFICATION_SCRIPT_PATH, script);
85
+ chmodSync(NOTIFICATION_SCRIPT_PATH, 0o755);
86
+ console.log(`[Setup] Created notification script at ${NOTIFICATION_SCRIPT_PATH}`);
87
+ }
56
88
  /**
57
89
  * Remove old 247 hooks from settings.json.
58
90
  * These hooks used the deprecated notify-status.sh script.
@@ -69,7 +101,7 @@ function cleanupOldHooks(settings) {
69
101
  return true;
70
102
  }
71
103
  /**
72
- * Configure Claude settings.json to use our statusLine script.
104
+ * Configure Claude settings.json to use our statusLine script and Notification hook.
73
105
  * Also cleans up deprecated hooks if found.
74
106
  */
75
107
  function ensureClaudeSettings() {
@@ -90,29 +122,55 @@ function ensureClaudeSettings() {
90
122
  }
91
123
  // Clean up old hooks if present
92
124
  const hooksRemoved = cleanupOldHooks(settings);
93
- const expectedCommand = `bash ${STATUSLINE_SCRIPT_PATH}`;
94
- // Check if already configured correctly
125
+ const expectedStatusLineCommand = `bash ${STATUSLINE_SCRIPT_PATH}`;
126
+ const expectedNotificationCommand = `bash ${NOTIFICATION_SCRIPT_PATH}`;
127
+ // Check if statusLine is already configured correctly
95
128
  const currentStatusLine = settings.statusLine;
96
- const statusLineConfigured = currentStatusLine?.command === expectedCommand;
97
- if (statusLineConfigured && !hooksRemoved) {
98
- console.log('[Setup] StatusLine already configured');
129
+ const statusLineConfigured = currentStatusLine?.command === expectedStatusLineCommand;
130
+ // Check if Notification hook is already configured correctly
131
+ const currentHooks = settings.hooks;
132
+ const notificationHooks = currentHooks?.Notification;
133
+ const notificationConfigured = notificationHooks?.some((h) => h.hooks?.some((hook) => hook.command === expectedNotificationCommand));
134
+ if (statusLineConfigured && notificationConfigured && !hooksRemoved) {
135
+ console.log('[Setup] StatusLine and hooks already configured');
99
136
  return;
100
137
  }
101
138
  // Don't overwrite if user has a custom statusLine that's not ours
102
139
  if (currentStatusLine?.command && !currentStatusLine.command.includes('.247/statusline.sh')) {
103
- // Still save if we removed hooks
104
- if (hooksRemoved) {
105
- writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2));
106
- }
107
- console.log('[Setup] User has custom statusLine, skipping configuration');
108
- return;
140
+ console.log('[Setup] User has custom statusLine, skipping statusLine configuration');
141
+ }
142
+ else {
143
+ // Configure statusLine
144
+ settings.statusLine = {
145
+ type: 'command',
146
+ command: expectedStatusLineCommand,
147
+ };
148
+ }
149
+ // Configure Notification hook (merge with existing hooks)
150
+ const hooks = (settings.hooks || {});
151
+ // Only add our Notification hook if not already configured
152
+ if (!notificationConfigured) {
153
+ // Get existing Notification hooks (user-defined ones we should preserve)
154
+ const existingNotificationHooks = (hooks.Notification || []);
155
+ // Filter out any old 247 notification hooks that might exist
156
+ const userNotificationHooks = existingNotificationHooks.filter((h) => !h.hooks?.some((hook) => hook.command?.includes('.247/notification.sh')));
157
+ // Add our Notification hook
158
+ hooks.Notification = [
159
+ ...userNotificationHooks,
160
+ {
161
+ matcher: '*',
162
+ hooks: [
163
+ {
164
+ type: 'command',
165
+ command: expectedNotificationCommand,
166
+ },
167
+ ],
168
+ },
169
+ ];
170
+ settings.hooks = hooks;
171
+ console.log('[Setup] Configured Notification hook');
109
172
  }
110
- // Configure statusLine
111
- settings.statusLine = {
112
- type: 'command',
113
- command: expectedCommand,
114
- };
115
173
  writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2));
116
- console.log(`[Setup] Configured Claude statusLine in ${CLAUDE_SETTINGS_PATH}`);
174
+ console.log(`[Setup] Configured Claude settings in ${CLAUDE_SETTINGS_PATH}`);
117
175
  }
118
176
  //# sourceMappingURL=setup-statusline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-statusline.js","sourceRoot":"","sources":["../src/setup-statusline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup-statusline.js","sourceRoot":"","sources":["../src/setup-statusline.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "247-shared",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "exports": {
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ const program = new Command();
15
15
  program
16
16
  .name('247')
17
17
  .description('247 - Access Claude Code from anywhere 24/7\nby The Vibe Company')
18
- .version('1.0.4')
18
+ .version('1.1.0')
19
19
  .option('-P, --profile <name>', 'Use a specific profile (dev, prod, etc.)');
20
20
  // Add commands
21
21
  program.addCommand(initCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "247-cli",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "247 - Access Claude Code from anywhere 24/7",
5
5
  "keywords": [
6
6
  "claude",