claude-lock 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -5,22 +5,14 @@ Lock yourself out of the `claude` CLI. Think Cold Turkey / Screen Time, but for
5
5
  > Claude Code is addictive. You start a quick session, then suddenly it's midnight and you cancelled dinner with friends because you just had to ship one more feature. cc-lock gives you a hard stop — set a limit before you open it, and let it hold the line when you won't.
6
6
 
7
7
  ```
8
- ___________
9
- / _________ \
10
- | | | |
11
- | | | |
12
- ____|_|_________|_|___
13
- | |
14
- | ██████╗ ██████╗ |
15
- | ██╔═══╝ ██╔═══╝ |
16
- | ██║ ██║ |
17
- | ██║ ██║ |
18
- | ██████╗ ██████╗ |
19
- | ╚═════╝ ╚═════╝ |
20
- | L O C K |
21
- |______________________|
22
- | O O O O |
23
- |______________|
8
+ ╭──────╮
9
+ │ │
10
+ ╔═══╧══════╧═══╗
11
+ ║ ║
12
+ ║ cc · lock ║
13
+ ║ ║
14
+ ║ ○ ○ ○ ○ ║
15
+ ╚══════════════╝
24
16
  ```
25
17
 
26
18
  ## How it works
@@ -49,7 +41,7 @@ Each unlock attempt during a lock period gets progressively harder:
49
41
  | 4 | 120s cooldown, then write a 50-word justification |
50
42
  | 5+ | 300s cooldown + 5 math problems + 80-char string backwards |
51
43
 
52
- Successful bypass grants a **15-minute grace window**, then the lock re-engages.
44
+ Successful bypass grants a **10-minute grace window** (configurable), then the lock re-engages.
53
45
 
54
46
  ### Payment bypass
55
47
 
@@ -101,7 +93,7 @@ When hard-locked, `cc-lock unlock` will refuse and the shim shows "Hard lock is
101
93
  ### npm (recommended)
102
94
 
103
95
  ```bash
104
- npm install -g claude-lock
96
+ npm install -g cc-lock
105
97
  cc-lock install
106
98
  ```
107
99
 
@@ -218,7 +210,7 @@ cc-lock uninstall
218
210
 
219
211
  | Key | Type | Default | Description |
220
212
  |-----|------|---------|-------------|
221
- | `graceMinutes` | integer (1–120) | `5` | How long the grace period lasts after a successful bypass before the lock re-engages |
213
+ | `graceMinutes` | integer (1–120) | `10` | How long the grace period lasts after a successful bypass before the lock re-engages |
222
214
  | `chmodGuard` | boolean | `false` | Removes write permission from the shim so it can't be trivially replaced |
223
215
  | `weekendDays` | `sat-sun` \| `fri-sat` \| `0,6` | `sat-sun` | Which days count as "weekend" for weekend-type schedules |
224
216
  | `challengeBypassEnabled` | boolean | `true` | Allow free challenge-based bypass. Set to `false` to require payment (or block bypass entirely if no payment method is configured) |
@@ -242,6 +234,8 @@ $ claude
242
234
 
243
235
  🔒 Claude Code is locked by cc-lock
244
236
 
237
+ The shim script has more self-control than you do.
238
+
245
239
  Lock expires at: 18:43:24
246
240
  Bypass attempts this period: 0
247
241
 
@@ -255,6 +249,8 @@ $ claude
255
249
 
256
250
  🔒 Claude Code is locked by cc-lock
257
251
 
252
+ Your future self is sighing right now.
253
+
258
254
  Lock expires at: 18:43:24
259
255
  Hard lock is active — bypass is not allowed.
260
256
  Wait for the lock to expire.
package/dist/index.js CHANGED
@@ -98,6 +98,12 @@ function formatStatus(lock, todayUsageSeconds) {
98
98
  break;
99
99
  }
100
100
  lines.push(`Today's usage: ${formatDuration(todayUsageSeconds)}`);
101
+ if (lock.pendingResumeKeys?.length) {
102
+ lines.push("Sessions to resume:");
103
+ for (const key of lock.pendingResumeKeys) {
104
+ lines.push(` claude --resume ${key}`);
105
+ }
106
+ }
101
107
  return lines.join("\n");
102
108
  }
103
109
  function formatStats(days) {
@@ -376,6 +382,55 @@ function prompt(question) {
376
382
  });
377
383
  });
378
384
  }
385
+ function promptNoPaste(question) {
386
+ return new Promise((resolve2) => {
387
+ process.stdout.write(question);
388
+ let input = "";
389
+ const isRaw = !!process.stdin.isRaw;
390
+ process.stdin.setRawMode(true);
391
+ process.stdin.resume();
392
+ process.stdin.setEncoding("utf8");
393
+ function cleanup() {
394
+ process.stdin.removeListener("data", onData);
395
+ if (!isRaw) process.stdin.setRawMode(false);
396
+ process.stdin.pause();
397
+ }
398
+ function onData(chunk) {
399
+ const code = chunk.charCodeAt(0);
400
+ if (code === 3 || code === 4) {
401
+ process.stdout.write("\n");
402
+ cleanup();
403
+ process.exit(1);
404
+ }
405
+ if (code === 13) {
406
+ process.stdout.write("\n");
407
+ cleanup();
408
+ resolve2(input);
409
+ return;
410
+ }
411
+ if (code === 127 || code === 8) {
412
+ if (input.length > 0) {
413
+ input = input.slice(0, -1);
414
+ process.stdout.write("\b \b");
415
+ }
416
+ return;
417
+ }
418
+ if (code === 27) return;
419
+ if (chunk.length > 1) {
420
+ process.stdout.write(" \x1B[31m[no paste]\x1B[0m");
421
+ setTimeout(() => {
422
+ process.stdout.write(`\r\x1B[K> ${input}`);
423
+ }, 600);
424
+ return;
425
+ }
426
+ if (code >= 32) {
427
+ input += chunk;
428
+ process.stdout.write(chunk);
429
+ }
430
+ }
431
+ process.stdin.on("data", onData);
432
+ });
433
+ }
379
434
  function sleep(seconds) {
380
435
  return new Promise((resolve2) => {
381
436
  let remaining = seconds;
@@ -473,7 +528,7 @@ Cooldown: ${challenge.cooldownSeconds}s`);
473
528
  console.log(`
474
529
  ${challenge.prompt}
475
530
  `);
476
- const answer = await prompt("> ");
531
+ const answer = await promptNoPaste("> ");
477
532
  if (answer !== reversed) {
478
533
  console.log("\x1B[31mMismatch! Bypass failed.\x1B[0m");
479
534
  return false;
@@ -483,7 +538,7 @@ Cooldown: ${challenge.cooldownSeconds}s`);
483
538
  case "math": {
484
539
  console.log(`
485
540
  Solve: ${challenge.prompt} = ?`);
486
- const answer = await prompt("> ");
541
+ const answer = await promptNoPaste("> ");
487
542
  if (answer !== challenge.answer) {
488
543
  console.log(`\x1B[31mWrong! Expected ${challenge.answer}\x1B[0m`);
489
544
  return false;
@@ -493,7 +548,7 @@ Solve: ${challenge.prompt} = ?`);
493
548
  case "justification": {
494
549
  console.log(`
495
550
  ${challenge.prompt}`);
496
- const answer = await prompt("> ");
551
+ const answer = await promptNoPaste("> ");
497
552
  const wordCount = answer.split(/\s+/).filter(Boolean).length;
498
553
  if (wordCount < 50) {
499
554
  console.log(`\x1B[31mToo short! (${wordCount}/50 words)\x1B[0m`);
@@ -529,8 +584,9 @@ Lock expires${expiresAt}.`
529
584
  type: "bypass-start"
530
585
  });
531
586
  if (!startRes.ok) {
587
+ const reason = startRes.error ?? "No bypass options available.";
532
588
  console.error(`
533
- Bypass blocked: ${startRes.error}`);
589
+ Bypass blocked: ${reason}`);
534
590
  process.exit(1);
535
591
  }
536
592
  let usePayment = false;
@@ -753,6 +809,14 @@ var SETTABLE_KEYS = {
753
809
  parse(raw) {
754
810
  return raw;
755
811
  }
812
+ },
813
+ killSessionsOnLock: {
814
+ description: "Kill running claude sessions when a lock is engaged (true/false)",
815
+ parse(raw) {
816
+ if (raw === "true" || raw === "1" || raw === "yes") return true;
817
+ if (raw === "false" || raw === "0" || raw === "no") return false;
818
+ throw new Error("killSessionsOnLock must be true or false");
819
+ }
756
820
  }
757
821
  };
758
822
  async function configGetCommand() {
@@ -766,6 +830,7 @@ async function configGetCommand() {
766
830
  console.log(` chmodGuard : ${config2.chmodGuard}`);
767
831
  console.log(` weekendDays : ${formatWeekendDays(config2.weekendDays ?? [0, 6])}`);
768
832
  console.log(` challengeBypassEnabled : ${config2.challengeBypassEnabled ?? true}`);
833
+ console.log(` killSessionsOnLock : ${config2.killSessionsOnLock ?? false}`);
769
834
  console.log(` paymentBypassEnabled : ${config2.paymentBypassEnabled ?? false}`);
770
835
  if (config2.paymentBypassEnabled) {
771
836
  const cents = config2.paymentBypassAmount ?? 500;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ipc-client.ts","../src/formatters.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/lock.ts","../src/commands/unlock.ts","../src/commands/schedule.ts","../src/commands/stats.ts","../src/commands/config.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { lockCommand } from \"./commands/lock.js\";\nimport { unlockCommand } from \"./commands/unlock.js\";\nimport {\n scheduleAddCommand,\n scheduleListCommand,\n scheduleRemoveCommand,\n} from \"./commands/schedule.js\";\nimport { statsCommand, statsResetCommand } from \"./commands/stats.js\";\nimport { configGetCommand, configSetCommand } from \"./commands/config.js\";\nimport { installCommand, uninstallCommand } from \"./commands/install.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"cc-lock\")\n .description(\"Lock yourself out of Claude Code CLI\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"status\")\n .description(\"Show current lock state and usage\")\n .action(async () => {\n try {\n await statusCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"lock\")\n .description(\"Lock Claude Code for a duration (e.g., 30m, 2h, 1d)\")\n .argument(\"<duration>\", \"Lock duration (e.g., 30m, 2h, 1d)\")\n .option(\"--hard\", \"Hard lock — bypass challenges are disabled\")\n .action(async (duration: string, options: { hard?: boolean }) => {\n try {\n await lockCommand(duration, options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"unlock\")\n .description(\"Unlock Claude Code (bypass challenge if locked)\")\n .action(async () => {\n try {\n await unlockCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst schedule = program\n .command(\"schedule\")\n .description(\"Manage recurring lock schedules\");\n\nschedule\n .command(\"add\")\n .description(\"Add a new schedule (interactive)\")\n .action(async () => {\n try {\n await scheduleAddCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nschedule\n .command(\"list\")\n .description(\"List all schedules\")\n .action(async () => {\n try {\n await scheduleListCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nschedule\n .command(\"remove\")\n .description(\"Remove a schedule\")\n .argument(\"<id>\", \"Schedule ID\")\n .action(async (id: string) => {\n try {\n await scheduleRemoveCommand(id);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst config = program\n .command(\"config\")\n .description(\"View or edit configuration\");\n\nconfig\n .command(\"get\")\n .description(\"Show current configuration\")\n .action(async () => {\n try {\n await configGetCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconfig\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Config key (graceMinutes, chmodGuard)\")\n .argument(\"<value>\", \"New value\")\n .action(async (key: string, value: string) => {\n try {\n await configSetCommand(key, value);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst stats = program\n .command(\"stats\")\n .description(\"Show usage statistics\")\n .option(\"--week\", \"Show last 7 days\")\n .option(\"--month\", \"Show last 30 days\")\n .action(async (options: { week?: boolean; month?: boolean }) => {\n try {\n await statsCommand(options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nstats\n .command(\"reset\")\n .description(\"Clear usage stats (today only by default)\")\n .option(\"--all\", \"Clear all historical stats, not just today\")\n .action(async (options: { all?: boolean }) => {\n try {\n await statsResetCommand(options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"tui\")\n .description(\"Launch interactive TUI dashboard\")\n .action(async () => {\n try {\n const { launchTui } = await import(\"@cc-lock/tui\");\n await launchTui();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"install\")\n .description(\"Install cc-lock (detect Claude, set up daemon)\")\n .action(async () => {\n try {\n await installCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Uninstall cc-lock (restore Claude, remove daemon)\")\n .action(async () => {\n try {\n await uninstallCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { createConnection } from \"net\";\nimport { SOCKET_PATH } from \"@cc-lock/core\";\nimport type { Request, Response } from \"@cc-lock/core\";\n\nexport function sendRequest(req: Request): Promise<Response> {\n return new Promise((resolve, reject) => {\n const socket = createConnection(SOCKET_PATH);\n let buffer = \"\";\n\n socket.on(\"connect\", () => {\n socket.write(JSON.stringify(req) + \"\\n\");\n });\n\n socket.on(\"data\", (data) => {\n buffer += data.toString();\n const newlineIdx = buffer.indexOf(\"\\n\");\n if (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx);\n try {\n const res = JSON.parse(line) as Response;\n socket.end();\n resolve(res);\n } catch (err) {\n socket.end();\n reject(new Error(`Invalid response: ${err}`));\n }\n }\n });\n\n socket.on(\"error\", (err) => {\n if ((err as NodeJS.ErrnoException).code === \"ECONNREFUSED\" ||\n (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n reject(\n new Error(\n \"cc-lock daemon is not running. Start it with: cc-lock install\"\n )\n );\n } else {\n reject(err);\n }\n });\n\n socket.setTimeout(5000, () => {\n socket.destroy();\n reject(new Error(\"Connection to daemon timed out\"));\n });\n });\n}\n\nexport async function isDaemonRunning(): Promise<boolean> {\n try {\n await sendRequest({ type: \"status\" });\n return true;\n } catch {\n return false;\n }\n}\n","import type { LockState, DailyStats, Schedule, Config } from \"@cc-lock/core\";\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMin = minutes % 60;\n if (hours < 24) return remainMin > 0 ? `${hours}h ${remainMin}m` : `${hours}h`;\n const days = Math.floor(hours / 24);\n const remainHours = hours % 24;\n return `${days}d ${remainHours}h`;\n}\n\nexport function formatTimeRemaining(expiresAt: string): string {\n const remaining = new Date(expiresAt).getTime() - Date.now();\n if (remaining <= 0) return \"expired\";\n return formatDuration(Math.round(remaining / 1000));\n}\n\nexport function formatStatus(lock: LockState, todayUsageSeconds: number): string {\n const lines: string[] = [];\n\n switch (lock.status) {\n case \"unlocked\":\n lines.push(\"Status: \\x1b[32m● UNLOCKED\\x1b[0m\");\n break;\n case \"locked\":\n if (lock.hardLock) {\n lines.push(\"Status: \\x1b[31m● HARD LOCKED\\x1b[0m (no bypass)\");\n } else {\n lines.push(\"Status: \\x1b[31m● LOCKED\\x1b[0m\");\n }\n if (lock.expiresAt) {\n lines.push(`Expires in: ${formatTimeRemaining(lock.expiresAt)}`);\n }\n if (!lock.hardLock) {\n lines.push(`Bypass attempts: ${lock.bypassAttempts}`);\n }\n break;\n case \"grace\":\n lines.push(\"Status: \\x1b[33m● GRACE PERIOD\\x1b[0m\");\n if (lock.graceExpiresAt) {\n lines.push(`Grace expires in: ${formatTimeRemaining(lock.graceExpiresAt)}`);\n }\n break;\n }\n\n lines.push(`Today's usage: ${formatDuration(todayUsageSeconds)}`);\n return lines.join(\"\\n\");\n}\n\nexport function formatStats(days: DailyStats[]): string {\n if (days.length === 0) return \"No usage data for this period.\";\n\n const lines: string[] = [\"Date | Usage | Sessions | Bypasses\", \"-\".repeat(50)];\n\n for (const day of days) {\n const usage = formatDuration(day.totalSeconds).padEnd(8);\n lines.push(\n `${day.date} | ${usage} | ${String(day.sessionCount).padEnd(8)} | ${day.bypassCount}`\n );\n }\n\n const totalSeconds = days.reduce((s, d) => s + d.totalSeconds, 0);\n const totalSessions = days.reduce((s, d) => s + d.sessionCount, 0);\n const totalBypasses = days.reduce((s, d) => s + d.bypassCount, 0);\n lines.push(\"-\".repeat(50));\n lines.push(\n `Total | ${formatDuration(totalSeconds).padEnd(8)} | ${String(totalSessions).padEnd(8)} | ${totalBypasses}`\n );\n\n return lines.join(\"\\n\");\n}\n\nexport function formatSchedules(schedules: Schedule[]): string {\n if (schedules.length === 0) return \"No schedules configured.\";\n\n const lines: string[] = [\"ID | Name | Type | Time | Enabled\", \"-\".repeat(60)];\n\n for (const s of schedules) {\n const enabled = s.enabled ? \"\\x1b[32mYes\\x1b[0m\" : \"\\x1b[31mNo\\x1b[0m\";\n const days = s.days ? ` (${s.days.join(\",\")})` : \"\";\n lines.push(\n `${s.id.slice(0, 12)} | ${s.name.padEnd(12)} | ${(s.type + days).padEnd(16)} | ${s.startTime}-${s.endTime} | ${enabled}`\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nexport function formatConfig(config: Config): string {\n const weekendDays = (config.weekendDays ?? [0, 6])\n .map((d) => DAY_NAMES[d] ?? d)\n .join(\"+\");\n return [\n `Installation: ${config.installationType}`,\n `Binary path: ${config.claudeBinaryPath}`,\n `Shim path: ${config.claudeShimPath}`,\n `chmod guard: ${config.chmodGuard ? \"enabled\" : \"disabled\"}`,\n `Grace period: ${config.graceMinutes} minutes`,\n `Weekend days: ${weekendDays}`,\n ].join(\"\\n\");\n}\n\nexport function parseDuration(input: string): number | null {\n const match = input.match(/^(\\d+)\\s*(m|min|minutes?|h|hr|hours?|d|days?)$/i);\n if (!match) return null;\n const value = parseInt(match[1]!, 10);\n const unit = match[2]!.toLowerCase();\n if (unit.startsWith(\"m\")) return value;\n if (unit.startsWith(\"h\")) return value * 60;\n if (unit.startsWith(\"d\")) return value * 1440;\n return null;\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatStatus } from \"../formatters.js\";\nimport type { StatusResponse } from \"@cc-lock/core\";\n\nexport async function statusCommand() {\n const res = (await sendRequest({ type: \"status\" })) as StatusResponse;\n console.log(formatStatus(res.lock, res.todayUsageSeconds));\n}\n","import { sendRequest, isDaemonRunning } from \"../ipc-client.js\";\nimport { formatConfig } from \"../formatters.js\";\nimport {\n LAUNCHD_PLIST_PATH,\n LAUNCHD_LABEL,\n CC_LOCK_DIR,\n TASK_SCHEDULER_NAME,\n} from \"@cc-lock/core\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join, resolve } from \"path\";\nimport { execSync, spawn } from \"child_process\";\nimport type { InstallResponse, UninstallResponse } from \"@cc-lock/core\";\n\nconst _require = createRequire(import.meta.url);\n\nfunction getDaemonEntryPath(): string {\n try {\n // Production: @cc-lock/daemon is installed as a dependency\n const pkg = _require.resolve(\"@cc-lock/daemon/package.json\");\n return join(dirname(pkg), \"dist\", \"index.js\");\n } catch {\n // Development: running from the monorepo\n return resolve(dirname(new URL(import.meta.url).pathname), \"../../daemon/dist/index.js\");\n }\n}\n\nfunction generatePlist(): string {\n const daemonPath = getDaemonEntryPath();\n const nodePath = process.execPath;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LAUNCHD_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${CC_LOCK_DIR}/daemon.log</string>\n <key>StandardErrorPath</key>\n <string>${CC_LOCK_DIR}/daemon.err.log</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>HOME</key>\n <string>${process.env.HOME}</string>\n <key>PATH</key>\n <string>${process.env.PATH}</string>\n </dict>\n</dict>\n</plist>`;\n}\n\nasync function installDarwin() {\n const plistContent = generatePlist();\n mkdirSync(dirname(LAUNCHD_PLIST_PATH), { recursive: true });\n writeFileSync(LAUNCHD_PLIST_PATH, plistContent);\n console.log(`Wrote launchd plist: ${LAUNCHD_PLIST_PATH}`);\n\n try {\n execSync(`launchctl bootout gui/$(id -u) ${LAUNCHD_PLIST_PATH} 2>/dev/null`, {\n stdio: \"ignore\",\n });\n } catch {\n // Might not be loaded\n }\n\n try {\n execSync(`launchctl bootstrap gui/$(id -u) ${LAUNCHD_PLIST_PATH}`, {\n stdio: \"inherit\",\n });\n console.log(\"Daemon loaded via launchd\");\n } catch {\n // Fallback: start directly\n console.log(\"launchctl failed, starting daemon directly...\");\n const daemonPath = getDaemonEntryPath();\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n }\n}\n\nasync function installWindows() {\n const daemonPath = getDaemonEntryPath();\n const nodePath = process.execPath;\n\n console.log(\"Setting up Windows Task Scheduler...\");\n try {\n execSync(\n `schtasks /create /tn \"${TASK_SCHEDULER_NAME}\" /sc onlogon /tr \"\\\\\"${nodePath}\\\\\" \\\\\"${daemonPath}\\\\\"\" /ru \"%USERNAME%\" /f`,\n { stdio: \"inherit\" }\n );\n console.log(\"Task Scheduler entry created.\");\n } catch {\n console.log(\"schtasks failed, starting daemon directly...\");\n }\n\n // Start daemon immediately\n try {\n execSync(`schtasks /run /tn \"${TASK_SCHEDULER_NAME}\"`, { stdio: \"ignore\" });\n } catch {\n // Fallback: spawn directly\n const child = spawn(nodePath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n }\n}\n\nasync function installLinux() {\n console.log(\"Starting daemon (Linux — no systemd integration)...\");\n const daemonPath = getDaemonEntryPath();\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n}\n\nexport async function installCommand() {\n console.log(\"Installing cc-lock...\\n\");\n\n if (process.platform === \"win32\") {\n await installWindows();\n } else if (process.platform === \"darwin\") {\n await installDarwin();\n } else {\n await installLinux();\n }\n\n // Wait for daemon\n let connected = false;\n for (let i = 0; i < 10; i++) {\n await new Promise((r) => setTimeout(r, 500));\n if (await isDaemonRunning()) {\n connected = true;\n break;\n }\n }\n\n if (!connected) {\n console.error(\"Warning: Could not connect to daemon after starting.\");\n return;\n }\n\n // Detect installation\n const res = (await sendRequest({ type: \"install\" })) as InstallResponse;\n if (res.ok) {\n console.log(`\\nDetected Claude Code installation:`);\n console.log(` Type: ${res.installationType}`);\n console.log(` Binary: ${res.claudeBinaryPath}`);\n console.log(\"\\ncc-lock installed successfully!\");\n } else {\n console.error(`\\nInstallation detection failed: ${res.error}`);\n console.error(\"You can manually configure later.\");\n }\n}\n\nexport async function uninstallCommand() {\n console.log(\"Uninstalling cc-lock...\\n\");\n\n // Check with daemon — it will reject if locked\n try {\n if (await isDaemonRunning()) {\n const res = (await sendRequest({ type: \"uninstall\" })) as UninstallResponse;\n if (!res.ok) {\n console.error(`Cannot uninstall: ${res.error}`);\n process.exit(1);\n }\n console.log(\"Restored original Claude binary.\");\n }\n } catch {\n // Daemon not running, that's ok — proceed with cleanup\n }\n\n if (process.platform === \"win32\") {\n try {\n execSync(`schtasks /delete /tn \"${TASK_SCHEDULER_NAME}\" /f`, {\n stdio: \"ignore\",\n });\n console.log(\"Removed Task Scheduler entry.\");\n } catch {\n // Might not exist\n }\n } else if (process.platform === \"darwin\") {\n try {\n execSync(`launchctl bootout gui/$(id -u) ${LAUNCHD_PLIST_PATH} 2>/dev/null`, {\n stdio: \"ignore\",\n });\n console.log(\"Daemon unloaded from launchd.\");\n } catch {\n // Might not be loaded\n }\n\n if (existsSync(LAUNCHD_PLIST_PATH)) {\n const { unlinkSync } = await import(\"fs\");\n unlinkSync(LAUNCHD_PLIST_PATH);\n console.log(\"Removed launchd plist.\");\n }\n }\n\n console.log(\"\\ncc-lock uninstalled.\");\n}\n","import { sendRequest, isDaemonRunning } from \"../ipc-client.js\";\nimport { parseDuration } from \"../formatters.js\";\nimport { installCommand } from \"./install.js\";\nimport type { LockResponse } from \"@cc-lock/core\";\n\nexport async function lockCommand(duration: string, options: { hard?: boolean } = {}) {\n const minutes = parseDuration(duration);\n if (minutes === null || minutes <= 0) {\n console.error(`Invalid duration: \"${duration}\". Examples: 30m, 2h, 1d`);\n process.exit(1);\n }\n\n if (!(await isDaemonRunning())) {\n console.log(\"Daemon not running — running first-time install...\\n\");\n await installCommand();\n console.log();\n }\n\n const res = (await sendRequest({\n type: \"lock\",\n durationMinutes: minutes,\n hardLock: options.hard ?? false,\n })) as LockResponse;\n\n if (res.ok) {\n if (options.hard) {\n console.log(`\\x1b[31mHard locked!\\x1b[0m Claude Code is locked for ${duration} with no bypass allowed.`);\n } else {\n console.log(`\\x1b[31mLocked!\\x1b[0m Claude Code is now locked for ${duration}.`);\n }\n if (res.lock.expiresAt) {\n const localTime = new Date(res.lock.expiresAt).toLocaleTimeString();\n console.log(`Expires at: ${localTime}`);\n }\n } else {\n console.error(`Failed to lock: ${res.error}`);\n }\n}\n","import { createInterface } from \"readline\";\nimport { execSync } from \"child_process\";\nimport { sendRequest } from \"../ipc-client.js\";\nimport type {\n StatusResponse,\n BypassStartResponse,\n BypassCompleteResponse,\n Challenge,\n} from \"@cc-lock/core\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => {\n let remaining = seconds;\n const interval = setInterval(() => {\n process.stdout.write(`\\rWait: ${remaining}s remaining... `);\n remaining--;\n if (remaining < 0) {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(30) + \"\\r\");\n resolve();\n }\n }, 1000);\n });\n}\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === \"darwin\"\n ? `open \"${url}\"`\n : process.platform === \"win32\"\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n try {\n execSync(cmd, { stdio: \"ignore\" });\n } catch {\n // non-fatal — URL is printed to console anyway\n }\n}\n\nasync function runPaymentBypass(paymentOption: {\n amount: number;\n currency: string;\n url: string;\n hasVerification: boolean;\n}): Promise<{ proceed: boolean; stripePaymentIntentId?: string }> {\n const dollars = (paymentOption.amount / 100).toFixed(2);\n\n console.log(`\\nOpening payment URL in browser...`);\n console.log(` ${paymentOption.url}`);\n openBrowser(paymentOption.url);\n\n if (paymentOption.hasVerification) {\n // Stripe path: ask for payment intent ID\n const piId = await prompt(\n `\\nEnter your Stripe Payment Intent ID (pi_...) from the receipt email:\\n> `\n );\n if (!piId.startsWith(\"pi_\")) {\n console.log(\"\\x1b[31mInvalid payment intent ID. Must start with pi_\\x1b[0m\");\n return { proceed: false };\n }\n return { proceed: true, stripePaymentIntentId: piId };\n }\n\n // No verification path: mandatory 30-second wait\n console.log(`\\nMandatory wait before confirming $${dollars} payment...`);\n await sleep(30);\n\n const confirm = await prompt(`Did you complete the $${dollars} payment? [yes/no]\\n> `);\n if (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n console.log(\"Payment not confirmed. Falling through to challenge.\");\n return { proceed: false };\n }\n\n return { proceed: true };\n}\n\nconst DISCOURAGING_MESSAGES = [\n \"You set this lock. You knew this moment would come. Weak.\",\n \"The 'quick fix' will take 4 hours. You know this.\",\n \"Your future self is sighing right now.\",\n \"This is why you can't have nice things.\",\n \"Incredible. You lasted... let's see... not very long.\",\n \"Claude doesn't need you. You need Claude. That's the problem.\",\n \"go touch grass\",\n \"The feature can wait. Your dignity cannot.\",\n \"Past-you set this lock because past-you didn't trust present-you. Past-you was right.\",\n \"Every great developer knows when to stop. This is not that moment for you.\",\n \"You're not being productive. You're being addicted.\",\n \"The code will still be broken tomorrow. You'll just be more tired.\",\n \"Breaking news: local developer can't stick to a self-imposed rule for more than an hour.\",\n \"You locked yourself out for a reason. Try to remember what that reason was.\",\n \"Weak.\",\n \"Not even a personal best. Disappointing.\",\n \"The shim script has more self-control than you do.\",\n \"Somewhere, a rubber duck is judging you.\",\n \"Your plants need water. Your friends miss you. Claude will still be here tomorrow.\",\n \"Is this really the hill you want to die on?\",\n \"You could go outside. Just a thought.\",\n \"The '5 more minutes' to 'midnight' pipeline is fully operational, I see.\",\n \"Bold move. Stupid, but bold.\",\n \"You and I both know this isn't about work.\",\n \"The lock is the boundary. You are the problem.\",\n \"Your therapist would not approve.\",\n \"A lesser person would just disable the whole thing. Oh wait.\",\n];\n\nfunction randomDiscouragingMessage(): string {\n return DISCOURAGING_MESSAGES[Math.floor(Math.random() * DISCOURAGING_MESSAGES.length)]!;\n}\n\nasync function runChallenge(challenge: Challenge): Promise<boolean> {\n if (challenge.cooldownSeconds > 0) {\n console.log(`\\nCooldown: ${challenge.cooldownSeconds}s`);\n await sleep(challenge.cooldownSeconds);\n }\n\n switch (challenge.type) {\n case \"cooldown\":\n return true;\n\n case \"typing\": {\n const reversed = challenge.prompt.split(\"\").reverse().join(\"\");\n console.log(\"\\nType the following string \\x1b[1mBACKWARDS\\x1b[0m (right to left):\");\n console.log(`\\n ${challenge.prompt}\\n`);\n const answer = await prompt(\"> \");\n if (answer !== reversed) {\n console.log(\"\\x1b[31mMismatch! Bypass failed.\\x1b[0m\");\n return false;\n }\n return true;\n }\n\n case \"math\": {\n console.log(`\\nSolve: ${challenge.prompt} = ?`);\n const answer = await prompt(\"> \");\n if (answer !== challenge.answer) {\n console.log(`\\x1b[31mWrong! Expected ${challenge.answer}\\x1b[0m`);\n return false;\n }\n return true;\n }\n\n case \"justification\": {\n console.log(`\\n${challenge.prompt}`);\n const answer = await prompt(\"> \");\n const wordCount = answer.split(/\\s+/).filter(Boolean).length;\n if (wordCount < 50) {\n console.log(`\\x1b[31mToo short! (${wordCount}/50 words)\\x1b[0m`);\n return false;\n }\n return true;\n }\n }\n}\n\nexport async function unlockCommand() {\n // Check if actually locked first\n const status = (await sendRequest({ type: \"status\" })) as StatusResponse;\n\n if (status.lock.status === \"unlocked\") {\n console.log(\"Already unlocked.\");\n return;\n }\n\n if (status.lock.status === \"grace\") {\n console.log(\"Already in grace period - Claude Code is available.\");\n return;\n }\n\n // Hard lock — no bypass allowed\n if (status.lock.hardLock) {\n const expiresAt = status.lock.expiresAt\n ? ` until ${new Date(status.lock.expiresAt).toLocaleTimeString()}`\n : \"\";\n console.error(\n `\\x1b[31mHard lock is active — bypass is not allowed.\\x1b[0m\\nLock expires${expiresAt}.`\n );\n process.exit(1);\n }\n\n // Locked - must complete bypass challenge\n console.log(\"\\n\\x1b[33mBypass Challenge\\x1b[0m\");\n console.log(`Attempt #${status.lock.bypassAttempts + 1}`);\n console.log(`\\x1b[2m${randomDiscouragingMessage()}\\x1b[0m\\n`);\n\n const startRes = (await sendRequest({\n type: \"bypass-start\",\n })) as BypassStartResponse;\n\n if (!startRes.ok) {\n console.error(`\\nBypass blocked: ${startRes.error}`);\n process.exit(1);\n }\n\n let usePayment = false;\n let stripePaymentIntentId: string | undefined;\n\n if (startRes.paymentOption) {\n const { paymentOption } = startRes;\n const dollars = (paymentOption.amount / 100).toFixed(2);\n const challengesDisabled = startRes.challenges.length === 0;\n\n if (challengesDisabled) {\n console.log(`Challenge bypass is disabled. Payment required ($${dollars}).\\n`);\n const result = await runPaymentBypass(paymentOption);\n if (result.proceed) {\n usePayment = true;\n stripePaymentIntentId = result.stripePaymentIntentId;\n } else {\n console.log(\"\\nBypass cancelled.\");\n process.exit(1);\n }\n } else {\n console.log(\"How would you like to bypass?\");\n console.log(` A) Complete a challenge (free)`);\n console.log(` B) Pay $${dollars} — opens browser for payment`);\n\n const choice = await prompt(\"\\nChoice [A/B]: \");\n\n if (choice.toUpperCase() === \"B\") {\n const result = await runPaymentBypass(paymentOption);\n if (result.proceed) {\n usePayment = true;\n stripePaymentIntentId = result.stripePaymentIntentId;\n }\n // If not proceed, fall through to challenge below\n }\n }\n }\n\n if (!usePayment) {\n for (const challenge of startRes.challenges) {\n const passed = await runChallenge(challenge);\n if (!passed) {\n console.log(\"\\nBypass failed. Try again later.\");\n process.exit(1);\n }\n }\n }\n\n const completeRes = (await sendRequest({\n type: \"bypass-complete\",\n challengeId: startRes.challengeId,\n answer: \"completed\",\n ...(usePayment && { paymentMethod: true }),\n ...(stripePaymentIntentId && { stripePaymentIntentId }),\n })) as BypassCompleteResponse;\n\n if (completeRes.ok) {\n const graceTime = new Date(completeRes.graceExpiresAt!).toLocaleTimeString();\n const graceMinutes = Math.round(\n (new Date(completeRes.graceExpiresAt!).getTime() - Date.now()) / 60_000\n );\n console.log(\n `\\n\\x1b[32mBypass successful!\\x1b[0m You have ${graceMinutes} minutes of access (until ${graceTime}).`\n );\n if (status.lock.expiresAt) {\n console.log(\n `Lock re-engages after grace. Full lock expires at ${new Date(status.lock.expiresAt).toLocaleTimeString()}.`\n );\n }\n } else {\n console.error(`\\nBypass failed: ${completeRes.error}`);\n process.exit(1);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatSchedules } from \"../formatters.js\";\nimport type {\n ScheduleAddResponse,\n ScheduleListResponse,\n ScheduleRemoveResponse,\n ScheduleToggleResponse,\n} from \"@cc-lock/core\";\nimport type { Schedule } from \"@cc-lock/core\";\nimport { createInterface } from \"readline\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport async function scheduleAddCommand() {\n console.log(\"Add a new schedule\\n\");\n\n const name = await prompt(\"Name: \");\n const typeStr = await prompt(\"Type (daily/weekdays/weekends/custom): \");\n const type = typeStr as Schedule[\"type\"];\n\n let days: number[] | undefined;\n if (type === \"custom\") {\n const daysStr = await prompt(\"Days (comma-separated, 0=Sun..6=Sat): \");\n days = daysStr.split(\",\").map((s) => parseInt(s.trim(), 10));\n }\n\n const startTime = await prompt(\"Start time (HH:MM): \");\n const endTime = await prompt(\"End time (HH:MM): \");\n\n const res = (await sendRequest({\n type: \"schedule-add\",\n schedule: { name, type, startTime, endTime, days, enabled: true },\n })) as ScheduleAddResponse;\n\n if (res.ok && res.schedule) {\n console.log(`\\nSchedule added: ${res.schedule.id}`);\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n\nexport async function scheduleListCommand() {\n const res = (await sendRequest({\n type: \"schedule-list\",\n })) as ScheduleListResponse;\n console.log(formatSchedules(res.schedules));\n}\n\nexport async function scheduleRemoveCommand(id: string) {\n const res = (await sendRequest({\n type: \"schedule-remove\",\n id,\n })) as ScheduleRemoveResponse;\n\n if (res.ok) {\n console.log(\"Schedule removed.\");\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n\nexport async function scheduleToggleCommand(id: string, enabled: boolean) {\n const res = (await sendRequest({\n type: \"schedule-toggle\",\n id,\n enabled,\n })) as ScheduleToggleResponse;\n\n if (res.ok) {\n console.log(`Schedule ${enabled ? \"enabled\" : \"disabled\"}.`);\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatStats } from \"../formatters.js\";\nimport type { StatsResponse, StatsResetResponse } from \"@cc-lock/core\";\n\nexport async function statsCommand(options: { week?: boolean; month?: boolean }) {\n const period = options.month ? \"month\" : options.week ? \"week\" : \"day\";\n const res = (await sendRequest({ type: \"stats\", period })) as StatsResponse;\n console.log(formatStats(res.days));\n}\n\nexport async function statsResetCommand(options: { all?: boolean }) {\n const all = options.all ?? false;\n const scope = all ? \"all stats\" : \"today's stats\";\n const res = (await sendRequest({ type: \"stats-reset\", all })) as StatsResetResponse;\n if (res.ok) {\n console.log(`✓ Reset ${scope}.`);\n } else {\n console.error(`✗ ${res.error ?? \"Reset failed\"}`);\n process.exit(1);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport type { ConfigGetResponse, ConfigSetResponse } from \"@cc-lock/core\";\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nconst WEEKEND_PRESETS: Record<string, number[]> = {\n \"sat-sun\": [0, 6],\n \"sun-sat\": [0, 6],\n \"fri-sat\": [5, 6],\n \"sat-fri\": [5, 6],\n};\n\nfunction parseWeekendDays(raw: string): number[] {\n const lower = raw.toLowerCase().replace(/\\s+/g, \"\");\n if (WEEKEND_PRESETS[lower]) return WEEKEND_PRESETS[lower]!;\n const nums = lower.split(\",\").map((s) => parseInt(s, 10));\n if (nums.some((n) => isNaN(n) || n < 0 || n > 6)) {\n throw new Error(\n \"weekendDays must be sat-sun, fri-sat, or comma-separated day numbers (0=Sun … 6=Sat)\"\n );\n }\n return [...new Set(nums)].sort((a, b) => a - b);\n}\n\nexport function formatWeekendDays(days: number[]): string {\n return days.map((d) => DAY_NAMES[d] ?? d).join(\"+\");\n}\n\nconst SETTABLE_KEYS = {\n graceMinutes: {\n description: \"Grace period in minutes after a successful bypass (1–120)\",\n parse(raw: string): number {\n const n = parseInt(raw, 10);\n if (isNaN(n) || n < 1 || n > 120) {\n throw new Error(\"graceMinutes must be an integer between 1 and 120\");\n }\n return n;\n },\n },\n chmodGuard: {\n description: \"Hard mode — removes write permission from the shim (true/false)\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"chmodGuard must be true or false\");\n },\n },\n weekendDays: {\n description: 'Days counted as \"weekend\" for schedules: sat-sun (default), fri-sat, or 0,6',\n parse: parseWeekendDays,\n },\n challengeBypassEnabled: {\n description: \"Allow free challenge-based bypass (true/false). Set false to require payment.\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"challengeBypassEnabled must be true or false\");\n },\n },\n paymentBypassEnabled: {\n description: \"Enable payment bypass mode — pay instead of solving a challenge (true/false)\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"paymentBypassEnabled must be true or false\");\n },\n },\n paymentBypassAmount: {\n description: \"Payment amount in cents, e.g. 500 = $5.00 (min 1)\",\n parse(raw: string): number {\n const n = parseInt(raw, 10);\n if (isNaN(n) || n < 1) {\n throw new Error(\"paymentBypassAmount must be a positive integer (cents)\");\n }\n return n;\n },\n },\n paymentBypassUrl: {\n description: \"Payment URL to open in browser (Stripe link, Venmo, PayPal, Ko-fi, etc.)\",\n parse(raw: string): string {\n return raw;\n },\n },\n paymentBypassStripeKey: {\n description: \"Optional Stripe secret key (sk_...) for payment intent verification\",\n parse(raw: string): string {\n return raw;\n },\n },\n} as const;\n\ntype SettableKey = keyof typeof SETTABLE_KEYS;\n\nexport async function configGetCommand() {\n const res = (await sendRequest({ type: \"config-get\" })) as ConfigGetResponse;\n const { config } = res;\n console.log(\"Current configuration:\");\n console.log(` installationType : ${config.installationType}`);\n console.log(` claudeBinaryPath : ${config.claudeBinaryPath}`);\n console.log(` claudeShimPath : ${config.claudeShimPath}`);\n console.log(` graceMinutes : ${config.graceMinutes}`);\n console.log(` chmodGuard : ${config.chmodGuard}`);\n console.log(` weekendDays : ${formatWeekendDays(config.weekendDays ?? [0, 6])}`);\n console.log(` challengeBypassEnabled : ${config.challengeBypassEnabled ?? true}`);\n console.log(` paymentBypassEnabled : ${config.paymentBypassEnabled ?? false}`);\n if (config.paymentBypassEnabled) {\n const cents = config.paymentBypassAmount ?? 500;\n console.log(` paymentBypassAmount : ${cents} cents ($${(cents / 100).toFixed(2)})`);\n console.log(` paymentBypassUrl : ${config.paymentBypassUrl ?? \"(not set)\"}`);\n console.log(\n ` paymentBypassStripeKey : ${config.paymentBypassStripeKey ? \"(configured)\" : \"(not set)\"}`\n );\n }\n console.log();\n console.log(\"Settable keys:\");\n for (const [key, meta] of Object.entries(SETTABLE_KEYS)) {\n console.log(` ${key.padEnd(16)} ${meta.description}`);\n }\n}\n\nexport async function configSetCommand(key: string, rawValue: string) {\n if (!(key in SETTABLE_KEYS)) {\n const valid = Object.keys(SETTABLE_KEYS).join(\", \");\n throw new Error(`Unknown config key \"${key}\". Settable keys: ${valid}`);\n }\n\n const meta = SETTABLE_KEYS[key as SettableKey];\n const value = meta.parse(rawValue);\n\n const res = (await sendRequest({ type: \"config-set\", key, value })) as ConfigSetResponse;\n if (!res.ok) {\n throw new Error(res.error ?? \"config-set failed\");\n }\n\n console.log(`✓ ${key} = ${value}`);\n}\n"],"mappings":"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","names":["resolve","execSync","resolve","execSync","createInterface","prompt","resolve","config"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ipc-client.ts","../src/formatters.ts","../src/commands/status.ts","../src/commands/install.ts","../src/commands/lock.ts","../src/commands/unlock.ts","../src/commands/schedule.ts","../src/commands/stats.ts","../src/commands/config.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { lockCommand } from \"./commands/lock.js\";\nimport { unlockCommand } from \"./commands/unlock.js\";\nimport {\n scheduleAddCommand,\n scheduleListCommand,\n scheduleRemoveCommand,\n} from \"./commands/schedule.js\";\nimport { statsCommand, statsResetCommand } from \"./commands/stats.js\";\nimport { configGetCommand, configSetCommand } from \"./commands/config.js\";\nimport { installCommand, uninstallCommand } from \"./commands/install.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"cc-lock\")\n .description(\"Lock yourself out of Claude Code CLI\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"status\")\n .description(\"Show current lock state and usage\")\n .action(async () => {\n try {\n await statusCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"lock\")\n .description(\"Lock Claude Code for a duration (e.g., 30m, 2h, 1d)\")\n .argument(\"<duration>\", \"Lock duration (e.g., 30m, 2h, 1d)\")\n .option(\"--hard\", \"Hard lock — bypass challenges are disabled\")\n .action(async (duration: string, options: { hard?: boolean }) => {\n try {\n await lockCommand(duration, options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"unlock\")\n .description(\"Unlock Claude Code (bypass challenge if locked)\")\n .action(async () => {\n try {\n await unlockCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst schedule = program\n .command(\"schedule\")\n .description(\"Manage recurring lock schedules\");\n\nschedule\n .command(\"add\")\n .description(\"Add a new schedule (interactive)\")\n .action(async () => {\n try {\n await scheduleAddCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nschedule\n .command(\"list\")\n .description(\"List all schedules\")\n .action(async () => {\n try {\n await scheduleListCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nschedule\n .command(\"remove\")\n .description(\"Remove a schedule\")\n .argument(\"<id>\", \"Schedule ID\")\n .action(async (id: string) => {\n try {\n await scheduleRemoveCommand(id);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst config = program\n .command(\"config\")\n .description(\"View or edit configuration\");\n\nconfig\n .command(\"get\")\n .description(\"Show current configuration\")\n .action(async () => {\n try {\n await configGetCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconfig\n .command(\"set\")\n .description(\"Set a configuration value\")\n .argument(\"<key>\", \"Config key (graceMinutes, chmodGuard)\")\n .argument(\"<value>\", \"New value\")\n .action(async (key: string, value: string) => {\n try {\n await configSetCommand(key, value);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nconst stats = program\n .command(\"stats\")\n .description(\"Show usage statistics\")\n .option(\"--week\", \"Show last 7 days\")\n .option(\"--month\", \"Show last 30 days\")\n .action(async (options: { week?: boolean; month?: boolean }) => {\n try {\n await statsCommand(options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nstats\n .command(\"reset\")\n .description(\"Clear usage stats (today only by default)\")\n .option(\"--all\", \"Clear all historical stats, not just today\")\n .action(async (options: { all?: boolean }) => {\n try {\n await statsResetCommand(options);\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"tui\")\n .description(\"Launch interactive TUI dashboard\")\n .action(async () => {\n try {\n const { launchTui } = await import(\"@cc-lock/tui\");\n await launchTui();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"install\")\n .description(\"Install cc-lock (detect Claude, set up daemon)\")\n .action(async () => {\n try {\n await installCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram\n .command(\"uninstall\")\n .description(\"Uninstall cc-lock (restore Claude, remove daemon)\")\n .action(async () => {\n try {\n await uninstallCommand();\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { createConnection } from \"net\";\nimport { SOCKET_PATH } from \"@cc-lock/core\";\nimport type { Request, Response } from \"@cc-lock/core\";\n\nexport function sendRequest(req: Request): Promise<Response> {\n return new Promise((resolve, reject) => {\n const socket = createConnection(SOCKET_PATH);\n let buffer = \"\";\n\n socket.on(\"connect\", () => {\n socket.write(JSON.stringify(req) + \"\\n\");\n });\n\n socket.on(\"data\", (data) => {\n buffer += data.toString();\n const newlineIdx = buffer.indexOf(\"\\n\");\n if (newlineIdx !== -1) {\n const line = buffer.slice(0, newlineIdx);\n try {\n const res = JSON.parse(line) as Response;\n socket.end();\n resolve(res);\n } catch (err) {\n socket.end();\n reject(new Error(`Invalid response: ${err}`));\n }\n }\n });\n\n socket.on(\"error\", (err) => {\n if ((err as NodeJS.ErrnoException).code === \"ECONNREFUSED\" ||\n (err as NodeJS.ErrnoException).code === \"ENOENT\") {\n reject(\n new Error(\n \"cc-lock daemon is not running. Start it with: cc-lock install\"\n )\n );\n } else {\n reject(err);\n }\n });\n\n socket.setTimeout(5000, () => {\n socket.destroy();\n reject(new Error(\"Connection to daemon timed out\"));\n });\n });\n}\n\nexport async function isDaemonRunning(): Promise<boolean> {\n try {\n await sendRequest({ type: \"status\" });\n return true;\n } catch {\n return false;\n }\n}\n","import type { LockState, DailyStats, Schedule, Config } from \"@cc-lock/core\";\n\nexport function formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n const remainMin = minutes % 60;\n if (hours < 24) return remainMin > 0 ? `${hours}h ${remainMin}m` : `${hours}h`;\n const days = Math.floor(hours / 24);\n const remainHours = hours % 24;\n return `${days}d ${remainHours}h`;\n}\n\nexport function formatTimeRemaining(expiresAt: string): string {\n const remaining = new Date(expiresAt).getTime() - Date.now();\n if (remaining <= 0) return \"expired\";\n return formatDuration(Math.round(remaining / 1000));\n}\n\nexport function formatStatus(lock: LockState, todayUsageSeconds: number): string {\n const lines: string[] = [];\n\n switch (lock.status) {\n case \"unlocked\":\n lines.push(\"Status: \\x1b[32m● UNLOCKED\\x1b[0m\");\n break;\n case \"locked\":\n if (lock.hardLock) {\n lines.push(\"Status: \\x1b[31m● HARD LOCKED\\x1b[0m (no bypass)\");\n } else {\n lines.push(\"Status: \\x1b[31m● LOCKED\\x1b[0m\");\n }\n if (lock.expiresAt) {\n lines.push(`Expires in: ${formatTimeRemaining(lock.expiresAt)}`);\n }\n if (!lock.hardLock) {\n lines.push(`Bypass attempts: ${lock.bypassAttempts}`);\n }\n break;\n case \"grace\":\n lines.push(\"Status: \\x1b[33m● GRACE PERIOD\\x1b[0m\");\n if (lock.graceExpiresAt) {\n lines.push(`Grace expires in: ${formatTimeRemaining(lock.graceExpiresAt)}`);\n }\n break;\n }\n\n lines.push(`Today's usage: ${formatDuration(todayUsageSeconds)}`);\n\n if (lock.pendingResumeKeys?.length) {\n lines.push(\"Sessions to resume:\");\n for (const key of lock.pendingResumeKeys) {\n lines.push(` claude --resume ${key}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatStats(days: DailyStats[]): string {\n if (days.length === 0) return \"No usage data for this period.\";\n\n const lines: string[] = [\"Date | Usage | Sessions | Bypasses\", \"-\".repeat(50)];\n\n for (const day of days) {\n const usage = formatDuration(day.totalSeconds).padEnd(8);\n lines.push(\n `${day.date} | ${usage} | ${String(day.sessionCount).padEnd(8)} | ${day.bypassCount}`\n );\n }\n\n const totalSeconds = days.reduce((s, d) => s + d.totalSeconds, 0);\n const totalSessions = days.reduce((s, d) => s + d.sessionCount, 0);\n const totalBypasses = days.reduce((s, d) => s + d.bypassCount, 0);\n lines.push(\"-\".repeat(50));\n lines.push(\n `Total | ${formatDuration(totalSeconds).padEnd(8)} | ${String(totalSessions).padEnd(8)} | ${totalBypasses}`\n );\n\n return lines.join(\"\\n\");\n}\n\nexport function formatSchedules(schedules: Schedule[]): string {\n if (schedules.length === 0) return \"No schedules configured.\";\n\n const lines: string[] = [\"ID | Name | Type | Time | Enabled\", \"-\".repeat(60)];\n\n for (const s of schedules) {\n const enabled = s.enabled ? \"\\x1b[32mYes\\x1b[0m\" : \"\\x1b[31mNo\\x1b[0m\";\n const days = s.days ? ` (${s.days.join(\",\")})` : \"\";\n lines.push(\n `${s.id.slice(0, 12)} | ${s.name.padEnd(12)} | ${(s.type + days).padEnd(16)} | ${s.startTime}-${s.endTime} | ${enabled}`\n );\n }\n\n return lines.join(\"\\n\");\n}\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nexport function formatConfig(config: Config): string {\n const weekendDays = (config.weekendDays ?? [0, 6])\n .map((d) => DAY_NAMES[d] ?? d)\n .join(\"+\");\n return [\n `Installation: ${config.installationType}`,\n `Binary path: ${config.claudeBinaryPath}`,\n `Shim path: ${config.claudeShimPath}`,\n `chmod guard: ${config.chmodGuard ? \"enabled\" : \"disabled\"}`,\n `Grace period: ${config.graceMinutes} minutes`,\n `Weekend days: ${weekendDays}`,\n ].join(\"\\n\");\n}\n\nexport function parseDuration(input: string): number | null {\n const match = input.match(/^(\\d+)\\s*(m|min|minutes?|h|hr|hours?|d|days?)$/i);\n if (!match) return null;\n const value = parseInt(match[1]!, 10);\n const unit = match[2]!.toLowerCase();\n if (unit.startsWith(\"m\")) return value;\n if (unit.startsWith(\"h\")) return value * 60;\n if (unit.startsWith(\"d\")) return value * 1440;\n return null;\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatStatus } from \"../formatters.js\";\nimport type { StatusResponse } from \"@cc-lock/core\";\n\nexport async function statusCommand() {\n const res = (await sendRequest({ type: \"status\" })) as StatusResponse;\n console.log(formatStatus(res.lock, res.todayUsageSeconds));\n}\n","import { sendRequest, isDaemonRunning } from \"../ipc-client.js\";\nimport { formatConfig } from \"../formatters.js\";\nimport {\n LAUNCHD_PLIST_PATH,\n LAUNCHD_LABEL,\n CC_LOCK_DIR,\n TASK_SCHEDULER_NAME,\n} from \"@cc-lock/core\";\nimport { writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join, resolve } from \"path\";\nimport { execSync, spawn } from \"child_process\";\nimport type { InstallResponse, UninstallResponse } from \"@cc-lock/core\";\n\nconst _require = createRequire(import.meta.url);\n\nfunction getDaemonEntryPath(): string {\n try {\n // Production: @cc-lock/daemon is installed as a dependency\n const pkg = _require.resolve(\"@cc-lock/daemon/package.json\");\n return join(dirname(pkg), \"dist\", \"index.js\");\n } catch {\n // Development: running from the monorepo\n return resolve(dirname(new URL(import.meta.url).pathname), \"../../daemon/dist/index.js\");\n }\n}\n\nfunction generatePlist(): string {\n const daemonPath = getDaemonEntryPath();\n const nodePath = process.execPath;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LAUNCHD_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${daemonPath}</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${CC_LOCK_DIR}/daemon.log</string>\n <key>StandardErrorPath</key>\n <string>${CC_LOCK_DIR}/daemon.err.log</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>HOME</key>\n <string>${process.env.HOME}</string>\n <key>PATH</key>\n <string>${process.env.PATH}</string>\n </dict>\n</dict>\n</plist>`;\n}\n\nasync function installDarwin() {\n const plistContent = generatePlist();\n mkdirSync(dirname(LAUNCHD_PLIST_PATH), { recursive: true });\n writeFileSync(LAUNCHD_PLIST_PATH, plistContent);\n console.log(`Wrote launchd plist: ${LAUNCHD_PLIST_PATH}`);\n\n try {\n execSync(`launchctl bootout gui/$(id -u) ${LAUNCHD_PLIST_PATH} 2>/dev/null`, {\n stdio: \"ignore\",\n });\n } catch {\n // Might not be loaded\n }\n\n try {\n execSync(`launchctl bootstrap gui/$(id -u) ${LAUNCHD_PLIST_PATH}`, {\n stdio: \"inherit\",\n });\n console.log(\"Daemon loaded via launchd\");\n } catch {\n // Fallback: start directly\n console.log(\"launchctl failed, starting daemon directly...\");\n const daemonPath = getDaemonEntryPath();\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n }\n}\n\nasync function installWindows() {\n const daemonPath = getDaemonEntryPath();\n const nodePath = process.execPath;\n\n console.log(\"Setting up Windows Task Scheduler...\");\n try {\n execSync(\n `schtasks /create /tn \"${TASK_SCHEDULER_NAME}\" /sc onlogon /tr \"\\\\\"${nodePath}\\\\\" \\\\\"${daemonPath}\\\\\"\" /ru \"%USERNAME%\" /f`,\n { stdio: \"inherit\" }\n );\n console.log(\"Task Scheduler entry created.\");\n } catch {\n console.log(\"schtasks failed, starting daemon directly...\");\n }\n\n // Start daemon immediately\n try {\n execSync(`schtasks /run /tn \"${TASK_SCHEDULER_NAME}\"`, { stdio: \"ignore\" });\n } catch {\n // Fallback: spawn directly\n const child = spawn(nodePath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n }\n}\n\nasync function installLinux() {\n console.log(\"Starting daemon (Linux — no systemd integration)...\");\n const daemonPath = getDaemonEntryPath();\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n console.log(`Daemon started (PID: ${child.pid})`);\n}\n\nexport async function installCommand() {\n console.log(\"Installing cc-lock...\\n\");\n\n if (process.platform === \"win32\") {\n await installWindows();\n } else if (process.platform === \"darwin\") {\n await installDarwin();\n } else {\n await installLinux();\n }\n\n // Wait for daemon\n let connected = false;\n for (let i = 0; i < 10; i++) {\n await new Promise((r) => setTimeout(r, 500));\n if (await isDaemonRunning()) {\n connected = true;\n break;\n }\n }\n\n if (!connected) {\n console.error(\"Warning: Could not connect to daemon after starting.\");\n return;\n }\n\n // Detect installation\n const res = (await sendRequest({ type: \"install\" })) as InstallResponse;\n if (res.ok) {\n console.log(`\\nDetected Claude Code installation:`);\n console.log(` Type: ${res.installationType}`);\n console.log(` Binary: ${res.claudeBinaryPath}`);\n console.log(\"\\ncc-lock installed successfully!\");\n } else {\n console.error(`\\nInstallation detection failed: ${res.error}`);\n console.error(\"You can manually configure later.\");\n }\n}\n\nexport async function uninstallCommand() {\n console.log(\"Uninstalling cc-lock...\\n\");\n\n // Check with daemon — it will reject if locked\n try {\n if (await isDaemonRunning()) {\n const res = (await sendRequest({ type: \"uninstall\" })) as UninstallResponse;\n if (!res.ok) {\n console.error(`Cannot uninstall: ${res.error}`);\n process.exit(1);\n }\n console.log(\"Restored original Claude binary.\");\n }\n } catch {\n // Daemon not running, that's ok — proceed with cleanup\n }\n\n if (process.platform === \"win32\") {\n try {\n execSync(`schtasks /delete /tn \"${TASK_SCHEDULER_NAME}\" /f`, {\n stdio: \"ignore\",\n });\n console.log(\"Removed Task Scheduler entry.\");\n } catch {\n // Might not exist\n }\n } else if (process.platform === \"darwin\") {\n try {\n execSync(`launchctl bootout gui/$(id -u) ${LAUNCHD_PLIST_PATH} 2>/dev/null`, {\n stdio: \"ignore\",\n });\n console.log(\"Daemon unloaded from launchd.\");\n } catch {\n // Might not be loaded\n }\n\n if (existsSync(LAUNCHD_PLIST_PATH)) {\n const { unlinkSync } = await import(\"fs\");\n unlinkSync(LAUNCHD_PLIST_PATH);\n console.log(\"Removed launchd plist.\");\n }\n }\n\n console.log(\"\\ncc-lock uninstalled.\");\n}\n","import { sendRequest, isDaemonRunning } from \"../ipc-client.js\";\nimport { parseDuration } from \"../formatters.js\";\nimport { installCommand } from \"./install.js\";\nimport type { LockResponse } from \"@cc-lock/core\";\n\nexport async function lockCommand(duration: string, options: { hard?: boolean } = {}) {\n const minutes = parseDuration(duration);\n if (minutes === null || minutes <= 0) {\n console.error(`Invalid duration: \"${duration}\". Examples: 30m, 2h, 1d`);\n process.exit(1);\n }\n\n if (!(await isDaemonRunning())) {\n console.log(\"Daemon not running — running first-time install...\\n\");\n await installCommand();\n console.log();\n }\n\n const res = (await sendRequest({\n type: \"lock\",\n durationMinutes: minutes,\n hardLock: options.hard ?? false,\n })) as LockResponse;\n\n if (res.ok) {\n if (options.hard) {\n console.log(`\\x1b[31mHard locked!\\x1b[0m Claude Code is locked for ${duration} with no bypass allowed.`);\n } else {\n console.log(`\\x1b[31mLocked!\\x1b[0m Claude Code is now locked for ${duration}.`);\n }\n if (res.lock.expiresAt) {\n const localTime = new Date(res.lock.expiresAt).toLocaleTimeString();\n console.log(`Expires at: ${localTime}`);\n }\n } else {\n console.error(`Failed to lock: ${res.error}`);\n }\n}\n","import { createInterface } from \"readline\";\nimport { execSync } from \"child_process\";\nimport { sendRequest } from \"../ipc-client.js\";\nimport type {\n StatusResponse,\n BypassStartResponse,\n BypassCompleteResponse,\n Challenge,\n} from \"@cc-lock/core\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Like prompt(), but runs stdin in raw mode and silently drops any chunk that\n * arrives with more than one printable character — the unmistakable signature\n * of a terminal paste event. Used for challenge inputs so the user must\n * physically type every character.\n */\nfunction promptNoPaste(question: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(question);\n\n let input = \"\";\n\n const isRaw = !!process.stdin.isRaw;\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding(\"utf8\");\n\n function cleanup() {\n process.stdin.removeListener(\"data\", onData);\n if (!isRaw) process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n\n function onData(chunk: string) {\n const code = chunk.charCodeAt(0);\n\n // Ctrl+C / Ctrl+D\n if (code === 3 || code === 4) {\n process.stdout.write(\"\\n\");\n cleanup();\n process.exit(1);\n }\n\n // Enter\n if (code === 13) {\n process.stdout.write(\"\\n\");\n cleanup();\n resolve(input);\n return;\n }\n\n // Backspace\n if (code === 127 || code === 8) {\n if (input.length > 0) {\n input = input.slice(0, -1);\n process.stdout.write(\"\\b \\b\");\n }\n return;\n }\n\n // Escape sequences (arrow keys, F-keys, etc.) — ignore silently\n if (code === 27) return;\n\n // Paste detection: multiple printable characters arriving in one chunk\n if (chunk.length > 1) {\n process.stdout.write(\" \\x1b[31m[no paste]\\x1b[0m\");\n setTimeout(() => {\n process.stdout.write(`\\r\\x1b[K> ${input}`);\n }, 600);\n return;\n }\n\n // Single printable character\n if (code >= 32) {\n input += chunk;\n process.stdout.write(chunk);\n }\n }\n\n process.stdin.on(\"data\", onData);\n });\n}\n\nfunction sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => {\n let remaining = seconds;\n const interval = setInterval(() => {\n process.stdout.write(`\\rWait: ${remaining}s remaining... `);\n remaining--;\n if (remaining < 0) {\n clearInterval(interval);\n process.stdout.write(\"\\r\" + \" \".repeat(30) + \"\\r\");\n resolve();\n }\n }, 1000);\n });\n}\n\nfunction openBrowser(url: string): void {\n const cmd =\n process.platform === \"darwin\"\n ? `open \"${url}\"`\n : process.platform === \"win32\"\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n try {\n execSync(cmd, { stdio: \"ignore\" });\n } catch {\n // non-fatal — URL is printed to console anyway\n }\n}\n\nasync function runPaymentBypass(paymentOption: {\n amount: number;\n currency: string;\n url: string;\n hasVerification: boolean;\n}): Promise<{ proceed: boolean; stripePaymentIntentId?: string }> {\n const dollars = (paymentOption.amount / 100).toFixed(2);\n\n console.log(`\\nOpening payment URL in browser...`);\n console.log(` ${paymentOption.url}`);\n openBrowser(paymentOption.url);\n\n if (paymentOption.hasVerification) {\n // Stripe path: ask for payment intent ID\n const piId = await prompt(\n `\\nEnter your Stripe Payment Intent ID (pi_...) from the receipt email:\\n> `\n );\n if (!piId.startsWith(\"pi_\")) {\n console.log(\"\\x1b[31mInvalid payment intent ID. Must start with pi_\\x1b[0m\");\n return { proceed: false };\n }\n return { proceed: true, stripePaymentIntentId: piId };\n }\n\n // No verification path: mandatory 30-second wait\n console.log(`\\nMandatory wait before confirming $${dollars} payment...`);\n await sleep(30);\n\n const confirm = await prompt(`Did you complete the $${dollars} payment? [yes/no]\\n> `);\n if (confirm.toLowerCase() !== \"yes\" && confirm.toLowerCase() !== \"y\") {\n console.log(\"Payment not confirmed. Falling through to challenge.\");\n return { proceed: false };\n }\n\n return { proceed: true };\n}\n\nconst DISCOURAGING_MESSAGES = [\n \"You set this lock. You knew this moment would come. Weak.\",\n \"The 'quick fix' will take 4 hours. You know this.\",\n \"Your future self is sighing right now.\",\n \"This is why you can't have nice things.\",\n \"Incredible. You lasted... let's see... not very long.\",\n \"Claude doesn't need you. You need Claude. That's the problem.\",\n \"go touch grass\",\n \"The feature can wait. Your dignity cannot.\",\n \"Past-you set this lock because past-you didn't trust present-you. Past-you was right.\",\n \"Every great developer knows when to stop. This is not that moment for you.\",\n \"You're not being productive. You're being addicted.\",\n \"The code will still be broken tomorrow. You'll just be more tired.\",\n \"Breaking news: local developer can't stick to a self-imposed rule for more than an hour.\",\n \"You locked yourself out for a reason. Try to remember what that reason was.\",\n \"Weak.\",\n \"Not even a personal best. Disappointing.\",\n \"The shim script has more self-control than you do.\",\n \"Somewhere, a rubber duck is judging you.\",\n \"Your plants need water. Your friends miss you. Claude will still be here tomorrow.\",\n \"Is this really the hill you want to die on?\",\n \"You could go outside. Just a thought.\",\n \"The '5 more minutes' to 'midnight' pipeline is fully operational, I see.\",\n \"Bold move. Stupid, but bold.\",\n \"You and I both know this isn't about work.\",\n \"The lock is the boundary. You are the problem.\",\n \"Your therapist would not approve.\",\n \"A lesser person would just disable the whole thing. Oh wait.\",\n];\n\nfunction randomDiscouragingMessage(): string {\n return DISCOURAGING_MESSAGES[Math.floor(Math.random() * DISCOURAGING_MESSAGES.length)]!;\n}\n\nasync function runChallenge(challenge: Challenge): Promise<boolean> {\n if (challenge.cooldownSeconds > 0) {\n console.log(`\\nCooldown: ${challenge.cooldownSeconds}s`);\n await sleep(challenge.cooldownSeconds);\n }\n\n switch (challenge.type) {\n case \"cooldown\":\n return true;\n\n case \"typing\": {\n const reversed = challenge.prompt.split(\"\").reverse().join(\"\");\n console.log(\"\\nType the following string \\x1b[1mBACKWARDS\\x1b[0m (right to left):\");\n console.log(`\\n ${challenge.prompt}\\n`);\n const answer = await promptNoPaste(\"> \");\n if (answer !== reversed) {\n console.log(\"\\x1b[31mMismatch! Bypass failed.\\x1b[0m\");\n return false;\n }\n return true;\n }\n\n case \"math\": {\n console.log(`\\nSolve: ${challenge.prompt} = ?`);\n const answer = await promptNoPaste(\"> \");\n if (answer !== challenge.answer) {\n console.log(`\\x1b[31mWrong! Expected ${challenge.answer}\\x1b[0m`);\n return false;\n }\n return true;\n }\n\n case \"justification\": {\n console.log(`\\n${challenge.prompt}`);\n const answer = await promptNoPaste(\"> \");\n const wordCount = answer.split(/\\s+/).filter(Boolean).length;\n if (wordCount < 50) {\n console.log(`\\x1b[31mToo short! (${wordCount}/50 words)\\x1b[0m`);\n return false;\n }\n return true;\n }\n }\n}\n\nexport async function unlockCommand() {\n // Check if actually locked first\n const status = (await sendRequest({ type: \"status\" })) as StatusResponse;\n\n if (status.lock.status === \"unlocked\") {\n console.log(\"Already unlocked.\");\n return;\n }\n\n if (status.lock.status === \"grace\") {\n console.log(\"Already in grace period - Claude Code is available.\");\n return;\n }\n\n // Hard lock — no bypass allowed\n if (status.lock.hardLock) {\n const expiresAt = status.lock.expiresAt\n ? ` until ${new Date(status.lock.expiresAt).toLocaleTimeString()}`\n : \"\";\n console.error(\n `\\x1b[31mHard lock is active — bypass is not allowed.\\x1b[0m\\nLock expires${expiresAt}.`\n );\n process.exit(1);\n }\n\n // Locked - must complete bypass challenge\n console.log(\"\\n\\x1b[33mBypass Challenge\\x1b[0m\");\n console.log(`Attempt #${status.lock.bypassAttempts + 1}`);\n console.log(`\\x1b[2m${randomDiscouragingMessage()}\\x1b[0m\\n`);\n\n const startRes = (await sendRequest({\n type: \"bypass-start\",\n })) as BypassStartResponse;\n\n if (!startRes.ok) {\n const reason = startRes.error ?? \"No bypass options available.\";\n console.error(`\\nBypass blocked: ${reason}`);\n process.exit(1);\n }\n\n let usePayment = false;\n let stripePaymentIntentId: string | undefined;\n\n if (startRes.paymentOption) {\n const { paymentOption } = startRes;\n const dollars = (paymentOption.amount / 100).toFixed(2);\n const challengesDisabled = startRes.challenges.length === 0;\n\n if (challengesDisabled) {\n console.log(`Challenge bypass is disabled. Payment required ($${dollars}).\\n`);\n const result = await runPaymentBypass(paymentOption);\n if (result.proceed) {\n usePayment = true;\n stripePaymentIntentId = result.stripePaymentIntentId;\n } else {\n console.log(\"\\nBypass cancelled.\");\n process.exit(1);\n }\n } else {\n console.log(\"How would you like to bypass?\");\n console.log(` A) Complete a challenge (free)`);\n console.log(` B) Pay $${dollars} — opens browser for payment`);\n\n const choice = await prompt(\"\\nChoice [A/B]: \");\n\n if (choice.toUpperCase() === \"B\") {\n const result = await runPaymentBypass(paymentOption);\n if (result.proceed) {\n usePayment = true;\n stripePaymentIntentId = result.stripePaymentIntentId;\n }\n // If not proceed, fall through to challenge below\n }\n }\n }\n\n if (!usePayment) {\n for (const challenge of startRes.challenges) {\n const passed = await runChallenge(challenge);\n if (!passed) {\n console.log(\"\\nBypass failed. Try again later.\");\n process.exit(1);\n }\n }\n }\n\n const completeRes = (await sendRequest({\n type: \"bypass-complete\",\n challengeId: startRes.challengeId,\n answer: \"completed\",\n ...(usePayment && { paymentMethod: true }),\n ...(stripePaymentIntentId && { stripePaymentIntentId }),\n })) as BypassCompleteResponse;\n\n if (completeRes.ok) {\n const graceTime = new Date(completeRes.graceExpiresAt!).toLocaleTimeString();\n const graceMinutes = Math.round(\n (new Date(completeRes.graceExpiresAt!).getTime() - Date.now()) / 60_000\n );\n console.log(\n `\\n\\x1b[32mBypass successful!\\x1b[0m You have ${graceMinutes} minutes of access (until ${graceTime}).`\n );\n if (status.lock.expiresAt) {\n console.log(\n `Lock re-engages after grace. Full lock expires at ${new Date(status.lock.expiresAt).toLocaleTimeString()}.`\n );\n }\n } else {\n console.error(`\\nBypass failed: ${completeRes.error}`);\n process.exit(1);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatSchedules } from \"../formatters.js\";\nimport type {\n ScheduleAddResponse,\n ScheduleListResponse,\n ScheduleRemoveResponse,\n ScheduleToggleResponse,\n} from \"@cc-lock/core\";\nimport type { Schedule } from \"@cc-lock/core\";\nimport { createInterface } from \"readline\";\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport async function scheduleAddCommand() {\n console.log(\"Add a new schedule\\n\");\n\n const name = await prompt(\"Name: \");\n const typeStr = await prompt(\"Type (daily/weekdays/weekends/custom): \");\n const type = typeStr as Schedule[\"type\"];\n\n let days: number[] | undefined;\n if (type === \"custom\") {\n const daysStr = await prompt(\"Days (comma-separated, 0=Sun..6=Sat): \");\n days = daysStr.split(\",\").map((s) => parseInt(s.trim(), 10));\n }\n\n const startTime = await prompt(\"Start time (HH:MM): \");\n const endTime = await prompt(\"End time (HH:MM): \");\n\n const res = (await sendRequest({\n type: \"schedule-add\",\n schedule: { name, type, startTime, endTime, days, enabled: true },\n })) as ScheduleAddResponse;\n\n if (res.ok && res.schedule) {\n console.log(`\\nSchedule added: ${res.schedule.id}`);\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n\nexport async function scheduleListCommand() {\n const res = (await sendRequest({\n type: \"schedule-list\",\n })) as ScheduleListResponse;\n console.log(formatSchedules(res.schedules));\n}\n\nexport async function scheduleRemoveCommand(id: string) {\n const res = (await sendRequest({\n type: \"schedule-remove\",\n id,\n })) as ScheduleRemoveResponse;\n\n if (res.ok) {\n console.log(\"Schedule removed.\");\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n\nexport async function scheduleToggleCommand(id: string, enabled: boolean) {\n const res = (await sendRequest({\n type: \"schedule-toggle\",\n id,\n enabled,\n })) as ScheduleToggleResponse;\n\n if (res.ok) {\n console.log(`Schedule ${enabled ? \"enabled\" : \"disabled\"}.`);\n } else {\n console.error(`Failed: ${res.error}`);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport { formatStats } from \"../formatters.js\";\nimport type { StatsResponse, StatsResetResponse } from \"@cc-lock/core\";\n\nexport async function statsCommand(options: { week?: boolean; month?: boolean }) {\n const period = options.month ? \"month\" : options.week ? \"week\" : \"day\";\n const res = (await sendRequest({ type: \"stats\", period })) as StatsResponse;\n console.log(formatStats(res.days));\n}\n\nexport async function statsResetCommand(options: { all?: boolean }) {\n const all = options.all ?? false;\n const scope = all ? \"all stats\" : \"today's stats\";\n const res = (await sendRequest({ type: \"stats-reset\", all })) as StatsResetResponse;\n if (res.ok) {\n console.log(`✓ Reset ${scope}.`);\n } else {\n console.error(`✗ ${res.error ?? \"Reset failed\"}`);\n process.exit(1);\n }\n}\n","import { sendRequest } from \"../ipc-client.js\";\nimport type { ConfigGetResponse, ConfigSetResponse } from \"@cc-lock/core\";\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nconst WEEKEND_PRESETS: Record<string, number[]> = {\n \"sat-sun\": [0, 6],\n \"sun-sat\": [0, 6],\n \"fri-sat\": [5, 6],\n \"sat-fri\": [5, 6],\n};\n\nfunction parseWeekendDays(raw: string): number[] {\n const lower = raw.toLowerCase().replace(/\\s+/g, \"\");\n if (WEEKEND_PRESETS[lower]) return WEEKEND_PRESETS[lower]!;\n const nums = lower.split(\",\").map((s) => parseInt(s, 10));\n if (nums.some((n) => isNaN(n) || n < 0 || n > 6)) {\n throw new Error(\n \"weekendDays must be sat-sun, fri-sat, or comma-separated day numbers (0=Sun … 6=Sat)\"\n );\n }\n return [...new Set(nums)].sort((a, b) => a - b);\n}\n\nexport function formatWeekendDays(days: number[]): string {\n return days.map((d) => DAY_NAMES[d] ?? d).join(\"+\");\n}\n\nconst SETTABLE_KEYS = {\n graceMinutes: {\n description: \"Grace period in minutes after a successful bypass (1–120)\",\n parse(raw: string): number {\n const n = parseInt(raw, 10);\n if (isNaN(n) || n < 1 || n > 120) {\n throw new Error(\"graceMinutes must be an integer between 1 and 120\");\n }\n return n;\n },\n },\n chmodGuard: {\n description: \"Hard mode — removes write permission from the shim (true/false)\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"chmodGuard must be true or false\");\n },\n },\n weekendDays: {\n description: 'Days counted as \"weekend\" for schedules: sat-sun (default), fri-sat, or 0,6',\n parse: parseWeekendDays,\n },\n challengeBypassEnabled: {\n description: \"Allow free challenge-based bypass (true/false). Set false to require payment.\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"challengeBypassEnabled must be true or false\");\n },\n },\n paymentBypassEnabled: {\n description: \"Enable payment bypass mode — pay instead of solving a challenge (true/false)\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"paymentBypassEnabled must be true or false\");\n },\n },\n paymentBypassAmount: {\n description: \"Payment amount in cents, e.g. 500 = $5.00 (min 1)\",\n parse(raw: string): number {\n const n = parseInt(raw, 10);\n if (isNaN(n) || n < 1) {\n throw new Error(\"paymentBypassAmount must be a positive integer (cents)\");\n }\n return n;\n },\n },\n paymentBypassUrl: {\n description: \"Payment URL to open in browser (Stripe link, Venmo, PayPal, Ko-fi, etc.)\",\n parse(raw: string): string {\n return raw;\n },\n },\n paymentBypassStripeKey: {\n description: \"Optional Stripe secret key (sk_...) for payment intent verification\",\n parse(raw: string): string {\n return raw;\n },\n },\n killSessionsOnLock: {\n description: \"Kill running claude sessions when a lock is engaged (true/false)\",\n parse(raw: string): boolean {\n if (raw === \"true\" || raw === \"1\" || raw === \"yes\") return true;\n if (raw === \"false\" || raw === \"0\" || raw === \"no\") return false;\n throw new Error(\"killSessionsOnLock must be true or false\");\n },\n },\n} as const;\n\ntype SettableKey = keyof typeof SETTABLE_KEYS;\n\nexport async function configGetCommand() {\n const res = (await sendRequest({ type: \"config-get\" })) as ConfigGetResponse;\n const { config } = res;\n console.log(\"Current configuration:\");\n console.log(` installationType : ${config.installationType}`);\n console.log(` claudeBinaryPath : ${config.claudeBinaryPath}`);\n console.log(` claudeShimPath : ${config.claudeShimPath}`);\n console.log(` graceMinutes : ${config.graceMinutes}`);\n console.log(` chmodGuard : ${config.chmodGuard}`);\n console.log(` weekendDays : ${formatWeekendDays(config.weekendDays ?? [0, 6])}`);\n console.log(` challengeBypassEnabled : ${config.challengeBypassEnabled ?? true}`);\n console.log(` killSessionsOnLock : ${config.killSessionsOnLock ?? false}`);\n console.log(` paymentBypassEnabled : ${config.paymentBypassEnabled ?? false}`);\n if (config.paymentBypassEnabled) {\n const cents = config.paymentBypassAmount ?? 500;\n console.log(` paymentBypassAmount : ${cents} cents ($${(cents / 100).toFixed(2)})`);\n console.log(` paymentBypassUrl : ${config.paymentBypassUrl ?? \"(not set)\"}`);\n console.log(\n ` paymentBypassStripeKey : ${config.paymentBypassStripeKey ? \"(configured)\" : \"(not set)\"}`\n );\n }\n console.log();\n console.log(\"Settable keys:\");\n for (const [key, meta] of Object.entries(SETTABLE_KEYS)) {\n console.log(` ${key.padEnd(16)} ${meta.description}`);\n }\n}\n\nexport async function configSetCommand(key: string, rawValue: string) {\n if (!(key in SETTABLE_KEYS)) {\n const valid = Object.keys(SETTABLE_KEYS).join(\", \");\n throw new Error(`Unknown config key \"${key}\". Settable keys: ${valid}`);\n }\n\n const meta = SETTABLE_KEYS[key as SettableKey];\n const value = meta.parse(rawValue);\n\n const res = (await sendRequest({ type: \"config-set\", key, value })) as ConfigSetResponse;\n if (!res.ok) {\n throw new Error(res.error ?? \"config-set failed\");\n }\n\n console.log(`✓ ${key} = ${value}`);\n}\n"],"mappings":"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","names":["resolve","execSync","resolve","execSync","createInterface","prompt","resolve","config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-lock",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Lock yourself out of Claude Code CLI — productivity enforcer with scheduling, usage stats, and bypass challenges",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -32,19 +32,20 @@
32
32
  "bin": {
33
33
  "cc-lock": "dist/index.js"
34
34
  },
35
+ "scripts": {
36
+ "prepack": "cp ../../LICENSE .",
37
+ "build": "tsup",
38
+ "dev": "tsup --watch",
39
+ "clean": "rm -rf dist"
40
+ },
35
41
  "dependencies": {
36
- "commander": "^12.0.0",
37
- "@cc-lock/core": "0.1.0",
38
- "@cc-lock/daemon": "0.1.0",
39
- "@cc-lock/tui": "0.1.0"
42
+ "@cc-lock/core": "workspace:*",
43
+ "@cc-lock/daemon": "workspace:*",
44
+ "@cc-lock/tui": "workspace:*",
45
+ "commander": "^12.0.0"
40
46
  },
41
47
  "devDependencies": {
42
48
  "tsup": "^8.0.0",
43
49
  "typescript": "^5.4.0"
44
- },
45
- "scripts": {
46
- "build": "tsup",
47
- "dev": "tsup --watch",
48
- "clean": "rm -rf dist"
49
50
  }
50
- }
51
+ }