claude-settings-sync 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ko.md +203 -0
- package/README.md +203 -0
- package/bin/claudesync.js +2 -0
- package/dist/chunk-45GTBXRR.js +145 -0
- package/dist/chunk-45GTBXRR.js.map +1 -0
- package/dist/chunk-BRTRPVT7.js +101 -0
- package/dist/chunk-BRTRPVT7.js.map +1 -0
- package/dist/chunk-VBOSEAEH.js +81 -0
- package/dist/chunk-VBOSEAEH.js.map +1 -0
- package/dist/chunk-XTJEVOK3.js +867 -0
- package/dist/chunk-XTJEVOK3.js.map +1 -0
- package/dist/cli.js +1693 -0
- package/dist/cli.js.map +1 -0
- package/dist/config-7KJ6CZMX.js +33 -0
- package/dist/config-7KJ6CZMX.js.map +1 -0
- package/dist/gist-AMKOY723.js +21 -0
- package/dist/gist-AMKOY723.js.map +1 -0
- package/dist/scanner-M3SQGNTI.js +11 -0
- package/dist/scanner-M3SQGNTI.js.map +1 -0
- package/package.json +42 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/auth.ts","../src/commands/init.ts","../src/core/conflict.ts","../src/core/redactor.ts","../src/core/crypto.ts","../src/commands/push.ts","../src/commands/pull.ts","../src/commands/diff.ts","../src/commands/status.ts","../src/commands/history.ts","../src/commands/rollback.ts","../src/core/auto-config.ts","../src/core/scheduler.ts","../src/commands/auto.ts","../src/core/lock.ts","../src/core/auto-log.ts","../src/core/notify.ts","../src/commands/auto-run.ts","../src/commands/auto-disable.ts","../src/commands/auto-status.ts","../src/cli.ts"],"sourcesContent":["import { readFileSync, writeFileSync, chmodSync, existsSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { authFilePath } from '../utils/paths.js';\nimport type { AuthConfig } from '../types.js';\nimport { t } from '../utils/i18n.js';\n\nconst KEYCHAIN_SERVICE = 'claudesync';\nconst KEYCHAIN_ACCOUNT = 'github-token';\n\n// ── Keychain (macOS) ────────────────────────────────────────\nfunction keychainSet(token: string): boolean {\n try {\n execSync(\n `security add-generic-password -U -s \"${KEYCHAIN_SERVICE}\" -a \"${KEYCHAIN_ACCOUNT}\" -w \"${token}\"`,\n { stdio: 'ignore' },\n );\n return true;\n } catch {\n return false;\n }\n}\n\nfunction keychainGet(): string | null {\n try {\n const result = execSync(\n `security find-generic-password -s \"${KEYCHAIN_SERVICE}\" -a \"${KEYCHAIN_ACCOUNT}\" -w`,\n { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] },\n );\n return result.trim();\n } catch {\n return null;\n }\n}\n\nfunction keychainDelete(): boolean {\n try {\n execSync(\n `security delete-generic-password -s \"${KEYCHAIN_SERVICE}\" -a \"${KEYCHAIN_ACCOUNT}\"`,\n { stdio: 'ignore' },\n );\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Linux secret-tool ───────────────────────────────────────\nfunction secretToolSet(token: string): boolean {\n try {\n execSync(\n `echo -n \"${token}\" | secret-tool store --label=\"claudesync\" service claudesync account github-token`,\n { stdio: 'ignore' },\n );\n return true;\n } catch {\n return false;\n }\n}\n\nfunction secretToolGet(): string | null {\n try {\n const result = execSync(\n 'secret-tool lookup service claudesync account github-token',\n { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] },\n );\n return result.trim() || null;\n } catch {\n return null;\n }\n}\n\n// ── File fallback ───────────────────────────────────────────\nfunction fileSet(config: AuthConfig): void {\n const path = authFilePath();\n writeFileSync(path, JSON.stringify(config, null, 2), 'utf-8');\n chmodSync(path, 0o600);\n}\n\nfunction fileGet(): AuthConfig | null {\n const path = authFilePath();\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n// ── Public API ──────────────────────────────────────────────\n\n/** Save token using the best available method */\nexport function saveToken(token: string): void {\n if (process.platform === 'darwin') {\n keychainSet(token);\n } else if (process.platform === 'linux') {\n secretToolSet(token);\n }\n // Always save to file as well (for gist_id, machine_name)\n const existing = fileGet() || { token: '' };\n existing.token = token;\n fileSet(existing);\n}\n\n/** Load token from the best available method */\nexport function loadToken(): string | null {\n // Try keychain/secret-tool first\n if (process.platform === 'darwin') {\n const token = keychainGet();\n if (token) return token;\n } else if (process.platform === 'linux') {\n const token = secretToolGet();\n if (token) return token;\n }\n // Fallback to file\n const config = fileGet();\n return config?.token || null;\n}\n\n/** Load full auth config */\nexport function loadConfig(): AuthConfig | null {\n return fileGet();\n}\n\n/** Save full auth config */\nexport function saveConfig(config: AuthConfig): void {\n saveToken(config.token);\n fileSet(config);\n}\n\n/** Delete stored credentials */\nexport function deleteAuth(): void {\n if (process.platform === 'darwin') keychainDelete();\n const path = authFilePath();\n if (existsSync(path)) {\n writeFileSync(path, '', 'utf-8');\n }\n}\n\n/** Validate token by calling GitHub API */\nexport async function validateToken(token: string): Promise<boolean> {\n try {\n const res = await fetch('https://api.github.com/user', {\n headers: {\n Authorization: `token ${token}`,\n 'User-Agent': 'claudesync',\n },\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** OAuth Device Flow */\nexport async function deviceFlow(): Promise<string> {\n const CLIENT_ID = 'Ov23liVJuAxxwWUqtala';\n\n // Step 1: Request device code\n const codeRes = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ client_id: CLIENT_ID, scope: 'gist' }),\n });\n const codeData = (await codeRes.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n interval: number;\n expires_in: number;\n };\n\n console.log(`\\n${t('auth.device_url').replace('{url}', codeData.verification_uri)}`);\n console.log(`${t('auth.device_code').replace('{code}', codeData.user_code)}\\n`);\n\n // Step 2: Poll for token\n const interval = (codeData.interval || 5) * 1000;\n const deadline = Date.now() + codeData.expires_in * 1000;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n\n const tokenRes = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: CLIENT_ID,\n device_code: codeData.device_code,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n });\n const tokenData = (await tokenRes.json()) as {\n access_token?: string;\n error?: string;\n };\n\n if (tokenData.access_token) return tokenData.access_token;\n if (tokenData.error === 'authorization_pending') continue;\n if (tokenData.error === 'slow_down') {\n await new Promise((r) => setTimeout(r, 5000));\n continue;\n }\n throw new Error(t('auth.oauth_error').replace('{error}', String(tokenData.error)));\n }\n\n throw new Error(t('auth.device_flow_timeout'));\n}\n","import { t } from '../utils/i18n.js';\nimport { info, success, error, warn, askHidden } from '../utils/terminal.js';\nimport { saveConfig, loadConfig, validateToken, deviceFlow } from '../core/auth.js';\nimport { findGist } from '../core/gist.js';\nimport { machineName } from '../utils/paths.js';\n\ninterface InitOptions {\n useToken?: boolean;\n linkGistId?: string;\n}\n\nexport async function runInit(options: InitOptions): Promise<void> {\n let token: string;\n\n if (options.useToken) {\n // Manual PAT input\n token = await askHidden(t('auth.enter_token'));\n if (!token.trim()) {\n error(t('init.no_token_input'));\n return;\n }\n token = token.trim();\n } else if (options.linkGistId) {\n // Link existing Gist — need token first\n const existing = loadConfig();\n if (!existing?.token) {\n error(t('auth.no_token'));\n return;\n }\n token = existing.token;\n\n saveConfig({\n token,\n gist_id: options.linkGistId,\n machine_name: machineName(),\n });\n success(t('init.gist_linked').replace('{id}', options.linkGistId));\n return;\n } else {\n // OAuth Device Flow\n info(t('auth.device_prompt'));\n try {\n token = await deviceFlow();\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n return;\n }\n }\n\n // Validate token\n info(t('init.validating'));\n const valid = await validateToken(token);\n if (!valid) {\n error(t('init.token_invalid'));\n return;\n }\n\n // Check for existing Gist\n info(t('init.searching_gist'));\n const existingGist = await findGist(token);\n\n const config = {\n token,\n gist_id: existingGist?.id,\n machine_name: machineName(),\n };\n\n saveConfig(config);\n success(t('auth.token_saved'));\n\n if (existingGist) {\n success(t('init.gist_found').replace('{id}', existingGist.id));\n } else {\n warn(t('init.no_gist'));\n }\n}\n","import type { FileChange, Category, ScannedFile, Gist } from '../types.js';\nimport { fromGistFilename } from '../utils/paths.js';\nimport { parseMeta } from './gist.js';\n\nconst META_FILE = '_meta.json';\n\n/** Compare local files against remote Gist to find changes */\nexport function compareForPush(\n localFiles: ScannedFile[],\n gist: Gist,\n): FileChange[] {\n const changes: FileChange[] = [];\n const localMap = new Map(localFiles.map((f) => [f.gistFilename, f]));\n const remoteNames = new Set(\n Object.keys(gist.files).filter((n) => n !== META_FILE),\n );\n\n // Check local files against remote\n for (const [gistName, local] of localMap) {\n const remote = gist.files[gistName];\n if (!remote) {\n changes.push({\n gistFilename: gistName,\n relativePath: local.relativePath,\n category: local.category,\n status: 'added',\n localContent: local.content,\n });\n } else if (remote.content !== local.content) {\n changes.push({\n gistFilename: gistName,\n relativePath: local.relativePath,\n category: local.category,\n status: 'modified',\n localContent: local.content,\n remoteContent: remote.content ?? undefined,\n });\n } else {\n changes.push({\n gistFilename: gistName,\n relativePath: local.relativePath,\n category: local.category,\n status: 'unchanged',\n localContent: local.content,\n remoteContent: remote.content ?? undefined,\n });\n }\n remoteNames.delete(gistName);\n }\n\n // Files in remote but not local → deleted locally\n const meta = parseMeta(gist);\n for (const gistName of remoteNames) {\n const entry = meta?.file_map[gistName];\n changes.push({\n gistFilename: gistName,\n relativePath: entry?.path ?? fromGistFilename(gistName),\n category: (entry?.category ?? 'settings') as Category,\n status: 'deleted',\n remoteContent: gist.files[gistName]?.content ?? undefined,\n });\n }\n\n return changes;\n}\n\n/** Compare remote Gist against local files for pull */\nexport function compareForPull(\n gist: Gist,\n localFiles: ScannedFile[],\n): FileChange[] {\n const changes: FileChange[] = [];\n const localMap = new Map(localFiles.map((f) => [f.gistFilename, f]));\n const meta = parseMeta(gist);\n\n for (const [gistName, gistFile] of Object.entries(gist.files)) {\n if (gistName === META_FILE) continue;\n if (!gistFile?.content) continue;\n\n const local = localMap.get(gistName);\n const entry = meta?.file_map[gistName];\n const relativePath = entry?.path ?? fromGistFilename(gistName);\n const category = (entry?.category ?? 'settings') as Category;\n\n if (!local) {\n changes.push({\n gistFilename: gistName,\n relativePath,\n category,\n status: 'added',\n remoteContent: gistFile.content,\n });\n } else if (local.content !== gistFile.content) {\n changes.push({\n gistFilename: gistName,\n relativePath,\n category,\n status: 'modified',\n localContent: local.content,\n remoteContent: gistFile.content,\n });\n } else {\n changes.push({\n gistFilename: gistName,\n relativePath,\n category,\n status: 'unchanged',\n localContent: local.content,\n remoteContent: gistFile.content,\n });\n }\n }\n\n return changes;\n}\n\n/** Generate a simple unified diff between two strings */\nexport function simpleDiff(a: string, b: string): string[] {\n const linesA = a.split('\\n');\n const linesB = b.split('\\n');\n const result: string[] = [];\n\n const maxLen = Math.max(linesA.length, linesB.length);\n for (let i = 0; i < maxLen; i++) {\n const lineA = linesA[i];\n const lineB = linesB[i];\n\n if (lineA === undefined) {\n result.push(`+${lineB}`);\n } else if (lineB === undefined) {\n result.push(`-${lineA}`);\n } else if (lineA !== lineB) {\n result.push(`-${lineA}`);\n result.push(`+${lineB}`);\n }\n }\n\n return result;\n}\n","/** Secret detection patterns */\nconst SECRET_PATTERNS: Array<{ name: string; regex: RegExp }> = [\n { name: 'AWS Access Key', regex: /AKIA[0-9A-Z]{16}/ },\n { name: 'AWS Secret Key', regex: /(?:aws_secret_access_key|secret_key)\\s*[=:]\\s*\\S+/i },\n { name: 'GitHub Token', regex: /gh[pousr]_[A-Za-z0-9_]{36,}/ },\n { name: 'GitHub Classic Token', regex: /ghp_[A-Za-z0-9]{36,}/ },\n { name: 'Anthropic API Key', regex: /sk-ant-[A-Za-z0-9-_]{20,}/ },\n { name: 'OpenAI API Key', regex: /sk-[A-Za-z0-9]{32,}/ },\n { name: 'Slack Token', regex: /xox[bprs]-[A-Za-z0-9-]+/ },\n { name: 'Slack Webhook', regex: /hooks\\.slack\\.com\\/services\\/T[A-Z0-9]+\\/B[A-Z0-9]+\\/[A-Za-z0-9]+/ },\n { name: 'Private Key', regex: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/ },\n { name: 'Generic Secret', regex: /(?:secret|password|passwd|token|api_key|apikey|auth)\\s*[=:]\\s*['\"][^'\"]{8,}['\"]/i },\n { name: 'Bearer Token', regex: /Bearer\\s+[A-Za-z0-9\\-._~+/]+=*/i },\n { name: 'Basic Auth', regex: /Basic\\s+[A-Za-z0-9+/]+=*/i },\n { name: 'Connection String', regex: /(?:mongodb|postgres|mysql|redis):\\/\\/[^\\s]+/i },\n { name: 'npm Token', regex: /\\/\\/registry\\.npmjs\\.org\\/:_authToken=\\S+/ },\n { name: 'Hex Secret (32+)', regex: /(?:secret|key|token|password)\\s*[=:]\\s*[0-9a-f]{32,}/i },\n];\n\nconst REDACT_COMMENT = '# claudesync:redact';\n\nexport interface SecretMatch {\n line: number;\n pattern: string;\n match: string;\n /** The full line content */\n lineContent: string;\n}\n\n/** Scan content for potential secrets */\nexport function detectSecrets(content: string): SecretMatch[] {\n const matches: SecretMatch[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Explicit redact marker\n if (line.includes(REDACT_COMMENT)) {\n matches.push({\n line: i + 1,\n pattern: 'Explicit redact marker',\n match: line.trim(),\n lineContent: line,\n });\n continue;\n }\n\n for (const { name, regex } of SECRET_PATTERNS) {\n const m = line.match(regex);\n if (m) {\n matches.push({\n line: i + 1,\n pattern: name,\n match: m[0].slice(0, 20) + (m[0].length > 20 ? '...' : ''),\n lineContent: line,\n });\n break; // one match per line is enough\n }\n }\n\n // Shannon entropy check for long tokens\n if (!matches.some((m) => m.line === i + 1)) {\n const tokens = line.match(/[A-Za-z0-9+/=_\\-]{32,}/g);\n if (tokens) {\n for (const token of tokens) {\n if (shannonEntropy(token) > 4.5) {\n matches.push({\n line: i + 1,\n pattern: 'High entropy string',\n match: token.slice(0, 20) + '...',\n lineContent: line,\n });\n break;\n }\n }\n }\n }\n }\n\n return matches;\n}\n\n/** Redact detected secrets in content */\nexport function redactContent(content: string, secrets: SecretMatch[]): string {\n const lines = content.split('\\n');\n const secretLines = new Set(secrets.map((s) => s.line));\n\n return lines\n .map((line, i) => {\n if (secretLines.has(i + 1)) {\n return '# [REDACTED by claudesync]';\n }\n return line;\n })\n .join('\\n');\n}\n\n/** Calculate Shannon entropy of a string */\nfunction shannonEntropy(str: string): number {\n const freq = new Map<string, number>();\n for (const ch of str) {\n freq.set(ch, (freq.get(ch) || 0) + 1);\n }\n let entropy = 0;\n const len = str.length;\n for (const count of freq.values()) {\n const p = count / len;\n entropy -= p * Math.log2(p);\n }\n return entropy;\n}\n","import { randomBytes, scryptSync, createCipheriv, createDecipheriv } from 'node:crypto';\n\nconst MAGIC_PREFIX = 'CLAUDESYNC_ENC:';\nconst ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst IV_LENGTH = 16;\nconst SALT_LENGTH = 32;\nconst AUTH_TAG_LENGTH = 16;\nconst SCRYPT_PARAMS = { N: 16384, r: 8, p: 1 };\n\n/** Derive a key from a passphrase using scrypt */\nfunction deriveKey(passphrase: string, salt: Buffer): Buffer {\n return scryptSync(passphrase, salt, KEY_LENGTH, SCRYPT_PARAMS);\n}\n\n/** Encrypt content with AES-256-GCM.\n * Output format: base64(salt + iv + authTag + ciphertext) */\nexport function encrypt(content: string, passphrase: string): string {\n const salt = randomBytes(SALT_LENGTH);\n const key = deriveKey(passphrase, salt);\n const iv = randomBytes(IV_LENGTH);\n\n const cipher = createCipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n const encrypted = Buffer.concat([cipher.update(content, 'utf-8'), cipher.final()]);\n const authTag = cipher.getAuthTag();\n\n const combined = Buffer.concat([salt, iv, authTag, encrypted]);\n return MAGIC_PREFIX + combined.toString('base64');\n}\n\n/** Decrypt content encrypted with encrypt() */\nexport function decrypt(encoded: string, passphrase: string): string {\n if (!encoded.startsWith(MAGIC_PREFIX)) throw new Error('Not encrypted by claudesync');\n const combined = Buffer.from(encoded.slice(MAGIC_PREFIX.length), 'base64');\n\n const salt = combined.subarray(0, SALT_LENGTH);\n const iv = combined.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH);\n const authTag = combined.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);\n const ciphertext = combined.subarray(SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH);\n\n const key = deriveKey(passphrase, salt);\n const decipher = createDecipheriv(ALGORITHM, key, iv, { authTagLength: AUTH_TAG_LENGTH });\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return decrypted.toString('utf-8');\n}\n\n/** Check if a string looks like claudesync-encrypted content */\nexport function isEncrypted(content: string): boolean {\n return content.startsWith(MAGIC_PREFIX);\n}\n","import { t } from '../utils/i18n.js';\nimport { info, success, warn, error, heading, confirm, c } from '../utils/terminal.js';\nimport { loadConfig, saveConfig } from '../core/auth.js';\nimport { scanFiles } from '../core/scanner.js';\nimport { getGist, createGist, updateGist } from '../core/gist.js';\nimport { compareForPush, simpleDiff } from '../core/conflict.js';\nimport { detectSecrets, redactContent } from '../core/redactor.js';\nimport { encrypt as encryptContent } from '../core/crypto.js';\nimport { printDiff } from '../utils/terminal.js';\nimport type { PushOptions, ScannedFile } from '../types.js';\n\nexport async function runPush(options: PushOptions): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n\n // 1. Scan local files\n info(t('push.scanning'));\n const files = scanFiles(options.only);\n\n if (files.length === 0) {\n warn(t('push.no_files'));\n return;\n }\n\n // 2. Detect and redact secrets\n const processedFiles: ScannedFile[] = [];\n for (const file of files) {\n const secrets = detectSecrets(file.content);\n if (secrets.length > 0) {\n warn(t('push.secret_found').replace('{path}', file.relativePath).replace('{count}', String(secrets.length)));\n for (const s of secrets) {\n console.log(` ${c.dim(`L${s.line}`)} ${c.yellow(s.pattern)}: ${s.match}`);\n }\n const redacted = redactContent(file.content, secrets);\n processedFiles.push({ ...file, content: redacted });\n } else {\n processedFiles.push(file);\n }\n }\n\n // 3. Encrypt if requested\n const encryptedFiles = new Set<string>();\n const finalFiles = options.encrypt\n ? processedFiles.map((f) => {\n encryptedFiles.add(f.gistFilename);\n return { ...f, content: encryptContent(f.content, config.token) };\n })\n : processedFiles;\n\n // 4. Compare with remote\n if (config.gist_id) {\n try {\n const gist = await getGist(config.token, config.gist_id);\n const changes = compareForPush(finalFiles, gist);\n\n const modified = changes.filter((c) => c.status !== 'unchanged');\n if (modified.length === 0) {\n success(t('push.no_changes'));\n return;\n }\n\n // Show summary\n heading(t('push.summary'));\n for (const change of modified) {\n const icon =\n change.status === 'added' ? c.green('+') :\n change.status === 'deleted' ? c.red('-') :\n c.yellow('~');\n console.log(` ${icon} [${change.category}] ${change.relativePath}`);\n\n if (change.status === 'modified' && change.localContent && change.remoteContent) {\n const diff = simpleDiff(change.remoteContent, change.localContent);\n if (diff.length > 0 && diff.length <= 20) {\n printDiff(change.relativePath, diff);\n }\n }\n }\n console.log();\n\n // Confirm\n if (!options.force) {\n const ok = await confirm(t('push.confirm'));\n if (!ok) {\n warn(t('push.cancelled'));\n return;\n }\n }\n\n // Update\n const deletedFiles = changes\n .filter((c) => c.status === 'deleted')\n .map((c) => c.gistFilename);\n\n const filesToUpload = finalFiles.filter((f) =>\n changes.some((c) => c.gistFilename === f.gistFilename && c.status !== 'unchanged'),\n );\n\n await updateGist(config.token, config.gist_id, filesToUpload, deletedFiles, encryptedFiles, options.message);\n success(t('push.success'));\n } catch (err) {\n // Gist not found — create new\n if (String(err).includes('404')) {\n info(t('push.gist_not_found_creating'));\n const newGist = await createGist(config.token, finalFiles, encryptedFiles, options.message);\n config.gist_id = newGist.id;\n saveConfig(config);\n success(`${t('push.success')} (${newGist.html_url})`);\n } else {\n throw err;\n }\n }\n } else {\n // No Gist yet — create\n heading(t('push.uploading_new').replace('{count}', String(finalFiles.length)));\n for (const f of finalFiles) {\n console.log(` [${f.category}] ${f.relativePath}`);\n }\n console.log();\n\n if (!options.force) {\n const ok = await confirm(t('push.confirm'));\n if (!ok) {\n warn(t('push.cancelled'));\n return;\n }\n }\n\n info(t('push.creating_gist'));\n const newGist = await createGist(config.token, finalFiles, encryptedFiles, options.message);\n config.gist_id = newGist.id;\n saveConfig(config);\n success(`${t('push.success')} (${newGist.html_url})`);\n }\n}\n","import { writeFileSync, mkdirSync, existsSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { t } from '../utils/i18n.js';\nimport { info, success, warn, error, heading, confirm, c, printDiff, select } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { scanFiles } from '../core/scanner.js';\nimport { getGist, parseMeta } from '../core/gist.js';\nimport { compareForPull, simpleDiff } from '../core/conflict.js';\nimport { decrypt, isEncrypted } from '../core/crypto.js';\nimport { claudeDir, isPathSafe } from '../utils/paths.js';\nimport type { PullOptions, FileChange, SyncMeta } from '../types.js';\n\nexport async function runPull(options: PullOptions): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n if (!config.gist_id) {\n error(t('pull.no_gist'));\n return;\n }\n\n // 1. Fetch remote\n info(t('pull.fetching'));\n const gist = await getGist(config.token, config.gist_id);\n\n // 2. Scan local\n const localFiles = scanFiles(options.only);\n\n // 3. Compare\n const changes = compareForPull(gist, localFiles);\n const modified = changes.filter((c) => c.status !== 'unchanged');\n\n const meta = parseMeta(gist);\n const toApply = options.only\n ? modified.filter((c) => c.category === options.only)\n : modified;\n\n if (toApply.length === 0) {\n success(t('pull.no_changes'));\n return;\n }\n await applyChanges(toApply, config.token, options.force ?? false, meta);\n}\n\nasync function applyChanges(changes: FileChange[], token: string, force: boolean, meta: SyncMeta | null): Promise<void> {\n heading(t('pull.changes_heading'));\n for (const change of changes) {\n const icon =\n change.status === 'added' ? c.green(t('pull.icon_added')) :\n change.status === 'modified' ? c.yellow(t('pull.icon_modified')) :\n c.red(t('pull.icon_deleted'));\n console.log(` ${icon} [${change.category}] ${change.relativePath}`);\n\n if (change.status === 'modified' && change.localContent && change.remoteContent) {\n const diff = simpleDiff(change.localContent, change.remoteContent);\n if (diff.length > 0 && diff.length <= 30) {\n printDiff(change.relativePath, diff);\n } else if (diff.length > 30) {\n console.log(c.dim(` (${t('pull.diff_truncated').replace('{count}', String(diff.length))})`));\n }\n }\n }\n console.log();\n\n if (!force) {\n const ok = await confirm(t('pull.confirm'));\n if (!ok) {\n warn(t('pull.cancelled'));\n return;\n }\n }\n\n // Apply each change\n const base = claudeDir();\n let applied = 0;\n\n for (const change of changes) {\n if (!isPathSafe(change.relativePath)) {\n error(`${t('error.path_unsafe')} ${change.relativePath}`);\n continue;\n }\n\n const targetPath = join(base, change.relativePath);\n\n if (change.status === 'deleted') {\n // Don't delete local files during pull — just skip\n warn(t('pull.skip_deleted').replace('{path}', change.relativePath));\n continue;\n }\n\n let content = change.remoteContent ?? '';\n\n // Decrypt if needed — check meta first, fallback to magic prefix\n const metaEntry = meta?.file_map[change.gistFilename];\n const needsDecrypt = metaEntry?.encrypted || isEncrypted(content);\n if (needsDecrypt) {\n try {\n content = decrypt(content, token);\n } catch {\n error(t('pull.decrypt_failed').replace('{path}', change.relativePath));\n continue;\n }\n }\n\n // Backup existing file\n if (existsSync(targetPath)) {\n copyFileSync(targetPath, targetPath + '.bak');\n }\n\n // Ensure directory exists\n const dir = dirname(targetPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(targetPath, content, 'utf-8');\n applied++;\n }\n\n success(`${t('pull.success')} (${t('pull.applied').replace('{count}', String(applied))})`);\n}\n","import { t } from '../utils/i18n.js';\nimport { info, error, c, printDiff } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { scanFiles } from '../core/scanner.js';\nimport { getGist } from '../core/gist.js';\nimport { compareForPull, simpleDiff } from '../core/conflict.js';\nimport type { DiffOptions } from '../types.js';\n\nexport async function runDiff(options: DiffOptions): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n if (!config.gist_id) {\n error(t('diff.no_gist'));\n return;\n }\n\n info(t('diff.fetching'));\n const gist = await getGist(config.token, config.gist_id);\n const localFiles = scanFiles(options.only);\n const changes = compareForPull(gist, localFiles);\n\n const modified = changes.filter((ch) => ch.status !== 'unchanged');\n if (modified.length === 0) {\n console.log(t('diff.no_diff'));\n return;\n }\n\n for (const change of modified) {\n const icon =\n change.status === 'added' ? c.green('NEW') :\n change.status === 'modified' ? c.yellow('MOD') :\n c.red('DEL');\n\n console.log(`\\n${icon} [${change.category}] ${change.relativePath}`);\n\n if (change.status === 'modified' && change.localContent && change.remoteContent) {\n const diff = simpleDiff(change.localContent, change.remoteContent);\n printDiff(change.relativePath, diff);\n } else if (change.status === 'added' && change.remoteContent) {\n const lines = change.remoteContent.split('\\n').map((l) => `+${l}`);\n printDiff(change.relativePath, lines);\n }\n }\n\n console.log(`\\n${t('diff.total').replace('{count}', String(modified.length))}`);\n}\n","import { t } from '../utils/i18n.js';\nimport { c, heading } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { getGist, parseMeta } from '../core/gist.js';\nimport { machineName, platformString } from '../utils/paths.js';\n\nexport async function runStatus(): Promise<void> {\n const config = loadConfig();\n\n heading(t('status.title'));\n\n // Auth\n if (config?.token) {\n console.log(` ${t('status.auth_label')}: ${c.green(t('status.authenticated'))}`);\n } else {\n console.log(` ${t('status.auth_label')}: ${c.red(t('status.not_authenticated'))}`);\n return;\n }\n\n // Gist\n if (config.gist_id) {\n console.log(` ${t('status.gist_label')}: ${c.green(config.gist_id)}`);\n\n try {\n const gist = await getGist(config.token, config.gist_id);\n const meta = parseMeta(gist);\n\n if (meta) {\n console.log(` ${t('status.last_sync')}`);\n console.log(` ${t('status.machine')}: ${meta.last_sync.machine}`);\n console.log(` ${t('status.host')}: ${meta.last_sync.hostname}`);\n console.log(` ${t('status.platform')}: ${meta.last_sync.platform}`);\n console.log(` ${t('status.time')}: ${meta.last_sync.timestamp}`);\n console.log(` ${t('status.file_count')}: ${meta.last_sync.file_count}`);\n }\n\n const fileCount = Object.keys(gist.files).filter((n) => n !== '_meta.json').length;\n console.log(` ${t('status.remote_files').replace('{count}', String(fileCount))}`);\n } catch {\n console.log(` ${c.yellow(t('status.gist_fetch_failed'))}`);\n }\n } else {\n console.log(` ${t('status.gist_label')}: ${c.yellow(t('status.no_gist'))}`);\n }\n\n // Local machine info\n console.log(` ${t('status.current_machine')}: ${machineName()}`);\n console.log(` ${t('status.platform')}: ${platformString()}`);\n}\n","import { t } from '../utils/i18n.js';\nimport { error, heading, c, info } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { getHistory, getGistAtRevision, parseMeta } from '../core/gist.js';\n\nconst MAX_REVISIONS = 10;\n\nexport async function runHistory(): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n if (!config.gist_id) {\n error(t('history.no_gist'));\n return;\n }\n\n const allRevisions = await getHistory(config.token, config.gist_id);\n\n if (allRevisions.length === 0) {\n console.log(t('history.empty'));\n return;\n }\n\n const revisions = allRevisions.slice(0, MAX_REVISIONS);\n info(t('history.loading').replace('{count}', String(revisions.length)));\n\n // Fetch _meta.json from each revision to get the message\n const messages = await Promise.all(\n revisions.map(async (rev) => {\n try {\n const gist = await getGistAtRevision(config.token, config.gist_id!, rev.version);\n const meta = parseMeta(gist);\n return meta?.last_sync.message ?? null;\n } catch {\n return null;\n }\n }),\n );\n\n heading(t('history.title'));\n for (let i = 0; i < revisions.length; i++) {\n const rev = revisions[i];\n const date = new Date(rev.committed_at).toLocaleString();\n const shortSha = rev.version.slice(0, 8);\n const stats = `+${rev.change_status.additions} -${rev.change_status.deletions}`;\n const msg = messages[i];\n\n const prefix = i === 0 ? c.green('●') : c.dim('○');\n const msgStr = msg ? ` ${c.cyan(msg)}` : '';\n console.log(` ${prefix} ${c.bold(shortSha)} ${c.dim(date)} ${c.yellow(stats)}${msgStr}`);\n }\n\n if (allRevisions.length > MAX_REVISIONS) {\n console.log(c.dim(` ${t('history.more').replace('{count}', String(allRevisions.length - MAX_REVISIONS))}`));\n }\n\n console.log(`\\n${t('history.total').replace('{count}', String(allRevisions.length))}`);\n console.log(c.dim(t('history.rollback_hint')));\n}\n","import { writeFileSync, mkdirSync, existsSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { t } from '../utils/i18n.js';\nimport { info, success, warn, error, heading, confirm, c, printDiff } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { getGistAtRevision, parseMeta, getHistory } from '../core/gist.js';\nimport { scanFiles } from '../core/scanner.js';\nimport { simpleDiff } from '../core/conflict.js';\nimport { decrypt, isEncrypted } from '../core/crypto.js';\nimport { claudeDir, isPathSafe, fromGistFilename } from '../utils/paths.js';\n\nconst META_FILE = '_meta.json';\n\nexport async function runRollback(version: string): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n if (!config.gist_id) {\n error(t('rollback.no_gist'));\n return;\n }\n\n // Resolve short SHA to full SHA\n const revisions = await getHistory(config.token, config.gist_id);\n const matched = revisions.find((r) => r.version.startsWith(version));\n if (!matched) {\n error(t('rollback.not_found').replace('{version}', version));\n return;\n }\n\n const fullSha = matched.version;\n info(t('rollback.restoring').replace('{sha}', fullSha.slice(0, 8)).replace('{date}', new Date(matched.committed_at).toLocaleString()));\n\n // Fetch Gist at that revision\n const gist = await getGistAtRevision(config.token, config.gist_id, fullSha);\n const meta = parseMeta(gist);\n const localFiles = scanFiles();\n const localMap = new Map(localFiles.map((f) => [f.gistFilename, f]));\n const base = claudeDir();\n\n // Show diff\n const filesToApply: Array<{ relativePath: string; content: string }> = [];\n\n heading(t('rollback.target_heading'));\n for (const [gistName, gistFile] of Object.entries(gist.files)) {\n if (gistName === META_FILE || !gistFile?.content) continue;\n\n const entry = meta?.file_map[gistName];\n const relativePath = entry?.path ?? fromGistFilename(gistName);\n const local = localMap.get(gistName);\n\n if (!local) {\n console.log(` ${c.green('+')} ${relativePath} ${t('rollback.new_file')}`);\n } else if (local.content !== gistFile.content) {\n console.log(` ${c.yellow('~')} ${relativePath}`);\n const diff = simpleDiff(local.content, gistFile.content);\n if (diff.length <= 20) {\n printDiff(relativePath, diff);\n }\n } else {\n continue; // unchanged\n }\n\n let content = gistFile.content;\n const needsDecrypt = entry?.encrypted || isEncrypted(content);\n if (needsDecrypt) {\n try {\n content = decrypt(content, config.token);\n } catch {\n error(t('rollback.decrypt_failed').replace('{path}', relativePath));\n continue;\n }\n }\n filesToApply.push({ relativePath, content });\n }\n\n if (filesToApply.length === 0) {\n success(t('rollback.no_changes'));\n return;\n }\n\n console.log(`\\n${t('rollback.files_changed').replace('{count}', String(filesToApply.length))}`);\n\n const ok = await confirm(t('rollback.confirm'));\n if (!ok) {\n warn(t('rollback.cancelled'));\n return;\n }\n\n // Apply\n for (const { relativePath, content } of filesToApply) {\n if (!isPathSafe(relativePath)) {\n error(`${t('error.path_unsafe')} ${relativePath}`);\n continue;\n }\n\n const targetPath = join(base, relativePath);\n if (existsSync(targetPath)) {\n copyFileSync(targetPath, targetPath + '.bak');\n }\n const dir = dirname(targetPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(targetPath, content, 'utf-8');\n }\n\n success(t('rollback.success').replace('{sha}', fullSha.slice(0, 8)));\n}\n","import { readFileSync, writeFileSync, unlinkSync, existsSync, chmodSync } from 'node:fs';\nimport { autoConfigPath } from '../utils/paths.js';\nimport type { AutoConfig } from '../types.js';\n\nexport function saveAutoConfig(config: AutoConfig): void {\n const path = autoConfigPath();\n writeFileSync(path, JSON.stringify(config, null, 2), 'utf-8');\n chmodSync(path, 0o600);\n}\n\nexport function loadAutoConfig(): AutoConfig | null {\n const path = autoConfigPath();\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as AutoConfig;\n } catch {\n return null;\n }\n}\n\nexport function removeAutoConfig(): void {\n const path = autoConfigPath();\n if (existsSync(path)) unlinkSync(path);\n}\n","import { writeFileSync, unlinkSync, existsSync, mkdirSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { t } from '../utils/i18n.js';\n\nconst LAUNCHD_LABEL = 'com.claudesync.auto';\nconst SYSTEMD_SERVICE = 'claudesync-auto';\n\n// ── Template generators (pure, testable) ────────────────────\n\nexport function buildLaunchdPlist(cliArgs: string[], intervalSeconds: number): string {\n const argsXml = [...cliArgs, 'auto-run']\n .map((arg) => ` <string>${arg}</string>`)\n .join('\\n');\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${argsXml}\n </array>\n <key>StartInterval</key>\n <integer>${intervalSeconds}</integer>\n <key>RunAtLoad</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${join(homedir(), '.claudesync', 'launchd-stdout.log')}</string>\n <key>StandardErrorPath</key>\n <string>${join(homedir(), '.claudesync', 'launchd-stderr.log')}</string>\n</dict>\n</plist>`;\n}\n\nexport function buildSystemdService(cliArgs: string[]): string {\n const execStart = [...cliArgs, 'auto-run'].join(' ');\n return `[Unit]\nDescription=claudesync auto sync\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\nExecStart=${execStart}\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\n\n[Install]\nWantedBy=default.target`;\n}\n\nexport function buildSystemdTimer(intervalSeconds: number): string {\n return `[Unit]\nDescription=claudesync auto sync timer\n\n[Timer]\nOnBootSec=60s\nOnUnitActiveSec=${intervalSeconds}s\nPersistent=true\n\n[Install]\nWantedBy=timers.target`;\n}\n\nexport function buildSchtasksXml(cliArgs: string[], intervalSeconds: number): string {\n const command = cliArgs[0];\n const args = [...cliArgs.slice(1), 'auto-run'].join(' ');\n const minutes = Math.max(1, Math.round(intervalSeconds / 60));\n return `<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<Task version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\">\n <RegistrationInfo>\n <Description>claudesync-auto automatic sync</Description>\n </RegistrationInfo>\n <Triggers>\n <TimeTrigger>\n <Repetition>\n <Interval>PT${minutes}M</Interval>\n <StopAtDurationEnd>false</StopAtDurationEnd>\n </Repetition>\n <StartBoundary>2026-01-01T00:00:00</StartBoundary>\n <Enabled>true</Enabled>\n </TimeTrigger>\n </Triggers>\n <Actions>\n <Exec>\n <Command>${command}</Command>\n <Arguments>${args}</Arguments>\n </Exec>\n </Actions>\n <Settings>\n <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>\n <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>\n <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>\n </Settings>\n</Task>`;\n}\n\n// ── Resolve CLI path ────────────────────────────────────────\n\nfunction resolveCliArgs(): string[] {\n // 1. Try global install → single binary\n try {\n const bin = execSync('which claudesync', { encoding: 'utf-8' }).trim();\n return [bin];\n } catch { /* not globally installed */ }\n\n // 2. Fallback: node + script path (e.g. nvm, local dev)\n const scriptPath = process.argv[1];\n if (scriptPath) {\n return [process.execPath, scriptPath];\n }\n\n throw new Error(t('error.cli_not_found'));\n}\n\n// ── Register / Unregister ───────────────────────────────────\n\nexport function registerScheduler(intervalSeconds: number): void {\n const cliArgs = resolveCliArgs();\n\n if (process.platform === 'darwin') {\n registerLaunchd(cliArgs, intervalSeconds);\n } else if (process.platform === 'linux') {\n registerSystemd(cliArgs, intervalSeconds);\n } else if (process.platform === 'win32') {\n registerSchtasks(cliArgs, intervalSeconds);\n } else {\n throw new Error(t('error.unsupported_platform').replace('{platform}', process.platform));\n }\n}\n\nexport function unregisterScheduler(): void {\n if (process.platform === 'darwin') {\n unregisterLaunchd();\n } else if (process.platform === 'linux') {\n unregisterSystemd();\n } else if (process.platform === 'win32') {\n unregisterSchtasks();\n }\n}\n\n// ── macOS launchd ───────────────────────────────────────────\n\nfunction launchdPlistPath(): string {\n return join(homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`);\n}\n\nfunction registerLaunchd(cliArgs: string[], intervalSeconds: number): void {\n const plistDir = join(homedir(), 'Library', 'LaunchAgents');\n if (!existsSync(plistDir)) mkdirSync(plistDir, { recursive: true });\n\n const plistPath = launchdPlistPath();\n\n // Unload if already loaded\n try {\n execSync(`launchctl unload \"${plistPath}\"`, { stdio: 'ignore' });\n } catch { /* not loaded */ }\n\n writeFileSync(plistPath, buildLaunchdPlist(cliArgs, intervalSeconds), 'utf-8');\n execSync(`launchctl load \"${plistPath}\"`, { stdio: 'ignore' });\n}\n\nfunction unregisterLaunchd(): void {\n const plistPath = launchdPlistPath();\n if (existsSync(plistPath)) {\n try {\n execSync(`launchctl unload \"${plistPath}\"`, { stdio: 'ignore' });\n } catch { /* already unloaded */ }\n unlinkSync(plistPath);\n }\n}\n\n// ── Linux systemd ───────────────────────────────────────────\n\nfunction systemdDir(): string {\n return join(homedir(), '.config', 'systemd', 'user');\n}\n\nfunction registerSystemd(cliArgs: string[], intervalSeconds: number): void {\n const dir = systemdDir();\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n writeFileSync(join(dir, `${SYSTEMD_SERVICE}.service`), buildSystemdService(cliArgs), 'utf-8');\n writeFileSync(join(dir, `${SYSTEMD_SERVICE}.timer`), buildSystemdTimer(intervalSeconds), 'utf-8');\n\n execSync('systemctl --user daemon-reload', { stdio: 'ignore' });\n execSync(`systemctl --user enable --now ${SYSTEMD_SERVICE}.timer`, { stdio: 'ignore' });\n}\n\nfunction unregisterSystemd(): void {\n const dir = systemdDir();\n try {\n execSync(`systemctl --user disable --now ${SYSTEMD_SERVICE}.timer`, { stdio: 'ignore' });\n } catch { /* not enabled */ }\n\n const servicePath = join(dir, `${SYSTEMD_SERVICE}.service`);\n const timerPath = join(dir, `${SYSTEMD_SERVICE}.timer`);\n if (existsSync(servicePath)) unlinkSync(servicePath);\n if (existsSync(timerPath)) unlinkSync(timerPath);\n\n try {\n execSync('systemctl --user daemon-reload', { stdio: 'ignore' });\n } catch { /* ignore */ }\n}\n\n// ── Windows Task Scheduler ──────────────────────────────────\n\nfunction registerSchtasks(cliArgs: string[], intervalSeconds: number): void {\n const xmlPath = join(homedir(), '.claudesync', 'schtask.xml');\n writeFileSync(xmlPath, buildSchtasksXml(cliArgs, intervalSeconds), 'utf-16le');\n execSync(`schtasks /Create /TN \"claudesync-auto\" /XML \"${xmlPath}\" /F`, { stdio: 'ignore' });\n unlinkSync(xmlPath);\n}\n\nfunction unregisterSchtasks(): void {\n try {\n execSync('schtasks /Delete /TN \"claudesync-auto\" /F', { stdio: 'ignore' });\n } catch { /* not registered */ }\n}\n","import { t } from '../utils/i18n.js';\nimport { success, warn, error, heading, confirm, ask, select, c } from '../utils/terminal.js';\nimport { loadConfig } from '../core/auth.js';\nimport { getGist, parseMeta } from '../core/gist.js';\nimport { saveAutoConfig } from '../core/auto-config.js';\nimport { registerScheduler, unregisterScheduler } from '../core/scheduler.js';\nimport { machineName, platformString, getMachineId } from '../utils/paths.js';\nimport { CATEGORIES } from '../types.js';\nimport type { AutoConfig, AutoDirection, PullConflictPolicy, Category, PrimaryDevice } from '../types.js';\nimport { hostname } from 'node:os';\n\nconst MIN_INTERVAL_SECONDS = 60;\n\nfunction parseInterval(input: string): number | null {\n const match = input.trim().match(/^(\\d+)\\s*(s|m|h|d)$/i);\n if (!match) return null;\n const value = parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n switch (unit) {\n case 's': return value;\n case 'm': return value * 60;\n case 'h': return value * 3600;\n case 'd': return value * 86400;\n default: return null;\n }\n}\n\nfunction formatInterval(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${seconds / 60}m`;\n if (seconds < 86400) return `${seconds / 3600}h`;\n return `${seconds / 86400}d`;\n}\n\nexport async function runAuto(): Promise<void> {\n const config = loadConfig();\n if (!config?.token) {\n error(t('auth.no_token'));\n return;\n }\n if (!config.gist_id) {\n error(t('auto.no_gist'));\n return;\n }\n\n heading(t('auto.title'));\n\n // 1. Direction\n const dirIdx = await select(t('auto.select_direction'), [\n t('auto.direction_push'),\n t('auto.direction_pull'),\n ]);\n const direction: AutoDirection = dirIdx === 0 ? 'push' : 'pull';\n\n // 2. Push-specific: check primary device\n let primaryDevice: PrimaryDevice | undefined;\n if (direction === 'push') {\n try {\n const gist = await getGist(config.token, config.gist_id);\n const meta = parseMeta(gist);\n if (meta?.primary_device) {\n const current = meta.primary_device;\n const isMe = current.machine_id === getMachineId();\n if (!isMe) {\n console.log();\n warn(\n t('auto.primary_warning')\n .replace('{machine}', current.machine)\n .replace('{hostname}', current.hostname),\n );\n const ok = await confirm(t('auto.confirm_primary_change'), false);\n if (!ok) {\n warn(t('auto.setup_cancelled'));\n return;\n }\n }\n }\n } catch {\n // Can't fetch gist — proceed anyway\n }\n\n primaryDevice = {\n machine_id: getMachineId(),\n machine: machineName(),\n hostname: hostname(),\n platform: platformString(),\n registered_at: new Date().toISOString(),\n };\n }\n\n // 3. Pull-specific: conflict policy\n let conflictPolicy: PullConflictPolicy | undefined;\n if (direction === 'pull') {\n const policyIdx = await select(t('auto.select_conflict_policy'), [\n t('auto.policy_overwrite'),\n t('auto.policy_skip'),\n t('auto.policy_backup'),\n ]);\n conflictPolicy = (['overwrite', 'skip', 'backup'] as const)[policyIdx];\n }\n\n // 4. Interval\n let intervalSeconds: number | null = null;\n while (intervalSeconds === null) {\n const input = await ask(t('auto.select_interval') + ' ');\n intervalSeconds = parseInterval(input);\n if (intervalSeconds === null) {\n warn(t('auto.interval_invalid'));\n continue;\n }\n if (intervalSeconds < MIN_INTERVAL_SECONDS) {\n warn(t('auto.interval_too_short'));\n intervalSeconds = null;\n }\n }\n\n // 5. Categories\n console.log();\n const allCats = [...CATEGORIES];\n console.log(`${t('auto.select_categories')}`);\n console.log(` ${c.dim(allCats.join(', '))}`);\n const catInput = await ask('> ');\n let selectedCategories: Category[] = catInput.trim()\n ? catInput.split(',').map((s) => s.trim()).filter((s) => allCats.includes(s as Category)) as Category[]\n : [...allCats];\n\n if (catInput.trim() && selectedCategories.length === 0) {\n warn(t('auto.invalid_categories'));\n selectedCategories = [...allCats];\n }\n\n // 6. Encryption\n const encrypt = await confirm(t('auto.select_encrypt'), false);\n\n // 7. Save config\n const autoConfig: AutoConfig = {\n direction,\n interval_seconds: intervalSeconds,\n categories: selectedCategories,\n encrypt,\n enabled: true,\n created_at: new Date().toISOString(),\n ...(conflictPolicy && { conflict_policy: conflictPolicy }),\n };\n saveAutoConfig(autoConfig);\n\n // 8. Register OS scheduler\n try {\n unregisterScheduler(); // Clean up any existing\n registerScheduler(intervalSeconds);\n } catch (err) {\n error(t('auto.scheduler_failed').replace('{error}', err instanceof Error ? err.message : String(err)));\n return;\n }\n\n // 9. Update primary device in Gist (push only)\n if (direction === 'push' && primaryDevice) {\n try {\n const { scanFiles } = await import('../core/scanner.js');\n const files = scanFiles();\n const { updateGist: updateGistFn } = await import('../core/gist.js');\n await updateGistFn(config.token, config.gist_id, files, undefined, undefined, 'auto-sync: primary device registered', primaryDevice);\n } catch {\n warn(t('auto.primary_register_failed'));\n }\n }\n\n // 10. Summary\n console.log();\n success(t('auto.enabled'));\n console.log(` ${c.bold(t('auto.summary_direction') + ':')} ${direction}`);\n console.log(` ${c.bold(t('auto.summary_interval') + ':')} ${formatInterval(intervalSeconds)}`);\n console.log(` ${c.bold(t('auto.summary_categories') + ':')} ${selectedCategories.join(', ')}`);\n console.log(` ${c.bold(t('auto.summary_encrypt') + ':')} ${encrypt ? t('auto.yes') : t('auto.no')}`);\n if (conflictPolicy) {\n console.log(` ${c.bold(t('auto.summary_conflict') + ':')} ${conflictPolicy}`);\n }\n}\n","import { writeFileSync, readFileSync, unlinkSync, existsSync } from 'node:fs';\nimport { lockFilePath } from '../utils/paths.js';\n\nconst STALE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface LockData {\n pid: number;\n timestamp: number;\n}\n\nexport function acquireLock(): boolean {\n const path = lockFilePath();\n\n if (existsSync(path)) {\n try {\n const data: LockData = JSON.parse(readFileSync(path, 'utf-8'));\n const age = Date.now() - data.timestamp;\n if (age > STALE_TIMEOUT_MS) {\n unlinkSync(path);\n } else {\n return false;\n }\n } catch {\n unlinkSync(path);\n }\n }\n\n const lockData: LockData = { pid: process.pid, timestamp: Date.now() };\n writeFileSync(path, JSON.stringify(lockData), 'utf-8');\n return true;\n}\n\nexport function releaseLock(): void {\n const path = lockFilePath();\n if (existsSync(path)) {\n unlinkSync(path);\n }\n}\n\nexport function isLocked(): boolean {\n const path = lockFilePath();\n if (!existsSync(path)) return false;\n\n try {\n const data: LockData = JSON.parse(readFileSync(path, 'utf-8'));\n const age = Date.now() - data.timestamp;\n if (age > STALE_TIMEOUT_MS) {\n unlinkSync(path);\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n","import { appendFileSync, readFileSync, existsSync } from 'node:fs';\nimport { autoLogPath } from '../utils/paths.js';\n\ntype LogStatus = 'success' | 'error' | 'skipped';\n\nexport function appendLog(direction: string, status: LogStatus, message: string): void {\n const timestamp = new Date().toISOString();\n const line = `${timestamp} [${direction}] [${status}] ${message}\\n`;\n appendFileSync(autoLogPath(), line, 'utf-8');\n}\n\nexport function readRecentLogs(count: number): string[] {\n const path = autoLogPath();\n if (!existsSync(path)) return [];\n\n const content = readFileSync(path, 'utf-8').trim();\n if (!content) return [];\n\n const lines = content.split('\\n');\n return lines.slice(-count);\n}\n","import { readFileSync, writeFileSync, unlinkSync, existsSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { pendingNotificationsPath } from '../utils/paths.js';\n\ninterface PendingNotification {\n level: 'info' | 'warning' | 'error';\n message: string;\n timestamp: string;\n}\n\n/** Send OS-native notification (best-effort, never throws) */\nexport function sendOsNotification(title: string, message: string): void {\n try {\n if (process.platform === 'darwin') {\n execFileSync('osascript', [\n '-e',\n `display notification \"${message}\" with title \"${title}\"`,\n ], { stdio: 'ignore' });\n } else if (process.platform === 'linux') {\n execFileSync('notify-send', [title, message], { stdio: 'ignore' });\n } else if (process.platform === 'win32') {\n const ps = [\n '[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null',\n `$template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText02)`,\n `$textNodes = $template.GetElementsByTagName('text')`,\n `$textNodes.Item(0).AppendChild($template.CreateTextNode('${title}')) | Out-Null`,\n `$textNodes.Item(1).AppendChild($template.CreateTextNode('${message}')) | Out-Null`,\n `$toast = [Windows.UI.Notifications.ToastNotification]::new($template)`,\n `[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('claudesync').Show($toast)`,\n ].join('; ');\n execFileSync('powershell', ['-Command', ps], { stdio: 'ignore' });\n }\n } catch {\n // Notification is best-effort — never fail the sync\n }\n}\n\n/** Add a notification to be shown on next CLI run */\nexport function addPendingNotification(level: PendingNotification['level'], message: string): void {\n const notifications = getPendingNotifications();\n notifications.push({ level, message, timestamp: new Date().toISOString() });\n writeFileSync(pendingNotificationsPath(), JSON.stringify(notifications, null, 2), 'utf-8');\n}\n\n/** Read all pending notifications */\nexport function getPendingNotifications(): PendingNotification[] {\n const path = pendingNotificationsPath();\n if (!existsSync(path)) return [];\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return [];\n }\n}\n\n/** Clear all pending notifications */\nexport function clearPendingNotifications(): void {\n const path = pendingNotificationsPath();\n if (existsSync(path)) unlinkSync(path);\n}\n","import { t } from '../utils/i18n.js';\nimport { loadConfig } from '../core/auth.js';\nimport { loadAutoConfig } from '../core/auto-config.js';\nimport { acquireLock, releaseLock } from '../core/lock.js';\nimport { appendLog } from '../core/auto-log.js';\nimport { sendOsNotification, addPendingNotification } from '../core/notify.js';\nimport { scanFiles } from '../core/scanner.js';\nimport { getGist, updateGist, createGist, parseMeta } from '../core/gist.js';\nimport { compareForPush, compareForPull } from '../core/conflict.js';\nimport { detectSecrets, redactContent } from '../core/redactor.js';\nimport { encrypt as encryptContent, decrypt, isEncrypted } from '../core/crypto.js';\nimport { claudeDir, isPathSafe, machineName, platformString, getMachineId } from '../utils/paths.js';\nimport type { AutoConfig, ScannedFile, PrimaryDevice } from '../types.js';\nimport { writeFileSync, mkdirSync, existsSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { hostname } from 'node:os';\n\nexport async function runAutoRun(): Promise<void> {\n const autoConfig = loadAutoConfig();\n if (!autoConfig || !autoConfig.enabled) {\n return; // Silently exit — scheduler might fire after disable\n }\n\n const authConfig = loadConfig();\n if (!authConfig?.token || !authConfig.gist_id) {\n appendLog(autoConfig.direction, 'error', 'No auth config or gist_id');\n return;\n }\n\n // Acquire lock\n if (!acquireLock()) {\n appendLog(autoConfig.direction, 'skipped', 'Lock held by another process');\n return;\n }\n\n try {\n if (autoConfig.direction === 'push') {\n await autoRunPush(autoConfig, authConfig.token, authConfig.gist_id);\n } else {\n await autoRunPull(autoConfig, authConfig.token, authConfig.gist_id);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n appendLog(autoConfig.direction, 'error', message);\n const failMsg = t('auto_run.failed').replace('{direction}', autoConfig.direction).replace('{message}', message);\n sendOsNotification('claudesync', failMsg);\n addPendingNotification('error', failMsg);\n } finally {\n releaseLock();\n }\n}\n\nasync function autoRunPush(\n autoConfig: AutoConfig,\n token: string,\n gistId: string,\n): Promise<void> {\n // Check if this machine is still the primary device\n try {\n const gist = await getGist(token, gistId);\n const meta = parseMeta(gist);\n if (meta?.primary_device) {\n const primary = meta.primary_device;\n if (primary.machine_id !== getMachineId()) {\n appendLog('push', 'skipped', `Not primary device (primary: ${primary.machine})`);\n return;\n }\n }\n } catch {\n // If we can't fetch, try to push anyway\n }\n\n // Scan local files (filtered by categories)\n let files = scanFiles();\n files = files.filter((f) => autoConfig.categories.includes(f.category));\n\n if (files.length === 0) {\n appendLog('push', 'skipped', 'No files to sync');\n return;\n }\n\n // Redact secrets\n const processedFiles: ScannedFile[] = files.map((file) => {\n const secrets = detectSecrets(file.content);\n if (secrets.length > 0) {\n return { ...file, content: redactContent(file.content, secrets) };\n }\n return file;\n });\n\n // Encrypt if configured\n const encryptedFiles = new Set<string>();\n const finalFiles = autoConfig.encrypt\n ? processedFiles.map((f) => {\n encryptedFiles.add(f.gistFilename);\n return { ...f, content: encryptContent(f.content, token) };\n })\n : processedFiles;\n\n // Compare with remote\n try {\n const gist = await getGist(token, gistId);\n const changes = compareForPush(finalFiles, gist);\n const modified = changes.filter((c) => c.status !== 'unchanged');\n\n if (modified.length === 0) {\n appendLog('push', 'skipped', 'No changes detected');\n return;\n }\n\n const deletedFiles = changes.filter((c) => c.status === 'deleted').map((c) => c.gistFilename);\n const filesToUpload = finalFiles.filter((f) =>\n changes.some((c) => c.gistFilename === f.gistFilename && c.status !== 'unchanged'),\n );\n\n const primaryDevice: PrimaryDevice = {\n machine_id: getMachineId(),\n machine: machineName(),\n hostname: hostname(),\n platform: platformString(),\n registered_at: new Date().toISOString(),\n };\n\n await updateGist(token, gistId, filesToUpload, deletedFiles, encryptedFiles, 'auto-sync push', primaryDevice);\n appendLog('push', 'success', t('auto_run.push_synced').replace('{count}', String(modified.length)));\n } catch (err) {\n if (String(err).includes('404')) {\n const primaryDevice: PrimaryDevice = {\n machine: machineName(),\n hostname: hostname(),\n platform: platformString(),\n registered_at: new Date().toISOString(),\n };\n const newGist = await createGist(token, finalFiles, encryptedFiles, 'auto-sync push (new gist)', primaryDevice);\n appendLog('push', 'success', `Created new gist: ${newGist.id}`);\n } else {\n throw err;\n }\n }\n}\n\nasync function autoRunPull(\n autoConfig: AutoConfig,\n token: string,\n gistId: string,\n): Promise<void> {\n const gist = await getGist(token, gistId);\n const localFiles = scanFiles();\n const filteredLocal = localFiles.filter((f) => autoConfig.categories.includes(f.category));\n\n const changes = compareForPull(gist, filteredLocal);\n const modified = changes.filter((c) => c.status !== 'unchanged');\n\n // Filter by configured categories\n const meta = parseMeta(gist);\n const toApply = modified.filter((c) => autoConfig.categories.includes(c.category));\n\n if (toApply.length === 0) {\n appendLog('pull', 'skipped', 'No changes detected');\n return;\n }\n\n const base = claudeDir();\n let applied = 0;\n let skipped = 0;\n\n for (const change of toApply) {\n if (!isPathSafe(change.relativePath)) continue;\n if (change.status === 'deleted') continue;\n\n const targetPath = join(base, change.relativePath);\n let content = change.remoteContent ?? '';\n\n // Decrypt if needed\n const metaEntry = meta?.file_map[change.gistFilename];\n const needsDecrypt = metaEntry?.encrypted || isEncrypted(content);\n if (needsDecrypt) {\n try {\n content = decrypt(content, token);\n } catch {\n appendLog('pull', 'error', `Decrypt failed: ${change.relativePath}`);\n continue;\n }\n }\n\n // Apply conflict policy for modified files\n if (change.status === 'modified' && autoConfig.conflict_policy) {\n switch (autoConfig.conflict_policy) {\n case 'skip':\n if (change.localContent && change.localContent !== content) {\n skipped++;\n continue;\n }\n break;\n case 'backup':\n if (existsSync(targetPath)) {\n copyFileSync(targetPath, targetPath + '.bak');\n }\n break;\n case 'overwrite':\n break;\n }\n }\n\n // Ensure directory exists\n const dir = dirname(targetPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n writeFileSync(targetPath, content, 'utf-8');\n applied++;\n }\n\n const message = skipped > 0\n ? t('auto_run.pull_applied_skipped').replace('{applied}', String(applied)).replace('{skipped}', String(skipped))\n : t('auto_run.pull_applied').replace('{applied}', String(applied));\n appendLog('pull', 'success', message);\n}\n","import { t } from '../utils/i18n.js';\nimport { success, warn } from '../utils/terminal.js';\nimport { loadAutoConfig, removeAutoConfig } from '../core/auto-config.js';\nimport { unregisterScheduler } from '../core/scheduler.js';\n\nexport async function runAutoDisable(): Promise<void> {\n const config = loadAutoConfig();\n if (!config) {\n warn(t('auto.not_configured'));\n return;\n }\n\n // Unregister OS scheduler\n try {\n unregisterScheduler();\n } catch {\n // Best-effort — scheduler might already be gone\n }\n\n // Remove config\n removeAutoConfig();\n\n success(t('auto.disabled'));\n}\n","import { t } from '../utils/i18n.js';\nimport { heading, warn, c } from '../utils/terminal.js';\nimport { loadAutoConfig } from '../core/auto-config.js';\nimport { readRecentLogs } from '../core/auto-log.js';\nimport { loadConfig } from '../core/auth.js';\nimport { getGist, parseMeta } from '../core/gist.js';\nimport { getMachineId } from '../utils/paths.js';\n\nfunction formatInterval(seconds: number): string {\n if (seconds < 60) return t('auto.interval_seconds').replace('{n}', String(seconds));\n if (seconds < 3600) return t('auto.interval_minutes').replace('{n}', String(Math.round(seconds / 60)));\n if (seconds < 86400) return t('auto.interval_hours').replace('{n}', String(Math.round(seconds / 3600)));\n return t('auto.interval_days').replace('{n}', String(Math.round(seconds / 86400)));\n}\n\nexport async function runAutoStatus(): Promise<void> {\n const autoConfig = loadAutoConfig();\n\n heading(t('auto.status_title'));\n\n if (!autoConfig) {\n warn(t('auto.not_configured'));\n return;\n }\n\n console.log(` ${c.bold(t('auto.status_label') + ':')} ${autoConfig.enabled ? c.green(t('auto.status_enabled')) : c.red(t('auto.status_disabled'))}`);\n console.log(` ${c.bold(t('auto.summary_direction') + ':')} ${autoConfig.direction}`);\n console.log(` ${c.bold(t('auto.summary_interval') + ':')} ${formatInterval(autoConfig.interval_seconds)}`);\n console.log(` ${c.bold(t('auto.summary_categories') + ':')} ${autoConfig.categories.join(', ')}`);\n console.log(` ${c.bold(t('auto.summary_encrypt') + ':')} ${autoConfig.encrypt ? t('auto.yes') : t('auto.no')}`);\n if (autoConfig.conflict_policy) {\n console.log(` ${c.bold(t('auto.summary_conflict') + ':')} ${autoConfig.conflict_policy}`);\n }\n console.log(` ${c.bold(t('auto.created_label') + ':')} ${autoConfig.created_at}`);\n\n // Show primary device info from Gist\n const authConfig = loadConfig();\n if (authConfig?.token && authConfig.gist_id) {\n try {\n const gist = await getGist(authConfig.token, authConfig.gist_id);\n const meta = parseMeta(gist);\n if (meta?.primary_device) {\n const pd = meta.primary_device;\n const isMe = pd.machine_id === getMachineId();\n console.log();\n console.log(` ${c.bold(t('auto.primary_device_label') + ':')}`);\n console.log(` ${t('status.machine')}: ${pd.machine} ${isMe ? c.green(t('auto.this_machine')) : ''}`);\n console.log(` ${t('status.host')}: ${pd.hostname}`);\n console.log(` ${t('status.platform')}: ${pd.platform}`);\n console.log(` ${t('auto.since_label')}: ${pd.registered_at}`);\n }\n } catch {\n // Can't fetch — skip\n }\n }\n\n // Show recent logs\n const logs = readRecentLogs(5);\n if (logs.length > 0) {\n console.log();\n console.log(` ${c.bold(t('auto.recent_logs_label') + ':')}`);\n for (const log of logs) {\n const colored = log\n .replace(/\\[success\\]/g, c.green('[success]'))\n .replace(/\\[error\\]/g, c.red('[error]'))\n .replace(/\\[skipped\\]/g, c.yellow('[skipped]'));\n console.log(` ${colored}`);\n }\n }\n}\n","import { setLang, detectLang, t, loadLangConfig } from './utils/i18n.js';\nimport { error, info, warn } from './utils/terminal.js';\n\nimport { runInit } from './commands/init.js';\nimport { runPush } from './commands/push.js';\nimport { runPull } from './commands/pull.js';\nimport { runDiff } from './commands/diff.js';\nimport { runStatus } from './commands/status.js';\nimport { runHistory } from './commands/history.js';\nimport { runRollback } from './commands/rollback.js';\nimport { runAuto } from './commands/auto.js';\nimport { runAutoRun } from './commands/auto-run.js';\nimport { runAutoDisable } from './commands/auto-disable.js';\nimport { runAutoStatus } from './commands/auto-status.js';\nimport { getPendingNotifications, clearPendingNotifications } from './core/notify.js';\nimport type { Category } from './types.js';\nimport { CATEGORIES } from './types.js';\n\nconst VERSION = '0.1.0';\n\nfunction parseArgs(argv: string[]) {\n const args = argv.slice(2);\n const flags: Record<string, string | boolean> = {};\n const positional: string[] = [];\n let command: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n const eqIdx = arg.indexOf('=');\n if (eqIdx !== -1) {\n flags[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);\n } else if (i + 1 < args.length && !args[i + 1].startsWith('-')) {\n flags[arg.slice(2)] = args[i + 1];\n i++;\n } else {\n flags[arg.slice(2)] = true;\n }\n } else if (arg.startsWith('-') && arg.length === 2) {\n if (i + 1 < args.length && !args[i + 1].startsWith('-')) {\n flags[arg.slice(1)] = args[i + 1];\n i++;\n } else {\n flags[arg.slice(1)] = true;\n }\n } else {\n if (!command) {\n command = arg;\n } else {\n positional.push(arg);\n }\n }\n }\n\n return { command, flags, positional };\n}\n\nfunction printHelp(): void {\n console.log(`\n${t('app.name')} v${VERSION}\n${t('app.description')}\n\n${t('help.usage')}\n\n${t('help.commands')}\n init ${t('help.init')}\n init --token ${t('help.init_token')}\n link <gist-id> ${t('help.link')}\n push ${t('help.push')}\n pull ${t('help.pull')}\n diff ${t('help.diff')}\n status ${t('help.status')}\n list ${t('help.list')}\n history ${t('help.history')}\n rollback <version> ${t('help.rollback')}\n auto ${t('help.auto')}\n auto disable ${t('help.auto_disable')}\n auto status ${t('help.auto_status')}\n config <key> <value> ${t('help.config')}\n\n${t('help.options')}\n -m, --message <msg> ${t('help.opt_message')}\n --only <category> ${t('help.opt_only')}\n --force ${t('help.opt_force')}\n --encrypt ${t('help.opt_encrypt')}\n --lang=ko|en ${t('help.opt_lang')}\n -h, --help ${t('help.opt_help')}\n -v, --version ${t('help.opt_version')}\n`);\n}\n\nfunction parseCategory(value: string | boolean | undefined): Category | undefined {\n if (typeof value === 'string' && (CATEGORIES as readonly string[]).includes(value)) {\n return value as Category;\n }\n return undefined;\n}\n\nasync function main() {\n const { command, flags, positional } = parseArgs(process.argv);\n\n // Language: --lang flag > config.json > env detection > en default\n const langFlag = flags['lang'];\n if (langFlag === 'ko' || langFlag === 'en') {\n setLang(langFlag);\n } else {\n const saved = loadLangConfig();\n setLang(saved ?? detectLang());\n }\n\n // Version\n if (flags['v'] || flags['version']) {\n console.log(VERSION);\n return;\n }\n\n // Help\n if (!command || flags['h'] || flags['help']) {\n printHelp();\n return;\n }\n\n const only = parseCategory(flags['only']);\n const force = !!flags['force'];\n const encrypt = !!flags['encrypt'];\n const message = typeof flags['m'] === 'string' ? flags['m'] :\n typeof flags['message'] === 'string' ? flags['message'] : undefined;\n\n try {\n // Show pending notifications from auto sync\n if (command !== 'auto-run') {\n const notifications = getPendingNotifications();\n if (notifications.length > 0) {\n for (const n of notifications) {\n if (n.level === 'error') error(n.message);\n else if (n.level === 'warning') warn(n.message);\n else info(n.message);\n }\n clearPendingNotifications();\n console.log();\n }\n }\n switch (command) {\n case 'init':\n await runInit({ useToken: !!flags['token'] });\n break;\n case 'link':\n if (!positional[0]) {\n error(t('cli.link_usage'));\n process.exit(1);\n }\n await runInit({ linkGistId: positional[0] });\n break;\n case 'push':\n await runPush({ only, force, encrypt, message });\n break;\n case 'pull':\n await runPull({ only, force });\n break;\n case 'diff':\n await runDiff({ only });\n break;\n case 'status':\n await runStatus();\n break;\n case 'list': {\n const { scanFiles } = await import('./core/scanner.js');\n const files = scanFiles(only);\n if (files.length === 0) {\n console.log(t('cli.list_empty'));\n } else {\n for (const f of files) {\n console.log(` [${f.category}] ${f.relativePath}`);\n }\n console.log(`\\n${t('cli.list_total').replace('{count}', String(files.length))}`);\n }\n break;\n }\n case 'history':\n await runHistory();\n break;\n case 'rollback':\n if (!positional[0]) {\n error(t('cli.rollback_usage'));\n process.exit(1);\n }\n await runRollback(positional[0]);\n break;\n case 'auto':\n if (positional[0] === 'disable') {\n await runAutoDisable();\n } else if (positional[0] === 'status') {\n await runAutoStatus();\n } else {\n await runAuto();\n }\n break;\n case 'config': {\n const { runConfig } = await import('./commands/config.js');\n runConfig(positional);\n break;\n }\n case 'auto-run':\n await runAutoRun();\n break;\n default:\n error(t('cli.unknown_command').replace('{command}', command));\n printHelp();\n process.exit(1);\n }\n } catch (err) {\n error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["c","writeFileSync","existsSync","c","existsSync","writeFileSync","writeFileSync","mkdirSync","existsSync","copyFileSync","join","dirname","META_FILE","join","existsSync","copyFileSync","dirname","mkdirSync","writeFileSync","readFileSync","writeFileSync","existsSync","chmodSync","writeFileSync","chmodSync","existsSync","readFileSync","writeFileSync","unlinkSync","existsSync","mkdirSync","execSync","join","join","execSync","existsSync","mkdirSync","writeFileSync","unlinkSync","encrypt","scanFiles","writeFileSync","readFileSync","unlinkSync","existsSync","existsSync","readFileSync","unlinkSync","writeFileSync","readFileSync","existsSync","existsSync","readFileSync","readFileSync","writeFileSync","unlinkSync","existsSync","writeFileSync","existsSync","readFileSync","unlinkSync","writeFileSync","mkdirSync","existsSync","copyFileSync","join","dirname","hostname","c","formatInterval","encrypt","scanFiles"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
error,
|
|
4
|
+
loadLangConfig,
|
|
5
|
+
saveLangConfig,
|
|
6
|
+
success,
|
|
7
|
+
t
|
|
8
|
+
} from "./chunk-XTJEVOK3.js";
|
|
9
|
+
import "./chunk-VBOSEAEH.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/config.ts
|
|
12
|
+
function runConfig(args) {
|
|
13
|
+
if (args.length === 0 || args[0] === "list") {
|
|
14
|
+
const lang = loadLangConfig();
|
|
15
|
+
console.log(` lang: ${lang ?? t("config.not_set")}`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const [key, value] = args;
|
|
19
|
+
if (key === "lang") {
|
|
20
|
+
if (value !== "ko" && value !== "en") {
|
|
21
|
+
error(t("config.invalid_lang"));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
saveLangConfig(value);
|
|
25
|
+
success(t("config.lang_saved"));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
error(t("config.unknown_key"));
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
runConfig
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=config-7KJ6CZMX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/config.ts"],"sourcesContent":["import { t } from '../utils/i18n.js';\nimport { success, error } from '../utils/terminal.js';\nimport { saveLangConfig, loadLangConfig } from '../utils/i18n.js';\n\nexport function runConfig(args: string[]): void {\n if (args.length === 0 || args[0] === 'list') {\n const lang = loadLangConfig();\n console.log(` lang: ${lang ?? t('config.not_set')}`);\n return;\n }\n\n const [key, value] = args;\n\n if (key === 'lang') {\n if (value !== 'ko' && value !== 'en') {\n error(t('config.invalid_lang'));\n return;\n }\n saveLangConfig(value);\n success(t('config.lang_saved'));\n return;\n }\n\n error(t('config.unknown_key'));\n}\n"],"mappings":";;;;;;;;;;;AAIO,SAAS,UAAU,MAAsB;AAC9C,MAAI,KAAK,WAAW,KAAK,KAAK,CAAC,MAAM,QAAQ;AAC3C,UAAM,OAAO,eAAe;AAC5B,YAAQ,IAAI,WAAW,QAAQ,EAAE,gBAAgB,CAAC,EAAE;AACpD;AAAA,EACF;AAEA,QAAM,CAAC,KAAK,KAAK,IAAI;AAErB,MAAI,QAAQ,QAAQ;AAClB,QAAI,UAAU,QAAQ,UAAU,MAAM;AACpC,YAAM,EAAE,qBAAqB,CAAC;AAC9B;AAAA,IACF;AACA,mBAAe,KAAK;AACpB,YAAQ,EAAE,mBAAmB,CAAC;AAC9B;AAAA,EACF;AAEA,QAAM,EAAE,oBAAoB,CAAC;AAC/B;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createGist,
|
|
4
|
+
findGist,
|
|
5
|
+
getGist,
|
|
6
|
+
getGistAtRevision,
|
|
7
|
+
getHistory,
|
|
8
|
+
parseMeta,
|
|
9
|
+
updateGist
|
|
10
|
+
} from "./chunk-45GTBXRR.js";
|
|
11
|
+
import "./chunk-VBOSEAEH.js";
|
|
12
|
+
export {
|
|
13
|
+
createGist,
|
|
14
|
+
findGist,
|
|
15
|
+
getGist,
|
|
16
|
+
getGistAtRevision,
|
|
17
|
+
getHistory,
|
|
18
|
+
parseMeta,
|
|
19
|
+
updateGist
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=gist-AMKOY723.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-settings-sync",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Sync Claude Code settings across machines via GitHub Gist",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"claudesync": "./bin/claudesync.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsup",
|
|
11
|
+
"dev": "tsup --watch",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"test:watch": "vitest"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"bin",
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"claude",
|
|
21
|
+
"claude-code",
|
|
22
|
+
"sync",
|
|
23
|
+
"settings",
|
|
24
|
+
"gist"
|
|
25
|
+
],
|
|
26
|
+
"author": "cares0",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/cares0/claudesync.git"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/cares0/claudesync",
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.4.0",
|
|
39
|
+
"vitest": "^3.0.0",
|
|
40
|
+
"@types/node": "^20.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|