@vreko/cli 3.3.0 → 3.3.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/{InitApp-YM5CK55D.js → InitApp-2J6XGUNQ.js} +3 -3
- package/dist/{InitApp-YM5CK55D.js.map → InitApp-2J6XGUNQ.js.map} +1 -1
- package/dist/{chunk-53BJRUUT.js → chunk-2OPUNVDJ.js} +4 -4
- package/dist/{chunk-53BJRUUT.js.map → chunk-2OPUNVDJ.js.map} +1 -1
- package/dist/{chunk-3YXBGNHD.js → chunk-AXNZWZ26.js} +3 -3
- package/dist/{chunk-3YXBGNHD.js.map → chunk-AXNZWZ26.js.map} +1 -1
- package/dist/{chunk-FROYVC6U.js → chunk-B42UQ2W7.js} +5 -5
- package/dist/{chunk-FROYVC6U.js.map → chunk-B42UQ2W7.js.map} +1 -1
- package/dist/{chunk-HEUTZR52.js → chunk-MWTSOZTM.js} +3 -2
- package/dist/chunk-MWTSOZTM.js.map +1 -0
- package/dist/{dashboardServer-2T7OBLSV.js → dashboardServer-MELKRCBX.js} +3 -3
- package/dist/{dashboardServer-2T7OBLSV.js.map → dashboardServer-MELKRCBX.js.map} +1 -1
- package/dist/index.js +19 -14
- package/dist/index.js.map +1 -1
- package/dist/init-command-ZUISJBCT.js +7 -0
- package/dist/{init-command-LXEBDSYX.js.map → init-command-ZUISJBCT.js.map} +1 -1
- package/dist/{init-core-ETGVVENN.js → init-core-FQYDSJWC.js} +5 -5
- package/dist/{init-core-ETGVVENN.js.map → init-core-FQYDSJWC.js.map} +1 -1
- package/package.json +1 -1
- package/scripts/publish-clean.mjs +14 -3
- package/dist/chunk-HEUTZR52.js.map +0 -1
- package/dist/init-command-LXEBDSYX.js +0 -7
- /package/dist/{._InitApp-YM5CK55D.js → ._InitApp-2J6XGUNQ.js} +0 -0
- /package/dist/{._InitApp-YM5CK55D.js.map → ._InitApp-2J6XGUNQ.js.map} +0 -0
- /package/dist/{._chunk-3YXBGNHD.js → ._chunk-2OPUNVDJ.js} +0 -0
- /package/dist/{._chunk-3YXBGNHD.js.map → ._chunk-2OPUNVDJ.js.map} +0 -0
- /package/dist/{._chunk-53BJRUUT.js → ._chunk-AXNZWZ26.js} +0 -0
- /package/dist/{._chunk-53BJRUUT.js.map → ._chunk-AXNZWZ26.js.map} +0 -0
- /package/dist/{._chunk-FROYVC6U.js → ._chunk-B42UQ2W7.js} +0 -0
- /package/dist/{._chunk-FROYVC6U.js.map → ._chunk-B42UQ2W7.js.map} +0 -0
- /package/dist/{._chunk-HEUTZR52.js → ._chunk-MWTSOZTM.js} +0 -0
- /package/dist/{._chunk-HEUTZR52.js.map → ._chunk-MWTSOZTM.js.map} +0 -0
- /package/dist/{._dashboardServer-2T7OBLSV.js → ._dashboardServer-MELKRCBX.js} +0 -0
- /package/dist/{._dashboardServer-2T7OBLSV.js.map → ._dashboardServer-MELKRCBX.js.map} +0 -0
- /package/dist/{._init-command-LXEBDSYX.js → ._init-command-ZUISJBCT.js} +0 -0
- /package/dist/{._init-command-LXEBDSYX.js.map → ._init-command-ZUISJBCT.js.map} +0 -0
- /package/dist/{._init-core-ETGVVENN.js → ._init-core-FQYDSJWC.js} +0 -0
- /package/dist/{._init-core-ETGVVENN.js.map → ._init-core-FQYDSJWC.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/degraded-state.ts","../src/services/service-client.ts"],"names":["renderDegradedState","opts","reason","messages","unreachable","timeout","fixes","lines","command","process","stderr","write","join","version","__CLI_VERSION__","client","connectionPromise","getDaemonClient","options","VrekoLocalClient","socketPath","autoReconnect","connectToDaemon","daemonClient","isConnected","connect","initialize","protocolVersion","clientInfo","name","isDaemonConnected","isDaemonAvailable","getDaemonStatus","connected","health","check","uptime","disconnectFromDaemon","close","withDaemon","fn","healthy","isServiceHealthy","exit","withDaemonOptional","_error"],"mappings":"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","file":"chunk-3YXBGNHD.js","sourcesContent":["/**\n * Degraded State Rendering\n *\n * Single source of truth for daemon-unavailable UX.\n * All commands must use renderDegradedState() when the daemon is unavailable.\n * No command may inline its own daemon-unavailable messaging.\n *\n * @module ui/degraded-state\n */\n\nexport interface DegradedStateOptions {\n\tcommand: string;\n\treason?: \"unreachable\" | \"timeout\" | \"version-mismatch\" | \"not-started\";\n}\n\n/**\n * Render consistent daemon-unavailable error message.\n *\n * This is the ONLY place that renders daemon-unavailable messaging.\n * All future changes to daemon-unavailable UX happen here and propagate automatically.\n *\n * @param opts - Options for rendering the degraded state\n */\nexport function renderDegradedState(opts: DegradedStateOptions): void {\n\tconst reason = opts.reason ?? \"unreachable\";\n\n\tconst messages: Record<typeof reason, string> = {\n\t\tunreachable: \"Vreko daemon is not running or not reachable.\",\n\t\ttimeout: \"Vreko daemon did not respond in time.\",\n\t\t\"version-mismatch\": \"Vreko daemon version does not match CLI version.\",\n\t\t\"not-started\": \"Vreko daemon has not been started.\",\n\t};\n\n\tconst fixes: Record<typeof reason, string> = {\n\t\tunreachable: \"vr daemon start\",\n\t\ttimeout: \"vr daemon restart\",\n\t\t\"version-mismatch\": \"vr upgrade\",\n\t\t\"not-started\": \"vr daemon start\",\n\t};\n\n\t// Four-part degraded-state message per industry standard (Docker, GitHub CLI, WCAG):\n\t// 1. What is unavailable (text severity prefix, no color dependence)\n\t// 2. What is affected (the specific command that failed)\n\t// 3. What to do (primary recovery action)\n\t// 4. What still works (offline fallback)\n\tconst lines = [\n\t\t`[ERROR] ${messages[reason]}`,\n\t\t` Command '${opts.command}' requires the daemon.`,\n\t\t` Run: ${fixes[reason]}`,\n\t\t\" Commands that work offline: vr learn, vr check, vr session status\",\n\t\t\" Diagnostics: vr doctor\",\n\t];\n\n\tprocess.stderr.write(`${lines.join(\"\\n\")}\\n`);\n}\n","/**\n * Daemon Client Service\n *\n * Manages connection to the Vreko local service daemon (vrekod).\n * All intelligence operations are proxied through the daemon for IP protection.\n *\n * ## Architecture\n *\n * ```\n * CLI Commands\n * ↓\n * DaemonClientService (this file)\n * ↓\n * @vreko/local-service-client (IPC client)\n * ↓\n * vrekod daemon (Unix socket / named pipe)\n * ↓\n * @vreko/intelligence (runs in daemon process)\n * ```\n *\n * ## IP Protection\n *\n * - CLI has NO direct imports of @vreko/intelligence\n * - All intelligence code runs in the daemon process\n * - CLI only has types from @vreko/contracts and local-service-client\n *\n * ## Canonical Daemon Connection Patterns\n *\n * **For commands that require the daemon:**\n * - Use `withDaemon(command, fn)` - exits with code 1 on failure\n * - Always calls `renderDegradedState()` for consistent error messaging\n * - No inline daemon-unavailable messaging allowed\n *\n * **For commands with graceful degraded mode:**\n * - Use `withDaemonOptional(command, fn)` - does not exit on failure\n * - Callback receives `client | null` to handle degraded state\n * - Surfaces clear \"limited mode\" indicator to user\n *\n * **Do NOT use:**\n * - `requireDaemon()` - deprecated, replaced by withDaemon/withDaemonOptional\n * - Inline error handling for daemon unavailability\n *\n * @module services/service-client\n */\n\n// Version is inlined at build time by tsup's define option\n// This avoids runtime package.json resolution issues in bundled output\ndeclare const __CLI_VERSION__: string | undefined;\n\nimport { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { isServiceHealthy } from \"../service-adapter/local-service-adapter.js\";\nimport { type DegradedStateOptions, renderDegradedState } from \"../ui/degraded-state.js\";\n\n// Use build-time version if available, otherwise fall back to package.json\n// This supports both production builds (tsup defines __CLI_VERSION__) and dev (tsx)\nlet version = \"0.0.0\";\nif (typeof __CLI_VERSION__ !== \"undefined\") {\n\tversion = __CLI_VERSION__;\n} else {\n\ttry {\n\t\t// Dynamic import for dev mode - works with tsx\n\t\t// eslint-disable-next-line @typescript-eslint/no-require-imports\n\t\tconst pkg = require(\"../../package.json\") as { version: string };\n\t\tversion = pkg.version ?? \"0.0.0\";\n\t} catch {\n\t\t// Fallback if package.json can't be loaded\n\t\tversion = \"0.0.0-dev\";\n\t}\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DaemonStatus {\n\tconnected: boolean;\n\tversion?: string;\n\tuptime?: number;\n}\n\nexport interface DaemonClientOptions {\n\t/** Socket path for IPC (default: OS-specific) */\n\tsocketPath?: string;\n\t/** Auto-reconnect on disconnect */\n\tautoReconnect?: boolean;\n\t/**\n\t * Connection probe timeout hint (ms). Accepted but not forwarded to\n\t * VrekoLocalClient - per DAEMON-06, the 5s probe hint must not become\n\t * the per-request RPC timeout. Reserved for a future probe mechanism.\n\t */\n\ttimeout?: number;\n}\n\n// =============================================================================\n// SINGLETON CLIENT\n// =============================================================================\n\nlet client: VrekoLocalClient | null = null;\nlet connectionPromise: Promise<void> | null = null;\n\n/**\n * Get or create the daemon client\n *\n * @param options - Client options\n * @returns The daemon client instance\n */\nexport function getDaemonClient(options: DaemonClientOptions = {}): VrekoLocalClient {\n\tif (!client) {\n\t\tclient = new VrekoLocalClient({\n\t\t\tsocketPath: options.socketPath,\n\t\t\t// DAEMON-06: No timeout forwarded. IpcConnection hardcodes its own 5s connect\n\t\t\t// timeout (client.ts:140). Per-request RPC timeout defaults to 30s from\n\t\t\t// VrekoLocalClient constructor - unverified against large-repo cold-start\n\t\t\t// (workspace/analyze on next.js/shadcn). If hero-capture runs hit this ceiling,\n\t\t\t// VrekoLocalClient.call() needs a per-request timeout override.\n\t\t\tautoReconnect: options.autoReconnect ?? true,\n\t\t});\n\t}\n\treturn client;\n}\n\n/**\n * Connect to the daemon\n *\n * @param options - Connection options\n * @throws If connection fails\n */\nexport async function connectToDaemon(options: DaemonClientOptions = {}): Promise<VrekoLocalClient> {\n\tconst daemonClient = getDaemonClient(options);\n\n\t// Avoid duplicate connection attempts\n\tif (connectionPromise) {\n\t\tawait connectionPromise;\n\t\treturn daemonClient;\n\t}\n\n\tif (daemonClient.isConnected()) {\n\t\treturn daemonClient;\n\t}\n\n\tconnectionPromise = (async () => {\n\t\tawait daemonClient.connect();\n\n\t\t// Initialize protocol\n\t\tawait daemonClient.initialize({\n\t\t\tprotocolVersion: \"1.0.0\",\n\t\t\tclientInfo: {\n\t\t\t\tname: \"@vreko/cli\",\n\t\t\t\tversion,\n\t\t\t},\n\t\t});\n\t})();\n\n\ttry {\n\t\tawait connectionPromise;\n\t} finally {\n\t\tconnectionPromise = null;\n\t}\n\n\treturn daemonClient;\n}\n\n/**\n * Check if daemon is connected\n */\nexport function isDaemonConnected(): boolean {\n\treturn client?.isConnected() ?? false;\n}\n\n/**\n * Check if daemon is available (try to connect)\n *\n * @returns true if daemon is running and accessible\n */\nexport async function isDaemonAvailable(): Promise<boolean> {\n\ttry {\n\t\tawait connectToDaemon();\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get daemon status\n */\nexport async function getDaemonStatus(): Promise<DaemonStatus> {\n\tif (!isDaemonConnected()) {\n\t\treturn { connected: false };\n\t}\n\n\ttry {\n\t\tconst daemonClient = getDaemonClient();\n\t\tconst health = await daemonClient.health.check();\n\t\treturn {\n\t\t\tconnected: true,\n\t\t\tversion: health.version,\n\t\t\tuptime: health.uptime,\n\t\t};\n\t} catch {\n\t\treturn { connected: false };\n\t}\n}\n\n/**\n * Disconnect from the daemon\n */\nexport function disconnectFromDaemon(): void {\n\tif (client) {\n\t\tclient.close();\n\t\tclient = null;\n\t}\n}\n\n/**\n * Canonical wrapper for commands that require daemon connectivity.\n *\n * Rules:\n * - withDaemon() always calls renderDegradedState() on failure - never logs inline\n * - withDaemon() always exits with code 1 on failure - no silent degradation\n * - withDaemon() accepts the command name string for telemetry attribution\n *\n * @param command - Command name for telemetry attribution\n * @param fn - Function to execute with daemon client\n * @param opts - Optional degradation reason\n * @returns Result from fn, or never exits on failure\n */\nexport async function withDaemon<T>(\n\tcommand: string,\n\tfn: (client: VrekoLocalClient) => Promise<T>,\n\topts?: { reason?: DegradedStateOptions[\"reason\"] },\n): Promise<T | never> {\n\t// DAEMON-03: pre-flight socket probe - catches zombie daemon (PID alive, socket dead).\n\t// isServiceHealthy() is async; the missing-await form would be silently truthy (Pitfall 4).\n\tconst healthy = await isServiceHealthy();\n\tif (!healthy) {\n\t\trenderDegradedState({ command, reason: opts?.reason ?? \"unreachable\" });\n\t\tprocess.exit(1);\n\t}\n\n\tlet client: VrekoLocalClient | null = null;\n\n\ttry {\n\t\tclient = await connectToDaemon();\n\t\tawait client.health.check();\n\t} catch {\n\t\trenderDegradedState({ command, reason: opts?.reason ?? \"unreachable\" });\n\t\tprocess.exit(1);\n\t}\n\n\treturn fn(client);\n}\n\n/**\n * Canonical wrapper for commands with graceful offline mode.\n *\n * Some commands can show partial data without the daemon. These use a different\n * wrapper that does not exit on failure but surfaces a clear \"limited mode\" indicator.\n *\n * Rules:\n * - withDaemonOptional() does not exit on failure\n * - withDaemonOptional() surfaces a clear \"limited mode\" indicator\n * - withDaemonOptional() accepts client | null in the callback function\n *\n * @param command - Command name for telemetry attribution\n * @param fn - Function to execute with daemon client (may receive null)\n * @returns Result from fn\n */\nexport async function withDaemonOptional<T>(\n\tcommand: string,\n\tfn: (client: VrekoLocalClient | null) => Promise<T>,\n): Promise<T> {\n\tlet client: VrekoLocalClient | null = null;\n\n\ttry {\n\t\tclient = await connectToDaemon();\n\t\tawait client.health.check();\n\t} catch (_error) {\n\t\tvoid _error;\n\t\tclient = null;\n\t}\n\n\treturn fn(client);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/degraded-state.ts","../src/services/service-client.ts"],"names":["renderDegradedState","opts","reason","messages","unreachable","timeout","fixes","lines","command","process","stderr","write","join","version","__CLI_VERSION__","client","connectionPromise","getDaemonClient","options","VrekoLocalClient","socketPath","autoReconnect","connectToDaemon","daemonClient","isConnected","connect","initialize","protocolVersion","clientInfo","name","isDaemonConnected","isDaemonAvailable","getDaemonStatus","connected","health","check","uptime","disconnectFromDaemon","close","withDaemon","fn","healthy","isServiceHealthy","exit","withDaemonOptional","_error"],"mappings":"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","file":"chunk-AXNZWZ26.js","sourcesContent":["/**\n * Degraded State Rendering\n *\n * Single source of truth for daemon-unavailable UX.\n * All commands must use renderDegradedState() when the daemon is unavailable.\n * No command may inline its own daemon-unavailable messaging.\n *\n * @module ui/degraded-state\n */\n\nexport interface DegradedStateOptions {\n\tcommand: string;\n\treason?: \"unreachable\" | \"timeout\" | \"version-mismatch\" | \"not-started\";\n}\n\n/**\n * Render consistent daemon-unavailable error message.\n *\n * This is the ONLY place that renders daemon-unavailable messaging.\n * All future changes to daemon-unavailable UX happen here and propagate automatically.\n *\n * @param opts - Options for rendering the degraded state\n */\nexport function renderDegradedState(opts: DegradedStateOptions): void {\n\tconst reason = opts.reason ?? \"unreachable\";\n\n\tconst messages: Record<typeof reason, string> = {\n\t\tunreachable: \"Vreko daemon is not running or not reachable.\",\n\t\ttimeout: \"Vreko daemon did not respond in time.\",\n\t\t\"version-mismatch\": \"Vreko daemon version does not match CLI version.\",\n\t\t\"not-started\": \"Vreko daemon has not been started.\",\n\t};\n\n\tconst fixes: Record<typeof reason, string> = {\n\t\tunreachable: \"vr daemon start\",\n\t\ttimeout: \"vr daemon restart\",\n\t\t\"version-mismatch\": \"vr upgrade\",\n\t\t\"not-started\": \"vr daemon start\",\n\t};\n\n\t// Four-part degraded-state message per industry standard (Docker, GitHub CLI, WCAG):\n\t// 1. What is unavailable (text severity prefix, no color dependence)\n\t// 2. What is affected (the specific command that failed)\n\t// 3. What to do (primary recovery action)\n\t// 4. What still works (offline fallback)\n\tconst lines = [\n\t\t`[ERROR] ${messages[reason]}`,\n\t\t` Command '${opts.command}' requires the daemon.`,\n\t\t` Run: ${fixes[reason]}`,\n\t\t\" Commands that work offline: vr learn, vr check, vr session status\",\n\t\t\" Diagnostics: vr doctor\",\n\t];\n\n\tprocess.stderr.write(`${lines.join(\"\\n\")}\\n`);\n}\n","/**\n * Daemon Client Service\n *\n * Manages connection to the Vreko local service daemon (vrekod).\n * All intelligence operations are proxied through the daemon for IP protection.\n *\n * ## Architecture\n *\n * ```\n * CLI Commands\n * ↓\n * DaemonClientService (this file)\n * ↓\n * @vreko/local-service-client (IPC client)\n * ↓\n * vrekod daemon (Unix socket / named pipe)\n * ↓\n * @vreko/intelligence (runs in daemon process)\n * ```\n *\n * ## IP Protection\n *\n * - CLI has NO direct imports of @vreko/intelligence\n * - All intelligence code runs in the daemon process\n * - CLI only has types from @vreko/contracts and local-service-client\n *\n * ## Canonical Daemon Connection Patterns\n *\n * **For commands that require the daemon:**\n * - Use `withDaemon(command, fn)` - exits with code 1 on failure\n * - Always calls `renderDegradedState()` for consistent error messaging\n * - No inline daemon-unavailable messaging allowed\n *\n * **For commands with graceful degraded mode:**\n * - Use `withDaemonOptional(command, fn)` - does not exit on failure\n * - Callback receives `client | null` to handle degraded state\n * - Surfaces clear \"limited mode\" indicator to user\n *\n * **Do NOT use:**\n * - `requireDaemon()` - deprecated, replaced by withDaemon/withDaemonOptional\n * - Inline error handling for daemon unavailability\n *\n * @module services/service-client\n */\n\n// Version is inlined at build time by tsup's define option\n// This avoids runtime package.json resolution issues in bundled output\ndeclare const __CLI_VERSION__: string | undefined;\n\nimport { VrekoLocalClient } from \"@vreko/local-service-client\";\nimport { isServiceHealthy } from \"../service-adapter/local-service-adapter.js\";\nimport { type DegradedStateOptions, renderDegradedState } from \"../ui/degraded-state.js\";\n\n// Use build-time version if available, otherwise fall back to package.json\n// This supports both production builds (tsup defines __CLI_VERSION__) and dev (tsx)\nlet version = \"0.0.0\";\nif (typeof __CLI_VERSION__ !== \"undefined\") {\n\tversion = __CLI_VERSION__;\n} else {\n\ttry {\n\t\t// Dynamic import for dev mode - works with tsx\n\t\t// eslint-disable-next-line @typescript-eslint/no-require-imports\n\t\tconst pkg = require(\"../../package.json\") as { version: string };\n\t\tversion = pkg.version ?? \"0.0.0\";\n\t} catch {\n\t\t// Fallback if package.json can't be loaded\n\t\tversion = \"0.0.0-dev\";\n\t}\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DaemonStatus {\n\tconnected: boolean;\n\tversion?: string;\n\tuptime?: number;\n}\n\nexport interface DaemonClientOptions {\n\t/** Socket path for IPC (default: OS-specific) */\n\tsocketPath?: string;\n\t/** Auto-reconnect on disconnect */\n\tautoReconnect?: boolean;\n\t/**\n\t * Connection probe timeout hint (ms). Accepted but not forwarded to\n\t * VrekoLocalClient - per DAEMON-06, the 5s probe hint must not become\n\t * the per-request RPC timeout. Reserved for a future probe mechanism.\n\t */\n\ttimeout?: number;\n}\n\n// =============================================================================\n// SINGLETON CLIENT\n// =============================================================================\n\nlet client: VrekoLocalClient | null = null;\nlet connectionPromise: Promise<void> | null = null;\n\n/**\n * Get or create the daemon client\n *\n * @param options - Client options\n * @returns The daemon client instance\n */\nexport function getDaemonClient(options: DaemonClientOptions = {}): VrekoLocalClient {\n\tif (!client) {\n\t\tclient = new VrekoLocalClient({\n\t\t\tsocketPath: options.socketPath,\n\t\t\t// DAEMON-06: No timeout forwarded. IpcConnection hardcodes its own 5s connect\n\t\t\t// timeout (client.ts:140). Per-request RPC timeout defaults to 30s from\n\t\t\t// VrekoLocalClient constructor - unverified against large-repo cold-start\n\t\t\t// (workspace/analyze on next.js/shadcn). If hero-capture runs hit this ceiling,\n\t\t\t// VrekoLocalClient.call() needs a per-request timeout override.\n\t\t\tautoReconnect: options.autoReconnect ?? true,\n\t\t});\n\t}\n\treturn client;\n}\n\n/**\n * Connect to the daemon\n *\n * @param options - Connection options\n * @throws If connection fails\n */\nexport async function connectToDaemon(options: DaemonClientOptions = {}): Promise<VrekoLocalClient> {\n\tconst daemonClient = getDaemonClient(options);\n\n\t// Avoid duplicate connection attempts\n\tif (connectionPromise) {\n\t\tawait connectionPromise;\n\t\treturn daemonClient;\n\t}\n\n\tif (daemonClient.isConnected()) {\n\t\treturn daemonClient;\n\t}\n\n\tconnectionPromise = (async () => {\n\t\tawait daemonClient.connect();\n\n\t\t// Initialize protocol\n\t\tawait daemonClient.initialize({\n\t\t\tprotocolVersion: \"1.0.0\",\n\t\t\tclientInfo: {\n\t\t\t\tname: \"@vreko/cli\",\n\t\t\t\tversion,\n\t\t\t},\n\t\t});\n\t})();\n\n\ttry {\n\t\tawait connectionPromise;\n\t} finally {\n\t\tconnectionPromise = null;\n\t}\n\n\treturn daemonClient;\n}\n\n/**\n * Check if daemon is connected\n */\nexport function isDaemonConnected(): boolean {\n\treturn client?.isConnected() ?? false;\n}\n\n/**\n * Check if daemon is available (try to connect)\n *\n * @returns true if daemon is running and accessible\n */\nexport async function isDaemonAvailable(): Promise<boolean> {\n\ttry {\n\t\tawait connectToDaemon();\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get daemon status\n */\nexport async function getDaemonStatus(): Promise<DaemonStatus> {\n\tif (!isDaemonConnected()) {\n\t\treturn { connected: false };\n\t}\n\n\ttry {\n\t\tconst daemonClient = getDaemonClient();\n\t\tconst health = await daemonClient.health.check();\n\t\treturn {\n\t\t\tconnected: true,\n\t\t\tversion: health.version,\n\t\t\tuptime: health.uptime,\n\t\t};\n\t} catch {\n\t\treturn { connected: false };\n\t}\n}\n\n/**\n * Disconnect from the daemon\n */\nexport function disconnectFromDaemon(): void {\n\tif (client) {\n\t\tclient.close();\n\t\tclient = null;\n\t}\n}\n\n/**\n * Canonical wrapper for commands that require daemon connectivity.\n *\n * Rules:\n * - withDaemon() always calls renderDegradedState() on failure - never logs inline\n * - withDaemon() always exits with code 1 on failure - no silent degradation\n * - withDaemon() accepts the command name string for telemetry attribution\n *\n * @param command - Command name for telemetry attribution\n * @param fn - Function to execute with daemon client\n * @param opts - Optional degradation reason\n * @returns Result from fn, or never exits on failure\n */\nexport async function withDaemon<T>(\n\tcommand: string,\n\tfn: (client: VrekoLocalClient) => Promise<T>,\n\topts?: { reason?: DegradedStateOptions[\"reason\"] },\n): Promise<T | never> {\n\t// DAEMON-03: pre-flight socket probe - catches zombie daemon (PID alive, socket dead).\n\t// isServiceHealthy() is async; the missing-await form would be silently truthy (Pitfall 4).\n\tconst healthy = await isServiceHealthy();\n\tif (!healthy) {\n\t\trenderDegradedState({ command, reason: opts?.reason ?? \"unreachable\" });\n\t\tprocess.exit(1);\n\t}\n\n\tlet client: VrekoLocalClient | null = null;\n\n\ttry {\n\t\tclient = await connectToDaemon();\n\t\tawait client.health.check();\n\t} catch {\n\t\trenderDegradedState({ command, reason: opts?.reason ?? \"unreachable\" });\n\t\tprocess.exit(1);\n\t}\n\n\treturn fn(client);\n}\n\n/**\n * Canonical wrapper for commands with graceful offline mode.\n *\n * Some commands can show partial data without the daemon. These use a different\n * wrapper that does not exit on failure but surfaces a clear \"limited mode\" indicator.\n *\n * Rules:\n * - withDaemonOptional() does not exit on failure\n * - withDaemonOptional() surfaces a clear \"limited mode\" indicator\n * - withDaemonOptional() accepts client | null in the callback function\n *\n * @param command - Command name for telemetry attribution\n * @param fn - Function to execute with daemon client (may receive null)\n * @returns Result from fn\n */\nexport async function withDaemonOptional<T>(\n\tcommand: string,\n\tfn: (client: VrekoLocalClient | null) => Promise<T>,\n): Promise<T> {\n\tlet client: VrekoLocalClient | null = null;\n\n\ttry {\n\t\tclient = await connectToDaemon();\n\t\tawait client.health.check();\n\t} catch (_error) {\n\t\tvoid _error;\n\t\tclient = null;\n\t}\n\n\treturn fn(client);\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { cliState } from './chunk-GRMRYWYS.js';
|
|
3
|
-
import { findGitRoot } from './chunk-
|
|
4
|
-
import { getDaemonClient, connectToDaemon } from './chunk-
|
|
3
|
+
import { findGitRoot } from './chunk-MWTSOZTM.js';
|
|
4
|
+
import { getDaemonClient, connectToDaemon } from './chunk-AXNZWZ26.js';
|
|
5
5
|
import { getServicePidPath } from './chunk-AV5Y3YR6.js';
|
|
6
6
|
import { resolveVrekoBinaryPath, detectAIClients, getVrekoMCPConfig, writeClientConfig } from './chunk-BZ7DRTR7.js';
|
|
7
7
|
import { __name } from './chunk-EWOJGXRX.js';
|
|
@@ -794,7 +794,7 @@ Or, bundled: Ground Truth ships as the headline skill inside \`@vreko/skills\` n
|
|
|
794
794
|
**License:** MIT (methodology); skill file free to distribute
|
|
795
795
|
**Canonical URL:** https://vreko.dev/ground-truth
|
|
796
796
|
`;
|
|
797
|
-
var cliVersion = "3.
|
|
797
|
+
var cliVersion = "3.3.1" ;
|
|
798
798
|
function createInitCommand() {
|
|
799
799
|
return new Command("init").description("Bootstrap Vreko for a repository").argument("[path]", "Workspace path (default: current directory)").option("-y, --yes", "Skip confirmation prompts").option("--non-interactive", "Run without prompts (extension/automation)").option("--json", "Output structured JSON result").option("--dry-run", "Show what would be configured").option("--force", "Re-initialize even if already set up").option("--skip-mcp", "Skip MCP configuration").option("--skip-service", "Skip service registration").option("--api-key <key>", "API key for Pro features").option("--dev", "Use local dev mode for MCP").option("--npm", "Use npm/npx mode for MCP").option("-q, --quiet", "Suppress informational output").option("-v, --verbose", "Show detailed detection reasoning").action(async (path, options) => {
|
|
800
800
|
const result = await runInit(path, options);
|
|
@@ -1689,5 +1689,5 @@ function fail(spinner, result, message) {
|
|
|
1689
1689
|
__name(fail, "fail");
|
|
1690
1690
|
|
|
1691
1691
|
export { createHooksCommand, createInitCommand, generateClaudeIntegration };
|
|
1692
|
-
//# sourceMappingURL=chunk-
|
|
1693
|
-
//# sourceMappingURL=chunk-
|
|
1692
|
+
//# sourceMappingURL=chunk-B42UQ2W7.js.map
|
|
1693
|
+
//# sourceMappingURL=chunk-B42UQ2W7.js.map
|