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.
Files changed (33) hide show
  1. package/README.md +34 -21
  2. package/dist/__tests__/verify_template.test.js +102 -0
  3. package/dist/agents/task-classifier.md +7 -19
  4. package/dist/commands/quick-dev.md +48 -6
  5. package/dist/commands/quick-plan.md +39 -4
  6. package/dist/commands/work.md +13 -17
  7. package/dist/index.js +4 -0
  8. package/dist/skills/development/SKILL.md +83 -115
  9. package/dist/skills/migration/SKILL.md +2 -33
  10. package/dist/skills/orchestrator-framework/references/orchestrator-creation-checklist.md +1 -0
  11. package/dist/skills/orchestrator-framework/references/orchestrator-patterns.md +4 -59
  12. package/dist/skills/performance/SKILL.md +2 -30
  13. package/dist/skills/quick-bugfix/SKILL.md +96 -26
  14. package/dist/skills/research/SKILL.md +3 -42
  15. package/dist/templates/orchestrator-state-base.yml +17 -0
  16. package/dist/templates/orchestrator-state-development.yml +94 -0
  17. package/dist/templates/orchestrator-state-migration.yml +55 -0
  18. package/dist/templates/orchestrator-state-performance.yml +53 -0
  19. package/dist/templates/orchestrator-state-research.yml +61 -0
  20. package/dist/templates/quick-bugfix-task.yml +10 -0
  21. package/dist/templates/quick-dev-task.yml +10 -0
  22. package/dist/templates/quick-plan-task.yml +11 -0
  23. package/dist/tools/verify_template.js +61 -0
  24. package/package.json +4 -3
  25. package/dist/agents/ui-mockup-generator.md +0 -369
  26. package/dist/commands/product-design.md +0 -37
  27. package/dist/skills/product-design/SKILL.md +0 -843
  28. package/dist/skills/product-design/references/characteristic-detection.md +0 -92
  29. package/dist/skills/product-design/references/interaction-patterns.md +0 -206
  30. package/dist/skills/product-design/references/visual-companion.md +0 -190
  31. package/dist/skills/product-design/server/index.js +0 -302
  32. package/dist/skills/product-design/server/index.ts +0 -359
  33. package/dist/skills/product-design/server/template.html +0 -256
@@ -7,7 +7,7 @@ user-invocable: true
7
7
 
8
8
  # Quick Bug Fix
9
9
 
10
- Lightweight TDD-driven bug fix workflow with planning mode. Analyze the bug, present a fix plan for approval, then reproduce with a failing test, fix, and verify. No orchestrator state, no task directory, no subagents.
10
+ Lightweight TDD-driven bug fix workflow with planning mode. Analyze the bug, present a fix plan for approval, then reproduce with a failing test, fix, and verify. No orchestrator state, no subagents. Creates lightweight task directory for artifact anchoring.
11
11
 
12
12
  For complex bugs that grow beyond a quick fix, suggests escalating to the full development workflow (`/development`).
13
13
 
@@ -48,7 +48,20 @@ For complex bugs that grow beyond a quick fix, suggests escalating to the full d
48
48
  "Describe the bug — what's the expected behavior vs actual behavior?"
49
49
  ```
50
50
 
51
- ### Step 2: Discover Standards
51
+ ### Step 2: Create Task Directory
52
+
53
+ **Create a lightweight task directory for artifact anchoring.**
54
+
55
+ 1. Generate a task name from the bug description:
56
+ - Extract 3–5 key words, convert to lowercase kebab-case
57
+ - Prepend today's date: `YYYY-MM-DD-kebab-name`
58
+ - Examples: "Fix login timeout bug" → `2026-05-28-fix-login-timeout`, "Login form submits twice on slow connections" → `2026-05-28-login-double-submit`
59
+ 2. Create directory: `.owflow/tasks/quick-bugfix/YYYY-MM-DD-task-name/`
60
+ 3. Create `analysis/` subdirectory inside it
61
+ 4. Write `task.yml` with initial state using the template [src/templates/quick-bugfix-task.yml](../../templates/quick-bugfix-task.yml).
62
+ 5. **CRITICAL**: Use the `verify_template` tool immediately after creation to check YAML validity against `quick-bugfix-task.yml`.
63
+
64
+ ### Step 3: Discover Standards
52
65
 
53
66
  **CRITICAL: This step MUST complete before entering plan mode.**
54
67
 
@@ -62,6 +75,7 @@ For complex bugs that grow beyond a quick fix, suggests escalating to the full d
62
75
  - The area of the bug (e.g., API, frontend, database)
63
76
  - Keywords in the bug description
64
77
  3. **READ the applicable standard files** (see Standards Reading Enforcement below)
78
+ 4. **Update `task.yml`**: Add paths of standards read to `standards_applied` list
65
79
 
66
80
  **If not exists:**
67
81
 
@@ -86,7 +100,7 @@ For complex bugs that grow beyond a quick fix, suggests escalating to the full d
86
100
  - Bug in form validation → Read validation and frontend standards
87
101
  - Bug in database query → Read database and backend standards
88
102
 
89
- ### Step 3: Analyze & Assess Complexity
103
+ ### Step 4: Analyze & Assess Complexity
90
104
 
91
105
  **Explore the codebase to understand the bug:**
92
106
 
@@ -109,20 +123,57 @@ Assess whether this bug exceeds quick-fix scope. If **2 or more** of these signa
109
123
 
110
124
  **If escalation triggered:**
111
125
 
126
+ **Write `analysis/findings.md`** in the task directory with the analysis captured so far:
127
+
128
+ ```markdown
129
+ # Bug Analysis
130
+
131
+ ## Root Cause
132
+ [Root cause hypothesis with evidence — file paths, code references]
133
+
134
+ ## Affected Files
135
+ - `path/to/file` — reason
136
+
137
+ ## Complexity Assessment
138
+ - [ ] Changes span 5+ files across multiple modules
139
+ - [ ] Requires database schema changes
140
+ - [ ] Multiple valid fix approaches with architectural trade-offs
141
+ - [ ] Security-sensitive code
142
+ - [ ] Root cause unclear after initial analysis
143
+
144
+ Signals detected: X of 5
145
+
146
+ ## Test Strategy
147
+ [How the bug will be reproduced with a failing test]
148
+
149
+ ## Standards Referenced
150
+ - [standard file]: [key guideline applied]
151
+ ```
152
+
112
153
  Use question:
113
154
 
114
155
  - Question: "This bug appears more complex than a quick fix — [describe why]. How would you like to proceed?"
115
156
  - Options:
116
157
  1. "Continue with quick fix" — proceed, accepting the complexity
117
- 2. "Switch to full development workflow" — stop here and suggest running `/development` with the bug description and analysis context
158
+ 2. "Switch to full development workflow" — escalate (see below)
159
+
160
+ **If user chooses to escalate:**
161
+
162
+ 1. Ensure `analysis/findings.md` is written (above)
163
+ 2. Update `task.yml`: set `status: escalated`, `escalation_reason: "[signals detected]"`, `updated: [now]`
164
+ 3. Tell the user: "Run `/development .owflow/tasks/quick-bugfix/YYYY-MM-DD-task-name` to continue with full workflow."
165
+ 4. Do NOT set `escalated_to` — the development orchestrator will set it
166
+ 5. `summary.md` is NOT written on escalation
167
+
168
+ **If no escalation needed or user chooses to continue:**
118
169
 
119
- **If no escalation needed or user chooses to continue:** proceed to Step 4.
170
+ Write `analysis/findings.md` (same template above — captures analysis for auditability), then proceed to Step 5.
120
171
 
121
- ### Step 4: Enter Planning Mode
172
+ ### Step 5: Enter Planning Mode
122
173
 
123
174
  **Use the `Plan Agent` to present the fix plan for user approval.**
124
175
 
125
- Standards context from Step 2 and analysis from Step 3 MUST inform the plan.
176
+ Standards context from Step 3 and analysis from Step 4 MUST inform the plan.
126
177
 
127
178
  **Plan file content:**
128
179
 
@@ -163,7 +214,7 @@ If no standards exist: "No AI SDLC standards found. Consider running `/flow-init
163
214
 
164
215
  If any section is missing, add it before asking for user approval.
165
216
 
166
- ### Step 5: TDD Red Gate
217
+ ### Step 6: TDD Red Gate
167
218
 
168
219
  **Write a failing test that reproduces the bug.**
169
220
 
@@ -182,12 +233,12 @@ If any section is missing, add it before asking for user approval.
182
233
  - Investigate further — re-read the bug description, check if conditions are correct
183
234
  - Use question: "The reproduction test passes — the expected behavior already works under these conditions. Is the bug description accurate, or are there additional conditions?"
184
235
 
185
- ### Step 6: Fix & Verify (TDD Green)
236
+ ### Step 7: Fix & Verify (TDD Green)
186
237
 
187
238
  **Implement the fix:**
188
239
 
189
- 1. Apply the fix based on the approved plan from Step 4
190
- 2. **Apply discovered standards** from Step 2
240
+ 1. Apply the fix based on the approved plan from Step 5
241
+ 2. **Apply discovered standards** from Step 3
191
242
  3. Run the failing test — it MUST now pass
192
243
  4. Run the full test file and related test files to check for regressions
193
244
 
@@ -203,16 +254,34 @@ If any section is missing, add it before asking for user approval.
203
254
  - Stop and present findings to the user
204
255
  - Suggest escalating to `/development` for a more thorough approach
205
256
 
206
- ### Step 7: Summary
257
+ ### Step 8: Summary
258
+
259
+ **Write `summary.md`** in the task directory:
260
+
261
+ ```markdown
262
+ # Task Summary
207
263
 
208
- **Provide completion summary:**
264
+ **Command**: quick-bugfix
265
+ **Date**: YYYY-MM-DD
266
+ **Status**: completed
267
+
268
+ ## What Was Done
269
+ [Root cause and fix description]
270
+
271
+ ## Files Modified
272
+ - `path/to/file`
273
+
274
+ ## Standards Applied
275
+ - [standard]: [guideline]
276
+
277
+ ## Tests
278
+ - [test file] — [result]
279
+
280
+ ## Commit Suggestion
281
+ [conventional commit message]
282
+ ```
209
283
 
210
- - **Root cause**: What caused the bug
211
- - **Fix**: What was changed and why
212
- - **Files modified**: List of changed files
213
- - **Standards applied**: Which standards from INDEX.md were followed
214
- - **Tests**: Which tests were run and their results (including the TDD red→green transition)
215
- - **Commit suggestion**: Propose a commit message
284
+ **Update `task.yml`**: set `status: completed`, `updated: [now]`.
216
285
 
217
286
  **Post-implementation: verify standards compliance using the checklist from the plan file.**
218
287
 
@@ -221,13 +290,14 @@ If any section is missing, add it before asking for user approval.
221
290
  ## What This Does
222
291
 
223
292
  1. **Parses** bug description from user input
224
- 2. **Discovers** applicable standards from `.owflow/docs/INDEX.md`
225
- 3. **Analyzes** codebase to find root cause and assess complexity
226
- 4. **Escalates** to full development workflow if bug is too complex
227
- 5. **Plans** the fix and presents for user approval via planning mode
228
- 6. **Reproduces** bug with a failing test (TDD Red)
229
- 7. **Fixes** the bug and verifies test passes (TDD Green)
230
- 8. **Summarizes** root cause, fix, standards applied, and test results
293
+ 2. **Creates** lightweight task directory with `task.yml` for artifact anchoring
294
+ 3. **Discovers** applicable standards from `.owflow/docs/INDEX.md`
295
+ 4. **Analyzes** codebase to find root cause, writes `analysis/findings.md`, and assesses complexity
296
+ 5. **Escalates** to full development workflow if bug is too complex (updates `task.yml` status to `escalated`)
297
+ 6. **Plans** the fix and presents for user approval via planning mode
298
+ 7. **Reproduces** bug with a failing test (TDD Red)
299
+ 8. **Fixes** the bug and verifies test passes (TDD Green)
300
+ 9. **Summarizes** in `summary.md`, updates `task.yml` status to `completed`
231
301
 
232
302
  ## Graceful Fallback
233
303
 
@@ -23,6 +23,7 @@ Systematic research workflow from question definition to evidence-based document
23
23
  1. **Create Task Items**: Use `TaskCreate` for all phases (see Phase Configuration), then set dependencies with `TaskUpdate addBlockedBy`
24
24
  2. **Create Task Directory**: `.owflow/tasks/research/YYYY-MM-DD-task-name/`
25
25
  3. **Initialize State**: Create `orchestrator-state.yml` with research context
26
+ - **CRITICAL**: Use the `verify_template` tool immediately after creation to check YAML validity against `orchestrator-state-research.yml`.
26
27
 
27
28
  **Output**:
28
29
 
@@ -369,40 +370,7 @@ question - "Design complete. Continue to output generation?"
369
370
 
370
371
  Research-specific fields in `orchestrator-state.yml`:
371
372
 
372
- ```yaml
373
- research_context:
374
- research_type: "technical" | "requirements" | "literature" | "mixed"
375
- research_question: "[user's question]"
376
- scope:
377
- included: []
378
- excluded: []
379
- constraints: []
380
- methodology: []
381
- sources: []
382
- confidence_level: "high" | "medium" | "low"
383
- gathering_strategy:
384
- categories: [] # e.g., ["codebase", "documentation", "external-apis"]
385
- count: 4 # number of gatherer instances
386
- source: "planner" | "default" # where strategy came from
387
- phase_summaries:
388
- phase-1:
389
- summary: "..."
390
- steps_completed: [] # track which steps completed for resume
391
- phase-3:
392
- summary: "..."
393
- phase-4:
394
- summary: "..."
395
- decision_areas: [] # list of {area, alternatives_count, chosen_approach}
396
- deferred_ideas: []
397
- phase-5:
398
- summary: "..."
399
- architecture_style: null
400
- decisions_count: 0
401
-
402
- options:
403
- brainstorming_enabled: null # null=not yet decided, set by Phase 2 or --brainstorm/--no-brainstorm flag
404
- design_enabled: null # independent, set by Phase 2 or --design/--no-design flag
405
- ```
373
+ Refer to the template [src/templates/orchestrator-state-research.yml](../../templates/orchestrator-state-research.yml).
406
374
 
407
375
  ---
408
376
 
@@ -468,14 +436,7 @@ options:
468
436
 
469
437
  **Handoff**:
470
438
 
471
- ```yaml
472
- research_outputs:
473
- research_report: "[path to outputs/research-report.md]"
474
- findings_directory: "[path to analysis/findings/]"
475
- solution_exploration: "[path to outputs/solution-exploration.md]"
476
- high_level_design: "[path to outputs/high-level-design.md]"
477
- decision_log: "[path to outputs/decision-log.md]"
478
- ```
439
+ Refer to `research_outputs` in the template [src/templates/orchestrator-state-research.yml](../../templates/orchestrator-state-research.yml).
479
440
 
480
441
  ---
481
442
 
@@ -0,0 +1,17 @@
1
+ orchestrator:
2
+ started_phase: null
3
+ completed_phases: []
4
+ failed_phases: []
5
+ auto_fix_attempts: {}
6
+ options: {}
7
+ created: "YYYY-MM-DDTHH:MM:SSZ"
8
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
9
+ task_path: null
10
+ task_ids: {}
11
+
12
+ task:
13
+ title: null
14
+ description: null
15
+ status: pending
16
+ tags: []
17
+ priority: null
@@ -0,0 +1,94 @@
1
+ orchestrator:
2
+ started_phase: null
3
+ completed_phases: []
4
+ failed_phases: []
5
+ auto_fix_attempts:
6
+ phase-1: 0
7
+ phase-2: 0
8
+ phase-3: 0
9
+ phase-4: 0
10
+ phase-5: 0
11
+ phase-6: 0
12
+ phase-7: 0
13
+ phase-8: 0
14
+ phase-9: 0
15
+ phase-10: 0
16
+ phase-11: 0
17
+ phase-12: 0
18
+ phase-13: 0
19
+ options:
20
+ spec_audit_enabled: true
21
+ skip_test_suite: true
22
+ e2e_enabled: null
23
+ user_docs_enabled: null
24
+ code_review_enabled: true
25
+ pragmatic_review_enabled: true
26
+ reality_check_enabled: true
27
+ production_check_enabled: true
28
+ created: "YYYY-MM-DDTHH:MM:SSZ"
29
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
30
+ task_path: null
31
+ task_ids: {}
32
+
33
+ task:
34
+ title: null
35
+ description: null
36
+ status: pending
37
+ tags: []
38
+ priority: null
39
+
40
+ task_context:
41
+ risk_level: null
42
+ clarifications_resolved: null
43
+ scope_expanded: null
44
+ architecture_decision: null
45
+ task_characteristics:
46
+ has_reproducible_defect: false
47
+ modifies_existing_code: false
48
+ creates_new_entities: false
49
+ involves_data_operations: false
50
+ ui_heavy: false
51
+ user_journey:
52
+ reachability: null
53
+ persona_impact: null
54
+ flow_integration: null
55
+ navigation_consistency: null
56
+ discoverability_before: null
57
+ discoverability_after: null
58
+ data_lifecycle:
59
+ three_layer_framework: null
60
+ backend_user_operability: null
61
+ orphaned_display_detected: null
62
+ orphaned_input_detected: null
63
+ layer_3_critical_checks: null
64
+ multi_touchpoint_discovery: null
65
+ crud_completeness: null
66
+ scope_expansion_recommended: null
67
+ safety_critical_awareness: null
68
+ gaps: []
69
+ research_reference:
70
+ path: null
71
+ research_question: null
72
+ research_type: null
73
+ confidence_level: null
74
+ quick_reference:
75
+ path: null
76
+ command: null
77
+ escalation_reason: null
78
+ phase_summaries:
79
+ research: { summary: null, key_findings: [], recommended_approach: null }
80
+ quick_analysis: { summary: null, affected_files: [], root_cause: null }
81
+ codebase_analysis: { key_files: [], primary_language: null, summary: null }
82
+ clarifications: []
83
+ gap_analysis: { integration_points: [], summary: null }
84
+ scope_clarifications: { scope_expanded: null, summary: null }
85
+ ui_mockups: { components_designed: [], summary: null }
86
+ specification: { summary: null }
87
+ architecture_decision: { decision: null, summary: null }
88
+
89
+ verification_context:
90
+ last_status: null
91
+ issues_found: []
92
+ fixes_applied: []
93
+ decisions_made: []
94
+ reverify_count: 0
@@ -0,0 +1,55 @@
1
+ orchestrator:
2
+ started_phase: null
3
+ completed_phases: []
4
+ failed_phases: []
5
+ auto_fix_attempts:
6
+ phase-1: 0
7
+ phase-2: 0
8
+ phase-3: 0
9
+ phase-4: 0
10
+ phase-5: 0
11
+ phase-6: 0
12
+ phase-7: 0
13
+ phase-8: 0
14
+ options:
15
+ docs_enabled: false
16
+ created: "YYYY-MM-DDTHH:MM:SSZ"
17
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
18
+ task_path: null
19
+ task_ids: {}
20
+
21
+ task:
22
+ title: null
23
+ description: null
24
+ status: pending
25
+ tags: []
26
+ priority: null
27
+
28
+ migration_context:
29
+ migration_type: "code | data | architecture | general"
30
+ current_system:
31
+ description: null
32
+ technologies: []
33
+ target_system:
34
+ description: null
35
+ technologies: []
36
+ migration_strategy:
37
+ approach: "incremental | big-bang | dual-run | phased"
38
+ phases: []
39
+ risk_level: null
40
+ breaking_changes: []
41
+ rollback_plan_created: false
42
+ dual_run_configured: false
43
+
44
+ external_research:
45
+ performed: false
46
+ category: null
47
+ breaking_changes: []
48
+ migration_guide_url: null
49
+
50
+ verification_context:
51
+ last_status: null
52
+ issues_found: null
53
+ fixes_applied: []
54
+ decisions_made: []
55
+ reverify_count: 0
@@ -0,0 +1,53 @@
1
+ orchestrator:
2
+ started_phase: null
3
+ completed_phases: []
4
+ failed_phases: []
5
+ auto_fix_attempts:
6
+ phase-1: 0
7
+ phase-2: 0
8
+ phase-3: 0
9
+ phase-4: 0
10
+ phase-5: 0
11
+ phase-6: 0
12
+ phase-7: 0
13
+ phase-8: 0
14
+ phase-9: 0
15
+ options:
16
+ spec_audit_enabled: null
17
+ skip_test_suite: true
18
+ code_review_enabled: true
19
+ pragmatic_review_enabled: true
20
+ reality_check_enabled: true
21
+ production_check_enabled: null
22
+ created: "YYYY-MM-DDTHH:MM:SSZ"
23
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
24
+ task_path: null
25
+ task_ids: {}
26
+
27
+ task:
28
+ title: null
29
+ description: null
30
+ status: pending
31
+ tags: []
32
+ priority: null
33
+
34
+ performance_context:
35
+ bottlenecks_identified: null
36
+ user_data_available: false
37
+ bottleneck_priorities:
38
+ p0: 0
39
+ p1: 0
40
+ p2: 0
41
+ p3: 0
42
+ phase_summaries:
43
+ codebase_analysis: { key_files: [], summary: null }
44
+ bottleneck_analysis:
45
+ { bottlenecks: [], summary: null, user_data_incorporated: false }
46
+ specification: { summary: null }
47
+
48
+ verification_context:
49
+ last_status: null
50
+ issues_found: null
51
+ fixes_applied: []
52
+ decisions_made: []
53
+ reverify_count: 0
@@ -0,0 +1,61 @@
1
+ orchestrator:
2
+ started_phase: null
3
+ completed_phases: []
4
+ failed_phases: []
5
+ auto_fix_attempts:
6
+ phase-1: 0
7
+ phase-2: 0
8
+ phase-3: 0
9
+ phase-4: 0
10
+ phase-5: 0
11
+ phase-6: 0
12
+ options:
13
+ brainstorming_enabled: null
14
+ design_enabled: null
15
+ created: "YYYY-MM-DDTHH:MM:SSZ"
16
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
17
+ task_path: null
18
+ task_ids: {}
19
+
20
+ task:
21
+ title: null
22
+ description: null
23
+ status: pending
24
+ tags: []
25
+ priority: null
26
+
27
+ research_context:
28
+ research_type: "technical | requirements | literature | mixed"
29
+ research_question: null
30
+ scope:
31
+ included: []
32
+ excluded: []
33
+ constraints: []
34
+ methodology: []
35
+ sources: []
36
+ confidence_level: "high | medium | low"
37
+ gathering_strategy:
38
+ categories: []
39
+ count: 0
40
+ source: "planner | default"
41
+ phase_summaries:
42
+ phase-1:
43
+ summary: null
44
+ steps_completed: []
45
+ phase-3:
46
+ summary: null
47
+ phase-4:
48
+ summary: null
49
+ decision_areas: []
50
+ deferred_ideas: []
51
+ phase-5:
52
+ summary: null
53
+ architecture_style: null
54
+ decisions_count: 0
55
+
56
+ research_outputs:
57
+ research_report: null
58
+ findings_directory: null
59
+ solution_exploration: null
60
+ high_level_design: null
61
+ decision_log: null
@@ -0,0 +1,10 @@
1
+ command: quick-bugfix
2
+ title: "Short title from bug description"
3
+ description: "Full bug description as provided by user"
4
+ status: in_progress
5
+ created: "YYYY-MM-DDTHH:MM:SSZ"
6
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
7
+ task_path: .owflow/tasks/quick-bugfix/YYYY-MM-DD-task-name
8
+ escalated_to: null
9
+ escalation_reason: null
10
+ standards_applied: []
@@ -0,0 +1,10 @@
1
+ command: quick-dev
2
+ title: "Short title from task description"
3
+ description: "Full task description as provided by user"
4
+ status: in_progress
5
+ created: "YYYY-MM-DDTHH:MM:SSZ"
6
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
7
+ task_path: .owflow/tasks/quick-dev/YYYY-MM-DD-task-name
8
+ escalated_to: null
9
+ escalation_reason: null
10
+ standards_applied: []
@@ -0,0 +1,11 @@
1
+ command: quick-plan
2
+ title: "Short title from task description"
3
+ description: "Full task description as provided by user"
4
+ status: in_progress
5
+ created: "YYYY-MM-DDTHH:MM:SSZ"
6
+ updated: "YYYY-MM-DDTHH:MM:SSZ"
7
+ task_path: .owflow/tasks/quick-plan/YYYY-MM-DD-task-name
8
+ escalated_to: null
9
+ escalation_reason: null
10
+ standards_applied: []
11
+ plan_path: null
@@ -0,0 +1,61 @@
1
+ import { tool } from "@opencode-ai/plugin";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import yaml from "yaml";
5
+ import { fileURLToPath } from "node:url";
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ export const verify_template = tool({
8
+ description: "Check if file in the given path exists and follows correct YAML structure by checking against the template file from /templates.",
9
+ args: {
10
+ filePath: tool.schema.string().describe("Path to the file to check"),
11
+ templateName: tool.schema.string().describe("Name of the template from /templates (e.g. orchestrator-state-development.yml)"),
12
+ },
13
+ async execute({ filePath, templateName }, context) {
14
+ const absolutePath = path.resolve(context.directory, filePath);
15
+ if (!fs.existsSync(absolutePath)) {
16
+ return { output: `File not found at ${filePath}. Hint: Double-check the path, create the file if it's missing, or verify you are in the correct directory.` };
17
+ }
18
+ const templatePath = path.join(__dirname, "../templates", templateName);
19
+ if (!fs.existsSync(templatePath)) {
20
+ return { output: `Template '${templateName}' not found. Hint: Verify the template name is correct and exists in the /templates folder (e.g., 'orchestrator-state-development.yml').` };
21
+ }
22
+ let targetYaml;
23
+ try {
24
+ const fileContent = fs.readFileSync(absolutePath, "utf8");
25
+ targetYaml = yaml.parse(fileContent);
26
+ }
27
+ catch (error) {
28
+ return { output: `YAML Syntax Error in ${filePath}: ${error.message}. Hint: Check the file content for invalid YAML formatting, such as incorrect indentation or unescaped strings, and fix them.` };
29
+ }
30
+ let templateYaml;
31
+ try {
32
+ const templateContent = fs.readFileSync(templatePath, "utf8");
33
+ templateYaml = yaml.parse(templateContent);
34
+ }
35
+ catch (error) {
36
+ return { output: `Internal Error: Failed to parse reference template YAML '${templateName}': ${error.message}. Hint: The template file itself contains invalid YAML syntax.` };
37
+ }
38
+ function checkStructure(templateObj, targetObj, currentPath = "") {
39
+ let errors = [];
40
+ if (typeof templateObj !== 'object' || templateObj === null) {
41
+ return errors;
42
+ }
43
+ for (const key of Object.keys(templateObj)) {
44
+ const newPath = currentPath ? `${currentPath}.${key}` : key;
45
+ if (typeof targetObj !== 'object' || targetObj === null || !(key in targetObj)) {
46
+ errors.push(`Missing key: ${newPath}`);
47
+ continue;
48
+ }
49
+ if (typeof templateObj[key] === 'object' && templateObj[key] !== null && !Array.isArray(templateObj[key])) {
50
+ errors.push(...checkStructure(templateObj[key], targetObj[key], newPath));
51
+ }
52
+ }
53
+ return errors;
54
+ }
55
+ const errors = checkStructure(templateYaml, targetYaml);
56
+ if (errors.length > 0) {
57
+ return { output: `YAML Structure Validation Failed. Your file is missing the following required keys:\n- ${errors.join("\n- ")}\n\nHint: Update the file at ${filePath} to include these missing keys so it matches the structure of '${templateName}'.` };
58
+ }
59
+ return { output: "File exists and follows the correct YAML structure." };
60
+ }
61
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "owflow",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Spec-driven development AI workflow for OpenCode",
5
5
  "type": "module",
6
6
  "module": "index.ts",
@@ -12,9 +12,10 @@
12
12
  "LICENSE"
13
13
  ],
14
14
  "scripts": {
15
- "build": "rm -rf dist && tsc && npm run copy-markdowns",
15
+ "build": "rm -rf dist && tsc && bun run copy-markdowns",
16
16
  "copy-markdowns": "node ./scripts/copy-markdowns.js",
17
- "prepack": "npm run build"
17
+ "prepack": "bun run build",
18
+ "test": "bun test"
18
19
  },
19
20
  "keywords": [
20
21
  "opencode",