asyncwf 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.
Files changed (50) hide show
  1. package/README.md +112 -0
  2. package/dist/commands/init.d.ts +2 -0
  3. package/dist/commands/init.d.ts.map +1 -0
  4. package/dist/commands/init.js +83 -0
  5. package/dist/commands/init.js.map +1 -0
  6. package/dist/commands/kb.d.ts +8 -0
  7. package/dist/commands/kb.d.ts.map +1 -0
  8. package/dist/commands/kb.js +109 -0
  9. package/dist/commands/kb.js.map +1 -0
  10. package/dist/commands/link.d.ts +2 -0
  11. package/dist/commands/link.d.ts.map +1 -0
  12. package/dist/commands/link.js +74 -0
  13. package/dist/commands/link.js.map +1 -0
  14. package/dist/commands/skill.d.ts +9 -0
  15. package/dist/commands/skill.d.ts.map +1 -0
  16. package/dist/commands/skill.js +103 -0
  17. package/dist/commands/skill.js.map +1 -0
  18. package/dist/commands/taskmgr.d.ts +11 -0
  19. package/dist/commands/taskmgr.d.ts.map +1 -0
  20. package/dist/commands/taskmgr.js +129 -0
  21. package/dist/commands/taskmgr.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +109 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lib/agent.d.ts +5 -0
  27. package/dist/lib/agent.d.ts.map +1 -0
  28. package/dist/lib/agent.js +124 -0
  29. package/dist/lib/agent.js.map +1 -0
  30. package/dist/lib/knowledge.d.ts +8 -0
  31. package/dist/lib/knowledge.d.ts.map +1 -0
  32. package/dist/lib/knowledge.js +149 -0
  33. package/dist/lib/knowledge.js.map +1 -0
  34. package/dist/lib/skills.d.ts +8 -0
  35. package/dist/lib/skills.d.ts.map +1 -0
  36. package/dist/lib/skills.js +129 -0
  37. package/dist/lib/skills.js.map +1 -0
  38. package/dist/lib/state.d.ts +13 -0
  39. package/dist/lib/state.d.ts.map +1 -0
  40. package/dist/lib/state.js +87 -0
  41. package/dist/lib/state.js.map +1 -0
  42. package/dist/lib/templates.d.ts +9 -0
  43. package/dist/lib/templates.d.ts.map +1 -0
  44. package/dist/lib/templates.js +79 -0
  45. package/dist/lib/templates.js.map +1 -0
  46. package/dist/types.d.ts +57 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +55 -0
@@ -0,0 +1,129 @@
1
+ import { readFileSync, existsSync } from 'fs';
2
+ import chalk from 'chalk';
3
+ import { getAllTasks, getTasksByStatus, getTask, getLogPath } from '../lib/state.js';
4
+ import { dispatchAgent, killAgent, waitForJobs } from '../lib/agent.js';
5
+ export async function taskmgrCommand(action, options) {
6
+ switch (action) {
7
+ case 'dispatch':
8
+ await handleDispatch(options);
9
+ break;
10
+ case 'list':
11
+ await handleList(options);
12
+ break;
13
+ case 'wait':
14
+ await handleWait(options);
15
+ break;
16
+ case 'fetch':
17
+ await handleFetch(options);
18
+ break;
19
+ case 'kill':
20
+ await handleKill(options);
21
+ break;
22
+ default:
23
+ console.log(chalk.red(`Unknown action: ${action}`));
24
+ }
25
+ }
26
+ async function handleDispatch(options) {
27
+ const { job, prompt, skill } = options;
28
+ if (!job || !prompt) {
29
+ console.log(chalk.red('Error: --job and --prompt are required'));
30
+ return;
31
+ }
32
+ // Check if job already exists
33
+ const existing = await getTask(job);
34
+ if (existing) {
35
+ console.log(chalk.red(`Error: Job "${job}" already exists`));
36
+ return;
37
+ }
38
+ console.log(chalk.cyan(`🚀 Dispatching job: ${job}`));
39
+ if (skill) {
40
+ console.log(chalk.gray(` Using skill: ${skill}`));
41
+ }
42
+ const task = await dispatchAgent(job, prompt, skill);
43
+ console.log(chalk.green(`✓ Job dispatched`));
44
+ console.log(JSON.stringify({
45
+ id: task.id,
46
+ status: task.status,
47
+ pid: task.pid,
48
+ skill: task.skill,
49
+ }, null, 2));
50
+ }
51
+ async function handleList(options) {
52
+ const { status } = options;
53
+ let tasks;
54
+ if (status) {
55
+ tasks = await getTasksByStatus(status);
56
+ }
57
+ else {
58
+ tasks = await getAllTasks();
59
+ }
60
+ if (tasks.length === 0) {
61
+ console.log(chalk.gray('No tasks found'));
62
+ return;
63
+ }
64
+ // Output as JSON for easy parsing by Claude
65
+ console.log(JSON.stringify(tasks.map(t => ({
66
+ id: t.id,
67
+ status: t.status,
68
+ skill: t.skill,
69
+ pid: t.pid,
70
+ exitCode: t.exitCode,
71
+ createdAt: t.createdAt,
72
+ updatedAt: t.updatedAt,
73
+ })), null, 2));
74
+ }
75
+ async function handleWait(options) {
76
+ const { jobs, timeout } = options;
77
+ if (!jobs) {
78
+ console.log(chalk.red('Error: --jobs is required'));
79
+ return;
80
+ }
81
+ const jobIds = jobs.split(',').map(s => s.trim());
82
+ const timeoutMs = parseInt(timeout || '300000', 10);
83
+ console.log(chalk.cyan(`⏳ Waiting for jobs: ${jobIds.join(', ')}`));
84
+ console.log(chalk.gray(` Timeout: ${timeoutMs / 1000}s`));
85
+ const results = await waitForJobs(jobIds, timeoutMs);
86
+ console.log(chalk.green(`\n✓ Jobs completed`));
87
+ console.log(JSON.stringify(results.map(t => ({
88
+ id: t.id,
89
+ status: t.status,
90
+ exitCode: t.exitCode,
91
+ })), null, 2));
92
+ }
93
+ async function handleFetch(options) {
94
+ const { job } = options;
95
+ if (!job) {
96
+ console.log(chalk.red('Error: --job is required'));
97
+ return;
98
+ }
99
+ const task = await getTask(job);
100
+ if (!task) {
101
+ console.log(chalk.red(`Error: Job "${job}" not found`));
102
+ return;
103
+ }
104
+ const logPath = getLogPath(job);
105
+ if (!existsSync(logPath)) {
106
+ console.log(chalk.yellow(`No output file found for job "${job}"`));
107
+ return;
108
+ }
109
+ const content = readFileSync(logPath, 'utf-8');
110
+ console.log(chalk.cyan(`📄 Output for job: ${job}`));
111
+ console.log(chalk.gray(`Status: ${task.status}`));
112
+ console.log(chalk.gray('---'));
113
+ console.log(content);
114
+ }
115
+ async function handleKill(options) {
116
+ const { job } = options;
117
+ if (!job) {
118
+ console.log(chalk.red('Error: --job is required'));
119
+ return;
120
+ }
121
+ const success = await killAgent(job);
122
+ if (success) {
123
+ console.log(chalk.green(`✓ Job "${job}" terminated`));
124
+ }
125
+ else {
126
+ console.log(chalk.yellow(`⚠ Could not terminate job "${job}" (may have already finished)`));
127
+ }
128
+ }
129
+ //# sourceMappingURL=taskmgr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskmgr.js","sourceRoot":"","sources":["../../src/commands/taskmgr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { initCommand } from './commands/init.js';
5
+ import { linkCommand } from './commands/link.js';
6
+ import { taskmgrCommand } from './commands/taskmgr.js';
7
+ import { skillCommand } from './commands/skill.js';
8
+ import { kbCommand } from './commands/kb.js';
9
+ const program = new Command();
10
+ program
11
+ .name('asyncwf')
12
+ .description(chalk.cyan('AsyncWF - Model-Driven Parallel Agent Workflow CLI'))
13
+ .version('1.0.0');
14
+ // Setup commands
15
+ program
16
+ .command('init')
17
+ .description('Initialize AsyncWF in the current directory')
18
+ .action(initCommand);
19
+ program
20
+ .command('link')
21
+ .description('Link local specs to global knowledge base')
22
+ .action(linkCommand);
23
+ // Task Manager
24
+ const taskmgr = program
25
+ .command('taskmgr')
26
+ .description('Task manager for parallel agent workflows');
27
+ taskmgr
28
+ .command('dispatch')
29
+ .description('Spawn a sub-agent task')
30
+ .requiredOption('--job <id>', 'Job identifier')
31
+ .requiredOption('--prompt <text>', 'Prompt for the sub-agent')
32
+ .option('--skill <name>', 'Skill to inject into prompt')
33
+ .action((opts) => taskmgrCommand('dispatch', opts));
34
+ taskmgr
35
+ .command('list')
36
+ .description('List all tasks')
37
+ .option('--status <status>', 'Filter by status (pending|running|done|failed)')
38
+ .action((opts) => taskmgrCommand('list', opts));
39
+ taskmgr
40
+ .command('wait')
41
+ .description('Wait for tasks to complete')
42
+ .requiredOption('--jobs <ids>', 'Comma-separated job IDs')
43
+ .option('--timeout <ms>', 'Timeout in milliseconds', '300000')
44
+ .action((opts) => taskmgrCommand('wait', opts));
45
+ taskmgr
46
+ .command('fetch')
47
+ .description('Fetch task output')
48
+ .requiredOption('--job <id>', 'Job identifier')
49
+ .action((opts) => taskmgrCommand('fetch', opts));
50
+ taskmgr
51
+ .command('kill')
52
+ .description('Kill a running task')
53
+ .requiredOption('--job <id>', 'Job identifier')
54
+ .action((opts) => taskmgrCommand('kill', opts));
55
+ // Skills Manager
56
+ const skill = program
57
+ .command('skill')
58
+ .description('Manage reusable skills');
59
+ skill
60
+ .command('list')
61
+ .description('List all available skills')
62
+ .action(() => skillCommand('list', {}));
63
+ skill
64
+ .command('show <name>')
65
+ .description('Display skill content')
66
+ .action((name) => skillCommand('show', { name }));
67
+ skill
68
+ .command('add <name>')
69
+ .description('Add or update a skill')
70
+ .requiredOption('--content <markdown>', 'Skill content in markdown')
71
+ .option('--description <text>', 'Skill description')
72
+ .option('--tags <tags>', 'Comma-separated tags')
73
+ .action((name, opts) => skillCommand('add', { name, ...opts }));
74
+ skill
75
+ .command('delete <name>')
76
+ .description('Delete a skill')
77
+ .action((name) => skillCommand('delete', { name }));
78
+ skill
79
+ .command('use <name>')
80
+ .description('Output skill content for prompt injection')
81
+ .action((name) => skillCommand('use', { name }));
82
+ // Knowledge Base
83
+ const kb = program
84
+ .command('kb')
85
+ .description('Manage knowledge base');
86
+ kb
87
+ .command('list')
88
+ .description('List all knowledge entries')
89
+ .action(() => kbCommand('list', {}));
90
+ kb
91
+ .command('show <topic>')
92
+ .description('Display knowledge entry')
93
+ .action((topic) => kbCommand('show', { topic }));
94
+ kb
95
+ .command('learn')
96
+ .description('Add learned knowledge')
97
+ .requiredOption('--topic <name>', 'Knowledge topic')
98
+ .requiredOption('--content <markdown>', 'Knowledge content')
99
+ .action((opts) => kbCommand('learn', opts));
100
+ kb
101
+ .command('search <query>')
102
+ .description('Search knowledge base')
103
+ .action((query) => kbCommand('search', { query }));
104
+ kb
105
+ .command('delete <topic>')
106
+ .description('Delete knowledge entry')
107
+ .action((topic) => kbCommand('delete', { topic }));
108
+ program.parse();
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Task } from '../types.js';
2
+ export declare function dispatchAgent(jobId: string, prompt: string, skillName?: string): Promise<Task>;
3
+ export declare function killAgent(jobId: string): Promise<boolean>;
4
+ export declare function waitForJobs(jobIds: string[], timeoutMs?: number): Promise<Task[]>;
5
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/lib/agent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,wBAAsB,aAAa,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAqFf;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/D;AAED,wBAAsB,WAAW,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAAe,GAC3B,OAAO,CAAC,IAAI,EAAE,CAAC,CAwBjB"}
@@ -0,0 +1,124 @@
1
+ import { spawn } from 'child_process';
2
+ import { createWriteStream, existsSync } from 'fs';
3
+ import { getLogPath, getLogsDir, createTask, updateTask, getTask } from './state.js';
4
+ import { getSkill, formatSkillForPrompt } from './skills.js';
5
+ // Store child process references for kill
6
+ const processes = new Map();
7
+ export async function dispatchAgent(jobId, prompt, skillName) {
8
+ // Build full prompt with skill if provided
9
+ let fullPrompt = prompt;
10
+ if (skillName) {
11
+ const skill = getSkill(skillName);
12
+ if (skill) {
13
+ fullPrompt = `${formatSkillForPrompt(skill)}\n\n${prompt}`;
14
+ }
15
+ }
16
+ // Create log file
17
+ const logsDir = getLogsDir();
18
+ if (!existsSync(logsDir)) {
19
+ const { mkdirSync } = await import('fs');
20
+ mkdirSync(logsDir, { recursive: true });
21
+ }
22
+ const logPath = getLogPath(jobId);
23
+ const logStream = createWriteStream(logPath);
24
+ // Create task record
25
+ const task = await createTask({
26
+ id: jobId,
27
+ prompt: fullPrompt,
28
+ skill: skillName,
29
+ status: 'running',
30
+ logFile: logPath,
31
+ });
32
+ // Spawn the agent process
33
+ // Try claude CLI first, fallback to echo for testing
34
+ const agentCommand = process.env.ASYNCWF_AGENT || 'claude';
35
+ const args = agentCommand === 'claude'
36
+ ? ['-p', fullPrompt]
37
+ : [fullPrompt]; // For testing with echo
38
+ try {
39
+ const child = spawn(agentCommand, args, {
40
+ detached: true,
41
+ stdio: ['ignore', 'pipe', 'pipe'],
42
+ shell: true,
43
+ });
44
+ processes.set(jobId, child);
45
+ // Pipe output to log file
46
+ child.stdout?.pipe(logStream);
47
+ child.stderr?.pipe(logStream);
48
+ // Update task with PID
49
+ await updateTask(jobId, { pid: child.pid });
50
+ // Handle process exit
51
+ child.on('exit', async (code) => {
52
+ processes.delete(jobId);
53
+ logStream.end();
54
+ await updateTask(jobId, {
55
+ status: code === 0 ? 'done' : 'failed',
56
+ exitCode: code ?? -1,
57
+ });
58
+ });
59
+ child.on('error', async (err) => {
60
+ processes.delete(jobId);
61
+ logStream.write(`\nError: ${err.message}\n`);
62
+ logStream.end();
63
+ await updateTask(jobId, {
64
+ status: 'failed',
65
+ exitCode: -1,
66
+ });
67
+ });
68
+ // Unref to allow parent to exit
69
+ child.unref();
70
+ }
71
+ catch (error) {
72
+ logStream.write(`Failed to spawn agent: ${error}\n`);
73
+ logStream.end();
74
+ await updateTask(jobId, {
75
+ status: 'failed',
76
+ exitCode: -1,
77
+ });
78
+ }
79
+ return task;
80
+ }
81
+ export async function killAgent(jobId) {
82
+ const task = await getTask(jobId);
83
+ if (!task)
84
+ return false;
85
+ // Try to kill by stored process reference
86
+ const proc = processes.get(jobId);
87
+ if (proc && !proc.killed) {
88
+ proc.kill('SIGTERM');
89
+ processes.delete(jobId);
90
+ await updateTask(jobId, { status: 'failed', exitCode: -1 });
91
+ return true;
92
+ }
93
+ // Try to kill by PID
94
+ if (task.pid) {
95
+ try {
96
+ process.kill(task.pid, 'SIGTERM');
97
+ await updateTask(jobId, { status: 'failed', exitCode: -1 });
98
+ return true;
99
+ }
100
+ catch {
101
+ // Process may have already exited
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ export async function waitForJobs(jobIds, timeoutMs = 300000) {
107
+ const startTime = Date.now();
108
+ const pollInterval = 1000; // 1 second
109
+ while (Date.now() - startTime < timeoutMs) {
110
+ const tasks = await Promise.all(jobIds.map(id => getTask(id)));
111
+ const validTasks = tasks.filter((t) => t !== undefined);
112
+ // Check if all tasks are complete
113
+ const allComplete = validTasks.every(t => t.status === 'done' || t.status === 'failed');
114
+ if (allComplete) {
115
+ return validTasks;
116
+ }
117
+ // Wait before next poll
118
+ await new Promise(resolve => setTimeout(resolve, pollInterval));
119
+ }
120
+ // Timeout - return current state
121
+ const tasks = await Promise.all(jobIds.map(id => getTask(id)));
122
+ return tasks.filter((t) => t !== undefined);
123
+ }
124
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/lib/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { KnowledgeEntry, KnowledgeIndex } from '../types.js';
2
+ export declare function ensureKnowledgeDir(): void;
3
+ export declare function listKnowledge(): KnowledgeIndex['entries'];
4
+ export declare function getKnowledge(topic: string): KnowledgeEntry | null;
5
+ export declare function learnKnowledge(topic: string, content: string, source?: KnowledgeEntry['source']): KnowledgeEntry;
6
+ export declare function searchKnowledge(query: string): KnowledgeEntry[];
7
+ export declare function deleteKnowledge(topic: string): boolean;
8
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAclE,wBAAgB,kBAAkB,IAAI,IAAI,CAUzC;AAYD,wBAAgB,aAAa,IAAI,cAAc,CAAC,SAAS,CAAC,CAEzD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqCjE;AAED,wBAAgB,cAAc,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,cAAc,CAAC,QAAQ,CAAmB,GACnD,cAAc,CAkDhB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB/D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CActD"}
@@ -0,0 +1,149 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ function getCKBDir() {
5
+ return join(homedir(), '.ckb');
6
+ }
7
+ function getKnowledgeDir() {
8
+ return join(getCKBDir(), 'knowledge');
9
+ }
10
+ function getKnowledgeIndexPath() {
11
+ return join(getKnowledgeDir(), '_index.json');
12
+ }
13
+ export function ensureKnowledgeDir() {
14
+ const dir = getKnowledgeDir();
15
+ if (!existsSync(dir)) {
16
+ mkdirSync(dir, { recursive: true });
17
+ }
18
+ const indexPath = getKnowledgeIndexPath();
19
+ if (!existsSync(indexPath)) {
20
+ writeFileSync(indexPath, JSON.stringify({ entries: [] }, null, 2));
21
+ }
22
+ }
23
+ function getKnowledgeIndex() {
24
+ ensureKnowledgeDir();
25
+ const data = readFileSync(getKnowledgeIndexPath(), 'utf-8');
26
+ return JSON.parse(data);
27
+ }
28
+ function saveKnowledgeIndex(index) {
29
+ writeFileSync(getKnowledgeIndexPath(), JSON.stringify(index, null, 2));
30
+ }
31
+ export function listKnowledge() {
32
+ return getKnowledgeIndex().entries;
33
+ }
34
+ export function getKnowledge(topic) {
35
+ const index = getKnowledgeIndex();
36
+ const entry = index.entries.find(e => e.topic === topic);
37
+ if (!entry)
38
+ return null;
39
+ const filePath = join(getKnowledgeDir(), `${topic}.md`);
40
+ if (!existsSync(filePath))
41
+ return null;
42
+ const content = readFileSync(filePath, 'utf-8');
43
+ // Parse frontmatter
44
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
45
+ if (!frontmatterMatch) {
46
+ return {
47
+ topic,
48
+ created: entry.created,
49
+ updated: entry.updated,
50
+ source: 'model-learned',
51
+ content,
52
+ filePath,
53
+ };
54
+ }
55
+ const frontmatter = frontmatterMatch[1];
56
+ const body = frontmatterMatch[2];
57
+ // Simple parsing
58
+ const sourceMatch = frontmatter.match(/source:\s*(.+)/);
59
+ return {
60
+ topic,
61
+ created: entry.created,
62
+ updated: entry.updated,
63
+ source: (sourceMatch ? sourceMatch[1].trim() : 'model-learned'),
64
+ content: body.trim(),
65
+ filePath,
66
+ };
67
+ }
68
+ export function learnKnowledge(topic, content, source = 'model-learned') {
69
+ ensureKnowledgeDir();
70
+ const filePath = join(getKnowledgeDir(), `${topic}.md`);
71
+ const now = new Date().toISOString().split('T')[0];
72
+ // Check if exists for created date
73
+ const existing = getKnowledgeIndex().entries.find(e => e.topic === topic);
74
+ const created = existing?.created || now;
75
+ // Create markdown with frontmatter
76
+ const fullContent = `---
77
+ topic: ${topic}
78
+ created: ${created}
79
+ updated: ${now}
80
+ source: ${source}
81
+ ---
82
+
83
+ ${content}
84
+ `;
85
+ writeFileSync(filePath, fullContent);
86
+ // Update index
87
+ const index = getKnowledgeIndex();
88
+ const existingIndex = index.entries.findIndex(e => e.topic === topic);
89
+ const entry = {
90
+ topic,
91
+ created,
92
+ updated: now,
93
+ filePath,
94
+ };
95
+ if (existingIndex >= 0) {
96
+ index.entries[existingIndex] = entry;
97
+ }
98
+ else {
99
+ index.entries.push(entry);
100
+ }
101
+ saveKnowledgeIndex(index);
102
+ return {
103
+ topic,
104
+ created,
105
+ updated: now,
106
+ source,
107
+ content,
108
+ filePath,
109
+ };
110
+ }
111
+ export function searchKnowledge(query) {
112
+ const index = getKnowledgeIndex();
113
+ const results = [];
114
+ const lowerQuery = query.toLowerCase();
115
+ for (const entry of index.entries) {
116
+ // Search in topic name
117
+ if (entry.topic.toLowerCase().includes(lowerQuery)) {
118
+ const kb = getKnowledge(entry.topic);
119
+ if (kb)
120
+ results.push(kb);
121
+ continue;
122
+ }
123
+ // Search in content
124
+ const filePath = join(getKnowledgeDir(), `${entry.topic}.md`);
125
+ if (existsSync(filePath)) {
126
+ const content = readFileSync(filePath, 'utf-8').toLowerCase();
127
+ if (content.includes(lowerQuery)) {
128
+ const kb = getKnowledge(entry.topic);
129
+ if (kb)
130
+ results.push(kb);
131
+ }
132
+ }
133
+ }
134
+ return results;
135
+ }
136
+ export function deleteKnowledge(topic) {
137
+ const index = getKnowledgeIndex();
138
+ const entryIndex = index.entries.findIndex(e => e.topic === topic);
139
+ if (entryIndex === -1)
140
+ return false;
141
+ const filePath = join(getKnowledgeDir(), `${topic}.md`);
142
+ if (existsSync(filePath)) {
143
+ unlinkSync(filePath);
144
+ }
145
+ index.entries.splice(entryIndex, 1);
146
+ saveKnowledgeIndex(index);
147
+ return true;
148
+ }
149
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/lib/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Skill, SkillsIndex } from '../types.js';
2
+ export declare function ensureSkillsDir(): void;
3
+ export declare function listSkills(): SkillsIndex['skills'];
4
+ export declare function getSkill(name: string): Skill | null;
5
+ export declare function addSkill(name: string, content: string, description?: string, tags?: string[]): Skill;
6
+ export declare function deleteSkill(name: string): boolean;
7
+ export declare function formatSkillForPrompt(skill: Skill): string;
8
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AActD,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAYD,wBAAgB,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,CAElD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAqCnD;AAED,wBAAgB,QAAQ,CACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAW,EACxB,IAAI,GAAE,MAAM,EAAO,GACpB,KAAK,CA+CP;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAMzD"}