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
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # AsyncWF
2
+
3
+ **Model-Driven Parallel Agent Workflow CLI for claude-code**
4
+
5
+ AsyncWF empowers claude-code with asynchronous multitasking capabilities through a lightweight, tool-centric CLI. Instead of wrapping the LLM in a rigid control loop, AsyncWF injects a "Parallel Workflow Protocol" directly into the model's context.
6
+
7
+ ## Features
8
+
9
+ - 🚀 **Parallel Task Dispatch** - Spawn multiple sub-agents concurrently
10
+ - 📚 **Skills System** - Global reusable action templates
11
+ - 🧠 **Knowledge Base** - Model-driven learning and context persistence
12
+ - 🔗 **Project Linking** - Connect specs to global knowledge base
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install -g asyncwf
18
+ ```
19
+
20
+ Or from source:
21
+
22
+ ```bash
23
+ git clone https://github.com/yourname/asyncwf
24
+ cd asyncwf
25
+ npm install
26
+ npm run build
27
+ npm link
28
+ ```
29
+
30
+ ## Quick Start
31
+
32
+ ```bash
33
+ # Initialize a project
34
+ asyncwf init
35
+
36
+ # Link specs to global KB
37
+ asyncwf link
38
+
39
+ # Dispatch parallel tasks
40
+ asyncwf taskmgr dispatch --job api --prompt "Write a REST API handler"
41
+ asyncwf taskmgr dispatch --job tests --prompt "Write unit tests"
42
+
43
+ # Wait for completion
44
+ asyncwf taskmgr wait --jobs api,tests
45
+
46
+ # Fetch results
47
+ asyncwf taskmgr fetch --job api
48
+ ```
49
+
50
+ ## Commands
51
+
52
+ ### Setup
53
+
54
+ | Command | Description |
55
+ |---------|-------------|
56
+ | `asyncwf init` | Initialize project with `.asyncwf/` and `claude.md` |
57
+ | `asyncwf link` | Link specs to `~/.ckb/projects/` |
58
+
59
+ ### Task Manager
60
+
61
+ | Command | Description |
62
+ |---------|-------------|
63
+ | `asyncwf taskmgr dispatch --job <id> --prompt "<text>" [--skill <name>]` | Spawn sub-agent |
64
+ | `asyncwf taskmgr list [--status <status>]` | List tasks |
65
+ | `asyncwf taskmgr wait --jobs <ids>` | Wait for completion |
66
+ | `asyncwf taskmgr fetch --job <id>` | Get task output |
67
+ | `asyncwf taskmgr kill --job <id>` | Terminate task |
68
+
69
+ ### Skills
70
+
71
+ | Command | Description |
72
+ |---------|-------------|
73
+ | `asyncwf skill list` | List available skills |
74
+ | `asyncwf skill show <name>` | Display skill content |
75
+ | `asyncwf skill add <name> --content "<md>"` | Add/update skill |
76
+ | `asyncwf skill use <name>` | Output for prompt injection |
77
+ | `asyncwf skill delete <name>` | Remove skill |
78
+
79
+ ### Knowledge Base
80
+
81
+ | Command | Description |
82
+ |---------|-------------|
83
+ | `asyncwf kb list` | List knowledge entries |
84
+ | `asyncwf kb show <topic>` | Display entry |
85
+ | `asyncwf kb learn --topic <name> --content "<md>"` | Learn new knowledge |
86
+ | `asyncwf kb search <query>` | Search KB |
87
+ | `asyncwf kb delete <topic>` | Remove entry |
88
+
89
+ ## Directory Structure
90
+
91
+ ```
92
+ ~/.ckb/ # Global Knowledge Base
93
+ ├── skills/ # Reusable skills
94
+ ├── knowledge/ # Learned knowledge
95
+ └── projects/ # Project symlinks
96
+
97
+ .asyncwf/ # Local project state
98
+ ├── config.json
99
+ ├── tasks.json
100
+ └── logs/
101
+ ```
102
+
103
+ ## How It Works
104
+
105
+ 1. **Controller**: Main claude-code session running in terminal
106
+ 2. **Protocol**: Instructions injected into `claude.md`
107
+ 3. **Workers**: Ephemeral sub-agents spawned via `taskmgr dispatch`
108
+ 4. **State**: Local JSON registry tracking job status
109
+
110
+ ## License
111
+
112
+ MIT
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmFjD"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ import chalk from 'chalk';
5
+ import { generateClaudeMD } from '../lib/templates.js';
6
+ import { ensureSkillsDir } from '../lib/skills.js';
7
+ import { ensureKnowledgeDir } from '../lib/knowledge.js';
8
+ export async function initCommand() {
9
+ const cwd = process.cwd();
10
+ console.log(chalk.cyan('🚀 Initializing AsyncWF...\n'));
11
+ // 1. Ensure global ~/.ckb exists
12
+ const ckbDir = join(homedir(), '.ckb');
13
+ if (!existsSync(ckbDir)) {
14
+ mkdirSync(ckbDir, { recursive: true });
15
+ console.log(chalk.green('✓ Created global knowledge base: ~/.ckb'));
16
+ }
17
+ else {
18
+ console.log(chalk.gray('• Global knowledge base exists: ~/.ckb'));
19
+ }
20
+ // Ensure subdirs
21
+ const projectsDir = join(ckbDir, 'projects');
22
+ if (!existsSync(projectsDir)) {
23
+ mkdirSync(projectsDir, { recursive: true });
24
+ }
25
+ // Ensure skills and knowledge dirs
26
+ ensureSkillsDir();
27
+ console.log(chalk.green('✓ Skills directory ready: ~/.ckb/skills'));
28
+ ensureKnowledgeDir();
29
+ console.log(chalk.green('✓ Knowledge base ready: ~/.ckb/knowledge'));
30
+ // 2. Create local .asyncwf directory
31
+ const asyncwfDir = join(cwd, '.asyncwf');
32
+ if (!existsSync(asyncwfDir)) {
33
+ mkdirSync(asyncwfDir, { recursive: true });
34
+ console.log(chalk.green('✓ Created .asyncwf/'));
35
+ }
36
+ else {
37
+ console.log(chalk.gray('• .asyncwf/ exists'));
38
+ }
39
+ // Create config.json
40
+ const configPath = join(asyncwfDir, 'config.json');
41
+ if (!existsSync(configPath)) {
42
+ writeFileSync(configPath, JSON.stringify({
43
+ version: '1.0.0',
44
+ agentCommand: 'claude',
45
+ ckbPath: ckbDir,
46
+ }, null, 2));
47
+ console.log(chalk.green('✓ Created .asyncwf/config.json'));
48
+ }
49
+ // Create tasks.json
50
+ const tasksPath = join(asyncwfDir, 'tasks.json');
51
+ if (!existsSync(tasksPath)) {
52
+ writeFileSync(tasksPath, JSON.stringify({ tasks: [] }, null, 2));
53
+ console.log(chalk.green('✓ Created .asyncwf/tasks.json'));
54
+ }
55
+ // Create logs directory
56
+ const logsDir = join(asyncwfDir, 'logs');
57
+ if (!existsSync(logsDir)) {
58
+ mkdirSync(logsDir, { recursive: true });
59
+ console.log(chalk.green('✓ Created .asyncwf/logs/'));
60
+ }
61
+ // 3. Generate claude.md
62
+ const claudeMdPath = join(cwd, 'claude.md');
63
+ if (!existsSync(claudeMdPath)) {
64
+ const content = generateClaudeMD();
65
+ writeFileSync(claudeMdPath, content);
66
+ console.log(chalk.green('✓ Generated claude.md with AsyncWF protocol'));
67
+ }
68
+ else {
69
+ console.log(chalk.yellow('⚠ claude.md already exists (skipped)'));
70
+ }
71
+ // 4. Create specs directory if missing
72
+ const specsDir = join(cwd, 'specs');
73
+ if (!existsSync(specsDir)) {
74
+ mkdirSync(specsDir, { recursive: true });
75
+ console.log(chalk.green('✓ Created specs/'));
76
+ }
77
+ console.log(chalk.cyan('\n✨ AsyncWF initialized successfully!'));
78
+ console.log(chalk.gray('\nNext steps:'));
79
+ console.log(chalk.gray(' 1. Add your specs to specs/'));
80
+ console.log(chalk.gray(' 2. Run `asyncwf link` to connect to global KB'));
81
+ console.log(chalk.gray(' 3. Start using taskmgr for parallel workflows'));
82
+ }
83
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface KBOptions {
2
+ topic?: string;
3
+ content?: string;
4
+ query?: string;
5
+ }
6
+ export declare function kbCommand(action: string, options: KBOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=kb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb.d.ts","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"AASA,UAAU,SAAS;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,SAAS,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,109 @@
1
+ import chalk from 'chalk';
2
+ import { listKnowledge, getKnowledge, learnKnowledge, searchKnowledge, deleteKnowledge } from '../lib/knowledge.js';
3
+ export async function kbCommand(action, options) {
4
+ switch (action) {
5
+ case 'list':
6
+ handleList();
7
+ break;
8
+ case 'show':
9
+ handleShow(options);
10
+ break;
11
+ case 'learn':
12
+ handleLearn(options);
13
+ break;
14
+ case 'search':
15
+ handleSearch(options);
16
+ break;
17
+ case 'delete':
18
+ handleDelete(options);
19
+ break;
20
+ default:
21
+ console.log(chalk.red(`Unknown action: ${action}`));
22
+ }
23
+ }
24
+ function handleList() {
25
+ const entries = listKnowledge();
26
+ if (entries.length === 0) {
27
+ console.log(chalk.gray('No knowledge entries'));
28
+ console.log(chalk.gray('\nLearn something with:'));
29
+ console.log(chalk.gray(' asyncwf kb learn --topic <name> --content "..."'));
30
+ return;
31
+ }
32
+ console.log(chalk.cyan(`🧠 Knowledge Base (${entries.length} entries):\n`));
33
+ for (const entry of entries) {
34
+ console.log(chalk.green(`• ${entry.topic}`));
35
+ console.log(chalk.gray(` Updated: ${entry.updated}`));
36
+ }
37
+ // Also output JSON
38
+ console.log(chalk.gray('\n--- JSON ---'));
39
+ console.log(JSON.stringify(entries, null, 2));
40
+ }
41
+ function handleShow(options) {
42
+ const { topic } = options;
43
+ if (!topic) {
44
+ console.log(chalk.red('Error: topic required'));
45
+ return;
46
+ }
47
+ const entry = getKnowledge(topic);
48
+ if (!entry) {
49
+ console.log(chalk.red(`Error: Knowledge "${topic}" not found`));
50
+ return;
51
+ }
52
+ console.log(chalk.cyan(`📖 Knowledge: ${entry.topic}\n`));
53
+ console.log(chalk.gray(`Created: ${entry.created}`));
54
+ console.log(chalk.gray(`Updated: ${entry.updated}`));
55
+ console.log(chalk.gray(`Source: ${entry.source}`));
56
+ console.log(chalk.gray('---'));
57
+ console.log(entry.content);
58
+ }
59
+ function handleLearn(options) {
60
+ const { topic, content } = options;
61
+ if (!topic || !content) {
62
+ console.log(chalk.red('Error: --topic and --content are required'));
63
+ return;
64
+ }
65
+ const entry = learnKnowledge(topic, content, 'model-learned');
66
+ console.log(chalk.green(`✓ Knowledge learned: "${topic}"`));
67
+ console.log(chalk.gray(` Path: ${entry.filePath}`));
68
+ }
69
+ function handleSearch(options) {
70
+ const { query } = options;
71
+ if (!query) {
72
+ console.log(chalk.red('Error: search query required'));
73
+ return;
74
+ }
75
+ const results = searchKnowledge(query);
76
+ if (results.length === 0) {
77
+ console.log(chalk.gray(`No results for "${query}"`));
78
+ return;
79
+ }
80
+ console.log(chalk.cyan(`🔍 Search results for "${query}" (${results.length}):\n`));
81
+ for (const entry of results) {
82
+ console.log(chalk.green(`• ${entry.topic}`));
83
+ // Show preview
84
+ const preview = entry.content.slice(0, 100).replace(/\n/g, ' ');
85
+ console.log(chalk.gray(` ${preview}...`));
86
+ }
87
+ // Also output JSON
88
+ console.log(chalk.gray('\n--- JSON ---'));
89
+ console.log(JSON.stringify(results.map(r => ({
90
+ topic: r.topic,
91
+ updated: r.updated,
92
+ source: r.source,
93
+ })), null, 2));
94
+ }
95
+ function handleDelete(options) {
96
+ const { topic } = options;
97
+ if (!topic) {
98
+ console.log(chalk.red('Error: topic required'));
99
+ return;
100
+ }
101
+ const success = deleteKnowledge(topic);
102
+ if (success) {
103
+ console.log(chalk.green(`✓ Knowledge "${topic}" deleted`));
104
+ }
105
+ else {
106
+ console.log(chalk.red(`Error: Knowledge "${topic}" not found`));
107
+ }
108
+ }
109
+ //# sourceMappingURL=kb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kb.js","sourceRoot":"","sources":["../../src/commands/kb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function linkCommand(): Promise<void>;
2
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyEjD"}
@@ -0,0 +1,74 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync, symlinkSync, lstatSync } from 'fs';
2
+ import { join, basename } from 'path';
3
+ import { homedir } from 'os';
4
+ import chalk from 'chalk';
5
+ import { generateClaudeMD, generateProjectContext } from '../lib/templates.js';
6
+ export async function linkCommand() {
7
+ const cwd = process.cwd();
8
+ const projectName = basename(cwd);
9
+ console.log(chalk.cyan(`🔗 Linking project: ${projectName}\n`));
10
+ // 1. Scan specs/*.md
11
+ const specsDir = join(cwd, 'specs');
12
+ if (!existsSync(specsDir)) {
13
+ console.log(chalk.red('✗ No specs/ directory found. Run `asyncwf init` first.'));
14
+ return;
15
+ }
16
+ const specFiles = readdirSync(specsDir).filter(f => f.endsWith('.md'));
17
+ if (specFiles.length === 0) {
18
+ console.log(chalk.yellow('⚠ No .md files found in specs/'));
19
+ }
20
+ else {
21
+ console.log(chalk.green(`✓ Found ${specFiles.length} spec files:`));
22
+ specFiles.forEach(f => console.log(chalk.gray(` • ${f}`)));
23
+ }
24
+ // 2. Create symlink to ~/.ckb/projects/<project>
25
+ const ckbProjectsDir = join(homedir(), '.ckb', 'projects');
26
+ const linkPath = join(ckbProjectsDir, projectName);
27
+ try {
28
+ if (existsSync(linkPath)) {
29
+ const stat = lstatSync(linkPath);
30
+ if (stat.isSymbolicLink()) {
31
+ console.log(chalk.gray(`• Symlink already exists: ${linkPath}`));
32
+ }
33
+ else {
34
+ console.log(chalk.yellow(`⚠ ${linkPath} exists but is not a symlink`));
35
+ }
36
+ }
37
+ else {
38
+ symlinkSync(cwd, linkPath, 'junction'); // 'junction' for Windows compatibility
39
+ console.log(chalk.green(`✓ Created symlink: ~/.ckb/projects/${projectName}`));
40
+ }
41
+ }
42
+ catch (error) {
43
+ console.log(chalk.red(`✗ Failed to create symlink: ${error}`));
44
+ }
45
+ // 3. Generate project context from specs
46
+ const specs = [];
47
+ for (const file of specFiles) {
48
+ const content = readFileSync(join(specsDir, file), 'utf-8');
49
+ // Extract first heading or first line as summary
50
+ const lines = content.split('\n').filter(l => l.trim());
51
+ let summary = 'No description';
52
+ // Find first heading
53
+ const headingMatch = content.match(/^#\s+(.+)$/m);
54
+ if (headingMatch) {
55
+ summary = headingMatch[1];
56
+ }
57
+ else if (lines.length > 0) {
58
+ summary = lines[0].slice(0, 100);
59
+ }
60
+ specs.push({
61
+ name: file.replace('.md', ''),
62
+ summary,
63
+ });
64
+ }
65
+ // 4. Update claude.md with project context
66
+ const claudeMdPath = join(cwd, 'claude.md');
67
+ const projectContext = generateProjectContext(specs);
68
+ const newContent = generateClaudeMD(projectContext);
69
+ writeFileSync(claudeMdPath, newContent);
70
+ console.log(chalk.green('✓ Updated claude.md with project context'));
71
+ console.log(chalk.cyan('\n✨ Project linked successfully!'));
72
+ console.log(chalk.gray(`\nAvailable specs in context: ${specs.length}`));
73
+ }
74
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface SkillOptions {
2
+ name?: string;
3
+ content?: string;
4
+ description?: string;
5
+ tags?: string;
6
+ }
7
+ export declare function skillCommand(action: string, options: SkillOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACtB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,103 @@
1
+ import chalk from 'chalk';
2
+ import { listSkills, getSkill, addSkill, deleteSkill, formatSkillForPrompt } from '../lib/skills.js';
3
+ export async function skillCommand(action, options) {
4
+ switch (action) {
5
+ case 'list':
6
+ handleList();
7
+ break;
8
+ case 'show':
9
+ handleShow(options);
10
+ break;
11
+ case 'add':
12
+ handleAdd(options);
13
+ break;
14
+ case 'delete':
15
+ handleDelete(options);
16
+ break;
17
+ case 'use':
18
+ handleUse(options);
19
+ break;
20
+ default:
21
+ console.log(chalk.red(`Unknown action: ${action}`));
22
+ }
23
+ }
24
+ function handleList() {
25
+ const skills = listSkills();
26
+ if (skills.length === 0) {
27
+ console.log(chalk.gray('No skills available'));
28
+ console.log(chalk.gray('\nAdd a skill with:'));
29
+ console.log(chalk.gray(' asyncwf skill add <name> --content "..."'));
30
+ return;
31
+ }
32
+ console.log(chalk.cyan(`📚 Available Skills (${skills.length}):\n`));
33
+ for (const skill of skills) {
34
+ console.log(chalk.green(`• ${skill.name}`));
35
+ if (skill.description) {
36
+ console.log(chalk.gray(` ${skill.description}`));
37
+ }
38
+ if (skill.tags.length > 0) {
39
+ console.log(chalk.gray(` Tags: ${skill.tags.join(', ')}`));
40
+ }
41
+ }
42
+ // Also output JSON for programmatic use
43
+ console.log(chalk.gray('\n--- JSON ---'));
44
+ console.log(JSON.stringify(skills, null, 2));
45
+ }
46
+ function handleShow(options) {
47
+ const { name } = options;
48
+ if (!name) {
49
+ console.log(chalk.red('Error: skill name required'));
50
+ return;
51
+ }
52
+ const skill = getSkill(name);
53
+ if (!skill) {
54
+ console.log(chalk.red(`Error: Skill "${name}" not found`));
55
+ return;
56
+ }
57
+ console.log(chalk.cyan(`📖 Skill: ${skill.name}\n`));
58
+ console.log(chalk.gray(`Description: ${skill.description || 'N/A'}`));
59
+ console.log(chalk.gray(`Tags: ${skill.tags.join(', ') || 'N/A'}`));
60
+ console.log(chalk.gray(`Version: ${skill.version}`));
61
+ console.log(chalk.gray('---'));
62
+ console.log(skill.content);
63
+ }
64
+ function handleAdd(options) {
65
+ const { name, content, description, tags } = options;
66
+ if (!name || !content) {
67
+ console.log(chalk.red('Error: --name and --content are required'));
68
+ return;
69
+ }
70
+ const tagList = tags ? tags.split(',').map(t => t.trim()) : [];
71
+ const skill = addSkill(name, content, description || '', tagList);
72
+ console.log(chalk.green(`✓ Skill "${name}" added`));
73
+ console.log(chalk.gray(` Path: ${skill.filePath}`));
74
+ }
75
+ function handleDelete(options) {
76
+ const { name } = options;
77
+ if (!name) {
78
+ console.log(chalk.red('Error: skill name required'));
79
+ return;
80
+ }
81
+ const success = deleteSkill(name);
82
+ if (success) {
83
+ console.log(chalk.green(`✓ Skill "${name}" deleted`));
84
+ }
85
+ else {
86
+ console.log(chalk.red(`Error: Skill "${name}" not found`));
87
+ }
88
+ }
89
+ function handleUse(options) {
90
+ const { name } = options;
91
+ if (!name) {
92
+ console.log(chalk.red('Error: skill name required'));
93
+ return;
94
+ }
95
+ const skill = getSkill(name);
96
+ if (!skill) {
97
+ console.log(chalk.red(`Error: Skill "${name}" not found`));
98
+ return;
99
+ }
100
+ // Output formatted skill for prompt injection
101
+ console.log(formatSkillForPrompt(skill));
102
+ }
103
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACH,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,oBAAoB,EACvB,MAAM,kBAAkB,CAAC;AAS1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,MAAc,EACd,OAAqB;IAErB,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,MAAM;YACP,UAAU,EAAE,CAAC;YACb,MAAM;QACV,KAAK,MAAM;YACP,UAAU,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM;QACV,KAAK,KAAK;YACN,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM;QACV,KAAK,QAAQ;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM;QACV,KAAK,KAAK;YACN,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM;QACV;YACI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC;AAED,SAAS,UAAU;IACf,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACtE,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,OAAqB;IACrC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACrD,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC,CAAC,CAAC;QAC3D,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,OAAqB;IACpC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAErD,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACnE,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IAElE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,OAAqB;IACvC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACrD,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAqB;IACpC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACrD,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,aAAa,CAAC,CAAC,CAAC;QAC3D,OAAO;IACX,CAAC;IAED,8CAA8C;IAC9C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface TaskmgrOptions {
2
+ job?: string;
3
+ prompt?: string;
4
+ skill?: string;
5
+ status?: string;
6
+ jobs?: string;
7
+ timeout?: string;
8
+ }
9
+ export declare function taskmgrCommand(action: string, options: TaskmgrOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=taskmgr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskmgr.d.ts","sourceRoot":"","sources":["../../src/commands/taskmgr.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}