owflow 0.1.4 → 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 (42) 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/diagrams-mermaid.md +37 -0
  5. package/dist/commands/html-renderer.md +37 -0
  6. package/dist/commands/quick-dev.md +48 -6
  7. package/dist/commands/quick-plan.md +39 -4
  8. package/dist/commands/work.md +13 -17
  9. package/dist/index.js +4 -0
  10. package/dist/skills/development/SKILL.md +98 -115
  11. package/dist/skills/diagrams-mermaid/SKILL.md +156 -0
  12. package/dist/skills/diagrams-mermaid/references/reference.md +148 -0
  13. package/dist/skills/flow-init/SKILL.md +15 -0
  14. package/dist/skills/html-renderer/SKILL.md +159 -0
  15. package/dist/skills/html-renderer/references/index.html +318 -0
  16. package/dist/skills/html-renderer/references/styles.css +388 -0
  17. package/dist/skills/html-renderer/references/tokens.json +104 -0
  18. package/dist/skills/migration/SKILL.md +14 -33
  19. package/dist/skills/orchestrator-framework/references/orchestrator-creation-checklist.md +1 -0
  20. package/dist/skills/orchestrator-framework/references/orchestrator-patterns.md +4 -59
  21. package/dist/skills/performance/SKILL.md +14 -30
  22. package/dist/skills/quick-bugfix/SKILL.md +96 -26
  23. package/dist/skills/research/SKILL.md +11 -42
  24. package/dist/templates/orchestrator-state-base.yml +17 -0
  25. package/dist/templates/orchestrator-state-development.yml +94 -0
  26. package/dist/templates/orchestrator-state-migration.yml +55 -0
  27. package/dist/templates/orchestrator-state-performance.yml +53 -0
  28. package/dist/templates/orchestrator-state-research.yml +61 -0
  29. package/dist/templates/quick-bugfix-task.yml +10 -0
  30. package/dist/templates/quick-dev-task.yml +10 -0
  31. package/dist/templates/quick-plan-task.yml +11 -0
  32. package/dist/tools/verify_template.js +61 -0
  33. package/package.json +4 -3
  34. package/dist/agents/ui-mockup-generator.md +0 -369
  35. package/dist/commands/product-design.md +0 -37
  36. package/dist/skills/product-design/SKILL.md +0 -843
  37. package/dist/skills/product-design/references/characteristic-detection.md +0 -92
  38. package/dist/skills/product-design/references/interaction-patterns.md +0 -206
  39. package/dist/skills/product-design/references/visual-companion.md +0 -190
  40. package/dist/skills/product-design/server/index.js +0 -302
  41. package/dist/skills/product-design/server/index.ts +0 -359
  42. 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>