owflow 0.1.5 → 0.1.7

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 +5 -4
  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
@@ -1,256 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>{{TITLE}} — Product Design</title>
7
- <style>
8
- *, *::before, *::after { box-sizing: border-box; }
9
- body {
10
- margin: 0;
11
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
12
- background: #f5f5f5;
13
- color: #222;
14
- }
15
- header {
16
- display: flex;
17
- align-items: center;
18
- justify-content: space-between;
19
- padding: 0.75rem 1.5rem;
20
- background: #fff;
21
- border-bottom: 1px solid #ddd;
22
- }
23
- header h1 { margin: 0; font-size: 1.1rem; font-weight: 600; }
24
- #status { font-size: 0.8rem; color: #4a4; font-weight: 500; }
25
- #status.disconnected { color: #a44; }
26
-
27
- /* Screen navigation */
28
- .screen-nav {
29
- background: #fafafa;
30
- border-bottom: 1px solid #e0e0e0;
31
- padding: 0.5rem 1.5rem;
32
- }
33
- .nav-screens {
34
- display: flex;
35
- gap: 0.25rem;
36
- flex-wrap: wrap;
37
- margin-bottom: 0.25rem;
38
- }
39
- .nav-screen {
40
- padding: 0.3rem 0.7rem;
41
- border-radius: 4px;
42
- text-decoration: none;
43
- color: #555;
44
- font-size: 0.8rem;
45
- background: #eee;
46
- transition: background 0.15s;
47
- }
48
- .nav-screen:hover { background: #ddd; }
49
- .nav-screen.active { background: #333; color: #fff; }
50
- .nav-prevnext {
51
- display: flex;
52
- justify-content: space-between;
53
- margin-top: 0.25rem;
54
- }
55
- .nav-arrow {
56
- font-size: 0.8rem;
57
- color: #0066cc;
58
- text-decoration: none;
59
- }
60
- .nav-arrow:hover { text-decoration: underline; }
61
-
62
- /* Gallery */
63
- .gallery-grid {
64
- display: grid;
65
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
66
- gap: 1.5rem;
67
- padding: 1rem 0;
68
- }
69
- .gallery-card {
70
- display: block;
71
- background: #fff;
72
- border: 1px solid #e0e0e0;
73
- border-radius: 6px;
74
- overflow: hidden;
75
- text-decoration: none;
76
- color: inherit;
77
- transition: box-shadow 0.2s, transform 0.15s;
78
- }
79
- .gallery-card:hover {
80
- box-shadow: 0 4px 12px rgba(0,0,0,0.1);
81
- transform: translateY(-2px);
82
- }
83
- .gallery-card-title {
84
- padding: 0.75rem 1rem;
85
- font-weight: 600;
86
- font-size: 0.9rem;
87
- border-bottom: 1px solid #eee;
88
- background: #fafafa;
89
- }
90
- .gallery-card-preview {
91
- padding: 1rem;
92
- max-height: 200px;
93
- overflow: hidden;
94
- position: relative;
95
- font-size: 0.7rem;
96
- transform: scale(0.8);
97
- transform-origin: top left;
98
- pointer-events: none;
99
- }
100
- .gallery-card-preview::after {
101
- content: '';
102
- position: absolute;
103
- bottom: 0;
104
- left: 0;
105
- right: 0;
106
- height: 60px;
107
- background: linear-gradient(transparent, white);
108
- }
109
-
110
- /* Mockup content */
111
- main {
112
- max-width: 1200px;
113
- margin: 1.5rem auto;
114
- padding: 1.5rem;
115
- background: #fff;
116
- border: 1px solid #e0e0e0;
117
- border-radius: 4px;
118
- min-height: 300px;
119
- position: relative;
120
- }
121
- .placeholder {
122
- display: flex;
123
- align-items: center;
124
- justify-content: center;
125
- min-height: 300px;
126
- color: #999;
127
- font-size: 1rem;
128
- text-align: center;
129
- line-height: 1.8;
130
- }
131
- .annotation-tooltip {
132
- position: absolute;
133
- background: rgba(0, 0, 0, 0.75);
134
- color: #fff;
135
- font-size: 0.75rem;
136
- padding: 4px 8px;
137
- border-radius: 3px;
138
- pointer-events: none;
139
- max-width: 250px;
140
- z-index: 1000;
141
- line-height: 1.3;
142
- }
143
- .annotation-tooltip::before {
144
- content: '';
145
- position: absolute;
146
- top: -4px;
147
- left: 10px;
148
- width: 8px;
149
- height: 8px;
150
- background: rgba(0, 0, 0, 0.75);
151
- transform: rotate(45deg);
152
- }
153
-
154
- /* Interactive screen-to-screen navigation */
155
- [data-screen] { cursor: pointer; }
156
- [data-screen]:hover { outline: 2px solid #0066cc; outline-offset: 2px; border-radius: 2px; }
157
-
158
- /* Annotation toggle */
159
- .annotations-hidden .annotation-tooltip { display: none; }
160
- #annotation-toggle {
161
- font-size: 0.8rem;
162
- padding: 0.25rem 0.6rem;
163
- border: 1px solid #ccc;
164
- border-radius: 3px;
165
- background: #f0f0f0;
166
- cursor: pointer;
167
- margin-left: 0.75rem;
168
- }
169
- #annotation-toggle:hover { background: #e0e0e0; }
170
- #annotation-toggle.active { background: #333; color: #fff; border-color: #333; }
171
- </style>
172
- </head>
173
- <body>
174
- <header>
175
- <h1>{{TITLE}}</h1>
176
- <div>
177
- <button id="annotation-toggle" class="active" title="Toggle annotation tooltips">Annotations</button>
178
- <span id="status">Connected</span>
179
- </div>
180
- </header>
181
-
182
- {{NAV}}
183
-
184
- <main id="mockup-container">
185
- {{CONTENT}}
186
- </main>
187
-
188
- <script>
189
- // SSE client for live refresh — navigates to /latest on new screen
190
- const statusEl = document.getElementById('status');
191
- const evtSource = new EventSource('/events');
192
- evtSource.onmessage = function(e) {
193
- if (e.data === 'refresh') window.location.href = '/latest';
194
- };
195
- evtSource.onopen = function() {
196
- statusEl.textContent = 'Connected';
197
- statusEl.className = '';
198
- };
199
- evtSource.onerror = function() {
200
- statusEl.textContent = 'Reconnecting...';
201
- statusEl.className = 'disconnected';
202
- };
203
-
204
- // Annotation overlay rendering
205
- const annotations = {{ANNOTATIONS}};
206
- function renderAnnotations() {
207
- const container = document.getElementById('mockup-container');
208
- annotations.forEach(function(ann) {
209
- if (!ann.selector) return;
210
- const target = container.querySelector(ann.selector);
211
- if (!target) return;
212
- const text = ann.note || ann.text || '';
213
- if (!text) return;
214
- const rect = target.getBoundingClientRect();
215
- const containerRect = container.getBoundingClientRect();
216
- const tooltip = document.createElement('div');
217
- tooltip.className = 'annotation-tooltip';
218
- tooltip.textContent = text;
219
- tooltip.style.top = (rect.bottom - containerRect.top + 6) + 'px';
220
- tooltip.style.left = (rect.left - containerRect.left) + 'px';
221
- container.appendChild(tooltip);
222
- });
223
- }
224
- if (annotations.length > 0) requestAnimationFrame(renderAnnotations);
225
-
226
- // Annotation toggle with localStorage persistence
227
- var toggleBtn = document.getElementById('annotation-toggle');
228
- var container = document.getElementById('mockup-container');
229
- var annotationsVisible = localStorage.getItem('annotations-visible') !== 'false'; // default: true
230
- function updateToggle() {
231
- if (annotationsVisible) {
232
- container.classList.remove('annotations-hidden');
233
- toggleBtn.classList.add('active');
234
- } else {
235
- container.classList.add('annotations-hidden');
236
- toggleBtn.classList.remove('active');
237
- }
238
- }
239
- updateToggle();
240
- toggleBtn.addEventListener('click', function() {
241
- annotationsVisible = !annotationsVisible;
242
- localStorage.setItem('annotations-visible', annotationsVisible);
243
- updateToggle();
244
- });
245
-
246
- // Screen-to-screen navigation: clicking elements with data-screen="slug" navigates to that screen
247
- document.getElementById('mockup-container').addEventListener('click', function(e) {
248
- var target = e.target.closest('[data-screen]');
249
- if (target) {
250
- e.preventDefault();
251
- window.location.href = '/screen/' + target.getAttribute('data-screen');
252
- }
253
- });
254
- </script>
255
- </body>
256
- </html>