make-laten 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -0
- package/dist/cli/index.js +1302 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +1279 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/index.js +2036 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1946 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/read.ts","../../src/compress/confidence.ts","../../src/compress/file-read.ts","../../src/cli/commands/grep.ts","../../src/compress/grep.ts","../../src/cli/commands/git.ts","../../src/compress/git-diff.ts","../../src/graph/database.ts","../../src/cache/l1-session.ts","../../src/cache/l2-cross.ts","../../src/cache/index.ts","../../src/cli/commands/cache.ts","../../src/web/backends/duckduckgo.ts","../../src/web/backends/index.ts","../../src/web/extractor.ts","../../src/web/compressor.ts","../../src/web/router.ts","../../src/cli/commands/web.ts","../../src/adapter/detector.ts","../../src/adapter/types.ts","../../src/adapter/hook.ts","../../src/adapter/rules.ts","../../src/adapter/installer.ts","../../src/cli/commands/install.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { readCommand } from './commands/read.js'\nimport { grepCommand } from './commands/grep.js'\nimport { gitDiffCommand, gitStatusCommand } from './commands/git.js'\nimport { cacheStatsCommand, cacheClearCommand } from './commands/cache.js'\nimport { searchCommand, fetchCommand } from './commands/web.js'\nimport { installCommand } from './commands/install.js'\n\nconst program = new Command()\n\nprogram\n .name('make-laten')\n .description('Universal efficiency skill for AI coding agents')\n .version('0.1.0')\n\nprogram\n .command('read')\n .description('Compressed file read')\n .argument('<file>', 'File path')\n .action(readCommand)\n\nprogram\n .command('grep')\n .description('Compressed grep with file grouping')\n .argument('<pattern>', 'Search pattern')\n .argument('[directory]', 'Directory to search', '.')\n .option('-i, --ignore <ext>', 'File extension to ignore')\n .action(grepCommand)\n\nconst gitCmd = program\n .command('git')\n .description('Git operations')\n\ngitCmd\n .command('diff')\n .description('Compressed git diff')\n .option('-s, --staged', 'Show staged changes')\n .action(gitDiffCommand)\n\ngitCmd\n .command('status')\n .description('Git status summary')\n .action(gitStatusCommand)\n\nconst cacheCmd = program\n .command('cache')\n .description('Cache management')\n\ncacheCmd\n .command('stats')\n .description('Show cache statistics')\n .action(cacheStatsCommand)\n\ncacheCmd\n .command('clear')\n .description('Clear cache')\n .action(cacheClearCommand)\n\nprogram\n .command('search')\n .description('Search the web')\n .argument('<query>', 'Search query')\n .option('-b, --backend <backend>', 'Search backend')\n .option('-m, --max <n>', 'Max results', '5')\n .action(searchCommand)\n\nprogram\n .command('fetch')\n .description('Fetch and compress web content')\n .argument('<url>', 'URL to fetch')\n .option('--no-compress', 'Disable compression')\n .option('--no-extract', 'Disable semantic extraction')\n .action(fetchCommand)\n\nprogram\n .command('install')\n .description('Install make-laten adapters for detected agents')\n .option('-u, --uninstall', 'Remove adapters')\n .option('-s, --status', 'Show installation status')\n .action(installCommand)\n\nprogram.parse()\n","import fs from 'fs/promises'\nimport { FileReadCompressor } from '../../compress/file-read.js'\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const langMap: Record<string, string> = {\n ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript',\n py: 'python', rs: 'rust', go: 'go', java: 'java', rb: 'ruby',\n json: 'json', yaml: 'yaml', yml: 'yaml', md: 'markdown'\n }\n return langMap[ext] || 'text'\n}\n\nexport async function readCommand(filePath: string): Promise<void> {\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n const compressor = new FileReadCompressor()\n \n const result = await compressor.compress({\n content,\n filePath,\n language: detectLanguage(filePath)\n })\n\n console.log(JSON.stringify({\n file: filePath,\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error) {\n console.error(`Error reading ${filePath}:`, error)\n process.exit(1)\n }\n}\n","export function calculateConfidence(original: string, compressed: string): number {\n if (!original.length) return 0\n\n let score = 1.0\n\n // Penalize if too much dropped\n const ratio = compressed.length / original.length\n if (ratio < 0.01) score -= 0.5\n else if (ratio < 0.05) score -= 0.3\n\n // Penalize if code blocks were modified\n if (codeBlocksModified(original, compressed)) score -= 0.4\n\n // Bonus for known patterns\n if (isKnownPattern(original)) score += 0.1\n\n return Math.max(0, Math.min(1, score))\n}\n\nfunction codeBlocksModified(original: string, compressed: string): boolean {\n const codeBlockRegex = /```[\\s\\S]*?```/g\n const originalBlocks = original.match(codeBlockRegex) || []\n const compressedBlocks = compressed.match(codeBlockRegex) || []\n\n if (originalBlocks.length !== compressedBlocks.length) return true\n\n for (let i = 0; i < originalBlocks.length; i++) {\n if (originalBlocks[i] !== compressedBlocks[i]) return true\n }\n\n return false\n}\n\nfunction isKnownPattern(content: string): boolean {\n const patterns = [\n /export\\s+(default\\s+)?(function|class|const|let|var)/,\n /import\\s+.*from\\s+['\"]/\n ]\n return patterns.some(p => p.test(content))\n}\n","import type { Compressor, CompressedResult, FileReadInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class FileReadCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { content, filePath, language } = input as FileReadInput\n \n const signatures = this.extractSignatures(content, language)\n const exports = this.extractExports(content)\n \n const lines = [\n `// ${filePath} (${content.split('\\n').length} lines)`,\n '',\n ...signatures,\n '',\n '// Exports:',\n ...exports\n ]\n \n const compressed = lines.join('\\n')\n \n return {\n content: compressed,\n original: content,\n confidence: calculateConfidence(content, compressed),\n metadata: {\n strategy: 'signatures',\n originalLines: content.split('\\n').length,\n compressedLines: lines.length,\n savings: 1 - (compressed.length / content.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private extractSignatures(content: string, language?: string): string[] {\n const signatures: string[] = []\n const lines = content.split('\\n')\n \n for (const line of lines) {\n const trimmed = line.trim()\n \n if (/^(export\\s+)?(async\\s+)?function\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed.replace(/\\{[\\s\\S]*$/, '{ ... }'))\n }\n \n if (/^(export\\s+)?class\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed)\n }\n \n if (/^(export\\s+)?(type|interface)\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed)\n }\n }\n \n return signatures\n }\n\n private extractExports(content: string): string[] {\n const exports: string[] = []\n const exportRegex = /export\\s+(default\\s+)?(function|class|const|let|var|type|interface)\\s+(\\w+)/g\n let match\n \n while ((match = exportRegex.exec(content)) !== null) {\n exports.push(` - ${match[3]} (${match[2]})`)\n }\n \n return exports\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GrepCompressor } from '../../compress/grep.js'\n\nconst execAsync = promisify(exec)\n\ninterface GrepMatch {\n file: string\n line: number\n content: string\n}\n\nfunction parseGrepOutput(output: string): GrepMatch[] {\n const matches: GrepMatch[] = []\n const lines = output.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n const parts = line.split(':')\n if (parts.length >= 3) {\n matches.push({\n file: parts[0],\n line: parseInt(parts[1], 10) || 0,\n content: parts.slice(2).join(':').trim()\n })\n }\n }\n\n return matches\n}\n\nexport async function grepCommand(pattern: string, directory: string, options: { ignore?: string }): Promise<void> {\n try {\n let cmd = `grep -rn \"${pattern}\" ${directory}`\n if (options.ignore) {\n cmd += ` --include=\"*.${options.ignore}\"`\n }\n\n const { stdout } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024 })\n const matches = parseGrepOutput(stdout)\n\n if (matches.length === 0) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n return\n }\n\n const compressor = new GrepCompressor()\n const result = await compressor.compress({\n results: matches,\n pattern,\n directory\n })\n\n console.log(JSON.stringify({\n pattern,\n directory,\n compressed: result.content,\n confidence: result.confidence,\n total: matches.length,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n if (error.code === 1) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n } else {\n console.error(`Error grep:`, error.message)\n process.exit(1)\n }\n }\n}\n","import type { Compressor, CompressedResult, GrepInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GrepCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { results } = input as GrepInput\n \n // Group by file\n const grouped = this.groupByFile(results)\n \n // Format output\n const lines: string[] = []\n for (const [file, matches] of grouped) {\n lines.push(`${file} (${matches.length} matches)`)\n const unique = this.deduplicate(matches)\n for (const match of unique) {\n lines.push(` L${match.line}: ${match.content}`)\n }\n }\n \n const compressed = lines.join('\\n')\n const original = results.map(r => `${r.file}:${r.line}: ${r.content}`).join('\\n')\n \n return {\n content: compressed,\n original,\n confidence: calculateConfidence(original, compressed),\n metadata: {\n strategy: 'grouped',\n totalMatches: results.length,\n uniqueFiles: grouped.size,\n savings: 1 - (compressed.length / original.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private groupByFile(results: GrepInput['results']): Map<string, GrepInput['results']> {\n const grouped = new Map<string, GrepInput['results']>()\n \n for (const result of results) {\n const existing = grouped.get(result.file) || []\n existing.push(result)\n grouped.set(result.file, existing)\n }\n \n return grouped\n }\n\n private deduplicate(matches: GrepInput['results']): GrepInput['results'] {\n const seen = new Set<string>()\n return matches.filter(match => {\n const key = match.content.trim()\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GitDiffCompressor } from '../../compress/git-diff.js'\n\nconst execAsync = promisify(exec)\n\nexport async function gitDiffCommand(options: { staged?: boolean }): Promise<void> {\n try {\n const flag = options.staged ? '--staged' : ''\n const { stdout } = await execAsync(`git diff ${flag}`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n console.log(JSON.stringify({ diff: '', changes: 0 }))\n return\n }\n\n const compressor = new GitDiffCompressor()\n const result = await compressor.compress({ diff: stdout })\n\n console.log(JSON.stringify({\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git diff:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function gitStatusCommand(): Promise<void> {\n try {\n const { stdout } = await execAsync('git status --porcelain')\n const lines = stdout.split('\\n').filter(Boolean)\n\n const files = lines.map(line => ({\n status: line[0],\n path: line.slice(3)\n }))\n\n console.log(JSON.stringify({\n total: files.length,\n files\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git status:`, error.message)\n process.exit(1)\n }\n}\n","import type { Compressor, CompressedResult, GitDiffInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GitDiffCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { diff } = input as GitDiffInput\n \n // Parse diff into hunks\n const hunks = this.parseDiff(diff)\n \n // Condense each hunk\n const condensed = hunks.map(hunk => ({\n file: hunk.file,\n changes: this.condenseHunk(hunk),\n stats: { additions: hunk.additions, deletions: hunk.deletions }\n }))\n \n // Format output\n const lines: string[] = []\n for (const hunk of condensed) {\n if (hunk.changes.length > 0) {\n lines.push(`${hunk.file} (+${hunk.stats.additions} -${hunk.stats.deletions})`)\n lines.push(...hunk.changes)\n }\n }\n \n const compressed = lines.join('\\n')\n \n return {\n content: compressed,\n original: diff,\n confidence: calculateConfidence(diff, compressed),\n metadata: {\n strategy: 'condensed',\n filesChanged: condensed.length,\n savings: 1 - (compressed.length / diff.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private parseDiff(diff: string): Hunk[] {\n const hunks: Hunk[] = []\n const lines = diff.split('\\n')\n \n let currentHunk: Hunk | null = null\n \n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n if (currentHunk) hunks.push(currentHunk)\n const fileMatch = line.match(/b\\/(.+)/)\n currentHunk = {\n file: fileMatch?.[1] || 'unknown',\n lines: [],\n additions: 0,\n deletions: 0\n }\n } else if (currentHunk) {\n if (line.startsWith('+')) {\n currentHunk.additions++\n currentHunk.lines.push({ type: 'addition', content: line.slice(1) })\n } else if (line.startsWith('-')) {\n currentHunk.deletions++\n currentHunk.lines.push({ type: 'deletion', content: line.slice(1) })\n }\n }\n }\n \n if (currentHunk) hunks.push(currentHunk)\n return hunks\n }\n\n private condenseHunk(hunk: Hunk): string[] {\n return hunk.lines\n .filter(l => l.type === 'addition' || l.type === 'deletion')\n .map(l => `${l.type === 'addition' ? '+' : '-'} ${l.content}`)\n }\n}\n\ninterface Hunk {\n file: string\n lines: { type: string; content: string }[]\n additions: number\n deletions: number\n}\n","import Database from 'better-sqlite3'\n\nexport type Database = Database.Database\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n original TEXT,\n embedding BLOB,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n accessed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n access_count INTEGER DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source TEXT NOT NULL,\n target TEXT NOT NULL,\n type TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n metadata TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n FOREIGN KEY (source) REFERENCES nodes(id),\n FOREIGN KEY (target) REFERENCES nodes(id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);\nCREATE INDEX IF NOT EXISTS idx_nodes_created ON nodes(created_at);\nCREATE INDEX IF NOT EXISTS idx_nodes_accessed ON nodes(accessed_at);\nCREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source);\nCREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target);\nCREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);\n`\n\nexport async function createDatabase(dbPath: string): Promise<Database> {\n const db = new Database(dbPath)\n db.pragma('journal_mode = WAL')\n db.pragma('foreign_keys = ON')\n \n db.exec(SCHEMA)\n \n return db\n}","export interface CacheEntry {\n content: string\n metadata: Record<string, any>\n}\n\nexport interface CacheStats {\n hits: number\n misses: number\n size: number\n hitRate: number\n}\n\nexport class SessionCache {\n private store = new Map<string, CacheEntry>()\n private hits = 0\n private misses = 0\n\n get(key: string): CacheEntry | null {\n const entry = this.store.get(key)\n if (entry) {\n this.hits++\n return entry\n }\n this.misses++\n return null\n }\n\n set(key: string, value: CacheEntry): void {\n this.store.set(key, value)\n }\n\n clear(): void {\n this.store.clear()\n this.hits = 0\n this.misses = 0\n }\n\n stats(): CacheStats {\n const total = this.hits + this.misses\n return {\n hits: this.hits,\n misses: this.misses,\n size: this.store.size,\n hitRate: total > 0 ? this.hits / total : 0\n }\n }\n}\n","import type { Database } from '../graph/database.js'\nimport type { CacheEntry } from './l1-session.js'\n\ninterface CacheOptions {\n ttl?: number\n}\n\nexport class CrossSessionCache {\n constructor(private db: Database) {}\n\n async get(key: string): Promise<CacheEntry | null> {\n const row = this.db.prepare(`\n SELECT content, metadata, created_at \n FROM nodes \n WHERE id = ? AND type = 'cache'\n `).get(key) as { content: string; metadata: string; created_at: number } | undefined\n\n if (!row) return null\n\n const metadata = JSON.parse(row.metadata)\n if (metadata.ttl) {\n const age = Date.now() / 1000 - row.created_at\n if (age > metadata.ttl) {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n return null\n }\n }\n\n this.db.prepare(`\n UPDATE nodes SET accessed_at = unixepoch(), access_count = access_count + 1\n WHERE id = ?\n `).run(key)\n\n return {\n content: row.content,\n metadata: JSON.parse(row.metadata)\n }\n }\n\n async set(key: string, value: CacheEntry, options?: CacheOptions): Promise<void> {\n this.db.prepare(`\n INSERT INTO nodes (id, type, content, metadata, created_at, accessed_at, access_count)\n VALUES (?, 'cache', ?, ?, unixepoch(), unixepoch(), 1)\n ON CONFLICT(id) DO UPDATE SET\n content = excluded.content,\n metadata = excluded.metadata,\n accessed_at = unixepoch(),\n access_count = access_count + 1\n `).run(key, value.content, JSON.stringify({ ...value.metadata, ttl: options?.ttl }))\n }\n\n async delete(key: string): Promise<void> {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n }\n\n async clear(): Promise<void> {\n this.db.prepare(\"DELETE FROM nodes WHERE type = 'cache'\").run()\n }\n}\n","import type { Database } from '../graph/database.js'\nimport { SessionCache, type CacheEntry, type CacheStats } from './l1-session.js'\nimport { CrossSessionCache } from './l2-cross.js'\nimport { SemanticCache } from './semantic.js'\n\nexport interface UnifiedCacheStats {\n l1: CacheStats\n l2: { size: number }\n}\n\nexport function createCacheManager(db?: Database) {\n const session = new SessionCache()\n const crossSession = db ? new CrossSessionCache(db) : (null as any)\n const semantic = new SemanticCache()\n\n return {\n session,\n crossSession,\n semantic\n }\n}\n\nexport function makeLatenCache(db: Database) {\n const l1 = new SessionCache()\n const l2 = new CrossSessionCache(db)\n\n return {\n l1,\n l2,\n\n async get(key: string): Promise<CacheEntry | null> {\n const l1Result = l1.get(key)\n if (l1Result) return l1Result\n\n const l2Result = await l2.get(key)\n if (l2Result) {\n l1.set(key, l2Result)\n return l2Result\n }\n\n return null\n },\n\n async set(key: string, value: CacheEntry, options?: { ttl?: number }): Promise<void> {\n l1.set(key, value)\n await l2.set(key, value, options)\n },\n\n async invalidate(pattern: string): Promise<void> {\n l1.clear()\n await l2.clear()\n },\n\n stats(): UnifiedCacheStats {\n return {\n l1: l1.stats(),\n l2: { size: 0 }\n }\n }\n }\n}\n\nexport { SessionCache, CrossSessionCache, SemanticCache }\nexport type { CacheEntry, CacheStats }\n","import { createDatabase } from '../../graph/database.js'\nimport { makeLatenCache } from '../../cache/index.js'\n\nexport async function cacheStatsCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n const stats = cache.stats()\n\n console.log(JSON.stringify({\n l1: {\n hits: stats.l1.hits,\n misses: stats.l1.misses,\n size: stats.l1.size,\n hitRate: `${(stats.l1.hitRate * 100).toFixed(1)}%`\n },\n l2: {\n size: stats.l2.size\n }\n }, null, 2))\n\n db.close()\n } catch (error: any) {\n console.error(`Error cache stats:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function cacheClearCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n await cache.invalidate('*')\n\n console.log(JSON.stringify({ cleared: true }))\n db.close()\n } catch (error: any) {\n console.error(`Error cache clear:`, error.message)\n process.exit(1)\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\n\nexport class DuckDuckGoBackend implements WebBackend {\n name = 'duckduckgo'\n\n isAvailable(): boolean {\n return true\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const maxResults = options?.maxResults || 5\n\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; make-laten/0.1.0)'\n }\n })\n\n const html = await response.text()\n return this.parseResults(html, maxResults)\n }\n\n private parseResults(html: string, maxResults: number): SearchResult[] {\n const results: SearchResult[] = []\n const resultRegex = /<a[^>]*class=\"result__a\"[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n const snippetRegex = /<a[^>]*class=\"result__snippet\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n let match: RegExpExecArray | null\n\n const urls: string[] = []\n const titles: string[] = []\n\n while ((match = resultRegex.exec(html)) !== null && urls.length < maxResults) {\n const rawUrl = match[1]\n const urlMatch = rawUrl.match(/uddg=([^&]+)/)\n const url = urlMatch ? decodeURIComponent(urlMatch[1]) : rawUrl\n const title = this.stripTags(match[2]).trim()\n\n if (url && title) {\n urls.push(url)\n titles.push(title)\n }\n }\n\n const snippets: string[] = []\n while ((match = snippetRegex.exec(html)) !== null && snippets.length < maxResults) {\n snippets.push(this.stripTags(match[1]).trim())\n }\n\n for (let i = 0; i < urls.length; i++) {\n results.push({\n title: titles[i],\n url: urls[i],\n snippet: snippets[i] || '',\n score: 1 - (i * 0.1)\n })\n }\n\n return results\n }\n\n private stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/'/g, \"'\").replace(/"/g, '\"')\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\nimport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport function selectBackend(preferred?: string): WebBackend {\n const backends: WebBackend[] = [\n new DuckDuckGoBackend()\n ]\n\n if (preferred) {\n const found = backends.find(b => b.name === preferred)\n if (found) return found\n }\n\n return backends.find(b => b.isAvailable()) || backends[0]\n}\n","import type { SemanticIR, SectionIR, CodeExample } from './types.js'\n\ninterface ParsedNode {\n tag: string\n text: string\n children: ParsedNode[]\n}\n\nfunction parseSimpleHTML(html: string): ParsedNode[] {\n const nodes: ParsedNode[] = []\n const tagRegex = /<(\\w+)([^>]*)>([\\s\\S]*?)<\\/\\1>/g\n let match: RegExpExecArray | null\n\n while ((match = tagRegex.exec(html)) !== null) {\n const tag = match[1]\n const content = match[3]\n\n if (['script', 'style', 'noscript'].includes(tag)) continue\n\n nodes.push({\n tag,\n text: stripTags(content).trim(),\n children: content.includes('<') ? parseSimpleHTML(content) : []\n })\n }\n\n return nodes\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\")\n}\n\nfunction extractTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n if (titleMatch) return stripTags(titleMatch[1]).trim()\n\n const h1Match = html.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i)\n if (h1Match) return stripTags(h1Match[1]).trim()\n\n return 'Untitled'\n}\n\nfunction extractSections(html: string): SectionIR[] {\n const sections: SectionIR[] = []\n const headingRegex = /<h([1-6])[^>]*>([\\s\\S]*?)<\\/h\\1>/gi\n let match: RegExpExecArray | null\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const heading = stripTags(match[2]).trim()\n\n const startPos = match.index + match[0].length\n const nextHeading = html.substring(startPos).match(/<h[1-6]/i)\n const endPos = nextHeading ? startPos + nextHeading.index! : html.length\n const content = stripTags(html.substring(startPos, endPos)).trim()\n\n if (!content) continue\n\n const importance = level <= 2 ? 'primary' : level <= 4 ? 'secondary' : 'tertiary'\n\n sections.push({ heading, level, content, importance })\n }\n\n return sections\n}\n\nfunction extractCodeExamples(html: string): CodeExample[] {\n const examples: CodeExample[] = []\n const codeRegex = /<(?:pre|code)[^>]*>[\\s\\S]*?<(?:code|\\/pre)[^>]*>/gi\n const blockRegex = /<pre[^>]*><code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi\n let match: RegExpExecArray | null\n\n while ((match = blockRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 10) {\n examples.push({ language, code })\n }\n }\n\n const inlineRegex = /<code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code>/gi\n while ((match = inlineRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 20 && !examples.some(e => e.code === code)) {\n examples.push({ language, code })\n }\n }\n\n return examples.slice(0, 10)\n}\n\nfunction extractKeyPoints(sections: SectionIR[]): string[] {\n const keyPoints: string[] = []\n\n for (const section of sections.filter(s => s.importance === 'primary')) {\n const sentences = section.content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10)\n if (sentences.length > 0) {\n keyPoints.push(sentences[0].trim())\n }\n }\n\n return keyPoints.slice(0, 5)\n}\n\nfunction classifyPurpose(html: string, sections: SectionIR[]): SemanticIR['purpose'] {\n const text = (html + ' ' + sections.map(s => s.heading).join(' ')).toLowerCase()\n\n if (text.includes('api reference') || text.includes('endpoint') || text.includes('parameters')) return 'reference'\n if (text.includes('tutorial') || text.includes('step by step') || text.includes('getting started')) return 'tutorial'\n if (text.includes('blog') || text.includes('published') || text.includes('author')) return 'blog'\n if (text.includes('install') || text.includes('quickstart') || text.includes('overview')) return 'documentation'\n\n return 'documentation'\n}\n\nexport function extractSemantic(html: string, url: string): SemanticIR {\n const title = extractTitle(html)\n const sections = extractSections(html)\n const codeExamples = extractCodeExamples(html)\n const keyPoints = extractKeyPoints(sections)\n const purpose = classifyPurpose(html, sections)\n\n return {\n type: 'webpage',\n url,\n title,\n purpose,\n sections,\n keyPoints,\n codeExamples,\n metadata: {\n language: html.match(/lang=\"(\\w+)\"/)?.[1] || 'en',\n author: html.match(/<meta[^>]*name=\"author\"[^>]*content=\"([^\"]+)\"/i)?.[1],\n tags: html.match(/<meta[^>]*name=\"keywords\"[^>]*content=\"([^\"]+)\"/i)?.[1]?.split(',').map(t => t.trim())\n }\n }\n}\n","import type { SemanticIR, SectionIR } from './types.js'\n\nexport interface CompressOptions {\n maxTokens?: number\n includeCode?: boolean\n includeSections?: 'all' | 'primary' | 'none'\n}\n\nexport function compressWebContent(semantic: SemanticIR, options: CompressOptions = {}): string {\n const { maxTokens = 1000, includeCode = true, includeSections = 'all' } = options\n const lines: string[] = []\n\n lines.push(`# ${semantic.title}`)\n lines.push(`URL: ${semantic.url}`)\n lines.push(`Purpose: ${semantic.purpose}`)\n lines.push('')\n\n if (semantic.keyPoints.length > 0) {\n lines.push('## Key Points')\n for (const point of semantic.keyPoints) {\n lines.push(`- ${point}`)\n }\n lines.push('')\n }\n\n const filteredSections = filterSections(semantic.sections, includeSections)\n\n for (const section of filteredSections) {\n const content = truncateContent(section.content, 500)\n lines.push(`## ${section.heading}`)\n lines.push(content)\n lines.push('')\n }\n\n if (includeCode && semantic.codeExamples.length > 0) {\n const topExamples = semantic.codeExamples.slice(0, 3)\n lines.push('## Code Examples')\n for (const example of topExamples) {\n lines.push(`\\`\\`\\`${example.language}`)\n lines.push(truncateContent(example.code, 300))\n lines.push('```')\n lines.push('')\n }\n }\n\n let result = lines.join('\\n')\n\n const estimatedTokens = estimateTokens(result)\n if (estimatedTokens > maxTokens) {\n result = truncateByTokens(result, maxTokens)\n }\n\n return result\n}\n\nfunction filterSections(sections: SectionIR[], mode: 'all' | 'primary' | 'none'): SectionIR[] {\n if (mode === 'none') return []\n if (mode === 'primary') return sections.filter(s => s.importance === 'primary')\n return sections\n}\n\nfunction truncateContent(content: string, maxLength: number): string {\n if (content.length <= maxLength) return content\n return content.slice(0, maxLength) + '...'\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\nfunction truncateByTokens(text: string, maxTokens: number): string {\n const maxChars = maxTokens * 4\n if (text.length <= maxChars) return text\n\n const truncated = text.slice(0, maxChars)\n const lastNewline = truncated.lastIndexOf('\\n')\n\n return truncated.slice(0, lastNewline > 0 ? lastNewline : maxChars) + '\\n\\n... (truncated)'\n}\n","import type { SearchOptions, SearchResult, FetchOptions, FetchResult } from './types.js'\nimport { selectBackend } from './backends/index.js'\nimport { extractSemantic } from './extractor.js'\nimport { compressWebContent } from './compressor.js'\n\nexport class WebRouter {\n private fetchCache: Map<string, FetchResult> = new Map()\n private searchCache: Map<string, SearchResult[]> = new Map()\n private cacheTtl: number\n\n constructor(options?: { cacheTtlMs?: number }) {\n this.cacheTtl = options?.cacheTtlMs || 60 * 60 * 1000\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${JSON.stringify(options || {})}`\n\n const cached = this.searchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n\n const backend = selectBackend(options?.backend)\n const results = await backend.search(query, options)\n\n this.searchCache.set(cacheKey, results)\n this.storeFreshness(cacheKey)\n\n return results\n }\n\n async fetch(url: string, options?: FetchOptions): Promise<FetchResult> {\n const cacheKey = `fetch:${url}:${options?.format || 'text'}`\n\n if (options?.cache !== false) {\n const cached = this.fetchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n }\n\n const startTime = Date.now()\n const response = await fetch(url)\n const html = await response.text()\n const originalSize = html.length\n\n let content: string\n let semantic = undefined\n\n if (options?.extract !== false) {\n semantic = extractSemantic(html, url)\n content = compressWebContent(semantic, {\n includeCode: true,\n includeSections: options?.format === 'html' ? 'all' : 'primary'\n })\n } else {\n content = html\n }\n\n const compressedSize = content.length\n const result: FetchResult = {\n url,\n title: semantic?.title || extractSimpleTitle(html),\n content,\n semantic,\n metadata: {\n fetchTime: Date.now() - startTime,\n originalSize,\n compressedSize,\n savings: 1 - (compressedSize / originalSize)\n }\n }\n\n if (options?.cache !== false) {\n this.fetchCache.set(cacheKey, result)\n this.storeFreshness(cacheKey)\n }\n\n return result\n }\n\n async extract(url: string): Promise<FetchResult> {\n return this.fetch(url, { extract: true, compress: true })\n }\n\n async summarize(content: string, options?: { maxTokens?: number }): Promise<string> {\n const lines = content.split('\\n')\n const summaryLines: string[] = []\n let tokenCount = 0\n const maxTokens = options?.maxTokens || 200\n\n for (const line of lines) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n\n if (line.startsWith('#') || line.startsWith('-') || line.startsWith('*')) {\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n if (summaryLines.length === 0 && lines.length > 0) {\n for (const line of lines.slice(0, 5)) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n return summaryLines.join('\\n')\n }\n\n clearCache(): void {\n this.fetchCache.clear()\n this.searchCache.clear()\n }\n\n getCacheStats(): { fetchSize: number; searchSize: number } {\n return {\n fetchSize: this.fetchCache.size,\n searchSize: this.searchCache.size\n }\n }\n\n private isFresh(key: string): boolean {\n const timestamp = this.freshness.get(key)\n if (!timestamp) return false\n return Date.now() - timestamp < this.cacheTtl\n }\n\n private storeFreshness(key: string): void {\n this.freshness.set(key, Date.now())\n }\n\n private freshness: Map<string, number> = new Map()\n}\n\nfunction extractSimpleTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n return titleMatch ? titleMatch[1].replace(/<[^>]+>/g, '').trim() : 'Untitled'\n}\n","import { WebRouter } from '../../web/router.js'\n\nexport async function searchCommand(query: string, options: { backend?: string; max?: number }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const results = await router.search(query, {\n maxResults: options.max || 5,\n backend: options.backend\n })\n\n console.log(JSON.stringify({\n query,\n total: results.length,\n results: results.map(r => ({\n title: r.title,\n url: r.url,\n snippet: r.snippet,\n score: r.score\n }))\n }, null, 2))\n } catch (error: any) {\n console.error(`Error search:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function fetchCommand(url: string, options: { compress?: boolean; extract?: boolean }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const result = await router.fetch(url, {\n compress: options.compress !== false,\n extract: options.extract !== false,\n cache: true\n })\n\n console.log(JSON.stringify({\n url: result.url,\n title: result.title,\n content: result.content,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error fetch:`, error.message)\n process.exit(1)\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport type { AgentInfo } from './types.js'\nimport { AGENT_CONFIGS } from './types.js'\n\nconst execAsync = promisify(exec)\n\nexport class AgentDetector {\n async detectAgents(): Promise<AgentInfo[]> {\n const agents: AgentInfo[] = []\n\n for (const [name, config] of Object.entries(AGENT_CONFIGS)) {\n const detected = await this.detectAgent(name, config.type)\n if (detected) {\n agents.push(detected)\n }\n }\n\n return agents\n }\n\n async detectAgent(name: string, type: string): Promise<AgentInfo | null> {\n const commands: Record<string, string> = {\n 'claude-code': 'claude --version',\n 'codex': 'codex --version',\n 'gemini-cli': 'gemini --version'\n }\n\n if (commands[name]) {\n try {\n const { stdout } = await execAsync(commands[name], { timeout: 5000 })\n const version = stdout.trim().split('\\n')[0]\n const agentPath = await this.getAgentPath(name)\n return { name, type: type as any, path: agentPath, version, detected: true }\n } catch {\n return null\n }\n }\n\n if (type === 'rules') {\n const rulesPath = AGENT_CONFIGS[name]?.rulesFile\n if (rulesPath) {\n try {\n await fs.access(path.join(process.cwd(), rulesPath))\n return { name, type: type as any, path: process.cwd(), version: null, detected: true }\n } catch {\n return null\n }\n }\n }\n\n return null\n }\n\n async getAgentPath(name: string): Promise<string> {\n const home = process.env.HOME || process.env.USERPROFILE || ''\n const paths: Record<string, string> = {\n 'claude-code': path.join(home, '.claude'),\n 'codex': path.join(home, '.codex'),\n 'gemini-cli': path.join(home, '.gemini')\n }\n return paths[name] || path.join(home, `.${name}`)\n }\n\n async hasCommand(cmd: string): Promise<boolean> {\n try {\n await execAsync(`which ${cmd}`, { timeout: 3000 })\n return true\n } catch {\n return false\n }\n }\n}\n","export type AdapterType = 'hook' | 'plugin' | 'rules' | 'proxy' | 'mcp'\n\nexport interface AgentAdapter {\n name: string\n version: string\n type: AdapterType\n format: (input: any) => AdapterOutput\n parse?: (output: string) => any\n install?(agentPath: string): Promise<void>\n uninstall?(agentPath: string): Promise<void>\n isInstalled?(agentPath: string): Promise<boolean>\n}\n\nexport interface AgentInfo {\n name: string\n type: AdapterType\n path: string\n version: string | null\n detected: boolean\n}\n\nexport interface ToolCall {\n name: string\n params: Record<string, any>\n timestamp?: number\n}\n\nexport interface ToolResult {\n name: string\n output: string\n success: boolean\n metadata?: Record<string, any>\n}\n\nexport interface AdapterConfig {\n maxTokens?: number\n supportsStreaming?: boolean\n supportsImages?: boolean\n customHeaders?: Record<string, string>\n}\n\nexport interface AdapterOutput {\n output: string\n format: string\n metadata?: Record<string, any>\n}\n\nexport interface AdapterRequest {\n content: string\n context?: Record<string, any>\n}\n\nexport interface HookConfig {\n preToolUse?: (toolCall: ToolCall) => Promise<ToolCall | null>\n postToolUse?: (result: ToolResult) => Promise<ToolResult>\n}\n\nexport const AGENT_CONFIGS: Record<string, { type: AdapterType; rulesFile?: string; configPath?: string }> = {\n 'claude-code': { type: 'hook' },\n 'codex': { type: 'hook' },\n 'gemini-cli': { type: 'hook' },\n 'cursor': { type: 'rules', rulesFile: '.cursorrules' },\n 'windsurf': { type: 'rules', rulesFile: '.windsurfrules' },\n 'cline': { type: 'rules', rulesFile: '.clinerules' },\n 'copilot': { type: 'rules', rulesFile: '.github/copilot-instructions.md' }\n}\n","import fs from 'fs/promises'\nimport path from 'path'\nimport type { AgentAdapter, AdapterOutput, AdapterRequest, ToolCall, ToolResult, HookConfig } from './types.js'\n\nexport class HookAdapter implements AgentAdapter {\n name: string\n version = '1.0.0'\n type = 'hook' as const\n private hooks: HookConfig = {}\n\n constructor(name: string) {\n this.name = name\n }\n\n format(input: AdapterRequest): AdapterOutput {\n const { content, context } = input\n const parts: string[] = []\n\n if (context?.filePath) {\n parts.push(`**File:** \\`${context.filePath}\\``)\n }\n\n parts.push(content)\n\n return {\n output: parts.join('\\n\\n'),\n format: this.name,\n metadata: { filePath: context?.filePath, timestamp: Date.now() }\n }\n }\n\n parse(output: string): any {\n return { content: output, parsed: true }\n }\n\n setHooks(hooks: HookConfig): void {\n this.hooks = hooks\n }\n\n async intercept(toolCall: ToolCall): Promise<ToolCall | null> {\n if (this.hooks.preToolUse) {\n return this.hooks.preToolUse(toolCall)\n }\n return toolCall\n }\n\n async postProcess(result: ToolResult): Promise<ToolResult> {\n if (this.hooks.postToolUse) {\n return this.hooks.postToolUse(result)\n }\n return result\n }\n\n async install(agentPath: string): Promise<void> {\n const hooksDir = path.join(agentPath, 'hooks')\n await fs.mkdir(hooksDir, { recursive: true })\n\n const preToolHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\n\nif (input.tool === 'Read' || input.tool === 'Bash') {\n process.env.MAKE_LATEN_INTERCEPT = '1';\n}\n\nprocess.stdout.write(JSON.stringify(input));\n`\n const postToolHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\n\nif (input.output && input.output.length > 10000) {\n input.output = input.output.slice(0, 10000) + '\\\\n... (truncated by make-laten)';\n}\n\nprocess.stdout.write(JSON.stringify(input));\n`\n\n await fs.writeFile(path.join(hooksDir, 'pre-tool-use.js'), preToolHook)\n await fs.writeFile(path.join(hooksDir, 'post-tool-use.js'), postToolHook)\n }\n\n async uninstall(agentPath: string): Promise<void> {\n const hooksDir = path.join(agentPath, 'hooks')\n try {\n await fs.rm(path.join(hooksDir, 'pre-tool-use.js'), { force: true })\n await fs.rm(path.join(hooksDir, 'post-tool-use.js'), { force: true })\n } catch {}\n }\n\n async isInstalled(agentPath: string): Promise<boolean> {\n try {\n await fs.access(path.join(agentPath, 'hooks', 'pre-tool-use.js'))\n return true\n } catch {\n return false\n }\n }\n}\n","import fs from 'fs/promises'\nimport path from 'path'\nimport type { AgentAdapter, AdapterOutput, AdapterRequest } from './types.js'\nimport { AGENT_CONFIGS } from './types.js'\n\nconst RULES_TEMPLATE = `\n# make-laten efficiency rules\n\n## Token Optimization\n- When reading files, prefer using \\`make-laten read <file>\\` for compressed output\n- When searching code, prefer using \\`make-laten grep <pattern>\\` for grouped results\n- When checking git status, prefer using \\`make-laten git diff\\` for condensed output\n\n## Caching\n- make-laten automatically caches frequently accessed files\n- Use \\`make-laten cache stats\\` to see cache performance\n- Use \\`make-laten cache clear\\` to reset cache if needed\n\n## Web Search\n- Use \\`make-laten search <query>\\` for optimized web search\n- Use \\`make-laten fetch <url>\\` for compressed web fetch\n`\n\nexport class RulesAdapter implements AgentAdapter {\n name: string\n version = '1.0.0'\n type = 'rules' as const\n\n constructor(agentName: string) {\n this.name = agentName\n }\n\n format(input: AdapterRequest): AdapterOutput {\n return {\n output: input.content,\n format: 'markdown',\n metadata: { agent: this.name, timestamp: Date.now() }\n }\n }\n\n parse(output: string): any {\n return { content: output }\n }\n\n async install(agentPath: string): Promise<void> {\n const config = AGENT_CONFIGS[this.name]\n if (!config?.rulesFile) {\n throw new Error(`No rules file configured for ${this.name}`)\n }\n\n const rulesPath = path.join(agentPath, config.rulesFile)\n const existing = await fs.readFile(rulesPath, 'utf-8').catch(() => '')\n\n if (existing.includes('make-laten')) {\n return\n }\n\n await fs.mkdir(path.dirname(rulesPath), { recursive: true })\n await fs.writeFile(rulesPath, existing + '\\n\\n' + RULES_TEMPLATE)\n }\n\n async uninstall(agentPath: string): Promise<void> {\n const config = AGENT_CONFIGS[this.name]\n if (!config?.rulesFile) return\n\n const rulesPath = path.join(agentPath, config.rulesFile)\n try {\n let content = await fs.readFile(rulesPath, 'utf-8')\n const marker = '# make-laten efficiency rules'\n const idx = content.indexOf(marker)\n if (idx !== -1) {\n const endIdx = content.indexOf('\\n#', idx + marker.length)\n content = content.slice(0, idx).trim() + '\\n' + (endIdx !== -1 ? content.slice(endIdx) : '')\n await fs.writeFile(rulesPath, content.trim() + '\\n')\n }\n } catch {}\n }\n\n async isInstalled(agentPath: string): Promise<boolean> {\n const config = AGENT_CONFIGS[this.name]\n if (!config?.rulesFile) return false\n\n try {\n const content = await fs.readFile(path.join(agentPath, config.rulesFile), 'utf-8')\n return content.includes('make-laten')\n } catch {\n return false\n }\n }\n}\n","import type { AgentInfo, AgentAdapter } from './types.js'\nimport { AgentDetector } from './detector.js'\nimport { HookAdapter } from './hook.js'\nimport { RulesAdapter } from './rules.js'\nimport { AGENT_CONFIGS } from './types.js'\n\nexport class Installer {\n private detector = new AgentDetector()\n\n async install(): Promise<{ installed: string[]; skipped: string[] }> {\n const agents = await this.detector.detectAgents()\n const installed: string[] = []\n const skipped: string[] = []\n\n for (const agent of agents) {\n try {\n const adapter = this.createAdapter(agent)\n if (adapter.install) {\n await adapter.install(agent.path)\n installed.push(agent.name)\n } else {\n skipped.push(agent.name)\n }\n } catch {\n skipped.push(agent.name)\n }\n }\n\n return { installed, skipped }\n }\n\n async uninstall(): Promise<{ removed: string[] }> {\n const agents = await this.detector.detectAgents()\n const removed: string[] = []\n\n for (const agent of agents) {\n try {\n const adapter = this.createAdapter(agent)\n if (adapter.uninstall) {\n await adapter.uninstall(agent.path)\n removed.push(agent.name)\n }\n } catch {}\n }\n\n return { removed }\n }\n\n async status(): Promise<AgentInfo[]> {\n const agents = await this.detector.detectAgents()\n\n for (const agent of agents) {\n const adapter = this.createAdapter(agent)\n if (adapter.isInstalled) {\n agent.detected = await adapter.isInstalled(agent.path)\n }\n }\n\n return agents\n }\n\n private createAdapter(agent: AgentInfo): AgentAdapter {\n const config = AGENT_CONFIGS[agent.name]\n\n if (config?.type === 'rules') {\n return new RulesAdapter(agent.name)\n }\n\n return new HookAdapter(agent.name)\n }\n}\n","import { Installer } from '../../adapter/installer.js'\n\nexport async function installCommand(options: { uninstall?: boolean; status?: boolean }): Promise<void> {\n const installer = new Installer()\n\n if (options.status) {\n console.log('Detecting installed agents...\\n')\n const agents = await installer.status()\n\n if (agents.length === 0) {\n console.log('No supported agents detected.')\n return\n }\n\n for (const agent of agents) {\n const status = agent.detected ? '✓ installed' : '○ detected'\n console.log(` ${status} ${agent.name} (${agent.type})${agent.version ? ` v${agent.version}` : ''}`)\n }\n return\n }\n\n if (options.uninstall) {\n console.log('Uninstalling make-laten adapters...\\n')\n const { removed } = await installer.uninstall()\n\n if (removed.length === 0) {\n console.log('Nothing to uninstall.')\n return\n }\n\n for (const name of removed) {\n console.log(` ✓ removed from ${name}`)\n }\n return\n }\n\n console.log('Installing make-laten adapters...\\n')\n const { installed, skipped } = await installer.install()\n\n if (installed.length === 0 && skipped.length === 0) {\n console.log('No supported agents detected.')\n console.log('make-laten CLI works standalone — use commands directly:')\n console.log(' make-laten read <file>')\n console.log(' make-laten grep <pattern>')\n console.log(' make-laten git diff')\n return\n }\n\n for (const name of installed) {\n console.log(` ✓ ${name} configured`)\n }\n\n for (const name of skipped) {\n console.log(` ○ ${name} skipped (already configured or unavailable)`)\n }\n\n console.log(`\\nDone! Configured for ${installed.length} agent(s).`)\n}\n"],"mappings":"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","names":["exec","promisify","execAsync","promisify","exec","exec","promisify","fs","execAsync","promisify","exec","fs","fs","path","fs","path","path","fs"]}
|