From a42d4a70603ffac6f007da631f8be04828be0ba6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 04:29:05 +0000 Subject: [PATCH] Sync generated provider output --- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .kiro/skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .kiro/skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .pi/skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .pi/skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- .trae/skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .trae/skills/impeccable/scripts/live-wrap.mjs | 2 +- .../skills/impeccable/scripts/live-poll.mjs | 27 +++++++++++-------- .../skills/impeccable/scripts/live-wrap.mjs | 2 +- 26 files changed, 221 insertions(+), 156 deletions(-) diff --git a/.agents/skills/impeccable/scripts/live-poll.mjs b/.agents/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.agents/skills/impeccable/scripts/live-poll.mjs +++ b/.agents/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.agents/skills/impeccable/scripts/live-wrap.mjs b/.agents/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.agents/skills/impeccable/scripts/live-wrap.mjs +++ b/.agents/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.claude/skills/impeccable/scripts/live-poll.mjs b/.claude/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.claude/skills/impeccable/scripts/live-poll.mjs +++ b/.claude/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.claude/skills/impeccable/scripts/live-wrap.mjs b/.claude/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.claude/skills/impeccable/scripts/live-wrap.mjs +++ b/.claude/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.cursor/skills/impeccable/scripts/live-poll.mjs b/.cursor/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.cursor/skills/impeccable/scripts/live-poll.mjs +++ b/.cursor/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.cursor/skills/impeccable/scripts/live-wrap.mjs b/.cursor/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.cursor/skills/impeccable/scripts/live-wrap.mjs +++ b/.cursor/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.gemini/skills/impeccable/scripts/live-poll.mjs b/.gemini/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.gemini/skills/impeccable/scripts/live-poll.mjs +++ b/.gemini/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.gemini/skills/impeccable/scripts/live-wrap.mjs b/.gemini/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.gemini/skills/impeccable/scripts/live-wrap.mjs +++ b/.gemini/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.github/skills/impeccable/scripts/live-poll.mjs b/.github/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.github/skills/impeccable/scripts/live-poll.mjs +++ b/.github/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.github/skills/impeccable/scripts/live-wrap.mjs b/.github/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.github/skills/impeccable/scripts/live-wrap.mjs +++ b/.github/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.kiro/skills/impeccable/scripts/live-poll.mjs b/.kiro/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.kiro/skills/impeccable/scripts/live-poll.mjs +++ b/.kiro/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.kiro/skills/impeccable/scripts/live-wrap.mjs b/.kiro/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.kiro/skills/impeccable/scripts/live-wrap.mjs +++ b/.kiro/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.opencode/skills/impeccable/scripts/live-poll.mjs b/.opencode/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.opencode/skills/impeccable/scripts/live-poll.mjs +++ b/.opencode/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.opencode/skills/impeccable/scripts/live-wrap.mjs b/.opencode/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.opencode/skills/impeccable/scripts/live-wrap.mjs +++ b/.opencode/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.pi/skills/impeccable/scripts/live-poll.mjs b/.pi/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.pi/skills/impeccable/scripts/live-poll.mjs +++ b/.pi/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.pi/skills/impeccable/scripts/live-wrap.mjs b/.pi/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.pi/skills/impeccable/scripts/live-wrap.mjs +++ b/.pi/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.qoder/skills/impeccable/scripts/live-poll.mjs b/.qoder/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.qoder/skills/impeccable/scripts/live-poll.mjs +++ b/.qoder/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.qoder/skills/impeccable/scripts/live-wrap.mjs b/.qoder/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.qoder/skills/impeccable/scripts/live-wrap.mjs +++ b/.qoder/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.rovodev/skills/impeccable/scripts/live-poll.mjs b/.rovodev/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.rovodev/skills/impeccable/scripts/live-poll.mjs +++ b/.rovodev/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.rovodev/skills/impeccable/scripts/live-wrap.mjs b/.rovodev/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.rovodev/skills/impeccable/scripts/live-wrap.mjs +++ b/.rovodev/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.trae-cn/skills/impeccable/scripts/live-poll.mjs b/.trae-cn/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.trae-cn/skills/impeccable/scripts/live-poll.mjs +++ b/.trae-cn/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.trae-cn/skills/impeccable/scripts/live-wrap.mjs b/.trae-cn/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.trae-cn/skills/impeccable/scripts/live-wrap.mjs +++ b/.trae-cn/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/.trae/skills/impeccable/scripts/live-poll.mjs b/.trae/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/.trae/skills/impeccable/scripts/live-poll.mjs +++ b/.trae/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/.trae/skills/impeccable/scripts/live-wrap.mjs b/.trae/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/.trae/skills/impeccable/scripts/live-wrap.mjs +++ b/.trae/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path diff --git a/plugin/skills/impeccable/scripts/live-poll.mjs b/plugin/skills/impeccable/scripts/live-poll.mjs index b031055fe..740161e10 100644 --- a/plugin/skills/impeccable/scripts/live-poll.mjs +++ b/plugin/skills/impeccable/scripts/live-poll.mjs @@ -2,11 +2,11 @@ * CLI client for the live variant mode poll/reply protocol. * * Usage: - * npx impeccable poll # Block until browser event, print JSON - * npx impeccable poll --stream # Experimental: keep polling; one JSON line per event - * npx impeccable poll --timeout=600000 # Custom timeout (ms); default is long-poll friendly - * npx impeccable poll --reply done # Reply "done" to event - * npx impeccable poll --reply error "msg" # Reply with error + * node /live-poll.mjs # Block until browser event, print JSON + * node /live-poll.mjs --stream # Experimental: keep polling; one JSON line per event + * node /live-poll.mjs --timeout=600000 # Custom timeout (ms); default is long-poll friendly + * node /live-poll.mjs --reply done # Reply "done" to event + * node /live-poll.mjs --reply error "msg" # Reply with error */ import { execFileSync } from 'node:child_process'; @@ -15,6 +15,11 @@ import { fileURLToPath } from 'node:url'; import { completionAckForAcceptResult, completionTypeForAcceptResult } from './live/completion.mjs'; import { readLiveServerInfo } from './lib/impeccable-paths.mjs'; +// Absolute path to a sibling script in this skill's scripts dir, so runtime +// error hints print a directly-runnable command instead of a placeholder. +const SELF_DIR = path.dirname(fileURLToPath(import.meta.url)); +const scriptCmd = (name) => `node "${path.join(SELF_DIR, name)}"`; + // Node's built-in fetch (undici under the hood) enforces a 300s headers // timeout that can't be lowered per-request. We cap each request below // that ceiling and loop in `pollOnce` to synthesize a long poll without @@ -27,7 +32,7 @@ const EVENT_TYPES_NEEDING_AGENT_REPLY = new Set(['generate', 'steer', 'manual_ed function readServerInfo() { const record = readLiveServerInfo(process.cwd()); if (!record) { - console.error('No running live server found. Start one with: npx impeccable live'); + console.error(`No running live server found. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } return record.info; @@ -82,7 +87,7 @@ export function parseReplyArgs(args) { } function validateReplyArgs({ id, status }) { - const usage = "Usage: npx impeccable poll --reply [--file path] [--data ''] [message]"; + const usage = `Usage: ${scriptCmd('live-poll.mjs')} --reply [--file path] [--data ''] [message]`; if (!id || id.startsWith('--')) { const err = new Error(`${usage}\nMissing event id after --reply.`); err.code = 'INVALID_REPLY_ARGS'; @@ -283,11 +288,11 @@ export async function runPollStream(base, token, { function handlePollError(err) { if (err.code === 'AUTH_FAILED') { console.error(err.message); - console.error('Try restarting: npx impeccable live stop && npx impeccable live'); + console.error(`Try restarting: ${scriptCmd('live-server.mjs')} stop && ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); process.exit(1); } if (err.code === 'ACK_TIMEOUT') { @@ -331,7 +336,7 @@ Harness note: const info = readServerInfo(); const base = `http://localhost:${info.port}`; - // Reply mode: npx impeccable poll --reply [--file path] [--data ''] [message] + // Reply mode: node /live-poll.mjs --reply [--file path] [--data ''] [message] if (args.includes('--reply')) { let reply; try { @@ -345,7 +350,7 @@ Harness note: await postReply(base, info.token, reply); } catch (err) { if (err.cause?.code === 'ECONNREFUSED') { - console.error('Live server not running. Start one with: npx impeccable live'); + console.error(`Live server not running. Start one with: ${scriptCmd('live.mjs')}`); } else { console.error('Reply failed:', err.message); } diff --git a/plugin/skills/impeccable/scripts/live-wrap.mjs b/plugin/skills/impeccable/scripts/live-wrap.mjs index c3f00f3a4..438c01b68 100644 --- a/plugin/skills/impeccable/scripts/live-wrap.mjs +++ b/plugin/skills/impeccable/scripts/live-wrap.mjs @@ -2,7 +2,7 @@ * CLI helper: find an element in source and wrap it in a variant container. * * Usage: - * npx impeccable wrap --id SESSION_ID --count N --query "hero-combined-left" [--file path] + * node /live-wrap.mjs --id SESSION_ID --count N --query "hero-combined-left" [--file path] * * Searches project files for the element matching the query (class name, ID, or * text snippet), wraps it with the variant scaffolding, and prints the file path