@zhanngning/hecode 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -133,47 +133,118 @@ pip install akshare pandas
133
133
 
134
134
  ## Skill System
135
135
 
136
+ Hecode uses a skill-based architecture to handle different tasks. Each skill provides specialized instructions for specific domains.
137
+
136
138
  ### Built-in Skills
137
139
 
138
140
  | Skill | Trigger Words | Description |
139
141
  |-------|---------------|-------------|
140
- | `coding` | code, fix, debug, refactor, implement | Write clean, minimal code |
141
- | `testing` | test, unit test, TDD, BDD | Write and run tests |
142
- | `ppt` | ppt, presentation, slides, 演示 | Create presentations |
143
- | `planning` | plan, project, roadmap, 项目计划 | Create project plans |
144
- | `finance` | finance, 股票, 金融, 研究报告 | Financial analysis |
142
+ | `coding` | code, fix, debug, refactor, implement, write, create, build | Write clean, minimal code following best practices |
143
+ | `testing` | test, testing, unit test, integration test, e2e, TDD, BDD | Write tests, test-driven development |
144
+ | `ppt` | ppt, presentation, slides, 演示, 幻灯片, 汇报 | Create professional presentations |
145
+ | `planning` | plan, planning, project, roadmap, 项目, 计划, 规划 | Create project plans and roadmaps |
146
+ | `finance` | finance, 股票, 金融, 研究报告, stock | Financial analysis and research reports |
147
+
148
+ ### Skill Details
145
149
 
146
- ### Usage Examples
150
+ #### Coding Skill
151
+ Write production-ready code with:
152
+ - Clean, minimal implementations
153
+ - Follow existing project conventions
154
+ - Proper error handling
155
+ - Type safety
147
156
 
148
157
  ```bash
149
- # Coding
150
- hecode --skill coding "implement a REST API"
158
+ hecode --skill coding "implement user authentication with JWT"
159
+ hecode --skill coding "refactor the database connection module"
160
+ hecode --skill coding "fix the memory leak in the event handler"
161
+ ```
151
162
 
152
- # Testing
153
- hecode --skill testing "write unit tests for UserService"
163
+ #### Testing Skill
164
+ Comprehensive testing support:
165
+ - Unit tests, integration tests, E2E tests
166
+ - TDD workflow (Red-Green-Refactor)
167
+ - Mocking and test fixtures
168
+ - Coverage analysis
154
169
 
155
- # PPT
156
- hecode --skill ppt "create a presentation about our product"
170
+ ```bash
171
+ hecode --skill testing "write unit tests for the payment service"
172
+ hecode --skill testing "create integration tests for the API"
173
+ hecode --skill testing "help me practice TDD for a sorting algorithm"
174
+ ```
157
175
 
158
- # Planning
159
- hecode --skill planning "create a project plan for Q3"
176
+ #### PPT Skill
177
+ Create professional presentations:
178
+ - Title slides, content slides, data slides
179
+ - Consistent design and formatting
180
+ - Charts and visualizations
181
+ - Speaker notes
160
182
 
161
- # Finance
183
+ ```bash
184
+ hecode --skill ppt "create a product demo presentation"
185
+ hecode --skill ppt "make a quarterly business review deck"
186
+ hecode --skill ppt "设计一个技术分享PPT"
187
+ ```
188
+
189
+ #### Planning Skill
190
+ Project planning and management:
191
+ - Project scope and objectives
192
+ - Timeline and milestones
193
+ - Task breakdown and dependencies
194
+ - Risk assessment
195
+
196
+ ```bash
197
+ hecode --skill planning "create a project plan for the new feature"
198
+ hecode --skill planning "制定Q3季度开发计划"
199
+ hecode --skill planning "create a roadmap for the next 6 months"
200
+ ```
201
+
202
+ #### Financial Analysis Skill
203
+ Stock analysis and research reports:
204
+ - Real-time price data (A-shares, HK stocks)
205
+ - Technical indicators (MA, RSI, MACD)
206
+ - Trend analysis and signals
207
+ - Comprehensive research reports
208
+
209
+ ```bash
162
210
  hecode --skill finance "分析贵州茅台"
211
+ hecode --skill finance "analyze stock 600519"
212
+ hecode --skill finance "生成腾讯研究报告"
163
213
  ```
164
214
 
165
215
  ### Custom Skills
166
216
 
167
- Create custom skills in `skills/<name>/SKILL.md`:
217
+ Create your own skills by adding a `SKILL.md` file in `skills/<name>/`:
168
218
 
169
219
  ```markdown
170
- # My Skill
220
+ # My Custom Skill
221
+
222
+ trigger: keyword1, keyword2, 关键词
223
+
224
+ ## Instructions
171
225
 
172
- trigger: keyword1, keyword2
226
+ You are an expert in [domain]. When helping users:
173
227
 
174
- Instructions for this skill...
228
+ 1. First understand the requirement
229
+ 2. Provide step-by-step guidance
230
+ 3. Use relevant tools
231
+ 4. Verify the result
232
+
233
+ ## Example
234
+
235
+ User: "help me with X"
236
+ Assistant: [detailed response following the skill instructions]
175
237
  ```
176
238
 
239
+ ### Skill Selection
240
+
241
+ Skills are automatically matched based on:
242
+ - User input keywords
243
+ - Context analysis
244
+ - Explicit `--skill` flag
245
+
246
+ If no skill matches, the default coding behavior is used.
247
+
177
248
  ## Development
178
249
 
179
250
  ```bash
package/dist/index.js CHANGED
@@ -5,6 +5,8 @@ import {
5
5
 
6
6
  // src/cli/commands.ts
7
7
  import { Command } from "commander";
8
+ import { readFile as readFile4 } from "fs/promises";
9
+ import { join as join5 } from "path";
8
10
 
9
11
  // src/cli/config.ts
10
12
  import { readFile, mkdir, writeFile } from "fs/promises";
@@ -327,7 +329,12 @@ var SessionMemory = class {
327
329
  // src/skills/loader.ts
328
330
  import { readFile as readFile3, readdir } from "fs/promises";
329
331
  import { join as join3 } from "path";
332
+ var CACHE_TTL = 60 * 1e3;
333
+ var skillCache = null;
330
334
  async function loadSkills(skillsDir) {
335
+ if (skillCache && skillCache.dir === skillsDir && Date.now() - skillCache.timestamp < CACHE_TTL) {
336
+ return skillCache.skills;
337
+ }
331
338
  const skills = [];
332
339
  try {
333
340
  const entries = await readdir(skillsDir, { withFileTypes: true });
@@ -341,28 +348,39 @@ async function loadSkills(skillsDir) {
341
348
  } catch {
342
349
  }
343
350
  }
344
- } catch {
351
+ } catch (err) {
352
+ console.warn(`Warning: Could not load skills from ${skillsDir}:`, err);
345
353
  }
354
+ skills.sort((a, b) => b.priority - a.priority);
355
+ skillCache = {
356
+ skills,
357
+ timestamp: Date.now(),
358
+ dir: skillsDir
359
+ };
346
360
  return skills;
347
361
  }
348
362
  function parseSkill(name, content) {
349
363
  const descMatch = content.match(/^#\s+(.+)$/m);
350
364
  const triggerMatch = content.match(/trigger:\s*(.+)/i);
365
+ const priorityMatch = content.match(/priority:\s*(\d+)/i);
351
366
  if (!descMatch) return null;
352
367
  return {
353
368
  name,
354
369
  description: descMatch[1] ?? name,
355
370
  trigger: triggerMatch?.[1] ?? "",
371
+ priority: priorityMatch ? parseInt(priorityMatch[1], 10) : 0,
356
372
  instructions: content
357
373
  };
358
374
  }
359
375
  function matchSkill(skills, userMessage) {
360
376
  const lower = userMessage.toLowerCase();
377
+ const words = lower.split(/\s+/);
361
378
  for (const skill of skills) {
362
- if (skill.trigger) {
363
- const triggers = skill.trigger.split(",").map((t) => t.trim().toLowerCase());
364
- for (const t of triggers) {
365
- if (lower.includes(t)) return skill;
379
+ if (!skill.trigger) continue;
380
+ const triggers = skill.trigger.split(",").map((t) => t.trim().toLowerCase());
381
+ for (const trigger of triggers) {
382
+ if (words.includes(trigger) || lower.includes(` ${trigger} `) || lower.startsWith(`${trigger} `) || lower.endsWith(` ${trigger}`)) {
383
+ return skill;
366
384
  }
367
385
  }
368
386
  }
@@ -485,9 +503,19 @@ function handleCommand(input, orchestrator, session) {
485
503
  }
486
504
 
487
505
  // src/cli/commands.ts
488
- function createProgram() {
506
+ async function getVersion() {
507
+ try {
508
+ const pkgPath = join5(import.meta.dirname, "../../package.json");
509
+ const pkg = JSON.parse(await readFile4(pkgPath, "utf-8"));
510
+ return pkg.version;
511
+ } catch {
512
+ return "0.0.0";
513
+ }
514
+ }
515
+ async function createProgram() {
516
+ const version = await getVersion();
489
517
  const program2 = new Command();
490
- program2.name("hecode").description("Hecode \u2014 Your AI Coding Assistant CLI").version("0.1.0").option("-m, --model <model>", "Model to use (e.g. openai:gpt-4o, claude:sonnet)").option("-s, --skill <skill>", "Skill to activate").argument("[prompt...]", "Single-shot prompt (non-interactive)").action(async (prompt, opts) => {
518
+ program2.name("hecode").description("Hecode \u2014 Your AI Coding Assistant CLI").version(version).option("-m, --model <model>", "Model to use (e.g. openai:gpt-4o, claude:sonnet)").option("-s, --skill <skill>", "Skill to activate").argument("[prompt...]", "Single-shot prompt (non-interactive)").action(async (prompt, opts) => {
491
519
  const config = await loadConfig();
492
520
  const modelStr = opts.model ?? config.defaultModel;
493
521
  const { provider, model } = parseModelString(modelStr);
@@ -511,6 +539,6 @@ function createProgram() {
511
539
  }
512
540
 
513
541
  // src/index.ts
514
- var program = createProgram();
542
+ var program = await createProgram();
515
543
  program.parse();
516
544
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands.ts","../src/cli/config.ts","../src/models/openai.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/models/factory.ts","../src/cli/repl.ts","../src/memory/session.ts","../src/skills/loader.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { loadConfig } from \"./config.js\";\nimport { createProvider, parseModelString } from \"../models/factory.js\";\nimport { startREPL } from \"./repl.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"hecode\")\n .description(\"Hecode — Your AI Coding Assistant CLI\")\n .version(\"0.1.0\")\n .option(\"-m, --model <model>\", \"Model to use (e.g. openai:gpt-4o, claude:sonnet)\")\n .option(\"-s, --skill <skill>\", \"Skill to activate\")\n .argument(\"[prompt...]\", \"Single-shot prompt (non-interactive)\")\n .action(async (prompt: string[], opts: { model?: string; skill?: string }) => {\n const config = await loadConfig();\n const modelStr = opts.model ?? config.defaultModel;\n const { provider, model } = parseModelString(modelStr);\n const modelConfig = config.models[provider] ?? {};\n if (model) modelConfig.model = model;\n const modelProvider = createProvider(provider, modelConfig as Record<string, unknown>);\n\n if (prompt.length) {\n const { Orchestrator } = await import(\"../core/orchestrator.js\");\n const orch = new Orchestrator({ model: modelProvider });\n const result = await orch.run(prompt.join(\" \"));\n console.log(result);\n } else {\n await startREPL(modelProvider, { skillName: opts.skill });\n }\n });\n\n program\n .command(\"config\")\n .description(\"Show or edit configuration\")\n .action(async () => {\n const config = await loadConfig();\n console.log(JSON.stringify(config, null, 2));\n });\n\n return program;\n}\n","import { readFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Config } from \"../core/types.js\";\n\nconst CONFIG_DIR = join(homedir(), \".hecode\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport async function loadConfig(): Promise<Config> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return { defaultModel: \"openai:gpt-4o\", models: {} };\n }\n}\n\nexport async function saveConfig(config: Config): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), \"utf-8\");\n}\n","import OpenAI from \"openai\";\nimport type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class OpenAIProvider implements ModelProvider {\n name = \"openai\";\n private client: OpenAI;\n private model: string;\n\n constructor(config: { apiKey?: string; baseUrl?: string; model?: string }) {\n this.client = new OpenAI({\n apiKey: config.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: config.baseUrl,\n });\n this.model = config.model ?? \"gpt-4o\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const params: OpenAI.ChatCompletionCreateParams = {\n model: this.model,\n messages: this.convertMessages(messages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n };\n const completion = await this.client.chat.completions.create(params);\n const choice = completion.choices[0]!;\n return {\n content: choice.message.content ?? \"\",\n tool_calls: choice.message.tool_calls\n ?.filter((tc) => tc.type === \"function\")\n .map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n usage: completion.usage\n ? { prompt: completion.usage.prompt_tokens, completion: completion.usage.completion_tokens }\n : undefined,\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages: this.convertMessages(messages),\n stream: true,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n });\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n yield {\n content: delta.content ?? undefined,\n tool_calls: delta.tool_calls?.map((tc) => ({\n id: tc.id ?? \"\",\n type: \"function\" as const,\n function: { name: tc.function?.name ?? \"\", arguments: tc.function?.arguments ?? \"\" },\n })),\n done: chunk.choices[0]?.finish_reason != null,\n };\n }\n }\n\n private convertMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n return messages.map((m) => {\n if (m.role === \"tool\") {\n return { role: \"tool\" as const, content: m.content, tool_call_id: m.tool_call_id! };\n }\n if (m.role === \"assistant\" && m.tool_calls?.length) {\n return {\n role: \"assistant\" as const,\n content: m.content,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: tc.function,\n })),\n };\n }\n return { role: m.role as \"system\" | \"user\" | \"assistant\", content: m.content };\n });\n }\n\n private convertTools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class AnthropicProvider implements ModelProvider {\n name = \"anthropic\";\n private client: Anthropic;\n private model: string;\n\n constructor(config: { apiKey?: string; model?: string }) {\n this.client = new Anthropic({ apiKey: config.apiKey ?? process.env.ANTHROPIC_API_KEY });\n this.model = config.model ?? \"claude-sonnet-4-20250514\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const system = messages.find((m) => m.role === \"system\")?.content ?? \"\";\n const convMessages = messages.filter((m) => m.role !== \"system\");\n const params: Anthropic.MessageCreateParams = {\n model: this.model,\n max_tokens: 8192,\n system,\n messages: this.convertMessages(convMessages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n };\n const msg = await this.client.messages.create(params);\n const textBlock = msg.content.find((b) => b.type === \"text\");\n const toolBlocks = msg.content.filter((b) => b.type === \"tool_use\");\n return {\n content: textBlock?.text ?? \"\",\n tool_calls: toolBlocks.map((tb) => ({\n id: tb.id,\n type: \"function\" as const,\n function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n })),\n usage: { prompt: msg.usage.input_tokens, completion: msg.usage.output_tokens },\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const system = messages.find((m) => m.role === \"system\")?.content ?? \"\";\n const convMessages = messages.filter((m) => m.role !== \"system\");\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: 8192,\n system,\n messages: this.convertMessages(convMessages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n });\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { content: event.delta.text, done: false };\n }\n }\n yield { content: undefined, done: true };\n }\n\n private convertMessages(messages: Message[]): Anthropic.MessageParam[] {\n return messages.map((m) => ({\n role: m.role === \"assistant\" ? \"assistant\" : \"user\",\n content: m.content,\n }));\n }\n\n private convertTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters as Anthropic.Tool[\"input_schema\"],\n }));\n }\n}\n","import type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class OllamaProvider implements ModelProvider {\n name = \"ollama\";\n private baseUrl: string;\n private model: string;\n\n constructor(config: { baseUrl?: string; model?: string }) {\n this.baseUrl = config.baseUrl ?? \"http://localhost:11434\";\n this.model = config.model ?? \"llama3.1\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const res = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: this.model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: false,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n }),\n });\n const data = (await res.json()) as any;\n return {\n content: data.message?.content ?? \"\",\n tool_calls: data.message?.tool_calls?.map((tc: any, i: number) => ({\n id: `call_${i}`,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: JSON.stringify(tc.function?.arguments ?? {}),\n },\n })),\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const res = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: this.model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: true,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n }),\n });\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop()!;\n for (const line of lines) {\n if (!line.trim()) continue;\n const data = JSON.parse(line);\n yield {\n content: data.message?.content ?? undefined,\n done: data.done ?? false,\n };\n }\n }\n yield { done: true };\n }\n\n private convertTools(tools: Tool[]) {\n return tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n }\n}\n","import type { ModelProvider } from \"../core/types.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OllamaProvider } from \"./ollama.js\";\n\ntype ProviderFactory = (config: Record<string, unknown>) => ModelProvider;\n\nconst registry = new Map<string, ProviderFactory>();\n\nregistry.set(\"openai\", (c) => new OpenAIProvider(c as any));\nregistry.set(\"claude\", (c) => new AnthropicProvider(c as any));\nregistry.set(\"anthropic\", (c) => new AnthropicProvider(c as any));\nregistry.set(\"ollama\", (c) => new OllamaProvider(c as any));\n\nexport function registerProvider(name: string, factory: ProviderFactory) {\n registry.set(name, factory);\n}\n\nexport function createProvider(name: string, config: Record<string, unknown>): ModelProvider {\n const factory = registry.get(name);\n if (!factory)\n throw new Error(\n `Unknown model provider: ${name}. Available: ${[...registry.keys()].join(\", \")}`,\n );\n return factory(config);\n}\n\nexport function parseModelString(modelStr: string): { provider: string; model: string } {\n const [provider, ...rest] = modelStr.split(\":\");\n return { provider: provider!, model: rest.join(\":\") || \"\" };\n}\n","import * as readline from \"node:readline\";\nimport chalk from \"chalk\";\nimport { join } from \"node:path\";\nimport { Orchestrator } from \"../core/orchestrator.js\";\nimport { SessionMemory } from \"../memory/session.js\";\nimport { loadSkills, matchSkill } from \"../skills/loader.js\";\nimport type { ModelProvider, ToolResult } from \"../core/types.js\";\n\nexport async function startREPL(\n model: ModelProvider,\n opts?: { skillName?: string },\n): Promise<void> {\n const session = new SessionMemory();\n const skillsDir = join(process.cwd(), \"skills\");\n const skills = await loadSkills(skillsDir);\n\n let skillInstructions: string | undefined;\n if (opts?.skillName) {\n const skill = skills.find((s) => s.name === opts.skillName);\n if (skill) skillInstructions = skill.instructions;\n }\n\n const orchestrator = new Orchestrator({\n model,\n skillInstructions,\n onToolStart: (name) => console.log(chalk.yellow(` ⚙ ${name}...`)),\n onToolEnd: (_name, result: ToolResult) => {\n if (result.error) console.log(chalk.red(` ✗ ${_name}: ${result.error}`));\n else console.log(chalk.green(` ✓ ${_name}`));\n },\n });\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"hecode> \"),\n });\n\n const logo = chalk.cyan(`\n ██╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n ██║ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝\n ███████║█████╗ ██║ ██║ ██║██║ ██║█████╗ \n ██╔══██║██╔══╝ ██║ ██║ ██║██║ ██║██╔══╝ \n ██║ ██║███████╗╚██████╗╚██████╔╝██████╔╝███████╗\n ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝\n `);\n\n console.log(logo);\n console.log(chalk.bold.white(\" Your AI Coding Assistant\") + chalk.gray(\" v0.2.0\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────────\"));\n console.log(chalk.gray(` Session: ${session.sessionId}`));\n if (skills.length) {\n console.log(chalk.gray(` Skills: ${skills.map((s) => s.name).join(\", \")}`));\n }\n console.log(chalk.gray(\" ─────────────────────────────────────────────\"));\n console.log(chalk.gray(\" Type /help for commands, Ctrl+C to exit\\n\"));\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n\n if (input.startsWith(\"/\")) {\n handleCommand(input, orchestrator, session);\n rl.prompt();\n return;\n }\n\n // Auto-match skill if not already set\n if (!skillInstructions) {\n const matched = matchSkill(skills, input);\n if (matched) {\n console.log(chalk.gray(` [skill: ${matched.name}]`));\n }\n }\n\n try {\n process.stdout.write(chalk.white(\"\\n\"));\n for await (const token of orchestrator.runStream(input)) {\n process.stdout.write(token);\n }\n process.stdout.write(\"\\n\\n\");\n\n // Auto-save session after each exchange\n await session.save(orchestrator.getMessages());\n } catch (e: any) {\n console.log(chalk.red(`\\nError: ${e.message}\\n`));\n }\n\n rl.prompt();\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\nGoodbye!\"));\n process.exit(0);\n });\n}\n\nfunction handleCommand(\n input: string,\n orchestrator: Orchestrator,\n session: SessionMemory,\n): void {\n const cmd = input.split(\" \")[0];\n switch (cmd) {\n case \"/help\":\n console.log(\n chalk.cyan(`\n /help — Show this help\n /clear — Clear conversation\n /history — Show message count\n /save — Save session manually\n /session — Show session ID\n /exit — Exit Hecode\n `),\n );\n break;\n case \"/clear\":\n orchestrator.clearMessages();\n console.log(chalk.gray(\"Conversation cleared.\"));\n break;\n case \"/history\":\n console.log(chalk.gray(`Messages: ${orchestrator.getMessages().length}`));\n break;\n case \"/save\":\n session.save(orchestrator.getMessages()).then(() => {\n console.log(chalk.gray(\"Session saved.\"));\n });\n break;\n case \"/session\":\n console.log(chalk.gray(`Session ID: ${session.sessionId}`));\n break;\n case \"/exit\":\n process.exit(0);\n default:\n console.log(chalk.red(`Unknown command: ${cmd}`));\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Message } from \"../core/types.js\";\n\nconst SESSIONS_DIR = join(homedir(), \".hecode\", \"sessions\");\n\nexport interface Session {\n id: string;\n messages: Message[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport class SessionMemory {\n private sessionDir: string;\n\n constructor(sessionId?: string) {\n const id = sessionId ?? randomUUID().slice(0, 12);\n this.sessionDir = join(SESSIONS_DIR, id);\n }\n\n get sessionId(): string {\n return this.sessionDir.split(/[\\\\/]/).pop()!;\n }\n\n async save(messages: Message[]): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n const session: Session = {\n id: this.sessionId,\n messages,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n await writeFile(\n join(this.sessionDir, \"session.json\"),\n JSON.stringify(session, null, 2),\n );\n }\n\n async load(): Promise<Message[]> {\n try {\n const raw = await readFile(\n join(this.sessionDir, \"session.json\"),\n \"utf-8\",\n );\n const session: Session = JSON.parse(raw);\n return session.messages;\n } catch {\n return [];\n }\n }\n\n async saveCheckpoint(data: Record<string, unknown>): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n await writeFile(\n join(this.sessionDir, \"checkpoint.md\"),\n JSON.stringify(data, null, 2),\n );\n }\n\n async saveNote(content: string): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n const notePath = join(this.sessionDir, \"notes.md\");\n let existing = \"\";\n try {\n existing = await readFile(notePath, \"utf-8\");\n } catch {}\n await writeFile(notePath, existing + \"\\n\\n\" + content);\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface Skill {\n name: string;\n description: string;\n trigger: string;\n instructions: string;\n tools?: string[];\n}\n\nexport async function loadSkills(skillsDir: string): Promise<Skill[]> {\n const skills: Skill[] = [];\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillPath = join(skillsDir, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf-8\");\n const skill = parseSkill(entry.name, content);\n if (skill) skills.push(skill);\n } catch {\n /* no SKILL.md, skip */\n }\n }\n } catch {\n /* skills dir doesn't exist */\n }\n return skills;\n}\n\nfunction parseSkill(name: string, content: string): Skill | null {\n const descMatch = content.match(/^#\\s+(.+)$/m);\n const triggerMatch = content.match(/trigger:\\s*(.+)/i);\n if (!descMatch) return null;\n\n return {\n name,\n description: descMatch[1] ?? name,\n trigger: triggerMatch?.[1] ?? \"\",\n instructions: content,\n };\n}\n\nexport function matchSkill(skills: Skill[], userMessage: string): Skill | null {\n const lower = userMessage.toLowerCase();\n for (const skill of skills) {\n if (skill.trigger) {\n const triggers = skill.trigger.split(\",\").map((t) => t.trim().toLowerCase());\n for (const t of triggers) {\n if (lower.includes(t)) return skill;\n }\n }\n }\n return null;\n}\n","#!/usr/bin/env node\nimport { createProgram } from \"./cli/commands.js\";\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":";;;;;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,UAAU,OAAO,iBAAiB;AAC3C,SAAS,YAAY;AACrB,SAAS,eAAe;AAGxB,IAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,IAAM,cAAc,KAAK,YAAY,aAAa;AAElD,eAAsB,aAA8B;AAClD,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,aAAa,OAAO;AAC/C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,EAAE,cAAc,iBAAiB,QAAQ,CAAC,EAAE;AAAA,EACrD;AACF;;;ACfA,OAAO,YAAY;AAGZ,IAAM,iBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EAER,YAAY,QAA+D;AACzE,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,QAAQ,OAAO,UAAU,QAAQ,IAAI;AAAA,MACrC,SAAS,OAAO;AAAA,IAClB,CAAC;AACD,SAAK,QAAQ,OAAO,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,UAAqB,OAAmC;AACjE,UAAM,SAA4C;AAAA,MAChD,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK,gBAAgB,QAAQ;AAAA,MACvC,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,IACzD;AACA,UAAM,aAAa,MAAM,KAAK,OAAO,KAAK,YAAY,OAAO,MAAM;AACnE,UAAM,SAAS,WAAW,QAAQ,CAAC;AACnC,WAAO;AAAA,MACL,SAAS,OAAO,QAAQ,WAAW;AAAA,MACnC,YAAY,OAAO,QAAQ,YACvB,OAAO,CAAC,OAAO,GAAG,SAAS,UAAU,EACtC,IAAI,CAAC,QAAQ;AAAA,QACZ,IAAI,GAAG;AAAA,QACP,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,WAAW,GAAG,SAAS,UAAU;AAAA,MACvE,EAAE;AAAA,MACJ,OAAO,WAAW,QACd,EAAE,QAAQ,WAAW,MAAM,eAAe,YAAY,WAAW,MAAM,kBAAkB,IACzF;AAAA,IACN;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,UAAqB,OAAsC;AACvE,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,YAAY,OAAO;AAAA,MACvD,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK,gBAAgB,QAAQ;AAAA,MACvC,QAAQ;AAAA,MACR,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,IACzD,CAAC;AACD,qBAAiB,SAAS,QAAQ;AAChC,YAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG;AAChC,UAAI,CAAC,MAAO;AACZ,YAAM;AAAA,QACJ,SAAS,MAAM,WAAW;AAAA,QAC1B,YAAY,MAAM,YAAY,IAAI,CAAC,QAAQ;AAAA,UACzC,IAAI,GAAG,MAAM;AAAA,UACb,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,GAAG,UAAU,QAAQ,IAAI,WAAW,GAAG,UAAU,aAAa,GAAG;AAAA,QACrF,EAAE;AAAA,QACF,MAAM,MAAM,QAAQ,CAAC,GAAG,iBAAiB;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAgB,UAA0D;AAChF,WAAO,SAAS,IAAI,CAAC,MAAM;AACzB,UAAI,EAAE,SAAS,QAAQ;AACrB,eAAO,EAAE,MAAM,QAAiB,SAAS,EAAE,SAAS,cAAc,EAAE,aAAc;AAAA,MACpF;AACA,UAAI,EAAE,SAAS,eAAe,EAAE,YAAY,QAAQ;AAClD,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,EAAE;AAAA,UACX,YAAY,EAAE,WAAW,IAAI,CAAC,QAAQ;AAAA,YACpC,IAAI,GAAG;AAAA,YACP,MAAM;AAAA,YACN,UAAU,GAAG;AAAA,UACf,EAAE;AAAA,QACJ;AAAA,MACF;AACA,aAAO,EAAE,MAAM,EAAE,MAAyC,SAAS,EAAE,QAAQ;AAAA,IAC/E,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,OAA4C;AAC/D,WAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,MAAM;AAAA,MACN,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,YAAY,EAAE,WAAW;AAAA,IACjF,EAAE;AAAA,EACJ;AACF;;;ACvFA,OAAO,eAAe;AAGf,IAAM,oBAAN,MAAiD;AAAA,EACtD,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EAER,YAAY,QAA6C;AACvD,SAAK,SAAS,IAAI,UAAU,EAAE,QAAQ,OAAO,UAAU,QAAQ,IAAI,kBAAkB,CAAC;AACtF,SAAK,QAAQ,OAAO,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,UAAqB,OAAmC;AACjE,UAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG,WAAW;AACrE,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAC/D,UAAM,SAAwC;AAAA,MAC5C,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,UAAU,KAAK,gBAAgB,YAAY;AAAA,MAC3C,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,IACzD;AACA,UAAM,MAAM,MAAM,KAAK,OAAO,SAAS,OAAO,MAAM;AACpD,UAAM,YAAY,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC3D,UAAM,aAAa,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAClE,WAAO;AAAA,MACL,SAAS,WAAW,QAAQ;AAAA,MAC5B,YAAY,WAAW,IAAI,CAAC,QAAQ;AAAA,QAClC,IAAI,GAAG;AAAA,QACP,MAAM;AAAA,QACN,UAAU,EAAE,MAAM,GAAG,MAAM,WAAW,KAAK,UAAU,GAAG,KAAK,EAAE;AAAA,MACjE,EAAE;AAAA,MACF,OAAO,EAAE,QAAQ,IAAI,MAAM,cAAc,YAAY,IAAI,MAAM,cAAc;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,UAAqB,OAAsC;AACvE,UAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG,WAAW;AACrE,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAC/D,UAAM,SAAS,KAAK,OAAO,SAAS,OAAO;AAAA,MACzC,OAAO,KAAK;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,UAAU,KAAK,gBAAgB,YAAY;AAAA,MAC3C,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,IACzD,CAAC;AACD,qBAAiB,SAAS,QAAQ;AAChC,UAAI,MAAM,SAAS,yBAAyB,MAAM,MAAM,SAAS,cAAc;AAC7E,cAAM,EAAE,SAAS,MAAM,MAAM,MAAM,MAAM,MAAM;AAAA,MACjD;AAAA,IACF;AACA,UAAM,EAAE,SAAS,QAAW,MAAM,KAAK;AAAA,EACzC;AAAA,EAEQ,gBAAgB,UAA+C;AACrE,WAAO,SAAS,IAAI,CAAC,OAAO;AAAA,MAC1B,MAAM,EAAE,SAAS,cAAc,cAAc;AAAA,MAC7C,SAAS,EAAE;AAAA,IACb,EAAE;AAAA,EACJ;AAAA,EAEQ,aAAa,OAAiC;AACpD,WAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,cAAc,EAAE;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;;;ACnEO,IAAM,iBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EAER,YAAY,QAA8C;AACxD,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,QAAQ,OAAO,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAK,UAAqB,OAAmC;AACjE,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,aAAa;AAAA,MAClD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,UAAU,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,QACpE,QAAQ;AAAA,QACR,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AACD,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO;AAAA,MACL,SAAS,KAAK,SAAS,WAAW;AAAA,MAClC,YAAY,KAAK,SAAS,YAAY,IAAI,CAAC,IAAS,OAAe;AAAA,QACjE,IAAI,QAAQ,CAAC;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,GAAG,UAAU,QAAQ;AAAA,UAC3B,WAAW,KAAK,UAAU,GAAG,UAAU,aAAa,CAAC,CAAC;AAAA,QACxD;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,UAAqB,OAAsC;AACvE,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,aAAa;AAAA,MAClD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,UAAU,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,QACpE,QAAQ;AAAA,QACR,GAAI,OAAO,UAAU,EAAE,OAAO,KAAK,aAAa,KAAK,EAAE;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AACD,UAAM,SAAS,IAAI,KAAM,UAAU;AACnC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AACb,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI;AACnB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,cAAM,OAAO,KAAK,MAAM,IAAI;AAC5B,cAAM;AAAA,UACJ,SAAS,KAAK,SAAS,WAAW;AAAA,UAClC,MAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,MAAM,KAAK;AAAA,EACrB;AAAA,EAEQ,aAAa,OAAe;AAClC,WAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,EAAE;AAAA,EACJ;AACF;;;ACxEA,IAAM,WAAW,oBAAI,IAA6B;AAElD,SAAS,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe,CAAQ,CAAC;AAC1D,SAAS,IAAI,UAAU,CAAC,MAAM,IAAI,kBAAkB,CAAQ,CAAC;AAC7D,SAAS,IAAI,aAAa,CAAC,MAAM,IAAI,kBAAkB,CAAQ,CAAC;AAChE,SAAS,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe,CAAQ,CAAC;AAMnD,SAAS,eAAe,MAAc,QAAgD;AAC3F,QAAM,UAAU,SAAS,IAAI,IAAI;AACjC,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR,2BAA2B,IAAI,gBAAgB,CAAC,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAChF;AACF,SAAO,QAAQ,MAAM;AACvB;AAEO,SAAS,iBAAiB,UAAuD;AACtF,QAAM,CAAC,UAAU,GAAG,IAAI,IAAI,SAAS,MAAM,GAAG;AAC9C,SAAO,EAAE,UAAqB,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG;AAC5D;;;AC9BA,YAAY,cAAc;AAC1B,OAAO,WAAW;AAClB,SAAS,QAAAA,aAAY;;;ACFrB,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,kBAAkB;AAG3B,IAAM,eAAeD,MAAKC,SAAQ,GAAG,WAAW,UAAU;AASnD,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,WAAoB;AAC9B,UAAM,KAAK,aAAa,WAAW,EAAE,MAAM,GAAG,EAAE;AAChD,SAAK,aAAaD,MAAK,cAAc,EAAE;AAAA,EACzC;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,WAAW,MAAM,OAAO,EAAE,IAAI;AAAA,EAC5C;AAAA,EAEA,MAAM,KAAK,UAAoC;AAC7C,UAAMD,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,UAAmB;AAAA,MACvB,IAAI,KAAK;AAAA,MACT;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAMD;AAAA,MACJE,MAAK,KAAK,YAAY,cAAc;AAAA,MACpC,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,OAA2B;AAC/B,QAAI;AACF,YAAM,MAAM,MAAMH;AAAA,QAChBG,MAAK,KAAK,YAAY,cAAc;AAAA,QACpC;AAAA,MACF;AACA,YAAM,UAAmB,KAAK,MAAM,GAAG;AACvC,aAAO,QAAQ;AAAA,IACjB,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,MAA8C;AACjE,UAAMD,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAMD;AAAA,MACJE,MAAK,KAAK,YAAY,eAAe;AAAA,MACrC,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAAgC;AAC7C,UAAMD,OAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAChD,UAAM,WAAWC,MAAK,KAAK,YAAY,UAAU;AACjD,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,MAAMH,UAAS,UAAU,OAAO;AAAA,IAC7C,QAAQ;AAAA,IAAC;AACT,UAAMC,WAAU,UAAU,WAAW,SAAS,OAAO;AAAA,EACvD;AACF;;;ACvEA,SAAS,YAAAI,WAAU,eAAe;AAClC,SAAS,QAAAC,aAAY;AAUrB,eAAsB,WAAW,WAAqC;AACpE,QAAM,SAAkB,CAAC;AACzB,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,YAAYA,MAAK,WAAW,MAAM,MAAM,UAAU;AACxD,UAAI;AACF,cAAM,UAAU,MAAMD,UAAS,WAAW,OAAO;AACjD,cAAM,QAAQ,WAAW,MAAM,MAAM,OAAO;AAC5C,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAc,SAA+B;AAC/D,QAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,QAAM,eAAe,QAAQ,MAAM,kBAAkB;AACrD,MAAI,CAAC,UAAW,QAAO;AAEvB,SAAO;AAAA,IACL;AAAA,IACA,aAAa,UAAU,CAAC,KAAK;AAAA,IAC7B,SAAS,eAAe,CAAC,KAAK;AAAA,IAC9B,cAAc;AAAA,EAChB;AACF;AAEO,SAAS,WAAW,QAAiB,aAAmC;AAC7E,QAAM,QAAQ,YAAY,YAAY;AACtC,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS;AACjB,YAAM,WAAW,MAAM,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AAC3E,iBAAW,KAAK,UAAU;AACxB,YAAI,MAAM,SAAS,CAAC,EAAG,QAAO;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AFhDA,eAAsB,UACpB,OACA,MACe;AACf,QAAM,UAAU,IAAI,cAAc;AAClC,QAAM,YAAYE,MAAK,QAAQ,IAAI,GAAG,QAAQ;AAC9C,QAAM,SAAS,MAAM,WAAW,SAAS;AAEzC,MAAI;AACJ,MAAI,MAAM,WAAW;AACnB,UAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS;AAC1D,QAAI,MAAO,qBAAoB,MAAM;AAAA,EACvC;AAEA,QAAM,eAAe,IAAI,aAAa;AAAA,IACpC;AAAA,IACA;AAAA,IACA,aAAa,CAAC,SAAS,QAAQ,IAAI,MAAM,OAAO,YAAO,IAAI,KAAK,CAAC;AAAA,IACjE,WAAW,CAAC,OAAO,WAAuB;AACxC,UAAI,OAAO,MAAO,SAAQ,IAAI,MAAM,IAAI,YAAO,KAAK,KAAK,OAAO,KAAK,EAAE,CAAC;AAAA,UACnE,SAAQ,IAAI,MAAM,MAAM,YAAO,KAAK,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,QAAM,KAAc,yBAAgB;AAAA,IAClC,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,MAAM,KAAK,UAAU;AAAA,EAC/B,CAAC;AAED,QAAM,OAAO,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOvB;AAED,UAAQ,IAAI,IAAI;AAChB,UAAQ,IAAI,MAAM,KAAK,MAAM,4BAA4B,IAAI,MAAM,KAAK,SAAS,CAAC;AAClF,UAAQ,IAAI,MAAM,KAAK,kRAAiD,CAAC;AACzE,UAAQ,IAAI,MAAM,KAAK,cAAc,QAAQ,SAAS,EAAE,CAAC;AACzD,MAAI,OAAO,QAAQ;AACjB,YAAQ,IAAI,MAAM,KAAK,cAAc,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,EAC9E;AACA,UAAQ,IAAI,MAAM,KAAK,kRAAiD,CAAC;AACzE,UAAQ,IAAI,MAAM,KAAK,6CAA6C,CAAC;AACrE,KAAG,OAAO;AAEV,KAAG,GAAG,QAAQ,OAAO,SAAS;AAC5B,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,CAAC,OAAO;AACV,SAAG,OAAO;AACV;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,oBAAc,OAAO,cAAc,OAAO;AAC1C,SAAG,OAAO;AACV;AAAA,IACF;AAGA,QAAI,CAAC,mBAAmB;AACtB,YAAM,UAAU,WAAW,QAAQ,KAAK;AACxC,UAAI,SAAS;AACX,gBAAQ,IAAI,MAAM,KAAK,aAAa,QAAQ,IAAI,GAAG,CAAC;AAAA,MACtD;AAAA,IACF;AAEA,QAAI;AACF,cAAQ,OAAO,MAAM,MAAM,MAAM,IAAI,CAAC;AACtC,uBAAiB,SAAS,aAAa,UAAU,KAAK,GAAG;AACvD,gBAAQ,OAAO,MAAM,KAAK;AAAA,MAC5B;AACA,cAAQ,OAAO,MAAM,MAAM;AAG3B,YAAM,QAAQ,KAAK,aAAa,YAAY,CAAC;AAAA,IAC/C,SAAS,GAAQ;AACf,cAAQ,IAAI,MAAM,IAAI;AAAA,SAAY,EAAE,OAAO;AAAA,CAAI,CAAC;AAAA,IAClD;AAEA,OAAG,OAAO;AAAA,EACZ,CAAC;AAED,KAAG,GAAG,SAAS,MAAM;AACnB,YAAQ,IAAI,MAAM,KAAK,YAAY,CAAC;AACpC,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,cACP,OACA,cACA,SACM;AACN,QAAM,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AAC9B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,cAAQ;AAAA,QACN,MAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOZ;AAAA,MACD;AACA;AAAA,IACF,KAAK;AACH,mBAAa,cAAc;AAC3B,cAAQ,IAAI,MAAM,KAAK,uBAAuB,CAAC;AAC/C;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,MAAM,KAAK,aAAa,aAAa,YAAY,EAAE,MAAM,EAAE,CAAC;AACxE;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,aAAa,YAAY,CAAC,EAAE,KAAK,MAAM;AAClD,gBAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AAAA,MAC1C,CAAC;AACD;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,MAAM,KAAK,eAAe,QAAQ,SAAS,EAAE,CAAC;AAC1D;AAAA,IACF,KAAK;AACH,cAAQ,KAAK,CAAC;AAAA,IAChB;AACE,cAAQ,IAAI,MAAM,IAAI,oBAAoB,GAAG,EAAE,CAAC;AAAA,EACpD;AACF;;;ANvIO,SAAS,gBAAyB;AACvC,QAAMC,WAAU,IAAI,QAAQ;AAE5B,EAAAA,SACG,KAAK,QAAQ,EACb,YAAY,4CAAuC,EACnD,QAAQ,OAAO,EACf,OAAO,uBAAuB,kDAAkD,EAChF,OAAO,uBAAuB,mBAAmB,EACjD,SAAS,eAAe,sCAAsC,EAC9D,OAAO,OAAO,QAAkB,SAA6C;AAC5E,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,WAAW,KAAK,SAAS,OAAO;AACtC,UAAM,EAAE,UAAU,MAAM,IAAI,iBAAiB,QAAQ;AACrD,UAAM,cAAc,OAAO,OAAO,QAAQ,KAAK,CAAC;AAChD,QAAI,MAAO,aAAY,QAAQ;AAC/B,UAAM,gBAAgB,eAAe,UAAU,WAAsC;AAErF,QAAI,OAAO,QAAQ;AACjB,YAAM,EAAE,cAAAC,cAAa,IAAI,MAAM,OAAO,4BAAyB;AAC/D,YAAM,OAAO,IAAIA,cAAa,EAAE,OAAO,cAAc,CAAC;AACtD,YAAM,SAAS,MAAM,KAAK,IAAI,OAAO,KAAK,GAAG,CAAC;AAC9C,cAAQ,IAAI,MAAM;AAAA,IACpB,OAAO;AACL,YAAM,UAAU,eAAe,EAAE,WAAW,KAAK,MAAM,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAEH,EAAAD,SACG,QAAQ,QAAQ,EAChB,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,UAAM,SAAS,MAAM,WAAW;AAChC,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C,CAAC;AAEH,SAAOA;AACT;;;ASvCA,IAAM,UAAU,cAAc;AAC9B,QAAQ,MAAM;","names":["join","readFile","writeFile","mkdir","join","homedir","readFile","join","join","program","Orchestrator"]}
1
+ {"version":3,"sources":["../src/cli/commands.ts","../src/cli/config.ts","../src/models/openai.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/models/factory.ts","../src/cli/repl.ts","../src/memory/session.ts","../src/skills/loader.ts","../src/index.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"./config.js\";\nimport { createProvider, parseModelString } from \"../models/factory.js\";\nimport { startREPL } from \"./repl.js\";\n\nasync function getVersion(): Promise<string> {\n try {\n const pkgPath = join(import.meta.dirname, \"../../package.json\");\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n return pkg.version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport async function createProgram(): Promise<Command> {\n const version = await getVersion();\n const program = new Command();\n\n program\n .name(\"hecode\")\n .description(\"Hecode — Your AI Coding Assistant CLI\")\n .version(version)\n .option(\"-m, --model <model>\", \"Model to use (e.g. openai:gpt-4o, claude:sonnet)\")\n .option(\"-s, --skill <skill>\", \"Skill to activate\")\n .argument(\"[prompt...]\", \"Single-shot prompt (non-interactive)\")\n .action(async (prompt: string[], opts: { model?: string; skill?: string }) => {\n const config = await loadConfig();\n const modelStr = opts.model ?? config.defaultModel;\n const { provider, model } = parseModelString(modelStr);\n const modelConfig = config.models[provider] ?? {};\n if (model) modelConfig.model = model;\n const modelProvider = createProvider(provider, modelConfig as Record<string, unknown>);\n\n if (prompt.length) {\n const { Orchestrator } = await import(\"../core/orchestrator.js\");\n const orch = new Orchestrator({ model: modelProvider });\n const result = await orch.run(prompt.join(\" \"));\n console.log(result);\n } else {\n await startREPL(modelProvider, { skillName: opts.skill });\n }\n });\n\n program\n .command(\"config\")\n .description(\"Show or edit configuration\")\n .action(async () => {\n const config = await loadConfig();\n console.log(JSON.stringify(config, null, 2));\n });\n\n return program;\n}\n","import { readFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Config } from \"../core/types.js\";\n\nconst CONFIG_DIR = join(homedir(), \".hecode\");\nconst CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\nexport async function loadConfig(): Promise<Config> {\n try {\n const raw = await readFile(CONFIG_FILE, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return { defaultModel: \"openai:gpt-4o\", models: {} };\n }\n}\n\nexport async function saveConfig(config: Config): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), \"utf-8\");\n}\n","import OpenAI from \"openai\";\nimport type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class OpenAIProvider implements ModelProvider {\n name = \"openai\";\n private client: OpenAI;\n private model: string;\n\n constructor(config: { apiKey?: string; baseUrl?: string; model?: string }) {\n this.client = new OpenAI({\n apiKey: config.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: config.baseUrl,\n });\n this.model = config.model ?? \"gpt-4o\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const params: OpenAI.ChatCompletionCreateParams = {\n model: this.model,\n messages: this.convertMessages(messages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n };\n const completion = await this.client.chat.completions.create(params);\n const choice = completion.choices[0]!;\n return {\n content: choice.message.content ?? \"\",\n tool_calls: choice.message.tool_calls\n ?.filter((tc) => tc.type === \"function\")\n .map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: { name: tc.function.name, arguments: tc.function.arguments },\n })),\n usage: completion.usage\n ? { prompt: completion.usage.prompt_tokens, completion: completion.usage.completion_tokens }\n : undefined,\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const stream = await this.client.chat.completions.create({\n model: this.model,\n messages: this.convertMessages(messages),\n stream: true,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n });\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n yield {\n content: delta.content ?? undefined,\n tool_calls: delta.tool_calls?.map((tc) => ({\n id: tc.id ?? \"\",\n type: \"function\" as const,\n function: { name: tc.function?.name ?? \"\", arguments: tc.function?.arguments ?? \"\" },\n })),\n done: chunk.choices[0]?.finish_reason != null,\n };\n }\n }\n\n private convertMessages(messages: Message[]): OpenAI.ChatCompletionMessageParam[] {\n return messages.map((m) => {\n if (m.role === \"tool\") {\n return { role: \"tool\" as const, content: m.content, tool_call_id: m.tool_call_id! };\n }\n if (m.role === \"assistant\" && m.tool_calls?.length) {\n return {\n role: \"assistant\" as const,\n content: m.content,\n tool_calls: m.tool_calls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: tc.function,\n })),\n };\n }\n return { role: m.role as \"system\" | \"user\" | \"assistant\", content: m.content };\n });\n }\n\n private convertTools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((t) => ({\n type: \"function\" as const,\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class AnthropicProvider implements ModelProvider {\n name = \"anthropic\";\n private client: Anthropic;\n private model: string;\n\n constructor(config: { apiKey?: string; model?: string }) {\n this.client = new Anthropic({ apiKey: config.apiKey ?? process.env.ANTHROPIC_API_KEY });\n this.model = config.model ?? \"claude-sonnet-4-20250514\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const system = messages.find((m) => m.role === \"system\")?.content ?? \"\";\n const convMessages = messages.filter((m) => m.role !== \"system\");\n const params: Anthropic.MessageCreateParams = {\n model: this.model,\n max_tokens: 8192,\n system,\n messages: this.convertMessages(convMessages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n };\n const msg = await this.client.messages.create(params);\n const textBlock = msg.content.find((b) => b.type === \"text\");\n const toolBlocks = msg.content.filter((b) => b.type === \"tool_use\");\n return {\n content: textBlock?.text ?? \"\",\n tool_calls: toolBlocks.map((tb) => ({\n id: tb.id,\n type: \"function\" as const,\n function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n })),\n usage: { prompt: msg.usage.input_tokens, completion: msg.usage.output_tokens },\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const system = messages.find((m) => m.role === \"system\")?.content ?? \"\";\n const convMessages = messages.filter((m) => m.role !== \"system\");\n const stream = this.client.messages.stream({\n model: this.model,\n max_tokens: 8192,\n system,\n messages: this.convertMessages(convMessages),\n ...(tools?.length && { tools: this.convertTools(tools) }),\n });\n for await (const event of stream) {\n if (event.type === \"content_block_delta\" && event.delta.type === \"text_delta\") {\n yield { content: event.delta.text, done: false };\n }\n }\n yield { content: undefined, done: true };\n }\n\n private convertMessages(messages: Message[]): Anthropic.MessageParam[] {\n return messages.map((m) => ({\n role: m.role === \"assistant\" ? \"assistant\" : \"user\",\n content: m.content,\n }));\n }\n\n private convertTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters as Anthropic.Tool[\"input_schema\"],\n }));\n }\n}\n","import type { ModelProvider, Message, Tool, Response, Chunk } from \"../core/types.js\";\n\nexport class OllamaProvider implements ModelProvider {\n name = \"ollama\";\n private baseUrl: string;\n private model: string;\n\n constructor(config: { baseUrl?: string; model?: string }) {\n this.baseUrl = config.baseUrl ?? \"http://localhost:11434\";\n this.model = config.model ?? \"llama3.1\";\n }\n\n async chat(messages: Message[], tools?: Tool[]): Promise<Response> {\n const res = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: this.model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: false,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n }),\n });\n const data = (await res.json()) as any;\n return {\n content: data.message?.content ?? \"\",\n tool_calls: data.message?.tool_calls?.map((tc: any, i: number) => ({\n id: `call_${i}`,\n type: \"function\" as const,\n function: {\n name: tc.function?.name ?? \"\",\n arguments: JSON.stringify(tc.function?.arguments ?? {}),\n },\n })),\n };\n }\n\n async *stream(messages: Message[], tools?: Tool[]): AsyncIterable<Chunk> {\n const res = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model: this.model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: true,\n ...(tools?.length && { tools: this.convertTools(tools) }),\n }),\n });\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop()!;\n for (const line of lines) {\n if (!line.trim()) continue;\n const data = JSON.parse(line);\n yield {\n content: data.message?.content ?? undefined,\n done: data.done ?? false,\n };\n }\n }\n yield { done: true };\n }\n\n private convertTools(tools: Tool[]) {\n return tools.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n }));\n }\n}\n","import type { ModelProvider } from \"../core/types.js\";\nimport { OpenAIProvider } from \"./openai.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OllamaProvider } from \"./ollama.js\";\n\ntype ProviderFactory = (config: Record<string, unknown>) => ModelProvider;\n\nconst registry = new Map<string, ProviderFactory>();\n\nregistry.set(\"openai\", (c) => new OpenAIProvider(c as any));\nregistry.set(\"claude\", (c) => new AnthropicProvider(c as any));\nregistry.set(\"anthropic\", (c) => new AnthropicProvider(c as any));\nregistry.set(\"ollama\", (c) => new OllamaProvider(c as any));\n\nexport function registerProvider(name: string, factory: ProviderFactory) {\n registry.set(name, factory);\n}\n\nexport function createProvider(name: string, config: Record<string, unknown>): ModelProvider {\n const factory = registry.get(name);\n if (!factory)\n throw new Error(\n `Unknown model provider: ${name}. Available: ${[...registry.keys()].join(\", \")}`,\n );\n return factory(config);\n}\n\nexport function parseModelString(modelStr: string): { provider: string; model: string } {\n const [provider, ...rest] = modelStr.split(\":\");\n return { provider: provider!, model: rest.join(\":\") || \"\" };\n}\n","import * as readline from \"node:readline\";\nimport chalk from \"chalk\";\nimport { join } from \"node:path\";\nimport { Orchestrator } from \"../core/orchestrator.js\";\nimport { SessionMemory } from \"../memory/session.js\";\nimport { loadSkills, matchSkill } from \"../skills/loader.js\";\nimport type { ModelProvider, ToolResult } from \"../core/types.js\";\n\nexport async function startREPL(\n model: ModelProvider,\n opts?: { skillName?: string },\n): Promise<void> {\n const session = new SessionMemory();\n const skillsDir = join(process.cwd(), \"skills\");\n const skills = await loadSkills(skillsDir);\n\n let skillInstructions: string | undefined;\n if (opts?.skillName) {\n const skill = skills.find((s) => s.name === opts.skillName);\n if (skill) skillInstructions = skill.instructions;\n }\n\n const orchestrator = new Orchestrator({\n model,\n skillInstructions,\n onToolStart: (name) => console.log(chalk.yellow(` ⚙ ${name}...`)),\n onToolEnd: (_name, result: ToolResult) => {\n if (result.error) console.log(chalk.red(` ✗ ${_name}: ${result.error}`));\n else console.log(chalk.green(` ✓ ${_name}`));\n },\n });\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"hecode> \"),\n });\n\n const logo = chalk.cyan(`\n ██╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗\n ██║ ██║██╔════╝██╔════╝██╔═══██╗██╔══██╗██╔════╝\n ███████║█████╗ ██║ ██║ ██║██║ ██║█████╗ \n ██╔══██║██╔══╝ ██║ ██║ ██║██║ ██║██╔══╝ \n ██║ ██║███████╗╚██████╗╚██████╔╝██████╔╝███████╗\n ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝\n `);\n\n console.log(logo);\n console.log(chalk.bold.white(\" Your AI Coding Assistant\") + chalk.gray(\" v0.2.0\"));\n console.log(chalk.gray(\" ─────────────────────────────────────────────\"));\n console.log(chalk.gray(` Session: ${session.sessionId}`));\n if (skills.length) {\n console.log(chalk.gray(` Skills: ${skills.map((s) => s.name).join(\", \")}`));\n }\n console.log(chalk.gray(\" ─────────────────────────────────────────────\"));\n console.log(chalk.gray(\" Type /help for commands, Ctrl+C to exit\\n\"));\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const input = line.trim();\n if (!input) {\n rl.prompt();\n return;\n }\n\n if (input.startsWith(\"/\")) {\n handleCommand(input, orchestrator, session);\n rl.prompt();\n return;\n }\n\n // Auto-match skill if not already set\n if (!skillInstructions) {\n const matched = matchSkill(skills, input);\n if (matched) {\n console.log(chalk.gray(` [skill: ${matched.name}]`));\n }\n }\n\n try {\n process.stdout.write(chalk.white(\"\\n\"));\n for await (const token of orchestrator.runStream(input)) {\n process.stdout.write(token);\n }\n process.stdout.write(\"\\n\\n\");\n\n // Auto-save session after each exchange\n await session.save(orchestrator.getMessages());\n } catch (e: any) {\n console.log(chalk.red(`\\nError: ${e.message}\\n`));\n }\n\n rl.prompt();\n });\n\n rl.on(\"close\", () => {\n console.log(chalk.gray(\"\\nGoodbye!\"));\n process.exit(0);\n });\n}\n\nfunction handleCommand(\n input: string,\n orchestrator: Orchestrator,\n session: SessionMemory,\n): void {\n const cmd = input.split(\" \")[0];\n switch (cmd) {\n case \"/help\":\n console.log(\n chalk.cyan(`\n /help — Show this help\n /clear — Clear conversation\n /history — Show message count\n /save — Save session manually\n /session — Show session ID\n /exit — Exit Hecode\n `),\n );\n break;\n case \"/clear\":\n orchestrator.clearMessages();\n console.log(chalk.gray(\"Conversation cleared.\"));\n break;\n case \"/history\":\n console.log(chalk.gray(`Messages: ${orchestrator.getMessages().length}`));\n break;\n case \"/save\":\n session.save(orchestrator.getMessages()).then(() => {\n console.log(chalk.gray(\"Session saved.\"));\n });\n break;\n case \"/session\":\n console.log(chalk.gray(`Session ID: ${session.sessionId}`));\n break;\n case \"/exit\":\n process.exit(0);\n default:\n console.log(chalk.red(`Unknown command: ${cmd}`));\n }\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Message } from \"../core/types.js\";\n\nconst SESSIONS_DIR = join(homedir(), \".hecode\", \"sessions\");\n\nexport interface Session {\n id: string;\n messages: Message[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport class SessionMemory {\n private sessionDir: string;\n\n constructor(sessionId?: string) {\n const id = sessionId ?? randomUUID().slice(0, 12);\n this.sessionDir = join(SESSIONS_DIR, id);\n }\n\n get sessionId(): string {\n return this.sessionDir.split(/[\\\\/]/).pop()!;\n }\n\n async save(messages: Message[]): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n const session: Session = {\n id: this.sessionId,\n messages,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n await writeFile(\n join(this.sessionDir, \"session.json\"),\n JSON.stringify(session, null, 2),\n );\n }\n\n async load(): Promise<Message[]> {\n try {\n const raw = await readFile(\n join(this.sessionDir, \"session.json\"),\n \"utf-8\",\n );\n const session: Session = JSON.parse(raw);\n return session.messages;\n } catch {\n return [];\n }\n }\n\n async saveCheckpoint(data: Record<string, unknown>): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n await writeFile(\n join(this.sessionDir, \"checkpoint.md\"),\n JSON.stringify(data, null, 2),\n );\n }\n\n async saveNote(content: string): Promise<void> {\n await mkdir(this.sessionDir, { recursive: true });\n const notePath = join(this.sessionDir, \"notes.md\");\n let existing = \"\";\n try {\n existing = await readFile(notePath, \"utf-8\");\n } catch {}\n await writeFile(notePath, existing + \"\\n\\n\" + content);\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface Skill {\n name: string;\n description: string;\n trigger: string;\n instructions: string;\n priority: number;\n tools?: string[];\n}\n\ninterface SkillCache {\n skills: Skill[];\n timestamp: number;\n dir: string;\n}\n\nconst CACHE_TTL = 60 * 1000; // 1 minute\nlet skillCache: SkillCache | null = null;\n\nexport async function loadSkills(skillsDir: string): Promise<Skill[]> {\n // Return cached skills if valid\n if (skillCache && skillCache.dir === skillsDir && Date.now() - skillCache.timestamp < CACHE_TTL) {\n return skillCache.skills;\n }\n\n const skills: Skill[] = [];\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillPath = join(skillsDir, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf-8\");\n const skill = parseSkill(entry.name, content);\n if (skill) skills.push(skill);\n } catch {\n // SKILL.md doesn't exist, skip\n }\n }\n } catch (err) {\n console.warn(`Warning: Could not load skills from ${skillsDir}:`, err);\n }\n\n // Sort by priority (higher priority first)\n skills.sort((a, b) => b.priority - a.priority);\n\n // Update cache\n skillCache = {\n skills,\n timestamp: Date.now(),\n dir: skillsDir,\n };\n\n return skills;\n}\n\nfunction parseSkill(name: string, content: string): Skill | null {\n const descMatch = content.match(/^#\\s+(.+)$/m);\n const triggerMatch = content.match(/trigger:\\s*(.+)/i);\n const priorityMatch = content.match(/priority:\\s*(\\d+)/i);\n if (!descMatch) return null;\n\n return {\n name,\n description: descMatch[1] ?? name,\n trigger: triggerMatch?.[1] ?? \"\",\n priority: priorityMatch ? parseInt(priorityMatch[1], 10) : 0,\n instructions: content,\n };\n}\n\nexport function matchSkill(skills: Skill[], userMessage: string): Skill | null {\n const lower = userMessage.toLowerCase();\n const words = lower.split(/\\s+/);\n\n for (const skill of skills) {\n if (!skill.trigger) continue;\n\n const triggers = skill.trigger.split(\",\").map((t) => t.trim().toLowerCase());\n\n for (const trigger of triggers) {\n // Check for exact word match or phrase match\n if (words.includes(trigger) || lower.includes(` ${trigger} `) || lower.startsWith(`${trigger} `) || lower.endsWith(` ${trigger}`)) {\n return skill;\n }\n }\n }\n\n return null;\n}\n\nexport function clearSkillCache(): void {\n skillCache = null;\n}\n","#!/usr/bin/env node\nimport { createProgram } from \"./cli/commands.js\";\n\nconst program = await createProgram();\nprogram.parse();\n"],"mappings":"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","names":["readFile","join","join","readFile","writeFile","mkdir","join","homedir","readFile","join","join","join","readFile","program","Orchestrator"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhanngning/hecode",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "hecode": "./dist/index.js"