claude-lock 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-GSDKZKKT.js +36 -0
- package/dist/chunk-GSDKZKKT.js.map +1 -0
- package/dist/dist-56C5YEZV.js +1007 -0
- package/dist/dist-56C5YEZV.js.map +1 -0
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/package.json +14 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../tui/src/index.tsx","../../tui/src/App.tsx","../../tui/src/hooks/useDaemon.ts","../../tui/src/screens/Dashboard.tsx","../../tui/src/components/StatusBadge.tsx","../../tui/src/components/CountdownTimer.tsx","../../tui/src/screens/Stats.tsx","../../tui/src/screens/Schedules.tsx","../../tui/src/components/TextInput.tsx","../../tui/src/components/SelectInput.tsx","../../tui/src/components/MultiSelect.tsx","../../tui/src/screens/Settings.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink\";\nimport { App, ADDICT_BANNER } from \"./App.js\";\n\nexport async function launchTui() {\n // Print the banner once as static output before Ink starts managing the\n // terminal. This keeps it out of Ink's managed area so it is never redrawn.\n process.stdout.write(ADDICT_BANNER.join(\"\\n\") + \"\\n\\n\");\n const { waitUntilExit } = render(React.createElement(App));\n await waitUntilExit();\n}\n","import React, { useState } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport { useDaemonStatus } from \"./hooks/useDaemon.js\";\nimport { Dashboard } from \"./screens/Dashboard.js\";\nimport { StatsScreen } from \"./screens/Stats.js\";\nimport { SchedulesScreen } from \"./screens/Schedules.js\";\nimport { SettingsScreen } from \"./screens/Settings.js\";\n\ntype Tab = \"dashboard\" | \"stats\" | \"schedules\" | \"settings\";\n\nconst TABS: { key: string; id: Tab; label: string }[] = [\n { key: \"d\", id: \"dashboard\", label: \"Dashboard\" },\n { key: \"s\", id: \"stats\", label: \"Stats\" },\n { key: \"c\", id: \"schedules\", label: \"Schedules\" },\n { key: \"t\", id: \"settings\", label: \"Settings\" },\n];\n\nexport const ADDICT_BANNER = [\n \" ██╗ ██╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗\",\n \" ╚██╗ ██╔╝ ██╔═══██╗ ██║ ██║ ██╔══██╗ ██╔══██╗ ██╔════╝\",\n \" ╚████╔╝ ██║ ██║ ██║ ██║ ███████║ ██████╔╝ █████╗ \",\n \" ╚██╔╝ ██║ ██║ ██║ ██║ ██╔══██║ ██╔══██╗ ██╔══╝ \",\n \" ██║ ╚██████╔╝ ╚██████╔╝ ██║ ██║ ██║ ██║ ███████╗\",\n \" ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝\",\n \"\",\n \" █████╗ ███╗ ██╗ █████╗ ██████╗ ██████╗ ██╗ ██████╗ ████████╗\",\n \" ██╔══██╗ ████╗ ██║ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██║ ██╔════╝ ╚══██╔══╝\",\n \" ███████║ ██╔██╗ ██║ ███████║ ██║ ██║ ██║ ██║ ██║ ██║ ██║ \",\n \" ██╔══██║ ██║╚██╗██║ ██╔══██║ ██║ ██║ ██║ ██║ ██║ ██║ ██║ \",\n \" ██║ ██║ ██║ ╚████║ ██║ ██║ ██████╔╝ ██████╔╝ ██║ ╚██████╗ ██║ \",\n \" ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ \",\n];\n\nconst LOGO_BODY = [\n \" ╭──────╮\",\n \" │ │\",\n \" ╔═══╧══════╧═══╗\",\n \" ║ ║\",\n \" ║ cc · lock ║\",\n \" ║ ║\",\n \" ║ ○ ○ ○ ○ ║\",\n \" ╚══════════════╝\",\n];\n\nconst LOGO_LOCKED_BODY = [\n \" ╭──────╮\",\n \" ╰──────╯\",\n \" ╔═══╧══════╧═══╗\",\n \" ║ ║\",\n \" ║ cc · lock ║\",\n \" ║ ║\",\n \" ║ ○ ○ ○ ○ ║\",\n \" ╚══════════════╝\",\n];\n\nexport function App() {\n const [tab, setTab] = useState<Tab>(\"dashboard\");\n const [formActive, setFormActive] = useState(false);\n const { lock, config, todayUsage, connected, refresh } = useDaemonStatus();\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (input === \"q\" || (key.ctrl && input === \"c\")) {\n exit();\n return;\n }\n\n // Tab switching (only when not in a sub-mode)\n for (const t of TABS) {\n if (input === t.key && tab !== t.id) {\n setTab(t.id);\n return;\n }\n }\n }, { isActive: !formActive });\n\n const lockColor = !connected\n ? \"gray\"\n : lock?.status === \"locked\"\n ? \"red\"\n : lock?.status === \"grace\"\n ? \"yellow\"\n : \"green\";\n\n const tagline = !connected\n ? \" connecting...\"\n : lock?.status === \"locked\"\n ? \" you locked yourself. good.\"\n : lock?.status === \"grace\"\n ? \" enjoy your grace period.\"\n : \" I can stop whenever I want.\";\n\n return (\n <Box flexDirection=\"column\">\n {/* Logo */}\n <Box flexDirection=\"column\" paddingX={1}>\n {(lock?.status === \"locked\" ? LOGO_LOCKED_BODY : LOGO_BODY).map((line, i) => (\n <Text key={i} color={lockColor}>{line}</Text>\n ))}\n <Text color={lockColor} dimColor>{tagline}</Text>\n </Box>\n\n {/* Tab bar */}\n <Box borderStyle=\"single\" paddingX={1}>\n {TABS.map((t, i) => (\n <React.Fragment key={t.id}>\n {i > 0 && <Text> | </Text>}\n <Text\n bold={tab === t.id}\n color={tab === t.id ? \"green\" : undefined}\n dimColor={tab !== t.id}\n >\n [{t.key.toUpperCase()}] {t.label}\n </Text>\n </React.Fragment>\n ))}\n <Text> | </Text>\n <Text dimColor>[Q] Quit</Text>\n </Box>\n\n {/* Content */}\n {tab === \"dashboard\" && (\n <Dashboard\n lock={lock}\n todayUsage={todayUsage}\n connected={connected}\n onRefresh={refresh}\n />\n )}\n {tab === \"stats\" && <StatsScreen />}\n {tab === \"schedules\" && <SchedulesScreen onFormActiveChange={setFormActive} />}\n {tab === \"settings\" && <SettingsScreen config={config} lock={lock} onRefresh={refresh} onFormActiveChange={setFormActive} />}\n </Box>\n );\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { createConnection } from \"net\";\nimport { SOCKET_PATH } from \"@cc-lock/core\";\nimport type { Request, Response, StatusResponse, StatsResponse, ScheduleListResponse } from \"@cc-lock/core\";\nimport type { LockState, Config, DailyStats, Schedule } from \"@cc-lock/core\";\n\nfunction sendRequest(req: Request): Promise<Response> {\n return new Promise((resolve, reject) => {\n const socket = createConnection(SOCKET_PATH);\n let buffer = \"\";\n socket.on(\"connect\", () => socket.write(JSON.stringify(req) + \"\\n\"));\n socket.on(\"data\", (data) => {\n buffer += data.toString();\n const idx = buffer.indexOf(\"\\n\");\n if (idx !== -1) {\n resolve(JSON.parse(buffer.slice(0, idx)) as Response);\n socket.end();\n }\n });\n socket.on(\"error\", reject);\n socket.setTimeout(5000, () => { socket.destroy(); reject(new Error(\"Timeout\")); });\n });\n}\n\nexport function useDaemonStatus(pollMs = 2000) {\n const [lock, setLock] = useState<LockState | null>(null);\n const [config, setConfig] = useState<Config | null>(null);\n const [todayUsage, setTodayUsage] = useState(0);\n const [connected, setConnected] = useState<boolean | null>(null); // null = not yet attempted\n\n // Track previous serialised values in refs so setState is only called when\n // something actually changed — avoids React 18 bail-out re-renders in Ink.\n const prev = useRef({ lock: \"\", config: \"\", todayUsage: -1, connected: null as boolean | null });\n\n const refresh = useCallback(async () => {\n try {\n const res = (await sendRequest({ type: \"status\" })) as StatusResponse;\n\n const lockStr = JSON.stringify(res.lock);\n if (lockStr !== prev.current.lock) { prev.current.lock = lockStr; setLock(res.lock); }\n\n const configStr = JSON.stringify(res.config);\n if (configStr !== prev.current.config) { prev.current.config = configStr; setConfig(res.config); }\n\n if (res.todayUsageSeconds !== prev.current.todayUsage) { prev.current.todayUsage = res.todayUsageSeconds; setTodayUsage(res.todayUsageSeconds); }\n\n if (prev.current.connected !== true) { prev.current.connected = true; setConnected(true); }\n } catch {\n if (prev.current.connected !== false) { prev.current.connected = false; setConnected(false); }\n }\n }, []);\n\n useEffect(() => {\n refresh();\n const interval = setInterval(refresh, pollMs);\n return () => clearInterval(interval);\n }, [refresh, pollMs]);\n\n return { lock, config, todayUsage, connected, refresh };\n}\n\nexport function useStats(period: \"day\" | \"week\" | \"month\" = \"week\") {\n const [days, setDays] = useState<DailyStats[]>([]);\n const [refreshKey, setRefreshKey] = useState(0);\n\n useEffect(() => {\n sendRequest({ type: \"stats\", period })\n .then((res) => setDays((res as StatsResponse).days))\n .catch(() => {});\n }, [period, refreshKey]);\n\n const refresh = useCallback(() => setRefreshKey((k) => k + 1), []);\n\n return { days, refresh };\n}\n\nexport function useSchedules() {\n const [schedules, setSchedules] = useState<Schedule[]>([]);\n\n const refresh = useCallback(async () => {\n try {\n const res = (await sendRequest({ type: \"schedule-list\" })) as ScheduleListResponse;\n setSchedules(res.schedules);\n } catch {}\n }, []);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n return { schedules, refresh };\n}\n\nexport { sendRequest };\n","import React, { useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\nimport { StatusBadge } from \"../components/StatusBadge.js\";\nimport { CountdownTimer } from \"../components/CountdownTimer.js\";\nimport { sendRequest } from \"../hooks/useDaemon.js\";\nimport type { LockState, LockResponse } from \"@cc-lock/core\";\n\ninterface Props {\n lock: LockState | null;\n todayUsage: number;\n connected: boolean | null;\n onRefresh: () => void;\n}\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const m = Math.floor(seconds / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nconst LOCK_PRESETS = [\n { key: \"1\", label: \"30m\", minutes: 30 },\n { key: \"2\", label: \"1h\", minutes: 60 },\n { key: \"3\", label: \"2h\", minutes: 120 },\n { key: \"4\", label: \"4h\", minutes: 240 },\n];\n\nexport function Dashboard({ lock, todayUsage, connected, onRefresh }: Props) {\n const [mode, setMode] = useState<\"normal\" | \"locking\">(\"normal\");\n const [message, setMessage] = useState<string | null>(null);\n\n useInput((input, key) => {\n if (key.escape) {\n setMode(\"normal\");\n setMessage(null);\n return;\n }\n\n if (mode === \"locking\") {\n const preset = LOCK_PRESETS.find((p) => p.key === input);\n if (preset) {\n sendRequest({ type: \"lock\", durationMinutes: preset.minutes }).then(\n (res) => {\n const lr = res as LockResponse;\n if (lr.ok) {\n setMessage(`Locked for ${preset.label}`);\n } else {\n setMessage(`Error: ${lr.error}`);\n }\n setMode(\"normal\");\n onRefresh();\n }\n );\n }\n return;\n }\n\n // Normal mode shortcuts\n if (input === \"l\" && lock?.status === \"unlocked\") {\n setMode(\"locking\");\n setMessage(null);\n return;\n }\n if (input === \"r\" && lock?.status === \"unlocked\") {\n sendRequest({ type: \"stats-reset\" })\n .then(() => onRefresh())\n .catch(() => {});\n }\n });\n\n if (connected === null) {\n return (\n <Box padding={1}>\n <Text dimColor>Connecting to daemon...</Text>\n </Box>\n );\n }\n\n if (!connected) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\" bold>\n Daemon not connected\n </Text>\n <Text>Run `cc-lock install` to set up the daemon.</Text>\n </Box>\n );\n }\n\n if (!lock) {\n return (\n <Box padding={1}>\n <Text>Loading...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold>Dashboard</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text>Status: </Text>\n <StatusBadge status={lock.status} hardLock={lock.hardLock} />\n </Box>\n\n {lock.status === \"locked\" && lock.expiresAt && (\n <Box marginBottom={1} flexDirection=\"column\">\n <CountdownTimer expiresAt={lock.expiresAt} />\n <Text dimColor>\n Expires at{\" \"}\n {new Date(lock.expiresAt).toLocaleTimeString()}\n </Text>\n {!lock.hardLock && <Text>Bypass attempts: {lock.bypassAttempts}</Text>}\n {lock.hardLock && <Text dimColor>No bypass allowed</Text>}\n {!lock.hardLock && (\n <Text dimColor>Run `cc-lock unlock` to bypass</Text>\n )}\n </Box>\n )}\n\n {lock.status === \"grace\" && lock.graceExpiresAt && (\n <Box marginBottom={1} flexDirection=\"column\">\n <CountdownTimer\n expiresAt={lock.graceExpiresAt}\n label=\"Grace expires in\"\n />\n <Text dimColor>\n Lock re-engages at{\" \"}\n {new Date(lock.graceExpiresAt).toLocaleTimeString()}\n </Text>\n </Box>\n )}\n\n <Box marginBottom={1}>\n <Text>\n Today's usage:{\" \"}\n <Text bold>{formatDuration(todayUsage)}</Text>\n </Text>\n </Box>\n\n {lock.status === \"unlocked\" && (lock.pendingResumeKeys?.length ?? 0) > 0 && (\n <Box marginBottom={1} flexDirection=\"column\">\n <Text bold>Sessions to resume:</Text>\n {lock.pendingResumeKeys!.map((key) => (\n <Text key={key} dimColor> claude --resume {key}</Text>\n ))}\n </Box>\n )}\n\n {message && (\n <Box marginBottom={1}>\n <Text color=\"yellow\">{message}</Text>\n </Box>\n )}\n\n {mode === \"locking\" ? (\n <Box borderStyle=\"round\" paddingX={1} flexDirection=\"column\">\n <Text bold>Lock for how long?</Text>\n <Box marginTop={1}>\n {LOCK_PRESETS.map((p) => (\n <Text key={p.key}>\n [{p.key}] {p.label}{\" \"}\n </Text>\n ))}\n <Text dimColor>[Esc] Cancel</Text>\n </Box>\n </Box>\n ) : (\n <Box borderStyle=\"single\" paddingX={1}>\n <Text dimColor>\n {lock.status === \"unlocked\" ? \"[L] Lock [R] Reset today \" : \"\"}\n [Q] Quit\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\nimport type { LockStatus } from \"@cc-lock/core\";\n\ninterface Props {\n status: LockStatus;\n hardLock?: boolean;\n}\n\nexport function StatusBadge({ status, hardLock }: Props) {\n switch (status) {\n case \"unlocked\":\n return <Text color=\"green\" bold>● UNLOCKED</Text>;\n case \"locked\":\n return hardLock\n ? <Text color=\"red\" bold>● HARD LOCKED</Text>\n : <Text color=\"red\" bold>● LOCKED</Text>;\n case \"grace\":\n return <Text color=\"yellow\" bold>● GRACE PERIOD</Text>;\n }\n}\n","import React from \"react\";\nimport { Text } from \"ink\";\n\ninterface Props {\n expiresAt: string;\n label?: string;\n}\n\nfunction formatRemaining(ms: number): string {\n if (ms <= 0) return \"expired\";\n const totalSec = Math.floor(ms / 1000);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n if (h > 0) return `${h}h ${m}m ${s}s`;\n if (m > 0) return `${m}m ${s}s`;\n return `${s}s`;\n}\n\nexport function CountdownTimer({ expiresAt, label = \"Expires in\" }: Props) {\n const remaining = new Date(expiresAt).getTime() - Date.now();\n const color = remaining < 60000 ? \"red\" : remaining < 300000 ? \"yellow\" : \"white\";\n\n return (\n <Text>\n {label}: <Text color={color} bold>{formatRemaining(remaining)}</Text>\n </Text>\n );\n}\n","import React, { useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\nimport { useStats, sendRequest } from \"../hooks/useDaemon.js\";\n\nfunction formatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const m = Math.floor(seconds / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n return `${h}h ${m % 60}m`;\n}\n\nconst PERIODS = [\n { key: \"1\", id: \"day\" as const, label: \"Today\" },\n { key: \"2\", id: \"week\" as const, label: \"Week\" },\n { key: \"3\", id: \"month\" as const, label: \"Month\" },\n];\n\nexport function StatsScreen() {\n const [period, setPeriod] = useState<\"day\" | \"week\" | \"month\">(\"week\");\n const [confirmMode, setConfirmMode] = useState<null | \"today\" | \"all\">(null);\n const { days, refresh } = useStats(period);\n\n useInput((input, key) => {\n if (confirmMode !== null) {\n if (input.toLowerCase() === \"y\") {\n sendRequest({ type: \"stats-reset\", all: confirmMode === \"all\" })\n .then(() => refresh())\n .catch(() => {});\n setConfirmMode(null);\n } else if (input.toLowerCase() === \"n\" || key.escape) {\n setConfirmMode(null);\n }\n return;\n }\n\n const p = PERIODS.find((p) => p.key === input);\n if (p) {\n setPeriod(p.id);\n return;\n }\n\n if (input === \"r\") setConfirmMode(\"today\");\n else if (input === \"x\") setConfirmMode(\"all\");\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 const maxSeconds = Math.max(...days.map((d) => d.totalSeconds), 1);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold>Usage Statistics </Text>\n {PERIODS.map((p) => (\n <Text key={p.key} color={period === p.id ? \"green\" : undefined} bold={period === p.id}>\n [{p.key}] {p.label}{\" \"}\n </Text>\n ))}\n </Box>\n\n {days.length === 0 ? (\n <Text dimColor>No usage data for this period.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {/* Bar chart */}\n {days.map((day) => {\n const barWidth = Math.max(\n 1,\n Math.round((day.totalSeconds / maxSeconds) * 40)\n );\n const bar = \"█\".repeat(barWidth);\n const dayLabel = day.date.slice(5); // MM-DD\n return (\n <Box key={day.date}>\n <Text dimColor>{dayLabel} </Text>\n <Text color=\"green\">{bar}</Text>\n <Text> {formatDuration(day.totalSeconds)}</Text>\n </Box>\n );\n })}\n\n {/* Summary */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>\n Total: {formatDuration(totalSeconds)} across {totalSessions}{\" \"}\n session{totalSessions !== 1 ? \"s\" : \"\"}\n </Text>\n {totalBypasses > 0 && (\n <Text color=\"yellow\">Bypasses: {totalBypasses}</Text>\n )}\n {days.length > 1 && (\n <Text dimColor>\n Avg: {formatDuration(Math.round(totalSeconds / days.length))}/day\n </Text>\n )}\n </Box>\n </Box>\n )}\n\n {/* Confirm prompt */}\n {confirmMode !== null && (\n <Box marginTop={1} borderStyle=\"round\" paddingX={1}>\n <Text color=\"yellow\">\n {confirmMode === \"today\" ? \"Reset today's stats?\" : \"Reset ALL stats?\"}{\" \"}\n </Text>\n <Text>[Y] Yes [N/Esc] Cancel</Text>\n </Box>\n )}\n\n {/* Footer */}\n {confirmMode === null && (\n <Box marginTop={1} borderStyle=\"single\" paddingX={1}>\n <Text dimColor>[R] Reset today [X] Reset all</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\nimport { useSchedules, sendRequest } from \"../hooks/useDaemon.js\";\nimport { TextInput } from \"../components/TextInput.js\";\nimport { SelectInput } from \"../components/SelectInput.js\";\nimport { MultiSelect } from \"../components/MultiSelect.js\";\nimport type { Schedule } from \"@cc-lock/core\";\nimport type { ScheduleAddResponse, ScheduleToggleResponse, ScheduleRemoveResponse } from \"@cc-lock/core\";\n\nconst DAY_NAMES = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\nconst TYPE_OPTIONS = [\n { label: \"Daily (every day)\", value: \"daily\" },\n { label: \"Weekdays (Mon–Fri)\", value: \"weekdays\" },\n { label: \"Weekends (Sat–Sun)\", value: \"weekends\" },\n { label: \"Custom days\", value: \"custom\" },\n];\n\nconst DAY_OPTIONS = DAY_NAMES.map((name, i) => ({ label: name, value: String(i) }));\n\nfunction isValidTime(t: string): boolean {\n if (!/^\\d{2}:\\d{2}$/.test(t)) return false;\n const [h, m] = t.split(\":\").map(Number);\n return h >= 0 && h <= 23 && m >= 0 && m <= 59;\n}\n\ntype Mode = \"list\" | \"confirm-delete\" | \"add\";\n\ninterface Props {\n onFormActiveChange: (active: boolean) => void;\n}\n\nexport function SchedulesScreen({ onFormActiveChange }: Props) {\n const { schedules, refresh } = useSchedules();\n const [mode, setMode] = useState<Mode>(\"list\");\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n // Wizard state\n const [step, setStep] = useState(0);\n const [name, setName] = useState(\"\");\n const [typeIdx, setTypeIdx] = useState(0);\n const [startTime, setStartTime] = useState(\"\");\n const [endTime, setEndTime] = useState(\"\");\n const [wizardError, setWizardError] = useState<string | null>(null);\n\n // Clamp cursor when list shrinks\n useEffect(() => {\n if (selectedIdx >= schedules.length && schedules.length > 0) {\n setSelectedIdx(schedules.length - 1);\n }\n }, [schedules.length, selectedIdx]);\n\n const enterList = () => {\n setMode(\"list\");\n onFormActiveChange(false);\n };\n\n const cancelWizard = () => {\n setMode(\"list\");\n onFormActiveChange(false);\n setStep(0);\n setName(\"\");\n setTypeIdx(0);\n setStartTime(\"\");\n setEndTime(\"\");\n setWizardError(null);\n };\n\n const submitWizard = (days: number[]) => {\n const scheduleType = TYPE_OPTIONS[typeIdx].value as Schedule[\"type\"];\n const schedule: Omit<Schedule, \"id\"> = {\n name: name.trim(),\n type: scheduleType,\n startTime,\n endTime,\n enabled: true,\n ...(scheduleType === \"custom\" ? { days } : {}),\n };\n sendRequest({ type: \"schedule-add\", schedule })\n .then((res) => {\n const r = res as ScheduleAddResponse;\n if (!r.ok) {\n setWizardError(r.error ?? \"Failed to add schedule\");\n return;\n }\n refresh();\n cancelWizard();\n })\n .catch((err: unknown) => {\n setWizardError(err instanceof Error ? err.message : \"Unknown error\");\n });\n };\n\n // List / confirm-delete input handler\n useInput(\n (input, key) => {\n if (mode === \"confirm-delete\") {\n if (input.toLowerCase() === \"y\") {\n const s = schedules[selectedIdx];\n if (!s) { enterList(); return; }\n sendRequest({ type: \"schedule-remove\", id: s.id })\n .then((res) => {\n const r = res as ScheduleRemoveResponse;\n if (!r.ok) {\n // nothing to do, just go back\n }\n refresh();\n })\n .catch(() => {})\n .finally(() => enterList());\n } else if (input.toLowerCase() === \"n\" || key.escape) {\n enterList();\n }\n return;\n }\n\n // mode === \"list\"\n if (key.upArrow) {\n setSelectedIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((i) => Math.min(schedules.length - 1, i + 1));\n return;\n }\n // Space or Shift+T to toggle\n if ((input === \" \" || input === \"T\") && schedules.length > 0) {\n const s = schedules[selectedIdx];\n if (!s) return;\n sendRequest({ type: \"schedule-toggle\", id: s.id, enabled: !s.enabled })\n .then((res) => {\n const r = res as ScheduleToggleResponse;\n if (r.ok) refresh();\n })\n .catch(() => {});\n return;\n }\n // Shift+D to delete\n if (input === \"D\" && schedules.length > 0) {\n setMode(\"confirm-delete\");\n onFormActiveChange(true);\n return;\n }\n // a to add\n if (input === \"a\") {\n setStep(0);\n setName(\"\");\n setTypeIdx(0);\n setStartTime(\"\");\n setEndTime(\"\");\n setWizardError(null);\n setMode(\"add\");\n onFormActiveChange(true);\n return;\n }\n },\n { isActive: mode !== \"add\" }\n );\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold>Schedules</Text>\n </Box>\n\n {/* ── LIST ── */}\n {mode !== \"add\" && (\n <>\n {schedules.length === 0 ? (\n <Text dimColor>No schedules configured.</Text>\n ) : (\n <Box flexDirection=\"column\">\n {schedules.map((s, i) => (\n <Box key={s.id} marginBottom={1} flexDirection=\"column\">\n <Box>\n <Text color={i === selectedIdx ? \"green\" : undefined}>\n {i === selectedIdx ? \"▶ \" : \" \"}\n </Text>\n <Text color={s.enabled ? \"green\" : \"red\"}>\n {s.enabled ? \"●\" : \"○\"}{\" \"}\n </Text>\n <Text bold={i === selectedIdx}>{s.name}</Text>\n <Text dimColor> {s.id.slice(0, 10)}</Text>\n </Box>\n <Box paddingLeft={4}>\n <Text>\n {s.startTime} – {s.endTime}\n {\" \"}\n <Text dimColor>\n {s.type === \"custom\" && s.days\n ? s.days.map((d) => DAY_NAMES[d]).join(\", \")\n : s.type}\n </Text>\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n )}\n\n {/* Confirm-delete prompt */}\n {mode === \"confirm-delete\" && schedules[selectedIdx] && (\n <Box marginTop={1} borderStyle=\"round\" paddingX={1} flexDirection=\"column\">\n <Text color=\"yellow\">\n Delete \"{schedules[selectedIdx]!.name}\"?\n </Text>\n <Text>[Y] Delete [N/Esc] Cancel</Text>\n </Box>\n )}\n\n {/* Footer */}\n {mode === \"list\" && (\n <Box marginTop={1} borderStyle=\"single\" paddingX={1}>\n <Text dimColor>\n [↑/↓] Navigate{\" \"}\n [Space/T] Toggle{\" \"}\n [D] Delete{\" \"}\n [A] Add\n </Text>\n </Box>\n )}\n </>\n )}\n\n {/* ── ADD WIZARD ── */}\n {mode === \"add\" && (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>New Schedule</Text>\n <Text dimColor> [Esc] Cancel</Text>\n </Box>\n\n {wizardError && (\n <Box marginBottom={1}>\n <Text color=\"red\">{wizardError}</Text>\n </Box>\n )}\n\n {/* Step 0: Name */}\n {step === 0 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Step 1/4 – Name</Text>\n <TextInput\n label=\"Name:\"\n value={name}\n onChange={(v) => { setName(v); setWizardError(null); }}\n onSubmit={(v) => {\n if (!v.trim()) { setWizardError(\"Name is required\"); return; }\n setWizardError(null);\n setStep(1);\n }}\n onCancel={cancelWizard}\n placeholder=\"e.g. Morning focus\"\n />\n </Box>\n )}\n\n {/* Step 1: Type */}\n {step === 1 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Step 2/4 – Type</Text>\n <SelectInput\n options={TYPE_OPTIONS}\n selectedIndex={typeIdx}\n onSelect={(idx) => {\n setTypeIdx(idx);\n setWizardError(null);\n setStep(2);\n }}\n onCancel={cancelWizard}\n />\n </Box>\n )}\n\n {/* Step 2: Start time */}\n {step === 2 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Step 3/4 – Start time (HH:MM)</Text>\n <TextInput\n label=\"Start:\"\n value={startTime}\n onChange={(v) => { setStartTime(v); setWizardError(null); }}\n onSubmit={(v) => {\n if (!isValidTime(v)) { setWizardError(\"Enter time as HH:MM (e.g. 09:00)\"); return; }\n setWizardError(null);\n setStep(3);\n }}\n onCancel={cancelWizard}\n placeholder=\"09:00\"\n />\n </Box>\n )}\n\n {/* Step 3: End time */}\n {step === 3 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Step 4/4 – End time (HH:MM)</Text>\n <TextInput\n label=\"End:\"\n value={endTime}\n onChange={(v) => { setEndTime(v); setWizardError(null); }}\n onSubmit={(v) => {\n if (!isValidTime(v)) { setWizardError(\"Enter time as HH:MM (e.g. 17:00)\"); return; }\n if (v <= startTime) { setWizardError(\"End time must be after start time\"); return; }\n setWizardError(null);\n const scheduleType = TYPE_OPTIONS[typeIdx].value;\n if (scheduleType === \"custom\") {\n setStep(4);\n } else {\n submitWizard([]);\n }\n }}\n onCancel={cancelWizard}\n placeholder=\"17:00\"\n />\n </Box>\n )}\n\n {/* Step 4: Days (custom only) */}\n {step === 4 && (\n <Box flexDirection=\"column\">\n <Text dimColor>Select days</Text>\n <MultiSelect\n options={DAY_OPTIONS}\n selected={[]}\n onConfirm={(vals) => submitWizard(vals.map(Number))}\n onCancel={cancelWizard}\n />\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n}\n","import React from \"react\";\nimport { Text, Box, useInput } from \"ink\";\n\ninterface Props {\n value: string;\n onChange: (value: string) => void;\n onSubmit: (value: string) => void;\n onCancel: () => void;\n placeholder?: string;\n label?: string;\n}\n\nexport function TextInput({ value, onChange, onSubmit, onCancel, placeholder, label }: Props) {\n useInput((input, key) => {\n if (key.return) {\n onSubmit(value);\n return;\n }\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.backspace || key.delete) {\n onChange(value.slice(0, -1));\n return;\n }\n if (input && !key.ctrl && !key.meta) {\n onChange(value + input);\n }\n });\n\n const displayValue = value !== \"\" ? value : (placeholder ?? \"\");\n const displayColor = value !== \"\" ? undefined : \"gray\";\n\n return (\n <Box>\n {label && <Text>{label} </Text>}\n <Text color={displayColor}>{displayValue}█</Text>\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\n\ninterface Option {\n label: string;\n value: string;\n}\n\ninterface Props {\n options: Option[];\n selectedIndex: number;\n onSelect: (index: number) => void;\n onCancel: () => void;\n}\n\nexport function SelectInput({ options, selectedIndex: initialIndex, onSelect, onCancel }: Props) {\n const [idx, setIdx] = useState(initialIndex);\n\n useInput((_input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.return) {\n onSelect(idx);\n return;\n }\n if (key.upArrow) {\n setIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setIdx((i) => Math.min(options.length - 1, i + 1));\n return;\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((opt, i) => (\n <Text key={opt.value} color={i === idx ? \"green\" : undefined}>\n {i === idx ? \"▶ \" : \" \"}\n {opt.label}\n </Text>\n ))}\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\n\ninterface Option {\n label: string;\n value: string;\n}\n\ninterface Props {\n options: Option[];\n selected: string[];\n onConfirm: (selected: string[]) => void;\n onCancel: () => void;\n}\n\nexport function MultiSelect({ options, selected: initialSelected, onConfirm, onCancel }: Props) {\n const [idx, setIdx] = useState(0);\n const [selected, setSelected] = useState<Set<string>>(new Set(initialSelected));\n\n useInput((input, key) => {\n if (key.escape) {\n onCancel();\n return;\n }\n if (key.return) {\n onConfirm([...selected]);\n return;\n }\n if (key.upArrow) {\n setIdx((i) => Math.max(0, i - 1));\n return;\n }\n if (key.downArrow) {\n setIdx((i) => Math.min(options.length - 1, i + 1));\n return;\n }\n if (input === \" \") {\n const val = options[idx].value;\n setSelected((s) => {\n const next = new Set(s);\n if (next.has(val)) next.delete(val);\n else next.add(val);\n return next;\n });\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((opt, i) => (\n <Text key={opt.value} color={i === idx ? \"green\" : undefined}>\n {i === idx ? \"▶ \" : \" \"}\n {selected.has(opt.value) ? \"[✓] \" : \"[ ] \"}\n {opt.label}\n </Text>\n ))}\n <Text dimColor> [Space] Toggle [Enter] Confirm [Esc] Cancel</Text>\n </Box>\n );\n}\n","import React, { useState } from \"react\";\nimport { Text, Box, useInput } from \"ink\";\nimport type { Config, LockState } from \"@cc-lock/core\";\nimport { sendRequest } from \"../hooks/useDaemon.js\";\nimport type { ConfigSetResponse } from \"@cc-lock/core\";\nimport { TextInput } from \"../components/TextInput.js\";\n\ninterface Props {\n config: Config | null;\n lock: LockState | null;\n onRefresh: () => void;\n onFormActiveChange: (active: boolean) => void;\n}\n\ntype SettingRow =\n | { kind: \"bool\"; key: keyof Config; label: string; value: boolean }\n | { kind: \"number\"; key: keyof Config; label: string; value: number; unit: string };\n\nexport function SettingsScreen({ config, lock, onRefresh, onFormActiveChange }: Props) {\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [editing, setEditing] = useState(false);\n const [editValue, setEditValue] = useState(\"\");\n\n const isLocked = lock?.status === \"locked\" || lock?.status === \"grace\";\n\n const rows: SettingRow[] = config\n ? [\n { kind: \"bool\", key: \"chmodGuard\", label: \"chmod guard\", value: config.chmodGuard },\n {\n kind: \"bool\",\n key: \"challengeBypassEnabled\",\n label: \"Allow bypass\",\n value: config.challengeBypassEnabled ?? true,\n },\n {\n kind: \"bool\",\n key: \"paymentBypassEnabled\",\n label: \"Payment bypass\",\n value: config.paymentBypassEnabled ?? false,\n },\n {\n kind: \"bool\",\n key: \"killSessionsOnLock\",\n label: \"Kill on lock\",\n value: config.killSessionsOnLock ?? false,\n },\n {\n kind: \"number\",\n key: \"graceMinutes\",\n label: \"Grace period\",\n value: config.graceMinutes,\n unit: \"min\",\n },\n ]\n : [];\n\n const save = (key: keyof Config, value: unknown) => {\n setPending(true);\n setError(null);\n sendRequest({ type: \"config-set\", key, value })\n .then((res) => {\n const r = res as ConfigSetResponse;\n if (!r.ok) setError(r.error ?? \"Failed to update setting\");\n else onRefresh();\n })\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n })\n .finally(() => setPending(false));\n };\n\n const exitEdit = () => {\n setEditing(false);\n setEditValue(\"\");\n onFormActiveChange(false);\n };\n\n // Navigation and activation — disabled while editing or locked\n useInput(\n (input, key) => {\n if (!config || pending || isLocked) return;\n\n if (key.upArrow) {\n setSelectedIdx((i) => Math.max(0, i - 1));\n setError(null);\n return;\n }\n if (key.downArrow) {\n setSelectedIdx((i) => Math.min(rows.length - 1, i + 1));\n setError(null);\n return;\n }\n\n const row = rows[selectedIdx];\n if (!row) return;\n\n if (row.kind === \"bool\" && (input === \" \" || key.return)) {\n save(row.key, !row.value);\n return;\n }\n\n if (row.kind === \"number\" && key.return) {\n setEditValue(String(row.value));\n setEditing(true);\n onFormActiveChange(true);\n return;\n }\n },\n { isActive: !!config && !editing }\n );\n\n if (!config) {\n return (\n <Box padding={1}>\n <Text dimColor>Loading config...</Text>\n </Box>\n );\n }\n\n const infoRows: [string, string][] = [\n [\"Installation\", config.installationType],\n [\"Binary path\", config.claudeBinaryPath],\n [\"Shim path\", config.claudeShimPath],\n ];\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold>Settings</Text>\n {isLocked && (\n <Text color=\"yellow\">{\" \"}🔒 locked — unlock to change settings</Text>\n )}\n </Box>\n\n {/* Read-only info */}\n {infoRows.map(([label, value]) => (\n <Box key={label}>\n <Text dimColor>{label.padEnd(16)}</Text>\n <Text>{value}</Text>\n </Box>\n ))}\n\n {/* Navigable / editable rows */}\n <Box marginTop={1} flexDirection=\"column\">\n {rows.map((row, i) => {\n const isSelected = i === selectedIdx && !isLocked;\n const isEditingThis = isSelected && editing && row.kind === \"number\";\n\n return (\n <Box key={row.key}>\n <Text color={isSelected ? \"green\" : undefined}>\n {isSelected ? \"▶ \" : \" \"}\n </Text>\n <Text dimColor={isLocked}>{row.label.padEnd(14)}</Text>\n\n {row.kind === \"bool\" && (\n <Text\n color={isLocked ? undefined : row.value ? \"green\" : \"red\"}\n dimColor={isLocked}\n >\n {row.value ? \"[✓] enabled \" : \"[○] disabled\"}\n </Text>\n )}\n\n {row.kind === \"number\" && !isEditingThis && (\n <Text dimColor={isLocked}>\n {row.value} <Text dimColor>{row.unit}</Text>\n </Text>\n )}\n\n {row.kind === \"number\" && isEditingThis && (\n <TextInput\n value={editValue}\n onChange={setEditValue}\n onSubmit={(v) => {\n const n = parseInt(v, 10);\n if (!v.trim() || isNaN(n) || n < 1) {\n setError(\"Enter a whole number of minutes (≥ 1)\");\n return;\n }\n exitEdit();\n save(row.key, n);\n }}\n onCancel={exitEdit}\n placeholder=\"minutes\"\n />\n )}\n </Box>\n );\n })}\n </Box>\n\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" paddingX={1}>\n <Text dimColor>\n {isLocked\n ? \"Settings are read-only while locked\"\n : pending\n ? \"Saving...\"\n : editing\n ? \"[Enter] Save [Esc] Cancel\"\n : \"[↑/↓] Navigate [Space/Enter] Toggle / Edit\"}\n </Text>\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":["React","useState","Box","Text","useInput","useState","Text","jsx","jsxs","Box","useInput","useEffect","formatDuration","p","React"]}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
CC_LOCK_DIR,
|
|
4
|
+
LAUNCHD_LABEL,
|
|
5
|
+
LAUNCHD_PLIST_PATH,
|
|
6
|
+
SOCKET_PATH,
|
|
7
|
+
TASK_SCHEDULER_NAME
|
|
8
|
+
} from "./chunk-GSDKZKKT.js";
|
|
2
9
|
|
|
3
10
|
// src/index.ts
|
|
4
11
|
import { Command } from "commander";
|
|
5
12
|
|
|
6
13
|
// src/ipc-client.ts
|
|
7
14
|
import { createConnection } from "net";
|
|
8
|
-
import { SOCKET_PATH } from "@cc-lock/core";
|
|
9
15
|
function sendRequest(req) {
|
|
10
16
|
return new Promise((resolve2, reject) => {
|
|
11
17
|
const socket = createConnection(SOCKET_PATH);
|
|
@@ -154,12 +160,6 @@ async function statusCommand() {
|
|
|
154
160
|
}
|
|
155
161
|
|
|
156
162
|
// src/commands/install.ts
|
|
157
|
-
import {
|
|
158
|
-
LAUNCHD_PLIST_PATH,
|
|
159
|
-
LAUNCHD_LABEL,
|
|
160
|
-
CC_LOCK_DIR,
|
|
161
|
-
TASK_SCHEDULER_NAME
|
|
162
|
-
} from "@cc-lock/core";
|
|
163
163
|
import { writeFileSync, mkdirSync, existsSync } from "fs";
|
|
164
164
|
import { createRequire } from "module";
|
|
165
165
|
import { dirname, join, resolve } from "path";
|
|
@@ -947,7 +947,7 @@ stats.command("reset").description("Clear usage stats (today only by default)").
|
|
|
947
947
|
});
|
|
948
948
|
program.command("tui").description("Launch interactive TUI dashboard").action(async () => {
|
|
949
949
|
try {
|
|
950
|
-
const { launchTui } = await import("
|
|
950
|
+
const { launchTui } = await import("./dist-56C5YEZV.js");
|
|
951
951
|
await launchTui();
|
|
952
952
|
} catch (err) {
|
|
953
953
|
console.error(err instanceof Error ? err.message : String(err));
|
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\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"]}
|
|
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.2.
|
|
3
|
+
"version": "0.2.1",
|
|
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,20 +32,21 @@
|
|
|
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
|
-
},
|
|
41
35
|
"dependencies": {
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
36
|
+
"commander": "^12.0.0",
|
|
37
|
+
"ink": "^5.1.0",
|
|
38
|
+
"react": "^18.3.0",
|
|
39
|
+
"@cc-lock/daemon": "0.2.1"
|
|
46
40
|
},
|
|
47
41
|
"devDependencies": {
|
|
48
42
|
"tsup": "^8.0.0",
|
|
49
|
-
"typescript": "^5.4.0"
|
|
43
|
+
"typescript": "^5.4.0",
|
|
44
|
+
"@cc-lock/core": "0.2.1",
|
|
45
|
+
"@cc-lock/tui": "0.2.1"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsup",
|
|
49
|
+
"dev": "tsup --watch",
|
|
50
|
+
"clean": "rm -rf dist"
|
|
50
51
|
}
|
|
51
|
-
}
|
|
52
|
+
}
|