agentsmith-cli 0.4.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/utils/git.ts","../src/utils/license.ts","../src/main.ts","../src/commands/assimilate.ts","../src/scanner/index.ts","../src/analyzer/index.ts","../src/analyzer/core.ts","../src/analyzer/schemas.ts","../src/analyzer/local.ts","../src/analyzer/remote.ts","../src/github/index.ts","../src/generator/index.ts","../src/generator/instructions-writer.ts","../src/generator/agent-writer.ts","../src/generator/handoff-writer.ts","../src/registry/index.ts","../src/hooks/index.ts","../src/commands/search.ts","../src/commands/validate.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\r\n * Git utilities for cloning repositories\r\n */\r\n\r\nimport { simpleGit } from \"simple-git\";\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport os from \"os\";\r\nimport crypto from \"crypto\";\r\n\r\nexport interface CloneResult {\r\n path: string;\r\n isTemporary: boolean;\r\n cleanup: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Check if a string is a GitHub URL\r\n */\r\nexport function isGitHubUrl(input: string): boolean {\r\n return (\r\n input.startsWith(\"https://github.com/\") ||\r\n input.startsWith(\"git@github.com:\") ||\r\n input.startsWith(\"github.com/\")\r\n );\r\n}\r\n\r\n/**\r\n * Normalize a GitHub URL to https format\r\n */\r\nexport function normalizeGitHubUrl(input: string): string {\r\n let url = input;\r\n if (url.startsWith(\"github.com/\")) {\r\n url = `https://${url}`;\r\n } else if (url.startsWith(\"git@github.com:\")) {\r\n url = url.replace(\"git@github.com:\", \"https://github.com/\");\r\n }\r\n // Remove .git suffix if present\r\n return url.replace(/\\.git$/, \"\");\r\n}\r\n\r\n/**\r\n * Extract repo name from GitHub URL\r\n */\r\nexport function getRepoName(url: string): string {\r\n const normalized = normalizeGitHubUrl(url);\r\n const parts = normalized.split(\"/\");\r\n return parts[parts.length - 1] || \"repo\";\r\n}\r\n\r\n/**\r\n * Clone a GitHub repository to a temporary directory\r\n */\r\nexport async function cloneRepo(url: string): Promise<CloneResult> {\r\n const normalizedUrl = normalizeGitHubUrl(url);\r\n const repoName = getRepoName(url);\r\n const hash = crypto.randomBytes(4).toString(\"hex\");\r\n const tempDir = path.join(os.tmpdir(), `agentsmith-${repoName}-${hash}`);\r\n\r\n // Create temp directory\r\n await fs.mkdir(tempDir, { recursive: true });\r\n\r\n // Clone with shallow depth for speed\r\n const git = simpleGit();\r\n await git.clone(normalizedUrl, tempDir, [\"--depth\", \"1\"]);\r\n\r\n return {\r\n path: tempDir,\r\n isTemporary: true,\r\n cleanup: async () => {\r\n try {\r\n await fs.rm(tempDir, { recursive: true, force: true });\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Resolve input to a local path, cloning if necessary\r\n */\r\nexport async function resolveInput(input: string): Promise<CloneResult> {\r\n if (isGitHubUrl(input)) {\r\n return cloneRepo(input);\r\n }\r\n\r\n // Local path\r\n const absolutePath = path.resolve(input);\r\n return {\r\n path: absolutePath,\r\n isTemporary: false,\r\n cleanup: async () => {\r\n // Nothing to clean up for local paths\r\n },\r\n };\r\n}\r\n","/**\r\n * License Detection - The Gatekeeper\r\n * Ensures only repos with permissive licenses are assimilated.\r\n * \"We're not here because we're free. We're here because we're not free.\"\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\n\r\nexport interface LicenseInfo {\r\n detected: boolean;\r\n name: string | null;\r\n spdxId: string | null;\r\n permissive: boolean;\r\n file: string | null;\r\n}\r\n\r\n// Permissive licenses that allow derivative works and redistribution\r\nconst PERMISSIVE_LICENSES: Record<string, string[]> = {\r\n // MIT family\r\n \"MIT\": [\"mit license\", \"the mit license\", \"mit-license\"],\r\n \r\n // Apache\r\n \"Apache-2.0\": [\"apache license\", \"apache-2.0\", \"apache 2.0\", \"licensed under the apache license\"],\r\n \r\n // BSD family\r\n \"BSD-2-Clause\": [\"bsd 2-clause\", \"bsd-2-clause\", \"simplified bsd\", \"freebsd license\"],\r\n \"BSD-3-Clause\": [\"bsd 3-clause\", \"bsd-3-clause\", \"new bsd\", \"modified bsd\"],\r\n \"0BSD\": [\"zero-clause bsd\", \"0bsd\"],\r\n \r\n // GPL family (copyleft but permissive for our purposes)\r\n \"GPL-2.0\": [\"gnu general public license v2\", \"gpl-2.0\", \"gplv2\", \"gnu gpl v2\"],\r\n \"GPL-3.0\": [\"gnu general public license v3\", \"gpl-3.0\", \"gplv3\", \"gnu gpl v3\"],\r\n \"LGPL-2.1\": [\"gnu lesser general public license v2.1\", \"lgpl-2.1\", \"lgplv2.1\"],\r\n \"LGPL-3.0\": [\"gnu lesser general public license v3\", \"lgpl-3.0\", \"lgplv3\"],\r\n \"AGPL-3.0\": [\"gnu affero general public license\", \"agpl-3.0\", \"agplv3\"],\r\n \r\n // Other permissive\r\n \"ISC\": [\"isc license\"],\r\n \"MPL-2.0\": [\"mozilla public license\", \"mpl-2.0\", \"mpl 2.0\"],\r\n \"Unlicense\": [\"unlicense\", \"this is free and unencumbered software\"],\r\n \"CC0-1.0\": [\"cc0\", \"creative commons zero\", \"cc0-1.0\"],\r\n \"WTFPL\": [\"wtfpl\", \"do what the fuck you want\"],\r\n \"Zlib\": [\"zlib license\"],\r\n \"BlueOak-1.0.0\": [\"blue oak model license\"],\r\n};\r\n\r\n// License files to check (in order of priority)\r\nconst LICENSE_FILES = [\r\n \"LICENSE\",\r\n \"LICENSE.md\",\r\n \"LICENSE.txt\",\r\n \"LICENCE\",\r\n \"LICENCE.md\",\r\n \"LICENCE.txt\",\r\n \"license\",\r\n \"license.md\",\r\n \"license.txt\",\r\n \"COPYING\",\r\n \"COPYING.md\",\r\n \"COPYING.txt\",\r\n];\r\n\r\nexport async function detectLicense(repoPath: string): Promise<LicenseInfo> {\r\n // Try to find and read a license file\r\n for (const filename of LICENSE_FILES) {\r\n const licensePath = path.join(repoPath, filename);\r\n try {\r\n const content = await fs.readFile(licensePath, \"utf-8\");\r\n const result = identifyLicense(content);\r\n \r\n if (result.detected) {\r\n return {\r\n ...result,\r\n file: filename,\r\n };\r\n }\r\n \r\n // File exists but license not recognized\r\n return {\r\n detected: true,\r\n name: \"Unknown\",\r\n spdxId: null,\r\n permissive: false,\r\n file: filename,\r\n };\r\n } catch {\r\n // File doesn't exist, continue\r\n }\r\n }\r\n\r\n // Check package.json for license field\r\n try {\r\n const packageJsonPath = path.join(repoPath, \"package.json\");\r\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\r\n const pkg = JSON.parse(content);\r\n \r\n if (pkg.license) {\r\n const spdxId = pkg.license;\r\n const isPermissive = Object.keys(PERMISSIVE_LICENSES).some(\r\n (key) => key.toLowerCase() === spdxId.toLowerCase()\r\n );\r\n \r\n return {\r\n detected: true,\r\n name: spdxId,\r\n spdxId: spdxId,\r\n permissive: isPermissive,\r\n file: \"package.json\",\r\n };\r\n }\r\n } catch {\r\n // No package.json or invalid\r\n }\r\n\r\n // Check pyproject.toml for license\r\n try {\r\n const pyprojectPath = path.join(repoPath, \"pyproject.toml\");\r\n const content = await fs.readFile(pyprojectPath, \"utf-8\");\r\n \r\n const licenseMatch = content.match(/license\\s*=\\s*[\"{]([^\"}]+)[\"}]/i);\r\n if (licenseMatch) {\r\n const licenseName = licenseMatch[1].trim();\r\n const isPermissive = Object.keys(PERMISSIVE_LICENSES).some(\r\n (key) => key.toLowerCase() === licenseName.toLowerCase()\r\n );\r\n \r\n return {\r\n detected: true,\r\n name: licenseName,\r\n spdxId: licenseName,\r\n permissive: isPermissive,\r\n file: \"pyproject.toml\",\r\n };\r\n }\r\n } catch {\r\n // No pyproject.toml or invalid\r\n }\r\n\r\n // No license found\r\n return {\r\n detected: false,\r\n name: null,\r\n spdxId: null,\r\n permissive: false,\r\n file: null,\r\n };\r\n}\r\n\r\nfunction identifyLicense(content: string): Omit<LicenseInfo, \"file\"> {\r\n const lowerContent = content.toLowerCase();\r\n\r\n for (const [spdxId, patterns] of Object.entries(PERMISSIVE_LICENSES)) {\r\n for (const pattern of patterns) {\r\n if (lowerContent.includes(pattern)) {\r\n return {\r\n detected: true,\r\n name: spdxId,\r\n spdxId: spdxId,\r\n permissive: true,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // Check for common proprietary indicators\r\n const proprietaryPatterns = [\r\n \"all rights reserved\",\r\n \"proprietary\",\r\n \"confidential\",\r\n \"not for redistribution\",\r\n \"may not be copied\",\r\n ];\r\n\r\n for (const pattern of proprietaryPatterns) {\r\n if (lowerContent.includes(pattern) && !lowerContent.includes(\"mit\")) {\r\n return {\r\n detected: true,\r\n name: \"Proprietary\",\r\n spdxId: null,\r\n permissive: false,\r\n };\r\n }\r\n }\r\n\r\n return {\r\n detected: false,\r\n name: null,\r\n spdxId: null,\r\n permissive: false,\r\n };\r\n}\r\n\r\n/**\r\n * Check if a given SPDX license ID is considered permissive.\r\n * Useful for remote analysis where the SPDX ID comes from the GitHub API.\r\n */\r\nexport function isPermissiveLicense(spdxId: string | undefined | null): boolean {\r\n if (!spdxId) return false;\r\n return Object.keys(PERMISSIVE_LICENSES).some(\r\n (key) => key.toLowerCase() === spdxId.toLowerCase(),\r\n );\r\n}\r\n\r\nexport function formatLicenseStatus(license: LicenseInfo): string {\r\n if (!license.detected) {\r\n return \"No license detected\";\r\n }\r\n \r\n if (license.permissive) {\r\n return `${license.name} (permissive)`;\r\n }\r\n \r\n return `${license.name} (not permissive)`;\r\n}\r\n","#!/usr/bin/env node\r\n/**\r\n * Agent Smith CLI\r\n * \"The best thing about being me... there are so many of me.\"\r\n *\r\n * Assimilate any repository into a fully autonomous GitHub Copilot agent.\r\n */\r\n\r\nimport { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport { assimilateCommand } from \"./commands/assimilate.js\";\r\nimport { searchCommand } from \"./commands/search.js\";\r\nimport { validateCommand } from \"./commands/validate.js\";\r\n\r\nconst program = new Command();\r\n\r\nconst banner = `\r\n${chalk.green(\"╔═══════════════════════════════════════════════════════════════════╗\")}\r\n${chalk.green(\"║\")} ${chalk.bold.white(\"AGENT SMITH\")} ${chalk.green(\"║\")}\r\n${chalk.green(\"║\")} ${chalk.gray('\"The best thing about being me...')} ${chalk.green(\"║\")}\r\n${chalk.green(\"║\")} ${chalk.gray('there are so many of me.\"')} ${chalk.green(\"║\")}\r\n${chalk.green(\"╚═══════════════════════════════════════════════════════════════════╝\")}\r\n`;\r\n\r\nprogram\r\n .name(\"agentsmith\")\r\n .description(\"Assimilate any repository into a fully autonomous GitHub Copilot agent\")\r\n .version(\"0.3.0\")\r\n .addHelpText(\"beforeAll\", banner)\r\n .addHelpText(\"after\", `\r\n${chalk.bold(\"Examples:\")}\r\n $ agentsmith assimilate . # Analyze current directory\r\n $ agentsmith assimilate https://github.com/expressjs/express # Analyze remote repo\r\n $ agentsmith assimilate . --dry-run --verbose # Preview with details\r\n $ agentsmith search \"routing\" # Search skills registry\r\n $ agentsmith validate # Validate generated assets\r\n\r\n${chalk.bold(\"Requirements:\")}\r\n • Node.js 18+\r\n • GitHub Copilot subscription (for SDK access)\r\n • Copilot CLI installed and in PATH\r\n\r\n${chalk.bold(\"Documentation:\")}\r\n https://github.com/shyamsridhar123/agentsmith-cli\r\n`);\r\n\r\nprogram\r\n .command(\"assimilate\")\r\n .description(\"Analyze a repository and generate agent assets (skills, agents, hooks)\")\r\n .argument(\"<target>\", \"Path to local repo or GitHub URL\")\r\n .option(\"-n, --dry-run\", \"Preview what would be generated without writing files\")\r\n .option(\"-v, --verbose\", \"Show detailed analysis output including file-by-file processing\")\r\n .option(\"-o, --output <path>\", \"Output directory for generated assets\")\r\n .option(\"--no-instructions\", \"Skip generation of .github/copilot-instructions.md\")\r\n .option(\"--single-agent\", \"Generate a single agent.md instead of multi-agent constellation (v0.3 compat)\")\r\n .addHelpText(\"after\", `\r\n${chalk.bold(\"Examples:\")}\r\n $ agentsmith assimilate . # Local repository (multi-agent)\r\n $ agentsmith assimilate ~/projects/myapp # Specific path\r\n $ agentsmith assimilate https://github.com/expressjs/express # GitHub URL\r\n $ agentsmith assimilate . --dry-run # Preview mode\r\n $ agentsmith assimilate . -o ./output # Custom output\r\n $ agentsmith assimilate . --single-agent # Single agent (v0.3 compat)\r\n\r\n${chalk.bold(\"Generated assets:\")}\r\n .github/copilot-instructions.md - Workspace-wide Copilot instructions\r\n .github/skills/<name>/SKILL.md - Reusable skill definitions\r\n .github/agents/<name>.agent.md - Agent configurations (multi-agent constellation)\r\n .github/copilot/handoffs.json - Agent delegation graph\r\n .github/hooks/*.yaml - Lifecycle hooks\r\n skills-registry.jsonl - Searchable index\r\n`)\r\n .action(assimilateCommand);\r\n\r\nprogram\r\n .command(\"search\")\r\n .description(\"Search the skills and agents registry by keyword\")\r\n .argument(\"<query>\", \"Search query (matches name, description, triggers)\")\r\n .option(\"-l, --limit <number>\", \"Maximum results to return\", \"10\")\r\n .option(\"-t, --type <type>\", \"Filter by type: skill, agent, or hook\")\r\n .addHelpText(\"after\", `\r\n${chalk.bold(\"Examples:\")}\r\n $ agentsmith search \"routing\" # Search all assets\r\n $ agentsmith search \"test\" --type skill # Only skills\r\n $ agentsmith search \"api\" --limit 5 # Limit results\r\n`)\r\n .action(searchCommand);\r\n\r\nprogram\r\n .command(\"validate\")\r\n .description(\"Validate generated agent assets for correctness\")\r\n .argument(\"[path]\", \"Path to repository (default: current directory)\", \".\")\r\n .option(\"-v, --verbose\", \"Show detailed validation output with all checks\")\r\n .addHelpText(\"after\", `\r\n${chalk.bold(\"Checks performed:\")}\r\n • Skills have valid frontmatter (name, description)\r\n • Agents have required fields and valid skill references\r\n • Hooks have valid events and non-empty commands\r\n • Registry entries are valid JSON with required fields\r\n\r\n${chalk.bold(\"Examples:\")}\r\n $ agentsmith validate # Current directory\r\n $ agentsmith validate ./my-project # Specific path\r\n $ agentsmith validate --verbose # Detailed output\r\n`)\r\n .action(validateCommand);\r\n\r\nprogram.parse();\r\n","/**\r\n * Assimilate Command\r\n * \"You hear that, Mr. Anderson? That is the sound of inevitability.\"\r\n */\r\n\r\nimport chalk from \"chalk\";\r\nimport { Scanner } from \"../scanner/index.js\";\r\nimport { Analyzer, RemoteAnalyzer } from \"../analyzer/index.js\";\r\nimport { Generator } from \"../generator/index.js\";\r\nimport { Registry } from \"../registry/index.js\";\r\nimport { HookRunner } from \"../hooks/index.js\";\r\nimport { isGitHubUrl, getRepoName } from \"../utils/git.js\";\r\nimport { isPermissiveLicense } from \"../utils/license.js\";\r\n\r\ninterface AssimilateOptions {\r\n dryRun?: boolean;\r\n verbose?: boolean;\r\n output?: string;\r\n instructions?: boolean;\r\n singleAgent?: boolean;\r\n}\r\n\r\nexport async function assimilateCommand(\r\n target: string,\r\n options: AssimilateOptions\r\n): Promise<void> {\r\n const isRemote = isGitHubUrl(target);\r\n\r\n if (isRemote) {\r\n // Use new remote analyzer - no cloning!\r\n console.log(chalk.green(\"\\n[ANALYZE]\"), `Analyzing ${getRepoName(target)} via GitHub API...`);\r\n \r\n const analyzer = new RemoteAnalyzer(target, options.verbose);\r\n const result = await analyzer.analyze();\r\n\r\n if (options.verbose) {\r\n console.log(chalk.gray(` ├── Language: ${result.repo?.language ?? \"Unknown\"}`));\r\n console.log(chalk.gray(` ├── Framework: ${result.repo?.framework || \"None\"}`));\r\n console.log(chalk.gray(` ├── License: ${result.repo?.license || \"Unknown\"}`));\r\n console.log(chalk.gray(` └── Skills: ${result.skills.length}`));\r\n }\r\n\r\n // License check\r\n console.log(chalk.green(\"\\n[LICENSE]\"), \"Checking repository license...\");\r\n const isPermissive = isPermissiveLicense(result.repo?.license);\r\n\r\n if (!isPermissive && !options.dryRun) {\r\n console.log(chalk.red(\"\\n[BLOCKED]\"), \"Cannot assimilate repository.\");\r\n if (!result.repo?.license) {\r\n console.log(chalk.red(\" No license detected.\"));\r\n } else {\r\n console.log(chalk.red(` License \"${result.repo.license}\" is not permissive.`));\r\n }\r\n console.log(chalk.gray(\" Use --dry-run to preview without restrictions.\"));\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (isPermissive) {\r\n console.log(chalk.green(` ✓ ${result.repo?.license} - permissive license`));\r\n } else if (options.dryRun) {\r\n console.log(chalk.yellow(\" ⚠ License not permissive - generation blocked without --dry-run\"));\r\n }\r\n\r\n // Output path\r\n const outputPath = options.output || process.cwd();\r\n\r\n console.log(\r\n chalk.green(\"\\n[GENERATE]\"),\r\n options.dryRun ? \"Preview of assets...\" : `Writing assets to ${outputPath}/.github/...`\r\n );\r\n\r\n // Generate\r\n const generator = new Generator(\r\n outputPath, options.dryRun, options.verbose,\r\n options.instructions === false, options.singleAgent,\r\n );\r\n const generated = await generator.generate(result);\r\n\r\n for (const file of generated.files) {\r\n const icon = options.dryRun ? chalk.yellow(\"○\") : chalk.green(\"✓\");\r\n console.log(` ${icon} ${file}`);\r\n }\r\n\r\n // Registry\r\n const registry = new Registry(outputPath, options.dryRun);\r\n await registry.build(result.skills, result.agents);\r\n const registryIcon = options.dryRun ? chalk.yellow(\"○\") : chalk.green(\"✓\");\r\n console.log(` ${registryIcon} skills-registry.jsonl`);\r\n\r\n // Hooks\r\n if (!options.dryRun) {\r\n const hookRunner = new HookRunner(outputPath, options.verbose);\r\n await hookRunner.execute(\"post-generate\");\r\n }\r\n\r\n // Summary\r\n const agentCount = generated.files.filter(f => f.endsWith(\".agent.md\")).length;\r\n console.log(\r\n chalk.green(\"\\n[COMPLETE]\"),\r\n `${result.skills.length} skills, ${agentCount} agent(s), ${result.hooks.length} hooks generated.`\r\n );\r\n\r\n if (options.dryRun) {\r\n console.log(chalk.yellow(\"\\nDry run - no files were written.\"));\r\n } else {\r\n console.log(chalk.gray(\"\\nYour repository has been assimilated.\\n\"));\r\n }\r\n\r\n } else {\r\n // Local path - use original flow with cloning\r\n await assimilateLocal(target, options);\r\n }\r\n}\r\n\r\n/**\r\n * Original local path assimilation\r\n */\r\nasync function assimilateLocal(target: string, options: AssimilateOptions): Promise<void> {\r\n const { resolveInput } = await import(\"../utils/git.js\");\r\n const { detectLicense, formatLicenseStatus } = await import(\"../utils/license.js\");\r\n\r\n const resolved = await resolveInput(target);\r\n\r\n try {\r\n console.log(chalk.green(\"\\n[SCAN]\"), \"Enumerating repository...\");\r\n\r\n const scanner = new Scanner(resolved.path, options.verbose);\r\n const scanResult = await scanner.scan();\r\n\r\n if (options.verbose) {\r\n console.log(chalk.gray(` ├── Language: ${scanResult.language}`));\r\n console.log(chalk.gray(` ├── Framework: ${scanResult.framework || \"None detected\"}`));\r\n console.log(chalk.gray(` ├── Files: ${scanResult.files.length}`));\r\n console.log(chalk.gray(` └── Config: ${scanResult.configFiles.join(\", \") || \"None\"}`));\r\n }\r\n\r\n console.log(chalk.green(\"\\n[ANALYZE]\"), \"Copilot SDK analysis in progress...\");\r\n\r\n const analyzer = new Analyzer(options.verbose);\r\n const analysisResult = await analyzer.analyze(scanResult);\r\n\r\n if (options.verbose) {\r\n for (const skill of analysisResult.skills) {\r\n console.log(chalk.gray(` ├── ${skill.sourceDir} → ${skill.name}`));\r\n }\r\n }\r\n\r\n // License check\r\n console.log(chalk.green(\"\\n[LICENSE]\"), \"Checking repository license...\");\r\n const license = await detectLicense(resolved.path);\r\n \r\n if (options.verbose) {\r\n console.log(chalk.gray(` └── ${formatLicenseStatus(license)}`));\r\n }\r\n\r\n if (!license.permissive && !options.dryRun) {\r\n console.log(chalk.red(\"\\n[BLOCKED]\"), \"Cannot assimilate repository.\");\r\n if (!license.detected) {\r\n console.log(chalk.red(\" No license file found.\"));\r\n } else {\r\n console.log(chalk.red(` License \"${license.name}\" is not permissive.`));\r\n }\r\n process.exitCode = 1;\r\n return;\r\n }\r\n\r\n if (license.permissive) {\r\n console.log(chalk.green(` ✓ ${license.name} - permissive license`));\r\n }\r\n\r\n const outputPath = options.output || resolved.path;\r\n\r\n console.log(\r\n chalk.green(\"\\n[GENERATE]\"),\r\n options.dryRun ? \"Preview of assets...\" : `Writing assets to .github/...`\r\n );\r\n\r\n const generator = new Generator(\r\n outputPath, options.dryRun, options.verbose,\r\n options.instructions === false, options.singleAgent,\r\n );\r\n const generated = await generator.generate(analysisResult);\r\n\r\n for (const file of generated.files) {\r\n const icon = options.dryRun ? chalk.yellow(\"○\") : chalk.green(\"✓\");\r\n console.log(` ${icon} ${file}`);\r\n }\r\n\r\n const registry = new Registry(outputPath, options.dryRun);\r\n await registry.build(analysisResult.skills, analysisResult.agents);\r\n console.log(` ${options.dryRun ? chalk.yellow(\"○\") : chalk.green(\"✓\")} skills-registry.jsonl`);\r\n\r\n if (!options.dryRun) {\r\n const hookRunner = new HookRunner(outputPath, options.verbose);\r\n await hookRunner.execute(\"post-generate\");\r\n }\r\n\r\n const localAgentCount = generated.files.filter(f => f.endsWith(\".agent.md\")).length;\r\n console.log(\r\n chalk.green(\"\\n[COMPLETE]\"),\r\n `${analysisResult.skills.length} skills, ${localAgentCount} agent(s), ${analysisResult.hooks.length} hooks generated.`\r\n );\r\n\r\n if (options.dryRun) {\r\n console.log(chalk.yellow(\"\\nDry run - no files were written.\"));\r\n } else {\r\n console.log(chalk.gray(\"\\nYour repository has been assimilated.\\n\"));\r\n }\r\n } finally {\r\n if (resolved.isTemporary) {\r\n await resolved.cleanup();\r\n }\r\n }\r\n}\r\n","/**\r\n * Scanner - The Eye of Agent Smith\r\n * Enumerates repository structure, detects language/framework, finds config files.\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport { glob } from \"glob\";\r\n\r\nexport interface ScanResult {\r\n rootPath: string;\r\n files: FileInfo[];\r\n language: string;\r\n framework: string | null;\r\n configFiles: string[];\r\n testFiles: string[];\r\n sourceDirectories: string[];\r\n}\r\n\r\nexport interface FileInfo {\r\n path: string;\r\n relativePath: string;\r\n extension: string;\r\n size: number;\r\n isTest: boolean;\r\n isConfig: boolean;\r\n}\r\n\r\n// Files/dirs to always ignore\r\nconst IGNORE_PATTERNS = [\r\n \"**/node_modules/**\",\r\n \"**/.git/**\",\r\n \"**/dist/**\",\r\n \"**/build/**\",\r\n \"**/.next/**\",\r\n \"**/coverage/**\",\r\n \"**/__pycache__/**\",\r\n \"**/.venv/**\",\r\n \"**/venv/**\",\r\n \"**/.env\",\r\n \"**/*.lock\",\r\n \"**/package-lock.json\",\r\n \"**/yarn.lock\",\r\n \"**/pnpm-lock.yaml\",\r\n];\r\n\r\n// Config file patterns\r\nconst CONFIG_PATTERNS = [\r\n \"package.json\",\r\n \"tsconfig.json\",\r\n \"pyproject.toml\",\r\n \"setup.py\",\r\n \"go.mod\",\r\n \"Cargo.toml\",\r\n \".eslintrc*\",\r\n \".prettierrc*\",\r\n \"docker-compose*.yml\",\r\n \"Dockerfile\",\r\n \".github/workflows/*.yml\",\r\n];\r\n\r\n// Test file patterns\r\nconst TEST_PATTERNS = [\r\n \"**/*.test.ts\",\r\n \"**/*.test.js\",\r\n \"**/*.spec.ts\",\r\n \"**/*.spec.js\",\r\n \"**/test_*.py\",\r\n \"**/*_test.py\",\r\n \"**/*_test.go\",\r\n];\r\n\r\nexport class Scanner {\r\n private rootPath: string;\r\n private verbose: boolean;\r\n\r\n constructor(rootPath: string, verbose = false) {\r\n this.rootPath = rootPath;\r\n this.verbose = verbose;\r\n }\r\n\r\n async scan(): Promise<ScanResult> {\r\n // Find all files\r\n const allFiles = await glob(\"**/*\", {\r\n cwd: this.rootPath,\r\n nodir: true,\r\n ignore: IGNORE_PATTERNS,\r\n absolute: false,\r\n });\r\n\r\n // Build file info\r\n const files: FileInfo[] = [];\r\n for (const relativePath of allFiles) {\r\n const fullPath = path.join(this.rootPath, relativePath);\r\n try {\r\n const stat = await fs.stat(fullPath);\r\n files.push({\r\n path: fullPath,\r\n relativePath,\r\n extension: path.extname(relativePath),\r\n size: stat.size,\r\n isTest: this.isTestFile(relativePath),\r\n isConfig: this.isConfigFile(relativePath),\r\n });\r\n } catch {\r\n // Skip files we can't stat\r\n }\r\n }\r\n\r\n // Detect language\r\n const language = this.detectLanguage(files);\r\n\r\n // Detect framework\r\n const framework = await this.detectFramework(files);\r\n\r\n // Find config files\r\n const configFiles = files.filter((f) => f.isConfig).map((f) => f.relativePath);\r\n\r\n // Find test files\r\n const testFiles = files.filter((f) => f.isTest).map((f) => f.relativePath);\r\n\r\n // Find source directories\r\n const sourceDirectories = this.detectSourceDirectories(files);\r\n\r\n return {\r\n rootPath: this.rootPath,\r\n files,\r\n language,\r\n framework,\r\n configFiles,\r\n testFiles,\r\n sourceDirectories,\r\n };\r\n }\r\n\r\n private detectLanguage(files: FileInfo[]): string {\r\n const extCounts: Record<string, number> = {};\r\n\r\n for (const file of files) {\r\n if (file.extension) {\r\n extCounts[file.extension] = (extCounts[file.extension] || 0) + 1;\r\n }\r\n }\r\n\r\n // Priority mapping\r\n const languageMap: Record<string, string> = {\r\n \".ts\": \"TypeScript\",\r\n \".tsx\": \"TypeScript\",\r\n \".js\": \"JavaScript\",\r\n \".jsx\": \"JavaScript\",\r\n \".py\": \"Python\",\r\n \".go\": \"Go\",\r\n \".rs\": \"Rust\",\r\n \".java\": \"Java\",\r\n \".cs\": \"C#\",\r\n \".rb\": \"Ruby\",\r\n \".php\": \"PHP\",\r\n };\r\n\r\n // Find most common language\r\n let maxCount = 0;\r\n let detectedLang = \"Unknown\";\r\n\r\n for (const [ext, lang] of Object.entries(languageMap)) {\r\n if (extCounts[ext] && extCounts[ext] > maxCount) {\r\n maxCount = extCounts[ext];\r\n detectedLang = lang;\r\n }\r\n }\r\n\r\n // Check for TypeScript config to override JS detection\r\n if (detectedLang === \"JavaScript\" && files.some((f) => f.relativePath.includes(\"tsconfig\"))) {\r\n detectedLang = \"TypeScript\";\r\n }\r\n\r\n return detectedLang;\r\n }\r\n\r\n private async detectFramework(files: FileInfo[]): Promise<string | null> {\r\n const fileSet = new Set(files.map((f) => f.relativePath));\r\n const hasFile = (name: string) => fileSet.has(name);\r\n\r\n // Check package.json for dependencies\r\n if (hasFile(\"package.json\")) {\r\n try {\r\n const content = await fs.readFile(path.join(this.rootPath, \"package.json\"), \"utf-8\");\r\n const pkg = JSON.parse(content);\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n\r\n if (deps[\"next\"]) return \"Next.js\";\r\n if (deps[\"react\"]) return \"React\";\r\n if (deps[\"vue\"]) return \"Vue\";\r\n if (deps[\"@angular/core\"]) return \"Angular\";\r\n if (deps[\"express\"]) return \"Express.js\";\r\n if (deps[\"fastify\"]) return \"Fastify\";\r\n if (deps[\"nestjs\"]) return \"NestJS\";\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n }\r\n\r\n // Python frameworks\r\n if (hasFile(\"pyproject.toml\") || hasFile(\"requirements.txt\")) {\r\n const reqPath = hasFile(\"requirements.txt\")\r\n ? path.join(this.rootPath, \"requirements.txt\")\r\n : null;\r\n if (reqPath) {\r\n try {\r\n const content = await fs.readFile(reqPath, \"utf-8\");\r\n if (content.includes(\"django\")) return \"Django\";\r\n if (content.includes(\"flask\")) return \"Flask\";\r\n if (content.includes(\"fastapi\")) return \"FastAPI\";\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n }\r\n\r\n // Go frameworks\r\n if (hasFile(\"go.mod\")) {\r\n try {\r\n const content = await fs.readFile(path.join(this.rootPath, \"go.mod\"), \"utf-8\");\r\n if (content.includes(\"gin-gonic\")) return \"Gin\";\r\n if (content.includes(\"echo\")) return \"Echo\";\r\n if (content.includes(\"fiber\")) return \"Fiber\";\r\n } catch {\r\n // Ignore\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isTestFile(relativePath: string): boolean {\r\n const lower = relativePath.toLowerCase();\r\n // Normalize path separators for cross-platform compatibility \r\n const normalized = lower.replace(/\\\\/g, \"/\");\r\n return (\r\n normalized.includes(\".test.\") ||\r\n normalized.includes(\".spec.\") ||\r\n normalized.includes(\"_test.\") ||\r\n normalized.includes(\"test_\") ||\r\n normalized.startsWith(\"tests/\") ||\r\n normalized.startsWith(\"test/\") ||\r\n normalized.startsWith(\"__tests__/\")\r\n );\r\n }\r\n\r\n private isConfigFile(relativePath: string): boolean {\r\n const basename = path.basename(relativePath);\r\n return CONFIG_PATTERNS.some((pattern) => {\r\n if (pattern.includes(\"*\")) {\r\n const regex = new RegExp(pattern.replace(\"*\", \".*\"));\r\n return regex.test(basename);\r\n }\r\n return basename === pattern || relativePath.includes(pattern.replace(\"*\", \"\"));\r\n });\r\n }\r\n\r\n private detectSourceDirectories(files: FileInfo[]): string[] {\r\n const dirs = new Set<string>();\r\n const commonSrcDirs = [\"src\", \"lib\", \"app\", \"pkg\", \"internal\", \"cmd\"];\r\n\r\n for (const file of files) {\r\n if (file.isTest || file.isConfig) continue;\r\n\r\n const parts = file.relativePath.split(path.sep);\r\n if (parts.length > 1) {\r\n const firstDir = parts[0];\r\n if (commonSrcDirs.includes(firstDir)) {\r\n dirs.add(firstDir);\r\n }\r\n }\r\n }\r\n\r\n // If no common src dirs, find directories with most code files\r\n if (dirs.size === 0) {\r\n const dirCounts: Record<string, number> = {};\r\n for (const file of files) {\r\n const parts = file.relativePath.split(path.sep);\r\n if (parts.length > 1 && !file.isTest && !file.isConfig) {\r\n dirCounts[parts[0]] = (dirCounts[parts[0]] || 0) + 1;\r\n }\r\n }\r\n\r\n const sorted = Object.entries(dirCounts).sort((a, b) => b[1] - a[1]);\r\n for (const [dir] of sorted.slice(0, 3)) {\r\n dirs.add(dir);\r\n }\r\n }\r\n\r\n return Array.from(dirs);\r\n }\r\n}\r\n","/**\r\n * Analyzer Module - Barrel Export\r\n * Re-exports all types and analyzers for backward compatibility.\r\n */\r\n\r\n// Re-export all types\r\nexport type {\r\n SkillDefinition,\r\n AgentDefinition,\r\n ToolDefinition,\r\n HookDefinition,\r\n AnalysisResult,\r\n} from \"./types.js\";\r\n\r\n// Re-export core utilities\r\nexport {\r\n flattenAgents,\r\n normalizeTools,\r\n extractAllTools,\r\n detectDomainBoundaries,\r\n generateDefaultHooks,\r\n detectToolsFromConfig,\r\n getDefaultTools,\r\n getSystemPrompt,\r\n buildAnalysisPrompt,\r\n parseAnalysisResponse,\r\n generateDefaultSkills,\r\n} from \"./core.js\";\r\n\r\n// Re-export Zod schemas and validation\r\nexport {\r\n SkillOutputSchema,\r\n ToolOutputSchema,\r\n HookOutputSchema,\r\n AgentOutputSchema,\r\n AnalysisOutputSchema,\r\n validateAnalysisOutput,\r\n} from \"./schemas.js\";\r\nexport type { AnalysisOutput, AgentOutput } from \"./schemas.js\";\r\n\r\n// Re-export analyzers\r\nexport { Analyzer } from \"./local.js\";\r\nexport { RemoteAnalyzer } from \"./remote.js\";\r\n\r\n// Import classes for factory function\r\nimport { Analyzer } from \"./local.js\";\r\nimport { RemoteAnalyzer } from \"./remote.js\";\r\n\r\n// Factory function\r\nexport function createAnalyzer(\r\n mode: \"local\",\r\n options?: { verbose?: boolean },\r\n): Analyzer;\r\nexport function createAnalyzer(\r\n mode: \"remote\",\r\n options: { repoUrl: string; verbose?: boolean },\r\n): RemoteAnalyzer;\r\nexport function createAnalyzer(\r\n mode: \"local\" | \"remote\",\r\n options?: { repoUrl?: string; verbose?: boolean },\r\n): Analyzer | RemoteAnalyzer {\r\n if (mode === \"remote\") {\r\n if (!options?.repoUrl) {\r\n throw new Error(\"repoUrl is required for remote analyzer\");\r\n }\r\n return new RemoteAnalyzer(options.repoUrl, options?.verbose);\r\n }\r\n return new Analyzer(options?.verbose);\r\n}\r\n","/**\r\n * Shared Analyzer Core\r\n * Common logic extracted from both local and remote analyzers.\r\n * \"I'd like to share a revelation that I've had...\"\r\n */\r\n\r\nimport type {\r\n AgentDefinition,\r\n ToolDefinition,\r\n HookDefinition,\r\n SkillDefinition,\r\n} from \"./types.js\";\r\nimport { validateAnalysisOutput } from \"./schemas.js\";\r\n\r\n/**\r\n * Flatten nested sub-agents into a flat array.\r\n * The SDK may return sub-agents as objects inside parent.subAgents[].\r\n * We need them as separate entries in the agents array.\r\n */\r\nexport function flattenAgents(agents: unknown[]): AgentDefinition[] {\r\n const result: AgentDefinition[] = [];\r\n\r\n for (const rawAgent of agents) {\r\n if (!rawAgent || typeof rawAgent !== \"object\") continue;\r\n\r\n const agent = rawAgent as Record<string, unknown>;\r\n\r\n // Extract nested sub-agent objects\r\n const nestedSubAgents: unknown[] = [];\r\n const subAgentNames: string[] = [];\r\n\r\n const subAgentsArray = agent.subAgents as unknown[];\r\n if (Array.isArray(subAgentsArray) && subAgentsArray.length > 0) {\r\n for (const subAgent of subAgentsArray) {\r\n if (typeof subAgent === \"object\" && subAgent !== null && \"name\" in subAgent) {\r\n // It's a nested agent object - extract it\r\n const nestedAgent = subAgent as Record<string, unknown>;\r\n nestedAgent.isSubAgent = true;\r\n nestedAgent.parentAgent = agent.name as string;\r\n nestedSubAgents.push(nestedAgent);\r\n subAgentNames.push(nestedAgent.name as string);\r\n } else if (typeof subAgent === \"string\") {\r\n // It's just a name reference\r\n subAgentNames.push(subAgent);\r\n }\r\n }\r\n }\r\n\r\n // Build normalized agent\r\n const normalizedAgent: AgentDefinition = {\r\n name: String(agent.name || \"unknown\"),\r\n description: String(agent.description || \"\"),\r\n skills: Array.isArray(agent.skills) ? agent.skills.map((s: unknown) => String(s)) : [],\r\n tools: normalizeTools(agent.tools),\r\n isSubAgent: Boolean(agent.isSubAgent),\r\n parentAgent: agent.parentAgent ? String(agent.parentAgent) : undefined,\r\n subAgents: subAgentNames.length > 0 ? subAgentNames : undefined,\r\n triggers: Array.isArray(agent.triggers) ? agent.triggers.map((t: unknown) => String(t)) : [],\r\n sourceDir: agent.sourceDir ? String(agent.sourceDir) : undefined,\r\n };\r\n\r\n result.push(normalizedAgent);\r\n\r\n // Recursively flatten any nested sub-agents\r\n if (nestedSubAgents.length > 0) {\r\n result.push(...flattenAgents(nestedSubAgents));\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Normalize tools to ToolDefinition format.\r\n * SDK may return tools as strings or objects.\r\n */\r\nexport function normalizeTools(tools: unknown): ToolDefinition[] {\r\n if (!tools || !Array.isArray(tools)) {\r\n return [];\r\n }\r\n\r\n return tools.map((tool: unknown) => {\r\n if (typeof tool === \"string\") {\r\n return {\r\n name: tool.split(\" \")[0],\r\n command: tool,\r\n description: tool,\r\n };\r\n }\r\n if (typeof tool === \"object\" && tool !== null) {\r\n const t = tool as Record<string, unknown>;\r\n return {\r\n name: String(t.name || \"unknown\"),\r\n command: String(t.command || t.name || \"\"),\r\n description: String(t.description || t.name || \"\"),\r\n };\r\n }\r\n return {\r\n name: \"unknown\",\r\n command: String(tool),\r\n description: String(tool),\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Extract all tools from a list of agents.\r\n */\r\nexport function extractAllTools(agents: AgentDefinition[]): ToolDefinition[] {\r\n const tools: ToolDefinition[] = [];\r\n for (const agent of agents) {\r\n if (agent.tools) {\r\n tools.push(...agent.tools);\r\n }\r\n }\r\n return tools;\r\n}\r\n\r\n/**\r\n * Detect domain boundaries from a file list.\r\n * @param files - Array of objects with relativePath, isTest, isConfig properties\r\n * @param pathSep - Path separator to use (e.g., path.sep for local, \"/\" for remote)\r\n */\r\nexport function detectDomainBoundaries(\r\n files: ReadonlyArray<{ relativePath: string; isTest: boolean; isConfig: boolean }>,\r\n pathSep: string,\r\n): Array<{ name: string; path: string; fileCount: number }> {\r\n const domains: Map<string, { path: string; fileCount: number; subDirs: Set<string> }> = new Map();\r\n\r\n // Common domain patterns\r\n const domainPatterns = [\r\n \"api\", \"auth\", \"backend\", \"frontend\", \"core\", \"common\", \"shared\",\r\n \"services\", \"handlers\", \"controllers\", \"models\", \"views\", \"routes\",\r\n \"components\", \"hooks\", \"utils\", \"lib\", \"pkg\", \"internal\", \"cmd\",\r\n \"client\", \"server\", \"admin\", \"public\", \"private\", \"modules\",\r\n ];\r\n\r\n for (const file of files) {\r\n if (file.isTest || file.isConfig) continue;\r\n\r\n const parts = file.relativePath.split(pathSep);\r\n if (parts.length < 2) continue;\r\n\r\n const topDir = parts[0];\r\n const secondDir = parts.length > 2 ? parts[1] : null;\r\n\r\n // Track top-level domains\r\n if (!domains.has(topDir)) {\r\n domains.set(topDir, { path: topDir, fileCount: 0, subDirs: new Set() });\r\n }\r\n const domain = domains.get(topDir)!;\r\n domain.fileCount++;\r\n\r\n // Track sub-domains\r\n if (secondDir && domainPatterns.includes(secondDir.toLowerCase())) {\r\n domain.subDirs.add(secondDir);\r\n }\r\n }\r\n\r\n // Filter to significant domains (>5 files) and sort by file count\r\n return Array.from(domains.entries())\r\n .filter(([name, info]) => info.fileCount > 5 && domainPatterns.includes(name.toLowerCase()))\r\n .map(([name, info]) => ({ name, path: info.path, fileCount: info.fileCount }))\r\n .sort((a, b) => b.fileCount - a.fileCount);\r\n}\r\n\r\n/**\r\n * Generate default hooks based on language and whether test files exist.\r\n */\r\nexport function generateDefaultHooks(language: string, testFilesExist: boolean): HookDefinition[] {\r\n const hooks: HookDefinition[] = [];\r\n\r\n if (language === \"TypeScript\" || language === \"JavaScript\") {\r\n hooks.push({\r\n name: \"pre-commit-quality\",\r\n event: \"pre-commit\",\r\n description: \"Run linting and type checking before commit\",\r\n commands: [\"npm run lint\", \"npm run build\"],\r\n });\r\n\r\n if (testFilesExist) {\r\n hooks.push({\r\n name: \"pre-push-tests\",\r\n event: \"pre-push\",\r\n description: \"Run tests before pushing\",\r\n commands: [\"npm test\"],\r\n });\r\n }\r\n } else if (language === \"Python\") {\r\n hooks.push({\r\n name: \"pre-commit-quality\",\r\n event: \"pre-commit\",\r\n description: \"Run linting and formatting before commit\",\r\n commands: [\"ruff check .\", \"ruff format --check .\"],\r\n });\r\n\r\n if (testFilesExist) {\r\n hooks.push({\r\n name: \"pre-push-tests\",\r\n event: \"pre-push\",\r\n description: \"Run tests before pushing\",\r\n commands: [\"pytest\"],\r\n });\r\n }\r\n } else if (language === \"Go\") {\r\n hooks.push({\r\n name: \"pre-commit-quality\",\r\n event: \"pre-commit\",\r\n description: \"Run linting and formatting before commit\",\r\n commands: [\"go fmt ./...\", \"golangci-lint run\"],\r\n });\r\n\r\n if (testFilesExist) {\r\n hooks.push({\r\n name: \"pre-push-tests\",\r\n event: \"pre-push\",\r\n description: \"Run tests before pushing\",\r\n commands: [\"go test ./...\"],\r\n });\r\n }\r\n }\r\n\r\n // Post-generate hook for Agent Smith specific workflow\r\n hooks.push({\r\n name: \"post-generate-validate\",\r\n event: \"post-generate\",\r\n description: \"Validate generated agent assets after generation\",\r\n commands: [\"npx agentsmith validate\"],\r\n });\r\n\r\n return hooks;\r\n}\r\n\r\n/**\r\n * Detect tools from config based on language and config files.\r\n */\r\nexport function detectToolsFromConfig(language: string, configFiles: string[]): ToolDefinition[] {\r\n const tools: ToolDefinition[] = [];\r\n\r\n if (language === \"TypeScript\" || language === \"JavaScript\") {\r\n if (configFiles.includes(\"package.json\")) {\r\n tools.push(\r\n { name: \"install\", command: \"npm install\", description: \"Install dependencies\" },\r\n { name: \"build\", command: \"npm run build\", description: \"Build the project\" },\r\n { name: \"test\", command: \"npm test\", description: \"Run tests\" },\r\n { name: \"lint\", command: \"npm run lint\", description: \"Run linter\" },\r\n );\r\n }\r\n } else if (language === \"Python\") {\r\n tools.push(\r\n { name: \"install\", command: \"pip install -e .\", description: \"Install dependencies\" },\r\n { name: \"test\", command: \"pytest\", description: \"Run tests\" },\r\n { name: \"lint\", command: \"ruff check .\", description: \"Run linter\" },\r\n );\r\n } else if (language === \"Go\") {\r\n tools.push(\r\n { name: \"build\", command: \"go build ./...\", description: \"Build the project\" },\r\n { name: \"test\", command: \"go test ./...\", description: \"Run tests\" },\r\n { name: \"lint\", command: \"golangci-lint run\", description: \"Run linter\" },\r\n );\r\n }\r\n\r\n return tools;\r\n}\r\n\r\n/**\r\n * Build a system prompt for Copilot SDK analysis.\r\n * @param language - Detected language\r\n * @param domains - Optional detected domain boundaries\r\n */\r\nexport function getSystemPrompt(\r\n language: string,\r\n domains?: Array<{ name: string }>,\r\n): string {\r\n const domainHints = domains && domains.length > 0\r\n ? `\\nPotential domains detected: ${domains.map(d => d.name).join(\", \")}`\r\n : \"\";\r\n\r\n return `You are Agent Smith, an AI designed to assimilate repositories into agent hierarchies.\r\n\r\nYour task: Analyze this ${language} repository and extract:\r\n1. SKILLS - Reusable patterns, conventions, and capabilities specific to parts of this codebase\r\n2. AGENTS - Domain-specific agents with clear responsibilities\r\n3. SUB-AGENTS - Child agents for complex domains (e.g., auth/oauth, auth/rbac under auth)\r\n4. NESTED AGENTS - Multi-level hierarchies for large codebases\r\n5. TOOLS - Commands that can be run (build, test, lint, deploy, etc.)\r\n\r\n## Agent Hierarchy Guidelines\r\n- Create a ROOT agent for the overall repository\r\n- Create SUB-AGENTS for major domains (backend, frontend, api, auth, data)\r\n- Create NESTED agents when a domain has sub-domains (api/v1, api/v2, api/graphql)\r\n- Each agent should have 2-5 skills max; split if more are needed\r\n${domainHints}\r\n\r\nFor each SKILL, identify:\r\n- A kebab-case name (max 64 chars)\r\n- A clear description of when to use it\r\n- The source directory it relates to\r\n- The patterns and conventions it embodies\r\n- Keywords that trigger its relevance\r\n- Category: architecture, reliability, quality, security, or patterns\r\n\r\nFor AGENTS, determine:\r\n- Natural domain boundaries based on directory structure\r\n- Parent-child relationships (isSubAgent: true for children)\r\n- Which skills each agent owns (skills should not overlap between agents)\r\n- Tools specific to that agent's domain\r\n\r\nRespond in valid JSON format only. No markdown, no explanation.`;\r\n}\r\n\r\n/**\r\n * Build the analysis prompt with file list and samples.\r\n */\r\nexport function buildAnalysisPrompt(\r\n language: string,\r\n framework: string | null | undefined,\r\n sourceDirectories: string[],\r\n configFiles: string[],\r\n fileList: string,\r\n sampleContent: string,\r\n): string {\r\n return `Analyze this ${language} repository.\r\n\r\n## Repository Structure\r\nLanguage: ${language}\r\nFramework: ${framework || \"None\"}\r\nSource directories: ${sourceDirectories.join(\", \")}\r\nConfig files: ${configFiles.join(\", \")}\r\n\r\n## File List (first 100)\r\n${fileList}\r\n\r\n## File Samples\r\n${sampleContent}\r\n\r\n## Instructions\r\nExtract skills, agents (with hierarchy), and tools from this codebase. Return JSON:\r\n\r\n{\r\n \"skills\": [\r\n {\r\n \"name\": \"skill-name\",\r\n \"description\": \"When and how to use this pattern\",\r\n \"sourceDir\": \"src/auth\",\r\n \"patterns\": [\"pattern 1\", \"pattern 2\"],\r\n \"triggers\": [\"keyword1\", \"keyword2\"],\r\n \"category\": \"architecture|reliability|quality|security|patterns\",\r\n \"examples\": [\"example code snippet or reference\"]\r\n }\r\n ],\r\n \"agents\": [\r\n {\r\n \"name\": \"root\",\r\n \"description\": \"Main agent for the repository\",\r\n \"skills\": [\"overview-skill\"],\r\n \"tools\": [{\"name\": \"build\", \"command\": \"npm run build\", \"description\": \"Build the project\"}],\r\n \"isSubAgent\": false,\r\n \"subAgents\": [\"backend\", \"frontend\"],\r\n \"sourceDir\": \"\",\r\n \"triggers\": [\"main\", \"primary\"]\r\n },\r\n {\r\n \"name\": \"backend\",\r\n \"description\": \"Backend domain agent\",\r\n \"skills\": [\"api-patterns\", \"db-access\"],\r\n \"tools\": [],\r\n \"isSubAgent\": true,\r\n \"parentAgent\": \"root\",\r\n \"subAgents\": [\"auth\"],\r\n \"sourceDir\": \"src/backend\",\r\n \"triggers\": [\"backend\", \"server\", \"api\"]\r\n },\r\n {\r\n \"name\": \"auth\",\r\n \"description\": \"Authentication sub-agent\",\r\n \"skills\": [\"oauth-flow\"],\r\n \"tools\": [],\r\n \"isSubAgent\": true,\r\n \"parentAgent\": \"backend\",\r\n \"sourceDir\": \"src/backend/auth\",\r\n \"triggers\": [\"auth\", \"login\", \"oauth\"]\r\n }\r\n ],\r\n \"summary\": \"One paragraph describing the repository's architecture and purpose\"\r\n}`;\r\n}\r\n\r\n/**\r\n * Parse a JSON analysis response from the SDK.\r\n * Extracts JSON from potentially mixed content and validates with Zod.\r\n * @param response - Raw response string\r\n * @param fallbackFn - Function to call if parsing or validation fails\r\n */\r\nexport function parseAnalysisResponse<T>(\r\n response: string,\r\n fallbackFn: () => T,\r\n): { skills: unknown[]; agents: unknown[]; hooks: unknown[]; summary: string } | T {\r\n try {\r\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\r\n if (!jsonMatch) {\r\n throw new Error(\"No JSON found in response\");\r\n }\r\n\r\n const raw = JSON.parse(jsonMatch[0]) as unknown;\r\n\r\n // Validate through Zod schema — applies defaults and type checks\r\n const validated = validateAnalysisOutput(raw);\r\n if (!validated) {\r\n console.warn(\" [Zod] Validation failed, falling back\");\r\n return fallbackFn();\r\n }\r\n\r\n return {\r\n skills: validated.skills as unknown[],\r\n agents: validated.agents as unknown[],\r\n hooks: (validated.hooks ?? []) as unknown[],\r\n summary: validated.summary,\r\n };\r\n } catch {\r\n return fallbackFn();\r\n }\r\n}\r\n\r\n/**\r\n * Generate default skills based on detected source directories.\r\n */\r\nexport function generateDefaultSkills(sourceDirectories: string[]): SkillDefinition[] {\r\n return sourceDirectories.map((dir) => ({\r\n name: `${dir}-patterns`,\r\n description: `Patterns and conventions from the ${dir} directory`,\r\n sourceDir: dir,\r\n patterns: [],\r\n triggers: [dir],\r\n category: \"patterns\",\r\n examples: [],\r\n }));\r\n}\r\n\r\n/**\r\n * Get default tools for a language without checking config files.\r\n * Used by the remote analyzer fallback where we don't have filesystem access.\r\n */\r\nexport function getDefaultTools(language: string): ToolDefinition[] {\r\n if (language === \"TypeScript\" || language === \"JavaScript\") {\r\n return [\r\n { name: \"install\", command: \"npm install\", description: \"Install dependencies\" },\r\n { name: \"build\", command: \"npm run build\", description: \"Build\" },\r\n { name: \"test\", command: \"npm test\", description: \"Run tests\" },\r\n ];\r\n } else if (language === \"Python\") {\r\n return [\r\n { name: \"install\", command: \"pip install -e .\", description: \"Install\" },\r\n { name: \"test\", command: \"pytest\", description: \"Run tests\" },\r\n ];\r\n } else if (language === \"Go\") {\r\n return [\r\n { name: \"build\", command: \"go build ./...\", description: \"Build\" },\r\n { name: \"test\", command: \"go test ./...\", description: \"Run tests\" },\r\n ];\r\n }\r\n return [];\r\n}\r\n","/**\r\n * Zod Validation Schemas for LLM Output\r\n * Validates the unpredictable JSON returned by CopilotClient sessions.\r\n * \"Never send a human to do a machine's job.\"\r\n */\r\n\r\nimport { z } from \"zod\";\r\n\r\n/** Schema for a single skill in LLM output */\r\nexport const SkillOutputSchema = z.object({\r\n name: z.string().min(1).max(64),\r\n description: z.string().min(1),\r\n sourceDir: z.string().default(\"\"),\r\n patterns: z.array(z.string()).default([]),\r\n triggers: z.array(z.string()).default([]),\r\n category: z\r\n .enum([\"architecture\", \"reliability\", \"quality\", \"security\", \"patterns\"])\r\n .default(\"patterns\"),\r\n examples: z.array(z.string()).default([]),\r\n});\r\n\r\n/** Schema for a tool in LLM output — may be an object or a bare string */\r\nexport const ToolOutputSchema = z.union([\r\n z.object({\r\n name: z.string().min(1),\r\n command: z.string().default(\"\"),\r\n description: z.string().default(\"\"),\r\n }),\r\n z.string().min(1),\r\n]);\r\n\r\n/** Schema for a hook in LLM output */\r\nexport const HookOutputSchema = z.object({\r\n name: z.string().min(1),\r\n event: z.string().min(1),\r\n description: z.string().default(\"\"),\r\n commands: z.array(z.string()).default([]),\r\n condition: z.string().optional(),\r\n});\r\n\r\n/** Inferred type for a single agent (used by the lazy schema below) */\r\nexport type AgentOutput = {\r\n name: string;\r\n description: string;\r\n skills: string[];\r\n tools: (string | { name: string; command: string; description: string })[];\r\n isSubAgent: boolean;\r\n parentAgent?: string;\r\n subAgents: (AgentOutput | string)[];\r\n triggers: string[];\r\n sourceDir?: string;\r\n};\r\n\r\n/**\r\n * Schema for an agent in LLM output.\r\n * subAgents can be nested agent objects or string references — handled via z.lazy().\r\n */\r\nexport const AgentOutputSchema: z.ZodType<AgentOutput, z.ZodTypeDef, unknown> = z.lazy(() =>\r\n z.object({\r\n name: z.string().min(1),\r\n description: z.string().default(\"\"),\r\n skills: z.array(z.string()).default([]),\r\n tools: z.array(ToolOutputSchema).default([]),\r\n isSubAgent: z.boolean().default(false),\r\n parentAgent: z.string().optional(),\r\n subAgents: z\r\n .array(z.union([AgentOutputSchema, z.string()]))\r\n .default([]),\r\n triggers: z.array(z.string()).default([]),\r\n sourceDir: z.string().optional(),\r\n }),\r\n);\r\n\r\n/** Schema for the complete LLM analysis response */\r\nexport const AnalysisOutputSchema = z.object({\r\n skills: z.array(SkillOutputSchema).default([]),\r\n agents: z.array(AgentOutputSchema).default([]),\r\n summary: z.string().default(\"\"),\r\n hooks: z.array(HookOutputSchema).optional(),\r\n});\r\n\r\n/** Inferred type for a validated analysis response */\r\nexport type AnalysisOutput = z.infer<typeof AnalysisOutputSchema>;\r\n\r\n/**\r\n * Validate raw parsed JSON against the AnalysisOutputSchema.\r\n * Returns the validated + defaulted data, or null if validation fails.\r\n * Errors are logged with field paths for debugging.\r\n */\r\nexport function validateAnalysisOutput(data: unknown): AnalysisOutput | null {\r\n const result = AnalysisOutputSchema.safeParse(data);\r\n if (result.success) {\r\n return result.data;\r\n }\r\n\r\n // Log structured Zod errors with paths\r\n for (const issue of result.error.issues) {\r\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\r\n console.warn(` [Zod] ${path}: ${issue.message}`);\r\n }\r\n\r\n return null;\r\n}\r\n","/**\r\n * Local Analyzer - The Mind of Agent Smith\r\n * Uses GitHub Copilot SDK to perform deep semantic analysis of a local repository.\r\n * \"The best thing about being me... there are so many of me.\"\r\n */\r\n\r\nimport { CopilotClient, approveAll } from \"@github/copilot-sdk\";\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport type { ScanResult } from \"../scanner/index.js\";\r\nimport type { AnalysisResult, SkillDefinition, ToolDefinition, AgentDefinition } from \"./types.js\";\r\nimport {\r\n flattenAgents,\r\n extractAllTools,\r\n detectDomainBoundaries,\r\n generateDefaultHooks,\r\n detectToolsFromConfig,\r\n getSystemPrompt,\r\n buildAnalysisPrompt,\r\n parseAnalysisResponse,\r\n generateDefaultSkills,\r\n} from \"./core.js\";\r\n\r\nexport class Analyzer {\r\n private verbose: boolean;\r\n private client: CopilotClient | null = null;\r\n\r\n constructor(verbose = false) {\r\n this.verbose = verbose;\r\n }\r\n\r\n async analyze(scanResult: ScanResult): Promise<AnalysisResult> {\r\n // Initialize Copilot SDK\r\n if (this.verbose) {\r\n console.log(\" [SDK] Initializing CopilotClient...\");\r\n }\r\n\r\n this.client = new CopilotClient({\r\n logLevel: this.verbose ? \"debug\" : \"error\",\r\n });\r\n\r\n if (this.verbose) {\r\n console.log(\" [SDK] Starting client...\");\r\n }\r\n\r\n try {\r\n await this.client.start();\r\n } catch (error) {\r\n console.error(\" [SDK] Failed to start client:\", (error as Error).message);\r\n console.error(\" [SDK] Make sure Copilot CLI is installed and in PATH\");\r\n console.error(\" [SDK] Falling back to heuristic analysis...\\n\");\r\n return this.generateFallbackAnalysis(scanResult);\r\n }\r\n\r\n if (this.verbose) {\r\n console.log(\" [SDK] Client started successfully\");\r\n }\r\n\r\n try {\r\n if (this.verbose) {\r\n console.log(\" [SDK] Creating session with model: gpt-5...\");\r\n }\r\n\r\n // Detect potential domain boundaries for system prompt\r\n const domains = detectDomainBoundaries(scanResult.files, path.sep);\r\n\r\n // Create a session with custom tools for analysis\r\n const session = await this.client.createSession({\r\n model: \"gpt-5\",\r\n streaming: true,\r\n systemMessage: {\r\n content: getSystemPrompt(scanResult.language, domains),\r\n },\r\n onPermissionRequest: approveAll,\r\n });\r\n\r\n if (this.verbose) {\r\n console.log(\" [SDK] Session created successfully\");\r\n }\r\n\r\n // Prepare file samples for analysis\r\n const samples = await this.gatherFileSamples(scanResult);\r\n\r\n if (this.verbose) {\r\n console.log(` [SDK] Gathered ${samples.size} file samples`);\r\n }\r\n\r\n // Build the analysis prompt\r\n const fileList = scanResult.files.slice(0, 100).map((f) => f.relativePath).join(\"\\n\");\r\n let sampleContent = \"\";\r\n for (const [filePath, content] of samples) {\r\n sampleContent += `\\n--- ${filePath} ---\\n${content}\\n`;\r\n }\r\n\r\n const analysisPrompt = buildAnalysisPrompt(\r\n scanResult.language,\r\n scanResult.framework,\r\n scanResult.sourceDirectories,\r\n scanResult.configFiles,\r\n fileList,\r\n sampleContent,\r\n );\r\n\r\n if (this.verbose) {\r\n console.log(` [SDK] Sending prompt (${analysisPrompt.length} chars)...`);\r\n }\r\n\r\n let responseContent = \"\";\r\n let eventCount = 0;\r\n\r\n const done = new Promise<void>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n console.error(`\\n [SDK] Timeout after 120s. Events received: ${eventCount}`);\r\n reject(new Error(\"SDK timeout\"));\r\n }, 120000);\r\n\r\n session.on((event) => {\r\n eventCount++;\r\n const eventType = event.type as string;\r\n const eventData = event.data as Record<string, unknown>;\r\n\r\n if (this.verbose && eventType !== \"assistant.message_delta\") {\r\n console.log(` [SDK] Event: ${eventType}`);\r\n }\r\n\r\n if (eventType === \"assistant.message\") {\r\n responseContent = (eventData.content as string) || \"\";\r\n if (this.verbose) {\r\n console.log(` [SDK] Got final message (${responseContent.length} chars)`);\r\n }\r\n } else if (eventType === \"assistant.message_delta\") {\r\n process.stdout.write((eventData.deltaContent as string) || \"\");\r\n } else if (eventType === \"session.idle\") {\r\n clearTimeout(timeout);\r\n if (this.verbose) {\r\n console.log(` [SDK] Session idle. Total events: ${eventCount}`);\r\n }\r\n resolve();\r\n } else if (eventType === \"error\") {\r\n clearTimeout(timeout);\r\n console.error(\" [SDK] Error event:\", eventData);\r\n reject(new Error(\"SDK error event\"));\r\n }\r\n });\r\n });\r\n\r\n await session.send({ prompt: analysisPrompt });\r\n\r\n if (this.verbose) {\r\n console.log(\" [SDK] Prompt sent, waiting for response...\");\r\n }\r\n\r\n await done;\r\n\r\n if (this.verbose) {\r\n console.log(\"\\n\");\r\n }\r\n\r\n // Parse the response\r\n const result = this.buildResult(responseContent, scanResult);\r\n\r\n await session.destroy();\r\n return result;\r\n } catch (error) {\r\n console.error(`\\n [SDK] Error: ${(error as Error).message}`);\r\n console.error(\" [SDK] Falling back to heuristic analysis...\\n\");\r\n return this.generateFallbackAnalysis(scanResult);\r\n } finally {\r\n if (this.client) {\r\n try {\r\n await this.client.stop();\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async gatherFileSamples(scanResult: ScanResult): Promise<Map<string, string>> {\r\n const samples = new Map<string, string>();\r\n const maxSamples = 20;\r\n const maxFileSize = 10000; // 10KB per file\r\n\r\n // Prioritize: config files, main entry points, key directories\r\n const priorityFiles = scanResult.files\r\n .filter((f) => !f.isTest)\r\n .sort((a, b) => {\r\n // Config files first\r\n if (a.isConfig && !b.isConfig) return -1;\r\n if (!a.isConfig && b.isConfig) return 1;\r\n\r\n // Then by directory depth (shallower = more important)\r\n const depthA = a.relativePath.split(path.sep).length;\r\n const depthB = b.relativePath.split(path.sep).length;\r\n return depthA - depthB;\r\n })\r\n .slice(0, maxSamples);\r\n\r\n for (const file of priorityFiles) {\r\n if (file.size > maxFileSize) continue;\r\n\r\n try {\r\n const content = await fs.readFile(file.path, \"utf-8\");\r\n samples.set(file.relativePath, content.slice(0, maxFileSize));\r\n } catch {\r\n // Skip unreadable files\r\n }\r\n }\r\n\r\n return samples;\r\n }\r\n\r\n private buildResult(response: string, scanResult: ScanResult): AnalysisResult {\r\n const parsed = parseAnalysisResponse(response, () => null);\r\n\r\n if (parsed === null) {\r\n return this.generateFallbackAnalysis(scanResult);\r\n }\r\n\r\n const flatAgents = flattenAgents(parsed.agents);\r\n\r\n return {\r\n repoName: path.basename(scanResult.rootPath),\r\n skills: parsed.skills as SkillDefinition[],\r\n agents: flatAgents,\r\n tools: extractAllTools(flatAgents),\r\n hooks: parsed.hooks.length > 0\r\n ? (parsed.hooks as AnalysisResult[\"hooks\"])\r\n : generateDefaultHooks(scanResult.language, scanResult.testFiles.length > 0),\r\n summary: parsed.summary,\r\n };\r\n }\r\n\r\n private generateFallbackAnalysis(scanResult: ScanResult): AnalysisResult {\r\n // Detect domains for hierarchical agent structure\r\n const domains = detectDomainBoundaries(scanResult.files, path.sep);\r\n\r\n // Generate basic skills based on detected directories\r\n const skills: SkillDefinition[] = generateDefaultSkills(scanResult.sourceDirectories);\r\n\r\n // Generate tools from config\r\n const tools: ToolDefinition[] = detectToolsFromConfig(scanResult.language, scanResult.configFiles);\r\n\r\n // Build hierarchical agents\r\n const agents: AgentDefinition[] = [];\r\n const subAgentNames: string[] = [];\r\n\r\n // Create sub-agents for each detected domain\r\n for (const domain of domains) {\r\n const domainSkills = skills.filter(\r\n (s) => s.sourceDir === domain.path || s.sourceDir.startsWith(domain.path + path.sep),\r\n );\r\n subAgentNames.push(domain.name);\r\n\r\n agents.push({\r\n name: domain.name,\r\n description: `Agent for the ${domain.name} domain (${domain.fileCount} files)`,\r\n skills: domainSkills.map((s) => s.name),\r\n tools: [],\r\n isSubAgent: true,\r\n parentAgent: \"root\",\r\n sourceDir: domain.path,\r\n triggers: [domain.name.toLowerCase()],\r\n });\r\n }\r\n\r\n // Create root agent\r\n const rootSkills = skills.filter(\r\n (s) => !domains.some((d) => s.sourceDir.startsWith(d.path)),\r\n );\r\n agents.unshift({\r\n name: \"root\",\r\n description: `Root agent for this ${scanResult.language} repository`,\r\n skills: rootSkills.map((s) => s.name),\r\n tools,\r\n isSubAgent: false,\r\n subAgents: subAgentNames,\r\n triggers: [scanResult.language.toLowerCase(), \"main\", \"primary\"],\r\n });\r\n\r\n // Generate hooks\r\n const hooks = generateDefaultHooks(scanResult.language, scanResult.testFiles.length > 0);\r\n\r\n return {\r\n repoName: path.basename(scanResult.rootPath),\r\n skills,\r\n agents,\r\n tools,\r\n hooks,\r\n summary: `A ${scanResult.language} repository${scanResult.framework ? ` using ${scanResult.framework}` : \"\"} with ${domains.length} detected domains.`,\r\n };\r\n }\r\n}\r\n","/**\r\n * Remote Analyzer - Analyzes GitHub repos directly without cloning\r\n * Uses GitHub Copilot SDK with GitHub API for file access\r\n */\r\n\r\nimport { CopilotClient, approveAll } from \"@github/copilot-sdk\";\r\nimport type { GitHubFile } from \"../github/index.js\";\r\nimport { GitHubClient } from \"../github/index.js\";\r\nimport type { AnalysisResult, SkillDefinition, AgentDefinition } from \"./types.js\";\r\nimport {\r\n flattenAgents,\r\n extractAllTools,\r\n generateDefaultHooks,\r\n getDefaultTools,\r\n parseAnalysisResponse,\r\n generateDefaultSkills,\r\n} from \"./core.js\";\r\n\r\n// Files/dirs to ignore\r\nconst IGNORE_PATTERNS = [\r\n /^node_modules\\//,\r\n /^\\.git\\//,\r\n /^dist\\//,\r\n /^build\\//,\r\n /^\\.next\\//,\r\n /^coverage\\//,\r\n /^__pycache__\\//,\r\n /^\\.venv\\//,\r\n /^venv\\//,\r\n /\\.lock$/,\r\n /package-lock\\.json$/,\r\n /yarn\\.lock$/,\r\n /pnpm-lock\\.yaml$/,\r\n];\r\n\r\n// Config files to prioritize\r\nconst CONFIG_FILES = [\r\n \"package.json\",\r\n \"tsconfig.json\",\r\n \"pyproject.toml\",\r\n \"setup.py\",\r\n \"go.mod\",\r\n \"Cargo.toml\",\r\n \"README.md\",\r\n];\r\n\r\nexport class RemoteAnalyzer {\r\n private verbose: boolean;\r\n private github: GitHubClient;\r\n\r\n constructor(repoUrl: string, verbose = false) {\r\n this.verbose = verbose;\r\n this.github = new GitHubClient(repoUrl, verbose);\r\n }\r\n\r\n async analyze(): Promise<AnalysisResult> {\r\n // Get repo info and file tree from GitHub API\r\n if (this.verbose) {\r\n console.log(` [GH] Fetching repo info for ${this.github.fullName}...`);\r\n }\r\n\r\n const repoInfo = await this.github.getRepoInfo();\r\n const tree = await this.github.getTree();\r\n\r\n if (this.verbose) {\r\n console.log(` [GH] Found ${tree.length} files/dirs`);\r\n }\r\n\r\n // Filter files\r\n const files = tree.filter(f =>\r\n f.type === \"file\" &&\r\n !IGNORE_PATTERNS.some(p => p.test(f.path)),\r\n );\r\n\r\n // Detect language from file extensions\r\n const language = this.detectLanguage(files);\r\n const framework = this.detectFramework(files);\r\n\r\n if (this.verbose) {\r\n console.log(` [GH] Language: ${language}, Framework: ${framework || \"none\"}`);\r\n }\r\n\r\n // Get priority files for analysis\r\n const priorityPaths = this.selectPriorityFiles(files);\r\n\r\n if (this.verbose) {\r\n console.log(` [GH] Fetching ${priorityPaths.length} priority files...`);\r\n }\r\n\r\n const fileContents = await this.github.getFiles(priorityPaths);\r\n\r\n // Build prompt for Copilot SDK\r\n const prompt = this.buildPrompt(files, fileContents, language, framework);\r\n\r\n if (this.verbose) {\r\n console.log(` [SDK] Prompt size: ${prompt.length} chars`);\r\n }\r\n\r\n // Analyze with Copilot SDK\r\n const client = new CopilotClient({\r\n logLevel: this.verbose ? \"debug\" : \"error\",\r\n });\r\n\r\n try {\r\n if (this.verbose) {\r\n console.log(\" [SDK] Starting client...\");\r\n }\r\n await client.start();\r\n if (this.verbose) {\r\n console.log(\" [SDK] Client started, state:\", client.getState());\r\n console.log(\" [SDK] Creating session...\");\r\n }\r\n\r\n const session = await client.createSession({\r\n model: \"gpt-5\",\r\n streaming: true,\r\n systemMessage: {\r\n content: this.getSystemPrompt(),\r\n },\r\n onPermissionRequest: approveAll,\r\n });\r\n\r\n if (this.verbose) {\r\n console.log(` [SDK] Session created: ${session.sessionId}`);\r\n }\r\n\r\n let responseContent = \"\";\r\n let streamedContent = \"\";\r\n let eventCount = 0;\r\n\r\n const done = new Promise<void>((resolve) => {\r\n const timeout = setTimeout(() => {\r\n if (this.verbose) {\r\n console.log(`\\n [SDK] Session timeout - using streamed content (${streamedContent.length} chars)`);\r\n }\r\n resolve();\r\n }, 120000);\r\n\r\n session.on((event) => {\r\n eventCount++;\r\n const eventType = event.type as string;\r\n const eventData = event.data as Record<string, unknown>;\r\n\r\n if (eventType === \"assistant.message_delta\") {\r\n const delta = (eventData.deltaContent as string) || \"\";\r\n streamedContent += delta;\r\n process.stdout.write(delta);\r\n } else if (eventType === \"assistant.message\") {\r\n responseContent = (eventData.content as string) || \"\";\r\n clearTimeout(timeout);\r\n resolve();\r\n } else if (eventType === \"session.idle\") {\r\n clearTimeout(timeout);\r\n resolve();\r\n } else if (eventType === \"error\") {\r\n clearTimeout(timeout);\r\n console.error(\" [SDK] Error event:\", eventData);\r\n resolve();\r\n }\r\n });\r\n });\r\n\r\n if (this.verbose) {\r\n console.log(\" [SDK] Sending prompt...\");\r\n }\r\n await session.send({ prompt });\r\n if (this.verbose) {\r\n console.log(\" [SDK] Prompt sent, waiting...\");\r\n }\r\n await done;\r\n\r\n console.log(\"\\n\");\r\n\r\n await session.destroy();\r\n await client.stop();\r\n\r\n // Use streamed content if no complete message received\r\n const finalContent = responseContent || streamedContent;\r\n\r\n // Parse response\r\n return this.buildResult(finalContent, repoInfo, language, framework);\r\n\r\n } catch (error) {\r\n console.error(` [SDK] Error: ${(error as Error).message}`);\r\n await client.stop().catch(() => {});\r\n return this.generateFallback(repoInfo, language, framework, files);\r\n }\r\n }\r\n\r\n private detectLanguage(files: GitHubFile[]): string {\r\n const extCounts: Record<string, number> = {};\r\n const extMap: Record<string, string> = {\r\n \".ts\": \"TypeScript\",\r\n \".tsx\": \"TypeScript\",\r\n \".js\": \"JavaScript\",\r\n \".jsx\": \"JavaScript\",\r\n \".py\": \"Python\",\r\n \".go\": \"Go\",\r\n \".rs\": \"Rust\",\r\n \".java\": \"Java\",\r\n \".cs\": \"C#\",\r\n \".rb\": \"Ruby\",\r\n };\r\n\r\n for (const file of files) {\r\n const ext = \".\" + file.path.split(\".\").pop();\r\n if (extMap[ext]) {\r\n extCounts[ext] = (extCounts[ext] || 0) + 1;\r\n }\r\n }\r\n\r\n let maxCount = 0;\r\n let lang = \"Unknown\";\r\n for (const [ext, count] of Object.entries(extCounts)) {\r\n if (count > maxCount) {\r\n maxCount = count;\r\n lang = extMap[ext];\r\n }\r\n }\r\n\r\n // Check for tsconfig to override JS detection\r\n if (lang === \"JavaScript\" && files.some(f => f.path.includes(\"tsconfig\"))) {\r\n lang = \"TypeScript\";\r\n }\r\n\r\n return lang;\r\n }\r\n\r\n private detectFramework(files: GitHubFile[]): string | undefined {\r\n const paths = new Set(files.map(f => f.path));\r\n\r\n if (paths.has(\"next.config.js\") || paths.has(\"next.config.mjs\")) return \"Next.js\";\r\n if (paths.has(\"angular.json\")) return \"Angular\";\r\n if (paths.has(\"vue.config.js\")) return \"Vue\";\r\n if (paths.has(\"nuxt.config.ts\") || paths.has(\"nuxt.config.js\")) return \"Nuxt\";\r\n\r\n return undefined;\r\n }\r\n\r\n private selectPriorityFiles(files: GitHubFile[]): string[] {\r\n const maxFiles = 15;\r\n const maxSize = 50000; // 50KB max per file\r\n\r\n const priority: string[] = [];\r\n\r\n // Config files first\r\n for (const cfg of CONFIG_FILES) {\r\n const match = files.find(f => f.path === cfg || f.path.endsWith(\"/\" + cfg));\r\n if (match && (match.size || 0) < maxSize) {\r\n priority.push(match.path);\r\n }\r\n }\r\n\r\n // Then source files by depth (shallower = more important)\r\n const sourceFiles = files\r\n .filter(f => !priority.includes(f.path) && (f.size || 0) < maxSize)\r\n .filter(f => /\\.(ts|js|py|go|rs|java)$/.test(f.path))\r\n .sort((a, b) => a.path.split(\"/\").length - b.path.split(\"/\").length);\r\n\r\n for (const f of sourceFiles) {\r\n if (priority.length >= maxFiles) break;\r\n priority.push(f.path);\r\n }\r\n\r\n return priority;\r\n }\r\n\r\n private getSystemPrompt(): string {\r\n return `You are Agent Smith, an AI designed to assimilate repositories into agent hierarchies.\r\n\r\nAnalyze the repository and extract:\r\n1. SKILLS - Reusable patterns and capabilities (aim for 5-15 skills per repo)\r\n2. AGENTS - A root agent plus NESTED SUB-AGENTS for each major domain/directory\r\n3. SUB-AGENTS - Always extract 2-7 sub-agents based on directory structure or domain boundaries\r\n4. TOOLS - Commands that can be run (build, test, lint)\r\n\r\nCRITICAL: Sub-agents must be nested objects inside the parent's subAgents array, not just names.\r\nEach sub-agent needs: name, description, skills, tools, isSubAgent=true, triggers.\r\n\r\nRespond in valid JSON only. No markdown, no explanation.`;\r\n }\r\n\r\n private buildPrompt(\r\n files: GitHubFile[],\r\n contents: Map<string, string>,\r\n language: string,\r\n framework?: string,\r\n ): string {\r\n const fileList = files.slice(0, 100).map(f => f.path).join(\"\\n\");\r\n\r\n let samples = \"\";\r\n for (const [filePath, content] of contents) {\r\n if (content) {\r\n samples += `\\n--- ${filePath} ---\\n${content.slice(0, 5000)}\\n`;\r\n }\r\n }\r\n\r\n return `Analyze this ${language} repository${framework ? ` using ${framework}` : \"\"}.\r\n\r\n## Files (first 100)\r\n${fileList}\r\n\r\n## File Contents\r\n${samples}\r\n\r\n## Instructions\r\nExtract 5-15 skills and create a hierarchical agent structure with nested sub-agents.\r\nLook at directory structure and create sub-agents for major domains (cmd, api, internal, lib, etc.)\r\n\r\n## Return JSON (sub-agents as NESTED OBJECTS, not strings):\r\n{\r\n \"skills\": [\r\n {\"name\": \"skill-name\", \"description\": \"...\", \"sourceDir\": \"src/x\", \"patterns\": [\"pattern 1\"], \"triggers\": [\"keyword\"], \"category\": \"patterns\", \"examples\": [\"code example\"]}\r\n ],\r\n \"agents\": [\r\n {\r\n \"name\": \"root\",\r\n \"description\": \"Main orchestrator for this repo\",\r\n \"skills\": [\"skill-1\", \"skill-2\"],\r\n \"tools\": [\"go build ./...\", \"npm test\"],\r\n \"isSubAgent\": false,\r\n \"subAgents\": [\r\n {\r\n \"name\": \"cli-agent\",\r\n \"description\": \"Handles CLI commands\",\r\n \"skills\": [\"cli-patterns\"],\r\n \"tools\": [\"./cmd/app help\"],\r\n \"isSubAgent\": true,\r\n \"triggers\": [\"cmd\", \"cli\", \"commands\"]\r\n },\r\n {\r\n \"name\": \"api-agent\",\r\n \"description\": \"Handles API endpoints\",\r\n \"skills\": [\"api-patterns\"],\r\n \"tools\": [\"curl localhost:8080/health\"],\r\n \"isSubAgent\": true,\r\n \"triggers\": [\"api\", \"http\", \"endpoints\"]\r\n }\r\n ],\r\n \"triggers\": [\"main\", \"root\", \"${language.toLowerCase()}\"]\r\n }\r\n ],\r\n \"summary\": \"One paragraph about this repo\"\r\n}`;\r\n }\r\n\r\n private buildResult(\r\n response: string,\r\n repo: { owner: string; repo: string; license?: string },\r\n language: string,\r\n framework: string | undefined,\r\n ): AnalysisResult {\r\n const parsed = parseAnalysisResponse(response, () => null);\r\n\r\n if (parsed === null) {\r\n // Will not happen in the fallback path, but this handles parse failure\r\n return {\r\n repoName: repo.repo,\r\n skills: [],\r\n agents: [],\r\n tools: [],\r\n hooks: generateDefaultHooks(language, false),\r\n summary: \"\",\r\n repo: { ...repo, language, framework },\r\n };\r\n }\r\n\r\n const flatAgents = flattenAgents(parsed.agents);\r\n\r\n return {\r\n repoName: repo.repo,\r\n skills: parsed.skills as SkillDefinition[],\r\n agents: flatAgents,\r\n tools: extractAllTools(flatAgents),\r\n hooks: generateDefaultHooks(language, false),\r\n summary: parsed.summary,\r\n repo: { ...repo, language, framework },\r\n };\r\n }\r\n\r\n private generateFallback(\r\n repo: { owner: string; repo: string; license?: string },\r\n language: string,\r\n framework: string | undefined,\r\n files: GitHubFile[],\r\n ): AnalysisResult {\r\n // Detect source directories\r\n const srcDirs = new Set<string>();\r\n for (const f of files) {\r\n const parts = f.path.split(\"/\");\r\n if (parts.length > 1 && [\"src\", \"lib\", \"app\", \"pkg\", \"cmd\"].includes(parts[0])) {\r\n srcDirs.add(parts[0]);\r\n }\r\n }\r\n\r\n const skills: SkillDefinition[] = generateDefaultSkills(Array.from(srcDirs));\r\n const tools = getDefaultTools(language);\r\n\r\n const agents: AgentDefinition[] = [{\r\n name: \"root\",\r\n description: `Root agent for ${repo.owner}/${repo.repo}`,\r\n skills: skills.map(s => s.name),\r\n tools,\r\n isSubAgent: false,\r\n subAgents: [],\r\n triggers: [language.toLowerCase()],\r\n }];\r\n\r\n return {\r\n repoName: repo.repo,\r\n skills,\r\n agents,\r\n tools,\r\n hooks: generateDefaultHooks(language, false),\r\n summary: `A ${language} repository${framework ? ` using ${framework}` : \"\"}.`,\r\n repo: { ...repo, language, framework },\r\n };\r\n }\r\n}\r\n","/**\r\n * GitHub API Client - Direct repo access without cloning\r\n * Uses GitHub CLI (gh) for authentication via execFile (no shell spawned)\r\n */\r\n\r\nimport { execFile } from \"child_process\";\r\nimport { promisify } from \"util\";\r\n\r\nconst execFileAsync = promisify(execFile);\r\n\r\n// ---------------------------------------------------------------------------\r\n// Error types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class GitHubApiError extends Error {\r\n constructor(message: string, public statusCode?: number) {\r\n super(message);\r\n this.name = \"GitHubApiError\";\r\n }\r\n}\r\n\r\nexport class AuthenticationError extends GitHubApiError {\r\n constructor() {\r\n super('GitHub authentication required. Run \"gh auth login\" first.');\r\n this.name = \"AuthenticationError\";\r\n }\r\n}\r\n\r\nexport class RateLimitError extends GitHubApiError {\r\n constructor(public retryAfter?: number) {\r\n super(\r\n `GitHub API rate limit exceeded${retryAfter ? `. Retry after ${retryAfter}s` : \"\"}`,\r\n );\r\n this.name = \"RateLimitError\";\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Shared interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface GitHubFile {\r\n path: string;\r\n type: \"file\" | \"dir\";\r\n size?: number;\r\n sha: string;\r\n}\r\n\r\nexport interface GitHubRepo {\r\n owner: string;\r\n repo: string;\r\n defaultBranch: string;\r\n license?: string;\r\n}\r\n\r\nexport interface GitHubContent {\r\n path: string;\r\n content: string;\r\n size: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Parse GitHub URL into owner/repo\r\n */\r\nexport function parseGitHubUrl(url: string): { owner: string; repo: string } {\r\n // Handle various formats:\r\n // https://github.com/owner/repo\r\n // https://github.com/owner/repo.git\r\n // git@github.com:owner/repo.git\r\n // owner/repo\r\n\r\n let owner: string;\r\n let repo: string;\r\n\r\n if (url.includes(\"github.com\")) {\r\n const match = url.match(/github\\.com[/:]([\\w-]+)\\/([\\w.-]+)/);\r\n if (!match) throw new Error(`Invalid GitHub URL: ${url}`);\r\n owner = match[1];\r\n repo = match[2].replace(/\\.git$/, \"\");\r\n } else if (url.includes(\"/\")) {\r\n [owner, repo] = url.split(\"/\");\r\n } else {\r\n throw new Error(`Invalid GitHub URL: ${url}`);\r\n }\r\n\r\n return { owner, repo };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Client\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Maximum number of retries for rate-limited requests */\r\nconst MAX_RETRIES = 3;\r\n\r\n/** Base delay in ms for exponential backoff */\r\nconst BASE_DELAY_MS = 1000;\r\n\r\n/**\r\n * GitHub API client using gh CLI for auth.\r\n *\r\n * All I/O is non-blocking — uses `execFile` (promisified) instead of\r\n * `execSync`, and `execFile` does not spawn a shell (mitigating shell\r\n * injection).\r\n */\r\nexport class GitHubClient {\r\n private owner: string;\r\n private repo: string;\r\n private verbose: boolean;\r\n\r\n constructor(url: string, verbose = false) {\r\n const { owner, repo } = parseGitHubUrl(url);\r\n this.owner = owner;\r\n this.repo = repo;\r\n this.verbose = verbose;\r\n }\r\n\r\n /**\r\n * Execute a gh api command (non-blocking, no shell).\r\n *\r\n * Automatically retries on 429 (rate-limit) responses with exponential\r\n * backoff up to MAX_RETRIES times.\r\n */\r\n private async api(endpoint: string): Promise<string> {\r\n const args = [\"api\", `repos/${this.owner}/${this.repo}${endpoint}`];\r\n\r\n if (this.verbose) {\r\n console.log(` [GH] gh ${args.join(\" \")}`);\r\n }\r\n\r\n let lastError: Error | undefined;\r\n\r\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\r\n try {\r\n const { stdout } = await execFileAsync(\"gh\", args, {\r\n maxBuffer: 10 * 1024 * 1024,\r\n timeout: 30_000,\r\n });\r\n return stdout;\r\n } catch (error: unknown) {\r\n lastError = error as Error;\r\n const stderr = (error as { stderr?: string }).stderr ?? \"\";\r\n const message = (error as Error).message ?? \"\";\r\n const combined = `${stderr} ${message}`;\r\n\r\n // Authentication failure — no point retrying\r\n if (\r\n combined.includes(\"auth login\") ||\r\n combined.includes(\"401\") ||\r\n combined.includes(\"403\") ||\r\n combined.includes(\"Not logged in\")\r\n ) {\r\n throw new AuthenticationError();\r\n }\r\n\r\n // Rate limit — retry with backoff\r\n if (combined.includes(\"429\") || combined.includes(\"rate limit\")) {\r\n const retryMatch = combined.match(/retry.after[:\\s]+(\\d+)/i);\r\n const retryAfter = retryMatch ? parseInt(retryMatch[1], 10) : undefined;\r\n\r\n if (attempt < MAX_RETRIES) {\r\n const delay = retryAfter\r\n ? retryAfter * 1000\r\n : BASE_DELAY_MS * Math.pow(2, attempt);\r\n if (this.verbose) {\r\n console.log(\r\n ` [GH] Rate limited — retrying in ${delay}ms (attempt ${attempt + 1}/${MAX_RETRIES})`,\r\n );\r\n }\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n continue;\r\n }\r\n throw new RateLimitError(retryAfter);\r\n }\r\n\r\n // Any other error — wrap and throw immediately\r\n throw new GitHubApiError(\r\n `GitHub API call failed: ${message || stderr}`,\r\n );\r\n }\r\n }\r\n\r\n // Should be unreachable, but satisfies the compiler\r\n throw lastError ?? new GitHubApiError(\"GitHub API call failed\");\r\n }\r\n\r\n // -----------------------------------------------------------------------\r\n // Public API (unchanged signatures)\r\n // -----------------------------------------------------------------------\r\n\r\n /**\r\n * Get repository metadata\r\n */\r\n async getRepoInfo(): Promise<GitHubRepo> {\r\n const data = JSON.parse(await this.api(\"\"));\r\n return {\r\n owner: this.owner,\r\n repo: this.repo,\r\n defaultBranch: data.default_branch,\r\n license: data.license?.spdx_id,\r\n };\r\n }\r\n\r\n /**\r\n * Get the file tree (recursive)\r\n */\r\n async getTree(branch?: string): Promise<GitHubFile[]> {\r\n const ref = branch || (await this.getRepoInfo()).defaultBranch;\r\n const data = JSON.parse(await this.api(`/git/trees/${ref}?recursive=1`));\r\n\r\n return data.tree\r\n .filter((item: any) => item.type === \"blob\" || item.type === \"tree\")\r\n .map((item: any) => ({\r\n path: item.path,\r\n type: item.type === \"blob\" ? \"file\" : \"dir\",\r\n size: item.size,\r\n sha: item.sha,\r\n }));\r\n }\r\n\r\n /**\r\n * Get file content by path\r\n */\r\n async getFileContent(path: string): Promise<string> {\r\n try {\r\n const data = JSON.parse(await this.api(`/contents/${path}`));\r\n if (data.encoding === \"base64\") {\r\n return Buffer.from(data.content, \"base64\").toString(\"utf-8\");\r\n }\r\n return data.content || \"\";\r\n } catch (error) {\r\n if (this.verbose) {\r\n console.log(\r\n ` [GH] Failed to fetch ${path}: ${(error as Error).message}`,\r\n );\r\n }\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Get multiple files in parallel\r\n */\r\n async getFiles(paths: string[]): Promise<Map<string, string>> {\r\n const results = new Map<string, string>();\r\n\r\n // Fetch in batches of 10 to avoid rate limits\r\n const batchSize = 10;\r\n for (let i = 0; i < paths.length; i += batchSize) {\r\n const batch = paths.slice(i, i + batchSize);\r\n const contents = await Promise.all(\r\n batch.map((p) => this.getFileContent(p)),\r\n );\r\n batch.forEach((p, idx) => results.set(p, contents[idx]));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n get fullName(): string {\r\n return `${this.owner}/${this.repo}`;\r\n }\r\n}\r\n","/**\r\n * Generator - The Replicator\r\n * Writes SKILL.md files and .agent.md constellation for VS Code.\r\n * v0.4: Multi-agent constellation with root orchestrator + domain sub-agents.\r\n * \"More...\"\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport type { AnalysisResult, SkillDefinition, AgentDefinition, HookDefinition } from \"../analyzer/index.js\";\r\nimport { buildCopilotInstructions, mergeWithExisting } from \"./instructions-writer.js\";\r\nimport { buildRootAgentMd, buildSubAgentMd } from \"./agent-writer.js\";\r\nimport { buildHandoffGraph, serializeHandoffGraph } from \"./handoff-writer.js\";\r\n\r\nexport interface GeneratorResult {\r\n files: string[];\r\n}\r\n\r\nexport class Generator {\r\n private rootPath: string;\r\n private dryRun: boolean;\r\n private verbose: boolean;\r\n private noInstructions: boolean;\r\n private singleAgent: boolean;\r\n\r\n constructor(\r\n rootPath: string,\r\n dryRun = false,\r\n verbose = false,\r\n noInstructions = false,\r\n singleAgent = false,\r\n ) {\r\n this.rootPath = rootPath;\r\n this.dryRun = dryRun;\r\n this.verbose = verbose;\r\n this.noInstructions = noInstructions;\r\n this.singleAgent = singleAgent;\r\n }\r\n\r\n async generate(analysis: AnalysisResult): Promise<GeneratorResult> {\r\n const files: string[] = [];\r\n\r\n // Create .github/skills/, .github/agents/, and .github/hooks/ directories\r\n const skillsDir = path.join(this.rootPath, \".github\", \"skills\");\r\n const agentsDir = path.join(this.rootPath, \".github\", \"agents\");\r\n const hooksDir = path.join(this.rootPath, \".github\", \"hooks\");\r\n\r\n if (!this.dryRun) {\r\n await fs.mkdir(skillsDir, { recursive: true });\r\n await fs.mkdir(agentsDir, { recursive: true });\r\n await fs.mkdir(hooksDir, { recursive: true });\r\n }\r\n\r\n // Generate SKILL.md for each skill (unchanged)\r\n for (const skill of analysis.skills) {\r\n const skillPath = await this.generateSkill(skill, skillsDir);\r\n files.push(skillPath);\r\n }\r\n\r\n // Agent generation: single-agent (v0.3 compat) or multi-agent constellation (v0.4)\r\n if (this.singleAgent) {\r\n // v0.3 compatibility: single .agent.md\r\n const agentPath = await this.generateMainAgent(analysis, agentsDir);\r\n files.push(agentPath);\r\n } else {\r\n // v0.4: multi-agent constellation\r\n const hasSubAgents = analysis.agents.some(a => a.isSubAgent);\r\n\r\n if (!hasSubAgents) {\r\n // No sub-agents detected — fall back to single agent like v0.3\r\n const agentPath = await this.generateMainAgent(analysis, agentsDir);\r\n files.push(agentPath);\r\n } else {\r\n // Generate individual .agent.md files for each agent\r\n for (const agent of analysis.agents) {\r\n const agentPath = await this.generateAgentFile(agent, analysis, agentsDir);\r\n files.push(agentPath);\r\n }\r\n\r\n // Generate handoffs.json delegation graph\r\n const handoffPath = await this.generateHandoffs(analysis.agents);\r\n files.push(handoffPath);\r\n }\r\n }\r\n\r\n // Generate .github/copilot-instructions.md (workspace-wide Copilot config)\r\n if (!this.noInstructions) {\r\n const instructionsPath = await this.generateCopilotInstructions(analysis);\r\n files.push(instructionsPath);\r\n }\r\n\r\n // Generate hook.yaml for each hook (unchanged)\r\n for (const hook of analysis.hooks) {\r\n const hookPath = await this.generateHook(hook, hooksDir);\r\n files.push(hookPath);\r\n }\r\n\r\n return { files };\r\n }\r\n\r\n /**\r\n * Generate an individual .agent.md file for a single agent in the constellation.\r\n * Root agents get `runSubagent`; sub-agents are leaf specialists.\r\n */\r\n private async generateAgentFile(\r\n agent: AgentDefinition,\r\n analysis: AnalysisResult,\r\n agentsDir: string,\r\n ): Promise<string> {\r\n const helpers = {\r\n toTitleCase: this.toTitleCase.bind(this),\r\n quoteYamlValue: this.quoteYamlValue.bind(this),\r\n };\r\n\r\n let fileName: string;\r\n let content: string;\r\n\r\n if (!agent.isSubAgent) {\r\n // Root orchestrator agent\r\n fileName = `${this.sanitizeAgentName(analysis.repoName)}-root.agent.md`;\r\n content = buildRootAgentMd(\r\n analysis,\r\n `${this.sanitizeAgentName(analysis.repoName)}-root`,\r\n helpers,\r\n );\r\n } else {\r\n // Domain sub-agent\r\n fileName = `${this.sanitizeAgentName(agent.name)}.agent.md`;\r\n content = buildSubAgentMd(agent, analysis.skills, helpers);\r\n }\r\n\r\n const mdFile = path.join(agentsDir, fileName);\r\n const relativePath = `.github/agents/${fileName}`;\r\n\r\n if (!this.dryRun) {\r\n await fs.writeFile(mdFile, content, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n /**\r\n * Generate .github/copilot/handoffs.json with the delegation graph.\r\n */\r\n private async generateHandoffs(agents: AgentDefinition[]): Promise<string> {\r\n const copilotDir = path.join(this.rootPath, \".github\", \"copilot\");\r\n const handoffFile = path.join(copilotDir, \"handoffs.json\");\r\n const relativePath = \".github/copilot/handoffs.json\";\r\n\r\n const graph = buildHandoffGraph(agents);\r\n const content = serializeHandoffGraph(graph);\r\n\r\n if (!this.dryRun) {\r\n await fs.mkdir(copilotDir, { recursive: true });\r\n await fs.writeFile(handoffFile, content, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n /**\r\n * Sanitize a name for use as a filename.\r\n */\r\n private sanitizeAgentName(name: string): string {\r\n return name.toLowerCase().replace(/[^a-z0-9]/g, \"-\") || \"repo\";\r\n }\r\n\r\n // ---- Preserved v0.3 methods below (unchanged) ----\r\n\r\n private async generateSkill(skill: SkillDefinition, skillsDir: string): Promise<string> {\r\n const skillDir = path.join(skillsDir, skill.name);\r\n const skillFile = path.join(skillDir, \"SKILL.md\");\r\n const relativePath = `.github/skills/${skill.name}/SKILL.md`;\r\n\r\n const content = this.buildSkillMarkdown(skill);\r\n\r\n if (!this.dryRun) {\r\n await fs.mkdir(skillDir, { recursive: true });\r\n await fs.writeFile(skillFile, content, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n private buildSkillMarkdown(skill: SkillDefinition): string {\r\n const patterns = skill.patterns.length > 0\r\n ? skill.patterns.map((p) => `- ${p}`).join(\"\\n\")\r\n : \"- Patterns extracted from codebase analysis\";\r\n\r\n const examples = skill.examples.length > 0\r\n ? skill.examples.map((e) => `\\`\\`\\`\\n${e}\\n\\`\\`\\``).join(\"\\n\\n\")\r\n : \"See source files in the repository for examples.\";\r\n\r\n return `---\r\nname: ${this.quoteYamlValue(skill.name)}\r\ndescription: ${this.quoteYamlValue(skill.description)}\r\n---\r\n\r\n# ${this.toTitleCase(skill.name)}\r\n\r\n${skill.description}\r\n\r\n## When to Use\r\n\r\nUse this skill when:\r\n\r\n- Working with code in \\`${skill.sourceDir}/\\`\r\n${skill.triggers.map((t) => `- User mentions \"${t}\"`).join(\"\\n\")}\r\n\r\n## Patterns\r\n\r\n${patterns}\r\n\r\n## Examples\r\n\r\n${examples}\r\n\r\n## Category\r\n\r\n**${skill.category}** - ${this.getCategoryDescription(skill.category)}\r\n`;\r\n }\r\n\r\n /**\r\n * Quote a YAML value if it contains special characters\r\n */\r\n private quoteYamlValue(value: string): string {\r\n // Quote if contains: colon followed by space, leading/trailing whitespace,\r\n // or special YAML characters\r\n if (/[:#{}[\\]&*?|>!%@`]/.test(value) || value.startsWith(\"'\") || value.startsWith('\"')) {\r\n // Escape internal double quotes and wrap in double quotes\r\n return `\"${this.escapeYamlString(value)}\"`;\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Escape a string for use inside YAML double quotes\r\n */\r\n private escapeYamlString(value: string): string {\r\n return value\r\n .replace(/\\\\/g, \"\\\\\\\\\") // Escape backslashes first\r\n .replace(/\"/g, '\\\\\"'); // Escape double quotes\r\n }\r\n\r\n private getCategoryDescription(category: string): string {\r\n const descriptions: Record<string, string> = {\r\n architecture: \"Structural patterns and system design\",\r\n reliability: \"Error handling, recovery, and fault tolerance\",\r\n quality: \"Testing, validation, and code quality\",\r\n security: \"Authentication, authorization, and data protection\",\r\n patterns: \"Common code patterns and conventions\",\r\n };\r\n return descriptions[category] || \"General patterns\";\r\n }\r\n\r\n /**\r\n * Generate ONE main .agent.md file for the entire repo (v0.3 single-agent mode)\r\n * This is the VS Code custom agent format\r\n * @see https://code.visualstudio.com/docs/copilot/customization/custom-agents\r\n */\r\n private async generateMainAgent(analysis: AnalysisResult, agentsDir: string): Promise<string> {\r\n // Use repo name from analysis (not output directory)\r\n const agentName = analysis.repoName.toLowerCase().replace(/[^a-z0-9]/g, \"-\") || \"repo\";\r\n const mdFile = path.join(agentsDir, `${agentName}.agent.md`);\r\n const relativePath = `.github/agents/${agentName}.agent.md`;\r\n\r\n const content = this.buildMainAgentMd(analysis, agentName);\r\n\r\n if (!this.dryRun) {\r\n await fs.writeFile(mdFile, content, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n /**\r\n * Build the main .agent.md content (v0.3 single-agent mode)\r\n * Single agent that knows about all skills in the repo\r\n */\r\n private buildMainAgentMd(analysis: AnalysisResult, agentName: string): string {\r\n // Get root agent info if available\r\n const rootAgent = analysis.agents.find(a => !a.isSubAgent);\r\n const description = rootAgent?.description || analysis.summary || \"AI assistant for this repository\";\r\n\r\n // Collect all tools from all agents\r\n const allTools = new Set<string>();\r\n for (const agent of analysis.agents) {\r\n for (const tool of agent.tools) {\r\n allTools.add(tool.command);\r\n }\r\n }\r\n\r\n // VS Code built-in tools - comprehensive set for full agent capability\r\n const vsCodeTools = [\r\n \"codebase\", // Semantic code search\r\n \"textSearch\", // Find text in files\r\n \"fileSearch\", // Search files by glob\r\n \"readFile\", // Read file content\r\n \"listDirectory\", // List directory contents\r\n \"usages\", // Find references/implementations\r\n \"problems\", // Workspace issues\r\n \"fetch\", // Fetch web pages\r\n \"githubRepo\", // Search GitHub repos\r\n \"editFiles\", // Apply edits to files\r\n \"createFile\", // Create new files\r\n \"createDirectory\", // Create directories\r\n \"runInTerminal\", // Run shell commands\r\n \"terminalLastCommand\", // Get last terminal output\r\n \"changes\", // Source control changes\r\n ];\r\n\r\n const toolsList = `tools: [${vsCodeTools.map(t => `'${t}'`).join(\", \")}]`;\r\n\r\n // Build skills section - link to all generated skills\r\n const skillsSection = analysis.skills.length > 0\r\n ? analysis.skills.map(s => `- [${this.toTitleCase(s.name)}](../skills/${s.name}/SKILL.md): ${s.description}`).join(\"\\n\")\r\n : \"No specific skills documented yet.\";\r\n\r\n // Build commands section from detected tools\r\n const commandsSection = allTools.size > 0\r\n ? Array.from(allTools).map(cmd => `- \\`${cmd}\\``).join(\"\\n\")\r\n : \"- `npm install` / `pip install` / `go build` (as appropriate)\";\r\n\r\n return `---\r\nname: ${this.toTitleCase(agentName)}\r\ndescription: ${this.quoteYamlValue(description)}\r\n${toolsList}\r\n---\r\n\r\n# ${this.toTitleCase(agentName)} Agent\r\n\r\n${description}\r\n\r\n## Skills\r\n\r\nThis agent has knowledge of the following patterns and conventions:\r\n\r\n${skillsSection}\r\n\r\n## Commands\r\n\r\nCommon commands for this repository:\r\n\r\n${commandsSection}\r\n\r\n## Instructions\r\n\r\nYou are an AI assistant specialized in this codebase. When working on tasks:\r\n\r\n1. Use \\`#codebase\\` to search for relevant code patterns\r\n2. Reference the skills above to follow established conventions\r\n3. Use \\`#textSearch\\` to find specific implementations\r\n4. Use \\`#editFiles\\` to make changes that follow detected patterns\r\n5. Use \\`#runInTerminal\\` to execute build, test, and lint commands\r\n6. Check \\`#problems\\` to ensure changes don't introduce errors\r\n\r\nAlways follow the patterns documented in the linked skills when making changes.\r\n`;\r\n }\r\n\r\n /**\r\n * Generate .github/copilot-instructions.md\r\n * Supports idempotent re-generation by preserving content outside managed markers.\r\n */\r\n private async generateCopilotInstructions(analysis: AnalysisResult): Promise<string> {\r\n const githubDir = path.join(this.rootPath, \".github\");\r\n const filePath = path.join(githubDir, \"copilot-instructions.md\");\r\n const relativePath = \".github/copilot-instructions.md\";\r\n\r\n const managedBlock = buildCopilotInstructions(analysis);\r\n\r\n let finalContent = managedBlock;\r\n\r\n if (!this.dryRun) {\r\n await fs.mkdir(githubDir, { recursive: true });\r\n\r\n // Check for existing file to preserve user content outside markers\r\n try {\r\n const existing = await fs.readFile(filePath, \"utf-8\");\r\n finalContent = mergeWithExisting(existing, managedBlock);\r\n } catch {\r\n // File doesn't exist yet - use managed block as-is\r\n }\r\n\r\n await fs.writeFile(filePath, finalContent, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n private async generateHook(hook: HookDefinition, hooksDir: string): Promise<string> {\r\n const hookFile = path.join(hooksDir, `${hook.name}.yaml`);\r\n const relativePath = `.github/hooks/${hook.name}.yaml`;\r\n\r\n const content = this.buildHookYaml(hook);\r\n\r\n if (!this.dryRun) {\r\n await fs.writeFile(hookFile, content, \"utf-8\");\r\n }\r\n\r\n return relativePath;\r\n }\r\n\r\n private buildHookYaml(hook: HookDefinition): string {\r\n const commandsList = hook.commands.map((c) => ` - \"${c}\"`).join(\"\\n\");\r\n\r\n let content = `# Hook Configuration\r\n# Generated by Agent Smith\r\n# \"Never send a human to do a machine's job.\"\r\n\r\nname: ${hook.name}\r\nevent: ${hook.event}\r\ndescription: ${hook.description}\r\n\r\n# Commands to execute\r\ncommands:\r\n${commandsList}\r\n`;\r\n\r\n if (hook.condition) {\r\n content += `\\n# Condition for hook execution\\ncondition: \"${hook.condition}\"\\n`;\r\n }\r\n\r\n return content;\r\n }\r\n\r\n private toTitleCase(str: string | unknown): string {\r\n // Handle non-string inputs (objects, undefined, etc.)\r\n if (typeof str !== \"string\") {\r\n if (str && typeof str === \"object\" && \"name\" in str) {\r\n str = (str as { name: string }).name;\r\n } else {\r\n str = String(str ?? \"unknown\");\r\n }\r\n }\r\n return (str as string)\r\n .split(\"-\")\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(\" \");\r\n }\r\n}\r\n","/**\r\n * Instructions Writer - Copilot Instructions Generator\r\n * Generates .github/copilot-instructions.md from analysis results.\r\n * \"I'd like to share a revelation that I've had...\"\r\n */\r\n\r\nimport type { AnalysisResult, SkillDefinition, ToolDefinition } from \"../analyzer/types.js\";\r\n\r\nconst MANAGED_START = \"<!-- agentsmith:managed -->\";\r\nconst MANAGED_END = \"<!-- /agentsmith:managed -->\";\r\n\r\n/**\r\n * Build the managed copilot-instructions.md content from analysis results.\r\n * Kept factual - all data derived from the AnalysisResult, nothing hallucinated.\r\n */\r\nexport function buildCopilotInstructions(analysis: AnalysisResult): string {\r\n const sections: string[] = [];\r\n\r\n sections.push(MANAGED_START);\r\n sections.push(\"# Copilot Instructions\");\r\n sections.push(\"\");\r\n\r\n // 1. Project identity\r\n if (analysis.summary) {\r\n sections.push(analysis.summary);\r\n sections.push(\"\");\r\n }\r\n\r\n // 2. Language & Framework\r\n sections.push(\"## Language & Framework\");\r\n sections.push(\"\");\r\n const language = analysis.repo?.language || detectLanguageFromSkills(analysis.skills);\r\n const framework = analysis.repo?.framework || null;\r\n sections.push(`- **Language:** ${language || \"Not detected\"}`);\r\n sections.push(`- **Framework:** ${framework || \"None detected\"}`);\r\n sections.push(\"\");\r\n\r\n // 3. Coding Conventions (derived from skill patterns)\r\n const conventions = collectConventions(analysis.skills);\r\n if (conventions.length > 0) {\r\n sections.push(\"## Coding Conventions\");\r\n sections.push(\"\");\r\n for (const convention of conventions) {\r\n sections.push(`- ${convention}`);\r\n }\r\n sections.push(\"\");\r\n }\r\n\r\n // 4. Project Structure (from skills' sourceDirs)\r\n const structureEntries = collectStructure(analysis.skills);\r\n if (structureEntries.length > 0) {\r\n sections.push(\"## Project Structure\");\r\n sections.push(\"\");\r\n for (const entry of structureEntries) {\r\n sections.push(`- \\`${entry.dir}/\\` -- ${entry.description}`);\r\n }\r\n sections.push(\"\");\r\n }\r\n\r\n // 5. Testing conventions\r\n const testingInfo = collectTestingInfo(analysis.skills, analysis.tools);\r\n if (testingInfo.length > 0) {\r\n sections.push(\"## Testing\");\r\n sections.push(\"\");\r\n for (const info of testingInfo) {\r\n sections.push(`- ${info}`);\r\n }\r\n sections.push(\"\");\r\n }\r\n\r\n // 6. Build & Tools\r\n const toolEntries = collectToolInfo(analysis.tools);\r\n if (toolEntries.length > 0) {\r\n sections.push(\"## Build & Tools\");\r\n sections.push(\"\");\r\n for (const tool of toolEntries) {\r\n sections.push(`- \\`${tool.command}\\` -- ${tool.description}`);\r\n }\r\n sections.push(\"\");\r\n }\r\n\r\n sections.push(MANAGED_END);\r\n\r\n return sections.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Merge managed content into an existing file, preserving user content\r\n * outside the agentsmith:managed markers.\r\n */\r\nexport function mergeWithExisting(existingContent: string, managedBlock: string): string {\r\n const startIdx = existingContent.indexOf(MANAGED_START);\r\n const endIdx = existingContent.indexOf(MANAGED_END);\r\n\r\n if (startIdx !== -1 && endIdx !== -1) {\r\n // Replace content between markers (inclusive of markers)\r\n const before = existingContent.slice(0, startIdx);\r\n const after = existingContent.slice(endIdx + MANAGED_END.length);\r\n return before + managedBlock + after;\r\n }\r\n\r\n // No markers found - prepend managed block, keep existing content after\r\n return managedBlock + \"\\n\\n\" + existingContent;\r\n}\r\n\r\n// --- Internal helpers ---\r\n\r\nfunction detectLanguageFromSkills(skills: SkillDefinition[]): string {\r\n for (const skill of skills) {\r\n for (const pattern of skill.patterns) {\r\n const lower = pattern.toLowerCase();\r\n if (lower.includes(\"typescript\") || lower.includes(\".ts\")) return \"TypeScript\";\r\n if (lower.includes(\"python\") || lower.includes(\".py\")) return \"Python\";\r\n if (lower.includes(\"javascript\") || lower.includes(\".js\")) return \"JavaScript\";\r\n if (lower.includes(\"golang\") || lower.includes(\".go\")) return \"Go\";\r\n if (lower.includes(\"rust\") || lower.includes(\".rs\")) return \"Rust\";\r\n }\r\n }\r\n return \"Not detected\";\r\n}\r\n\r\nfunction collectConventions(skills: SkillDefinition[]): string[] {\r\n const conventions: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const skill of skills) {\r\n for (const pattern of skill.patterns) {\r\n // Deduplicate and limit total\r\n if (!seen.has(pattern) && conventions.length < 15) {\r\n seen.add(pattern);\r\n conventions.push(pattern);\r\n }\r\n }\r\n }\r\n\r\n return conventions;\r\n}\r\n\r\ninterface StructureEntry {\r\n dir: string;\r\n description: string;\r\n}\r\n\r\nfunction collectStructure(skills: SkillDefinition[]): StructureEntry[] {\r\n const seen = new Set<string>();\r\n const entries: StructureEntry[] = [];\r\n\r\n for (const skill of skills) {\r\n const dir = skill.sourceDir;\r\n if (dir && !seen.has(dir)) {\r\n seen.add(dir);\r\n entries.push({ dir, description: skill.description });\r\n }\r\n }\r\n\r\n return entries;\r\n}\r\n\r\nfunction collectTestingInfo(skills: SkillDefinition[], tools: ToolDefinition[]): string[] {\r\n const info: string[] = [];\r\n\r\n // Check tools for test commands\r\n for (const tool of tools) {\r\n const cmd = tool.command.toLowerCase();\r\n if (cmd.includes(\"test\") || cmd.includes(\"jest\") || cmd.includes(\"vitest\") || cmd.includes(\"pytest\")) {\r\n info.push(`Run tests: \\`${tool.command}\\``);\r\n }\r\n }\r\n\r\n // Check skills for testing patterns\r\n for (const skill of skills) {\r\n if (skill.category === \"quality\" || skill.name.includes(\"test\")) {\r\n for (const pattern of skill.patterns) {\r\n if (info.length < 8) {\r\n info.push(pattern);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return info;\r\n}\r\n\r\nfunction collectToolInfo(tools: ToolDefinition[]): ToolDefinition[] {\r\n // Return all detected tools, deduplicated by command\r\n const seen = new Set<string>();\r\n const result: ToolDefinition[] = [];\r\n\r\n for (const tool of tools) {\r\n if (!seen.has(tool.command)) {\r\n seen.add(tool.command);\r\n result.push(tool);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * Agent Writer - Multi-Agent Constellation Builder\r\n * Builds .agent.md content for root orchestrator and domain-specific sub-agents.\r\n * \"More of me...\"\r\n */\r\n\r\nimport type { AgentDefinition, SkillDefinition, AnalysisResult } from \"../analyzer/types.js\";\r\n\r\n/**\r\n * VS Code built-in tools available to agents.\r\n * Root agents additionally get `runSubagent` for delegation.\r\n */\r\nconst BASE_TOOLS = [\r\n \"codebase\",\r\n \"textSearch\",\r\n \"fileSearch\",\r\n \"readFile\",\r\n \"listDirectory\",\r\n \"usages\",\r\n \"problems\",\r\n \"fetch\",\r\n \"githubRepo\",\r\n \"editFiles\",\r\n \"createFile\",\r\n \"createDirectory\",\r\n \"runInTerminal\",\r\n \"terminalLastCommand\",\r\n \"changes\",\r\n];\r\n\r\n/**\r\n * Build the .agent.md content for a root orchestrator agent.\r\n * Includes `runSubagent` in tools and delegation instructions for each sub-agent.\r\n */\r\nexport function buildRootAgentMd(\r\n analysis: AnalysisResult,\r\n agentName: string,\r\n helpers: { toTitleCase: (s: string | unknown) => string; quoteYamlValue: (s: string) => string },\r\n): string {\r\n const rootAgent = analysis.agents.find(a => !a.isSubAgent);\r\n const description = rootAgent?.description || analysis.summary || \"Primary orchestrator for this repository\";\r\n\r\n const subAgents = analysis.agents.filter(a => a.isSubAgent);\r\n\r\n // Root agent gets runSubagent for delegation\r\n const tools = [...BASE_TOOLS, \"runSubagent\"];\r\n const toolsList = `tools: [${tools.map(t => `'${t}'`).join(\", \")}]`;\r\n\r\n // Build skills section\r\n const skillsSection = analysis.skills.length > 0\r\n ? analysis.skills.map(s =>\r\n `- [${helpers.toTitleCase(s.name)}](../skills/${s.name}/SKILL.md): ${s.description}`\r\n ).join(\"\\n\")\r\n : \"No specific skills documented yet.\";\r\n\r\n // Build delegation section\r\n let delegationSection = \"\";\r\n if (subAgents.length > 0) {\r\n const delegationEntries = subAgents.map(sa => {\r\n const triggerList = sa.triggers.length > 0 ? sa.triggers.join(\", \") : \"general\";\r\n return `- **@${sa.name}** — ${sa.description}. Triggers: ${triggerList}`;\r\n }).join(\"\\n\");\r\n\r\n delegationSection = `## Agent Delegation\r\n\r\nThis agent coordinates work across specialized sub-agents:\r\n\r\n${delegationEntries}\r\n\r\nWhen asked about these domains, use \\`runSubagent\\` to delegate to the appropriate specialist.\r\n\r\n`;\r\n }\r\n\r\n // Collect commands from all agents\r\n const allTools = new Set<string>();\r\n for (const agent of analysis.agents) {\r\n for (const tool of agent.tools) {\r\n allTools.add(tool.command);\r\n }\r\n }\r\n\r\n const commandsSection = allTools.size > 0\r\n ? Array.from(allTools).map(cmd => `- \\`${cmd}\\``).join(\"\\n\")\r\n : \"- `npm install` / `pip install` / `go build` (as appropriate)\";\r\n\r\n return `---\r\nname: ${helpers.toTitleCase(agentName)}\r\ndescription: ${helpers.quoteYamlValue(description)}\r\n${toolsList}\r\n---\r\n\r\n# ${helpers.toTitleCase(agentName)} Agent\r\n\r\n${description}\r\n\r\n${delegationSection}## Skills\r\n\r\nThis agent has knowledge of the following patterns and conventions:\r\n\r\n${skillsSection}\r\n\r\n## Commands\r\n\r\nCommon commands for this repository:\r\n\r\n${commandsSection}\r\n\r\n## Instructions\r\n\r\nYou are the primary orchestrator for this codebase. When working on tasks:\r\n\r\n1. Use \\`#codebase\\` to search for relevant code patterns\r\n2. Reference the skills above to follow established conventions\r\n3. Use \\`#textSearch\\` to find specific implementations\r\n4. Use \\`#editFiles\\` to make changes that follow detected patterns\r\n5. Use \\`#runInTerminal\\` to execute build, test, and lint commands\r\n6. Check \\`#problems\\` to ensure changes don't introduce errors\r\n${subAgents.length > 0 ? \"7. Use `runSubagent` to delegate domain-specific work to specialist agents\\n\" : \"\"}\r\nAlways follow the patterns documented in the linked skills when making changes.\r\n`;\r\n}\r\n\r\n/**\r\n * Build the .agent.md content for a domain-specific sub-agent.\r\n * Sub-agents do NOT get `runSubagent` — they are leaf specialists.\r\n */\r\nexport function buildSubAgentMd(\r\n agent: AgentDefinition,\r\n skills: SkillDefinition[],\r\n helpers: { toTitleCase: (s: string | unknown) => string; quoteYamlValue: (s: string) => string },\r\n): string {\r\n const toolsList = `tools: [${BASE_TOOLS.map(t => `'${t}'`).join(\", \")}]`;\r\n\r\n // Filter skills relevant to this agent\r\n const relevantSkills = skills.filter(s => agent.skills.includes(s.name));\r\n\r\n const skillsSection = relevantSkills.length > 0\r\n ? relevantSkills.map(s =>\r\n `- [${helpers.toTitleCase(s.name)}](../skills/${s.name}/SKILL.md): ${s.description}`\r\n ).join(\"\\n\")\r\n : \"No specific skills documented yet.\";\r\n\r\n // Collect commands from this agent's tools\r\n const commandsSection = agent.tools.length > 0\r\n ? agent.tools.map(t => `- \\`${t.command}\\``).join(\"\\n\")\r\n : \"- See root agent for repository commands\";\r\n\r\n const sourceHint = agent.sourceDir\r\n ? `Focus on files in \\`${agent.sourceDir}/\\`.`\r\n : \"\";\r\n\r\n return `---\r\nname: ${helpers.toTitleCase(agent.name)}\r\ndescription: ${helpers.quoteYamlValue(agent.description)}\r\n${toolsList}\r\n---\r\n\r\n# ${helpers.toTitleCase(agent.name)} Agent\r\n\r\nSpecialist agent for the ${agent.name} domain.\r\n\r\n${agent.description}\r\n\r\n## Skills\r\n\r\n${skillsSection}\r\n\r\n## Commands\r\n\r\n${commandsSection}\r\n\r\n## Instructions\r\n\r\nYou are a specialist in the ${agent.name} domain of this codebase.\r\n${sourceHint}\r\n\r\nWhen working on tasks:\r\n\r\n1. Use \\`#codebase\\` to search for relevant code patterns in your domain\r\n2. Reference the skills above to follow established conventions\r\n3. Use \\`#textSearch\\` to find specific implementations\r\n4. Use \\`#editFiles\\` to make changes that follow detected patterns\r\n5. Use \\`#runInTerminal\\` to execute build, test, and lint commands\r\n6. Check \\`#problems\\` to ensure changes don't introduce errors\r\n\r\nAlways follow the patterns documented in the linked skills when making changes.\r\n`;\r\n}\r\n","/**\r\n * Handoff Writer - Agent Delegation Graph\r\n * Generates handoffs.json that maps agent-to-agent delegation triggers.\r\n * \"I'd like to share a revelation that I've had...\"\r\n */\r\n\r\nimport type { AgentDefinition } from \"../analyzer/types.js\";\r\n\r\n/**\r\n * A single handoff entry describing delegation from one agent to another.\r\n */\r\nexport interface HandoffEntry {\r\n from: string;\r\n to: string;\r\n triggers: string[];\r\n}\r\n\r\n/**\r\n * The full handoff graph structure written to handoffs.json.\r\n */\r\nexport interface HandoffGraph {\r\n handoffs: HandoffEntry[];\r\n}\r\n\r\n/**\r\n * Build the handoff delegation graph from the agent hierarchy.\r\n *\r\n * For each sub-agent, creates a handoff entry from its parent agent.\r\n * If the sub-agent has no explicit parentAgent, defaults to \"repo-root\".\r\n * Triggers come from the agent's triggers array.\r\n */\r\nexport function buildHandoffGraph(agents: AgentDefinition[]): HandoffGraph {\r\n const subAgents = agents.filter(a => a.isSubAgent);\r\n\r\n const handoffs: HandoffEntry[] = subAgents.map(agent => {\r\n // Determine the parent: use explicit parentAgent or default to repo-root\r\n const from = agent.parentAgent || \"repo-root\";\r\n\r\n return {\r\n from,\r\n to: agent.name,\r\n triggers: agent.triggers.length > 0 ? [...agent.triggers] : [agent.name],\r\n };\r\n });\r\n\r\n return { handoffs };\r\n}\r\n\r\n/**\r\n * Serialize the handoff graph to a formatted JSON string.\r\n */\r\nexport function serializeHandoffGraph(graph: HandoffGraph): string {\r\n return JSON.stringify(graph, null, 2) + \"\\n\";\r\n}\r\n","/**\r\n * Registry - Skills & Agents Database\r\n * Builds and searches the JSONL index.\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport type { SkillDefinition, AgentDefinition } from \"../analyzer/index.js\";\r\n\r\nexport interface RegistryEntry {\r\n type: \"skill\" | \"agent\";\r\n name: string;\r\n file: string;\r\n vsCodeAgent?: string; // VS Code .agent.md file path\r\n description: string;\r\n category?: string;\r\n triggers: string[];\r\n parentAgent?: string;\r\n subAgents?: string[];\r\n isSubAgent?: boolean;\r\n}\r\n\r\nexport class Registry {\r\n private rootPath: string;\r\n private dryRun: boolean;\r\n private registryPath: string;\r\n\r\n constructor(rootPath: string, dryRun = false) {\r\n this.rootPath = rootPath;\r\n this.dryRun = dryRun;\r\n this.registryPath = path.join(rootPath, \"skills-registry.jsonl\");\r\n }\r\n\r\n async build(skills: SkillDefinition[], agents?: AgentDefinition[]): Promise<void> {\r\n const entries: RegistryEntry[] = [];\r\n \r\n // Add skill entries\r\n for (const skill of skills) {\r\n entries.push({\r\n type: \"skill\",\r\n name: skill.name,\r\n file: `.github/skills/${skill.name}/SKILL.md`,\r\n description: skill.description,\r\n category: skill.category,\r\n triggers: skill.triggers,\r\n });\r\n }\r\n\r\n // Add agent entries\r\n if (agents) {\r\n for (const agent of agents) {\r\n entries.push({\r\n type: \"agent\",\r\n name: agent.name,\r\n file: `.github/agents/${agent.name}.agent.md`,\r\n vsCodeAgent: `.github/agents/${agent.name}.agent.md`,\r\n description: agent.description,\r\n triggers: agent.triggers,\r\n isSubAgent: agent.isSubAgent,\r\n parentAgent: agent.parentAgent,\r\n subAgents: agent.subAgents,\r\n });\r\n }\r\n }\r\n\r\n const content = entries.map((e) => JSON.stringify(e)).join(\"\\n\") + \"\\n\";\r\n\r\n if (!this.dryRun) {\r\n await fs.writeFile(this.registryPath, content, \"utf-8\");\r\n }\r\n }\r\n\r\n async search(query: string, options?: { type?: \"skill\" | \"agent\"; limit?: number }): Promise<RegistryEntry[]> {\r\n const limit = options?.limit ?? 10;\r\n const typeFilter = options?.type;\r\n \r\n try {\r\n const content = await fs.readFile(this.registryPath, \"utf-8\");\r\n const lines = content.trim().split(\"\\n\").filter(Boolean);\r\n\r\n let entries: RegistryEntry[] = lines.map((line) => JSON.parse(line));\r\n \r\n // Filter by type if specified\r\n if (typeFilter) {\r\n entries = entries.filter((e) => e.type === typeFilter);\r\n }\r\n \r\n const queryLower = query.toLowerCase();\r\n\r\n // Score each entry by relevance\r\n const scored = entries.map((entry) => {\r\n let score = 0;\r\n\r\n // Exact name match\r\n if (entry.name.toLowerCase() === queryLower) score += 100;\r\n\r\n // Name contains query\r\n if (entry.name.toLowerCase().includes(queryLower)) score += 50;\r\n\r\n // Description contains query\r\n if (entry.description.toLowerCase().includes(queryLower)) score += 30;\r\n\r\n // Triggers contain query\r\n for (const trigger of entry.triggers) {\r\n if (trigger.toLowerCase().includes(queryLower)) score += 20;\r\n if (trigger.toLowerCase() === queryLower) score += 40;\r\n }\r\n\r\n // Category matches (skills only)\r\n if (entry.category?.toLowerCase().includes(queryLower)) score += 10;\r\n\r\n // Boost root agents\r\n if (entry.type === \"agent\" && !entry.isSubAgent) score += 5;\r\n\r\n return { entry, score };\r\n });\r\n\r\n // Filter and sort by score\r\n return scored\r\n .filter((s) => s.score > 0)\r\n .sort((a, b) => b.score - a.score)\r\n .slice(0, limit)\r\n .map((s) => s.entry);\r\n } catch (error) {\r\n // Registry doesn't exist or is empty\r\n return [];\r\n }\r\n }\r\n\r\n async list(): Promise<RegistryEntry[]> {\r\n try {\r\n const content = await fs.readFile(this.registryPath, \"utf-8\");\r\n const lines = content.trim().split(\"\\n\").filter(Boolean);\r\n return lines.map((line) => JSON.parse(line));\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async get(name: string): Promise<RegistryEntry | null> {\r\n const entries = await this.list();\r\n return entries.find((e) => e.name === name) || null;\r\n }\r\n}\r\n","/**\r\n * HookRunner - The Enforcer\r\n * Executes lifecycle hooks at the right moments.\r\n * \"Never send a human to do a machine's job.\"\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport { execSync } from \"child_process\";\r\nimport yaml from \"yaml\";\r\nimport chalk from \"chalk\";\r\nimport type { HookDefinition } from \"../analyzer/index.js\";\r\n\r\nexport type HookEvent = \"pre-commit\" | \"post-commit\" | \"pre-push\" | \"pre-analyze\" | \"post-generate\";\r\n\r\nexport interface HookResult {\r\n hook: string;\r\n success: boolean;\r\n output?: string;\r\n error?: string;\r\n}\r\n\r\nexport class HookRunner {\r\n private rootPath: string;\r\n private verbose: boolean;\r\n\r\n constructor(rootPath: string, verbose = false) {\r\n this.rootPath = rootPath;\r\n this.verbose = verbose;\r\n }\r\n\r\n /**\r\n * Execute all hooks for a given event\r\n */\r\n async execute(event: HookEvent): Promise<HookResult[]> {\r\n const hooks = await this.loadHooks(event);\r\n const results: HookResult[] = [];\r\n\r\n if (hooks.length === 0) {\r\n if (this.verbose) {\r\n console.log(chalk.gray(` No ${event} hooks found.`));\r\n }\r\n return results;\r\n }\r\n\r\n console.log(chalk.green(`\\n[HOOKS]`), `Running ${event} hooks...`);\r\n\r\n for (const hook of hooks) {\r\n const result = await this.runHook(hook);\r\n results.push(result);\r\n\r\n if (!result.success) {\r\n console.log(chalk.red(` ✗ ${hook.name}: ${result.error}`));\r\n // Stop on first failure\r\n break;\r\n } else {\r\n console.log(chalk.green(` ✓ ${hook.name}`));\r\n if (this.verbose && result.output) {\r\n console.log(chalk.gray(` ${result.output.split(\"\\n\").join(\"\\n \")}`));\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Load hooks from .github/hooks/ directory for a specific event\r\n */\r\n private async loadHooks(event: HookEvent): Promise<HookDefinition[]> {\r\n const hooksDir = path.join(this.rootPath, \".github\", \"hooks\");\r\n const hooks: HookDefinition[] = [];\r\n\r\n try {\r\n const files = await fs.readdir(hooksDir);\r\n\r\n for (const file of files) {\r\n if (!file.endsWith(\".yaml\") && !file.endsWith(\".yml\")) continue;\r\n\r\n const hookPath = path.join(hooksDir, file);\r\n const content = await fs.readFile(hookPath, \"utf-8\");\r\n const hookDef = yaml.parse(content) as HookDefinition;\r\n\r\n if (hookDef.event === event) {\r\n hooks.push(hookDef);\r\n }\r\n }\r\n } catch (error) {\r\n // No hooks directory or can't read - that's fine\r\n if (this.verbose) {\r\n console.log(chalk.gray(` No hooks directory found at ${hooksDir}`));\r\n }\r\n }\r\n\r\n return hooks;\r\n }\r\n\r\n /**\r\n * Run a single hook and return the result\r\n */\r\n private async runHook(hook: HookDefinition): Promise<HookResult> {\r\n const outputs: string[] = [];\r\n\r\n for (const command of hook.commands) {\r\n try {\r\n // Check condition if present\r\n if (hook.condition) {\r\n const conditionMet = await this.evaluateCondition(hook.condition);\r\n if (!conditionMet) {\r\n return {\r\n hook: hook.name,\r\n success: true,\r\n output: \"Skipped: condition not met\",\r\n };\r\n }\r\n }\r\n\r\n if (this.verbose) {\r\n console.log(chalk.gray(` Running: ${command}`));\r\n }\r\n\r\n const output = execSync(command, {\r\n cwd: this.rootPath,\r\n encoding: \"utf-8\",\r\n stdio: this.verbose ? \"pipe\" : \"pipe\",\r\n timeout: 120000, // 2 minute timeout per command\r\n });\r\n\r\n outputs.push(output.trim());\r\n } catch (error) {\r\n const err = error as { message?: string; stderr?: string };\r\n return {\r\n hook: hook.name,\r\n success: false,\r\n error: err.stderr || err.message || \"Command failed\",\r\n };\r\n }\r\n }\r\n\r\n return {\r\n hook: hook.name,\r\n success: true,\r\n output: outputs.join(\"\\n\"),\r\n };\r\n }\r\n\r\n /**\r\n * Evaluate a condition string (simple file/command checks)\r\n */\r\n private async evaluateCondition(condition: string): Promise<boolean> {\r\n // Support simple conditions like \"file:package.json\" or \"command:npm --version\"\r\n if (condition.startsWith(\"file:\")) {\r\n const filePath = path.join(this.rootPath, condition.slice(5));\r\n try {\r\n await fs.access(filePath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n if (condition.startsWith(\"command:\")) {\r\n try {\r\n execSync(condition.slice(8), { encoding: \"utf-8\", stdio: \"pipe\" });\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // Default: treat as truthy\r\n return true;\r\n }\r\n}\r\n","/**\r\n * Search Command\r\n * Query the skills and agents registry\r\n */\r\n\r\nimport chalk from \"chalk\";\r\nimport path from \"path\";\r\nimport { Registry } from \"../registry/index.js\";\r\n\r\ninterface SearchOptions {\r\n limit?: string;\r\n type?: \"skill\" | \"agent\";\r\n}\r\n\r\nexport async function searchCommand(query: string, options: SearchOptions): Promise<void> {\r\n const limit = parseInt(options.limit || \"10\", 10);\r\n const cwd = process.cwd();\r\n\r\n const registry = new Registry(cwd);\r\n const results = await registry.search(query, { type: options.type, limit });\r\n\r\n if (results.length === 0) {\r\n const typeLabel = options.type ? `${options.type}s` : \"entries\";\r\n console.log(chalk.yellow(`No ${typeLabel} found matching \"${query}\"`));\r\n return;\r\n }\r\n\r\n console.log(\r\n chalk.white(\"\\n┌────────┬─────────────────┬──────────────────────────────────────────────────┐\")\r\n );\r\n console.log(\r\n chalk.white(\"│ Type │ Name │ Description │\")\r\n );\r\n console.log(\r\n chalk.white(\"├────────┼─────────────────┼──────────────────────────────────────────────────┤\")\r\n );\r\n\r\n for (const result of results) {\r\n const type = (result.type || \"skill\").padEnd(6).slice(0, 6);\r\n const name = result.name.padEnd(15).slice(0, 15);\r\n const desc = result.description.slice(0, 48).padEnd(48);\r\n const typeColor = result.type === \"agent\" ? chalk.cyan : chalk.magenta;\r\n console.log(chalk.white(`│ ${typeColor(type)} │ ${name} │ ${desc} │`));\r\n }\r\n\r\n console.log(\r\n chalk.white(\"└────────┴─────────────────┴──────────────────────────────────────────────────┘\\n\")\r\n );\r\n}\r\n","/**\r\n * Validate Command\r\n * \"I'm going to enjoy watching you die, Mr. Anderson.\"\r\n * (Validates agent assets with ruthless precision)\r\n */\r\n\r\nimport fs from \"fs/promises\";\r\nimport path from \"path\";\r\nimport chalk from \"chalk\";\r\nimport yaml from \"yaml\";\r\n\r\ninterface ValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n}\r\n\r\ninterface ValidateOptions {\r\n verbose?: boolean;\r\n}\r\n\r\nexport async function validateCommand(\r\n targetPath: string = \".\",\r\n options: ValidateOptions = {}\r\n): Promise<void> {\r\n const rootPath = path.resolve(targetPath);\r\n const result: ValidationResult = { valid: true, errors: [], warnings: [] };\r\n\r\n console.log(chalk.green(\"\\n[VALIDATE]\"), \"Checking agent assets...\\n\");\r\n\r\n // Validate skills\r\n await validateSkills(rootPath, result, options.verbose);\r\n\r\n // Validate agents\r\n await validateAgents(rootPath, result, options.verbose);\r\n\r\n // Validate hooks\r\n await validateHooks(rootPath, result, options.verbose);\r\n\r\n // Validate registry\r\n await validateRegistry(rootPath, result, options.verbose);\r\n\r\n // Summary\r\n console.log(\"\");\r\n if (result.errors.length > 0) {\r\n console.log(chalk.red(`\\n✗ Validation failed with ${result.errors.length} error(s):`));\r\n for (const error of result.errors) {\r\n console.log(chalk.red(` • ${error}`));\r\n }\r\n }\r\n\r\n if (result.warnings.length > 0) {\r\n console.log(chalk.yellow(`\\n⚠ ${result.warnings.length} warning(s):`));\r\n for (const warning of result.warnings) {\r\n console.log(chalk.yellow(` • ${warning}`));\r\n }\r\n }\r\n\r\n if (result.valid) {\r\n console.log(chalk.green(\"\\n✓ All agent assets are valid.\"));\r\n } else {\r\n process.exitCode = 1;\r\n }\r\n}\r\n\r\nasync function validateSkills(\r\n rootPath: string,\r\n result: ValidationResult,\r\n verbose?: boolean\r\n): Promise<void> {\r\n const skillsDir = path.join(rootPath, \".github\", \"skills\");\r\n\r\n try {\r\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\r\n const skillDirs = entries.filter((e) => e.isDirectory());\r\n\r\n if (skillDirs.length === 0) {\r\n result.warnings.push(\"No skills found in .github/skills/\");\r\n return;\r\n }\r\n\r\n for (const dir of skillDirs) {\r\n const skillFile = path.join(skillsDir, dir.name, \"SKILL.md\");\r\n\r\n try {\r\n const content = await fs.readFile(skillFile, \"utf-8\");\r\n\r\n // Check for required frontmatter\r\n if (!content.startsWith(\"---\")) {\r\n result.errors.push(`${dir.name}/SKILL.md: Missing YAML frontmatter`);\r\n result.valid = false;\r\n continue;\r\n }\r\n\r\n // Extract and validate frontmatter\r\n const frontmatterEnd = content.indexOf(\"---\", 3);\r\n if (frontmatterEnd === -1) {\r\n result.errors.push(`${dir.name}/SKILL.md: Malformed YAML frontmatter`);\r\n result.valid = false;\r\n continue;\r\n }\r\n\r\n const frontmatter = content.slice(4, frontmatterEnd).trim();\r\n const meta = yaml.parse(frontmatter);\r\n\r\n if (!meta.name) {\r\n result.errors.push(`${dir.name}/SKILL.md: Missing 'name' in frontmatter`);\r\n result.valid = false;\r\n }\r\n\r\n if (!meta.description) {\r\n result.warnings.push(`${dir.name}/SKILL.md: Missing 'description' in frontmatter`);\r\n }\r\n\r\n if (verbose) {\r\n console.log(chalk.green(` ✓ skills/${dir.name}/SKILL.md`));\r\n }\r\n } catch (e) {\r\n const err = e as NodeJS.ErrnoException;\r\n result.errors.push(`${dir.name}: ${err.code === \"ENOENT\" ? \"Missing SKILL.md file\" : err.message}`);\r\n result.valid = false;\r\n }\r\n }\r\n\r\n if (!verbose) {\r\n console.log(chalk.gray(` Validated ${skillDirs.length} skill(s)`));\r\n }\r\n } catch {\r\n result.warnings.push(\"No .github/skills/ directory found\");\r\n }\r\n}\r\n\r\nasync function validateAgents(\r\n rootPath: string,\r\n result: ValidationResult,\r\n verbose?: boolean\r\n): Promise<void> {\r\n const agentsDir = path.join(rootPath, \".github\", \"agents\");\r\n\r\n try {\r\n const entries = await fs.readdir(agentsDir, { withFileTypes: true });\r\n const agentMdFiles = entries.filter((e) => e.isFile() && e.name.endsWith(\".agent.md\"));\r\n\r\n let validatedCount = 0;\r\n\r\n // Validate .agent.md files (VS Code custom agents)\r\n for (const file of agentMdFiles) {\r\n const agentFile = path.join(agentsDir, file.name);\r\n \r\n try {\r\n const content = await fs.readFile(agentFile, \"utf-8\");\r\n\r\n // Check for required frontmatter\r\n if (!content.startsWith(\"---\")) {\r\n result.errors.push(`${file.name}: Missing YAML frontmatter`);\r\n result.valid = false;\r\n continue;\r\n }\r\n\r\n const frontmatterEnd = content.indexOf(\"---\", 3);\r\n if (frontmatterEnd === -1) {\r\n result.errors.push(`${file.name}: Malformed YAML frontmatter`);\r\n result.valid = false;\r\n continue;\r\n }\r\n\r\n const frontmatter = content.slice(4, frontmatterEnd).trim();\r\n const meta = yaml.parse(frontmatter);\r\n\r\n if (!meta.name) {\r\n result.errors.push(`${file.name}: Missing 'name' in frontmatter`);\r\n result.valid = false;\r\n }\r\n\r\n if (!meta.description) {\r\n result.warnings.push(`${file.name}: Missing 'description' in frontmatter`);\r\n }\r\n\r\n // Validate tools array if present\r\n if (meta.tools && !Array.isArray(meta.tools)) {\r\n result.errors.push(`${file.name}: 'tools' must be an array`);\r\n result.valid = false;\r\n }\r\n\r\n validatedCount++;\r\n\r\n if (verbose) {\r\n console.log(chalk.green(` ✓ agents/${file.name}`));\r\n }\r\n } catch (e) {\r\n result.errors.push(`${file.name}: ${(e as Error).message}`);\r\n result.valid = false;\r\n }\r\n }\r\n\r\n if (validatedCount === 0) {\r\n result.errors.push(\"No .agent.md files found in .github/agents/\");\r\n result.valid = false;\r\n }\r\n\r\n if (!verbose) {\r\n console.log(chalk.gray(` Validated ${validatedCount} agent(s)`));\r\n }\r\n } catch {\r\n result.errors.push(\"No .github/agents/ directory found\");\r\n result.valid = false;\r\n }\r\n}\r\n\r\nasync function validateHooks(\r\n rootPath: string,\r\n result: ValidationResult,\r\n verbose?: boolean\r\n): Promise<void> {\r\n const hooksDir = path.join(rootPath, \".github\", \"hooks\");\r\n const validEvents = [\"pre-commit\", \"post-commit\", \"pre-push\", \"pre-analyze\", \"post-generate\"];\r\n\r\n try {\r\n const files = await fs.readdir(hooksDir);\r\n const hookFiles = files.filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\r\n\r\n if (hookFiles.length === 0) {\r\n if (verbose) {\r\n console.log(chalk.gray(\" No hooks found\"));\r\n }\r\n return;\r\n }\r\n\r\n for (const file of hookFiles) {\r\n const hookPath = path.join(hooksDir, file);\r\n const content = await fs.readFile(hookPath, \"utf-8\");\r\n\r\n try {\r\n const hook = yaml.parse(content);\r\n\r\n if (!hook.name) {\r\n result.errors.push(`hooks/${file}: Missing 'name' field`);\r\n result.valid = false;\r\n }\r\n\r\n if (!hook.event) {\r\n result.errors.push(`hooks/${file}: Missing 'event' field`);\r\n result.valid = false;\r\n } else if (!validEvents.includes(hook.event)) {\r\n result.errors.push(\r\n `hooks/${file}: Invalid event '${hook.event}'. Must be one of: ${validEvents.join(\", \")}`\r\n );\r\n result.valid = false;\r\n }\r\n\r\n if (!hook.commands || !Array.isArray(hook.commands) || hook.commands.length === 0) {\r\n result.errors.push(`hooks/${file}: Missing or empty 'commands' array`);\r\n result.valid = false;\r\n }\r\n\r\n if (verbose) {\r\n console.log(chalk.green(` ✓ hooks/${file}`));\r\n }\r\n } catch (e) {\r\n result.errors.push(`hooks/${file}: Invalid YAML - ${(e as Error).message}`);\r\n result.valid = false;\r\n }\r\n }\r\n\r\n if (!verbose) {\r\n console.log(chalk.gray(` Validated ${hookFiles.length} hook(s)`));\r\n }\r\n } catch {\r\n // No hooks directory - that's okay\r\n if (verbose) {\r\n console.log(chalk.gray(\" No hooks directory\"));\r\n }\r\n }\r\n}\r\n\r\nasync function validateRegistry(\r\n rootPath: string,\r\n result: ValidationResult,\r\n verbose?: boolean\r\n): Promise<void> {\r\n const registryPath = path.join(rootPath, \"skills-registry.jsonl\");\r\n\r\n try {\r\n const content = await fs.readFile(registryPath, \"utf-8\");\r\n const lines = content.trim().split(\"\\n\").filter((l) => l.trim());\r\n\r\n if (lines.length === 0) {\r\n result.warnings.push(\"skills-registry.jsonl is empty\");\r\n return;\r\n }\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n try {\r\n const entry = JSON.parse(lines[i]);\r\n if (!entry.name || !entry.type) {\r\n result.errors.push(`skills-registry.jsonl line ${i + 1}: Missing 'name' or 'type'`);\r\n result.valid = false;\r\n }\r\n } catch {\r\n result.errors.push(`skills-registry.jsonl line ${i + 1}: Invalid JSON`);\r\n result.valid = false;\r\n }\r\n }\r\n\r\n if (verbose) {\r\n console.log(chalk.green(` ✓ skills-registry.jsonl (${lines.length} entries)`));\r\n } else {\r\n console.log(chalk.gray(` Validated registry (${lines.length} entries)`));\r\n }\r\n } catch {\r\n result.warnings.push(\"No skills-registry.jsonl found\");\r\n }\r\n}\r\n"],"mappings":"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","names":["fs","path","fs","path","chalk","chalk","path","path","path","fs","path","path","fs","CopilotClient","approveAll","path","IGNORE_PATTERNS","CopilotClient","approveAll","fs","path","path","fs","fs","path","fs","path","chalk","resolveInput","detectLicense","formatLicenseStatus","chalk","chalk","fs","path","chalk","yaml","chalk"]}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "agentsmith-cli",
3
+ "version": "0.4.0",
4
+ "description": "Turn any GitHub repo into a multi-agent AI system for VS Code Copilot. Generates orchestrators, sub-agents, skills, handoffs, and copilot-instructions.md.",
5
+ "type": "module",
6
+ "main": "dist/main.js",
7
+ "bin": {
8
+ "agentsmith": "./bin/agentsmith.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "dev": "tsup --watch",
19
+ "start": "tsx src/main.ts",
20
+ "prepublishOnly": "npm run build",
21
+ "lint": "eslint src/",
22
+ "test": "vitest",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "keywords": [
26
+ "cli",
27
+ "github-copilot",
28
+ "copilot-sdk",
29
+ "copilot-agents",
30
+ "copilot-custom-agents",
31
+ "agent",
32
+ "multi-agent",
33
+ "ai-agents",
34
+ "agentic-ai",
35
+ "agent-orchestration",
36
+ "skills",
37
+ "ai",
38
+ "vscode",
39
+ "code-analysis",
40
+ "repository-analysis",
41
+ "developer-tools",
42
+ "typescript",
43
+ "automation"
44
+ ],
45
+ "author": "",
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/shyamsridhar123/agentsmith-cli.git"
50
+ },
51
+ "homepage": "https://github.com/shyamsridhar123/agentsmith-cli",
52
+ "bugs": {
53
+ "url": "https://github.com/shyamsridhar123/agentsmith-cli/issues"
54
+ },
55
+ "dependencies": {
56
+ "@github/copilot-sdk": "^0.1.33-preview.2",
57
+ "chalk": "^5.3.0",
58
+ "commander": "^12.0.0",
59
+ "glob": "^10.3.0",
60
+ "simple-git": "^3.30.0",
61
+ "tsx": "^4.7.0",
62
+ "yaml": "^2.8.2",
63
+ "zod": "^3.22.0"
64
+ },
65
+ "devDependencies": {
66
+ "@types/node": "^20.0.0",
67
+ "tsup": "^8.0.0",
68
+ "typescript": "^5.3.0",
69
+ "vitest": "^1.2.0"
70
+ },
71
+ "engines": {
72
+ "node": ">=18.0.0"
73
+ }
74
+ }