@sniper.ai/cli 1.0.0 → 2.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 +76 -2
- package/dist/index.js +957 -26
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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/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","../src/commands/memory.ts","../src/fs-utils.ts","../src/commands/workspace.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\";\nimport { memoryCommand } from \"./commands/memory.js\";\nimport { workspaceCommand } from \"./commands/workspace.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 memory: memoryCommand,\n workspace: workspaceCommand,\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 memory?: {\n enabled: boolean;\n auto_retro: boolean;\n auto_codify: boolean;\n token_budget: number;\n };\n workspace?: {\n enabled: boolean;\n workspace_path: string | null;\n repo_name: string | null;\n };\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, { status: string | null; version: number } | string | null>;\n retro_counter?: number;\n last_retro_sprint?: number;\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 // Create memory directory with starter files\n const memoryDir = join(sniperDir, \"memory\");\n await ensureDir(memoryDir);\n await ensureDir(join(memoryDir, \"retros\"));\n const memoryFiles: Record<string, string> = {\n \"conventions.yaml\": \"conventions: []\\n\",\n \"anti-patterns.yaml\": \"anti_patterns: []\\n\",\n \"decisions.yaml\": \"decisions: []\\n\",\n \"estimates.yaml\":\n \"calibration:\\n velocity_factor: 1.0\\n common_underestimates: []\\n last_updated: null\\n sprints_analyzed: 0\\n\",\n };\n for (const [filename, content] of Object.entries(memoryFiles)) {\n const filePath = join(memoryDir, filename);\n if (!isUpdate || !(await fileExists(filePath))) {\n await writeFile(filePath, content, \"utf-8\");\n }\n }\n log.push(\"Created memory/ directory\");\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","import { readFile, writeFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport YAML from \"yaml\";\nimport { readConfig, sniperConfigExists } from \"../config.js\";\nimport { ensureDir, pathExists } from \"../fs-utils.js\";\n\ninterface MemoryEntry {\n id: string;\n status?: string;\n [key: string]: unknown;\n}\n\nasync function readYamlArray(\n filePath: string,\n key: string,\n): Promise<MemoryEntry[]> {\n if (!(await pathExists(filePath))) return [];\n try {\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = YAML.parse(raw);\n return Array.isArray(parsed?.[key]) ? parsed[key] : [];\n } catch {\n return [];\n }\n}\n\nasync function writeYamlArray(\n filePath: string,\n key: string,\n entries: MemoryEntry[],\n): Promise<void> {\n const content = YAML.stringify({ [key]: entries }, { lineWidth: 0 });\n await writeFile(filePath, content, \"utf-8\");\n}\n\nfunction nextId(entries: MemoryEntry[], prefix: string): string {\n let max = 0;\n for (const entry of entries) {\n const match = entry.id?.match(new RegExp(`^${prefix}-(\\\\d+)$`));\n if (match) {\n const num = parseInt(match[1], 10);\n if (num > max) max = num;\n }\n }\n return `${prefix}-${String(max + 1).padStart(3, \"0\")}`;\n}\n\nexport const memoryCommand = defineCommand({\n meta: {\n name: \"memory\",\n description: \"Manage agent memory (conventions, anti-patterns, decisions)\",\n },\n args: {\n action: {\n type: \"positional\",\n description:\n \"Action to perform: list, add, remove, promote, export, import\",\n required: false,\n },\n type: {\n type: \"positional\",\n description:\n \"Memory type: convention, anti-pattern, decision (for add/remove/promote)\",\n required: false,\n },\n value: {\n type: \"positional\",\n description: \"Value for the action (rule text, ID, or file path)\",\n required: 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 in this directory. Run \"sniper init\" first.',\n );\n process.exit(1);\n }\n\n const memoryDir = join(cwd, \".sniper\", \"memory\");\n\n // Ensure memory directory exists\n if (!(await pathExists(memoryDir))) {\n await ensureDir(memoryDir);\n await ensureDir(join(memoryDir, \"retros\"));\n await writeFile(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions: []\\n\",\n \"utf-8\",\n );\n await writeFile(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns: []\\n\",\n \"utf-8\",\n );\n await writeFile(\n join(memoryDir, \"decisions.yaml\"),\n \"decisions: []\\n\",\n \"utf-8\",\n );\n await writeFile(\n join(memoryDir, \"estimates.yaml\"),\n \"calibration:\\n velocity_factor: 1.0\\n common_underestimates: []\\n last_updated: null\\n sprints_analyzed: 0\\n\",\n \"utf-8\",\n );\n p.log.info(\"Initialized .sniper/memory/ directory\");\n }\n\n const conventions = await readYamlArray(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions\",\n );\n const antiPatterns = await readYamlArray(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n );\n const decisions = await readYamlArray(\n join(memoryDir, \"decisions.yaml\"),\n \"decisions\",\n );\n\n // Count retros\n let retroCount = 0;\n const retrosDir = join(memoryDir, \"retros\");\n if (await pathExists(retrosDir)) {\n const files = await readdir(retrosDir);\n retroCount = files.filter((f) => f.endsWith(\".yaml\")).length;\n }\n\n const action = args.action as string | undefined;\n\n if (!action || action === \"list\") {\n // Show summary\n p.intro(\"SNIPER Memory\");\n\n const confirmedConv = conventions.filter(\n (c) => c.status !== \"candidate\",\n ).length;\n const candidateConv = conventions.filter(\n (c) => c.status === \"candidate\",\n ).length;\n const confirmedAp = antiPatterns.filter(\n (a) => a.status !== \"candidate\",\n ).length;\n const candidateAp = antiPatterns.filter(\n (a) => a.status === \"candidate\",\n ).length;\n const activeDecisions = decisions.filter(\n (d) => d.status === \"active\" || !d.status,\n ).length;\n const supersededDecisions = decisions.filter(\n (d) => d.status === \"superseded\",\n ).length;\n\n p.log.info(\n `Conventions: ${confirmedConv} confirmed, ${candidateConv} candidates`,\n );\n p.log.info(\n `Anti-Patterns: ${confirmedAp} confirmed, ${candidateAp} candidates`,\n );\n p.log.info(\n `Decisions: ${activeDecisions} active, ${supersededDecisions} superseded`,\n );\n p.log.info(`Retrospectives: ${retroCount}`);\n\n // Show workspace memory if configured\n const config = await readConfig(cwd);\n if (config.workspace?.enabled && config.workspace.workspace_path) {\n const wsMemory = join(\n cwd,\n config.workspace.workspace_path,\n \"memory\",\n );\n if (await pathExists(wsMemory)) {\n const wsConv = await readYamlArray(\n join(wsMemory, \"conventions.yaml\"),\n \"conventions\",\n );\n const wsAp = await readYamlArray(\n join(wsMemory, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n );\n const wsDec = await readYamlArray(\n join(wsMemory, \"decisions.yaml\"),\n \"decisions\",\n );\n p.log.step(\"Workspace Memory:\");\n p.log.info(` Conventions: ${wsConv.length}`);\n p.log.info(` Anti-Patterns: ${wsAp.length}`);\n p.log.info(` Decisions: ${wsDec.length}`);\n }\n }\n\n p.outro(\"\");\n return;\n }\n\n if (action === \"add\") {\n const type = args.type as string | undefined;\n const value = args.value as string | undefined;\n\n if (!type || !value) {\n p.log.error(\n 'Usage: sniper memory add <convention|anti-pattern|decision> \"<text>\"',\n );\n process.exit(1);\n }\n\n const today = new Date().toISOString().split(\"T\")[0];\n\n if (type === \"convention\") {\n const id = nextId(conventions, \"conv\");\n conventions.push({\n id,\n rule: value,\n rationale: \"\",\n source: { type: \"manual\", ref: \"user-added\", date: today },\n applies_to: [],\n enforcement: \"both\",\n scope: \"project\",\n status: \"confirmed\",\n examples: { positive: \"\", negative: \"\" },\n });\n await writeYamlArray(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions\",\n conventions,\n );\n p.log.success(`Added convention ${id}: ${value}`);\n } else if (type === \"anti-pattern\") {\n const id = nextId(antiPatterns, \"ap\");\n antiPatterns.push({\n id,\n description: value,\n why_bad: \"\",\n fix_pattern: \"\",\n source: { type: \"manual\", ref: \"user-added\", date: today },\n detection_hint: \"\",\n applies_to: [],\n severity: \"medium\",\n status: \"confirmed\",\n });\n await writeYamlArray(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n antiPatterns,\n );\n p.log.success(`Added anti-pattern ${id}: ${value}`);\n } else if (type === \"decision\") {\n const id = nextId(decisions, \"dec\");\n decisions.push({\n id,\n title: value,\n context: \"\",\n decision: value,\n alternatives_considered: [],\n source: { type: \"manual\", ref: \"user-added\", date: today },\n applies_to: [],\n status: \"active\",\n superseded_by: null,\n });\n await writeYamlArray(\n join(memoryDir, \"decisions.yaml\"),\n \"decisions\",\n decisions,\n );\n p.log.success(`Added decision ${id}: ${value}`);\n } else {\n p.log.error(\n `Unknown memory type \"${type}\". Use: convention, anti-pattern, decision`,\n );\n process.exit(1);\n }\n return;\n }\n\n if (action === \"remove\") {\n const id = args.type as string | undefined;\n if (!id) {\n p.log.error(\"Usage: sniper memory remove <id>\");\n process.exit(1);\n }\n\n let found = false;\n if (id.startsWith(\"conv-\")) {\n const idx = conventions.findIndex((c) => c.id === id);\n if (idx >= 0) {\n conventions.splice(idx, 1);\n await writeYamlArray(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions\",\n conventions,\n );\n found = true;\n }\n } else if (id.startsWith(\"ap-\")) {\n const idx = antiPatterns.findIndex((a) => a.id === id);\n if (idx >= 0) {\n antiPatterns.splice(idx, 1);\n await writeYamlArray(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n antiPatterns,\n );\n found = true;\n }\n } else if (id.startsWith(\"dec-\")) {\n const idx = decisions.findIndex((d) => d.id === id);\n if (idx >= 0) {\n decisions.splice(idx, 1);\n await writeYamlArray(\n join(memoryDir, \"decisions.yaml\"),\n \"decisions\",\n decisions,\n );\n found = true;\n }\n }\n\n if (found) {\n p.log.success(`Removed ${id}`);\n } else {\n p.log.error(`Entry ${id} not found in memory.`);\n process.exit(1);\n }\n return;\n }\n\n if (action === \"promote\") {\n const id = args.type as string | undefined;\n if (!id) {\n p.log.error(\"Usage: sniper memory promote <id>\");\n process.exit(1);\n }\n\n let found = false;\n if (id.startsWith(\"conv-\")) {\n const entry = conventions.find((c) => c.id === id);\n if (entry && entry.status === \"candidate\") {\n entry.status = \"confirmed\";\n await writeYamlArray(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions\",\n conventions,\n );\n found = true;\n }\n } else if (id.startsWith(\"ap-\")) {\n const entry = antiPatterns.find((a) => a.id === id);\n if (entry && entry.status === \"candidate\") {\n entry.status = \"confirmed\";\n await writeYamlArray(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n antiPatterns,\n );\n found = true;\n }\n } else if (id.startsWith(\"dec-\")) {\n const entry = decisions.find((d) => d.id === id);\n if (entry && entry.status === \"candidate\") {\n entry.status = \"active\";\n await writeYamlArray(\n join(memoryDir, \"decisions.yaml\"),\n \"decisions\",\n decisions,\n );\n found = true;\n }\n }\n\n if (found) {\n p.log.success(`Promoted ${id} to confirmed/active`);\n } else {\n p.log.error(\n `Entry ${id} not found or is not a candidate.`,\n );\n process.exit(1);\n }\n return;\n }\n\n if (action === \"export\") {\n const exportData = {\n exported_from: (await readConfig(cwd)).project.name,\n exported_at: new Date().toISOString(),\n version: \"1.0\",\n conventions: conventions.map(({ id: _id, source: _src, ...rest }) => rest),\n anti_patterns: antiPatterns.map(\n ({ id: _id, source: _src, ...rest }) => rest,\n ),\n decisions: decisions.map(({ id: _id, source: _src, ...rest }) => rest),\n };\n const exportPath = join(cwd, \"sniper-memory-export.yaml\");\n await writeFile(\n exportPath,\n YAML.stringify(exportData, { lineWidth: 0 }),\n \"utf-8\",\n );\n p.log.success(\n `Exported ${conventions.length} conventions, ${antiPatterns.length} anti-patterns, ${decisions.length} decisions to sniper-memory-export.yaml`,\n );\n return;\n }\n\n if (action === \"import\") {\n const filePath = args.type as string | undefined;\n if (!filePath) {\n p.log.error(\"Usage: sniper memory import <file>\");\n process.exit(1);\n }\n\n const raw = await readFile(join(cwd, filePath), \"utf-8\");\n const imported = YAML.parse(raw);\n\n let addedConv = 0;\n let addedAp = 0;\n let skipped = 0;\n const today = new Date().toISOString().split(\"T\")[0];\n\n if (Array.isArray(imported.conventions)) {\n for (const conv of imported.conventions) {\n const exists = conventions.some(\n (c) => (c as { rule?: string }).rule === conv.rule,\n );\n if (exists) {\n skipped++;\n continue;\n }\n conventions.push({\n ...conv,\n id: nextId(conventions, \"conv\"),\n source: { type: \"imported\", ref: filePath, date: today },\n status: \"candidate\",\n });\n addedConv++;\n }\n await writeYamlArray(\n join(memoryDir, \"conventions.yaml\"),\n \"conventions\",\n conventions,\n );\n }\n\n if (Array.isArray(imported.anti_patterns)) {\n for (const ap of imported.anti_patterns) {\n const exists = antiPatterns.some(\n (a) =>\n (a as { description?: string }).description === ap.description,\n );\n if (exists) {\n skipped++;\n continue;\n }\n antiPatterns.push({\n ...ap,\n id: nextId(antiPatterns, \"ap\"),\n source: { type: \"imported\", ref: filePath, date: today },\n status: \"candidate\",\n });\n addedAp++;\n }\n await writeYamlArray(\n join(memoryDir, \"anti-patterns.yaml\"),\n \"anti_patterns\",\n antiPatterns,\n );\n }\n\n p.log.success(\n `Imported ${addedConv} conventions, ${addedAp} anti-patterns (${skipped} skipped as duplicates)`,\n );\n return;\n }\n\n p.log.error(\n `Unknown action \"${action}\". Use: list, add, remove, promote, export, import`,\n );\n process.exit(1);\n },\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 {\n readFile,\n writeFile,\n readdir,\n stat,\n symlink,\n} from \"node:fs/promises\";\nimport { join, relative, resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport * as p from \"@clack/prompts\";\nimport YAML from \"yaml\";\nimport { sniperConfigExists, readConfig, writeConfig } from \"../config.js\";\nimport { ensureDir, pathExists } from \"../fs-utils.js\";\n\ninterface WorkspaceRepo {\n name: string;\n path: string;\n role: string;\n language: string;\n sniper_enabled: boolean;\n exposes: Array<{ type: string; spec?: string; package?: string }>;\n consumes: Array<{ from: string; type: string; package?: string }>;\n}\n\ninterface WorkspaceConfig {\n name: string;\n description: string;\n version: string;\n repositories: WorkspaceRepo[];\n dependency_graph: Record<string, string[]>;\n config: {\n contract_format: string;\n integration_validation: boolean;\n shared_domain_packs: string[];\n memory: {\n workspace_conventions: boolean;\n auto_promote: boolean;\n };\n };\n state: {\n feature_counter: number;\n features: Array<{\n id: string;\n title: string;\n phase: string;\n sprint_wave?: number;\n repos_affected: string[];\n created_at: string;\n completed_at?: string;\n }>;\n };\n}\n\nconst initSubCommand = defineCommand({\n meta: {\n name: \"init\",\n description: \"Initialize a SNIPER workspace\",\n },\n run: async () => {\n const cwd = process.cwd();\n\n // Check if workspace already exists\n if (await pathExists(join(cwd, \"workspace.yaml\"))) {\n const raw = await readFile(join(cwd, \"workspace.yaml\"), \"utf-8\");\n const ws = YAML.parse(raw) as WorkspaceConfig;\n p.log.warn(\n `A workspace already exists: ${ws.name} (${ws.repositories.length} repos)`,\n );\n p.log.info(\"Use /sniper-workspace status to view details.\");\n process.exit(0);\n }\n\n p.intro(\"Initialize SNIPER Workspace\");\n\n // Gather workspace info\n const name = await p.text({\n message: \"Workspace name:\",\n placeholder: \"my-saas-platform\",\n });\n if (p.isCancel(name)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n const description = await p.text({\n message: \"Description:\",\n placeholder: \"Multi-service SaaS platform\",\n });\n if (p.isCancel(description)) {\n p.cancel(\"Aborted.\");\n process.exit(0);\n }\n\n // Scan for SNIPER-enabled repos\n const s = p.spinner();\n s.start(\"Scanning for SNIPER-enabled repositories...\");\n\n const parentDir = resolve(cwd, \"..\");\n const repos: WorkspaceRepo[] = [];\n\n try {\n const siblings = await readdir(parentDir);\n for (const entry of siblings) {\n const entryPath = join(parentDir, entry);\n const entryStat = await stat(entryPath);\n if (!entryStat.isDirectory()) continue;\n if (resolve(entryPath) === resolve(cwd)) continue;\n\n const configPath = join(entryPath, \".sniper\", \"config.yaml\");\n if (await pathExists(configPath)) {\n try {\n const raw = await readFile(configPath, \"utf-8\");\n const config = YAML.parse(raw);\n repos.push({\n name: config.project?.name || entry,\n path: relative(cwd, entryPath),\n role: inferRole(config.project?.type),\n language: config.stack?.language || \"unknown\",\n sniper_enabled: true,\n exposes: [],\n consumes: [],\n });\n } catch {\n // Skip malformed configs\n }\n }\n }\n } catch {\n // Parent directory not readable\n }\n\n s.stop(`Found ${repos.length} SNIPER-enabled repositories`);\n\n if (repos.length === 0) {\n p.log.warn(\n \"No SNIPER-enabled repositories found in sibling directories.\",\n );\n p.log.info(\n 'Initialize SNIPER in your repos first with \"sniper init\", or add repos manually later.',\n );\n } else {\n for (const repo of repos) {\n p.log.info(` ${repo.name} (${repo.role}, ${repo.language}) ${repo.path}`);\n }\n }\n\n // Build dependency graph (empty by default — user configures)\n const depGraph: Record<string, string[]> = {};\n for (const repo of repos) {\n depGraph[repo.name] = [];\n }\n\n // Generate workspace.yaml\n const workspace: WorkspaceConfig = {\n name: name as string,\n description: description as string,\n version: \"1.0\",\n repositories: repos,\n dependency_graph: depGraph,\n config: {\n contract_format: \"yaml\",\n integration_validation: true,\n shared_domain_packs: [],\n memory: {\n workspace_conventions: true,\n auto_promote: false,\n },\n },\n state: {\n feature_counter: 1,\n features: [],\n },\n };\n\n await writeFile(\n join(cwd, \"workspace.yaml\"),\n YAML.stringify(workspace, { lineWidth: 0 }),\n \"utf-8\",\n );\n\n // Create workspace directories\n await ensureDir(join(cwd, \"memory\"));\n await writeFile(\n join(cwd, \"memory\", \"conventions.yaml\"),\n \"conventions: []\\n\",\n \"utf-8\",\n );\n await writeFile(\n join(cwd, \"memory\", \"anti-patterns.yaml\"),\n \"anti_patterns: []\\n\",\n \"utf-8\",\n );\n await writeFile(\n join(cwd, \"memory\", \"decisions.yaml\"),\n \"decisions: []\\n\",\n \"utf-8\",\n );\n await ensureDir(join(cwd, \"contracts\"));\n await writeFile(join(cwd, \"contracts\", \".gitkeep\"), \"\", \"utf-8\");\n await ensureDir(join(cwd, \"features\"));\n await writeFile(join(cwd, \"features\", \".gitkeep\"), \"\", \"utf-8\");\n\n // Create symlinks\n if (repos.length > 0) {\n await ensureDir(join(cwd, \"repositories\"));\n for (const repo of repos) {\n const linkPath = join(cwd, \"repositories\", repo.name);\n const targetPath = resolve(cwd, repo.path);\n if (!(await pathExists(linkPath))) {\n try {\n await symlink(targetPath, linkPath);\n } catch {\n // Symlink creation may fail on some systems\n }\n }\n }\n }\n\n // Update per-repo configs\n for (const repo of repos) {\n const repoDir = resolve(cwd, repo.path);\n try {\n const config = await readConfig(repoDir);\n config.workspace = {\n enabled: true,\n workspace_path: relative(repoDir, cwd),\n repo_name: repo.name,\n };\n await writeConfig(repoDir, config);\n } catch {\n p.log.warn(`Could not update config for ${repo.name}`);\n }\n }\n\n p.log.success(\"Workspace initialized!\");\n p.log.info(` Location: ${cwd}`);\n p.log.info(` Repos: ${repos.length}`);\n p.log.info(\"\");\n p.log.info(\"Next steps:\");\n p.log.info(\n ' /sniper-workspace feature \"description\" — Plan a cross-repo feature',\n );\n p.log.info(\n \" /sniper-workspace status — View workspace status\",\n );\n\n p.outro(\"\");\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 wsPath = join(cwd, \"workspace.yaml\");\n\n if (!(await pathExists(wsPath))) {\n p.log.error(\n \"No workspace found. Run /sniper-workspace init to create one.\",\n );\n process.exit(1);\n }\n\n const raw = await readFile(wsPath, \"utf-8\");\n const ws = YAML.parse(raw) as WorkspaceConfig;\n\n p.intro(`Workspace: ${ws.name}`);\n p.log.info(ws.description);\n\n // Repositories\n p.log.step(\"Repositories:\");\n for (const repo of ws.repositories) {\n const repoPath = resolve(cwd, repo.path);\n const accessible = await pathExists(repoPath);\n const icon = accessible ? \"\\u2713\" : \"\\u2717\";\n p.log.info(\n ` ${icon} ${repo.name.padEnd(20)} ${repo.role.padEnd(12)} ${repo.language}`,\n );\n }\n\n // Active features\n const activeFeatures = ws.state.features.filter(\n (f) => f.phase !== \"complete\",\n );\n if (activeFeatures.length > 0) {\n p.log.step(\"Active Features:\");\n for (const f of activeFeatures) {\n p.log.info(\n ` ${f.id} \"${f.title}\" Phase: ${f.phase}${f.sprint_wave ? ` Wave: ${f.sprint_wave}` : \"\"}`,\n );\n }\n } else {\n p.log.step(\"No active workspace features.\");\n }\n\n // Contracts\n const contractsDir = join(cwd, \"contracts\");\n if (await pathExists(contractsDir)) {\n const files = (await readdir(contractsDir)).filter((f) =>\n f.endsWith(\".contract.yaml\"),\n );\n if (files.length > 0) {\n p.log.step(\"Contracts:\");\n for (const file of files) {\n try {\n const cRaw = await readFile(join(contractsDir, file), \"utf-8\");\n const contract = YAML.parse(cRaw);\n const name = contract.contract?.name || file;\n const version = contract.contract?.version || \"?\";\n const between = contract.contract?.between?.join(\" \\u2194 \") || \"?\";\n p.log.info(` ${name} v${version} ${between}`);\n } catch {\n p.log.info(` ${file} (parse error)`);\n }\n }\n } else {\n p.log.step(\"No contracts defined.\");\n }\n }\n\n // Workspace memory\n const memDir = join(cwd, \"memory\");\n if (await pathExists(memDir)) {\n const convFile = join(memDir, \"conventions.yaml\");\n const apFile = join(memDir, \"anti-patterns.yaml\");\n const decFile = join(memDir, \"decisions.yaml\");\n\n let convCount = 0;\n let apCount = 0;\n let decCount = 0;\n\n if (await pathExists(convFile)) {\n try {\n const parsed = YAML.parse(await readFile(convFile, \"utf-8\"));\n convCount = Array.isArray(parsed?.conventions)\n ? parsed.conventions.length\n : 0;\n } catch {\n /* empty */\n }\n }\n if (await pathExists(apFile)) {\n try {\n const parsed = YAML.parse(await readFile(apFile, \"utf-8\"));\n apCount = Array.isArray(parsed?.anti_patterns)\n ? parsed.anti_patterns.length\n : 0;\n } catch {\n /* empty */\n }\n }\n if (await pathExists(decFile)) {\n try {\n const parsed = YAML.parse(await readFile(decFile, \"utf-8\"));\n decCount = Array.isArray(parsed?.decisions)\n ? parsed.decisions.length\n : 0;\n } catch {\n /* empty */\n }\n }\n\n p.log.step(\"Workspace Memory:\");\n p.log.info(` Conventions: ${convCount}`);\n p.log.info(` Anti-Patterns: ${apCount}`);\n p.log.info(` Decisions: ${decCount}`);\n }\n\n p.outro(\"\");\n },\n});\n\nconst addRepoSubCommand = defineCommand({\n meta: {\n name: \"add-repo\",\n description: \"Add a repository to the workspace\",\n },\n args: {\n path: {\n type: \"positional\",\n description: \"Path to the repository\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n const wsPath = join(cwd, \"workspace.yaml\");\n\n if (!(await pathExists(wsPath))) {\n p.log.error(\"No workspace found. Run /sniper-workspace init first.\");\n process.exit(1);\n }\n\n const repoPath = resolve(cwd, args.path as string);\n\n if (!(await sniperConfigExists(repoPath))) {\n p.log.error(\n `${repoPath} is not a SNIPER-enabled project. Run \"sniper init\" in that directory first.`,\n );\n process.exit(1);\n }\n\n const repoConfig = await readConfig(repoPath);\n const raw = await readFile(wsPath, \"utf-8\");\n const ws = YAML.parse(raw) as WorkspaceConfig;\n\n const repoName = repoConfig.project.name;\n\n if (ws.repositories.some((r) => r.name === repoName)) {\n p.log.warn(`Repository \"${repoName}\" is already in the workspace.`);\n process.exit(0);\n }\n\n ws.repositories.push({\n name: repoName,\n path: relative(cwd, repoPath),\n role: inferRole(repoConfig.project.type),\n language: repoConfig.stack.language,\n sniper_enabled: true,\n exposes: [],\n consumes: [],\n });\n ws.dependency_graph[repoName] = [];\n\n await writeFile(wsPath, YAML.stringify(ws, { lineWidth: 0 }), \"utf-8\");\n\n // Update repo config\n repoConfig.workspace = {\n enabled: true,\n workspace_path: relative(repoPath, cwd),\n repo_name: repoName,\n };\n await writeConfig(repoPath, repoConfig);\n\n p.log.success(\n `Added ${repoName} (${repoConfig.project.type}, ${repoConfig.stack.language})`,\n );\n },\n});\n\nconst removeRepoSubCommand = defineCommand({\n meta: {\n name: \"remove-repo\",\n description: \"Remove a repository from the workspace\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Repository name\",\n required: true,\n },\n },\n run: async ({ args }) => {\n const cwd = process.cwd();\n const wsPath = join(cwd, \"workspace.yaml\");\n\n if (!(await pathExists(wsPath))) {\n p.log.error(\"No workspace found.\");\n process.exit(1);\n }\n\n const raw = await readFile(wsPath, \"utf-8\");\n const ws = YAML.parse(raw) as WorkspaceConfig;\n const repoName = args.name as string;\n\n const idx = ws.repositories.findIndex((r) => r.name === repoName);\n if (idx < 0) {\n p.log.error(`Repository \"${repoName}\" not found in workspace.`);\n process.exit(1);\n }\n\n const repo = ws.repositories[idx];\n ws.repositories.splice(idx, 1);\n delete ws.dependency_graph[repoName];\n\n // Remove from other repos' dependencies\n for (const deps of Object.values(ws.dependency_graph)) {\n const depIdx = deps.indexOf(repoName);\n if (depIdx >= 0) deps.splice(depIdx, 1);\n }\n\n await writeFile(wsPath, YAML.stringify(ws, { lineWidth: 0 }), \"utf-8\");\n\n // Update repo config\n const repoPath = resolve(cwd, repo.path);\n try {\n const repoConfig = await readConfig(repoPath);\n repoConfig.workspace = {\n enabled: false,\n workspace_path: null,\n repo_name: null,\n };\n await writeConfig(repoPath, repoConfig);\n } catch {\n // Repo may not be accessible\n }\n\n p.log.success(`Removed ${repoName} from workspace.`);\n },\n});\n\nconst validateSubCommand = defineCommand({\n meta: {\n name: \"validate\",\n description: \"Validate interface contracts against implementations\",\n },\n run: async () => {\n const cwd = process.cwd();\n const wsPath = join(cwd, \"workspace.yaml\");\n\n if (!(await pathExists(wsPath))) {\n p.log.error(\"No workspace found.\");\n process.exit(1);\n }\n\n const contractsDir = join(cwd, \"contracts\");\n if (!(await pathExists(contractsDir))) {\n p.log.error(\"No contracts/ directory found.\");\n process.exit(1);\n }\n\n const files = (await readdir(contractsDir)).filter((f) =>\n f.endsWith(\".contract.yaml\"),\n );\n\n if (files.length === 0) {\n p.log.info(\"No contracts found. Create them with /sniper-workspace feature.\");\n process.exit(0);\n }\n\n p.intro(\"Contract Validation\");\n\n for (const file of files) {\n try {\n const raw = await readFile(join(contractsDir, file), \"utf-8\");\n const contract = YAML.parse(raw);\n const name = contract.contract?.name || file;\n const version = contract.contract?.version || \"?\";\n const endpoints = contract.endpoints?.length || 0;\n const types = contract.shared_types?.length || 0;\n const events = contract.events?.length || 0;\n\n p.log.info(\n `${name} v${version}: ${endpoints} endpoints, ${types} types, ${events} events`,\n );\n p.log.info(\n \" (Structural validation requires running /sniper-workspace validate as a slash command)\",\n );\n } catch {\n p.log.warn(` ${file}: parse error`);\n }\n }\n\n p.log.info(\n \"\\nFull validation (endpoint/type/event checking) runs via the /sniper-workspace validate slash command.\",\n );\n p.outro(\"\");\n },\n});\n\nfunction inferRole(projectType: string | undefined): string {\n switch (projectType) {\n case \"saas\":\n case \"web\":\n case \"mobile\":\n return \"frontend\";\n case \"api\":\n return \"backend\";\n case \"library\":\n return \"library\";\n case \"cli\":\n case \"monorepo\":\n return \"service\";\n default:\n return \"service\";\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 status: statusSubCommand,\n \"add-repo\": addRepoSubCommand,\n \"remove-repo\": removeRepoSubCommand,\n validate: validateSubCommand,\n },\n});\n"],"mappings":"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","names":["createRequire","defineCommand","require","readFile","writeFile","access","join","YAML","p","access","join","log","writeFile","YAML","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","readFile","writeFile","readdir","join","defineCommand","p","YAML","mkdir","access","ensureDir","pathExists","pathExists","readFile","YAML","writeFile","defineCommand","join","ensureDir","readdir","readFile","writeFile","readdir","stat","join","resolve","defineCommand","p","YAML","defineCommand","pathExists","join","readFile","YAML","resolve","readdir","stat","writeFile","ensureDir","version","require","createRequire","defineCommand"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sniper.ai/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "SNIPER CLI — scaffold and manage SNIPER-enabled projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"citty": "^0.1.6",
|
|
15
15
|
"@clack/prompts": "^0.9.1",
|
|
16
16
|
"yaml": "^2.7.0",
|
|
17
|
-
"@sniper.ai/core": "
|
|
17
|
+
"@sniper.ai/core": "2.0.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "^22.0.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
|
-
"url": "https://github.com/
|
|
34
|
+
"url": "https://github.com/virkt25/sniper.git",
|
|
35
35
|
"directory": "packages/cli"
|
|
36
36
|
},
|
|
37
37
|
"engines": {
|