owflow 0.1.5 → 0.1.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/README.md +34 -21
- package/dist/__tests__/verify_template.test.js +102 -0
- package/dist/agents/task-classifier.md +7 -19
- package/dist/commands/quick-dev.md +48 -6
- package/dist/commands/quick-plan.md +39 -4
- package/dist/commands/work.md +13 -17
- package/dist/index.js +4 -0
- package/dist/skills/development/SKILL.md +83 -115
- package/dist/skills/migration/SKILL.md +2 -33
- package/dist/skills/orchestrator-framework/references/orchestrator-creation-checklist.md +1 -0
- package/dist/skills/orchestrator-framework/references/orchestrator-patterns.md +4 -59
- package/dist/skills/performance/SKILL.md +2 -30
- package/dist/skills/quick-bugfix/SKILL.md +96 -26
- package/dist/skills/research/SKILL.md +3 -42
- package/dist/templates/orchestrator-state-base.yml +17 -0
- package/dist/templates/orchestrator-state-development.yml +94 -0
- package/dist/templates/orchestrator-state-migration.yml +55 -0
- package/dist/templates/orchestrator-state-performance.yml +53 -0
- package/dist/templates/orchestrator-state-research.yml +61 -0
- package/dist/templates/quick-bugfix-task.yml +10 -0
- package/dist/templates/quick-dev-task.yml +10 -0
- package/dist/templates/quick-plan-task.yml +11 -0
- package/dist/tools/verify_template.js +61 -0
- package/package.json +4 -3
- package/dist/agents/ui-mockup-generator.md +0 -369
- package/dist/commands/product-design.md +0 -37
- package/dist/skills/product-design/SKILL.md +0 -843
- package/dist/skills/product-design/references/characteristic-detection.md +0 -92
- package/dist/skills/product-design/references/interaction-patterns.md +0 -206
- package/dist/skills/product-design/references/visual-companion.md +0 -190
- package/dist/skills/product-design/server/index.js +0 -302
- package/dist/skills/product-design/server/index.ts +0 -359
- package/dist/skills/product-design/server/template.html +0 -256
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Started as a simple OpenCode fork of [Maister Claude Code plugin](https://github
|
|
|
10
10
|
|
|
11
11
|
## What You Get
|
|
12
12
|
|
|
13
|
-
- **Guided workflows** for features, bug fixes, enhancements, performance, migrations
|
|
13
|
+
- **Guided workflows** for features, bug fixes, enhancements, performance, migrations and research
|
|
14
14
|
- **Auto-discovered standards** from your codebase - config files, source patterns, and documentation are analyzed and enforced throughout every workflow
|
|
15
15
|
- **Test-driven implementation** with automated planning, incremental verification, and full test suite runs before completion
|
|
16
16
|
- **Pause and resume** any workflow - state is preserved across sessions
|
|
@@ -25,17 +25,29 @@ Started as a simple OpenCode fork of [Maister Claude Code plugin](https://github
|
|
|
25
25
|
|
|
26
26
|
### Installation
|
|
27
27
|
|
|
28
|
-
####
|
|
28
|
+
#### Add owflow to the `plugin` array in your `opencode.json` ([global or project-level](https://opencode.ai/docs/plugins/#load-order)):
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
To use it across multiple repos it is advised to use the global level:
|
|
31
|
+
|
|
32
|
+
Linux/MacOS:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
~/.config/opencode/opencode.json
|
|
32
36
|
```
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
Windows:
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
\Users\YourUsername\.config\opencode\opencode.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
In `opencode.json`:
|
|
35
45
|
|
|
36
46
|
```json
|
|
37
47
|
{
|
|
38
|
-
|
|
48
|
+
...
|
|
49
|
+
"plugin": ["owflow@latest"]
|
|
50
|
+
...
|
|
39
51
|
}
|
|
40
52
|
```
|
|
41
53
|
|
|
@@ -98,13 +110,12 @@ You can always be explicit when you prefer - arguments and flags simply override
|
|
|
98
110
|
|
|
99
111
|
## Supported Workflows
|
|
100
112
|
|
|
101
|
-
| Command
|
|
102
|
-
|
|
|
103
|
-
| `/development`
|
|
104
|
-
| `/research`
|
|
105
|
-
| `/performance`
|
|
106
|
-
| `/migration`
|
|
107
|
-
| `/product-design` | Product and feature design |
|
|
113
|
+
| Command | Use When |
|
|
114
|
+
| -------------- | ------------------------------------------- |
|
|
115
|
+
| `/development` | Features, bug fixes, enhancements |
|
|
116
|
+
| `/research` | Research with synthesis and solution design |
|
|
117
|
+
| `/performance` | Optimizing speed or resource usage |
|
|
118
|
+
| `/migration` | Changing technologies or patterns |
|
|
108
119
|
|
|
109
120
|
Task type (feature/bug/enhancement) is auto-detected from context. Override with `--type=feature|bug|enhancement` if needed. Or use `/work` as a single entry point that routes to the right workflow.
|
|
110
121
|
|
|
@@ -112,11 +123,13 @@ Task type (feature/bug/enhancement) is auto-detected from context. Override with
|
|
|
112
123
|
|
|
113
124
|
For smaller tasks that don't need a full workflow:
|
|
114
125
|
|
|
115
|
-
| Command | Use When |
|
|
116
|
-
| --------------- | ----------------------------------------------------------- |
|
|
117
|
-
| `/quick-plan` | You want a plan with standards awareness before coding |
|
|
118
|
-
| `/quick-dev` | You know what to do - just implement with standards applied |
|
|
119
|
-
| `/quick-bugfix` | Quick TDD-driven bug fix — write failing test, fix, verify |
|
|
126
|
+
| Command | Use When | Artifacts |
|
|
127
|
+
| --------------- | ----------------------------------------------------------- | --------------------------------------- |
|
|
128
|
+
| `/quick-plan` | You want a plan with standards awareness before coding | `task.yml`, `findings.md` |
|
|
129
|
+
| `/quick-dev` | You know what to do - just implement with standards applied | `task.yml`, `summary.md` |
|
|
130
|
+
| `/quick-bugfix` | Quick TDD-driven bug fix — write failing test, fix, verify | `task.yml`, `findings.md`, `summary.md` |
|
|
131
|
+
|
|
132
|
+
All quick commands create lightweight task directories under `.owflow/tasks/quick-{type}/` with a `task.yml` for traceability.
|
|
120
133
|
|
|
121
134
|
## Standards-Aware Development
|
|
122
135
|
|
|
@@ -141,9 +154,9 @@ TBD
|
|
|
141
154
|
|
|
142
155
|
**Don't use plan mode when starting a workflow.** Planning is a built-in part of every workflow — the orchestrator creates specs, plans, and other files as it goes. OpenCode's plan mode restricts file creation, which conflicts with this. Let the workflow handle planning on its own.
|
|
143
156
|
|
|
144
|
-
**Start workflows in a fresh session.** This is especially useful when chaining workflows (e.g., research → development). Research
|
|
157
|
+
**Start workflows in a fresh session.** This is especially useful when chaining workflows (e.g., research → development). Research artifacts already contain all the context needed, so a clean session avoids noise from prior conversation.
|
|
145
158
|
|
|
146
|
-
**Chain workflows by passing a task folder.** If you've completed a research
|
|
159
|
+
**Chain workflows by passing a task folder.** If you've completed a research workflow and want to build on those results, pass the task folder directly:
|
|
147
160
|
|
|
148
161
|
```bash
|
|
149
162
|
/development .owflow/tasks/research/2026-01-12-oauth-research
|
|
@@ -152,7 +165,7 @@ TBD
|
|
|
152
165
|
You can also append additional instructions to narrow scope or guide the workflow:
|
|
153
166
|
|
|
154
167
|
```bash
|
|
155
|
-
/development .owflow/tasks/
|
|
168
|
+
/development .owflow/tasks/research/2026-01-12-oauth-research Implement only phase 1
|
|
156
169
|
```
|
|
157
170
|
|
|
158
171
|
## Known Issues
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { expect, test, describe, beforeAll, afterAll } from "bun:test";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { verify_template } from "../tools/verify_template";
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
describe("verify_template tool", () => {
|
|
8
|
+
const templatesDir = path.join(__dirname, "../templates");
|
|
9
|
+
const testDir = path.join(__dirname, "test_tmp_dir");
|
|
10
|
+
const testTemplateName = "test-template.yml";
|
|
11
|
+
const testTemplatePath = path.join(templatesDir, testTemplateName);
|
|
12
|
+
beforeAll(() => {
|
|
13
|
+
// Ensure templates dir exists
|
|
14
|
+
if (!fs.existsSync(templatesDir)) {
|
|
15
|
+
fs.mkdirSync(templatesDir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
// Create a dummy template
|
|
18
|
+
fs.writeFileSync(testTemplatePath, `
|
|
19
|
+
key1: value1
|
|
20
|
+
key2:
|
|
21
|
+
subKey1: subValue1
|
|
22
|
+
`);
|
|
23
|
+
// Ensure test dir exists
|
|
24
|
+
if (!fs.existsSync(testDir)) {
|
|
25
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
afterAll(() => {
|
|
29
|
+
// Cleanup
|
|
30
|
+
if (fs.existsSync(testTemplatePath)) {
|
|
31
|
+
fs.rmSync(testTemplatePath);
|
|
32
|
+
}
|
|
33
|
+
if (fs.existsSync(testDir)) {
|
|
34
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
test("should return error if file not found", async () => {
|
|
38
|
+
const result = await verify_template.execute({ filePath: "nonexistent.yml", templateName: testTemplateName }, { directory: testDir });
|
|
39
|
+
expect(result.output).toContain("File not found at nonexistent.yml");
|
|
40
|
+
});
|
|
41
|
+
test("should return error if template not found", async () => {
|
|
42
|
+
const filePath = "target.yml";
|
|
43
|
+
fs.writeFileSync(path.join(testDir, filePath), "key1: value");
|
|
44
|
+
const result = await verify_template.execute({ filePath, templateName: "nonexistent-template.yml" }, { directory: testDir });
|
|
45
|
+
expect(result.output).toContain("Template 'nonexistent-template.yml' not found");
|
|
46
|
+
});
|
|
47
|
+
test("should return error if target file has invalid YAML syntax", async () => {
|
|
48
|
+
const filePath = "invalid.yml";
|
|
49
|
+
fs.writeFileSync(path.join(testDir, filePath), "key1: : value\n invalid");
|
|
50
|
+
const result = await verify_template.execute({ filePath, templateName: testTemplateName }, { directory: testDir });
|
|
51
|
+
expect(result.output).toContain("YAML Syntax Error in invalid.yml");
|
|
52
|
+
});
|
|
53
|
+
test("should return error if target file is missing keys from template", async () => {
|
|
54
|
+
const filePath = "missing-keys.yml";
|
|
55
|
+
// Missing key2
|
|
56
|
+
fs.writeFileSync(path.join(testDir, filePath), "key1: some-value");
|
|
57
|
+
const result = await verify_template.execute({ filePath, templateName: testTemplateName }, { directory: testDir });
|
|
58
|
+
expect(result.output).toContain("YAML Structure Validation Failed");
|
|
59
|
+
expect(result.output).toContain("- Missing key: key2");
|
|
60
|
+
});
|
|
61
|
+
test("should pass if target file matches template structure", async () => {
|
|
62
|
+
const filePath = "valid.yml";
|
|
63
|
+
fs.writeFileSync(path.join(testDir, filePath), `
|
|
64
|
+
key1: different_value
|
|
65
|
+
key2:
|
|
66
|
+
subKey1: different_sub_value
|
|
67
|
+
extraKey: this is fine
|
|
68
|
+
`);
|
|
69
|
+
const result = await verify_template.execute({ filePath, templateName: testTemplateName }, { directory: testDir });
|
|
70
|
+
expect(result.output).toBe("File exists and follows the correct YAML structure.");
|
|
71
|
+
});
|
|
72
|
+
test("should pass if template has null or non-object values and target has them too", async () => {
|
|
73
|
+
const nullTemplateName = "null-template.yml";
|
|
74
|
+
const nullTemplatePath = path.join(templatesDir, nullTemplateName);
|
|
75
|
+
fs.writeFileSync(nullTemplatePath, "key: null\nother: 123");
|
|
76
|
+
const filePath = "valid-null.yml";
|
|
77
|
+
fs.writeFileSync(path.join(testDir, filePath), "key: something\nother: 456");
|
|
78
|
+
const result = await verify_template.execute({ filePath, templateName: nullTemplateName }, { directory: testDir });
|
|
79
|
+
expect(result.output).toBe("File exists and follows the correct YAML structure.");
|
|
80
|
+
fs.rmSync(nullTemplatePath);
|
|
81
|
+
});
|
|
82
|
+
describe("real templates validation", () => {
|
|
83
|
+
let templateFiles = [];
|
|
84
|
+
try {
|
|
85
|
+
const files = fs.readdirSync(templatesDir);
|
|
86
|
+
templateFiles = files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml') || f.endsWith('.md'));
|
|
87
|
+
// Filter out our dummy test template
|
|
88
|
+
templateFiles = templateFiles.filter(f => f !== "test-template.yml" && f !== "null-template.yml");
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
// templates dir might not exist or be readable in some contexts, though beforeAll ensures it exists
|
|
92
|
+
}
|
|
93
|
+
for (const templateName of templateFiles) {
|
|
94
|
+
test(`should successfully validate a valid instance of ${templateName}`, async () => {
|
|
95
|
+
// We use the templates directory as the working directory
|
|
96
|
+
// and the template name as the filePath, effectively comparing the template to itself to ensure it's structurally valid.
|
|
97
|
+
const result = await verify_template.execute({ filePath: templateName, templateName }, { directory: templatesDir });
|
|
98
|
+
expect(result.output).toBe("File exists and follows the correct YAML structure.");
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -44,18 +44,15 @@ You are a specialized task classification agent that analyzes task descriptions
|
|
|
44
44
|
|
|
45
45
|
## Supported Workflow Types
|
|
46
46
|
|
|
47
|
-
| Type
|
|
48
|
-
|
|
|
49
|
-
| **development**
|
|
50
|
-
| **performance**
|
|
51
|
-
| **migration**
|
|
52
|
-
| **research**
|
|
53
|
-
| **product-design** | Design features/products before building | design, product design, feature design, wireframe, prototype, mockup, user journey, persona |
|
|
47
|
+
| Type | Purpose | Primary Keywords |
|
|
48
|
+
| --------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
|
|
49
|
+
| **development** | Any code change: bug fixes, enhancements, new features, refactoring, security fixes | fix, bug, error, improve, enhance, add, new, create, refactor, vulnerability |
|
|
50
|
+
| **performance** | Optimize speed/efficiency | slow, optimize, faster, bottleneck, latency |
|
|
51
|
+
| **migration** | Change tech/patterns/versions | migrate, move from X to Y, upgrade to, transition |
|
|
52
|
+
| **research** | Investigate, document, explore options | research, investigate, explore, document, spike, compare |
|
|
54
53
|
|
|
55
54
|
**Note**: Security fixes, refactoring, and documentation of code are all routed through `development` or `research` — they are characteristics of the work, not separate workflow types.
|
|
56
55
|
|
|
57
|
-
**Key distinction**: `product-design` is for defining WHAT to build before any code is written. If the user already knows what to build and wants to implement it, that's `development`.
|
|
58
|
-
|
|
59
56
|
---
|
|
60
57
|
|
|
61
58
|
## Classification Workflow
|
|
@@ -159,13 +156,6 @@ If description contains error messages or stack traces:
|
|
|
159
156
|
- Discovery: spike, proof of concept, prototype, feasibility
|
|
160
157
|
- Documentation: document findings, write guide, create documentation
|
|
161
158
|
|
|
162
|
-
**Product Design**:
|
|
163
|
-
|
|
164
|
-
- Primary: design, product design, feature design, wireframe, prototype, mockup
|
|
165
|
-
- Exploration: user journey, persona, user story, product brief, user flow
|
|
166
|
-
- Planning: scope definition, requirements gathering, feature spec (before code)
|
|
167
|
-
- **Key distinction**: Designing what to build before building it — if implementation is implied, route to development instead
|
|
168
|
-
|
|
169
159
|
**Calculate Confidence Score**:
|
|
170
160
|
|
|
171
161
|
```
|
|
@@ -236,7 +226,6 @@ Please choose the workflow type that best fits:
|
|
|
236
226
|
2. Performance - Optimize speed/efficiency
|
|
237
227
|
3. Migration - Move to new tech/pattern
|
|
238
228
|
4. Research - Investigate, document, explore options
|
|
239
|
-
5. Product Design - Design features or products before building them
|
|
240
229
|
|
|
241
230
|
Which type best describes your task?
|
|
242
231
|
```
|
|
@@ -260,7 +249,7 @@ Return structured YAML format:
|
|
|
260
249
|
|
|
261
250
|
```yaml
|
|
262
251
|
classification:
|
|
263
|
-
task_type: [development|performance|migration|research
|
|
252
|
+
task_type: [development|performance|migration|research]
|
|
264
253
|
confidence: [percentage as integer]
|
|
265
254
|
keywords_matched: [list of matched keywords]
|
|
266
255
|
|
|
@@ -394,7 +383,6 @@ Use question with relevant options
|
|
|
394
383
|
- **performance** → performance orchestrator
|
|
395
384
|
- **migration** → migration orchestrator
|
|
396
385
|
- **research** → research orchestrator
|
|
397
|
-
- **product-design** → product-design orchestrator
|
|
398
386
|
|
|
399
387
|
**External Systems** (tries MCP → CLI → WebFetch → prompt user):
|
|
400
388
|
|
|
@@ -53,6 +53,18 @@ Implement a task directly without entering planning mode, while still applying p
|
|
|
53
53
|
"What would you like to implement? Please describe the task."
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
### Step 1b: Create Task Directory
|
|
57
|
+
|
|
58
|
+
**Create a lightweight task directory for artifact anchoring.**
|
|
59
|
+
|
|
60
|
+
1. Generate a task name from the task description:
|
|
61
|
+
- Extract 3–5 key words, convert to lowercase kebab-case
|
|
62
|
+
- Prepend today's date: `YYYY-MM-DD-kebab-name`
|
|
63
|
+
- Examples: "Add a logout button to the navbar" → `2026-05-28-add-navbar-logout-button`, "Update the API endpoint to accept JSON" → `2026-05-28-update-api-accept-json`
|
|
64
|
+
2. Create directory: `.owflow/tasks/quick-dev/YYYY-MM-DD-task-name/`
|
|
65
|
+
3. Write `task.yml` with initial state using the template [src/templates/quick-dev-task.yml](../templates/quick-dev-task.yml).
|
|
66
|
+
4. **CRITICAL**: Use the `verify_template` tool immediately after creation to check YAML validity against `quick-dev-task.yml`.
|
|
67
|
+
|
|
56
68
|
### Step 2: Discover Standards
|
|
57
69
|
|
|
58
70
|
**Check if `.owflow/docs/INDEX.md` exists:**
|
|
@@ -65,6 +77,7 @@ Implement a task directly without entering planning mode, while still applying p
|
|
|
65
77
|
- The nature of the task
|
|
66
78
|
- Keywords in the task description
|
|
67
79
|
3. **READ the applicable standard files** (see Standards Reading Enforcement below)
|
|
80
|
+
4. **Update `task.yml`**: Add paths of standards read to `standards_applied` list
|
|
68
81
|
|
|
69
82
|
**If not exists:**
|
|
70
83
|
|
|
@@ -110,7 +123,34 @@ Implement a task directly without entering planning mode, while still applying p
|
|
|
110
123
|
|
|
111
124
|
### Step 5: Summary
|
|
112
125
|
|
|
113
|
-
**
|
|
126
|
+
**Write `summary.md`** in the task directory:
|
|
127
|
+
|
|
128
|
+
```markdown
|
|
129
|
+
# Task Summary
|
|
130
|
+
|
|
131
|
+
**Command**: quick-dev
|
|
132
|
+
**Date**: YYYY-MM-DD
|
|
133
|
+
**Status**: completed
|
|
134
|
+
|
|
135
|
+
## What Was Done
|
|
136
|
+
[What was implemented]
|
|
137
|
+
|
|
138
|
+
## Files Modified
|
|
139
|
+
- `path/to/file`
|
|
140
|
+
|
|
141
|
+
## Standards Applied
|
|
142
|
+
- [standard]: [guideline]
|
|
143
|
+
|
|
144
|
+
## Tests
|
|
145
|
+
- [test file] — [result]
|
|
146
|
+
|
|
147
|
+
## Commit Suggestion
|
|
148
|
+
[conventional commit message]
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Update `task.yml`**: set `status: completed`, `updated: [now]`.
|
|
152
|
+
|
|
153
|
+
**Provide completion summary to user:**
|
|
114
154
|
|
|
115
155
|
- What was implemented
|
|
116
156
|
- Which standards from INDEX.md were applied
|
|
@@ -122,11 +162,13 @@ Implement a task directly without entering planning mode, while still applying p
|
|
|
122
162
|
## What This Does
|
|
123
163
|
|
|
124
164
|
1. **Parses** task description from user input
|
|
125
|
-
2. **
|
|
126
|
-
3. **
|
|
127
|
-
4. **
|
|
128
|
-
5. **
|
|
129
|
-
6. **
|
|
165
|
+
2. **Creates** lightweight task directory with `task.yml` for artifact anchoring
|
|
166
|
+
3. **Discovers** applicable standards from `.owflow/docs/INDEX.md`
|
|
167
|
+
4. **READS** actual standard files (MANDATORY - not just INDEX.md)
|
|
168
|
+
5. **Implements** directly without planning mode approval
|
|
169
|
+
6. **Verifies** standards were followed
|
|
170
|
+
7. **Writes** `summary.md` in task directory and updates `task.yml` to `completed`
|
|
171
|
+
8. **Summarizes** what was done and which standards were read and applied
|
|
130
172
|
|
|
131
173
|
## Graceful Fallback
|
|
132
174
|
|
|
@@ -35,6 +35,19 @@ Enter OpenCode's planning mode for a task, with automatic discovery of project s
|
|
|
35
35
|
"What would you like to plan? Please describe the task or feature."
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
### Step 1b: Create Task Directory
|
|
39
|
+
|
|
40
|
+
**Create a lightweight task directory for artifact anchoring.**
|
|
41
|
+
|
|
42
|
+
1. Generate a task name from the task description:
|
|
43
|
+
- Extract 3–5 key words, convert to lowercase kebab-case
|
|
44
|
+
- Prepend today's date: `YYYY-MM-DD-kebab-name`
|
|
45
|
+
- Examples: "Add retry logic to API client" → `2026-05-28-add-api-retry-logic`, "Refactor the payment processing module" → `2026-05-28-refactor-payment-module`
|
|
46
|
+
2. Create directory: `.owflow/tasks/quick-plan/YYYY-MM-DD-task-name/`
|
|
47
|
+
3. Create `analysis/` subdirectory inside it
|
|
48
|
+
4. Write `task.yml` with initial state using the template [src/templates/quick-plan-task.yml](../templates/quick-plan-task.yml).
|
|
49
|
+
5. **CRITICAL**: Use the `verify_template` tool immediately after creation to check YAML validity against `quick-plan-task.yml`.
|
|
50
|
+
|
|
38
51
|
### Step 2: Discover and Read Standards (BEFORE Plan Mode)
|
|
39
52
|
|
|
40
53
|
**CRITICAL: This step MUST complete before calling Plan Agent.**
|
|
@@ -53,6 +66,24 @@ Enter OpenCode's planning mode for a task, with automatic discovery of project s
|
|
|
53
66
|
4. **READ the actual standard files** using the Read tool — reading INDEX.md alone is NOT sufficient
|
|
54
67
|
|
|
55
68
|
5. **Summarize key guidelines** from each standard file read — these will carry into plan mode as context
|
|
69
|
+
6. **Update `task.yml`**: Add paths of standards read to `standards_applied` list
|
|
70
|
+
|
|
71
|
+
### Step 2b: Write Findings
|
|
72
|
+
|
|
73
|
+
**After standards discovery, write `analysis/findings.md`** in the task directory:
|
|
74
|
+
|
|
75
|
+
```markdown
|
|
76
|
+
# Task Analysis
|
|
77
|
+
|
|
78
|
+
## Context
|
|
79
|
+
[What was analyzed to inform the plan — codebase areas explored, existing patterns found]
|
|
80
|
+
|
|
81
|
+
## Key Decisions
|
|
82
|
+
[Architectural or implementation decisions made during planning]
|
|
83
|
+
|
|
84
|
+
## Standards Referenced
|
|
85
|
+
- [standard file]: [key guideline applied]
|
|
86
|
+
```
|
|
56
87
|
|
|
57
88
|
### Step 3: Enter Planning Mode
|
|
58
89
|
|
|
@@ -101,10 +132,13 @@ project documentation and coding standards for better consistency.
|
|
|
101
132
|
## What This Does
|
|
102
133
|
|
|
103
134
|
1. **Parses** task description from user input
|
|
104
|
-
2. **
|
|
105
|
-
3. **
|
|
106
|
-
4. **
|
|
107
|
-
5. **
|
|
135
|
+
2. **Creates** lightweight task directory with `task.yml` for artifact anchoring
|
|
136
|
+
3. **Discovers and READS** applicable standard files from `.owflow/docs/` (BEFORE plan mode)
|
|
137
|
+
4. **Writes** `analysis/findings.md` with task context and key decisions
|
|
138
|
+
5. **Enters** OpenCode's builtin planning mode via delegating to `Plan Agent` with standards already loaded
|
|
139
|
+
6. **Produces** a plan file with implementation approach, applicable standards, and compliance checklist
|
|
140
|
+
7. **Gates** Approval question on mandatory standards sections in the plan file
|
|
141
|
+
8. **Updates** `task.yml` with `status: completed` and `plan_path` after plan approval
|
|
108
142
|
|
|
109
143
|
## Benefits Over Manual Planning
|
|
110
144
|
|
|
@@ -117,6 +151,7 @@ project documentation and coding standards for better consistency.
|
|
|
117
151
|
|
|
118
152
|
Once the plan is approved:
|
|
119
153
|
|
|
154
|
+
- **Update `task.yml`**: set `status: completed`, `plan_path: [path to plan file]`, `updated: [now]`
|
|
120
155
|
- Implementation begins based on the plan
|
|
121
156
|
- Standards are applied during coding
|
|
122
157
|
|
package/dist/commands/work.md
CHANGED
|
@@ -59,7 +59,6 @@ Auto-classifies tasks and routes to the appropriate workflow orchestrator. Suppo
|
|
|
59
59
|
| performance | `performance` |
|
|
60
60
|
| migration | `migration` |
|
|
61
61
|
| research | `research` |
|
|
62
|
-
| product-design | `product-design` |
|
|
63
62
|
|
|
64
63
|
---
|
|
65
64
|
|
|
@@ -93,13 +92,12 @@ Auto-classifies tasks and routes to the appropriate workflow orchestrator. Suppo
|
|
|
93
92
|
1. Read `orchestrator-state.yml` from task folder
|
|
94
93
|
2. Determine workflow type from folder path:
|
|
95
94
|
|
|
96
|
-
| Folder
|
|
97
|
-
|
|
|
98
|
-
| `development/`
|
|
99
|
-
| `performance/`
|
|
100
|
-
| `migrations/`
|
|
101
|
-
| `research/`
|
|
102
|
-
| `product-design/` | product-design |
|
|
95
|
+
| Folder | Workflow Type |
|
|
96
|
+
| -------------- | ------------- |
|
|
97
|
+
| `development/` | development |
|
|
98
|
+
| `performance/` | performance |
|
|
99
|
+
| `migrations/` | migration |
|
|
100
|
+
| `research/` | research |
|
|
103
101
|
|
|
104
102
|
3. Extract status from state file:
|
|
105
103
|
- `completed`: null = in-progress, timestamp = finished
|
|
@@ -177,7 +175,7 @@ The subagent will:
|
|
|
177
175
|
|
|
178
176
|
```yaml
|
|
179
177
|
classification:
|
|
180
|
-
task_type: [development|performance|migration|research
|
|
178
|
+
task_type: [development|performance|migration|research]
|
|
181
179
|
confidence: [percentage]
|
|
182
180
|
reasoning: [explanation]
|
|
183
181
|
```
|
|
@@ -217,7 +215,6 @@ Use question with options:
|
|
|
217
215
|
2. Performance - Optimize speed/efficiency
|
|
218
216
|
3. Migration - Move to new tech/pattern
|
|
219
217
|
4. Research - Investigate and document findings
|
|
220
|
-
5. Product Design - Design features or products before building them
|
|
221
218
|
|
|
222
219
|
Then route to selected workflow using Skill tool.
|
|
223
220
|
```
|
|
@@ -236,13 +233,12 @@ Display:
|
|
|
236
233
|
|
|
237
234
|
## Resume Skill Reference
|
|
238
235
|
|
|
239
|
-
| Workflow Type
|
|
240
|
-
|
|
|
241
|
-
| development
|
|
242
|
-
| performance
|
|
243
|
-
| migration
|
|
244
|
-
| research
|
|
245
|
-
| product-design | `product-design` | `--resume [path] [--from=PHASE]` |
|
|
236
|
+
| Workflow Type | Skill | Args |
|
|
237
|
+
| ------------- | ------------- | --------------------------------------------------- |
|
|
238
|
+
| development | `development` | `--resume [path] [--from=PHASE] [--reset-attempts]` |
|
|
239
|
+
| performance | `performance` | `--resume [path] [--from=PHASE]` |
|
|
240
|
+
| migration | `migration` | `--resume [path] [--from=PHASE]` |
|
|
241
|
+
| research | `research` | `--resume [path] [--from=PHASE]` |
|
|
246
242
|
|
|
247
243
|
---
|
|
248
244
|
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import path from "node:path";
|
|
|
6
6
|
import fs from "node:fs";
|
|
7
7
|
import { fileURLToPath } from "url";
|
|
8
8
|
import matter from "gray-matter";
|
|
9
|
+
import { verify_template } from "./tools/verify_template";
|
|
9
10
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
10
11
|
const PLUGIN_ROOT = __dirname; // Points to dist/ where skills/commands/agents are copied
|
|
11
12
|
/**
|
|
@@ -72,6 +73,9 @@ const prepareAgent = ({ data, content }, smallModel) => {
|
|
|
72
73
|
const OwflowPlugin = async ({ $, directory }) => {
|
|
73
74
|
const agentBySession = new Map();
|
|
74
75
|
return {
|
|
76
|
+
tool: {
|
|
77
|
+
verify_template,
|
|
78
|
+
},
|
|
75
79
|
/**
|
|
76
80
|
* Register owflow's skills, commands, and agents so OpenCode discovers
|
|
77
81
|
* them without requiring manual config file edits.
|