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.
- package/README.md +112 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +83 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kb.d.ts +8 -0
- package/dist/commands/kb.d.ts.map +1 -0
- package/dist/commands/kb.js +109 -0
- package/dist/commands/kb.js.map +1 -0
- package/dist/commands/link.d.ts +2 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +74 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/skill.d.ts +9 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +103 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/taskmgr.d.ts +11 -0
- package/dist/commands/taskmgr.d.ts.map +1 -0
- package/dist/commands/taskmgr.js +129 -0
- package/dist/commands/taskmgr.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent.d.ts +5 -0
- package/dist/lib/agent.d.ts.map +1 -0
- package/dist/lib/agent.js +124 -0
- package/dist/lib/agent.js.map +1 -0
- package/dist/lib/knowledge.d.ts +8 -0
- package/dist/lib/knowledge.d.ts.map +1 -0
- package/dist/lib/knowledge.js +149 -0
- package/dist/lib/knowledge.js.map +1 -0
- package/dist/lib/skills.d.ts +8 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +129 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/state.d.ts +13 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +87 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/templates.d.ts +9 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +79 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAClG,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,WAAW;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAElC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,WAAW,IAAI,CAAC,CAAC,CAAC;IAEhE,qBAAqB;IACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACjF,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC;QACpE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAEnD,IAAI,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,8BAA8B,CAAC,CAAC,CAAC;YAC3E,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,uCAAuC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,yCAAyC;IACzC,MAAM,KAAK,GAA6C,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,iDAAiD;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,gBAAgB,CAAC;QAE/B,qBAAqB;QACrB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,YAAY,EAAE,CAAC;YACf,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO;SACV,CAAC,CAAC;IACP,CAAC;IAED,2CAA2C;IAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAEpD,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|