@sniper.ai/cli 1.0.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -15
- package/dist/index.js +2866 -453
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/config.ts","../src/scaffolder.ts","../src/commands/status.ts","../src/commands/add-pack.ts","../src/pack-manager.ts","../src/commands/remove-pack.ts","../src/commands/list-packs.ts","../src/commands/update.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { defineCommand, runMain } from \"citty\";\nimport { initCommand } from \"./commands/init.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { addPackCommand } from \"./commands/add-pack.js\";\nimport { removePackCommand } from \"./commands/remove-pack.js\";\nimport { listPacksCommand } from \"./commands/list-packs.js\";\nimport { updateCommand } from \"./commands/update.js\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\");\n\nconst main = defineCommand({\n meta: {\n name: \"sniper\",\n version,\n description: \"SNIPER — Spawn, Navigate, Implement, Parallelize, Evaluate, Release\",\n },\n subCommands: {\n init: initCommand,\n status: statusCommand,\n \"add-pack\": addPackCommand,\n \"remove-pack\": removePackCommand,\n \"list-packs\": listPacksCommand,\n update: updateCommand,\n },\n});\n\nrunMain(main);\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists, type SniperConfig } from \"../config.js\";\nimport { scaffoldProject } from \"../scaffolder.js\";\n\nexport const initCommand = defineCommand({\n meta: {\n name: \"init\",\n description: \"Initialize a new SNIPER-enabled project\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n p.intro(\"SNIPER — Project Initialization\");\n\n // Check if already initialized\n if (await sniperConfigExists(cwd)) {\n const overwrite = await p.confirm({\n message:\n \"SNIPER is already initialized in this directory. Reinitialize?\",\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n }\n\n const projectName = await p.text({\n message: \"Project name:\",\n placeholder: \"my-app\",\n validate: (v) => (v.length === 0 ? \"Project name is required\" : undefined),\n });\n if (p.isCancel(projectName)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const projectType = await p.select({\n message: \"Project type:\",\n options: [\n { value: \"saas\", label: \"SaaS\" },\n { value: \"api\", label: \"API\" },\n { value: \"mobile\", label: \"Mobile\" },\n { value: \"cli\", label: \"CLI\" },\n { value: \"library\", label: \"Library\" },\n { value: \"monorepo\", label: \"Monorepo\" },\n ],\n });\n if (p.isCancel(projectType)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const description = await p.text({\n message: \"One-line project description:\",\n placeholder: \"A brief description of your project\",\n });\n if (p.isCancel(description)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const language = await p.select({\n message: \"Primary language:\",\n options: [\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"python\", label: \"Python\" },\n { value: \"go\", label: \"Go\" },\n { value: \"rust\", label: \"Rust\" },\n { value: \"java\", label: \"Java\" },\n ],\n });\n if (p.isCancel(language)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const frontend = await p.select({\n message: \"Frontend framework:\",\n options: [\n { value: \"react\", label: \"React\" },\n { value: \"nextjs\", label: \"Next.js\" },\n { value: \"vue\", label: \"Vue\" },\n { value: \"svelte\", label: \"Svelte\" },\n { value: \"none\", label: \"None\" },\n ],\n });\n if (p.isCancel(frontend)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const backend = await p.select({\n message: \"Backend framework:\",\n options: [\n { value: \"node-express\", label: \"Node + Express\" },\n { value: \"node-fastify\", label: \"Node + Fastify\" },\n { value: \"django\", label: \"Django\" },\n { value: \"fastapi\", label: \"FastAPI\" },\n { value: \"gin\", label: \"Go Gin\" },\n { value: \"none\", label: \"None\" },\n ],\n });\n if (p.isCancel(backend)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const database = await p.select({\n message: \"Primary database:\",\n options: [\n { value: \"postgresql\", label: \"PostgreSQL\" },\n { value: \"mysql\", label: \"MySQL\" },\n { value: \"mongodb\", label: \"MongoDB\" },\n { value: \"sqlite\", label: \"SQLite\" },\n { value: \"none\", label: \"None\" },\n ],\n });\n if (p.isCancel(database)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const infrastructure = await p.select({\n message: \"Cloud infrastructure:\",\n options: [\n { value: \"aws\", label: \"AWS\" },\n { value: \"gcp\", label: \"Google Cloud\" },\n { value: \"azure\", label: \"Azure\" },\n { value: \"vercel\", label: \"Vercel\" },\n { value: \"none\", label: \"None / Self-hosted\" },\n ],\n });\n if (p.isCancel(infrastructure)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const maxTeammates = await p.text({\n message: \"Max concurrent agent teammates:\",\n placeholder: \"5\",\n initialValue: \"5\",\n validate: (v) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1 || n > 10) return \"Must be 1-10\";\n return undefined;\n },\n });\n if (p.isCancel(maxTeammates)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n // Build config\n const config: SniperConfig = {\n project: {\n name: projectName as string,\n type: projectType as string,\n description: (description as string) || \"\",\n },\n stack: {\n language: language as string,\n frontend: frontend === \"none\" ? null : (frontend as string),\n backend: backend === \"none\" ? null : (backend as string),\n database: database === \"none\" ? null : (database as string),\n cache: null,\n infrastructure:\n infrastructure === \"none\" ? null : (infrastructure as string),\n test_runner: null,\n package_manager: \"pnpm\",\n },\n review_gates: {\n after_discover: \"flexible\",\n after_plan: \"strict\",\n after_solve: \"flexible\",\n after_sprint: \"strict\",\n },\n agent_teams: {\n max_teammates: parseInt(maxTeammates as string, 10),\n default_model: \"sonnet\",\n planning_model: \"opus\",\n delegate_mode: true,\n plan_approval: true,\n coordination_timeout: 30,\n },\n domain_packs: [],\n ownership: {\n backend: [\n \"src/backend/\",\n \"src/api/\",\n \"src/services/\",\n \"src/db/\",\n \"src/workers/\",\n ],\n frontend: [\n \"src/frontend/\",\n \"src/components/\",\n \"src/hooks/\",\n \"src/styles/\",\n \"src/pages/\",\n ],\n infrastructure: [\n \"docker/\",\n \".github/\",\n \"infra/\",\n \"terraform/\",\n \"scripts/\",\n ],\n tests: [\"tests/\", \"__tests__/\", \"*.test.*\", \"*.spec.*\"],\n ai: [\"src/ai/\", \"src/ml/\", \"src/pipeline/\"],\n docs: [\"docs/\"],\n },\n state: {\n current_phase: null,\n phase_history: [],\n current_sprint: 0,\n artifacts: {\n brief: null,\n prd: null,\n architecture: null,\n ux_spec: null,\n security: null,\n epics: null,\n stories: null,\n },\n },\n };\n\n // Scaffold\n const s = p.spinner();\n s.start(\"Scaffolding SNIPER project...\");\n\n try {\n const log = await scaffoldProject(cwd, config);\n s.stop(\"Done!\");\n\n for (const entry of log) {\n p.log.success(entry);\n }\n\n p.outro(\n 'SNIPER initialized. Run \"sniper add-pack <name>\" to add domain packs.',\n );\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Scaffolding failed: ${err}`);\n process.exit(1);\n }\n },\n});\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport YAML from \"yaml\";\n\nexport interface SniperConfig {\n project: {\n name: string;\n type: string;\n description: string;\n };\n stack: {\n language: string;\n frontend: string | null;\n backend: string | null;\n database: string | null;\n cache: string | null;\n infrastructure: string | null;\n test_runner: string | null;\n package_manager: string;\n };\n review_gates: {\n after_discover: string;\n after_plan: string;\n after_solve: string;\n after_sprint: string;\n };\n agent_teams: {\n max_teammates: number;\n default_model: string;\n planning_model: string;\n delegate_mode: boolean;\n plan_approval: boolean;\n coordination_timeout: number;\n };\n domain_packs: Array<{ name: string; package: string }>;\n ownership: Record<string, string[]>;\n state: {\n current_phase: string | null;\n phase_history: Array<{\n phase: string;\n started_at: string;\n completed_at?: string;\n approved_by?: string;\n }>;\n current_sprint: number;\n artifacts: Record<string, string | null>;\n };\n}\n\nconst CONFIG_PATH = \".sniper/config.yaml\";\n\nexport async function sniperConfigExists(cwd: string): Promise<boolean> {\n try {\n await access(join(cwd, CONFIG_PATH));\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertField(\n obj: Record<string, unknown>,\n section: string,\n field: string,\n type: string,\n): void {\n const val = obj[field];\n if (typeof val !== type) {\n throw new Error(\n `Invalid config.yaml: \"${section}.${field}\" must be a ${type}, got ${typeof val}`,\n );\n }\n}\n\nfunction validateConfig(data: unknown): SniperConfig {\n if (!data || typeof data !== \"object\") {\n throw new Error(\"Invalid config.yaml: expected an object\");\n }\n const cfg = data as Record<string, unknown>;\n for (const key of [\n \"project\",\n \"stack\",\n \"state\",\n \"review_gates\",\n \"agent_teams\",\n ]) {\n if (!cfg[key] || typeof cfg[key] !== \"object\") {\n throw new Error(`Invalid config.yaml: missing \"${key}\" section`);\n }\n }\n\n // Validate nested fields\n const project = cfg.project as Record<string, unknown>;\n assertField(project, \"project\", \"name\", \"string\");\n assertField(project, \"project\", \"type\", \"string\");\n\n const stack = cfg.stack as Record<string, unknown>;\n assertField(stack, \"stack\", \"language\", \"string\");\n\n const agentTeams = cfg.agent_teams as Record<string, unknown>;\n assertField(agentTeams, \"agent_teams\", \"max_teammates\", \"number\");\n\n const state = cfg.state as Record<string, unknown>;\n if (state.artifacts !== undefined && typeof state.artifacts !== \"object\") {\n throw new Error(\n 'Invalid config.yaml: \"state.artifacts\" must be an object',\n );\n }\n\n // Normalize: ensure domain_packs is always an array\n if (!Array.isArray(cfg.domain_packs)) {\n cfg.domain_packs = [];\n }\n return data as SniperConfig;\n}\n\nexport async function readConfig(cwd: string): Promise<SniperConfig> {\n const raw = await readFile(join(cwd, CONFIG_PATH), \"utf-8\");\n return validateConfig(YAML.parse(raw));\n}\n\nexport async function writeConfig(\n cwd: string,\n config: SniperConfig,\n): Promise<void> {\n const content = YAML.stringify(config, { lineWidth: 0 });\n await writeFile(join(cwd, CONFIG_PATH), content, \"utf-8\");\n}\n\nexport function getCorePath(): string {\n // Resolve the path to @sniper.ai/core's framework directory\n // Works in both monorepo (workspace link) and published (node_modules)\n const require = createRequire(import.meta.url);\n try {\n const corePkgPath = require.resolve(\"@sniper.ai/core/package.json\");\n return join(dirname(corePkgPath), \"framework\");\n } catch {\n throw new Error(\n '@sniper.ai/core is not installed. Run \"pnpm add -D @sniper.ai/core\" first.',\n );\n }\n}\n","import {\n mkdir,\n readdir,\n readFile,\n writeFile,\n access,\n cp,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\nimport { getCorePath } from \"./config.js\";\nimport type { SniperConfig } from \"./config.js\";\n\nconst FRAMEWORK_DIRS = [\n \"personas\",\n \"teams\",\n \"templates\",\n \"checklists\",\n \"workflows\",\n \"spawn-prompts\",\n];\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ScaffoldOptions {\n /** When true, skips overwriting user-customizable files (CLAUDE.md, settings.json, commands) */\n update?: boolean;\n}\n\nexport async function scaffoldProject(\n cwd: string,\n config: SniperConfig,\n options: ScaffoldOptions = {},\n): Promise<string[]> {\n const corePath = getCorePath();\n const sniperDir = join(cwd, \".sniper\");\n const log: string[] = [];\n const isUpdate = options.update === true;\n\n // Create .sniper/ directory\n await ensureDir(sniperDir);\n\n // Copy framework directories\n for (const dir of FRAMEWORK_DIRS) {\n const src = join(corePath, dir);\n const dest = join(sniperDir, dir);\n await cp(src, dest, { recursive: true, force: true });\n log.push(`Copied ${dir}/`);\n }\n\n // Create domain-packs directory\n await ensureDir(join(sniperDir, \"domain-packs\"));\n\n // Generate config.yaml (skipped during update — caller preserves config separately)\n if (!isUpdate) {\n const configContent = YAML.stringify(config, { lineWidth: 0 });\n await writeFile(join(sniperDir, \"config.yaml\"), configContent, \"utf-8\");\n log.push(\"Created config.yaml\");\n }\n\n // Generate CLAUDE.md from template (skip during update if user has customized it)\n if (!isUpdate || !(await fileExists(join(cwd, \"CLAUDE.md\")))) {\n const claudeTemplate = await readFile(\n join(corePath, \"claude-md.template\"),\n \"utf-8\",\n );\n await writeFile(join(cwd, \"CLAUDE.md\"), claudeTemplate, \"utf-8\");\n log.push(\"Created CLAUDE.md\");\n } else {\n log.push(\"Skipped CLAUDE.md (preserved user customizations)\");\n }\n\n // Generate .claude/settings.json from template (skip during update if exists)\n const settingsDir = join(cwd, \".claude\");\n await ensureDir(settingsDir);\n if (!isUpdate || !(await fileExists(join(settingsDir, \"settings.json\")))) {\n const settingsTemplate = await readFile(\n join(corePath, \"settings.template.json\"),\n \"utf-8\",\n );\n await writeFile(\n join(settingsDir, \"settings.json\"),\n settingsTemplate,\n \"utf-8\",\n );\n log.push(\"Created .claude/settings.json\");\n } else {\n log.push(\"Skipped .claude/settings.json (preserved user customizations)\");\n }\n\n // Copy skills/commands into .claude/commands/\n const commandsSrc = join(corePath, \"commands\");\n const commandsDest = join(settingsDir, \"commands\");\n await cp(commandsSrc, commandsDest, { recursive: true, force: true });\n log.push(\"Copied skills to .claude/commands/\");\n\n // Create docs/ directory structure\n if (!isUpdate) {\n for (const sub of [\"epics\", \"stories\", \"reviews\"]) {\n const dir = join(cwd, \"docs\", sub);\n await ensureDir(dir);\n // Only write .gitkeep if directory is empty\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await writeFile(join(dir, \".gitkeep\"), \"\", \"utf-8\");\n }\n } catch {\n await writeFile(join(dir, \".gitkeep\"), \"\", \"utf-8\");\n }\n }\n log.push(\"Created docs/ directory\");\n }\n\n return log;\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { readConfig, sniperConfigExists } from \"../config.js\";\n\nconst ARTIFACT_ICONS: Record<string, string> = {\n approved: \"\\u2713\",\n draft: \"\\u25D0\",\n};\n\nexport const statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show SNIPER lifecycle status and artifact state\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized in this directory. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n const config = await readConfig(cwd);\n\n p.intro(\"SNIPER Status\");\n\n // Project info\n p.log.info(\n `Project: ${config.project.name || \"(unnamed)\"} (${config.project.type})`,\n );\n p.log.info(\n `Phase: ${config.state.current_phase || \"not started\"}`,\n );\n if (config.state.current_sprint > 0) {\n p.log.info(`Sprint: ${config.state.current_sprint}`);\n }\n\n // Artifacts\n p.log.step(\"Artifacts:\");\n const artifacts = config.state.artifacts;\n for (const [name, status] of Object.entries(artifacts)) {\n const icon = status ? (ARTIFACT_ICONS[status] || \"?\") : \"\\u25CB\";\n const label = status || \"\\u2014\";\n console.log(` ${icon} ${name.padEnd(16)} ${label}`);\n }\n\n // Domain packs\n if (config.domain_packs && config.domain_packs.length > 0) {\n const packNames = config.domain_packs.map((pk) => pk.name).join(\", \");\n p.log.info(`\\nPacks: ${packNames}`);\n }\n\n // Stack summary\n const stack = config.stack;\n const stackParts = [\n stack.language,\n stack.frontend,\n stack.backend,\n stack.database,\n stack.infrastructure,\n ].filter(Boolean);\n p.log.info(`Stack: ${stackParts.join(\", \")}`);\n\n p.outro(\"\");\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { installPack } from \"../pack-manager.js\";\n\nexport const addPackCommand = defineCommand({\n meta: {\n name: \"add-pack\",\n description: \"Add a domain pack to the current project\",\n },\n args: {\n name: {\n type: \"positional\",\n description:\n \"Pack name or full npm package name (e.g., sales-dialer or @sniper.ai/pack-sales-dialer)\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized in this directory. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n // Resolve package name\n let packageName = args.name;\n if (!packageName.startsWith(\"@\") && !packageName.includes(\"/\")) {\n packageName = `@sniper.ai/pack-${packageName}`;\n }\n\n const s = p.spinner();\n s.start(`Installing ${packageName}...`);\n\n try {\n const result = await installPack(packageName, cwd);\n s.stop(\"Done!\");\n\n p.log.success(`Installed ${result.package}@${result.version}`);\n p.log.success(\n `Copied pack to .sniper/domain-packs/${result.name}/`,\n );\n p.log.success(\"Updated config.yaml with pack reference\");\n p.log.info(\n `\\nPack \"${result.name}\" added. ${result.contextCount} context files available.`,\n );\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`${err}`);\n process.exit(1);\n }\n },\n});\n","import {\n cp,\n rm,\n readdir,\n readFile,\n stat,\n access,\n mkdir,\n} from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\n\n/**\n * Validates that a resolved path stays within the expected base directory.\n * Prevents path traversal attacks via user-supplied names containing \"..\".\n */\nfunction assertSafePath(base: string, untrusted: string): string {\n const full = resolve(base, untrusted);\n const safeBase = resolve(base) + sep;\n if (!full.startsWith(safeBase) && full !== resolve(base)) {\n throw new Error(\n `Invalid name: path traversal detected in \"${untrusted}\"`,\n );\n }\n return full;\n}\nimport YAML from \"yaml\";\nimport { readConfig, writeConfig } from \"./config.js\";\n\ninterface PackMetadata {\n name: string;\n version: string;\n sniper?: {\n type: string;\n packDir: string;\n };\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson<T>(p: string): Promise<T> {\n const raw = await readFile(p, \"utf-8\");\n return JSON.parse(raw) as T;\n}\n\nfunction getPackDir(pkgName: string, cwd: string): string {\n const nmPath = join(cwd, \"node_modules\", ...pkgName.split(\"/\"));\n return nmPath;\n}\n\nexport async function installPack(\n packageName: string,\n cwd: string,\n): Promise<{\n name: string;\n package: string;\n version: string;\n contextCount: number;\n}> {\n // Install the npm package\n execFileSync(\"pnpm\", [\"add\", \"-D\", packageName], { cwd, stdio: \"pipe\" });\n\n // Read the installed package.json\n const pkgDir = getPackDir(packageName, cwd);\n const pkgJson = await readJson<PackMetadata>(join(pkgDir, \"package.json\"));\n\n if (!pkgJson.sniper || pkgJson.sniper.type !== \"domain-pack\") {\n execFileSync(\"pnpm\", [\"remove\", packageName], { cwd, stdio: \"pipe\" });\n throw new Error(\n `${packageName} is not a valid SNIPER domain pack (missing sniper.type: \"domain-pack\")`,\n );\n }\n\n // Determine pack name from npm package name\n const shortName = packageName.replace(/^@[^/]+\\/pack-/, \"\");\n const domainPacksDir = join(cwd, \".sniper\", \"domain-packs\");\n const packDest = assertSafePath(domainPacksDir, shortName);\n const packSrc = assertSafePath(pkgDir, pkgJson.sniper.packDir);\n\n await mkdir(packDest, { recursive: true });\n await cp(packSrc, packDest, { recursive: true, force: true });\n\n // Count context files\n const contextDir = join(packDest, \"context\");\n let contextCount = 0;\n if (await pathExists(contextDir)) {\n const files = await readdir(contextDir);\n contextCount = files.filter((f) => f.endsWith(\".md\")).length;\n }\n\n // Update config.yaml — append to domain_packs (avoid duplicates)\n const config = await readConfig(cwd);\n if (!config.domain_packs) config.domain_packs = [];\n if (!config.domain_packs.some((p) => p.name === shortName)) {\n config.domain_packs.push({ name: shortName, package: packageName });\n }\n await writeConfig(cwd, config);\n\n return {\n name: shortName,\n package: packageName,\n version: pkgJson.version,\n contextCount,\n };\n}\n\nexport async function removePack(\n packName: string,\n cwd: string,\n): Promise<void> {\n // Read config to find the full package name for this pack\n const config = await readConfig(cwd);\n const packEntry = (config.domain_packs || []).find(\n (p) => p.name === packName,\n );\n const packageName = packEntry?.package || `@sniper.ai/pack-${packName}`;\n\n const domainPacksDir = join(cwd, \".sniper\", \"domain-packs\");\n const packDir = assertSafePath(domainPacksDir, packName);\n if (await pathExists(packDir)) {\n await rm(packDir, { recursive: true, force: true });\n }\n\n try {\n execFileSync(\"pnpm\", [\"remove\", packageName], { cwd, stdio: \"pipe\" });\n } catch {\n // Package may not be installed via npm\n }\n\n config.domain_packs = (config.domain_packs || []).filter(\n (p) => p.name !== packName,\n );\n await writeConfig(cwd, config);\n}\n\nexport async function listInstalledPacks(\n cwd: string,\n): Promise<Array<{ name: string; version: string }>> {\n const packsDir = join(cwd, \".sniper\", \"domain-packs\");\n if (!(await pathExists(packsDir))) return [];\n\n const entries = await readdir(packsDir);\n const packs: Array<{ name: string; version: string }> = [];\n\n for (const entry of entries) {\n const entryPath = join(packsDir, entry);\n const s = await stat(entryPath);\n if (!s.isDirectory()) continue;\n\n const packYaml = join(entryPath, \"pack.yaml\");\n if (await pathExists(packYaml)) {\n const raw = await readFile(packYaml, \"utf-8\");\n const parsed = YAML.parse(raw);\n packs.push({ name: entry, version: parsed.version || \"unknown\" });\n } else {\n packs.push({ name: entry, version: \"unknown\" });\n }\n }\n return packs;\n}\n\nexport async function searchRegistryPacks(): Promise<\n Array<{ name: string; version: string; description: string }>\n> {\n try {\n const result = execFileSync(\n \"npm\",\n [\"search\", \"@sniper.ai/pack-\", \"--json\"],\n { encoding: \"utf-8\", timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n ).toString();\n const packages = JSON.parse(result);\n return packages.map(\n (pkg: { name: string; version: string; description: string }) => ({\n name: pkg.name,\n version: pkg.version,\n description: pkg.description || \"\",\n }),\n );\n } catch {\n return [];\n }\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { removePack } from \"../pack-manager.js\";\n\nexport const removePackCommand = defineCommand({\n meta: {\n name: \"remove-pack\",\n description: \"Remove a domain pack from the current project\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Pack name to remove (e.g., sales-dialer)\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized in this directory. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n const confirm = await p.confirm({\n message: `Remove pack \"${args.name}\" and all its files?`,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(`Removing ${args.name}...`);\n\n try {\n await removePack(args.name, cwd);\n s.stop(\"Done!\");\n p.log.success(`Removed pack \"${args.name}\"`);\n p.log.success(\"Updated config.yaml\");\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`${err}`);\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { listInstalledPacks, searchRegistryPacks } from \"../pack-manager.js\";\n\nexport const listPacksCommand = defineCommand({\n meta: {\n name: \"list-packs\",\n description: \"List available and installed domain packs\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n p.intro(\"SNIPER Domain Packs\");\n\n // Show available packs from registry\n const s = p.spinner();\n s.start(\"Searching npm registry for @sniper.ai/pack-*...\");\n const available = await searchRegistryPacks();\n s.stop(\n available.length > 0\n ? `Found ${available.length} pack(s) on npm`\n : \"No packs found on npm registry (packages may not be published yet)\",\n );\n\n if (available.length > 0) {\n p.log.step(\"Available packs:\");\n for (const pkg of available) {\n console.log(\n ` ${pkg.name.padEnd(40)} v${pkg.version.padEnd(10)} ${pkg.description}`,\n );\n }\n }\n\n // Show installed packs (if SNIPER is initialized)\n if (await sniperConfigExists(cwd)) {\n const installed = await listInstalledPacks(cwd);\n if (installed.length > 0) {\n p.log.step(\"\\nInstalled:\");\n for (const pack of installed) {\n console.log(` ${pack.name.padEnd(20)} v${pack.version}`);\n }\n } else {\n p.log.info(\"\\nNo packs installed.\");\n }\n }\n\n p.outro(\"\");\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists, readConfig } from \"../config.js\";\nimport { scaffoldProject } from \"../scaffolder.js\";\n\nexport const updateCommand = defineCommand({\n meta: {\n name: \"update\",\n description: \"Update SNIPER core and installed packs\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized in this directory. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n p.intro(\"SNIPER Update\");\n\n // Preserve user's current config (especially state + config customizations)\n const currentConfig = await readConfig(cwd);\n\n const confirm = await p.confirm({\n message:\n \"This will update framework files (personas, teams, templates, etc.) while preserving your config.yaml customizations. Continue?\",\n });\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const s = p.spinner();\n s.start(\"Updating framework files...\");\n\n try {\n // Re-scaffold in update mode: overwrites framework files but preserves\n // user-customizable files (CLAUDE.md, settings.json, config.yaml)\n const log = await scaffoldProject(cwd, currentConfig, { update: true });\n\n s.stop(\"Done!\");\n for (const entry of log) {\n p.log.success(entry);\n }\n p.outro(\"SNIPER updated successfully.\");\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Update failed: ${err}`);\n process.exit(1);\n }\n },\n});\n"],"mappings":"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","names":["createRequire","defineCommand","require","readFile","writeFile","access","join","YAML","p","access","join","log","YAML","writeFile","readFile","log","defineCommand","p","defineCommand","defineCommand","p","cp","readdir","readFile","access","mkdir","join","YAML","p","access","readFile","join","mkdir","cp","readdir","YAML","defineCommand","defineCommand","p","defineCommand","confirm","defineCommand","p","defineCommand","defineCommand","p","defineCommand","confirm","log","require","createRequire","defineCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/config.ts","../src/scaffolder.ts","../src/fs-utils.ts","../src/commands/status.ts","../src/commands/migrate.ts","../src/commands/plugin.ts","../src/plugin-manager.ts","../src/commands/protocol.ts","../src/commands/dashboard.ts","../src/commands/workspace.ts","../src/workspace-manager.ts","../src/commands/revert.ts","../src/commands/run.ts","../src/headless.ts","../src/commands/marketplace.ts","../src/marketplace-client.ts","../src/commands/signal.ts","../src/signal-collector.ts","../src/commands/knowledge.ts","../src/commands/sphere.ts","../src/conflict-detector.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { defineCommand, runMain } from \"citty\";\nimport { initCommand } from \"./commands/init.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { migrateCommand } from \"./commands/migrate.js\";\nimport { pluginCommand } from \"./commands/plugin.js\";\nimport { protocolCommand } from \"./commands/protocol.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { workspaceCommand } from \"./commands/workspace.js\";\nimport { revertCommand } from \"./commands/revert.js\";\nimport { runCommand } from \"./commands/run.js\";\nimport { marketplaceCommand } from \"./commands/marketplace.js\";\nimport { signalCommand } from \"./commands/signal.js\";\nimport { knowledgeCommand } from \"./commands/knowledge.js\";\nimport { sphereCommand } from \"./commands/sphere.js\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\");\n\nconst main = defineCommand({\n meta: {\n name: \"sniper\",\n version,\n description: \"SNIPER v3 — AI-Powered Project Lifecycle Framework\",\n },\n subCommands: {\n init: initCommand,\n status: statusCommand,\n migrate: migrateCommand,\n plugin: pluginCommand,\n protocol: protocolCommand,\n dashboard: dashboardCommand,\n workspace: workspaceCommand,\n revert: revertCommand,\n run: runCommand,\n marketplace: marketplaceCommand,\n signal: signalCommand,\n knowledge: knowledgeCommand,\n sphere: sphereCommand,\n },\n});\n\nrunMain(main);\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists, readRawConfig, isV2Config, DEFAULT_BUDGETS } from \"../config.js\";\nimport type { SniperConfigV3 } from \"../config.js\";\nimport { scaffoldProject } from \"../scaffolder.js\";\nimport { pathExists } from \"../fs-utils.js\";\nimport { readdir } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\n\nasync function detectLanguage(cwd: string): Promise<string | null> {\n const checks: Array<[string[], string]> = [\n [[\"tsconfig.json\"], \"typescript\"],\n [[\"pyproject.toml\", \"requirements.txt\"], \"python\"],\n [[\"go.mod\"], \"go\"],\n [[\"Cargo.toml\"], \"rust\"],\n [[\"pom.xml\", \"build.gradle\"], \"java\"],\n [[\"package.json\"], \"javascript\"],\n ];\n\n for (const [files, lang] of checks) {\n for (const file of files) {\n if (await pathExists(join(cwd, file))) return lang;\n }\n }\n return null;\n}\n\nasync function detectPackageManager(cwd: string): Promise<string> {\n const checks: Array<[string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"bun.lockb\", \"bun\"],\n [\"package-lock.json\", \"npm\"],\n [\"uv.lock\", \"uv\"],\n [\"poetry.lock\", \"poetry\"],\n ];\n\n for (const [file, pm] of checks) {\n if (await pathExists(join(cwd, file))) return pm;\n }\n return \"npm\";\n}\n\nasync function detectTestRunner(cwd: string): Promise<string | null> {\n const checks: Array<[string[], string]> = [\n [[\"vitest.config.ts\", \"vitest.config.js\", \"vitest.config.mts\"], \"vitest\"],\n [[\"jest.config.ts\", \"jest.config.js\", \"jest.config.mjs\"], \"jest\"],\n [[\"pytest.ini\", \"conftest.py\", \"pyproject.toml\"], \"pytest\"],\n ];\n\n for (const [files, runner] of checks) {\n for (const file of files) {\n if (await pathExists(join(cwd, file))) return runner;\n }\n }\n return null;\n}\n\nexport const initCommand = defineCommand({\n meta: {\n name: \"init\",\n description: \"Initialize SNIPER v3 in a project\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n p.intro(\"SNIPER v3 — Project Initialization\");\n\n // Check for existing config\n if (await sniperConfigExists(cwd)) {\n const raw = await readRawConfig(cwd);\n if (isV2Config(raw)) {\n p.log.warning(\n 'Detected SNIPER v2 config. Run \"sniper migrate\" to upgrade, or reinitialize.',\n );\n }\n\n const overwrite = await p.confirm({\n message: \"SNIPER is already initialized. Reinitialize?\",\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n }\n\n // Auto-detect\n const detectedLang = await detectLanguage(cwd);\n const detectedPM = await detectPackageManager(cwd);\n const detectedTestRunner = await detectTestRunner(cwd);\n const dirName = basename(cwd);\n\n // Gather user input\n const projectName = await p.text({\n message: \"Project name:\",\n placeholder: dirName,\n initialValue: dirName,\n validate: (v) => (v.length === 0 ? \"Project name is required\" : undefined),\n });\n if (p.isCancel(projectName)) { p.cancel(\"Aborted.\"); process.exit(0); }\n\n const projectType = await p.select({\n message: \"Project type:\",\n options: [\n { value: \"saas\", label: \"SaaS\" },\n { value: \"api\", label: \"API\" },\n { value: \"mobile\", label: \"Mobile\" },\n { value: \"cli\", label: \"CLI\" },\n { value: \"library\", label: \"Library\" },\n { value: \"monorepo\", label: \"Monorepo\" },\n ],\n });\n if (p.isCancel(projectType)) { p.cancel(\"Aborted.\"); process.exit(0); }\n\n const description = await p.text({\n message: \"One-line description:\",\n placeholder: \"A brief description\",\n });\n if (p.isCancel(description)) { p.cancel(\"Aborted.\"); process.exit(0); }\n\n const language = await p.select({\n message: `Primary language${detectedLang ? ` (detected: ${detectedLang})` : \"\"}:`,\n initialValue: detectedLang || \"typescript\",\n options: [\n { value: \"typescript\", label: \"TypeScript\" },\n { value: \"javascript\", label: \"JavaScript\" },\n { value: \"python\", label: \"Python\" },\n { value: \"go\", label: \"Go\" },\n { value: \"rust\", label: \"Rust\" },\n { value: \"java\", label: \"Java\" },\n ],\n });\n if (p.isCancel(language)) { p.cancel(\"Aborted.\"); process.exit(0); }\n\n const maxTeammates = await p.text({\n message: \"Max concurrent agent teammates:\",\n placeholder: \"5\",\n initialValue: \"5\",\n validate: (v) => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1 || n > 10) return \"Must be 1-10\";\n return undefined;\n },\n });\n if (p.isCancel(maxTeammates)) { p.cancel(\"Aborted.\"); process.exit(0); }\n\n // Build v3 config\n const config: SniperConfigV3 = {\n project: {\n name: projectName as string,\n type: projectType as string,\n description: (description as string) || \"\",\n },\n agents: {\n max_teammates: parseInt(maxTeammates as string, 10),\n plan_approval: true,\n coordination_timeout: 30,\n base: [\n \"lead-orchestrator\",\n \"analyst\",\n \"architect\",\n \"product-manager\",\n \"backend-dev\",\n \"frontend-dev\",\n \"qa-engineer\",\n \"code-reviewer\",\n \"gate-reviewer\",\n \"retro-analyst\",\n ],\n mixins: {},\n },\n routing: {\n auto_detect: {\n patch_max_files: 5,\n feature_max_files: 20,\n },\n default: \"feature\",\n budgets: { ...DEFAULT_BUDGETS },\n },\n cost: {\n warn_threshold: 0.7,\n soft_cap: 0.9,\n hard_cap: 1.0,\n },\n review: {\n multi_model: false,\n models: [],\n require_consensus: true,\n },\n ownership: {\n backend: [\"src/backend/\", \"src/api/\", \"src/services/\", \"src/db/\"],\n frontend: [\"src/frontend/\", \"src/components/\", \"src/hooks/\", \"src/styles/\", \"src/pages/\"],\n infrastructure: [\"docker/\", \".github/\", \"infra/\", \"scripts/\"],\n tests: [\"tests/\", \"__tests__/\", \"*.test.*\", \"*.spec.*\"],\n docs: [\"docs/\"],\n },\n stack: {\n language: language as string,\n frontend: null,\n backend: null,\n database: null,\n infrastructure: null,\n test_runner: detectedTestRunner,\n package_manager: detectedPM,\n commands: {\n test: \"\",\n lint: \"\",\n typecheck: \"\",\n build: \"\",\n },\n },\n plugins: [],\n triggers: [],\n visibility: {\n live_status: true,\n checkpoints: true,\n cost_tracking: true,\n auto_retro: true,\n },\n };\n\n // Scaffold\n const s = p.spinner();\n s.start(\"Scaffolding SNIPER v3 project...\");\n\n try {\n const log = await scaffoldProject(cwd, config);\n s.stop(\"Done!\");\n\n for (const entry of log) {\n p.log.success(entry);\n }\n\n p.outro(\n 'SNIPER v3 initialized. Run \"/sniper-flow\" to start your first protocol.',\n );\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Scaffolding failed: ${err}`);\n process.exit(1);\n }\n },\n});\n","import { readFile, writeFile, access } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport YAML from \"yaml\";\n\n// ── v3 Config Interface ──\n\nexport interface SniperConfigV3 {\n project: {\n name: string;\n type: string;\n description: string;\n };\n agents: {\n max_teammates: number;\n plan_approval: boolean;\n coordination_timeout: number;\n base: string[];\n mixins: Record<string, string[]>;\n };\n routing: {\n auto_detect: {\n patch_max_files: number;\n feature_max_files: number;\n };\n default: string;\n budgets: Record<string, number>;\n };\n cost: {\n warn_threshold: number;\n soft_cap: number;\n hard_cap: number;\n };\n review?: {\n multi_model: boolean;\n models: string[];\n require_consensus: boolean;\n };\n ownership: Record<string, string[]>;\n stack: {\n language: string;\n frontend: string | null;\n backend: string | null;\n database: string | null;\n infrastructure: string | null;\n test_runner: string | null;\n package_manager: string;\n commands: {\n test: string;\n lint: string;\n typecheck: string;\n build: string;\n };\n };\n plugins: Array<{ name: string; package: string }>;\n triggers?: Array<{\n pattern: string;\n agent?: string;\n protocol?: string;\n }>;\n knowledge?: {\n directory: string;\n manifest: string;\n max_total_tokens: number;\n };\n mcp_knowledge?: {\n enabled: boolean;\n directory: string;\n auto_index: boolean;\n };\n headless?: {\n auto_approve_gates: boolean;\n output_format: \"json\" | \"yaml\" | \"text\";\n log_level: \"debug\" | \"info\" | \"warn\" | \"error\";\n timeout_minutes: number;\n fail_on_gate_failure: boolean;\n };\n workspace?: {\n ref: string;\n };\n visibility: {\n live_status: boolean;\n checkpoints: boolean;\n cost_tracking: boolean;\n auto_retro: boolean;\n };\n}\n\n// ── v2 Config Interface (for migration detection) ──\n\nexport interface SniperConfigV2 {\n project: { name: string; type: string; description: string };\n stack: { language: string; [key: string]: unknown };\n review_gates: Record<string, string>;\n agent_teams: {\n max_teammates: number;\n delegate_mode: boolean;\n plan_approval: boolean;\n coordination_timeout: number;\n };\n domain_packs: Array<{ name: string; package: string }>;\n ownership: Record<string, string[]>;\n state: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n// ── Type Guards ──\n\nexport function isV2Config(data: unknown): data is SniperConfigV2 {\n if (!data || typeof data !== \"object\") return false;\n const cfg = data as Record<string, unknown>;\n return (\n \"review_gates\" in cfg ||\n \"agent_teams\" in cfg ||\n \"domain_packs\" in cfg\n );\n}\n\nexport function isV3Config(data: unknown): data is SniperConfigV3 {\n if (!data || typeof data !== \"object\") return false;\n const cfg = data as Record<string, unknown>;\n return \"agents\" in cfg && \"routing\" in cfg && \"visibility\" in cfg;\n}\n\n// ── Validation ──\n\nconst CONFIG_PATH = \".sniper/config.yaml\";\n\nfunction assertField(\n obj: Record<string, unknown>,\n section: string,\n field: string,\n type: string,\n): void {\n const val = obj[field];\n if (typeof val !== type) {\n throw new Error(\n `Invalid config.yaml: \"${section}.${field}\" must be a ${type}, got ${typeof val}`,\n );\n }\n}\n\nfunction validateV3Config(data: unknown): SniperConfigV3 {\n if (!data || typeof data !== \"object\") {\n throw new Error(\"Invalid config.yaml: expected an object\");\n }\n const cfg = data as Record<string, unknown>;\n\n // Check required sections\n for (const key of [\"project\", \"agents\", \"routing\", \"cost\", \"stack\"]) {\n if (!cfg[key] || typeof cfg[key] !== \"object\") {\n throw new Error(`Invalid config.yaml: missing \"${key}\" section`);\n }\n }\n\n // Validate project\n const project = cfg.project as Record<string, unknown>;\n assertField(project, \"project\", \"name\", \"string\");\n assertField(project, \"project\", \"type\", \"string\");\n assertField(project, \"project\", \"description\", \"string\");\n\n // Validate agents\n const agents = cfg.agents as Record<string, unknown>;\n assertField(agents, \"agents\", \"max_teammates\", \"number\");\n\n // Validate stack\n const stack = cfg.stack as Record<string, unknown>;\n assertField(stack, \"stack\", \"language\", \"string\");\n assertField(stack, \"stack\", \"package_manager\", \"string\");\n\n // Normalize optional sections\n if (!cfg.plugins || !Array.isArray(cfg.plugins)) {\n (cfg as Record<string, unknown>).plugins = [];\n }\n if (!cfg.visibility || typeof cfg.visibility !== \"object\") {\n (cfg as Record<string, unknown>).visibility = {\n live_status: true,\n checkpoints: true,\n cost_tracking: true,\n auto_retro: true,\n };\n }\n if (!cfg.ownership || typeof cfg.ownership !== \"object\") {\n (cfg as Record<string, unknown>).ownership = {};\n }\n\n return data as SniperConfigV3;\n}\n\n// ── File I/O ──\n\nexport async function sniperConfigExists(cwd: string): Promise<boolean> {\n try {\n await access(join(cwd, CONFIG_PATH));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readConfig(cwd: string): Promise<SniperConfigV3> {\n const raw = await readFile(join(cwd, CONFIG_PATH), \"utf-8\");\n const data = YAML.parse(raw);\n\n if (isV2Config(data)) {\n throw new Error(\n 'This project uses SNIPER v2 config. Run \"sniper migrate\" to upgrade to v3.',\n );\n }\n\n return validateV3Config(data);\n}\n\nexport async function readRawConfig(cwd: string): Promise<unknown> {\n const raw = await readFile(join(cwd, CONFIG_PATH), \"utf-8\");\n return YAML.parse(raw);\n}\n\nexport async function writeConfig(\n cwd: string,\n config: SniperConfigV3,\n): Promise<void> {\n const content = YAML.stringify(config, { lineWidth: 0 });\n await writeFile(join(cwd, CONFIG_PATH), content, \"utf-8\");\n}\n\n// ── Default Budgets ──\n\nexport const DEFAULT_BUDGETS = Object.freeze({\n full: 2000000,\n feature: 800000,\n patch: 200000,\n ingest: 1000000,\n explore: 500000,\n refactor: 600000,\n hotfix: 100000,\n} as const);\n\n// ── Core Path Resolution ──\n\nexport function getCorePath(): string {\n const require = createRequire(import.meta.url);\n try {\n const corePkgPath = require.resolve(\"@sniper.ai/core/package.json\");\n return dirname(corePkgPath);\n } catch (err) {\n throw new Error(\n '@sniper.ai/core is not installed. Run \"pnpm add -D @sniper.ai/core\" first.',\n { cause: err },\n );\n }\n}\n","import {\n mkdir,\n readdir,\n readFile,\n writeFile,\n access,\n cp,\n} from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport YAML from \"yaml\";\nimport { getCorePath } from \"./config.js\";\nimport type { SniperConfigV3 } from \"./config.js\";\n\nfunction assertSafeName(name: string, kind: string): void {\n if (!/^[a-z][a-z0-9-]*$/.test(name)) {\n throw new Error(\n `Invalid ${kind} name \"${name}\": must start with a letter and contain only lowercase letters, digits, and hyphens`,\n );\n }\n}\n\nasync function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ScaffoldOptions {\n /** When true, skips overwriting user-customizable files */\n update?: boolean;\n}\n\n/**\n * Concatenate a base agent definition with cognitive mixin files.\n * Returns the combined markdown content.\n */\nexport async function composeMixin(\n basePath: string,\n mixinPaths: string[],\n): Promise<string> {\n let content = await readFile(basePath, \"utf-8\");\n\n for (const mixinPath of mixinPaths) {\n const mixin = await readFile(mixinPath, \"utf-8\");\n content += \"\\n\\n---\\n\\n\" + mixin;\n }\n\n return content;\n}\n\n/**\n * Merge hook definitions from core and plugins into a settings.json object.\n * Handles deduplication by description.\n */\nexport function mergeHooks(\n base: Record<string, unknown>,\n ...sources: Array<Record<string, unknown>>\n): Record<string, unknown> {\n const result = { ...base };\n\n // Ensure hooks object exists\n if (!result.hooks || typeof result.hooks !== \"object\") {\n result.hooks = {};\n }\n const hooks = result.hooks as Record<string, unknown[]>;\n\n for (const source of sources) {\n const sourceHooks = (source.hooks || {}) as Record<string, unknown[]>;\n for (const [event, entries] of Object.entries(sourceHooks)) {\n if (!Array.isArray(entries)) continue;\n if (!hooks[event]) hooks[event] = [];\n\n for (const entry of entries) {\n const desc = (entry as Record<string, unknown>).description;\n // Deduplicate by description\n const existing = hooks[event].find(\n (h) => (h as Record<string, unknown>).description === desc,\n );\n if (!existing) {\n hooks[event].push(entry);\n }\n }\n }\n }\n\n return result;\n}\n\nexport async function scaffoldProject(\n cwd: string,\n config: SniperConfigV3,\n options: ScaffoldOptions = {},\n): Promise<string[]> {\n const corePath = getCorePath();\n const sniperDir = join(cwd, \".sniper\");\n const claudeDir = join(cwd, \".claude\");\n const log: string[] = [];\n const isUpdate = options.update === true;\n\n // Create .sniper/ directories\n await ensureDir(sniperDir);\n for (const sub of [\n \"checkpoints\",\n \"gates\",\n \"retros\",\n \"self-reviews\",\n \"protocols\",\n \"knowledge\",\n \"memory/signals\",\n ]) {\n await ensureDir(join(sniperDir, sub));\n }\n\n // Copy checklists to .sniper/\n const checklistsSrc = join(corePath, \"checklists\");\n const checklistsDest = join(sniperDir, \"checklists\");\n await cp(checklistsSrc, checklistsDest, { recursive: true, force: true });\n log.push(\"Copied checklists/\");\n\n // Copy knowledge manifest template if it doesn't exist\n const manifestTemplate = join(corePath, \"templates\", \"knowledge-manifest.yaml\");\n const manifestDest = join(sniperDir, \"knowledge\", \"manifest.yaml\");\n if ((await fileExists(manifestTemplate)) && !(await fileExists(manifestDest))) {\n await cp(manifestTemplate, manifestDest);\n log.push(\"Created .sniper/knowledge/manifest.yaml\");\n }\n\n // Generate config.yaml\n if (!isUpdate) {\n const configContent = YAML.stringify(config, { lineWidth: 0 });\n await writeFile(join(sniperDir, \"config.yaml\"), configContent, \"utf-8\");\n log.push(\"Created .sniper/config.yaml\");\n }\n\n // Create .claude/ directories\n await ensureDir(claudeDir);\n await ensureDir(join(claudeDir, \"agents\"));\n\n // Copy and compose agent definitions\n const agentsSrc = join(corePath, \"agents\");\n for (const agentName of config.agents.base) {\n assertSafeName(agentName, \"agent\");\n const srcFile = join(agentsSrc, `${agentName}.md`);\n if (!(await fileExists(srcFile))) continue;\n\n const mixinNames = config.agents.mixins[agentName] || [];\n if (mixinNames.length > 0) {\n // Compose agent with mixins\n const mixinPaths = mixinNames.map((m) => {\n assertSafeName(m, \"mixin\");\n return join(corePath, \"personas\", \"cognitive\", `${m}.md`);\n });\n const composed = await composeMixin(srcFile, mixinPaths);\n await writeFile(join(claudeDir, \"agents\", `${agentName}.md`), composed, \"utf-8\");\n } else {\n // Copy base agent directly\n await cp(srcFile, join(claudeDir, \"agents\", `${agentName}.md`), { force: true });\n }\n }\n log.push(\"Scaffolded .claude/agents/\");\n\n // Copy skills to .claude/commands/ (SKILL.md files become slash commands)\n const skillsSrc = join(corePath, \"skills\");\n const commandsDest = join(claudeDir, \"commands\");\n await ensureDir(commandsDest);\n\n if (await fileExists(skillsSrc)) {\n const skillDirs = await readdir(skillsSrc);\n for (const skillDir of skillDirs) {\n const skillFile = join(skillsSrc, skillDir, \"SKILL.md\");\n if (await fileExists(skillFile)) {\n await cp(skillFile, join(commandsDest, `${skillDir}.md`), { force: true });\n }\n }\n }\n log.push(\"Copied skills to .claude/commands/\");\n\n // Generate .claude/settings.json with hooks\n const settingsPath = join(claudeDir, \"settings.json\");\n let settings: Record<string, unknown> = {};\n\n if (isUpdate && (await fileExists(settingsPath))) {\n const raw = await readFile(settingsPath, \"utf-8\");\n try {\n settings = JSON.parse(raw);\n } catch {\n // If settings.json is corrupted, log warning and start fresh\n log.push(\"Warning: .claude/settings.json was invalid JSON; starting with empty settings\");\n settings = {};\n }\n }\n\n // Read core hooks\n const coreHooksPath = join(corePath, \"hooks\", \"settings-hooks.json\");\n if (await fileExists(coreHooksPath)) {\n const coreHooks = JSON.parse(await readFile(coreHooksPath, \"utf-8\"));\n settings = mergeHooks(settings, coreHooks);\n }\n\n // Ensure agent teams env is set\n if (!settings.env || typeof settings.env !== \"object\") {\n settings.env = {};\n }\n (settings.env as Record<string, unknown>).CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = \"1\";\n\n const settingsExisted = isUpdate && (await fileExists(settingsPath));\n await writeFile(settingsPath, JSON.stringify(settings, null, 2), \"utf-8\");\n log.push(settingsExisted ? \"Updated .claude/settings.json hooks\" : \"Created .claude/settings.json\");\n\n // Generate CLAUDE.md from template\n if (!isUpdate || !(await fileExists(join(cwd, \"CLAUDE.md\")))) {\n const claudeTemplate = await readFile(\n join(corePath, \"claude-md.template\"),\n \"utf-8\",\n );\n const claudeMd = claudeTemplate\n .replace(\"{{PROJECT_NAME}}\", config.project.name)\n .replace(\"{{CUSTOM_INSTRUCTIONS}}\", \"\");\n await writeFile(join(cwd, \"CLAUDE.md\"), claudeMd, \"utf-8\");\n log.push(\"Created CLAUDE.md\");\n } else {\n log.push(\"Skipped CLAUDE.md (preserved user customizations)\");\n }\n\n // Create docs/ directory\n if (!isUpdate) {\n await ensureDir(join(cwd, \"docs\"));\n log.push(\"Created docs/\");\n }\n\n return log;\n}\n","import { mkdir, access } from \"node:fs/promises\";\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { readConfig, sniperConfigExists } from \"../config.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\nimport { pathExists } from \"../fs-utils.js\";\n\nexport const statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show SNIPER v3 status and protocol progress\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n const config = await readConfig(cwd);\n\n p.intro(\"SNIPER v3 Status\");\n\n // Project info\n p.log.info(\n `Project: ${config.project.name || \"(unnamed)\"} (${config.project.type})`,\n );\n\n // Stack summary\n const stackParts = [\n config.stack.language,\n config.stack.frontend,\n config.stack.backend,\n config.stack.database,\n config.stack.infrastructure,\n ].filter(Boolean);\n p.log.info(`Stack: ${stackParts.join(\", \")}`);\n\n // Agents\n p.log.info(`Agents: ${config.agents.base.length} configured, max ${config.agents.max_teammates} concurrent`);\n\n // Plugins\n if (config.plugins.length > 0) {\n const pluginNames = config.plugins.map((pk) => pk.name).join(\", \");\n p.log.info(`Plugins: ${pluginNames}`);\n }\n\n // Protocol status (from live-status.yaml)\n const statusPath = join(cwd, \".sniper\", \"live-status.yaml\");\n if (await pathExists(statusPath)) {\n const raw = await readFile(statusPath, \"utf-8\");\n const liveStatus = YAML.parse(raw);\n\n if (liveStatus && liveStatus.protocol) {\n p.log.step(\"Active Protocol:\");\n console.log(` Protocol: ${liveStatus.protocol}`);\n console.log(` Status: ${liveStatus.status}`);\n if (liveStatus.current_phase) {\n console.log(` Phase: ${liveStatus.current_phase}`);\n }\n\n // Phase progress\n if (Array.isArray(liveStatus.phases)) {\n for (const phase of liveStatus.phases) {\n const icon =\n phase.status === \"completed\" ? \"\\u2713\" :\n phase.status === \"in_progress\" ? \"\\u25B6\" :\n phase.status === \"failed\" ? \"\\u2717\" : \"\\u25CB\";\n console.log(` ${icon} ${phase.name.padEnd(16)} ${phase.status}`);\n }\n }\n\n // Cost\n if (liveStatus.cost && typeof liveStatus.cost.percent === \"number\" && typeof liveStatus.cost.tokens_used === \"number\" && typeof liveStatus.cost.budget === \"number\") {\n const pct = Math.max(0, Math.min(100, Math.round(liveStatus.cost.percent * 100)));\n const bar = \"=\".repeat(Math.floor(pct / 5)) + \"-\".repeat(20 - Math.floor(pct / 5));\n console.log(`\\n Cost: ${(liveStatus.cost.tokens_used / 1000).toFixed(0)}K / ${(liveStatus.cost.budget / 1000).toFixed(0)}K tokens (${pct}%)`);\n console.log(` [${bar}] ${pct}%`);\n }\n\n if (liveStatus.next_action) {\n console.log(`\\n Next: ${liveStatus.next_action}`);\n }\n }\n } else {\n p.log.info(\"No active protocol. Run /sniper-flow to start.\");\n }\n\n // Routing config\n p.log.step(\"Protocol Routing:\");\n console.log(` Default: ${config.routing.default}`);\n console.log(` Budgets: full=${(config.routing.budgets.full / 1000000).toFixed(1)}M, feature=${(config.routing.budgets.feature / 1000).toFixed(0)}K, patch=${(config.routing.budgets.patch / 1000).toFixed(0)}K`);\n\n // Velocity data\n const velocityPath = join(cwd, \".sniper\", \"memory\", \"velocity.yaml\");\n if (await pathExists(velocityPath)) {\n const velRaw = await readFile(velocityPath, \"utf-8\");\n const velocity = YAML.parse(velRaw);\n\n if (velocity && velocity.calibrated_budgets && Object.keys(velocity.calibrated_budgets).length > 0) {\n p.log.step(\"Velocity (calibrated budgets):\");\n for (const [protocol, budget] of Object.entries(velocity.calibrated_budgets)) {\n const configured = config.routing.budgets[protocol];\n const calibrated = budget as number;\n const avg = velocity.rolling_averages?.[protocol] as number | undefined;\n const avgStr = avg ? `${(avg / 1000).toFixed(0)}K avg` : \"\";\n const trend = configured && calibrated < configured * 0.9 ? \"↓\" : calibrated > configured * 1.1 ? \"↑\" : \"→\";\n console.log(` ${protocol}: ${avgStr} (calibrated: ${(calibrated / 1000).toFixed(0)}K, configured: ${configured ? (configured / 1000).toFixed(0) + \"K\" : \"N/A\"}) ${trend}`);\n }\n }\n }\n\n p.outro(\"\");\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport {\n sniperConfigExists,\n readRawConfig,\n isV2Config,\n isV3Config,\n writeConfig,\n DEFAULT_BUDGETS,\n} from \"../config.js\";\nimport type { SniperConfigV2, SniperConfigV3 } from \"../config.js\";\nimport { scaffoldProject } from \"../scaffolder.js\";\nimport { writeFile, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\n\nfunction migrateV2ToV3(v2: SniperConfigV2): SniperConfigV3 {\n return {\n project: {\n name: v2.project.name,\n type: v2.project.type,\n description: v2.project.description || \"\",\n },\n agents: {\n max_teammates: v2.agent_teams?.max_teammates || 5,\n plan_approval: v2.agent_teams?.plan_approval ?? true,\n coordination_timeout: v2.agent_teams?.coordination_timeout || 30,\n base: [\n \"lead-orchestrator\",\n \"analyst\",\n \"architect\",\n \"product-manager\",\n \"backend-dev\",\n \"frontend-dev\",\n \"qa-engineer\",\n \"code-reviewer\",\n \"gate-reviewer\",\n \"retro-analyst\",\n ],\n mixins: {},\n },\n routing: {\n auto_detect: {\n patch_max_files: 5,\n feature_max_files: 20,\n },\n default: \"feature\",\n budgets: { ...DEFAULT_BUDGETS },\n },\n cost: {\n warn_threshold: 0.7,\n soft_cap: 0.9,\n hard_cap: 1.0,\n },\n review: {\n multi_model: false,\n models: [],\n require_consensus: true,\n },\n ownership: v2.ownership || {},\n stack: {\n language: v2.stack?.language || \"\",\n frontend: (v2.stack?.frontend as string) || null,\n backend: (v2.stack?.backend as string) || null,\n database: (v2.stack?.database as string) || null,\n infrastructure: (v2.stack?.infrastructure as string) || null,\n test_runner: (v2.stack?.test_runner as string) || null,\n package_manager: (v2.stack?.package_manager as string) || \"npm\",\n commands: {\n test: (v2.stack?.commands as Record<string, string>)?.test || \"\",\n lint: (v2.stack?.commands as Record<string, string>)?.lint || \"\",\n typecheck: (v2.stack?.commands as Record<string, string>)?.typecheck || \"\",\n build: (v2.stack?.commands as Record<string, string>)?.build || \"\",\n },\n },\n plugins: [],\n triggers: [],\n visibility: {\n live_status: true,\n checkpoints: true,\n cost_tracking: true,\n auto_retro: true,\n },\n };\n}\n\nexport const migrateCommand = defineCommand({\n meta: {\n name: \"migrate\",\n description: \"Migrate SNIPER v2 config to v3\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n p.intro(\"SNIPER v2 → v3 Migration\");\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'No SNIPER config found. Run \"sniper init\" to initialize a new project.',\n );\n process.exit(1);\n }\n\n const raw = await readRawConfig(cwd);\n\n if (isV3Config(raw)) {\n p.log.info(\"This project already uses SNIPER v3 config. No migration needed.\");\n p.outro(\"\");\n return;\n }\n\n if (!isV2Config(raw)) {\n p.log.error(\"Unrecognized config format. Cannot migrate.\");\n process.exit(1);\n }\n\n const v2Config = raw as SniperConfigV2;\n p.log.info(`Migrating project: ${v2Config.project.name}`);\n\n // Backup v2 config\n const backupPath = join(cwd, \".sniper\", \"config.v2.yaml\");\n const backupContent = await readFile(join(cwd, \".sniper\", \"config.yaml\"), \"utf-8\");\n await writeFile(backupPath, backupContent, \"utf-8\");\n p.log.success(\"Backed up v2 config to .sniper/config.v2.yaml\");\n\n // Convert\n const v3Config = migrateV2ToV3(v2Config);\n\n // Show what changed\n p.log.step(\"Migration changes:\");\n console.log(\" - review_gates → protocol-based gates\");\n console.log(\" - agent_teams → agents (with base roster + mixins)\");\n console.log(\" - domain_packs → plugins\");\n console.log(\" - state tracking → checkpoint files\");\n console.log(\" + routing (auto protocol selection)\");\n console.log(\" + cost enforcement\");\n console.log(\" + visibility settings\");\n\n const confirm = await p.confirm({\n message: \"Apply migration and re-scaffold?\",\n initialValue: true,\n });\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Aborted. v2 config preserved.\");\n process.exit(0);\n }\n\n // Scaffold first, then write config — if scaffold fails, v2 config is preserved\n const s = p.spinner();\n s.start(\"Re-scaffolding with v3 structure...\");\n\n try {\n const log = await scaffoldProject(cwd, v3Config, { update: true });\n // Scaffold succeeded — now safe to write v3 config\n await writeConfig(cwd, v3Config);\n s.stop(\"Done!\");\n\n p.log.success(\"Wrote v3 config\");\n for (const entry of log) {\n p.log.success(entry);\n }\n\n p.log.warning(\n \"Review .sniper/config.yaml to configure stack commands (test, lint, build) and agent mixins.\",\n );\n p.outro(\"Migration complete.\");\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Migration failed: ${err}`);\n p.log.info(\"Your v2 config is preserved at .sniper/config.yaml (backup also at .sniper/config.v2.yaml)\");\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport {\n installPlugin,\n removePlugin,\n listPlugins,\n} from \"../plugin-manager.js\";\n\nconst installSubcommand = defineCommand({\n meta: {\n name: \"install\",\n description: \"Install a SNIPER plugin\",\n },\n args: {\n package: {\n type: \"positional\",\n description: \"Plugin package name (e.g. @sniper.ai/plugin-typescript)\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Installing ${args.package}...`);\n\n try {\n const result = await installPlugin(args.package, cwd);\n s.stop(\"Done!\");\n p.log.success(`Installed plugin: ${result.name} v${result.version}`);\n p.log.info(\"Plugin mixins and hooks have been merged into your project.\");\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Installation failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst removeSubcommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Remove a SNIPER plugin\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Plugin name to remove\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Removing ${args.name}...`);\n\n try {\n await removePlugin(args.name, cwd);\n s.stop(\"Done!\");\n p.log.success(`Removed plugin: ${args.name}`);\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Removal failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst listSubcommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List installed SNIPER plugins\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const plugins = await listPlugins(cwd);\n\n if (plugins.length === 0) {\n p.log.info(\"No plugins installed.\");\n return;\n }\n\n p.log.step(\"Installed plugins:\");\n for (const plugin of plugins) {\n console.log(` - ${plugin.name} (${plugin.package})`);\n }\n },\n});\n\nexport const pluginCommand = defineCommand({\n meta: {\n name: \"plugin\",\n description: \"Manage SNIPER plugins\",\n },\n subCommands: {\n install: installSubcommand,\n remove: removeSubcommand,\n list: listSubcommand,\n },\n});\n","import {\n cp,\n rm,\n readdir,\n readFile,\n access,\n mkdir,\n} from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport { readConfig, writeConfig } from \"./config.js\";\nimport type { SniperConfigV3 } from \"./config.js\";\n\nfunction getPackageManagerCommand(config?: SniperConfigV3): string {\n return config?.stack?.package_manager || \"pnpm\";\n}\n\n/**\n * Validates that a resolved path stays within the expected base directory.\n */\nfunction assertSafePath(base: string, untrusted: string): string {\n const full = resolve(base, untrusted);\n const safeBase = resolve(base) + sep;\n if (!full.startsWith(safeBase) && full !== resolve(base)) {\n throw new Error(\n `Invalid name: path traversal detected in \"${untrusted}\"`,\n );\n }\n return full;\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\ninterface PluginManifest {\n name: string;\n version: string;\n description?: string;\n commands?: Record<string, { run: string; description?: string }>;\n conventions?: string[];\n review_checks?: Array<{\n id: string;\n description: string;\n command: string;\n blocking: boolean;\n }>;\n agent_mixins?: Record<string, string[]>;\n hooks?: Record<string, unknown[]>;\n}\n\ninterface PackageJson {\n name: string;\n version: string;\n sniper?: { type: string; packDir?: string };\n}\n\nfunction getPackageDir(pkgName: string, cwd: string): string {\n return join(cwd, \"node_modules\", ...pkgName.split(\"/\"));\n}\n\nexport async function validatePluginYaml(\n pluginPath: string,\n): Promise<PluginManifest> {\n const raw = await readFile(pluginPath, \"utf-8\");\n const manifest = YAML.parse(raw) as PluginManifest;\n\n if (!manifest.name || typeof manifest.name !== \"string\") {\n throw new Error(\"Plugin manifest missing required 'name' field\");\n }\n if (!manifest.version || typeof manifest.version !== \"string\") {\n throw new Error(\"Plugin manifest missing required 'version' field\");\n }\n\n return manifest;\n}\n\nexport async function installPlugin(\n packageName: string,\n cwd: string,\n): Promise<{\n name: string;\n package: string;\n version: string;\n}> {\n // Read config to determine the project's package manager\n let projectConfig: SniperConfigV3 | undefined;\n try {\n projectConfig = await readConfig(cwd);\n } catch {\n // Config may not exist yet during init\n }\n const pm = getPackageManagerCommand(projectConfig);\n\n // Install the npm package\n execFileSync(pm, [\"add\", \"-D\", packageName], { cwd, stdio: \"pipe\" });\n\n // Read the installed package.json\n const pkgDir = getPackageDir(packageName, cwd);\n const pkgJsonRaw = await readFile(join(pkgDir, \"package.json\"), \"utf-8\");\n const pkgJson = JSON.parse(pkgJsonRaw) as PackageJson;\n\n const validTypes = [\"plugin\", \"agent\", \"mixin\", \"pack\"];\n if (!pkgJson.sniper || !validTypes.includes(pkgJson.sniper.type)) {\n execFileSync(pm, [\"remove\", packageName], { cwd, stdio: \"pipe\" });\n throw new Error(\n `${packageName} is not a valid SNIPER package (missing sniper.type: one of ${validTypes.join(\", \")})`,\n );\n }\n\n const sniperType = pkgJson.sniper.type;\n\n // Handle installation based on package type\n if (sniperType === \"agent\") {\n // Agent packages: copy .md files to .claude/agents/\n const agentsDir = join(cwd, \".claude\", \"agents\");\n await mkdir(agentsDir, { recursive: true });\n const files = await readdir(pkgDir);\n for (const file of files) {\n if (file.endsWith(\".md\") && file !== \"README.md\") {\n const src = assertSafePath(pkgDir, file);\n await cp(src, join(agentsDir, file), { force: true });\n }\n }\n\n const config = await readConfig(cwd);\n if (!config.plugins.some((p) => p.name === pkgJson.name)) {\n config.plugins.push({ name: pkgJson.name, package: packageName });\n }\n await writeConfig(cwd, config);\n\n return { name: pkgJson.name, package: packageName, version: pkgJson.version };\n }\n\n if (sniperType === \"mixin\") {\n // Mixin packages: copy .md files to .claude/personas/cognitive/\n const mixinsDir = join(cwd, \".claude\", \"personas\", \"cognitive\");\n await mkdir(mixinsDir, { recursive: true });\n const files = await readdir(pkgDir);\n for (const file of files) {\n if (file.endsWith(\".md\") && file !== \"README.md\") {\n const src = assertSafePath(pkgDir, file);\n await cp(src, join(mixinsDir, file), { force: true });\n }\n }\n\n const config = await readConfig(cwd);\n if (!config.plugins.some((p) => p.name === pkgJson.name)) {\n config.plugins.push({ name: pkgJson.name, package: packageName });\n }\n await writeConfig(cwd, config);\n\n return { name: pkgJson.name, package: packageName, version: pkgJson.version };\n }\n\n if (sniperType === \"pack\") {\n // Pack packages: copy knowledge, personas, checklists, templates\n const sniperDir = join(cwd, \".sniper\");\n const claudeDir = join(cwd, \".claude\");\n\n // Use packDir if declared, otherwise use package root\n const contentRoot = pkgJson.sniper?.packDir\n ? join(pkgDir, pkgJson.sniper.packDir)\n : pkgDir;\n // Validate packDir doesn't escape the package directory\n if (pkgJson.sniper?.packDir) {\n assertSafePath(pkgDir, pkgJson.sniper.packDir);\n }\n\n // Copy knowledge files if they exist\n const knowledgeDir = join(contentRoot, \"knowledge\");\n if (await pathExists(knowledgeDir)) {\n const dest = join(sniperDir, \"knowledge\");\n await mkdir(dest, { recursive: true });\n await cp(knowledgeDir, dest, { recursive: true, force: true });\n }\n\n // Copy personas if they exist\n const personasDir = join(contentRoot, \"personas\");\n if (await pathExists(personasDir)) {\n const dest = join(claudeDir, \"personas\", \"cognitive\");\n await mkdir(dest, { recursive: true });\n await cp(personasDir, dest, { recursive: true, force: true });\n }\n\n // Copy checklists if they exist\n const checklistsDir = join(contentRoot, \"checklists\");\n if (await pathExists(checklistsDir)) {\n const dest = join(sniperDir, \"checklists\");\n await mkdir(dest, { recursive: true });\n await cp(checklistsDir, dest, { recursive: true, force: true });\n }\n\n // Copy templates if they exist\n const templatesDir = join(contentRoot, \"templates\");\n if (await pathExists(templatesDir)) {\n const dest = join(sniperDir, \"templates\");\n await mkdir(dest, { recursive: true });\n await cp(templatesDir, dest, { recursive: true, force: true });\n }\n\n const config = await readConfig(cwd);\n if (!config.plugins.some((p) => p.name === pkgJson.name)) {\n config.plugins.push({ name: pkgJson.name, package: packageName });\n }\n await writeConfig(cwd, config);\n\n return { name: pkgJson.name, package: packageName, version: pkgJson.version };\n }\n\n // Default: plugin type — requires plugin.yaml\n const pluginYamlPath = join(pkgDir, \"plugin.yaml\");\n if (!(await pathExists(pluginYamlPath))) {\n execFileSync(pm, [\"remove\", packageName], { cwd, stdio: \"pipe\" });\n throw new Error(`${packageName} is missing plugin.yaml`);\n }\n const manifest = await validatePluginYaml(pluginYamlPath);\n\n // Copy plugin mixins to .claude/personas/cognitive/\n if (manifest.agent_mixins) {\n const mixinsDir = join(cwd, \".claude\", \"personas\", \"cognitive\");\n await mkdir(mixinsDir, { recursive: true });\n\n for (const [, mixinPaths] of Object.entries(manifest.agent_mixins)) {\n for (const mixinPath of mixinPaths) {\n const src = assertSafePath(pkgDir, mixinPath);\n const parts = mixinPath.split(\"/\");\n const filename = parts[parts.length - 1];\n const dest = join(mixinsDir, filename);\n await cp(src, dest, { force: true });\n }\n }\n }\n\n // Update config.yaml\n const config = await readConfig(cwd);\n if (!config.plugins.some((p) => p.name === manifest.name)) {\n config.plugins.push({ name: manifest.name, package: packageName });\n }\n await writeConfig(cwd, config);\n\n return {\n name: manifest.name,\n package: packageName,\n version: manifest.version,\n };\n}\n\nexport async function removePlugin(\n pluginName: string,\n cwd: string,\n): Promise<void> {\n const config = await readConfig(cwd);\n const entry = config.plugins.find((p) => p.name === pluginName);\n const packageName = entry?.package || `@sniper.ai/plugin-${pluginName}`;\n\n // Remove npm package\n const pm = getPackageManagerCommand(config);\n try {\n execFileSync(pm, [\"remove\", packageName], { cwd, stdio: \"pipe\" });\n } catch {\n // Package may not be installed\n }\n\n // Update config\n config.plugins = config.plugins.filter((p) => p.name !== pluginName);\n await writeConfig(cwd, config);\n}\n\nexport async function listPlugins(\n cwd: string,\n): Promise<Array<{ name: string; package: string }>> {\n const config = await readConfig(cwd);\n return config.plugins;\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { readdir, readFile, writeFile, mkdir, access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\nimport { sniperConfigExists, getCorePath } from \"../config.js\";\n\nconst CUSTOM_PROTOCOLS_DIR = \".sniper/protocols\";\n\n// ── Validation helpers ──\n\ninterface ValidationError {\n path: string;\n message: string;\n}\n\nfunction validateProtocol(data: unknown): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (!data || typeof data !== \"object\") {\n errors.push({ path: \"(root)\", message: \"Expected a YAML object\" });\n return errors;\n }\n\n const proto = data as Record<string, unknown>;\n\n // Required top-level fields\n if (typeof proto.name !== \"string\" || proto.name.length === 0) {\n errors.push({ path: \"name\", message: \"Required string field\" });\n }\n if (typeof proto.description !== \"string\" || proto.description.length === 0) {\n errors.push({ path: \"description\", message: \"Required string field\" });\n }\n if (typeof proto.budget !== \"number\" || !Number.isInteger(proto.budget) || proto.budget < 1) {\n errors.push({ path: \"budget\", message: \"Required positive integer\" });\n }\n\n // Optional boolean\n if (proto.auto_retro !== undefined && typeof proto.auto_retro !== \"boolean\") {\n errors.push({ path: \"auto_retro\", message: \"Must be a boolean\" });\n }\n\n // Phases\n if (!Array.isArray(proto.phases) || proto.phases.length === 0) {\n errors.push({ path: \"phases\", message: \"Required non-empty array\" });\n return errors;\n }\n\n for (let i = 0; i < proto.phases.length; i++) {\n const phase = proto.phases[i] as Record<string, unknown>;\n const prefix = `phases[${i}]`;\n\n if (!phase || typeof phase !== \"object\") {\n errors.push({ path: prefix, message: \"Must be an object\" });\n continue;\n }\n\n if (typeof phase.name !== \"string\" || phase.name.length === 0) {\n errors.push({ path: `${prefix}.name`, message: \"Required string field\" });\n }\n if (typeof phase.description !== \"string\" || phase.description.length === 0) {\n errors.push({ path: `${prefix}.description`, message: \"Required string field\" });\n }\n if (!Array.isArray(phase.agents) || phase.agents.length === 0) {\n errors.push({ path: `${prefix}.agents`, message: \"Required non-empty array of strings\" });\n } else {\n for (let j = 0; j < phase.agents.length; j++) {\n if (typeof phase.agents[j] !== \"string\") {\n errors.push({ path: `${prefix}.agents[${j}]`, message: \"Must be a string\" });\n }\n }\n }\n if (phase.spawn_strategy !== \"single\" && phase.spawn_strategy !== \"team\") {\n errors.push({ path: `${prefix}.spawn_strategy`, message: 'Must be \"single\" or \"team\"' });\n }\n\n // Optional gate\n if (phase.gate !== undefined) {\n if (!phase.gate || typeof phase.gate !== \"object\") {\n errors.push({ path: `${prefix}.gate`, message: \"Must be an object\" });\n } else {\n const gate = phase.gate as Record<string, unknown>;\n if (typeof gate.checklist !== \"string\") {\n errors.push({ path: `${prefix}.gate.checklist`, message: \"Required string field\" });\n }\n if (typeof gate.human_approval !== \"boolean\") {\n errors.push({ path: `${prefix}.gate.human_approval`, message: \"Required boolean field\" });\n }\n }\n }\n\n // Optional fields\n if (phase.plan_approval !== undefined && typeof phase.plan_approval !== \"boolean\") {\n errors.push({ path: `${prefix}.plan_approval`, message: \"Must be a boolean\" });\n }\n if (phase.outputs !== undefined) {\n if (!Array.isArray(phase.outputs)) {\n errors.push({ path: `${prefix}.outputs`, message: \"Must be an array of strings\" });\n }\n }\n if (phase.coordination !== undefined) {\n if (!Array.isArray(phase.coordination)) {\n errors.push({ path: `${prefix}.coordination`, message: \"Must be an array\" });\n }\n }\n }\n\n return errors;\n}\n\n// ── Subcommands ──\n\nconst createSubcommand = defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a new custom protocol\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Protocol name (e.g. my-workflow)\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n // Sanitize protocol name — only allow lowercase, digits, hyphens\n const protocolName = args.name as string;\n if (!/^[a-z][a-z0-9-]*$/.test(protocolName)) {\n p.log.error('Protocol name must start with a letter and contain only lowercase letters, digits, and hyphens.');\n process.exit(1);\n }\n\n const protocolsDir = join(cwd, CUSTOM_PROTOCOLS_DIR);\n const targetPath = join(protocolsDir, `${protocolName}.yaml`);\n\n // Check if protocol already exists\n try {\n await access(targetPath);\n p.log.error(`Protocol \"${args.name}\" already exists at ${CUSTOM_PROTOCOLS_DIR}/${args.name}.yaml`);\n process.exit(1);\n } catch {\n // File doesn't exist — good\n }\n\n // Interactive prompts\n const description = await p.text({\n message: \"Protocol description:\",\n placeholder: \"Describe the goal of your protocol\",\n validate: (val) => {\n if (!val || val.trim().length === 0) return \"Description is required\";\n },\n });\n\n if (p.isCancel(description)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const budgetStr = await p.text({\n message: \"Token budget:\",\n placeholder: \"500000\",\n initialValue: \"500000\",\n validate: (val) => {\n const n = Number(val);\n if (!Number.isInteger(n) || n < 1) return \"Must be a positive integer\";\n },\n });\n\n if (p.isCancel(budgetStr)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const budget = Number(budgetStr);\n\n // Read the template from core\n let templateContent: string;\n try {\n const corePath = getCorePath();\n templateContent = await readFile(\n join(corePath, \"templates\", \"custom-protocol.yaml\"),\n \"utf-8\",\n );\n } catch {\n p.log.warn(\"Could not read template from @sniper.ai/core. Using minimal template.\");\n templateContent = YAML.stringify({\n name: args.name,\n description: description as string,\n budget,\n phases: [\n {\n name: \"implement\",\n description: \"Implementation phase\",\n agents: [\"fullstack-dev\"],\n spawn_strategy: \"single\",\n gate: { checklist: \"implement\", human_approval: false },\n outputs: [\"source code changes\"],\n },\n ],\n auto_retro: true,\n });\n }\n\n // Replace template values safely using YAML parse/stringify\n let content: string;\n try {\n const parsed = YAML.parse(templateContent) as Record<string, unknown>;\n parsed.name = protocolName;\n parsed.description = description as string;\n parsed.budget = budget;\n content = YAML.stringify(parsed, { lineWidth: 0 });\n } catch {\n // Fallback to regex substitution for non-standard templates\n content = templateContent\n .replace(/^name: .+$/m, `name: ${protocolName}`)\n .replace(/^description: .+$/m, `description: ${YAML.stringify(description as string).trim()}`)\n .replace(/^budget: .+$/m, `budget: ${budget}`);\n }\n\n // Ensure directory exists\n await mkdir(protocolsDir, { recursive: true });\n\n await writeFile(targetPath, content, \"utf-8\");\n\n p.log.success(`Created custom protocol: ${CUSTOM_PROTOCOLS_DIR}/${protocolName}.yaml`);\n p.log.info(\"Edit the file to customize phases, agents, and gates.\");\n p.log.info(`Run \"sniper protocol validate ${protocolName}\" to check your protocol.`);\n },\n});\n\nconst listSubcommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List all available protocols (built-in and custom)\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n // Built-in protocols\n let builtInFiles: string[] = [];\n try {\n const corePath = getCorePath();\n const protocolsPath = join(corePath, \"protocols\");\n const files = await readdir(protocolsPath);\n builtInFiles = files.filter((f) => f.endsWith(\".yaml\"));\n } catch {\n p.log.warn(\"Could not read built-in protocols from @sniper.ai/core.\");\n }\n\n // Custom protocols\n let customFiles: string[] = [];\n try {\n const customDir = join(cwd, CUSTOM_PROTOCOLS_DIR);\n const files = await readdir(customDir);\n customFiles = files.filter((f) => f.endsWith(\".yaml\"));\n } catch {\n // No custom protocols directory\n }\n\n if (builtInFiles.length === 0 && customFiles.length === 0) {\n p.log.info(\"No protocols found.\");\n return;\n }\n\n if (builtInFiles.length > 0) {\n const corePathForList = getCorePath();\n p.log.step(\"Built-in protocols:\");\n for (const file of builtInFiles) {\n const name = file.replace(/\\.yaml$/, \"\");\n try {\n const raw = await readFile(join(corePathForList, \"protocols\", file), \"utf-8\");\n const data = YAML.parse(raw) as Record<string, unknown>;\n console.log(` - ${name}: ${data.description || \"(no description)\"}`);\n } catch {\n console.log(` - ${name}`);\n }\n }\n }\n\n if (customFiles.length > 0) {\n p.log.step(\"Custom protocols:\");\n for (const file of customFiles) {\n const name = file.replace(/\\.yaml$/, \"\");\n try {\n const raw = await readFile(join(cwd, CUSTOM_PROTOCOLS_DIR, file), \"utf-8\");\n const data = YAML.parse(raw) as Record<string, unknown>;\n console.log(` - ${name}: ${data.description || \"(no description)\"}`);\n } catch {\n console.log(` - ${name}`);\n }\n }\n }\n },\n});\n\nconst validateSubcommand = defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate a custom protocol against the schema\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Protocol name to validate\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n if (!/^[a-z][a-z0-9-]*$/.test(args.name as string)) {\n p.log.error(\"Protocol name must be lowercase alphanumeric with hyphens\");\n process.exit(1);\n }\n\n const filePath = join(cwd, CUSTOM_PROTOCOLS_DIR, `${args.name}.yaml`);\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch {\n p.log.error(`Protocol not found: ${CUSTOM_PROTOCOLS_DIR}/${args.name}.yaml`);\n process.exit(1);\n }\n\n let data: unknown;\n try {\n data = YAML.parse(raw);\n } catch (err) {\n p.log.error(`Invalid YAML: ${err}`);\n process.exit(1);\n }\n\n const errors = validateProtocol(data);\n\n if (errors.length === 0) {\n p.log.success(`Protocol \"${args.name}\" is valid.`);\n } else {\n p.log.error(`Protocol \"${args.name}\" has ${errors.length} error(s):`);\n for (const err of errors) {\n console.log(` ${err.path}: ${err.message}`);\n }\n process.exit(1);\n }\n },\n});\n\nexport const protocolCommand = defineCommand({\n meta: {\n name: \"protocol\",\n description: \"Manage SNIPER protocols\",\n },\n subCommands: {\n create: createSubcommand,\n list: listSubcommand,\n validate: validateSubcommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { readConfig, sniperConfigExists } from \"../config.js\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\nimport { pathExists } from \"../fs-utils.js\";\n\n// ── Types for parsed YAML data ──\n\ninterface CheckpointAgent {\n name: string;\n status: string;\n tasks_completed: number;\n tasks_total: number;\n}\n\ninterface Checkpoint {\n protocol: string;\n phase: string;\n timestamp: string;\n status: string;\n agents?: CheckpointAgent[];\n token_usage?: {\n phase_tokens?: number;\n cumulative_tokens?: number;\n budget_remaining?: number;\n };\n}\n\ninterface GateResult {\n gate: string;\n timestamp: string;\n result: \"pass\" | \"fail\";\n blocking_failures: number;\n total_checks: number;\n protocol?: string;\n}\n\ninterface VelocityExecution {\n protocol: string;\n completed_at: string;\n wall_clock_seconds?: number;\n tokens_used: number;\n tokens_per_phase?: Record<string, number>;\n}\n\ninterface Velocity {\n executions?: VelocityExecution[];\n calibrated_budgets?: Record<string, number>;\n rolling_averages?: Record<string, number>;\n}\n\ninterface DashboardData {\n cost_breakdown: {\n by_protocol: Record<string, { phase_tokens: number; cumulative_tokens: number; phases: string[] }>;\n by_agent: Record<string, { tokens: number; tasks_completed: number; tasks_total: number }>;\n };\n performance_trends: {\n executions: VelocityExecution[];\n calibrated_budgets: Record<string, number>;\n rolling_averages: Record<string, number>;\n };\n gate_pass_rates: Record<string, { pass: number; fail: number; total_checks: number }>;\n agent_efficiency: Record<string, { tokens_per_task: number; total_tokens: number; total_tasks: number }>;\n timeline: Array<{ timestamp: string; type: string; protocol: string; phase?: string; status: string }>;\n}\n\n// ── Helpers ──\n\nasync function readYamlDir<T>(dirPath: string): Promise<T[]> {\n if (!(await pathExists(dirPath))) return [];\n const files = await readdir(dirPath);\n const yamlFiles = files.filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\n const results: T[] = [];\n for (const file of yamlFiles) {\n try {\n const raw = await readFile(join(dirPath, file), \"utf-8\");\n const parsed = YAML.parse(raw);\n if (parsed) results.push(parsed as T);\n } catch {\n // Skip unparseable files\n }\n }\n return results;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(0)}K`;\n return String(n);\n}\n\n// ── Data aggregation ──\n\nfunction aggregateData(\n checkpoints: Checkpoint[],\n gates: GateResult[],\n velocity: Velocity | null,\n protocolFilter?: string,\n): DashboardData {\n const filtered = protocolFilter\n ? checkpoints.filter((c) => c.protocol === protocolFilter)\n : checkpoints;\n\n // Cost breakdown by protocol\n const byProtocol: DashboardData[\"cost_breakdown\"][\"by_protocol\"] = {};\n for (const cp of filtered) {\n if (!byProtocol[cp.protocol]) {\n byProtocol[cp.protocol] = { phase_tokens: 0, cumulative_tokens: 0, phases: [] };\n }\n const entry = byProtocol[cp.protocol];\n entry.phase_tokens += cp.token_usage?.phase_tokens ?? 0;\n if (cp.token_usage?.cumulative_tokens && cp.token_usage.cumulative_tokens > entry.cumulative_tokens) {\n entry.cumulative_tokens = cp.token_usage.cumulative_tokens;\n }\n if (!entry.phases.includes(cp.phase)) {\n entry.phases.push(cp.phase);\n }\n }\n\n // Cost breakdown by agent\n const byAgent: DashboardData[\"cost_breakdown\"][\"by_agent\"] = {};\n for (const cp of filtered) {\n const agentCount = cp.agents?.length ?? 1;\n const tokensPerAgent = agentCount > 0 ? (cp.token_usage?.phase_tokens ?? 0) / agentCount : 0;\n for (const agent of cp.agents ?? []) {\n if (!byAgent[agent.name]) {\n byAgent[agent.name] = { tokens: 0, tasks_completed: 0, tasks_total: 0 };\n }\n byAgent[agent.name].tokens += tokensPerAgent;\n byAgent[agent.name].tasks_completed += agent.tasks_completed;\n byAgent[agent.name].tasks_total += agent.tasks_total;\n }\n }\n\n // Gate pass rates\n const filteredGates = protocolFilter\n ? gates.filter((g) => g.protocol === protocolFilter)\n : gates;\n const gateRates: DashboardData[\"gate_pass_rates\"] = {};\n for (const g of filteredGates) {\n const key = g.protocol ? `${g.protocol}/${g.gate}` : g.gate;\n if (!gateRates[key]) {\n gateRates[key] = { pass: 0, fail: 0, total_checks: 0 };\n }\n if (g.result === \"pass\") gateRates[key].pass++;\n else gateRates[key].fail++;\n gateRates[key].total_checks += g.total_checks;\n }\n\n // Agent efficiency (tokens per task)\n const agentEfficiency: DashboardData[\"agent_efficiency\"] = {};\n for (const [name, data] of Object.entries(byAgent)) {\n const totalTasks = data.tasks_completed || 1;\n agentEfficiency[name] = {\n tokens_per_task: Math.round(data.tokens / totalTasks),\n total_tokens: Math.round(data.tokens),\n total_tasks: data.tasks_completed,\n };\n }\n\n // Performance trends\n const executions = velocity?.executions ?? [];\n const filteredExecs = protocolFilter\n ? executions.filter((e) => e.protocol === protocolFilter)\n : executions;\n\n // Timeline (merge checkpoints and gates, sorted by timestamp)\n const timeline: DashboardData[\"timeline\"] = [];\n for (const cp of filtered) {\n timeline.push({\n timestamp: cp.timestamp,\n type: \"checkpoint\",\n protocol: cp.protocol,\n phase: cp.phase,\n status: cp.status,\n });\n }\n for (const g of filteredGates) {\n timeline.push({\n timestamp: g.timestamp,\n type: \"gate\",\n protocol: g.protocol ?? \"unknown\",\n phase: g.gate,\n status: g.result,\n });\n }\n timeline.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n\n return {\n cost_breakdown: { by_protocol: byProtocol, by_agent: byAgent },\n performance_trends: {\n executions: filteredExecs,\n calibrated_budgets: velocity?.calibrated_budgets ?? {},\n rolling_averages: velocity?.rolling_averages ?? {},\n },\n gate_pass_rates: gateRates,\n agent_efficiency: agentEfficiency,\n timeline: timeline.slice(0, 20),\n };\n}\n\n// ── Formatted output ──\n\nfunction renderDashboard(data: DashboardData, config: Awaited<ReturnType<typeof readConfig>>): void {\n // 1. Cost Breakdown\n p.log.step(\"Cost Breakdown\");\n const protocols = Object.entries(data.cost_breakdown.by_protocol);\n if (protocols.length === 0) {\n console.log(\" No checkpoint data found.\");\n } else {\n for (const [protocol, info] of protocols) {\n const budget = config.routing.budgets[protocol];\n const budgetStr = budget ? ` / ${formatTokens(budget)} budget` : \"\";\n console.log(` ${protocol}: ${formatTokens(info.cumulative_tokens)} cumulative${budgetStr}`);\n console.log(` Phase tokens: ${formatTokens(info.phase_tokens)} across ${info.phases.length} phase(s)`);\n }\n }\n\n const agents = Object.entries(data.cost_breakdown.by_agent);\n if (agents.length > 0) {\n console.log(\"\");\n console.log(\" By Agent:\");\n for (const [name, info] of agents) {\n console.log(` ${name.padEnd(24)} ${formatTokens(info.tokens).padStart(8)} tokens (${info.tasks_completed}/${info.tasks_total} tasks)`);\n }\n }\n\n // 2. Performance Trends\n p.log.step(\"Performance Trends\");\n const execs = data.performance_trends.executions;\n if (execs.length === 0) {\n console.log(\" No execution history found.\");\n } else {\n const byProto: Record<string, VelocityExecution[]> = {};\n for (const e of execs) {\n if (!byProto[e.protocol]) byProto[e.protocol] = [];\n byProto[e.protocol].push(e);\n }\n for (const [proto, runs] of Object.entries(byProto)) {\n const avg = Math.round(runs.reduce((s, r) => s + r.tokens_used, 0) / runs.length);\n const calibrated = data.performance_trends.calibrated_budgets[proto];\n const rolling = data.performance_trends.rolling_averages[proto];\n console.log(` ${proto}: ${runs.length} execution(s), avg ${formatTokens(avg)} tokens`);\n if (rolling) console.log(` Rolling average: ${formatTokens(rolling)}`);\n if (calibrated) console.log(` Calibrated budget (p75): ${formatTokens(calibrated)}`);\n }\n }\n\n // 3. Gate Pass Rates\n p.log.step(\"Gate Pass Rates\");\n const gateEntries = Object.entries(data.gate_pass_rates);\n if (gateEntries.length === 0) {\n console.log(\" No gate results found.\");\n } else {\n for (const [key, info] of gateEntries) {\n const total = info.pass + info.fail;\n const rate = total > 0 ? Math.round((info.pass / total) * 100) : 0;\n const icon = rate === 100 ? \"\\u2713\" : rate >= 50 ? \"~\" : \"\\u2717\";\n console.log(` ${icon} ${key.padEnd(28)} ${rate}% pass (${info.pass}/${total}), ${info.total_checks} checks`);\n }\n }\n\n // 4. Agent Efficiency\n p.log.step(\"Agent Efficiency\");\n const effEntries = Object.entries(data.agent_efficiency);\n if (effEntries.length === 0) {\n console.log(\" No agent data found.\");\n } else {\n for (const [name, info] of effEntries) {\n console.log(` ${name.padEnd(24)} ${formatTokens(info.tokens_per_task).padStart(8)} tokens/task (${info.total_tasks} tasks, ${formatTokens(info.total_tokens)} total)`);\n }\n }\n\n // 5. Timeline\n p.log.step(\"Timeline (recent)\");\n if (data.timeline.length === 0) {\n console.log(\" No recent activity.\");\n } else {\n for (const entry of data.timeline.slice(0, 10)) {\n const ts = entry.timestamp.replace(\"T\", \" \").substring(0, 19);\n const icon = entry.type === \"gate\" ? (entry.status === \"pass\" ? \"\\u2713\" : \"\\u2717\") : \"\\u25B6\";\n const phaseStr = entry.phase ? `/${entry.phase}` : \"\";\n console.log(` ${ts} ${icon} ${entry.type.padEnd(12)} ${entry.protocol}${phaseStr} [${entry.status}]`);\n }\n }\n}\n\n// ── Command definition ──\n\nexport const dashboardCommand = defineCommand({\n meta: {\n name: \"dashboard\",\n description: \"Show observability dashboard with cost, performance, gates, and agent metrics\",\n },\n args: {\n protocol: {\n type: \"string\",\n description: \"Filter by protocol name\",\n required: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output structured JSON instead of formatted text\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const config = await readConfig(cwd);\n\n // Read data sources\n const sniperDir = join(cwd, \".sniper\");\n const checkpoints = await readYamlDir<Checkpoint>(join(sniperDir, \"checkpoints\"));\n const gates = await readYamlDir<GateResult>(join(sniperDir, \"gates\"));\n\n let velocity: Velocity | null = null;\n const velocityPath = join(sniperDir, \"memory\", \"velocity.yaml\");\n if (await pathExists(velocityPath)) {\n try {\n const raw = await readFile(velocityPath, \"utf-8\");\n velocity = YAML.parse(raw) as Velocity;\n } catch {\n // Skip if unparseable\n }\n }\n\n const protocolFilter = args.protocol || undefined;\n const data = aggregateData(checkpoints, gates, velocity, protocolFilter);\n\n if (args.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n const title = protocolFilter\n ? `SNIPER Dashboard — ${protocolFilter}`\n : \"SNIPER Dashboard\";\n p.intro(title);\n\n if (checkpoints.length === 0 && gates.length === 0 && !velocity) {\n p.log.info(\"No observability data found yet. Run a protocol to generate metrics.\");\n p.outro(\"\");\n return;\n }\n\n renderDashboard(data, config);\n\n p.outro(\"\");\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport {\n findWorkspaceRoot,\n readWorkspaceConfig,\n initWorkspace,\n addProject,\n syncConventions,\n} from \"../workspace-manager.js\";\n\nconst initSubcommand = defineCommand({\n meta: {\n name: \"init\",\n description: \"Initialize a SNIPER workspace for multi-project orchestration\",\n },\n args: {\n name: {\n type: \"string\",\n description: \"Workspace name\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n p.intro(\"SNIPER Workspace — Initialization\");\n\n const existing = await findWorkspaceRoot(cwd);\n if (existing) {\n p.log.warning(`Workspace already exists at ${existing}`);\n const overwrite = await p.confirm({\n message: \"Reinitialize workspace?\",\n initialValue: false,\n });\n if (p.isCancel(overwrite) || !overwrite) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n }\n\n let name = args.name;\n if (!name) {\n const input = await p.text({\n message: \"Workspace name:\",\n placeholder: \"my-workspace\",\n validate: (v) => (v.length === 0 ? \"Name is required\" : undefined),\n });\n if (p.isCancel(input)) { p.cancel(\"Aborted.\"); process.exit(0); }\n name = input as string;\n }\n\n const s = p.spinner();\n s.start(\"Creating workspace...\");\n\n try {\n const wsDir = await initWorkspace(cwd, name);\n s.stop(\"Done!\");\n p.log.success(`Workspace \"${name}\" created at ${wsDir}`);\n p.log.info(\"Created: config.yaml, memory/, locks/\");\n p.outro('Add projects with \"sniper workspace add <name> --path <dir>\"');\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Workspace init failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst addSubcommand = defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a project to the workspace\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Project name\",\n required: true,\n },\n path: {\n type: \"string\",\n description: \"Relative path to the project directory\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error('No workspace found. Run \"sniper workspace init\" first.');\n process.exit(1);\n }\n\n try {\n await addProject(wsRoot, args.name, args.path);\n p.log.success(`Added project \"${args.name}\" (${args.path}) to workspace.`);\n } catch (err) {\n p.log.error(`Failed to add project: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst statusSubcommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show workspace status\",\n },\n run: async () => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error('No workspace found. Run \"sniper workspace init\" first.');\n process.exit(1);\n }\n\n const config = await readWorkspaceConfig(wsRoot);\n\n p.intro(`Workspace: ${config.name}`);\n\n // Projects\n p.log.step(\"Projects:\");\n if (config.projects.length === 0) {\n console.log(\" (none)\");\n } else {\n for (const proj of config.projects) {\n const typeLabel = proj.type ? ` (${proj.type})` : \"\";\n console.log(` - ${proj.name}: ${proj.path}${typeLabel}`);\n }\n }\n\n // Shared conventions\n const conventions = config.shared?.conventions ?? [];\n p.log.info(`Shared conventions: ${conventions.length}`);\n\n // Anti-patterns\n const antiPatterns = config.shared?.anti_patterns ?? [];\n p.log.info(`Anti-patterns: ${antiPatterns.length}`);\n\n // ADRs\n const adrs = config.shared?.architectural_decisions ?? [];\n p.log.info(`Architectural decisions: ${adrs.length}`);\n\n // Memory\n const memDir = config.memory?.directory;\n p.log.info(`Memory: ${memDir ? memDir : \"not configured\"}`);\n\n p.outro(\"\");\n },\n});\n\nconst syncSubcommand = defineCommand({\n meta: {\n name: \"sync\",\n description: \"Sync shared conventions to workspace projects\",\n },\n run: async () => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error('No workspace found. Run \"sniper workspace init\" first.');\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Syncing conventions...\");\n\n try {\n const synced = await syncConventions(wsRoot);\n s.stop(\"Done!\");\n if (synced.length === 0) {\n p.log.info(\"No projects with .sniper/config.yaml found to sync.\");\n } else {\n for (const name of synced) {\n p.log.success(`Checked: ${name}`);\n }\n }\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Sync failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nexport const workspaceCommand = defineCommand({\n meta: {\n name: \"workspace\",\n description: \"Manage SNIPER workspaces for multi-project orchestration\",\n },\n subCommands: {\n init: initSubcommand,\n add: addSubcommand,\n status: statusSubcommand,\n sync: syncSubcommand,\n },\n});\n","import { readFile, writeFile, access, mkdir } from \"node:fs/promises\";\nimport { join, resolve, dirname } from \"node:path\";\nimport YAML from \"yaml\";\n\nconst WORKSPACE_DIR = \".sniper-workspace\";\nconst WORKSPACE_CONFIG = \"config.yaml\";\n\n// ── Interfaces ──\n\nexport interface WorkspaceProject {\n name: string;\n path: string;\n type?: string;\n}\n\nexport interface ArchitecturalDecision {\n id: string;\n title: string;\n decision: string;\n rationale: string;\n date: string;\n}\n\nexport interface WorkspaceConfig {\n name: string;\n projects: WorkspaceProject[];\n shared?: {\n conventions?: string[];\n anti_patterns?: string[];\n architectural_decisions?: ArchitecturalDecision[];\n };\n memory?: {\n directory?: string;\n };\n}\n\n// ── Helpers ──\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Public API ──\n\n/**\n * Walk parent directories looking for `.sniper-workspace/config.yaml`.\n * Returns the directory containing `.sniper-workspace/` or null if not found.\n */\nexport async function findWorkspaceRoot(\n cwd: string,\n): Promise<string | null> {\n let dir = resolve(cwd);\n\n while (true) {\n const configPath = join(dir, WORKSPACE_DIR, WORKSPACE_CONFIG);\n if (await pathExists(configPath)) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\n/**\n * Read and parse `.sniper-workspace/config.yaml` from the workspace root.\n */\nexport async function readWorkspaceConfig(\n workspaceRoot: string,\n): Promise<WorkspaceConfig> {\n const configPath = join(workspaceRoot, WORKSPACE_DIR, WORKSPACE_CONFIG);\n const raw = await readFile(configPath, \"utf-8\");\n const data = YAML.parse(raw) as WorkspaceConfig;\n\n if (!data || typeof data !== \"object\") {\n throw new Error(\"Invalid workspace config: expected an object\");\n }\n if (!data.name || typeof data.name !== \"string\") {\n throw new Error('Invalid workspace config: missing \"name\"');\n }\n if (!Array.isArray(data.projects)) {\n throw new Error('Invalid workspace config: missing \"projects\" array');\n }\n\n return data;\n}\n\n/**\n * Return the shared conventions array from workspace config.\n */\nexport async function getSharedConventions(\n workspaceRoot: string,\n): Promise<string[]> {\n const config = await readWorkspaceConfig(workspaceRoot);\n return config.shared?.conventions ?? [];\n}\n\n/**\n * Add a project entry to the workspace config.\n */\nexport async function addProject(\n workspaceRoot: string,\n name: string,\n path: string,\n): Promise<void> {\n if (path.includes('..')) {\n throw new Error(`Project path must not contain '..': ${path}`);\n }\n\n const config = await readWorkspaceConfig(workspaceRoot);\n\n if (config.projects.some((p) => p.name === name)) {\n throw new Error(`Project \"${name}\" already exists in workspace`);\n }\n\n config.projects.push({ name, path });\n\n const configPath = join(workspaceRoot, WORKSPACE_DIR, WORKSPACE_CONFIG);\n await writeFile(configPath, YAML.stringify(config, { lineWidth: 0 }), \"utf-8\");\n}\n\n/**\n * Sync shared conventions to individual projects.\n * Currently returns projects that have a SNIPER config (candidates for sync).\n * TODO: Actually write workspace conventions into each project's config.\n */\nexport async function syncConventions(\n workspaceRoot: string,\n): Promise<string[]> {\n const config = await readWorkspaceConfig(workspaceRoot);\n const candidates: string[] = [];\n\n for (const project of config.projects) {\n const projectConfigPath = join(\n workspaceRoot,\n project.path,\n \".sniper\",\n \"config.yaml\",\n );\n if (await pathExists(projectConfigPath)) {\n candidates.push(project.name);\n }\n }\n\n return candidates;\n}\n\n/**\n * Initialize a new workspace: creates `.sniper-workspace/` with config, memory, and locks dirs.\n * Returns the path to the workspace directory.\n */\nexport async function initWorkspace(\n cwd: string,\n name: string,\n): Promise<string> {\n const wsDir = join(cwd, WORKSPACE_DIR);\n const memoryDir = join(wsDir, \"memory\");\n const locksDir = join(wsDir, \"locks\");\n\n await mkdir(wsDir, { recursive: true });\n await mkdir(memoryDir, { recursive: true });\n await mkdir(locksDir, { recursive: true });\n\n const config: WorkspaceConfig = {\n name,\n projects: [],\n shared: {\n conventions: [],\n anti_patterns: [],\n architectural_decisions: [],\n },\n memory: {\n directory: `${WORKSPACE_DIR}/memory`,\n },\n };\n\n const configPath = join(wsDir, WORKSPACE_CONFIG);\n await writeFile(configPath, YAML.stringify(config, { lineWidth: 0 }), \"utf-8\");\n\n return wsDir;\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport { pathExists } from \"../fs-utils.js\";\n\nfunction isValidSha(sha: string): boolean {\n return /^[0-9a-f]{7,40}$/i.test(sha);\n}\n\ninterface CheckpointCommit {\n sha: string;\n message: string;\n agent: string;\n}\n\ninterface Checkpoint {\n protocol: string;\n phase: string;\n commits?: CheckpointCommit[];\n}\n\nexport const revertCommand = defineCommand({\n meta: {\n name: \"revert\",\n description: \"Logically revert a SNIPER protocol, phase, or checkpoint\",\n },\n args: {\n protocol: {\n type: \"string\",\n description: \"Protocol ID to revert\",\n },\n phase: {\n type: \"string\",\n description: \"Specific phase to revert\",\n },\n checkpoint: {\n type: \"string\",\n description: \"Specific checkpoint file to revert\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would be reverted without doing it\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error(\n 'SNIPER is not initialized. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n p.intro(\"SNIPER v3 — Logical Revert\");\n\n const checkpointsDir = join(cwd, \".sniper\", \"checkpoints\");\n if (!(await pathExists(checkpointsDir))) {\n p.log.error(\"No checkpoints found. Nothing to revert.\");\n process.exit(1);\n }\n\n // Read all checkpoint files\n const files = await readdir(checkpointsDir);\n const yamlFiles = files.filter(\n (f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"),\n );\n\n if (yamlFiles.length === 0) {\n p.log.error(\"No checkpoint files found. Nothing to revert.\");\n process.exit(1);\n }\n\n const checkpoints: Array<{ filename: string; data: Checkpoint }> = [];\n for (const file of yamlFiles) {\n const raw = await readFile(join(checkpointsDir, file), \"utf-8\");\n const data = YAML.parse(raw) as Checkpoint;\n if (data) {\n checkpoints.push({ filename: file, data });\n }\n }\n\n // Filter by --protocol, --phase, or --checkpoint\n let filtered = checkpoints;\n\n if (args.checkpoint) {\n filtered = filtered.filter((c) => c.filename === args.checkpoint);\n }\n if (args.protocol) {\n filtered = filtered.filter((c) => c.data.protocol === args.protocol);\n }\n if (args.phase) {\n filtered = filtered.filter((c) => c.data.phase === args.phase);\n }\n\n if (filtered.length === 0) {\n p.log.error(\"No matching checkpoints found for the given filters.\");\n process.exit(1);\n }\n\n // Collect commits from matching checkpoints\n const commits: CheckpointCommit[] = [];\n for (const cp of filtered) {\n if (Array.isArray(cp.data.commits)) {\n for (const commit of cp.data.commits) {\n // Avoid duplicates by SHA\n if (!commits.some((c) => c.sha === commit.sha)) {\n commits.push(commit);\n }\n }\n }\n }\n\n if (commits.length === 0) {\n p.log.error(\n \"No commits found in matching checkpoints. Nothing to revert.\",\n );\n process.exit(1);\n }\n\n // Show what would be reverted\n const protocolLabel = args.protocol || filtered[0].data.protocol;\n const phaseLabel = args.phase || \"(all phases)\";\n\n p.log.step(\n `Revert plan: ${commits.length} commit(s) from protocol \"${protocolLabel}\" ${args.phase ? `phase \"${phaseLabel}\"` : \"\"}`,\n );\n\n for (const commit of commits) {\n console.log(` ${commit.sha.substring(0, 8)} ${commit.message} (${commit.agent})`);\n }\n\n // Dry run stops here\n if (args[\"dry-run\"]) {\n p.log.info(\"Dry run complete. No changes were made.\");\n p.outro(\"\");\n return;\n }\n\n // Confirm unless --yes\n if (!args.yes) {\n const confirmed = await p.confirm({\n message: `Revert ${commits.length} commit(s)? A backup branch will be created.`,\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel(\"Revert aborted.\");\n process.exit(0);\n }\n }\n\n // Create backup branch\n const timestamp = Date.now();\n const backupBranch = `sniper-revert-backup-${timestamp}`;\n\n try {\n execFileSync(\"git\", [\"branch\", backupBranch], { cwd });\n p.log.success(`Created backup branch: ${backupBranch}`);\n } catch (err) {\n p.log.error(`Failed to create backup branch: ${err}`);\n process.exit(1);\n }\n\n // Revert each commit in reverse chronological order (already ordered from checkpoints)\n const s = p.spinner();\n s.start(\"Reverting commits...\");\n\n try {\n for (const commit of commits) {\n if (!isValidSha(commit.sha)) {\n throw new Error(`Invalid commit SHA: ${commit.sha}`);\n }\n execFileSync(\"git\", [\"revert\", \"--no-commit\", commit.sha], { cwd });\n }\n\n // Create single revert commit\n const revertMessage = `revert: undo ${commits.length} commit(s) from protocol \"${protocolLabel}\"${args.phase ? ` phase \"${phaseLabel}\"` : \"\"}\\n\\nReverted commits:\\n${commits.map((c) => ` - ${c.sha.substring(0, 8)} ${c.message}`).join(\"\\n\")}\\n\\nBackup branch: ${backupBranch}`;\n\n execFileSync(\"git\", [\"commit\", \"-m\", revertMessage], { cwd });\n\n s.stop(\"Revert complete!\");\n\n p.log.success(\n `Successfully reverted ${commits.length} commit(s). Backup branch: ${backupBranch}`,\n );\n p.outro(\"\");\n } catch (err) {\n s.stop(\"Revert failed!\");\n p.log.error(`Revert failed: ${err}`);\n p.log.info(\n `Your backup branch \"${backupBranch}\" is intact. You can run \"git revert --abort\" to undo the partial revert.`,\n );\n process.exit(1);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { HeadlessRunner, ExitCode } from \"../headless.js\";\nimport type { HeadlessOptions } from \"../headless.js\";\n\nexport const runCommand = defineCommand({\n meta: {\n name: \"run\",\n description: \"Run a SNIPER protocol in headless mode (for CI/CD)\",\n },\n args: {\n protocol: {\n type: \"string\",\n description:\n \"Protocol to run (full, feature, patch, ingest, explore, refactor, hotfix)\",\n required: true,\n },\n ci: {\n type: \"boolean\",\n description:\n \"CI mode: sets auto-approve, json output, warn-level logging\",\n default: false,\n },\n \"auto-approve\": {\n type: \"boolean\",\n description: \"Auto-approve all gates\",\n default: false,\n },\n output: {\n type: \"string\",\n description: \"Output format: json, yaml, text\",\n default: \"text\",\n },\n timeout: {\n type: \"string\",\n description: \"Timeout in minutes\",\n default: \"60\",\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n // Check SNIPER is initialized\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(ExitCode.ConfigError);\n }\n\n // Validate output format\n const validFormats = [\"json\", \"yaml\", \"text\"];\n const outputFormat = args.ci ? \"json\" : (args.output ?? \"text\");\n if (!validFormats.includes(outputFormat)) {\n p.log.error(\n `Invalid output format: \"${outputFormat}\". Use: ${validFormats.join(\", \")}`,\n );\n process.exit(ExitCode.ConfigError);\n }\n\n // Build headless options\n const options: HeadlessOptions = {\n protocol: args.protocol as string,\n autoApproveGates: args.ci || args[\"auto-approve\"] || false,\n outputFormat: outputFormat as \"json\" | \"yaml\" | \"text\",\n logLevel: args.ci ? \"warn\" : \"info\",\n timeoutMinutes: parseInt(args.timeout as string, 10) || 60,\n failOnGateFailure: true,\n };\n\n // Run headless execution\n const runner = new HeadlessRunner(cwd, options);\n const result = await runner.run();\n\n // Output result in requested format\n const output = runner.formatOutput(result);\n if (result.exitCode === ExitCode.Success) {\n process.stdout.write(output + \"\\n\");\n } else {\n // Errors go to stderr, structured result to stdout\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n process.stderr.write(`error: ${err}\\n`);\n }\n }\n process.stdout.write(output + \"\\n\");\n }\n\n process.exit(result.exitCode);\n },\n});\n","import { readConfig } from \"./config.js\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\n\n// ── Exit Codes ──\n\nexport enum ExitCode {\n Success = 0,\n GateFail = 1,\n CostExceeded = 2,\n Timeout = 3,\n ConfigError = 4,\n}\n\n// ── Interfaces ──\n\nexport interface HeadlessOptions {\n protocol: string;\n autoApproveGates: boolean;\n outputFormat: \"json\" | \"yaml\" | \"text\";\n logLevel: \"debug\" | \"info\" | \"warn\" | \"error\";\n timeoutMinutes: number;\n failOnGateFailure: boolean;\n}\n\nexport interface PhaseResult {\n name: string;\n status: \"completed\" | \"failed\" | \"skipped\";\n gate_result?: \"passed\" | \"failed\" | \"auto_approved\";\n tokens: number;\n}\n\nexport interface HeadlessResult {\n exitCode: ExitCode;\n protocol: string;\n phases: PhaseResult[];\n totalTokens: number;\n duration: number;\n errors: string[];\n}\n\n// ── Valid Protocols ──\n\nconst BUILT_IN_PROTOCOLS = [\n \"full\",\n \"feature\",\n \"patch\",\n \"ingest\",\n \"explore\",\n \"refactor\",\n \"hotfix\",\n];\n\n// ── HeadlessRunner ──\n\nexport class HeadlessRunner {\n private cwd: string;\n private options: HeadlessOptions;\n\n constructor(cwd: string, options: HeadlessOptions) {\n this.cwd = cwd;\n this.options = options;\n }\n\n async run(): Promise<HeadlessResult> {\n const startTime = Date.now();\n const errors: string[] = [];\n\n // Validate config exists and is readable\n let config;\n try {\n config = await readConfig(this.cwd);\n } catch (err) {\n return {\n exitCode: ExitCode.ConfigError,\n protocol: this.options.protocol,\n phases: [],\n totalTokens: 0,\n duration: Date.now() - startTime,\n errors: [\n `Config error: ${err instanceof Error ? err.message : String(err)}`,\n ],\n };\n }\n\n // Validate protocol name\n if (!/^[a-z][a-z0-9-]*$/.test(this.options.protocol)) {\n return {\n exitCode: ExitCode.ConfigError,\n protocol: this.options.protocol,\n phases: [],\n totalTokens: 0,\n duration: Date.now() - startTime,\n errors: [\n `Invalid protocol name: \"${this.options.protocol}\". Must be lowercase alphanumeric with hyphens.`,\n ],\n };\n }\n\n // Validate the protocol exists\n const isBuiltIn = BUILT_IN_PROTOCOLS.includes(this.options.protocol);\n let isCustom = false;\n\n if (!isBuiltIn) {\n try {\n const customPath = join(\n this.cwd,\n \".sniper\",\n \"protocols\",\n `${this.options.protocol}.yaml`,\n );\n await readFile(customPath, \"utf-8\");\n isCustom = true;\n } catch {\n // Not a custom protocol either\n }\n }\n\n if (!isBuiltIn && !isCustom) {\n return {\n exitCode: ExitCode.ConfigError,\n protocol: this.options.protocol,\n phases: [],\n totalTokens: 0,\n duration: Date.now() - startTime,\n errors: [\n `Unknown protocol: \"${this.options.protocol}\". Available: ${BUILT_IN_PROTOCOLS.join(\", \")} (or define a custom protocol in .sniper/protocols/)`,\n ],\n };\n }\n\n // Stub: headless execution is not yet implemented.\n // In production, this will spawn a Claude Code subprocess with\n // the sniper-flow-headless skill and capture structured output.\n return {\n exitCode: ExitCode.ConfigError,\n protocol: this.options.protocol,\n phases: [],\n totalTokens: 0,\n duration: Date.now() - startTime,\n errors: [\n \"Headless mode is not yet implemented. Protocol validation passed, but no execution occurred. Use /sniper-flow interactively instead.\",\n ],\n };\n }\n\n formatOutput(result: HeadlessResult): string {\n switch (this.options.outputFormat) {\n case \"json\":\n return JSON.stringify(\n {\n protocol: result.protocol,\n status: exitCodeToStatus(result.exitCode),\n phases: result.phases,\n total_tokens: result.totalTokens,\n duration_seconds: Math.round(result.duration / 1000),\n errors: result.errors,\n },\n null,\n 2,\n );\n\n case \"yaml\":\n return YAML.stringify({\n protocol: result.protocol,\n status: exitCodeToStatus(result.exitCode),\n phases: result.phases,\n total_tokens: result.totalTokens,\n duration_seconds: Math.round(result.duration / 1000),\n errors: result.errors,\n });\n\n case \"text\":\n return formatTextTable(result);\n\n default:\n return JSON.stringify(\n {\n protocol: result.protocol,\n status: exitCodeToStatus(result.exitCode),\n phases: result.phases,\n total_tokens: result.totalTokens,\n duration_seconds: Math.round(result.duration / 1000),\n errors: result.errors,\n },\n null,\n 2,\n );\n }\n }\n}\n\n// ── Helpers ──\n\nfunction exitCodeToStatus(code: ExitCode): string {\n switch (code) {\n case ExitCode.Success:\n return \"success\";\n case ExitCode.GateFail:\n return \"gate_fail\";\n case ExitCode.CostExceeded:\n return \"cost_exceeded\";\n case ExitCode.Timeout:\n return \"timeout\";\n case ExitCode.ConfigError:\n return \"config_error\";\n }\n}\n\nfunction formatTextTable(result: HeadlessResult): string {\n const lines: string[] = [];\n const status = exitCodeToStatus(result.exitCode);\n\n lines.push(`Protocol: ${result.protocol}`);\n lines.push(`Status: ${status}`);\n lines.push(`Duration: ${Math.round(result.duration / 1000)}s`);\n lines.push(`Tokens: ${result.totalTokens}`);\n\n if (result.phases.length > 0) {\n lines.push(\"\");\n lines.push(\"Phase Status Gate Tokens\");\n lines.push(\"---------------- ----------- ---------------- ------\");\n for (const phase of result.phases) {\n const name = phase.name.padEnd(16);\n const phaseStatus = phase.status.padEnd(11);\n const gate = (phase.gate_result ?? \"-\").padEnd(16);\n lines.push(`${name} ${phaseStatus} ${gate} ${phase.tokens}`);\n }\n }\n\n if (result.errors.length > 0) {\n lines.push(\"\");\n lines.push(\"Errors:\");\n for (const err of result.errors) {\n lines.push(` - ${err}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport {\n searchPackages,\n getPackageInfo,\n validatePublishable,\n} from \"../marketplace-client.js\";\nimport { installPlugin } from \"../plugin-manager.js\";\n\nconst searchSubcommand = defineCommand({\n meta: {\n name: \"search\",\n description: \"Search the SNIPER marketplace for packages\",\n },\n args: {\n query: {\n type: \"positional\",\n description: \"Search query\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const s = p.spinner();\n s.start(\"Searching marketplace...\");\n\n try {\n const result = await searchPackages(args.query);\n s.stop(\"Done!\");\n\n if (result.packages.length === 0) {\n p.log.info(\"No packages found.\");\n return;\n }\n\n p.log.step(`Found ${result.total} result(s):`);\n console.log(\n ` ${\"Name\".padEnd(35)} ${\"Version\".padEnd(10)} ${\"Type\".padEnd(8)} Description`,\n );\n console.log(` ${\"─\".repeat(35)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(30)}`);\n for (const pkg of result.packages) {\n const desc =\n pkg.description.length > 40\n ? pkg.description.slice(0, 37) + \"...\"\n : pkg.description;\n console.log(\n ` ${pkg.name.padEnd(35)} ${pkg.version.padEnd(10)} ${pkg.sniperType.padEnd(8)} ${desc}`,\n );\n }\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Search failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst installSubcommand = defineCommand({\n meta: {\n name: \"install\",\n description: \"Install a package from the SNIPER marketplace\",\n },\n args: {\n package: {\n type: \"positional\",\n description: \"Package name to install\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Checking ${args.package}...`);\n\n try {\n const info = await getPackageInfo(args.package);\n if (!info) {\n s.stop(\"Failed!\");\n p.log.error(\n `${args.package} is not a valid SNIPER package (not found or missing sniper metadata).`,\n );\n process.exit(1);\n }\n\n s.message(`Installing ${args.package}...`);\n const result = await installPlugin(args.package, cwd);\n s.stop(\"Done!\");\n p.log.success(\n `Installed ${info.sniperType}: ${result.name} v${result.version}`,\n );\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Installation failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst infoSubcommand = defineCommand({\n meta: {\n name: \"info\",\n description: \"Show details about a SNIPER marketplace package\",\n },\n args: {\n package: {\n type: \"positional\",\n description: \"Package name to inspect\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const s = p.spinner();\n s.start(`Fetching info for ${args.package}...`);\n\n try {\n const info = await getPackageInfo(args.package);\n s.stop(\"Done!\");\n\n if (!info) {\n p.log.error(\n `${args.package} not found or is not a SNIPER package.`,\n );\n process.exit(1);\n }\n\n p.log.step(`Package: ${info.name}`);\n console.log(` Version: ${info.version}`);\n console.log(` Type: ${info.sniperType}`);\n console.log(` Description: ${info.description || \"(none)\"}`);\n console.log(` Tags: ${info.tags.length > 0 ? info.tags.join(\", \") : \"(none)\"}`);\n console.log(` Author: ${info.author || \"(unknown)\"}`);\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Fetch failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst publishSubcommand = defineCommand({\n meta: {\n name: \"publish\",\n description: \"Validate and guide publishing a SNIPER package\",\n },\n run: async () => {\n const cwd = process.cwd();\n const s = p.spinner();\n s.start(\"Validating package...\");\n\n try {\n const result = await validatePublishable(cwd);\n s.stop(\"Done!\");\n\n if (!result.valid) {\n p.log.error(\"Package is not publishable:\");\n for (const err of result.errors) {\n console.log(` - ${err}`);\n }\n process.exit(1);\n }\n\n p.log.success(\"Package is valid and ready to publish.\");\n p.log.info('Run \"npm publish\" to publish your package to the marketplace.');\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Validation failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nexport const marketplaceCommand = defineCommand({\n meta: {\n name: \"marketplace\",\n description: \"Browse and manage SNIPER marketplace packages\",\n },\n subCommands: {\n search: searchSubcommand,\n install: installSubcommand,\n info: infoSubcommand,\n publish: publishSubcommand,\n },\n});\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface MarketplacePackage {\n name: string;\n version: string;\n description: string;\n sniperType: \"plugin\" | \"agent\" | \"mixin\" | \"pack\";\n tags: string[];\n author?: string;\n downloads?: number;\n}\n\nexport interface SearchResult {\n packages: MarketplacePackage[];\n total: number;\n}\n\ninterface NpmSearchObject {\n package: {\n name: string;\n version: string;\n description?: string;\n keywords?: string[];\n author?: { name?: string };\n links?: { npm?: string };\n };\n score?: { detail?: { popularity?: number } };\n}\n\ninterface NpmSearchResponse {\n objects: NpmSearchObject[];\n total: number;\n}\n\ninterface NpmPackageResponse {\n name: string;\n \"dist-tags\"?: { latest?: string };\n versions?: Record<\n string,\n {\n description?: string;\n keywords?: string[];\n author?: { name?: string };\n sniper?: { type?: string };\n }\n >;\n}\n\nfunction inferSniperType(\n sniper?: { type?: string },\n): \"plugin\" | \"agent\" | \"mixin\" | \"pack\" | null {\n if (!sniper?.type) return null;\n const t = sniper.type;\n if (t === \"plugin\" || t === \"agent\" || t === \"mixin\" || t === \"pack\") {\n return t;\n }\n return null;\n}\n\nexport async function searchPackages(\n query: string,\n limit?: number,\n): Promise<SearchResult> {\n const size = limit || 20;\n const url = `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}+keywords:sniper&size=${size}`;\n const resp = await fetch(url);\n\n if (!resp.ok) {\n throw new Error(`npm registry search failed: ${resp.status}`);\n }\n\n const data = (await resp.json()) as NpmSearchResponse;\n\n // Fetch full metadata in parallel instead of sequentially\n const results = await Promise.all(\n data.objects.map((obj) => getPackageInfo(obj.package.name)),\n );\n const packages = results.filter(\n (info): info is MarketplacePackage => info !== null,\n );\n\n return { packages, total: packages.length };\n}\n\nexport async function getPackageInfo(\n name: string,\n): Promise<MarketplacePackage | null> {\n const url = `https://registry.npmjs.org/${encodeURIComponent(name)}`;\n const resp = await fetch(url);\n\n if (!resp.ok) {\n if (resp.status === 404) return null;\n throw new Error(`npm registry fetch failed: ${resp.status}`);\n }\n\n const data = (await resp.json()) as NpmPackageResponse;\n const latest = data[\"dist-tags\"]?.latest;\n if (!latest || !data.versions?.[latest]) return null;\n\n const version = data.versions[latest];\n const sniperType = inferSniperType(version.sniper);\n if (!sniperType) return null;\n\n return {\n name: data.name,\n version: latest,\n description: version.description || \"\",\n sniperType,\n tags: version.keywords || [],\n author: version.author?.name,\n };\n}\n\nexport async function validatePublishable(\n cwd: string,\n): Promise<{ valid: boolean; errors: string[] }> {\n const errors: string[] = [];\n\n let pkgJson: { name?: string; sniper?: { type?: string } };\n try {\n const raw = await readFile(join(cwd, \"package.json\"), \"utf-8\");\n pkgJson = JSON.parse(raw);\n } catch {\n return { valid: false, errors: [\"No package.json found in current directory\"] };\n }\n\n if (!pkgJson.name) {\n errors.push(\"package.json is missing a 'name' field\");\n } else if (\n !pkgJson.name.startsWith(\"@sniper.ai/\") &&\n !pkgJson.name.startsWith(\"sniper-\")\n ) {\n errors.push(\n `Package name \"${pkgJson.name}\" must start with @sniper.ai/ or sniper-`,\n );\n }\n\n if (!pkgJson.sniper?.type) {\n errors.push(\"package.json is missing 'sniper.type' field\");\n }\n\n if (pkgJson.sniper?.type === \"plugin\") {\n try {\n await readFile(join(cwd, \"plugin.yaml\"), \"utf-8\");\n } catch {\n errors.push(\"Plugins require a plugin.yaml file in the package root\");\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { sniperConfigExists } from \"../config.js\";\nimport {\n ingestSignal,\n ingestFromPR,\n listSignals,\n clearSignals,\n getSignalDir,\n type Signal,\n} from \"../signal-collector.js\";\nimport { ensureDir } from \"../fs-utils.js\";\n\nconst SIGNAL_TYPES = [\n { value: \"ci_failure\", label: \"CI Failure\" },\n { value: \"pr_review_comment\", label: \"PR Review Comment\" },\n { value: \"production_error\", label: \"Production Error\" },\n { value: \"manual\", label: \"Manual\" },\n] as const;\n\nconst ingestSubcommand = defineCommand({\n meta: {\n name: \"ingest\",\n description: \"Interactively create a new signal record\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const type = await p.select({\n message: \"Signal type:\",\n options: SIGNAL_TYPES.map((t) => ({ value: t.value, label: t.label })),\n });\n\n if (p.isCancel(type)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const source = await p.text({\n message: \"Source (e.g., github-actions, pr-42, datadog):\",\n validate: (v) => (v.length === 0 ? \"Source is required\" : undefined),\n });\n\n if (p.isCancel(source)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const summary = await p.text({\n message: \"Summary (one-line description):\",\n validate: (v) => (v.length === 0 ? \"Summary is required\" : undefined),\n });\n\n if (p.isCancel(summary)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const details = await p.text({\n message: \"Details (optional — full error message or context):\",\n });\n\n if (p.isCancel(details)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const filesInput = await p.text({\n message: \"Affected files (optional — comma-separated paths):\",\n });\n\n if (p.isCancel(filesInput)) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const signal: Signal = {\n type: type as Signal[\"type\"],\n source: source as string,\n timestamp: new Date().toISOString(),\n summary: summary as string,\n };\n\n if (details && (details as string).length > 0) {\n signal.details = details as string;\n }\n\n if (filesInput && (filesInput as string).length > 0) {\n signal.affected_files = (filesInput as string)\n .split(\",\")\n .map((f) => f.trim())\n .filter((f) => f.length > 0);\n }\n\n await ensureDir(getSignalDir(cwd));\n const filename = await ingestSignal(cwd, signal);\n\n p.log.success(`Signal captured: ${filename}`);\n },\n});\n\nconst ingestPrSubcommand = defineCommand({\n meta: {\n name: \"ingest-pr\",\n description: \"Ingest signals from a GitHub PR's reviews and comments\",\n },\n args: {\n \"pr-number\": {\n type: \"positional\",\n description: \"Pull request number\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const prNumber = parseInt(args[\"pr-number\"] as string, 10);\n\n if (isNaN(prNumber)) {\n p.log.error(\"Invalid PR number.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(`Ingesting signals from PR #${prNumber}...`);\n\n try {\n const signals = await ingestFromPR(cwd, prNumber);\n s.stop(\"Done!\");\n p.log.success(`Captured ${signals.length} signal(s) from PR #${prNumber}`);\n\n for (const signal of signals) {\n p.log.info(` - ${signal.summary}`);\n }\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Failed to ingest PR signals: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst listSubcommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List captured signals\",\n },\n args: {\n type: {\n type: \"string\",\n description: \"Filter by signal type\",\n required: false,\n },\n limit: {\n type: \"string\",\n description: \"Maximum number of signals to display\",\n required: false,\n default: \"20\",\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const limit = parseInt(args.limit as string, 10) || 20;\n const signals = await listSignals(cwd, {\n type: args.type as string | undefined,\n limit,\n });\n\n if (signals.length === 0) {\n p.log.info(\"No signals found.\");\n return;\n }\n\n p.log.step(`Signals (${signals.length}):`);\n console.log();\n console.log(\n \" \" +\n \"Type\".padEnd(22) +\n \"Source\".padEnd(20) +\n \"Timestamp\".padEnd(22) +\n \"Summary\",\n );\n console.log(\" \" + \"-\".repeat(90));\n\n for (const signal of signals) {\n const ts = new Date(signal.timestamp).toISOString().slice(0, 19).replace(\"T\", \" \");\n console.log(\n \" \" +\n signal.type.padEnd(22) +\n signal.source.padEnd(20) +\n ts.padEnd(22) +\n signal.summary.slice(0, 50),\n );\n }\n },\n});\n\nconst clearSubcommand = defineCommand({\n meta: {\n name: \"clear\",\n description: \"Delete all captured signals\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const confirm = await p.confirm({\n message: \"Delete all captured signals? This cannot be undone.\",\n });\n\n if (p.isCancel(confirm) || !confirm) {\n p.cancel(\"Cancelled.\");\n process.exit(0);\n }\n\n const count = await clearSignals(cwd);\n p.log.success(`Cleared ${count} signal(s).`);\n },\n});\n\nexport const signalCommand = defineCommand({\n meta: {\n name: \"signal\",\n description: \"Manage external signal learning\",\n },\n subCommands: {\n ingest: ingestSubcommand,\n \"ingest-pr\": ingestPrSubcommand,\n list: listSubcommand,\n clear: clearSubcommand,\n },\n});\n","import { readFile, writeFile, readdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\nimport YAML from \"yaml\";\nimport { ensureDir, pathExists } from \"./fs-utils.js\";\n\nexport interface Signal {\n type: \"ci_failure\" | \"pr_review_comment\" | \"production_error\" | \"manual\";\n source: string;\n timestamp: string;\n summary: string;\n details?: string;\n learning?: string;\n relevance_tags?: string[];\n affected_files?: string[];\n}\n\nconst SIGNAL_DIR = \".sniper/memory/signals\";\n\nexport function getSignalDir(cwd: string): string {\n return join(cwd, SIGNAL_DIR);\n}\n\nfunction signalFilename(signal: Signal): string {\n const date = new Date(signal.timestamp);\n const dateStr = date.toISOString().slice(0, 10).replace(/-/g, \"\");\n const ts = Math.floor(date.getTime() / 1000);\n return `${dateStr}-${signal.type}-${ts}.yaml`;\n}\n\nexport async function ingestSignal(\n cwd: string,\n signal: Signal,\n): Promise<string> {\n const dir = getSignalDir(cwd);\n await ensureDir(dir);\n\n const filename = signalFilename(signal);\n const filepath = join(dir, filename);\n const content = YAML.stringify(signal, { lineWidth: 0 });\n await writeFile(filepath, content, \"utf-8\");\n\n return filename;\n}\n\nfunction assertGhAvailable(): void {\n try {\n execFileSync(\"gh\", [\"--version\"], { stdio: \"pipe\" });\n } catch {\n throw new Error(\n 'GitHub CLI (gh) is not installed or not on PATH. Install it from https://cli.github.com/',\n );\n }\n}\n\nexport async function ingestFromPR(\n cwd: string,\n prNumber: number,\n): Promise<Signal[]> {\n assertGhAvailable();\n\n const raw = execFileSync(\"gh\", [\n \"pr\",\n \"view\",\n prNumber.toString(),\n \"--json\",\n \"comments,reviews,title\",\n ], { cwd, encoding: \"utf-8\" });\n\n const prData = JSON.parse(raw) as {\n title: string;\n comments: Array<{ body: string; author: { login: string }; createdAt: string }>;\n reviews: Array<{ body: string; author: { login: string }; state: string; submittedAt: string }>;\n };\n\n const signals: Signal[] = [];\n\n for (const review of prData.reviews) {\n if (!review.body) continue;\n\n const signal: Signal = {\n type: \"pr_review_comment\",\n source: `pr-${prNumber}`,\n timestamp: review.submittedAt,\n summary: `PR #${prNumber} review (${review.state}) by ${review.author?.login ?? \"unknown\"}`,\n details: review.body,\n relevance_tags: [\"pr-review\", review.state.toLowerCase()],\n };\n const filename = await ingestSignal(cwd, signal);\n signals.push(signal);\n }\n\n for (const comment of prData.comments) {\n const signal: Signal = {\n type: \"pr_review_comment\",\n source: `pr-${prNumber}`,\n timestamp: comment.createdAt,\n summary: `PR #${prNumber} comment by ${comment.author?.login ?? \"unknown\"}`,\n details: comment.body,\n relevance_tags: [\"pr-comment\"],\n };\n await ingestSignal(cwd, signal);\n signals.push(signal);\n }\n\n return signals;\n}\n\nexport async function listSignals(\n cwd: string,\n options?: { type?: string; limit?: number },\n): Promise<Signal[]> {\n const dir = getSignalDir(cwd);\n\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const files = await readdir(dir);\n const yamlFiles = files.filter((f) => f.endsWith(\".yaml\"));\n\n const signals: Signal[] = [];\n for (const file of yamlFiles) {\n const raw = await readFile(join(dir, file), \"utf-8\");\n const signal = YAML.parse(raw) as Signal;\n signals.push(signal);\n }\n\n let filtered = signals;\n if (options?.type) {\n filtered = filtered.filter((s) => s.type === options.type);\n }\n\n filtered.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (options?.limit) {\n filtered = filtered.slice(0, options.limit);\n }\n\n return filtered;\n}\n\nexport async function getRelevantSignals(\n cwd: string,\n affectedFiles: string[],\n tags: string[],\n): Promise<Signal[]> {\n const all = await listSignals(cwd);\n\n const scored = all.map((signal) => {\n let score = 0;\n\n if (signal.affected_files) {\n for (const file of signal.affected_files) {\n if (affectedFiles.some((af) => af.includes(file) || file.includes(af))) {\n score += 2;\n }\n }\n }\n\n if (signal.relevance_tags) {\n for (const tag of signal.relevance_tags) {\n if (tags.includes(tag)) {\n score += 1;\n }\n }\n }\n\n return { signal, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 10)\n .map((s) => s.signal);\n}\n\nexport async function clearSignals(cwd: string): Promise<number> {\n const dir = getSignalDir(cwd);\n\n if (!(await pathExists(dir))) {\n return 0;\n }\n\n const files = await readdir(dir);\n const yamlFiles = files.filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\n\n for (const file of yamlFiles) {\n await rm(join(dir, file));\n }\n\n return yamlFiles.length;\n}\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport { join } from \"node:path\";\nimport { readFile } from \"node:fs/promises\";\nimport { sniperConfigExists } from \"../config.js\";\nimport { pathExists } from \"../fs-utils.js\";\n\nconst KNOWLEDGE_DIR = \".sniper/knowledge\";\nconst INDEX_FILENAME = \"knowledge-index.json\";\n\ninterface KnowledgeIndex {\n entries: Array<{\n id: string;\n topic: string;\n tokens: number;\n source_file: string;\n heading: string;\n }>;\n indexed_at: string;\n total_tokens: number;\n}\n\nconst indexSubcommand = defineCommand({\n meta: {\n name: \"index\",\n description: \"Index the SNIPER knowledge base\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const knowledgeDir = join(cwd, KNOWLEDGE_DIR);\n\n if (!(await pathExists(knowledgeDir))) {\n p.log.error(\n `Knowledge directory not found: ${KNOWLEDGE_DIR}\\nCreate it and add .md files to index.`,\n );\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Indexing knowledge base...\");\n\n try {\n // Dynamic import to avoid hard dependency on mcp-knowledge package\n const { indexKnowledgeDir, writeIndex } = await import(\n \"@sniper.ai/mcp-knowledge/indexer\"\n );\n const index = await indexKnowledgeDir(knowledgeDir);\n const indexPath = join(knowledgeDir, INDEX_FILENAME);\n await writeIndex(indexPath, index);\n\n s.stop(\"Done!\");\n p.log.success(`Indexed ${index.entries.length} entries`);\n p.log.info(`Total tokens: ${index.total_tokens.toLocaleString()}`);\n p.log.info(`Index written to: ${KNOWLEDGE_DIR}/${INDEX_FILENAME}`);\n } catch (err) {\n s.stop(\"Failed!\");\n p.log.error(`Indexing failed: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst statusSubcommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show knowledge base status\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n if (!(await sniperConfigExists(cwd))) {\n p.log.error('SNIPER is not initialized. Run \"sniper init\" first.');\n process.exit(1);\n }\n\n const indexPath = join(cwd, KNOWLEDGE_DIR, INDEX_FILENAME);\n\n if (!(await pathExists(indexPath))) {\n p.log.warn(\n 'Knowledge base has not been indexed yet. Run \"sniper knowledge index\" first.',\n );\n return;\n }\n\n try {\n const raw = await readFile(indexPath, \"utf-8\");\n const index: KnowledgeIndex = JSON.parse(raw);\n\n const topics = [...new Set(index.entries.map((e) => e.topic))];\n\n p.log.step(\"Knowledge Base Status:\");\n console.log(` Entries: ${index.entries.length}`);\n console.log(` Topics: ${topics.length}`);\n console.log(\n ` Total tokens: ${index.total_tokens.toLocaleString()}`,\n );\n console.log(` Last indexed: ${index.indexed_at}`);\n\n if (topics.length > 0) {\n p.log.step(\"Topics:\");\n for (const topic of topics.slice(0, 20)) {\n const count = index.entries.filter((e) => e.topic === topic).length;\n console.log(` - ${topic} (${count} entries)`);\n }\n if (topics.length > 20) {\n console.log(` ... and ${topics.length - 20} more`);\n }\n }\n } catch (err) {\n p.log.error(`Failed to read index: ${err}`);\n process.exit(1);\n }\n },\n});\n\nexport const knowledgeCommand = defineCommand({\n meta: {\n name: \"knowledge\",\n description: \"Manage SNIPER knowledge base\",\n },\n subCommands: {\n index: indexSubcommand,\n status: statusSubcommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport {\n createLock,\n releaseLock,\n readLocks,\n checkConflicts,\n} from \"../conflict-detector.js\";\nimport { findWorkspaceRoot } from \"../workspace-manager.js\";\nimport { execFileSync } from \"node:child_process\";\nimport { basename } from \"node:path\";\n\nconst WORKSPACE_ERROR =\n \"No workspace found. Sphere 7 requires a workspace. Run `sniper workspace init` first.\";\n\nconst statusSubcommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show active file locks and dependency graph summary\",\n },\n run: async () => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error(WORKSPACE_ERROR);\n process.exit(1);\n }\n\n p.intro(\"Sphere 7 — Workspace Status\");\n\n // Active locks\n const locks = await readLocks(wsRoot);\n\n p.log.step(`Active locks: ${locks.length}`);\n if (locks.length === 0) {\n console.log(\" (none)\");\n } else {\n for (const lock of locks) {\n const age = timeSince(lock.since);\n const reason = lock.reason ? ` — ${lock.reason}` : \"\";\n console.log(\n ` ${lock.file} locked by ${lock.locked_by.project}/${lock.locked_by.agent} (${age})${reason}`,\n );\n }\n }\n\n p.outro(\"\");\n },\n});\n\nconst lockSubcommand = defineCommand({\n meta: {\n name: \"lock\",\n description: \"Acquire an advisory lock on a file\",\n },\n args: {\n file: {\n type: \"positional\",\n description: \"File path to lock\",\n required: true,\n },\n reason: {\n type: \"string\",\n description: \"Reason for acquiring the lock\",\n required: false,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error(WORKSPACE_ERROR);\n process.exit(1);\n }\n\n const project = basename(cwd);\n\n try {\n await createLock(\n wsRoot,\n args.file,\n project,\n \"cli\",\n \"manual\",\n args.reason,\n );\n p.log.success(`Locked: ${args.file}`);\n } catch (err) {\n p.log.error(`Failed to acquire lock: ${err}`);\n process.exit(1);\n }\n },\n});\n\nconst unlockSubcommand = defineCommand({\n meta: {\n name: \"unlock\",\n description: \"Release an advisory lock on a file\",\n },\n args: {\n file: {\n type: \"positional\",\n description: \"File path to unlock\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error(WORKSPACE_ERROR);\n process.exit(1);\n }\n\n const released = await releaseLock(wsRoot, args.file);\n\n if (released) {\n p.log.success(`Unlocked: ${args.file}`);\n } else {\n p.log.warning(`No lock found for: ${args.file}`);\n }\n },\n});\n\nconst conflictsSubcommand = defineCommand({\n meta: {\n name: \"conflicts\",\n description: \"Detect file lock conflicts with current changes\",\n },\n run: async () => {\n const cwd = process.cwd();\n const wsRoot = await findWorkspaceRoot(cwd);\n\n if (!wsRoot) {\n p.log.error(WORKSPACE_ERROR);\n process.exit(1);\n }\n\n p.intro(\"Sphere 7 — Conflict Detection\");\n\n // Get changed files from git\n let changedFiles: string[];\n try {\n const output = execFileSync(\"git\", [\"diff\", \"--name-only\"], {\n cwd,\n encoding: \"utf-8\",\n });\n changedFiles = output\n .split(\"\\n\")\n .map((f) => f.trim())\n .filter(Boolean);\n } catch {\n p.log.error(\"Failed to get changed files from git.\");\n process.exit(1);\n }\n\n if (changedFiles.length === 0) {\n p.log.info(\"No changed files detected.\");\n p.outro(\"\");\n return;\n }\n\n p.log.step(`Changed files: ${changedFiles.length}`);\n\n const project = basename(cwd);\n const conflicts = await checkConflicts(wsRoot, changedFiles, project);\n\n if (conflicts.length === 0) {\n p.log.success(\"No conflicts detected.\");\n } else {\n p.log.warning(`${conflicts.length} conflict(s) detected:`);\n for (const conflict of conflicts) {\n console.log(\n ` ${conflict.file} held by ${conflict.held_by.project}/${conflict.held_by.agent} (protocol: ${conflict.held_by.protocol})`,\n );\n }\n }\n\n p.outro(\"\");\n },\n});\n\nexport const sphereCommand = defineCommand({\n meta: {\n name: \"sphere\",\n description: \"Sphere 7 — Cross-human workspace coordination\",\n },\n subCommands: {\n status: statusSubcommand,\n lock: lockSubcommand,\n unlock: unlockSubcommand,\n conflicts: conflictsSubcommand,\n },\n});\n\n// ── Helpers ──\n\nfunction timeSince(isoDate: string): string {\n const ms = Date.now() - new Date(isoDate).getTime();\n const seconds = Math.floor(ms / 1000);\n\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n","import { readFile, writeFile, readdir, mkdir, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport YAML from \"yaml\";\nimport { pathExists } from \"./fs-utils.js\";\n\nconst WORKSPACE_DIR = \".sniper-workspace\";\nconst LOCKS_DIR = \"locks\";\nconst DEPENDENCY_GRAPH_FILE = \"dependency-graph.yaml\";\n\n// ── Interfaces ──\n\nexport interface FileLock {\n file: string;\n locked_by: {\n project: string;\n agent: string;\n protocol: string;\n };\n since: string;\n reason?: string;\n}\n\nexport interface Conflict {\n file: string;\n held_by: {\n project: string;\n agent: string;\n protocol: string;\n };\n requested_by: {\n project: string;\n agent: string;\n protocol: string;\n };\n}\n\nexport interface ApiDependency {\n api: string;\n file: string;\n from_project?: string;\n}\n\n// ── Helpers ──\n\nfunction encodeLockFilename(file: string): string {\n // Use percent-encoding for separators to avoid collisions (e.g. \"a/b\" vs \"a__b\")\n return file.replace(/%/g, \"%25\").replace(/\\//g, \"%2F\").replace(/\\\\/g, \"%5C\") + \".yaml\";\n}\n\nfunction locksDir(workspaceRoot: string): string {\n return join(workspaceRoot, WORKSPACE_DIR, LOCKS_DIR);\n}\n\n// ── Public API ──\n\n/**\n * Create an advisory lock for a file in the workspace.\n */\nexport async function createLock(\n workspaceRoot: string,\n file: string,\n project: string,\n agent: string,\n protocol: string,\n reason?: string,\n): Promise<void> {\n const dir = locksDir(workspaceRoot);\n await mkdir(dir, { recursive: true });\n\n const lock: FileLock = {\n file,\n locked_by: { project, agent, protocol },\n since: new Date().toISOString(),\n ...(reason ? { reason } : {}),\n };\n\n const lockPath = join(dir, encodeLockFilename(file));\n try {\n await writeFile(lockPath, YAML.stringify(lock, { lineWidth: 0 }), {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n } catch (err: unknown) {\n if (err && typeof err === \"object\" && \"code\" in err && (err as NodeJS.ErrnoException).code === \"EEXIST\") {\n throw new Error(\n `Lock already exists for \"${file}\". Another agent may be modifying this file.`,\n );\n }\n throw err;\n }\n}\n\n/**\n * Release an advisory lock for a file.\n * Returns true if the lock existed and was removed, false otherwise.\n */\nexport async function releaseLock(\n workspaceRoot: string,\n file: string,\n owner?: string,\n): Promise<boolean> {\n const lockPath = join(locksDir(workspaceRoot), encodeLockFilename(file));\n\n if (await pathExists(lockPath)) {\n if (owner) {\n const raw = await readFile(lockPath, \"utf-8\");\n const lock = YAML.parse(raw) as FileLock;\n if (lock?.locked_by?.agent !== owner && lock?.locked_by?.project !== owner) {\n throw new Error(\n `Cannot release lock for \"${file}\": owned by agent \"${lock?.locked_by?.agent}\" / project \"${lock?.locked_by?.project}\", not \"${owner}\"`,\n );\n }\n }\n await rm(lockPath);\n return true;\n }\n\n return false;\n}\n\n/**\n * Read all active file locks from the workspace.\n */\nexport async function readLocks(\n workspaceRoot: string,\n): Promise<FileLock[]> {\n const dir = locksDir(workspaceRoot);\n\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const files = await readdir(dir);\n const yamlFiles = files.filter(\n (f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"),\n );\n\n const locks: FileLock[] = [];\n for (const file of yamlFiles) {\n const raw = await readFile(join(dir, file), \"utf-8\");\n const data = YAML.parse(raw) as FileLock;\n if (data && data.file && data.locked_by) {\n locks.push(data);\n }\n }\n\n return locks;\n}\n\n/**\n * Check if any of the given files are locked by another project.\n */\nexport async function checkConflicts(\n workspaceRoot: string,\n filesToModify: string[],\n project: string,\n): Promise<Conflict[]> {\n const locks = await readLocks(workspaceRoot);\n const conflicts: Conflict[] = [];\n // Normalize paths to forward-slash for consistent comparison\n const normalizedFiles = filesToModify.map((f) => f.replace(/\\\\/g, \"/\"));\n\n for (const lock of locks) {\n const normalizedLockFile = lock.file.replace(/\\\\/g, \"/\");\n if (\n normalizedFiles.includes(normalizedLockFile) &&\n lock.locked_by.project !== project\n ) {\n conflicts.push({\n file: lock.file,\n held_by: lock.locked_by,\n requested_by: {\n project,\n agent: \"unknown\",\n protocol: \"unknown\",\n },\n });\n }\n }\n\n return conflicts;\n}\n\n/**\n * Detect if any changed files are exported APIs that other projects depend on.\n * Returns a list of project names that depend on the changed APIs.\n */\nexport async function detectApiChanges(\n workspaceRoot: string,\n changedFiles: string[],\n): Promise<string[]> {\n const graphPath = join(\n workspaceRoot,\n WORKSPACE_DIR,\n DEPENDENCY_GRAPH_FILE,\n );\n\n if (!(await pathExists(graphPath))) {\n return [];\n }\n\n const raw = await readFile(graphPath, \"utf-8\");\n const graph = YAML.parse(raw) as {\n projects: Array<{\n name: string;\n exports: Array<{ api: string; file: string }>;\n imports: Array<{ api: string; from_project: string }>;\n }>;\n };\n\n if (!graph?.projects) {\n return [];\n }\n\n // Build a map: exported file -> { project, api }\n const exportMap = new Map<string, { project: string; api: string }[]>();\n for (const proj of graph.projects) {\n for (const exp of proj.exports ?? []) {\n const existing = exportMap.get(exp.file) ?? [];\n existing.push({ project: proj.name, api: exp.api });\n exportMap.set(exp.file, existing);\n }\n }\n\n // Find which exports are affected by changed files\n const affectedApis: Array<{ project: string; api: string }> = [];\n for (const changed of changedFiles) {\n const exports = exportMap.get(changed);\n if (exports) {\n affectedApis.push(...exports);\n }\n }\n\n if (affectedApis.length === 0) {\n return [];\n }\n\n // Find projects that import these affected APIs\n const dependents = new Set<string>();\n for (const proj of graph.projects) {\n for (const imp of proj.imports ?? []) {\n for (const affected of affectedApis) {\n if (\n imp.api === affected.api &&\n imp.from_project === affected.project\n ) {\n dependents.add(proj.name);\n }\n }\n }\n }\n\n return [...dependents];\n}\n\n/**\n * Find projects that import from the given API file.\n */\nexport async function findDependents(\n workspaceRoot: string,\n apiFile: string,\n): Promise<string[]> {\n const graphPath = join(\n workspaceRoot,\n WORKSPACE_DIR,\n DEPENDENCY_GRAPH_FILE,\n );\n\n if (!(await pathExists(graphPath))) {\n return [];\n }\n\n const raw = await readFile(graphPath, \"utf-8\");\n const graph = YAML.parse(raw) as {\n projects: Array<{\n name: string;\n exports: Array<{ api: string; file: string }>;\n imports: Array<{ api: string; from_project: string }>;\n }>;\n };\n\n if (!graph?.projects) {\n return [];\n }\n\n // Find which project + api corresponds to the given file\n const matchedApis: Array<{ project: string; api: string }> = [];\n for (const proj of graph.projects) {\n for (const exp of proj.exports ?? []) {\n if (exp.file === apiFile) {\n matchedApis.push({ project: proj.name, api: exp.api });\n }\n }\n }\n\n if (matchedApis.length === 0) {\n return [];\n }\n\n // Find projects that import these APIs\n const dependents = new Set<string>();\n for (const proj of graph.projects) {\n for (const imp of proj.imports ?? []) {\n for (const match of matchedApis) {\n if (imp.api === match.api && imp.from_project === match.project) {\n dependents.add(proj.name);\n }\n }\n }\n }\n\n return [...dependents];\n}\n"],"mappings":"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","names":["createRequire","defineCommand","require","readFile","writeFile","access","join","YAML","p","access","readFile","join","log","YAML","writeFile","mkdir","access","ensureDir","join","log","defineCommand","p","readFile","join","YAML","defineCommand","join","readFile","YAML","defineCommand","p","writeFile","readFile","join","defineCommand","confirm","log","defineCommand","p","cp","readdir","readFile","access","mkdir","join","resolve","sep","YAML","resolve","sep","pathExists","p","access","join","readFile","YAML","mkdir","readdir","cp","config","defineCommand","defineCommand","p","readdir","readFile","writeFile","mkdir","access","join","YAML","defineCommand","join","access","readFile","YAML","mkdir","writeFile","listSubcommand","readdir","defineCommand","p","readFile","readdir","join","YAML","readdir","readFile","join","YAML","cp","defineCommand","defineCommand","p","readFile","writeFile","access","mkdir","join","resolve","dirname","YAML","pathExists","p","p","join","writeFile","YAML","pathExists","locksDir","mkdir","defineCommand","defineCommand","p","readFile","readdir","join","execFileSync","YAML","defineCommand","join","readdir","readFile","YAML","cp","execFileSync","defineCommand","p","readFile","join","YAML","join","readFile","YAML","defineCommand","defineCommand","p","readFile","join","version","defineCommand","installSubcommand","defineCommand","p","readFile","writeFile","readdir","rm","join","execFileSync","YAML","join","ensureDir","YAML","writeFile","execFileSync","readdir","readFile","readdir","rm","join","defineCommand","ensureDir","listSubcommand","confirm","defineCommand","p","join","readFile","defineCommand","join","statusSubcommand","readFile","defineCommand","p","readFile","writeFile","readdir","mkdir","rm","join","YAML","WORKSPACE_DIR","join","WORKSPACE_DIR","mkdir","writeFile","YAML","readFile","rm","readdir","execFileSync","basename","statusSubcommand","defineCommand","require","createRequire","defineCommand"]}
|