cliskill 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/LICENSE +21 -0
- package/README.md +470 -0
- package/dist/bootstrap/cli.d.ts +21 -0
- package/dist/bootstrap/cli.js +9 -0
- package/dist/bootstrap/cli.js.map +1 -0
- package/dist/chunk-AJENHWD3.js +103 -0
- package/dist/chunk-AJENHWD3.js.map +1 -0
- package/dist/chunk-ULZHJVWD.js +9945 -0
- package/dist/chunk-ULZHJVWD.js.map +1 -0
- package/dist/index.d.ts +2018 -0
- package/dist/index.js +1658 -0
- package/dist/index.js.map +1 -0
- package/dist/paths-OODUHG6V.js +39 -0
- package/dist/paths-OODUHG6V.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/memory/store.ts","../src/extensions/skill-loader.ts","../src/extensions/skill-registry.ts","../src/safety/permissions.ts","../src/safety/command-inspector.ts","../src/services/history.ts","../src/hooks/registry.ts","../src/hooks/executor.ts","../src/utils/bash-parser.ts","../src/mcp/client.ts","../src/mcp/manager.ts","../src/tasks/manager.ts","../src/tasks/executor.ts","../src/swarm/coordinator.ts"],"sourcesContent":["import { readFile, writeFile, mkdir, readdir, stat, unlink } from 'node:fs/promises'\r\nimport { join, resolve } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport type { MemoryEntry, MemoryConfig } from './types.js'\r\nimport { DEFAULT_MEMORY_DIR } from '../config/constants.js'\r\n\r\nconst DEFAULT_CONFIG: MemoryConfig = {\r\n memoryDir: DEFAULT_MEMORY_DIR,\r\n maxEntrypointSize: 25_000,\r\n maxTopicFiles: 50,\r\n}\r\n\r\n/**\r\n * File-based memory store.\r\n * Stores memories in a directory structure:\r\n * .cliskill/memory/\r\n * MEMORY.md — entrypoint (summary)\r\n * topics/\r\n * project.md — topic-specific memories\r\n * preferences.md\r\n * ...\r\n */\r\nexport class MemoryStore {\r\n private config: MemoryConfig\r\n private rootDir: string\r\n private cache = new Map<string, MemoryEntry>()\r\n private loaded = false\r\n\r\n constructor(projectRoot: string, config?: Partial<MemoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n this.rootDir = resolve(projectRoot, this.config.memoryDir)\r\n }\r\n\r\n /**\r\n * Initialize the memory directory structure.\r\n */\r\n async init(): Promise<void> {\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (!existsSync(entrypointPath)) {\r\n await writeFile(\r\n entrypointPath,\r\n '# Project Memory\\n\\nThis file contains persistent memory for the AI assistant.\\n',\r\n 'utf-8',\r\n )\r\n }\r\n\r\n await this.load()\r\n }\r\n\r\n /**\r\n * Load all memories from disk into cache.\r\n */\r\n async load(): Promise<void> {\r\n this.cache.clear()\r\n\r\n const topicsDir = join(this.rootDir, 'topics')\r\n if (existsSync(topicsDir)) {\r\n const files = await readdir(topicsDir)\r\n for (const file of files) {\r\n if (file.endsWith('.md')) {\r\n const topic = file.replace('.md', '')\r\n const filePath = join(topicsDir, file)\r\n const content = await readFile(filePath, 'utf-8')\r\n const fileStat = await stat(filePath)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: fileStat.birthtimeMs,\r\n lastAccessedAt: fileStat.mtimeMs,\r\n })\r\n }\r\n }\r\n }\r\n\r\n this.loaded = true\r\n }\r\n\r\n /**\r\n * Get a memory by topic.\r\n */\r\n get(topic: string): MemoryEntry | undefined {\r\n return this.cache.get(topic)\r\n }\r\n\r\n /**\r\n * Get all memories.\r\n */\r\n getAll(): MemoryEntry[] {\r\n return Array.from(this.cache.values())\r\n }\r\n\r\n /**\r\n * Save a memory entry to disk.\r\n */\r\n async set(topic: string, content: string): Promise<void> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n await mkdir(join(this.rootDir, 'topics'), { recursive: true })\r\n await writeFile(filePath, content, 'utf-8')\r\n\r\n const now = Date.now()\r\n const existing = this.cache.get(topic)\r\n this.cache.set(topic, {\r\n id: topic,\r\n topic,\r\n content,\r\n createdAt: existing?.createdAt ?? now,\r\n lastAccessedAt: now,\r\n })\r\n }\r\n\r\n /**\r\n * Delete a memory by topic.\r\n */\r\n async delete(topic: string): Promise<boolean> {\r\n const filePath = join(this.rootDir, 'topics', `${topic}.md`)\r\n if (existsSync(filePath)) {\r\n await unlink(filePath)\r\n this.cache.delete(topic)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n /**\r\n * Search memories by keyword.\r\n */\r\n search(query: string): MemoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.getAll()\r\n .filter(\r\n (entry) =>\r\n entry.content.toLowerCase().includes(lowerQuery) ||\r\n entry.topic.toLowerCase().includes(lowerQuery),\r\n )\r\n .sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n /**\r\n * Get the entrypoint (MEMORY.md) content.\r\n */\r\n async getEntrypoint(): Promise<string> {\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n if (existsSync(entrypointPath)) {\r\n return readFile(entrypointPath, 'utf-8')\r\n }\r\n return ''\r\n }\r\n\r\n /**\r\n * Update the entrypoint (MEMORY.md) content.\r\n */\r\n async setEntrypoint(content: string): Promise<void> {\r\n if (content.length > this.config.maxEntrypointSize) {\r\n content = content.slice(0, this.config.maxEntrypointSize) + '\\n\\n... (truncated)'\r\n }\r\n const entrypointPath = join(this.rootDir, 'MEMORY.md')\r\n await writeFile(entrypointPath, content, 'utf-8')\r\n }\r\n\r\n /**\r\n * Build a context string from relevant memories for inclusion in system prompt.\r\n */\r\n async buildContext(query?: string, maxTokens: number = 2000): Promise<string> {\r\n let memories: MemoryEntry[]\r\n\r\n if (query) {\r\n memories = this.search(query)\r\n } else {\r\n memories = this.getAll().sort((a, b) => b.lastAccessedAt - a.lastAccessedAt)\r\n }\r\n\r\n const entrypoint = await this.getEntrypoint()\r\n let context = ''\r\n\r\n if (entrypoint) {\r\n context += `## Project Memory\\n${entrypoint}\\n\\n`\r\n }\r\n\r\n for (const memory of memories) {\r\n const addition = `### ${memory.topic}\\n${memory.content.slice(0, 500)}\\n\\n`\r\n // Rough token estimation: ~4 chars per token\r\n if ((context.length + addition.length) / 4 > maxTokens) break\r\n context += addition\r\n }\r\n\r\n return context.trim()\r\n }\r\n}\r\n","import { readFile, readdir } from 'node:fs/promises'\r\nimport { join } from 'node:path'\r\nimport { existsSync } from 'node:fs'\r\nimport type { SkillDefinition } from './types.js'\r\n\r\n/**\r\n * Load skills from .md files in a directory.\r\n * Skills use YAML frontmatter for metadata:\r\n *\r\n * ---\r\n * name: debug\r\n * description: Debug assistant mode\r\n * aliases: [dbg, troubleshoot]\r\n * allowedTools: [bash, file_read, glob]\r\n * ---\r\n *\r\n * Skill prompt content here...\r\n */\r\nexport async function loadSkillsFromDir(dir: string): Promise<SkillDefinition[]> {\r\n if (!existsSync(dir)) return []\r\n\r\n const skills: SkillDefinition[] = []\r\n const files = await readdir(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n const content = await readFile(filePath, 'utf-8')\r\n const skill = parseSkillMarkdown(content, filePath)\r\n\r\n if (skill) {\r\n skills.push(skill)\r\n }\r\n }\r\n\r\n return skills\r\n}\r\n\r\n/**\r\n * Parse a skill from markdown with YAML frontmatter.\r\n */\r\nexport function parseSkillMarkdown(content: string, sourcePath?: string): SkillDefinition | null {\r\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/)\r\n if (!frontmatterMatch) {\r\n const name = sourcePath\r\n ? sourcePath.split(/[\\\\/]/).pop()?.replace('.md', '') ?? 'unnamed'\r\n : 'unnamed'\r\n return {\r\n name,\r\n description: `Skill: ${name}`,\r\n prompt: content.trim(),\r\n builtin: false,\r\n sourcePath,\r\n }\r\n }\r\n\r\n const [, frontmatter, body] = frontmatterMatch\r\n const metadata = parseSimpleYaml(frontmatter)\r\n\r\n if (!metadata.name) {\r\n metadata.name = sourcePath\r\n ? sourcePath.split(/[\\\\/]/).pop()?.replace('.md', '') ?? 'unnamed'\r\n : 'unnamed'\r\n }\r\n\r\n return {\r\n name: metadata.name,\r\n description: metadata.description ?? `Skill: ${metadata.name}`,\r\n aliases: metadata.aliases\r\n ? String(metadata.aliases)\r\n .replace(/^\\[(.+)\\]$/, '$1')\r\n .split(',')\r\n .map((s: string) => s.trim())\r\n : undefined,\r\n prompt: body.trim(),\r\n allowedTools: metadata.allowedTools\r\n ? String(metadata.allowedTools)\r\n .replace(/^\\[(.+)\\]$/, '$1')\r\n .split(',')\r\n .map((s: string) => s.trim())\r\n : undefined,\r\n builtin: false,\r\n sourcePath,\r\n }\r\n}\r\n\r\n/**\r\n * Minimal YAML parser for simple key-value pairs.\r\n * Handles: name: value, name: [a, b, c]\r\n */\r\nfunction parseSimpleYaml(yaml: string): Record<string, string> {\r\n const result: Record<string, string> = {}\r\n\r\n for (const line of yaml.split('\\n')) {\r\n const trimmed = line.trim()\r\n if (!trimmed || trimmed.startsWith('#')) continue\r\n\r\n const colonIndex = trimmed.indexOf(':')\r\n if (colonIndex === -1) continue\r\n\r\n const key = trimmed.slice(0, colonIndex).trim()\r\n const value = trimmed.slice(colonIndex + 1).trim()\r\n\r\n result[key] = value\r\n }\r\n\r\n return result\r\n}\r\n","import type { SkillDefinition } from './types.js'\r\nimport { loadSkillsFromDir } from './skill-loader.js'\r\nimport { join } from 'node:path'\r\nimport { getGlobalSkillsDir } from '../config/paths.js'\r\n\r\n/**\r\n * Registry of available skills.\r\n * Manages skill registration, lookup, and loading from disk.\r\n */\r\nexport class SkillRegistry {\r\n private skills = new Map<string, SkillDefinition>()\r\n private aliasIndex = new Map<string, string>()\r\n\r\n /** Register a skill */\r\n register(skill: SkillDefinition): void {\r\n this.skills.set(skill.name, skill)\r\n if (skill.aliases) {\r\n for (const alias of skill.aliases) {\r\n this.aliasIndex.set(alias.toLowerCase(), skill.name)\r\n }\r\n }\r\n }\r\n\r\n /** Get a skill by name or alias */\r\n get(nameOrAlias: string): SkillDefinition | undefined {\r\n const aliasTarget = this.aliasIndex.get(nameOrAlias.toLowerCase())\r\n return this.skills.get(aliasTarget ?? nameOrAlias)\r\n }\r\n\r\n /** Get all registered skills */\r\n getAll(): SkillDefinition[] {\r\n return Array.from(this.skills.values())\r\n }\r\n\r\n /** Check if a skill exists */\r\n has(name: string): boolean {\r\n return this.skills.has(name) || this.aliasIndex.has(name.toLowerCase())\r\n }\r\n\r\n /** Unregister a skill */\r\n unregister(name: string): void {\r\n const skill = this.skills.get(name)\r\n if (skill?.aliases) {\r\n for (const alias of skill.aliases) {\r\n this.aliasIndex.delete(alias.toLowerCase())\r\n }\r\n }\r\n this.skills.delete(name)\r\n }\r\n\r\n /**\r\n * Load skills from a directory.\r\n * Returns the number of skills loaded.\r\n */\r\n async loadFromDir(dir: string): Promise<number> {\r\n const skills = await loadSkillsFromDir(dir)\r\n for (const skill of skills) {\r\n this.register(skill)\r\n }\r\n return skills.length\r\n }\r\n\r\n /**\r\n * Load skills from standard locations:\r\n * 1. ~/.cliskill/skills/ (global user skills)\r\n * 2. .cliskill/skills/ (project skills)\r\n */\r\n async loadStandardSkills(projectRoot: string): Promise<number> {\r\n let count = 0\r\n\r\n const globalDir = getGlobalSkillsDir()\r\n count += await this.loadFromDir(globalDir)\r\n\r\n const projectDir = join(projectRoot, '.cliskill', 'skills')\r\n count += await this.loadFromDir(projectDir)\r\n\r\n return count\r\n }\r\n\r\n /**\r\n * Get skill prompt for injection into system prompt.\r\n */\r\n getSkillPrompt(nameOrAlias: string): string | undefined {\r\n const skill = this.get(nameOrAlias)\r\n return skill?.prompt\r\n }\r\n}\r\n","import type { RiskLevel } from '../tools/contract.js'\r\n\r\n/** Permission mode for the session */\r\nexport type PermissionMode = 'ask' | 'auto-accept' | 'plan'\r\n\r\n/** A rule that allows or denies an operation */\r\nexport interface PermissionRule {\r\n /** Tool name pattern (e.g., \"bash\", \"file_*\") */\r\n tool: string\r\n /** Content pattern (e.g., \"git *\", \"rm *\") */\r\n contentPattern?: string\r\n /** Whether this rule allows or denies */\r\n allow: boolean\r\n}\r\n\r\n/** Result of a permission check */\r\nexport interface PermissionResult {\r\n allowed: boolean\r\n reason?: string\r\n}\r\n\r\n/**\r\n * Permission manager that evaluates tool execution requests\r\n * against configured rules and the current permission mode.\r\n */\r\nexport class PermissionManager {\r\n private mode: PermissionMode\r\n private rules: PermissionRule[] = []\r\n private sessionDecisions = new Map<string, boolean>()\r\n\r\n constructor(mode: PermissionMode, rules?: PermissionRule[]) {\r\n this.mode = mode\r\n this.rules = rules ?? []\r\n }\r\n\r\n /**\r\n * Check if a tool operation is allowed.\r\n */\r\n check(\r\n toolName: string,\r\n riskLevel: RiskLevel,\r\n content?: string,\r\n ): PermissionResult {\r\n if (this.mode === 'auto-accept') {\r\n return { allowed: true, reason: 'auto-accept mode' }\r\n }\r\n\r\n if (this.mode === 'plan') {\r\n if (riskLevel === 'readonly') {\r\n return { allowed: true, reason: 'readonly in plan mode' }\r\n }\r\n return { allowed: false, reason: `${riskLevel} operations not allowed in plan mode` }\r\n }\r\n\r\n // Ask mode: check rules first\r\n for (const rule of this.rules) {\r\n if (this.matchTool(toolName, rule.tool)) {\r\n if (!rule.contentPattern || (content && this.matchContent(content, rule.contentPattern))) {\r\n return {\r\n allowed: rule.allow,\r\n reason: rule.allow ? `Allowed by rule: ${rule.tool}` : `Denied by rule: ${rule.tool}`,\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check session decisions (user already approved this exact operation)\r\n const sessionKey = `${toolName}:${content ?? ''}`\r\n const sessionDecision = this.sessionDecisions.get(sessionKey)\r\n if (sessionDecision !== undefined) {\r\n return { allowed: sessionDecision, reason: 'session decision' }\r\n }\r\n\r\n return { allowed: false, reason: 'No rule matched — requires user approval' }\r\n }\r\n\r\n /**\r\n * Record a user decision for the session.\r\n */\r\n recordDecision(toolName: string, content: string, allowed: boolean): void {\r\n const key = `${toolName}:${content}`\r\n this.sessionDecisions.set(key, allowed)\r\n }\r\n\r\n /**\r\n * Add a permission rule.\r\n */\r\n addRule(rule: PermissionRule): void {\r\n this.rules.push(rule)\r\n }\r\n\r\n /**\r\n * Set the permission mode.\r\n */\r\n setMode(mode: PermissionMode): void {\r\n this.mode = mode\r\n }\r\n\r\n /**\r\n * Get the current permission mode.\r\n */\r\n getMode(): PermissionMode {\r\n return this.mode\r\n }\r\n\r\n private matchTool(toolName: string, pattern: string): boolean {\r\n if (pattern === '*') return true\r\n const regex = new RegExp('^' + pattern.replace(/\\*/g, '.*') + '$')\r\n return regex.test(toolName)\r\n }\r\n\r\n private matchContent(content: string, pattern: string): boolean {\r\n if (pattern.endsWith('*')) {\r\n return content.startsWith(pattern.slice(0, -1).trim())\r\n }\r\n return content.includes(pattern)\r\n }\r\n}\r\n","/**\r\n * Simple command inspector for shell commands.\r\n * Analyzes commands for potential security risks without full AST parsing.\r\n */\r\n\r\n/** Risk classification of a shell command */\r\nexport type CommandRisk = 'safe' | 'moderate' | 'dangerous'\r\n\r\n/** Result of command analysis */\r\nexport interface CommandAnalysis {\r\n risk: CommandRisk\r\n reason: string\r\n /** The base command (first word) */\r\n baseCommand: string\r\n /** Whether the command modifies the filesystem */\r\n modifiesFiles: boolean\r\n /** Whether the command accesses the network */\r\n accessesNetwork: boolean\r\n}\r\n\r\n/** Commands that are generally safe (readonly) */\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'dir', 'cat', 'type', 'head', 'tail', 'less', 'more',\r\n 'pwd', 'echo', 'whoami', 'hostname', 'date', 'uname',\r\n 'git status', 'git log', 'git diff', 'git branch', 'git show', 'git remote',\r\n 'node --version', 'npm --version', 'npx --version',\r\n 'which', 'where', 'env', 'printenv',\r\n 'grep', 'find', 'wc', 'sort', 'uniq', 'diff',\r\n 'ps', 'top', 'df', 'du', 'free',\r\n 'curl --head', 'curl -I',\r\n])\r\n\r\n/** Patterns that are always dangerous */\r\nconst DANGEROUS_PATTERNS = [\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\//,\r\n /\\brm\\s+(-rf?|-fr?)\\s+\\*/,\r\n /\\bdd\\s+if=/,\r\n /\\bmkfs\\./,\r\n /\\b(format\\s+[A-Z]:)/i,\r\n />\\s*\\/dev\\//,\r\n /\\bshutdown\\b/,\r\n /\\breboot\\b/,\r\n /\\binit\\s+[06]\\b/,\r\n /\\bsudo\\s+rm\\b/,\r\n /\\bchmod\\s+(-R\\s+)?000\\b/,\r\n /\\bchown\\s+(-R\\s+)?root\\b/,\r\n]\r\n\r\n/** Commands that modify the filesystem */\r\nconst FILE_MODIFYING_COMMANDS = new Set([\r\n 'touch', 'mkdir', 'cp', 'mv', 'rm', 'rmdir',\r\n 'chmod', 'chown', 'ln',\r\n 'npm install', 'npm uninstall', 'npm update',\r\n 'pip install', 'pip uninstall',\r\n 'git add', 'git commit', 'git push', 'git merge', 'git rebase', 'git reset', 'git checkout',\r\n 'docker', 'kubectl',\r\n])\r\n\r\n/** Commands that access the network */\r\nconst NETWORK_COMMANDS = new Set([\r\n 'curl', 'wget', 'ssh', 'scp', 'rsync', 'nc', 'netcat',\r\n 'ping', 'traceroute', 'dig', 'nslookup',\r\n 'npm publish', 'git push', 'git fetch', 'git pull',\r\n])\r\n\r\n/**\r\n * Analyze a shell command for security risks.\r\n */\r\nexport function inspectCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const baseCommand = trimmed.split(/\\s+/)[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n\r\n for (const pattern of DANGEROUS_PATTERNS) {\r\n if (pattern.test(fullCommand)) {\r\n return {\r\n risk: 'dangerous',\r\n reason: 'Potentially destructive command detected',\r\n baseCommand,\r\n modifiesFiles: true,\r\n accessesNetwork: false,\r\n }\r\n }\r\n }\r\n\r\n const pipeParts = trimmed.split(/\\|/).map(p => p.trim())\r\n let maxRisk: CommandRisk = 'safe'\r\n let modifiesFiles = false\r\n let accessesNetwork = false\r\n\r\n for (const part of pipeParts) {\r\n const analysis = analyzeSingleCommand(part)\r\n if (analysis.risk === 'dangerous') return analysis\r\n if (analysis.risk === 'moderate') maxRisk = 'moderate'\r\n if (analysis.modifiesFiles) modifiesFiles = true\r\n if (analysis.accessesNetwork) accessesNetwork = true\r\n }\r\n\r\n return {\r\n risk: maxRisk,\r\n reason: maxRisk === 'safe' ? 'Readonly or low-risk command' : 'Command may modify files or access network',\r\n baseCommand,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction analyzeSingleCommand(command: string): CommandAnalysis {\r\n const trimmed = command.trim()\r\n const parts = trimmed.split(/\\s+/)\r\n const base = parts[0] ?? ''\r\n const fullCommand = trimmed.toLowerCase()\r\n const firstTwoWords = parts.slice(0, 2).join(' ').toLowerCase()\r\n\r\n if (SAFE_COMMANDS.has(fullCommand) || SAFE_COMMANDS.has(firstTwoWords)) {\r\n return {\r\n risk: 'safe',\r\n reason: 'Known safe command',\r\n baseCommand: base,\r\n modifiesFiles: false,\r\n accessesNetwork: false,\r\n }\r\n }\r\n\r\n const modifiesFiles = matchesAny(fullCommand, firstTwoWords, FILE_MODIFYING_COMMANDS)\r\n const accessesNetwork = matchesAny(fullCommand, firstTwoWords, NETWORK_COMMANDS)\r\n\r\n let risk: CommandRisk = 'safe'\r\n if (modifiesFiles || accessesNetwork) risk = 'moderate'\r\n\r\n return {\r\n risk,\r\n reason: risk === 'safe' ? 'Low-risk command' : modifiesFiles ? 'Modifies filesystem' : 'Accesses network',\r\n baseCommand: base,\r\n modifiesFiles,\r\n accessesNetwork,\r\n }\r\n}\r\n\r\nfunction matchesAny(fullCommand: string, firstTwoWords: string, set: Set<string>): boolean {\r\n return set.has(fullCommand) || set.has(firstTwoWords) || Array.from(set).some(cmd => fullCommand.startsWith(cmd))\r\n}\r\n","import { readFile, writeFile, mkdir, appendFile } from 'node:fs/promises'\r\nimport { existsSync } from 'node:fs'\r\nimport { dirname } from 'node:path'\r\nimport { getHistoryPath } from '../config/paths.js'\r\n\r\nexport interface HistoryEntry {\r\n content: string\r\n timestamp: number\r\n type: 'user' | 'paste'\r\n}\r\n\r\nexport interface HistoryConfig {\r\n maxEntries: number\r\n filePath: string\r\n}\r\n\r\nconst DEFAULT_CONFIG: HistoryConfig = {\r\n maxEntries: 1000,\r\n filePath: getHistoryPath(),\r\n}\r\n\r\nexport class HistoryManager {\r\n private entries: HistoryEntry[] = []\r\n private config: HistoryConfig\r\n private cursorIndex = -1\r\n\r\n constructor(config?: Partial<HistoryConfig>) {\r\n this.config = { ...DEFAULT_CONFIG, ...config }\r\n }\r\n\r\n addEntry(content: string, type: 'user' | 'paste' = 'user'): void {\r\n const trimmed = content.trim()\r\n if (!trimmed) return\r\n\r\n const lastEntry = this.entries[this.entries.length - 1]\r\n if (lastEntry && lastEntry.content === trimmed) return\r\n\r\n this.entries.push({\r\n content: trimmed,\r\n timestamp: Date.now(),\r\n type,\r\n })\r\n\r\n if (this.entries.length > this.config.maxEntries) {\r\n this.entries = this.entries.slice(-this.config.maxEntries)\r\n }\r\n\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n getEntries(): HistoryEntry[] {\r\n return [...this.entries]\r\n }\r\n\r\n search(query: string): HistoryEntry[] {\r\n const lowerQuery = query.toLowerCase()\r\n return this.entries.filter(e => e.content.toLowerCase().includes(lowerQuery))\r\n }\r\n\r\n getRecent(count: number): HistoryEntry[] {\r\n return this.entries.slice(-count)\r\n }\r\n\r\n clear(): void {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n }\r\n\r\n navigateUp(): string | null {\r\n if (this.entries.length === 0) return null\r\n if (this.cursorIndex > 0) {\r\n this.cursorIndex--\r\n } else if (this.cursorIndex === -1 || this.cursorIndex === this.entries.length) {\r\n this.cursorIndex = this.entries.length - 1\r\n }\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n\r\n navigateDown(): string | null {\r\n if (this.cursorIndex < this.entries.length - 1) {\r\n this.cursorIndex++\r\n return this.entries[this.cursorIndex]?.content ?? null\r\n }\r\n this.cursorIndex = this.entries.length\r\n return null\r\n }\r\n\r\n async save(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n const dir = dirname(filePath)\r\n\r\n if (!existsSync(dir)) {\r\n await mkdir(dir, { recursive: true })\r\n }\r\n\r\n const lines = this.entries.map(e => JSON.stringify(e)).join('\\n')\r\n await writeFile(filePath, lines, 'utf-8')\r\n }\r\n\r\n async load(): Promise<void> {\r\n const filePath = this.resolvePath()\r\n\r\n if (!existsSync(filePath)) {\r\n this.entries = []\r\n this.cursorIndex = -1\r\n return\r\n }\r\n\r\n const content = await readFile(filePath, 'utf-8')\r\n const lines = content.split('\\n').filter(Boolean)\r\n const loaded: HistoryEntry[] = []\r\n\r\n for (const line of lines) {\r\n try {\r\n const entry = JSON.parse(line) as HistoryEntry\r\n if (entry.content && typeof entry.content === 'string' && entry.timestamp) {\r\n loaded.push({\r\n content: entry.content,\r\n timestamp: entry.timestamp,\r\n type: entry.type ?? 'user',\r\n })\r\n }\r\n } catch {\r\n // skip malformed lines\r\n }\r\n }\r\n\r\n this.entries = loaded.slice(-this.config.maxEntries)\r\n this.cursorIndex = this.entries.length\r\n }\r\n\r\n private resolvePath(): string {\r\n if (this.config.filePath.startsWith('~')) {\r\n return getHistoryPath()\r\n }\r\n return this.config.filePath\r\n }\r\n}\r\n","import type { HookDefinition, HookEvent } from './types.js';\r\n\r\nexport class HookRegistry {\r\n private hooks = new Map<string, HookDefinition>();\r\n\r\n register(hook: HookDefinition): void {\r\n this.hooks.set(hook.id, hook);\r\n }\r\n\r\n unregister(id: string): void {\r\n this.hooks.delete(id);\r\n }\r\n\r\n getHooksForEvent(event: HookEvent): HookDefinition[] {\r\n return Array.from(this.hooks.values()).filter(\r\n (h) => h.event === event && h.enabled,\r\n );\r\n }\r\n\r\n getAll(): HookDefinition[] {\r\n return Array.from(this.hooks.values());\r\n }\r\n\r\n loadFromConfig(config: unknown): void {\r\n if (!config || typeof config !== 'object') return;\r\n\r\n const cfg = config as Record<string, unknown>;\r\n const hooksArr = cfg.hooks;\r\n if (!Array.isArray(hooksArr)) return;\r\n\r\n for (const raw of hooksArr) {\r\n if (!raw || typeof raw !== 'object') continue;\r\n const def = raw as Record<string, unknown>;\r\n\r\n const hook: HookDefinition = {\r\n id: String(def.id ?? `hook_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`),\r\n event: String(def.event ?? 'pre_tool_use') as HookEvent,\r\n type: def.type === 'function' ? 'function' : 'command',\r\n command: typeof def.command === 'string' ? def.command : undefined,\r\n handler: typeof def.handler === 'string' ? def.handler : undefined,\r\n condition:\r\n def.condition && typeof def.condition === 'object'\r\n ? (def.condition as { tool_name?: string; pattern?: string })\r\n : undefined,\r\n timeout: typeof def.timeout === 'number' ? def.timeout : 30_000,\r\n enabled: def.enabled !== false,\r\n };\r\n\r\n this.register(hook);\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.hooks.clear();\r\n }\r\n}\r\n","import { exec } from 'node:child_process';\r\nimport type { HookDefinition, HookContext, HookResult } from './types.js';\r\nimport type { HookRegistry } from './registry.js';\r\n\r\nexport class HookExecutor {\r\n private registry: HookRegistry;\r\n\r\n constructor(registry: HookRegistry) {\r\n this.registry = registry;\r\n }\r\n\r\n async executeHooks(event: HookContext['event'], context: HookContext): Promise<HookResult[]> {\r\n const hooks = this.registry.getHooksForEvent(event);\r\n const matched = hooks.filter((h) => this.matchesCondition(h, context));\r\n const results: HookResult[] = [];\r\n\r\n for (const hook of matched) {\r\n const result = await this.executeOne(hook, context);\r\n results.push(result);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private matchesCondition(hook: HookDefinition, context: HookContext): boolean {\r\n if (!hook.condition) return true;\r\n\r\n if (hook.condition.tool_name && context.toolName) {\r\n if (hook.condition.tool_name !== context.toolName) return false;\r\n }\r\n\r\n if (hook.condition.pattern) {\r\n try {\r\n const regex = new RegExp(hook.condition.pattern);\r\n const text = context.toolOutput ?? String(context.toolInput ?? '');\r\n if (!regex.test(text)) return false;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private executeOne(hook: HookDefinition, context: HookContext): Promise<HookResult> {\r\n const start = Date.now();\r\n\r\n if (hook.type === 'function') {\r\n return Promise.resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: `Function handler \"${hook.handler}\" executed (stub)`,\r\n duration: Date.now() - start,\r\n });\r\n }\r\n\r\n return this.executeCommand(hook, context, start);\r\n }\r\n\r\n private executeCommand(\r\n hook: HookDefinition,\r\n context: HookContext,\r\n start: number,\r\n ): Promise<HookResult> {\r\n const command = hook.command ?? '';\r\n const env: Record<string, string> = {\r\n ...process.env as Record<string, string>,\r\n CLISKILL_EVENT: context.event,\r\n CLISKILL_TOOL_NAME: context.toolName ?? '',\r\n CLISKILL_WORKING_DIR: context.workingDirectory,\r\n };\r\n\r\n if (context.error) {\r\n env.CLISKILL_ERROR_MESSAGE = context.error.message;\r\n }\r\n\r\n return new Promise<HookResult>((resolve) => {\r\n exec(\r\n command,\r\n {\r\n timeout: hook.timeout,\r\n cwd: context.workingDirectory,\r\n env,\r\n },\r\n (error, stdout, stderr) => {\r\n const duration = Date.now() - start;\r\n if (error) {\r\n resolve({\r\n hookId: hook.id,\r\n success: false,\r\n output: stdout?.trim() ?? '',\r\n error: stderr?.trim() || error.message,\r\n duration,\r\n });\r\n } else {\r\n resolve({\r\n hookId: hook.id,\r\n success: true,\r\n output: stdout?.trim() ?? '',\r\n duration,\r\n });\r\n }\r\n },\r\n );\r\n });\r\n }\r\n}\r\n","export interface ParsedCommand {\r\n command: string;\r\n args: string[];\r\n operators: string[];\r\n subCommands: ParsedCommand[];\r\n redirections: Redirection[];\r\n envVars: Record<string, string>;\r\n isBackground: boolean;\r\n isSubshell: boolean;\r\n}\r\n\r\nexport interface Redirection {\r\n type: '>' | '>>' | '<' | '2>' | '2>>' | '&>' | '|';\r\n target: string;\r\n}\r\n\r\nexport interface CommandAnalysis {\r\n commands: string[];\r\n isPipe: boolean;\r\n isChained: boolean;\r\n hasRedirection: boolean;\r\n hasSubshell: boolean;\r\n isBackground: boolean;\r\n envVarCount: number;\r\n estimatedRisk: 'safe' | 'moderate' | 'dangerous';\r\n}\r\n\r\nconst SAFE_COMMANDS = new Set([\r\n 'ls', 'cat', 'pwd', 'echo', 'head', 'tail', 'grep', 'find',\r\n 'wc', 'sort', 'uniq', 'date', 'whoami', 'hostname', 'uname',\r\n 'which', 'type', 'file', 'stat', 'df', 'du', 'ps', 'top',\r\n 'env', 'printenv', 'id', 'dirname', 'basename', 'realpath',\r\n]);\r\n\r\nconst MODERATE_COMMANDS = new Set([\r\n 'curl', 'wget', 'npm', 'pip', 'git', 'make', 'docker',\r\n 'node', 'python', 'python3', 'java', 'go', 'cargo',\r\n 'apt', 'yum', 'brew', 'npx', 'yarn', 'pnpm',\r\n]);\r\n\r\nconst DANGEROUS_COMMANDS = new Set([\r\n 'rm', 'mv', 'chmod', 'chown', 'sudo', 'su', 'dd', 'mkfs',\r\n 'format', 'fdisk', 'mkfs.ext4', 'mkfs.ntfs', 'shutdown',\r\n 'reboot', 'halt', 'poweroff', 'kill', 'killall',\r\n]);\r\n\r\nconst REDIRECTION_RE = /\\s(&?>{1,2}|2>>?|<{1,2})\\s*(\\S+)/g;\r\nconst ENV_VAR_RE = /^([A-Za-z_][A-Za-z0-9_]*)=(\\S*)\\s+/;\r\nconst SUBSHELL_RE = /\\$\\(([^)]+)\\)/;\r\nconst OPERATOR_SPLIT_RE = /\\s*(\\|\\||&&|;|\\|)\\s*/;\r\n\r\nexport function parseCommand(input: string): ParsedCommand {\r\n const trimmed = input.trim();\r\n let remaining = trimmed;\r\n\r\n const envVars: Record<string, string> = {};\r\n let envMatch: RegExpExecArray | null;\r\n while ((envMatch = ENV_VAR_RE.exec(remaining)) !== null) {\r\n envVars[envMatch[1]] = envMatch[2];\r\n remaining = remaining.slice(envMatch[0].length);\r\n }\r\n\r\n const isBackground = /(?:^|\\s)&\\s*$/.test(remaining);\r\n if (isBackground) {\r\n remaining = remaining.replace(/&\\s*$/, '').trim();\r\n }\r\n\r\n const redirections: Redirection[] = [];\r\n let redirMatch: RegExpExecArray | null;\r\n while ((redirMatch = REDIRECTION_RE.exec(remaining)) !== null) {\r\n const kind = redirMatch[1];\r\n const target = redirMatch[2];\r\n if (kind === '|') {\r\n redirections.push({ type: '|', target });\r\n } else if (kind === '>>') {\r\n redirections.push({ type: '>>', target });\r\n } else if (kind === '2>>') {\r\n redirections.push({ type: '2>>', target });\r\n } else if (kind === '2>') {\r\n redirections.push({ type: '2>', target });\r\n } else if (kind === '&>') {\r\n redirections.push({ type: '&>', target });\r\n } else if (kind === '<' || kind === '<<') {\r\n redirections.push({ type: '<', target });\r\n } else {\r\n redirections.push({ type: '>', target });\r\n }\r\n }\r\n remaining = remaining.replace(REDIRECTION_RE, ' ').trim();\r\n\r\n const isSubshell = SUBSHELL_RE.test(remaining);\r\n const subCommands: ParsedCommand[] = [];\r\n let subMatch: RegExpExecArray | null;\r\n const subshellGlobal = /\\$\\(([^)]+)\\)/g;\r\n while ((subMatch = subshellGlobal.exec(remaining)) !== null) {\r\n subCommands.push(parseCommand(subMatch[1]));\r\n }\r\n\r\n const parts = remaining.split(OPERATOR_SPLIT_RE).filter(Boolean);\r\n const operators: string[] = [];\r\n const commandParts: string[] = [];\r\n\r\n for (const part of parts) {\r\n if (['||', '&&', ';', '|'].includes(part)) {\r\n operators.push(part);\r\n } else {\r\n commandParts.push(part);\r\n }\r\n }\r\n\r\n let command = '';\r\n let args: string[] = [];\r\n\r\n if (commandParts.length > 0) {\r\n const first = commandParts[0];\r\n const tokens = tokenize(first);\r\n command = tokens[0] ?? '';\r\n args = tokens.slice(1);\r\n }\r\n\r\n const parsedSubCommands = commandParts.slice(1).map((cp) => {\r\n const tokens = tokenize(cp);\r\n return {\r\n command: tokens[0] ?? '',\r\n args: tokens.slice(1),\r\n operators: [],\r\n subCommands: [],\r\n redirections: [],\r\n envVars: {},\r\n isBackground: false,\r\n isSubshell: false,\r\n } satisfies ParsedCommand;\r\n });\r\n\r\n return {\r\n command,\r\n args,\r\n operators,\r\n subCommands: [...subCommands, ...parsedSubCommands],\r\n redirections,\r\n envVars,\r\n isBackground,\r\n isSubshell,\r\n };\r\n}\r\n\r\nexport function analyzeCommand(input: string): CommandAnalysis {\r\n const parsed = parseCommand(input);\r\n const allCommands = collectCommands(parsed);\r\n\r\n const isPipe = parsed.operators.includes('|');\r\n const isChained = parsed.operators.some((op) => op === '&&' || op === '||' || op === ';');\r\n const hasRedirection = parsed.redirections.length > 0;\r\n const hasSubshell = parsed.isSubshell || parsed.subCommands.length > 0;\r\n const envVarCount = Object.keys(parsed.envVars).length;\r\n\r\n const estimatedRisk = determineRisk(allCommands, isPipe, isChained, hasRedirection, hasSubshell);\r\n\r\n return {\r\n commands: allCommands,\r\n isPipe,\r\n isChained,\r\n hasRedirection,\r\n hasSubshell,\r\n isBackground: parsed.isBackground,\r\n envVarCount,\r\n estimatedRisk,\r\n };\r\n}\r\n\r\nfunction collectCommands(parsed: ParsedCommand): string[] {\r\n const commands: string[] = [];\r\n if (parsed.command) {\r\n commands.push(parsed.command);\r\n }\r\n for (const sub of parsed.subCommands) {\r\n commands.push(...collectCommands(sub));\r\n }\r\n return commands;\r\n}\r\n\r\nfunction determineRisk(\r\n commands: string[],\r\n isPipe: boolean,\r\n isChained: boolean,\r\n hasRedirection: boolean,\r\n hasSubshell: boolean,\r\n): 'safe' | 'moderate' | 'dangerous' {\r\n let hasDangerous = false;\r\n let hasModerate = false;\r\n\r\n for (const cmd of commands) {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n if (DANGEROUS_COMMANDS.has(base)) hasDangerous = true;\r\n else if (MODERATE_COMMANDS.has(base)) hasModerate = true;\r\n }\r\n\r\n if (hasDangerous) return 'dangerous';\r\n if (hasModerate) return 'moderate';\r\n\r\n const allSafe = commands.every((cmd) => {\r\n const base = cmd.split('/').pop() ?? cmd;\r\n return SAFE_COMMANDS.has(base);\r\n });\r\n\r\n if (allSafe && commands.length > 0) return 'safe';\r\n\r\n if (isPipe || isChained || hasRedirection || hasSubshell) {\r\n return 'moderate';\r\n }\r\n\r\n return 'moderate';\r\n}\r\n\r\nfunction tokenize(segment: string): string[] {\r\n const tokens: string[] = [];\r\n let current = '';\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let i = 0; i < segment.length; i++) {\r\n const ch = segment[i];\r\n\r\n if (ch === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (ch === '\"' && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (ch === '\\\\' && !inSingle && i + 1 < segment.length) {\r\n current += segment[i + 1];\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/\\s/.test(ch) && !inSingle && !inDouble) {\r\n if (current) {\r\n tokens.push(current);\r\n current = '';\r\n }\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n\r\n if (current) tokens.push(current);\r\n return tokens;\r\n}\r\n","import { spawn, type ChildProcess } from 'node:child_process';\r\nimport { createInterface, type Interface } from 'node:readline';\r\nimport type {\r\n MCPServerConfig,\r\n MCPTool,\r\n MCPResource,\r\n MCPPrompt,\r\n JSONRPCRequest,\r\n JSONRPCResponse,\r\n} from './types.js';\r\n\r\nconst REQUEST_TIMEOUT = 30_000;\r\n\r\nexport class MCPClient {\r\n private config: MCPServerConfig;\r\n private process: ChildProcess | null = null;\r\n private rl: Interface | null = null;\r\n private connected = false;\r\n private nextId = 1;\r\n private pendingRequests = new Map<\r\n number,\r\n { resolve: (value: JSONRPCResponse) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout> }\r\n >();\r\n private buffer = '';\r\n\r\n constructor(config: MCPServerConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n if (this.connected) return;\r\n\r\n const env: Record<string, string> = {\r\n ...process.env as Record<string, string>,\r\n ...this.config.env,\r\n };\r\n\r\n this.process = spawn(this.config.command, this.config.args, {\r\n stdio: ['pipe', 'pipe', 'pipe'],\r\n env,\r\n });\r\n\r\n this.process.on('error', (err) => {\r\n this.cleanup();\r\n throw err;\r\n });\r\n\r\n this.process.on('exit', () => {\r\n this.cleanup();\r\n });\r\n\r\n if (!this.process.stdout) {\r\n throw new Error('MCP server stdout is not available');\r\n }\r\n\r\n this.rl = createInterface({ input: this.process.stdout });\r\n\r\n this.rl.on('line', (line: string) => {\r\n this.handleLine(line);\r\n });\r\n\r\n if (this.process.stderr) {\r\n this.process.stderr.on('data', () => {\r\n // ignore stderr output\r\n });\r\n }\r\n\r\n await this.sendRequest('initialize', {\r\n protocolVersion: '2024-11-05',\r\n capabilities: {},\r\n clientInfo: { name: 'cliskill', version: '1.0.0' },\r\n });\r\n\r\n this.sendNotification('notifications/initialized', {});\r\n this.connected = true;\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (!this.process) return;\r\n\r\n for (const [, pending] of this.pendingRequests) {\r\n clearTimeout(pending.timer);\r\n pending.reject(new Error('Connection closed'));\r\n }\r\n this.pendingRequests.clear();\r\n\r\n this.process.kill('SIGTERM');\r\n this.cleanup();\r\n }\r\n\r\n async listTools(): Promise<MCPTool[]> {\r\n const response = await this.sendRequest('tools/list', {});\r\n const result = response.result as { tools?: MCPTool[] } | undefined;\r\n return result?.tools ?? [];\r\n }\r\n\r\n async callTool(name: string, args: Record<string, unknown>): Promise<unknown> {\r\n const response = await this.sendRequest('tools/call', { name, arguments: args });\r\n return response.result;\r\n }\r\n\r\n async listResources(): Promise<MCPResource[]> {\r\n const response = await this.sendRequest('resources/list', {});\r\n const result = response.result as { resources?: MCPResource[] } | undefined;\r\n return result?.resources ?? [];\r\n }\r\n\r\n async readResource(uri: string): Promise<unknown> {\r\n const response = await this.sendRequest('resources/read', { uri });\r\n return response.result;\r\n }\r\n\r\n async listPrompts(): Promise<MCPPrompt[]> {\r\n const response = await this.sendRequest('prompts/list', {});\r\n const result = response.result as { prompts?: MCPPrompt[] } | undefined;\r\n return result?.prompts ?? [];\r\n }\r\n\r\n isConnected(): boolean {\r\n return this.connected;\r\n }\r\n\r\n private sendRequest(method: string, params: Record<string, unknown>): Promise<JSONRPCResponse> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.process?.stdin) {\r\n reject(new Error('MCP server not connected'));\r\n return;\r\n }\r\n\r\n const id = this.nextId++;\r\n const request: JSONRPCRequest = { jsonrpc: '2.0', id, method, params };\r\n\r\n const timer = setTimeout(() => {\r\n this.pendingRequests.delete(id);\r\n reject(new Error(`Request timeout: ${method} (id=${id})`));\r\n }, REQUEST_TIMEOUT);\r\n\r\n this.pendingRequests.set(id, { resolve, reject, timer });\r\n\r\n const data = JSON.stringify(request) + '\\n';\r\n this.process.stdin.write(data, (err) => {\r\n if (err) {\r\n clearTimeout(timer);\r\n this.pendingRequests.delete(id);\r\n reject(err);\r\n }\r\n });\r\n });\r\n }\r\n\r\n private sendNotification(method: string, params: Record<string, unknown>): void {\r\n if (!this.process?.stdin) return;\r\n\r\n const notification = { jsonrpc: '2.0', method, params };\r\n const data = JSON.stringify(notification) + '\\n';\r\n this.process.stdin.write(data);\r\n }\r\n\r\n private handleLine(line: string): void {\r\n this.buffer += line;\r\n\r\n let response: JSONRPCResponse;\r\n try {\r\n response = JSON.parse(this.buffer) as JSONRPCResponse;\r\n } catch {\r\n return;\r\n } finally {\r\n this.buffer = '';\r\n }\r\n\r\n if (response.id !== undefined && response.id !== null) {\r\n const pending = this.pendingRequests.get(response.id);\r\n if (pending) {\r\n clearTimeout(pending.timer);\r\n this.pendingRequests.delete(response.id);\r\n pending.resolve(response);\r\n }\r\n }\r\n }\r\n\r\n private cleanup(): void {\r\n this.connected = false;\r\n this.rl?.close();\r\n this.rl = null;\r\n this.process = null;\r\n this.buffer = '';\r\n }\r\n}\r\n","import { MCPClient } from './client.js';\r\nimport type { MCPServerConfig, MCPTool } from './types.js';\r\n\r\nexport class MCPConnectionManager {\r\n private clients = new Map<string, MCPClient>();\r\n\r\n async addServer(config: MCPServerConfig): Promise<void> {\r\n const client = new MCPClient(config);\r\n await client.connect();\r\n this.clients.set(config.name, client);\r\n }\r\n\r\n async removeServer(name: string): Promise<void> {\r\n const client = this.clients.get(name);\r\n if (client) {\r\n await client.disconnect();\r\n this.clients.delete(name);\r\n }\r\n }\r\n\r\n getConnectedServers(): string[] {\r\n return Array.from(this.clients.entries())\r\n .filter(([, client]) => client.isConnected())\r\n .map(([name]) => name);\r\n }\r\n\r\n async getAllTools(): Promise<MCPTool[]> {\r\n const allTools: MCPTool[] = [];\r\n for (const [, client] of this.clients) {\r\n if (!client.isConnected()) continue;\r\n try {\r\n const tools = await client.listTools();\r\n allTools.push(...tools);\r\n } catch {\r\n // skip servers that fail to list tools\r\n }\r\n }\r\n return allTools;\r\n }\r\n\r\n async callTool(\r\n serverName: string,\r\n toolName: string,\r\n args: Record<string, unknown>,\r\n ): Promise<unknown> {\r\n const client = this.clients.get(serverName);\r\n if (!client) {\r\n throw new Error(`MCP server \"${serverName}\" not found`);\r\n }\r\n if (!client.isConnected()) {\r\n throw new Error(`MCP server \"${serverName}\" is not connected`);\r\n }\r\n return client.callTool(toolName, args);\r\n }\r\n\r\n async getToolsForServer(serverName: string): Promise<MCPTool[]> {\r\n const client = this.clients.get(serverName);\r\n if (!client || !client.isConnected()) {\r\n return [];\r\n }\r\n return client.listTools();\r\n }\r\n\r\n async disconnectAll(): Promise<void> {\r\n for (const [, client] of this.clients) {\r\n try {\r\n await client.disconnect();\r\n } catch {\r\n // ignore errors during disconnect\r\n }\r\n }\r\n this.clients.clear();\r\n }\r\n}\r\n","import type { TaskDefinition, TaskStatus, TaskEventName, TaskEventHandler } from './types.js'\r\n\r\ntype Listener = (...args: unknown[]) => void\r\n\r\nexport class TaskManager {\r\n private tasks = new Map<string, TaskDefinition>()\r\n private listeners = new Map<TaskEventName, Set<Listener>>()\r\n private idCounter = 0\r\n\r\n createTask(definition: Omit<TaskDefinition, 'id' | 'status' | 'createdAt'>): string {\r\n const id = `task_${++this.idCounter}_${Date.now()}`\r\n const task: TaskDefinition = {\r\n ...definition,\r\n id,\r\n status: 'pending',\r\n createdAt: Date.now(),\r\n progress: 0,\r\n }\r\n this.tasks.set(id, task)\r\n return id\r\n }\r\n\r\n cancelTask(id: string): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n if (task.status !== 'running' && task.status !== 'pending') return\r\n\r\n task.status = 'cancelled'\r\n task.completedAt = Date.now()\r\n this.emit('onStatusChange', id, 'cancelled')\r\n }\r\n\r\n getTask(id: string): TaskDefinition | undefined {\r\n return this.tasks.get(id)\r\n }\r\n\r\n listTasks(filter?: { status?: TaskStatus }): TaskDefinition[] {\r\n const all = Array.from(this.tasks.values())\r\n if (!filter?.status) return all\r\n return all.filter(t => t.status === filter.status)\r\n }\r\n\r\n getActiveCount(): number {\r\n let count = 0\r\n for (const task of this.tasks.values()) {\r\n if (task.status === 'running' || task.status === 'pending') count++\r\n }\r\n return count\r\n }\r\n\r\n removeTask(id: string): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n if (task.status === 'running') {\r\n throw new Error(`Cannot remove running task \"${id}\". Cancel it first.`)\r\n }\r\n this.tasks.delete(id)\r\n }\r\n\r\n clearCompleted(): void {\r\n for (const [id, task] of this.tasks) {\r\n if (task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') {\r\n this.tasks.delete(id)\r\n }\r\n }\r\n }\r\n\r\n on<E extends TaskEventName>(event: E, handler: TaskEventHandler<E>): void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set())\r\n }\r\n this.listeners.get(event)!.add(handler as Listener)\r\n }\r\n\r\n off<E extends TaskEventName>(event: E, handler: TaskEventHandler<E>): void {\r\n this.listeners.get(event)?.delete(handler as Listener)\r\n }\r\n\r\n /** @internal Update task status */\r\n updateStatus(id: string, status: TaskStatus): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n task.status = status\r\n if (status === 'running') task.startedAt = Date.now()\r\n if (status === 'completed' || status === 'failed' || status === 'cancelled') {\r\n task.completedAt = Date.now()\r\n }\r\n this.emit('onStatusChange', id, status)\r\n }\r\n\r\n /** @internal Update task progress */\r\n updateProgress(id: string, progress: number, message?: string): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n task.progress = Math.min(100, Math.max(0, progress))\r\n this.emit('onProgress', id, task.progress, message)\r\n }\r\n\r\n /** @internal Set task result */\r\n setResult(id: string, result: string): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n task.result = result\r\n task.status = 'completed'\r\n task.completedAt = Date.now()\r\n task.progress = 100\r\n this.emit('onComplete', id, result)\r\n this.emit('onStatusChange', id, 'completed')\r\n }\r\n\r\n /** @internal Set task error */\r\n setError(id: string, error: string): void {\r\n const task = this.tasks.get(id)\r\n if (!task) return\r\n task.error = error\r\n task.status = 'failed'\r\n task.completedAt = Date.now()\r\n this.emit('onError', id, error)\r\n this.emit('onStatusChange', id, 'failed')\r\n }\r\n\r\n private emit(event: TaskEventName, ...args: unknown[]): void {\r\n this.listeners.get(event)?.forEach(fn => fn(...args))\r\n }\r\n}\r\n","import type { TaskManager } from './manager.js'\r\nimport type { ProviderAdapter } from '../connect/adapter.js'\r\nimport type { ToolRegistry } from '../tools/registry.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\nimport { exec } from 'node:child_process'\r\n\r\nexport async function executeAgentTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n adapter: ProviderAdapter,\r\n tools: ToolRegistry,\r\n prompt: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n const engine = new QueryEngine(\r\n { maxTurns: 20, systemPrompt: 'You are a background agent. Complete the task concisely.' },\r\n adapter,\r\n tools,\r\n )\r\n\r\n let finalText = ''\r\n let turnsUsed = 0\r\n\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n return\r\n }\r\n\r\n switch (event.type) {\r\n case 'text_delta':\r\n finalText += event.text\r\n break\r\n case 'turn_end':\r\n turnsUsed = event.turn\r\n manager.updateProgress(taskId, Math.min(90, turnsUsed * 10))\r\n break\r\n case 'complete':\r\n finalText = finalText || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n') || 'Task completed'\r\n break\r\n case 'error':\r\n manager.setError(taskId, event.error.message)\r\n return\r\n }\r\n }\r\n\r\n manager.setResult(taskId, finalText || 'Task completed (no output)')\r\n } catch (err) {\r\n manager.setError(taskId, (err as Error).message)\r\n }\r\n}\r\n\r\nexport async function executeShellTask(\r\n taskId: string,\r\n manager: TaskManager,\r\n command: string,\r\n cwd: string,\r\n signal?: AbortSignal,\r\n): Promise<void> {\r\n manager.updateStatus(taskId, 'running')\r\n\r\n return new Promise<void>((resolve) => {\r\n const child = exec(command, { cwd, signal }, (error, stdout, stderr) => {\r\n if (signal?.aborted) {\r\n manager.cancelTask(taskId)\r\n resolve()\r\n return\r\n }\r\n\r\n if (error) {\r\n manager.setError(taskId, stderr || error.message)\r\n resolve()\r\n return\r\n }\r\n\r\n manager.setResult(taskId, stdout || '(no output)')\r\n resolve()\r\n })\r\n\r\n if (signal) {\r\n signal.addEventListener('abort', () => {\r\n child.kill('SIGTERM')\r\n }, { once: true })\r\n }\r\n })\r\n}\r\n","import type { ProviderAdapter } from '../connect/adapter.js'\r\nimport { ToolRegistry } from '../tools/registry.js'\r\nimport type { AgentConfig, SwarmMessage, SwarmResult, SubTask } from './types.js'\r\nimport { QueryEngine } from '../core/query-engine.js'\r\n\r\nconst MAX_PARALLEL_WORKERS = 3\r\nconst SUBTASK_REGEX = /(?:^|\\n)\\s*(?:\\d+[\\.\\)])\\s*(.+?)(?=\\n\\s*(?:\\d+[\\.\\)])|$)/gs\r\n\r\nexport class SwarmCoordinator {\r\n private agents = new Map<string, AgentConfig>()\r\n private mailbox = new Map<string, SwarmMessage[]>()\r\n private abortController = new AbortController()\r\n\r\n constructor(\r\n private adapter: ProviderAdapter,\r\n private tools: ToolRegistry,\r\n ) {}\r\n\r\n addAgent(config: AgentConfig): void {\r\n this.agents.set(config.id, config)\r\n this.mailbox.set(config.id, [])\r\n }\r\n\r\n removeAgent(id: string): void {\r\n this.agents.delete(id)\r\n this.mailbox.delete(id)\r\n }\r\n\r\n getAgents(): AgentConfig[] {\r\n return Array.from(this.agents.values())\r\n }\r\n\r\n async sendMessage(message: SwarmMessage): Promise<void> {\r\n if (message.to === '*') {\r\n for (const [agentId] of this.agents) {\r\n this.mailbox.get(agentId)?.push({ ...message, to: agentId })\r\n }\r\n } else {\r\n this.mailbox.get(message.to)?.push(message)\r\n }\r\n }\r\n\r\n async executeSwarm(task: string): Promise<SwarmResult[]> {\r\n this.abortController = new AbortController()\r\n const startTime = performance.now()\r\n\r\n const coordinator = this.findAgentByRole('coordinator')\r\n const workers = this.findAgentsByRole('worker')\r\n const reviewers = this.findAgentsByRole('reviewer')\r\n\r\n // Phase 1: Coordinator decomposes the task\r\n const subtasks = coordinator\r\n ? await this.decomposeTask(coordinator, task)\r\n : this.fallbackDecompose(task, workers.length)\r\n\r\n // Phase 2: Assign and execute subtasks in parallel\r\n const assignments = this.assignSubtasks(subtasks, workers)\r\n const workerResults = await this.executeParallel(assignments)\r\n\r\n // Phase 3: Optional review\r\n if (reviewers.length > 0) {\r\n await this.reviewResults(reviewers[0], workerResults)\r\n }\r\n\r\n // Phase 4: Collect final results\r\n const results: SwarmResult[] = workerResults.map(wr => ({\r\n agentId: wr.agentId,\r\n agentName: wr.agentName,\r\n task: wr.task,\r\n result: wr.result,\r\n success: wr.success,\r\n duration: performance.now() - startTime,\r\n turns: wr.turns,\r\n }))\r\n\r\n return results\r\n }\r\n\r\n shutdown(): void {\r\n this.abortController.abort()\r\n for (const [agentId] of this.agents) {\r\n this.mailbox.get(agentId)?.push({\r\n from: 'system',\r\n to: agentId,\r\n type: 'shutdown',\r\n content: 'Shutdown requested',\r\n timestamp: Date.now(),\r\n })\r\n }\r\n }\r\n\r\n private findAgentByRole(role: AgentConfig['role']): AgentConfig | undefined {\r\n for (const agent of this.agents.values()) {\r\n if (agent.role === role) return agent\r\n }\r\n return undefined\r\n }\r\n\r\n private findAgentsByRole(role: AgentConfig['role']): AgentConfig[] {\r\n return Array.from(this.agents.values()).filter(a => a.role === role)\r\n }\r\n\r\n private async decomposeTask(coordinator: AgentConfig, task: string): Promise<SubTask[]> {\r\n const engine = this.createEngine(coordinator)\r\n const prompt = `Decompose the following task into subtasks. Return ONLY a numbered list, one subtask per line. No explanations.\r\n\r\nTask: ${task}\r\n\r\nSubtasks:`\r\n\r\n let decomposition = ''\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (event.type === 'text_delta') decomposition += event.text\r\n if (event.type === 'error') break\r\n }\r\n } catch {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n const matches = [...decomposition.matchAll(SUBTASK_REGEX)]\r\n if (matches.length === 0) {\r\n return this.fallbackDecompose(task, this.findAgentsByRole('worker').length)\r\n }\r\n\r\n return matches.map((m, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: m[1].trim(),\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private fallbackDecompose(task: string, workerCount: number): SubTask[] {\r\n const count = Math.max(1, Math.min(workerCount, MAX_PARALLEL_WORKERS))\r\n return Array.from({ length: count }, (_, i) => ({\r\n id: `subtask_${i + 1}`,\r\n description: count === 1 ? task : `Part ${i + 1} of: ${task}`,\r\n status: 'pending' as const,\r\n }))\r\n }\r\n\r\n private assignSubtasks(subtasks: SubTask[], workers: AgentConfig[]): Array<{ task: SubTask; worker: AgentConfig }> {\r\n const assignments: Array<{ task: SubTask; worker: AgentConfig }> = []\r\n if (workers.length === 0) return assignments\r\n\r\n subtasks.forEach((task, i) => {\r\n const worker = workers[i % workers.length]\r\n task.assignedTo = worker.id\r\n assignments.push({ task, worker })\r\n })\r\n\r\n return assignments\r\n }\r\n\r\n private async executeParallel(\r\n assignments: Array<{ task: SubTask; worker: AgentConfig }>,\r\n ): Promise<Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }>> {\r\n const chunks: Array<Array<{ task: SubTask; worker: AgentConfig }>> = []\r\n for (let i = 0; i < assignments.length; i += MAX_PARALLEL_WORKERS) {\r\n chunks.push(assignments.slice(i, i + MAX_PARALLEL_WORKERS))\r\n }\r\n\r\n const allResults: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean; turns: number }> = []\r\n\r\n for (const chunk of chunks) {\r\n if (this.abortController.signal.aborted) break\r\n\r\n const settled = await Promise.allSettled(\r\n chunk.map(async ({ task, worker }) => {\r\n task.status = 'running'\r\n const engine = this.createEngine(worker)\r\n\r\n let output = ''\r\n let turns = 0\r\n\r\n try {\r\n for await (const event of engine.run(task.description)) {\r\n if (this.abortController.signal.aborted) break\r\n if (event.type === 'text_delta') output += event.text\r\n if (event.type === 'turn_end') turns = event.turn\r\n if (event.type === 'complete') {\r\n turns = event.result.turns\r\n output = output || event.result.messages\r\n .filter(m => m.role === 'assistant')\r\n .flatMap(m => m.content)\r\n .filter(b => b.type === 'text')\r\n .map(b => b.text)\r\n .join('\\n')\r\n }\r\n }\r\n\r\n task.status = 'completed'\r\n task.result = output\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: output, success: true, turns }\r\n } catch (err) {\r\n task.status = 'failed'\r\n return { agentId: worker.id, agentName: worker.name, task: task.description, result: (err as Error).message, success: false, turns }\r\n }\r\n }),\r\n )\r\n\r\n for (const r of settled) {\r\n if (r.status === 'fulfilled') allResults.push(r.value)\r\n else allResults.push({ agentId: 'unknown', agentName: 'unknown', task: '', result: r.reason?.message ?? 'Unknown error', success: false, turns: 0 })\r\n }\r\n }\r\n\r\n return allResults\r\n }\r\n\r\n private async reviewResults(reviewer: AgentConfig, results: Array<{ agentId: string; agentName: string; task: string; result: string; success: boolean }>): Promise<void> {\r\n const engine = this.createEngine(reviewer)\r\n const summary = results.map((r, i) => `Worker ${i + 1} (${r.agentName}): ${r.success ? 'SUCCESS' : 'FAILED'}\\nTask: ${r.task}\\nResult: ${r.result.slice(0, 500)}`).join('\\n\\n')\r\n\r\n const prompt = `Review the following worker results and provide a brief assessment:\r\n\r\n${summary}\r\n\r\nProvide a concise review:`\r\n\r\n try {\r\n for await (const event of engine.run(prompt)) {\r\n if (event.type === 'error') break\r\n }\r\n } catch {\r\n // Review failure is non-critical\r\n }\r\n }\r\n\r\n private createEngine(agent: AgentConfig): QueryEngine {\r\n const filteredTools = new ToolRegistry()\r\n if (agent.tools) {\r\n for (const toolName of agent.tools) {\r\n const tool = this.tools.get(toolName)\r\n if (tool) filteredTools.register(tool)\r\n }\r\n } else {\r\n for (const tool of this.tools.getAll()) {\r\n if (tool.name !== 'agent') filteredTools.register(tool)\r\n }\r\n }\r\n\r\n return new QueryEngine(\r\n {\r\n maxTurns: agent.maxTurns ?? 10,\r\n systemPrompt: agent.systemPrompt ?? `You are agent \"${agent.name}\" with role \"${agent.role}\". Complete assigned tasks concisely.`,\r\n },\r\n this.adapter,\r\n filteredTools,\r\n )\r\n }\r\n}\r\n"],"mappings":"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","names":["readFile","readdir","join","existsSync","join","join","readFile","writeFile","mkdir","existsSync","DEFAULT_CONFIG","existsSync","mkdir","writeFile","readFile","resolve","SAFE_COMMANDS","resolve","exec","resolve"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ensureDataDir,
|
|
3
|
+
getConfigPath,
|
|
4
|
+
getConfigSearchPaths,
|
|
5
|
+
getDataDir,
|
|
6
|
+
getDiskHistoryPath,
|
|
7
|
+
getGlobalMemoryDir,
|
|
8
|
+
getGlobalSkillsDir,
|
|
9
|
+
getHistoryDir,
|
|
10
|
+
getHistoryPath,
|
|
11
|
+
getKeybindingsPath,
|
|
12
|
+
getLegacyConfigPath,
|
|
13
|
+
getPlistPath,
|
|
14
|
+
getScheduledTasksPath,
|
|
15
|
+
getSessionsDir,
|
|
16
|
+
getTmpDir,
|
|
17
|
+
migrateLegacyConfig,
|
|
18
|
+
resolveConfigPath
|
|
19
|
+
} from "./chunk-AJENHWD3.js";
|
|
20
|
+
export {
|
|
21
|
+
ensureDataDir,
|
|
22
|
+
getConfigPath,
|
|
23
|
+
getConfigSearchPaths,
|
|
24
|
+
getDataDir,
|
|
25
|
+
getDiskHistoryPath,
|
|
26
|
+
getGlobalMemoryDir,
|
|
27
|
+
getGlobalSkillsDir,
|
|
28
|
+
getHistoryDir,
|
|
29
|
+
getHistoryPath,
|
|
30
|
+
getKeybindingsPath,
|
|
31
|
+
getLegacyConfigPath,
|
|
32
|
+
getPlistPath,
|
|
33
|
+
getScheduledTasksPath,
|
|
34
|
+
getSessionsDir,
|
|
35
|
+
getTmpDir,
|
|
36
|
+
migrateLegacyConfig,
|
|
37
|
+
resolveConfigPath
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=paths-OODUHG6V.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cliskill",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Universal terminal AI assistant with multi-provider LLM support, 15 built-in tools, streaming execution, and agent orchestration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"cliskill": "dist/bootstrap/cli.js"
|
|
16
|
+
},
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"dev": "tsup --watch",
|
|
21
|
+
"start": "node dist/bootstrap/cli.js",
|
|
22
|
+
"prepublishOnly": "npm run build",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"lint": "tsc --noEmit"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"commander": "^13.1.0",
|
|
30
|
+
"ink": "^5.2.0",
|
|
31
|
+
"react": "^18.3.1",
|
|
32
|
+
"zod": "^3.24.0",
|
|
33
|
+
"chalk": "^5.4.0",
|
|
34
|
+
"ora": "^8.1.0",
|
|
35
|
+
"ssh2": "^1.16.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^5.7.0",
|
|
39
|
+
"tsup": "^8.3.0",
|
|
40
|
+
"vitest": "^3.0.0",
|
|
41
|
+
"@types/react": "^18.3.0",
|
|
42
|
+
"@types/node": "^22.10.0",
|
|
43
|
+
"ink-testing-library": "^4.0.0",
|
|
44
|
+
"@types/ssh2": "^1.15.0"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"cli",
|
|
48
|
+
"ai",
|
|
49
|
+
"assistant",
|
|
50
|
+
"terminal",
|
|
51
|
+
"llm",
|
|
52
|
+
"agent",
|
|
53
|
+
"chatgpt",
|
|
54
|
+
"openai",
|
|
55
|
+
"claude",
|
|
56
|
+
"gemini",
|
|
57
|
+
"glm",
|
|
58
|
+
"codex",
|
|
59
|
+
"tools",
|
|
60
|
+
"streaming",
|
|
61
|
+
"multi-agent",
|
|
62
|
+
"mcp",
|
|
63
|
+
"tui"
|
|
64
|
+
],
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"homepage": "https://www.npmjs.com/package/cliskill",
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/nic11/cliskill/issues"
|
|
69
|
+
},
|
|
70
|
+
"repository": {
|
|
71
|
+
"type": "git",
|
|
72
|
+
"url": "git+https://github.com/nic11/cliskill.git"
|
|
73
|
+
},
|
|
74
|
+
"files": [
|
|
75
|
+
"dist/",
|
|
76
|
+
"README.md",
|
|
77
|
+
"LICENSE"
|
|
78
|
+
],
|
|
79
|
+
"publishConfig": {
|
|
80
|
+
"access": "public",
|
|
81
|
+
"registry": "https://registry.npmjs.org/"
|
|
82
|
+
},
|
|
83
|
+
"engines": {
|
|
84
|
+
"node": ">=20.0.0"
|
|
85
|
+
}
|
|
86
|
+
}
|