@looplia/looplia-cli 0.6.6
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/dist/index.d.ts +2 -0
- package/dist/index.js +33216 -0
- package/package.json +55 -0
- package/plugins/looplia-core/.claude-plugin/plugin.json +10 -0
- package/plugins/looplia-core/commands/build-workflow.md +92 -0
- package/plugins/looplia-core/commands/build.md +71 -0
- package/plugins/looplia-core/commands/list-workflows.md +55 -0
- package/plugins/looplia-core/commands/run.md +50 -0
- package/plugins/looplia-core/hooks/hooks.json +27 -0
- package/plugins/looplia-core/scripts/hooks/compact-inject-state.sh +36 -0
- package/plugins/looplia-core/scripts/hooks/post-write-validate.sh +81 -0
- package/plugins/looplia-core/scripts/hooks/stop-guard.sh +56 -0
- package/plugins/looplia-core/skills/plugin-registry-scanner/SKILL.md +108 -0
- package/plugins/looplia-core/skills/plugin-registry-scanner/scripts/scan-plugins.ts +221 -0
- package/plugins/looplia-core/skills/plugin-registry-scanner/test/scan-plugins.test.ts +256 -0
- package/plugins/looplia-core/skills/search/SKILL.md +174 -0
- package/plugins/looplia-core/skills/skill-capability-matcher/SKILL.md +378 -0
- package/plugins/looplia-core/skills/workflow-executor/SKILL.md +469 -0
- package/plugins/looplia-core/skills/workflow-executor-inline/SKILL.md +217 -0
- package/plugins/looplia-core/skills/workflow-schema-composer/SCHEMA.md +214 -0
- package/plugins/looplia-core/skills/workflow-schema-composer/SKILL.md +373 -0
- package/plugins/looplia-core/skills/workflow-schema-composer/templates/workflow.md.template +44 -0
- package/plugins/looplia-core/skills/workflow-validator/SKILL.md +171 -0
- package/plugins/looplia-core/skills/workflow-validator/scripts/validate.ts +244 -0
- package/plugins/looplia-writer/.claude-plugin/plugin.json +10 -0
- package/plugins/looplia-writer/README.md +107 -0
- package/plugins/looplia-writer/skills/content-documenter/SKILL.md +189 -0
- package/plugins/looplia-writer/skills/id-generator/SKILL.md +120 -0
- package/plugins/looplia-writer/skills/idea-synthesis/SKILL.md +162 -0
- package/plugins/looplia-writer/skills/media-reviewer/SKILL.md +105 -0
- package/plugins/looplia-writer/skills/user-profile-reader/SKILL.md +94 -0
- package/plugins/looplia-writer/skills/writing-enhancer/SKILL.md +34 -0
- package/plugins/looplia-writer/skills/writing-kit-assembler/SKILL.md +206 -0
- package/plugins/looplia-writer/workflows/writing-kit.md +134 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Workflow Schema v0.6.1
|
|
2
|
+
|
|
3
|
+
Complete reference for the looplia workflow-as-markdown schema.
|
|
4
|
+
|
|
5
|
+
## Frontmatter Structure
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
---
|
|
9
|
+
name: workflow-name
|
|
10
|
+
version: 1.0.0
|
|
11
|
+
description: What this workflow does
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- id: step-id
|
|
15
|
+
skill: skill-name
|
|
16
|
+
mission: |
|
|
17
|
+
Natural language task description
|
|
18
|
+
input: ${{ sandbox }}/inputs/content.md
|
|
19
|
+
output: ${{ sandbox }}/outputs/result.json
|
|
20
|
+
needs: [dependency-step-id]
|
|
21
|
+
model: haiku
|
|
22
|
+
validate:
|
|
23
|
+
required_fields: [field1, field2]
|
|
24
|
+
final: true
|
|
25
|
+
---
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Root Fields
|
|
29
|
+
|
|
30
|
+
| Field | Type | Required | Description |
|
|
31
|
+
|-------|------|----------|-------------|
|
|
32
|
+
| `name` | string | **Yes** | Workflow identifier (kebab-case) |
|
|
33
|
+
| `version` | string | **Yes** | Semantic version (e.g., "1.0.0") |
|
|
34
|
+
| `description` | string | **Yes** | What the workflow does |
|
|
35
|
+
| `steps` | array | **Yes** | Ordered list of workflow steps |
|
|
36
|
+
|
|
37
|
+
## Step Fields
|
|
38
|
+
|
|
39
|
+
| Field | Type | Required | Description |
|
|
40
|
+
|-------|------|----------|-------------|
|
|
41
|
+
| `id` | string | **Yes** | Unique step identifier (kebab-case) |
|
|
42
|
+
| `skill` | string | **Yes** | Skill to execute |
|
|
43
|
+
| `mission` | string | **Yes** | Natural language task description |
|
|
44
|
+
| `input` | string/array | **Yes** | Input file path(s) |
|
|
45
|
+
| `output` | string | **Yes** | Output file path |
|
|
46
|
+
| `needs` | string[] | No | Step IDs this step depends on |
|
|
47
|
+
| `model` | string | No | Model override (haiku/sonnet/opus) |
|
|
48
|
+
| `validate` | object | No | Validation criteria |
|
|
49
|
+
| `final` | boolean | No | Mark as final workflow output |
|
|
50
|
+
|
|
51
|
+
## Variable Substitution
|
|
52
|
+
|
|
53
|
+
| Variable | Description | Example |
|
|
54
|
+
|----------|-------------|---------|
|
|
55
|
+
| `${{ sandbox }}` | Current sandbox directory | `sandbox/video-2025-01-15-abc123` |
|
|
56
|
+
| `${{ steps.{id}.output }}` | Output path of step `{id}` | `sandbox/.../outputs/analysis.json` |
|
|
57
|
+
|
|
58
|
+
## Validation Criteria
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
validate:
|
|
62
|
+
required_fields: [contentId, headline]
|
|
63
|
+
min_quotes: 3
|
|
64
|
+
min_key_points: 5
|
|
65
|
+
has_hooks: true
|
|
66
|
+
min_outline_sections: 4
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| Criterion | Type | Description |
|
|
70
|
+
|-----------|------|-------------|
|
|
71
|
+
| `required_fields` | string[] | JSON fields that must exist |
|
|
72
|
+
| `min_quotes` | number | Minimum quotes in importantQuotes |
|
|
73
|
+
| `min_key_points` | number | Minimum items in keyThemes |
|
|
74
|
+
| `has_hooks` | boolean | hooks array must not be empty |
|
|
75
|
+
| `min_outline_sections` | number | Minimum sections in outline |
|
|
76
|
+
|
|
77
|
+
## Model Options
|
|
78
|
+
|
|
79
|
+
| Model | Use Case |
|
|
80
|
+
|-------|----------|
|
|
81
|
+
| `haiku` | Fast, simple tasks (analysis, extraction) |
|
|
82
|
+
| `sonnet` | Balanced (default, most workflows) |
|
|
83
|
+
| `opus` | Complex reasoning (rarely needed) |
|
|
84
|
+
|
|
85
|
+
## Naming Conventions
|
|
86
|
+
|
|
87
|
+
### Workflow Names
|
|
88
|
+
- Use kebab-case: `video-to-blog`, `content-analyzer`
|
|
89
|
+
- Be descriptive but concise
|
|
90
|
+
- Avoid generic names like `workflow-1`
|
|
91
|
+
|
|
92
|
+
### Step IDs
|
|
93
|
+
- Use kebab-case: `analyze-content`, `generate-ideas`
|
|
94
|
+
- Start with action verb when possible
|
|
95
|
+
- Keep under 25 characters
|
|
96
|
+
|
|
97
|
+
### Skills
|
|
98
|
+
- Match exact skill name from plugin
|
|
99
|
+
- Case-sensitive: `media-reviewer`, not `Media-Reviewer`
|
|
100
|
+
|
|
101
|
+
## Dependency Rules
|
|
102
|
+
|
|
103
|
+
1. **No forward references** - A step can only depend on steps defined before it
|
|
104
|
+
2. **No circular dependencies** - A → B → A is invalid
|
|
105
|
+
3. **No self-references** - A step cannot depend on itself
|
|
106
|
+
4. **All references valid** - Every ID in `needs:` must exist
|
|
107
|
+
|
|
108
|
+
## Example: Complete Workflow
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
---
|
|
112
|
+
name: writing-kit
|
|
113
|
+
version: 2.0.0
|
|
114
|
+
description: Transform content into structured writing kit
|
|
115
|
+
|
|
116
|
+
steps:
|
|
117
|
+
- id: analyze-content
|
|
118
|
+
skill: media-reviewer
|
|
119
|
+
mission: |
|
|
120
|
+
Analyze content deeply. Detect source type (video/audio/text).
|
|
121
|
+
Extract key themes, important quotes, narrative structure.
|
|
122
|
+
Output comprehensive analysis as structured JSON.
|
|
123
|
+
input: ${{ sandbox }}/inputs/content.md
|
|
124
|
+
output: ${{ sandbox }}/outputs/analysis.json
|
|
125
|
+
model: haiku
|
|
126
|
+
validate:
|
|
127
|
+
required_fields: [contentId, headline, keyThemes, importantQuotes]
|
|
128
|
+
|
|
129
|
+
- id: generate-ideas
|
|
130
|
+
skill: idea-synthesis
|
|
131
|
+
mission: |
|
|
132
|
+
Read user profile for personalization context.
|
|
133
|
+
Generate hooks, angles, and questions based on content analysis.
|
|
134
|
+
Focus on user's interests and writing style preferences.
|
|
135
|
+
needs: [analyze-content]
|
|
136
|
+
input: ${{ steps.analyze-content.output }}
|
|
137
|
+
output: ${{ sandbox }}/outputs/ideas.json
|
|
138
|
+
validate:
|
|
139
|
+
required_fields: [contentId, hooks, angles, questions]
|
|
140
|
+
|
|
141
|
+
- id: build-writing-kit
|
|
142
|
+
skill: writing-kit-assembler
|
|
143
|
+
mission: |
|
|
144
|
+
Combine analysis and ideas into comprehensive writing kit.
|
|
145
|
+
Create structured outline with introduction, body sections, conclusion.
|
|
146
|
+
Include all metadata and source references.
|
|
147
|
+
needs: [analyze-content, generate-ideas]
|
|
148
|
+
input:
|
|
149
|
+
- ${{ steps.analyze-content.output }}
|
|
150
|
+
- ${{ steps.generate-ideas.output }}
|
|
151
|
+
output: ${{ sandbox }}/outputs/writing-kit.json
|
|
152
|
+
final: true
|
|
153
|
+
validate:
|
|
154
|
+
required_fields: [contentId, summary, ideas, suggestedOutline]
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
# Writing Kit Workflow
|
|
158
|
+
|
|
159
|
+
Transform raw content into a comprehensive writing kit.
|
|
160
|
+
|
|
161
|
+
## Usage
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
looplia run writing-kit --file <content.md>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Steps
|
|
168
|
+
|
|
169
|
+
1. **analyze-content**: Deep analysis using media-reviewer skill
|
|
170
|
+
2. **generate-ideas**: Idea synthesis with user personalization
|
|
171
|
+
3. **build-writing-kit**: Assemble final writing kit
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Anti-Patterns (v0.6.1)
|
|
175
|
+
|
|
176
|
+
### FORBIDDEN: run: syntax
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
# WRONG - Do not use
|
|
180
|
+
- id: summary
|
|
181
|
+
run: agents/content-analyzer
|
|
182
|
+
|
|
183
|
+
# CORRECT - Use skill: syntax
|
|
184
|
+
- id: summary
|
|
185
|
+
skill: media-reviewer
|
|
186
|
+
mission: |
|
|
187
|
+
Analyze and summarize the content...
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### FORBIDDEN: Missing mission
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
# WRONG - Missing mission
|
|
194
|
+
- id: analyze
|
|
195
|
+
skill: media-reviewer
|
|
196
|
+
input: ${{ sandbox }}/inputs/content.md
|
|
197
|
+
output: ${{ sandbox }}/outputs/analysis.json
|
|
198
|
+
|
|
199
|
+
# CORRECT - Include mission
|
|
200
|
+
- id: analyze
|
|
201
|
+
skill: media-reviewer
|
|
202
|
+
mission: |
|
|
203
|
+
Deep analysis of the content. Extract themes and quotes.
|
|
204
|
+
input: ${{ sandbox }}/inputs/content.md
|
|
205
|
+
output: ${{ sandbox }}/outputs/analysis.json
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Migration from v0.6.0
|
|
209
|
+
|
|
210
|
+
| v0.6.0 | v0.6.1 |
|
|
211
|
+
|--------|--------|
|
|
212
|
+
| `run: agents/content-analyzer` | `skill: media-reviewer` + `mission:` |
|
|
213
|
+
| `run: agents/idea-generator` | `skill: idea-synthesis` + `mission:` |
|
|
214
|
+
| `run: agents/writing-kit-builder` | `skill: writing-kit-assembler` + `mission:` |
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-schema-composer
|
|
3
|
+
description: |
|
|
4
|
+
This skill should be used when the user wants to create a new looplia workflow, generate
|
|
5
|
+
a workflow definition file, or compose workflow steps from skill recommendations. Use when
|
|
6
|
+
someone says "create a looplia workflow", "generate workflow.md", "compose workflow steps",
|
|
7
|
+
"build me an automation pipeline", or "/build" (final step).
|
|
8
|
+
|
|
9
|
+
Final step in looplia workflow building: transforms skill recommendations into valid v0.6.3
|
|
10
|
+
workflow YAML/Markdown files. Each step uses skill: + mission: syntax, following the one
|
|
11
|
+
workflow step → one skill-executor → multiple skills architecture.
|
|
12
|
+
|
|
13
|
+
v0.6.3: Supports input-less workflows using input-less capable skills (e.g., search).
|
|
14
|
+
model: claude-haiku-4-5-20251001
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Workflow Schema Composer
|
|
18
|
+
|
|
19
|
+
Generate complete, valid workflow definitions from skill recommendations.
|
|
20
|
+
|
|
21
|
+
## Purpose
|
|
22
|
+
|
|
23
|
+
Transform the output from skill-capability-matcher into a ready-to-use looplia workflow markdown file that follows the v0.6.2 schema.
|
|
24
|
+
|
|
25
|
+
## Process
|
|
26
|
+
|
|
27
|
+
### Step 1: Receive Inputs
|
|
28
|
+
|
|
29
|
+
From skill-capability-matcher output:
|
|
30
|
+
- Skill sequence with step IDs
|
|
31
|
+
- Mission descriptions for each step
|
|
32
|
+
- Data flow dependencies
|
|
33
|
+
- Original user requirements
|
|
34
|
+
- **Explicit name (if `--name` flag was provided)** - use this exact name for the workflow
|
|
35
|
+
|
|
36
|
+
### Step 1.5: Parse User Preferences from Enriched Prompt (v0.6.4)
|
|
37
|
+
|
|
38
|
+
**CRITICAL: User preferences from wizard answers MUST be incorporated into step missions.**
|
|
39
|
+
|
|
40
|
+
When the enriched prompt contains "User clarifications: Q: ... A: ..." sections, extract each preference:
|
|
41
|
+
|
|
42
|
+
**Example enriched prompt:**
|
|
43
|
+
```
|
|
44
|
+
/build search hackernews for AI news. User clarifications: Q: Which social media platforms? A: twitter, linkedin. Q: How many articles? A: top5. Q: Focus areas? A: llm, adoption. Q: Output format? A: posts
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Extract as structured preferences:**
|
|
48
|
+
|
|
49
|
+
| Question Pattern | Preference Key | Value | Inject Into |
|
|
50
|
+
|-----------------|----------------|-------|-------------|
|
|
51
|
+
| "platforms" / "social media" | PLATFORMS | twitter, linkedin | Output/social step mission |
|
|
52
|
+
| "how many" / "articles" / "count" | COUNT | 5 | Search/filter step mission |
|
|
53
|
+
| "focus" / "areas" / "topics" | FOCUS | llm, adoption | Search and analysis missions |
|
|
54
|
+
| "format" / "output" / "include" | FORMAT | posts | Final output step mission |
|
|
55
|
+
|
|
56
|
+
**Preference Injection Rules:**
|
|
57
|
+
|
|
58
|
+
1. **COUNT preferences** → Add to search/fetch step: "Find **top 5** articles..."
|
|
59
|
+
2. **FOCUS preferences** → Add to search and analysis: "...focusing on **LLM and adoption** trends"
|
|
60
|
+
3. **PLATFORM preferences** → Add to output step: "...optimized for **twitter and linkedin**"
|
|
61
|
+
4. **FORMAT preferences** → Add to output step: "Create **posts** (not reports)..."
|
|
62
|
+
|
|
63
|
+
### Step 2: Design Steps
|
|
64
|
+
|
|
65
|
+
For each recommended skill:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
- id: {suggestedStepId}
|
|
69
|
+
skill: {skill-name}
|
|
70
|
+
mission: |
|
|
71
|
+
{mission description from matcher}
|
|
72
|
+
needs: [{dependencies}]
|
|
73
|
+
input: {input path(s)}
|
|
74
|
+
output: {output path}
|
|
75
|
+
model: {optional model override}
|
|
76
|
+
validate:
|
|
77
|
+
required_fields: [{fields}]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Step 3: Resolve Dependencies
|
|
81
|
+
|
|
82
|
+
Use `dataFlow` from matcher:
|
|
83
|
+
- Steps with no dependencies: `needs:` is omitted
|
|
84
|
+
- Dependent steps: list all required step IDs in `needs:`
|
|
85
|
+
- Final step: add `final: true`
|
|
86
|
+
|
|
87
|
+
### Step 4: Design Input/Output Paths
|
|
88
|
+
|
|
89
|
+
Use variable substitution:
|
|
90
|
+
- `${{ sandbox }}/inputs/content.md` - Initial input (for workflows requiring input)
|
|
91
|
+
- `${{ sandbox }}/outputs/{step-id}.json` - Step outputs
|
|
92
|
+
- `${{ steps.{id}.output }}` - Reference previous step output
|
|
93
|
+
|
|
94
|
+
#### Input-Less Capable Skills (v0.6.3)
|
|
95
|
+
|
|
96
|
+
These skills can operate WITHOUT an input field - they fetch/generate data autonomously:
|
|
97
|
+
|
|
98
|
+
| Skill | Capability |
|
|
99
|
+
|-------|------------|
|
|
100
|
+
| `search` | Web search, API queries, autonomous data fetching |
|
|
101
|
+
|
|
102
|
+
**When a workflow's first step uses an input-less capable skill:**
|
|
103
|
+
1. **OMIT the `input:` field entirely** from that step
|
|
104
|
+
2. The mission description drives the skill's behavior
|
|
105
|
+
3. Subsequent steps reference the output: `${{ steps.{id}.output }}`
|
|
106
|
+
|
|
107
|
+
**Example input-less first step:**
|
|
108
|
+
```yaml
|
|
109
|
+
- id: fetch-data
|
|
110
|
+
skill: search
|
|
111
|
+
mission: |
|
|
112
|
+
Search the web for recent technology trends.
|
|
113
|
+
Extract titles, URLs, and key details.
|
|
114
|
+
output: ${{ sandbox }}/outputs/data.json
|
|
115
|
+
# NO input field - search operates autonomously
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Step 5: Suggest Validation
|
|
119
|
+
|
|
120
|
+
Based on skill output type:
|
|
121
|
+
- Analysis skills: `required_fields: [contentId, headline, keyThemes]`
|
|
122
|
+
- Idea skills: `required_fields: [contentId, hooks, angles]`
|
|
123
|
+
- Assembly skills: `required_fields: [contentId, suggestedOutline]`
|
|
124
|
+
|
|
125
|
+
### Step 6: Compose Frontmatter
|
|
126
|
+
|
|
127
|
+
**CRITICAL: If `--name` flag was provided, use that exact name. Do not derive or modify it.**
|
|
128
|
+
|
|
129
|
+
```yaml
|
|
130
|
+
---
|
|
131
|
+
name: {explicit-name OR derived-from-description}
|
|
132
|
+
version: 1.0.0
|
|
133
|
+
description: {user's original description, cleaned up}
|
|
134
|
+
|
|
135
|
+
steps:
|
|
136
|
+
- id: ...
|
|
137
|
+
---
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Naming rules:
|
|
141
|
+
1. If `--name article-summary` was provided → use `article-summary` exactly
|
|
142
|
+
2. If no `--name` → derive from description (e.g., "analyze videos" → "video-analyzer")
|
|
143
|
+
3. Always use kebab-case for names
|
|
144
|
+
|
|
145
|
+
### Step 7: Generate Markdown Body
|
|
146
|
+
|
|
147
|
+
Add usage documentation:
|
|
148
|
+
|
|
149
|
+
**For workflows requiring input:**
|
|
150
|
+
```markdown
|
|
151
|
+
# {Workflow Name}
|
|
152
|
+
|
|
153
|
+
{Brief description}
|
|
154
|
+
|
|
155
|
+
## Usage
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
looplia run {workflow-name} --file <content.md>
|
|
159
|
+
```
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**For input-less workflows (v0.6.3):**
|
|
163
|
+
```markdown
|
|
164
|
+
# {Workflow Name}
|
|
165
|
+
|
|
166
|
+
{Brief description}
|
|
167
|
+
|
|
168
|
+
## Usage
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
looplia run {workflow-name}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
No input required - this workflow uses autonomous skills to fetch data.
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Steps section:**
|
|
178
|
+
```markdown
|
|
179
|
+
## Steps
|
|
180
|
+
|
|
181
|
+
1. **{step-id}**: {brief description}
|
|
182
|
+
2. ...
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Output Format
|
|
186
|
+
|
|
187
|
+
Return a JSON object:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"filename": "video-to-blog.md",
|
|
192
|
+
"content": "---\nname: video-to-blog\n..."
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Schema Reference
|
|
197
|
+
|
|
198
|
+
See SCHEMA.md in this skill directory for the complete v0.6.2 workflow schema.
|
|
199
|
+
|
|
200
|
+
## Validation Rules (v0.6.3)
|
|
201
|
+
|
|
202
|
+
1. **`skill:` is REQUIRED** - Every step must have a skill
|
|
203
|
+
2. **`mission:` is REQUIRED** - Every step must have a mission
|
|
204
|
+
3. **`run:` is FORBIDDEN** - Never use the old agent syntax
|
|
205
|
+
4. **Step IDs must be unique** - No duplicates
|
|
206
|
+
5. **Dependencies must exist** - All `needs:` references must be valid
|
|
207
|
+
6. **No circular dependencies** - Validate topological ordering
|
|
208
|
+
7. **Respect explicit `--name`** - If provided, use that exact name for filename and `name:` field
|
|
209
|
+
8. **Input-less steps (v0.6.3)** - Steps using `search` skill may OMIT `input:` field entirely
|
|
210
|
+
|
|
211
|
+
## Example Output
|
|
212
|
+
|
|
213
|
+
```yaml
|
|
214
|
+
---
|
|
215
|
+
name: video-to-blog
|
|
216
|
+
version: 1.0.0
|
|
217
|
+
description: Analyze YouTube videos and create blog outlines
|
|
218
|
+
|
|
219
|
+
steps:
|
|
220
|
+
- id: analyze-content
|
|
221
|
+
skill: media-reviewer
|
|
222
|
+
mission: |
|
|
223
|
+
Deep analysis of video transcript. Extract key themes,
|
|
224
|
+
important quotes with timestamps, and narrative structure.
|
|
225
|
+
input: ${{ sandbox }}/inputs/content.md
|
|
226
|
+
output: ${{ sandbox }}/outputs/analysis.json
|
|
227
|
+
model: haiku
|
|
228
|
+
validate:
|
|
229
|
+
required_fields: [contentId, headline, keyThemes, importantQuotes]
|
|
230
|
+
|
|
231
|
+
- id: generate-ideas
|
|
232
|
+
skill: idea-synthesis
|
|
233
|
+
mission: |
|
|
234
|
+
Generate hooks, angles, and questions from the analysis.
|
|
235
|
+
Read user profile for personalization context.
|
|
236
|
+
needs: [analyze-content]
|
|
237
|
+
input: ${{ steps.analyze-content.output }}
|
|
238
|
+
output: ${{ sandbox }}/outputs/ideas.json
|
|
239
|
+
validate:
|
|
240
|
+
required_fields: [contentId, hooks, angles, questions]
|
|
241
|
+
|
|
242
|
+
- id: build-outline
|
|
243
|
+
skill: writing-kit-assembler
|
|
244
|
+
mission: |
|
|
245
|
+
Create structured blog outline with sections, key points,
|
|
246
|
+
and supporting quotes from analysis and ideas.
|
|
247
|
+
needs: [analyze-content, generate-ideas]
|
|
248
|
+
input:
|
|
249
|
+
- ${{ steps.analyze-content.output }}
|
|
250
|
+
- ${{ steps.generate-ideas.output }}
|
|
251
|
+
output: ${{ sandbox }}/outputs/outline.json
|
|
252
|
+
final: true
|
|
253
|
+
validate:
|
|
254
|
+
required_fields: [contentId, suggestedOutline]
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
# Video to Blog Workflow
|
|
258
|
+
|
|
259
|
+
Transform video content into structured blog outlines.
|
|
260
|
+
|
|
261
|
+
## Usage
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
looplia run video-to-blog --file <transcript.md>
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Steps
|
|
268
|
+
|
|
269
|
+
1. **analyze-content**: Deep analysis using media-reviewer skill
|
|
270
|
+
2. **generate-ideas**: Idea synthesis with user personalization
|
|
271
|
+
3. **build-outline**: Assemble outline using writing-kit-assembler skill
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Important Rules
|
|
275
|
+
|
|
276
|
+
1. **Always use skill: syntax** - Never use `run: agents/X`
|
|
277
|
+
2. **Always include mission** - Detailed task description
|
|
278
|
+
3. **Use valid YAML** - Proper indentation and quoting
|
|
279
|
+
4. **Include validation** - Add `validate:` with appropriate fields
|
|
280
|
+
5. **Mark final step** - Last step gets `final: true`
|
|
281
|
+
6. **Respect --name flag** - If `--name X` is provided, the workflow MUST be named `X` and saved as `X.md`
|
|
282
|
+
7. **Detect input-less workflows** - If first step uses `search` skill, OMIT input field
|
|
283
|
+
8. **Incorporate user preferences (v0.6.4)** - Extract preferences from "User clarifications" and inject into step missions. Each preference MUST appear in at least one mission.
|
|
284
|
+
|
|
285
|
+
## Example: Input-Less Workflow (v0.6.3)
|
|
286
|
+
|
|
287
|
+
When the workflow fetches data autonomously (no user input needed):
|
|
288
|
+
|
|
289
|
+
```yaml
|
|
290
|
+
---
|
|
291
|
+
name: daily-news-digest
|
|
292
|
+
version: 1.0.0
|
|
293
|
+
description: Fetch trending news and compile a digest report
|
|
294
|
+
|
|
295
|
+
steps:
|
|
296
|
+
- id: fetch-news
|
|
297
|
+
skill: search
|
|
298
|
+
mission: |
|
|
299
|
+
Search the web for today's trending technology news.
|
|
300
|
+
Extract title, URL, source, and brief summary for each story.
|
|
301
|
+
output: ${{ sandbox }}/outputs/news.json
|
|
302
|
+
# NO input field - search operates autonomously
|
|
303
|
+
validate:
|
|
304
|
+
required_fields: [query, mode, results]
|
|
305
|
+
|
|
306
|
+
- id: compile-digest
|
|
307
|
+
skill: content-documenter
|
|
308
|
+
mission: |
|
|
309
|
+
Compile the news into a formatted digest with categories and insights.
|
|
310
|
+
needs: [fetch-news]
|
|
311
|
+
input: ${{ steps.fetch-news.output }}
|
|
312
|
+
output: ${{ sandbox }}/outputs/digest.json
|
|
313
|
+
final: true
|
|
314
|
+
validate:
|
|
315
|
+
required_fields: [reportTitle, sections, summary]
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
# Daily News Digest
|
|
319
|
+
|
|
320
|
+
Fetches and compiles trending news into a digest.
|
|
321
|
+
|
|
322
|
+
## Usage
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
looplia run daily-news-digest
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
No input required - this workflow fetches data autonomously.
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## Example: User Preference Injection (v0.6.4)
|
|
332
|
+
|
|
333
|
+
Given enriched prompt:
|
|
334
|
+
```
|
|
335
|
+
/build search hackernews for AI news. User clarifications: Q: Which platforms? A: twitter, linkedin. Q: How many? A: top5. Q: Focus areas? A: llm, adoption. Q: Output format? A: posts
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Extracted preferences:**
|
|
339
|
+
- PLATFORMS: twitter, linkedin
|
|
340
|
+
- COUNT: 5
|
|
341
|
+
- FOCUS: llm, adoption
|
|
342
|
+
- FORMAT: posts
|
|
343
|
+
|
|
344
|
+
**BAD workflow (ignores preferences):**
|
|
345
|
+
```yaml
|
|
346
|
+
- id: fetch-news
|
|
347
|
+
skill: search
|
|
348
|
+
mission: |
|
|
349
|
+
Search HackerNews for AI news articles.
|
|
350
|
+
Extract titles and summaries.
|
|
351
|
+
|
|
352
|
+
- id: compile-output
|
|
353
|
+
skill: content-documenter
|
|
354
|
+
mission: |
|
|
355
|
+
Compile the news into a report.
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
**GOOD workflow (incorporates preferences):**
|
|
359
|
+
```yaml
|
|
360
|
+
- id: fetch-news
|
|
361
|
+
skill: search
|
|
362
|
+
mission: |
|
|
363
|
+
Search HackerNews for the top 5 AI news articles
|
|
364
|
+
focusing on LLM developments and adoption trends.
|
|
365
|
+
Extract titles, URLs, and key summaries.
|
|
366
|
+
|
|
367
|
+
- id: compile-output
|
|
368
|
+
skill: content-documenter
|
|
369
|
+
mission: |
|
|
370
|
+
Create engaging social media posts optimized for
|
|
371
|
+
twitter and linkedin. Focus on LLM and adoption angles.
|
|
372
|
+
Output as posts, not a formal report.
|
|
373
|
+
```
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: {{name}}
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: {{description}}
|
|
5
|
+
|
|
6
|
+
steps:
|
|
7
|
+
{{#each steps}}
|
|
8
|
+
- id: {{id}}
|
|
9
|
+
skill: {{skill}}
|
|
10
|
+
mission: |
|
|
11
|
+
{{mission}}
|
|
12
|
+
{{#if needs}}
|
|
13
|
+
needs: [{{needs}}]
|
|
14
|
+
{{/if}}
|
|
15
|
+
input: {{input}}
|
|
16
|
+
output: {{output}}
|
|
17
|
+
{{#if model}}
|
|
18
|
+
model: {{model}}
|
|
19
|
+
{{/if}}
|
|
20
|
+
{{#if final}}
|
|
21
|
+
final: true
|
|
22
|
+
{{/if}}
|
|
23
|
+
{{#if validate}}
|
|
24
|
+
validate:
|
|
25
|
+
required_fields: [{{validate.required_fields}}]
|
|
26
|
+
{{/if}}
|
|
27
|
+
{{/each}}
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# {{title}}
|
|
31
|
+
|
|
32
|
+
{{description}}
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
looplia run {{name}} --file <content.md>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Steps
|
|
41
|
+
|
|
42
|
+
{{#each steps}}
|
|
43
|
+
{{@index}}. **{{id}}**: {{brief}}
|
|
44
|
+
{{/each}}
|