speccrew 0.6.43 → 0.6.45

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.
@@ -70,24 +70,37 @@ Extract and aggregate **UI design patterns** from bizs pipeline analyzed feature
70
70
 
71
71
  > **REQUIRED**: Before executing this workflow, read the XML workflow specification: `docs/rules/xml-workflow-spec.md`
72
72
 
73
- <workflow>
74
-
75
- <!-- Input Block -->
76
- <input name="platform_id" type="string" required="true" description="Platform identifier (e.g., web-vue, mobile-uniapp)" />
77
- <input name="platform_type" type="string" required="true" description="Platform type (web, mobile, desktop)" />
78
- <input name="feature_docs_path" type="string" required="true" description="Completed feature documents base path" />
79
- <input name="features_manifest_path" type="string" required="true" description="Path to features-{platform}.json" />
80
- <input name="module_overviews_path" type="string" required="true" description="Parent directory containing all module overview subdirectories" />
81
- <input name="output_path" type="string" required="true" description="Output directory for pattern documents" />
82
- <input name="language" type="string" required="true" description="User language code" />
83
-
84
- <!-- Rule Block: Absolute Constraints -->
85
- <rule level="forbidden">Using `create_file` to write pattern documents directly</rule>
86
- <rule level="forbidden">Full-file rewrite of pattern documents</rule>
87
- <rule level="mandatory">Copy template MUST execute before filling sections for every pattern document</rule>
88
- <rule level="mandatory">All generated pattern documents must be in the specified language</rule>
89
-
90
- <!-- ==================== GLOBAL CONTINUOUS EXECUTION RULES ==================== -->
73
+ <workflow id="ui-style-extract-main" status="pending" version="1.0" desc="Extract and aggregate UI design patterns from feature documents">
74
+
75
+ <!-- ============================================================
76
+ Input Parameters Definition
77
+ ============================================================ -->
78
+ <block type="input" id="I1" desc="Workflow input parameters">
79
+ <field name="platform_id" required="true" type="string" desc="Platform identifier (e.g., web-vue, mobile-uniapp)"/>
80
+ <field name="platform_type" required="true" type="string" desc="Platform type (web, mobile, desktop)"/>
81
+ <field name="feature_docs_path" required="true" type="string" desc="Completed feature documents base path"/>
82
+ <field name="features_manifest_path" required="true" type="string" desc="Path to features-{platform}.json"/>
83
+ <field name="module_overviews_path" required="true" type="string" desc="Parent directory containing all module overview subdirectories"/>
84
+ <field name="output_path" required="true" type="string" desc="Output directory for pattern documents"/>
85
+ <field name="language" required="true" type="string" desc="User language code"/>
86
+ </block>
87
+
88
+ <!-- ============================================================
89
+ Global Constraints
90
+ ============================================================ -->
91
+ <block type="rule" id="R1" level="forbidden" desc="Document generation constraints">
92
+ <field name="text">Using create_file to write pattern documents directly</field>
93
+ <field name="text">Full-file rewrite of pattern documents</field>
94
+ </block>
95
+
96
+ <block type="rule" id="R2" level="mandatory" desc="Document generation requirements">
97
+ <field name="text">Copy template MUST execute before filling sections for every pattern document</field>
98
+ <field name="text">All generated pattern documents must be in the specified language</field>
99
+ </block>
100
+
101
+ <!-- ============================================================
102
+ Global Continuous Execution Rules
103
+ ============================================================ -->
91
104
  <block type="rule" id="GLOBAL-R1" level="forbidden" desc="Continuous execution constraints — NEVER violate">
92
105
  <field name="text">DO NOT ask user "Should I continue?" or "How would you like to proceed?" during execution</field>
93
106
  <field name="text">DO NOT offer options like "Full execution / Partial / Stop" — always execute ALL tasks to completion</field>
@@ -97,219 +110,218 @@ Extract and aggregate **UI design patterns** from bizs pipeline analyzed feature
97
110
  <field name="text">Context window management: if approaching limit, save progress to checkpoint file and resume — do NOT ask user for guidance</field>
98
111
  </block>
99
112
 
100
- <!-- Gateway: Platform Type Check -->
101
- <gateway mode="exclusive">
102
- <branch condition="platform_type NOT IN ['web', 'mobile', 'desktop']">
103
- <event action="log">Skipping skill: backend platforms do not have UI patterns</event>
104
- <output name="skip_reason" value="Backend platform - no UI patterns" />
105
- <task name="return-skip" action="run-skill">
106
- <return>
107
- <status>skipped</status>
108
- <reason>Backend platform does not have UI patterns</reason>
109
- </return>
110
- </task>
113
+ <!-- ============================================================
114
+ Gateway: Platform Type Check
115
+ ============================================================ -->
116
+ <block type="gateway" id="G1" mode="exclusive" desc="Check platform type for UI pattern extraction">
117
+ <branch test="${platform_type} NOT IN ['web', 'mobile', 'desktop']" name="Backend platform">
118
+ <block type="event" id="E1" action="log" level="info" desc="Log skip reason">Skipping skill: backend platforms do not have UI patterns</block>
119
+ <block type="task" id="B1" action="analyze" desc="Return skip status">
120
+ <field name="status" value="skipped"/>
121
+ <field name="reason" value="Backend platform does not have UI patterns"/>
122
+ <field name="output" var="summary"/>
123
+ </block>
111
124
  </branch>
112
- <branch condition="platform_type IN ['web', 'mobile', 'desktop']">
113
-
114
- <!-- Step 1: Load Features Manifest -->
115
- <task name="load-features-manifest" action="run-script">
116
- <description>Read the features manifest to identify all completed features</description>
117
- <validation>
118
- <rule>Verify features_manifest_path exists and is valid JSON</rule>
119
- <rule>Verify feature_docs_path exists and is a directory</rule>
120
- </validation>
121
- <script type="read-file">
122
- <path>{features_manifest_path}</path>
123
- </script>
124
- <filter>status === "completed"</filter>
125
- <collect>featureId, module, documentPath</collect>
126
- <output name="completed_features" />
127
- </task>
128
-
129
- <!-- Gateway: Check Completed Features -->
130
- <gateway mode="guard">
131
- <condition>completed_features.length > 0</condition>
132
- <then>
133
-
134
- <!-- Create Output Directory -->
135
- <task name="create-output-dirs" action="run-script">
136
- <description>Create output directory structure if it does not exist</description>
137
- <create-directories>
138
- <path>{output_path}/page-types/</path>
139
- <path>{output_path}/components/</path>
140
- <path>{output_path}/layouts/</path>
141
- </create-directories>
142
- </task>
143
-
144
- <!-- Step 2: Read Feature Documents -->
145
- <task name="read-feature-docs" action="run-skill">
146
- <description>Extract UI-related information from all completed feature documents</description>
147
- <input ref="completed_features" />
148
- <input ref="feature_docs_path" />
149
- <extraction>
150
- <section name="Interface Prototype">
151
- <extract>ASCII wireframe diagrams, layout regions</extract>
152
- </section>
153
- <section name="Page Elements Table">
154
- <extract>Component names, types, responsibilities, interactions</extract>
155
- </section>
156
- <section name="Business Flow Description">
157
- <extract>User interaction sequences, navigation patterns</extract>
158
- </section>
159
- </extraction>
160
- <output name="ui_extracted_data" />
161
- </task>
162
-
163
- <!-- Step 3: Read Module Overviews -->
164
- <task name="read-module-overviews" action="run-script">
165
- <description>Gather module-level aggregated information for context</description>
166
- <input ref="module_overviews_path" />
167
- <script type="glob">
168
- <pattern>{module_overviews_path}/*/module-overview.md</pattern>
169
- </script>
170
- <extraction>
171
- <item>Common page structures</item>
172
- <item>Shared components</item>
173
- <item>Navigation patterns</item>
174
- </extraction>
175
- <output name="module_context" />
176
- </task>
125
+ <branch test="${platform_type} IN ['web', 'mobile', 'desktop']" name="UI platform">
126
+
127
+ <!-- ============================================================
128
+ Step 1: Load Features Manifest
129
+ ============================================================ -->
130
+ <sequence id="S1" name="Step 1: Load Features Manifest" status="pending" desc="Read features manifest to identify completed features">
131
+ <block type="task" id="B2" action="read-file" desc="Read features manifest file">
132
+ <field name="path" value="${features_manifest_path}"/>
133
+ <field name="output" var="featuresManifest"/>
134
+ </block>
135
+
136
+ <block type="task" id="B3" action="analyze" desc="Filter completed features">
137
+ <field name="input" value="${featuresManifest}"/>
138
+ <field name="filter" value="status === 'completed'"/>
139
+ <field name="collect" value="featureId, module, documentPath"/>
140
+ <field name="output" var="completed_features"/>
141
+ </block>
142
+ </sequence>
143
+
144
+ <!-- ============================================================
145
+ Gateway: Check Completed Features
146
+ ============================================================ -->
147
+ <block type="gateway" id="G2" mode="guard" desc="Check if completed features exist">
148
+ <branch test="${completed_features.length} > 0" name="Has completed features">
149
+
150
+ <!-- Step 1.5: Create Output Directory -->
151
+ <block type="task" id="B4" action="run-script" desc="Create output directory structure">
152
+ <field name="command">node -e "require('fs').mkdirSync('${output_path}/page-types', {recursive:true}); require('fs').mkdirSync('${output_path}/components', {recursive:true}); require('fs').mkdirSync('${output_path}/layouts', {recursive:true})"</field>
153
+ </block>
154
+
155
+ <!-- ============================================================
156
+ Step 2: Read Feature Documents
157
+ ============================================================ -->
158
+ <sequence id="S2" name="Step 2: Read Feature Documents" status="pending" desc="Extract UI information from feature documents">
159
+ <block type="task" id="B5" action="analyze" desc="Extract UI-related information from feature documents">
160
+ <field name="input" value="${completed_features}"/>
161
+ <field name="feature_docs_path" value="${feature_docs_path}"/>
162
+ <field name="extract_section" value="Interface Prototype"/>
163
+ <field name="extract_items" value="ASCII wireframe diagrams, layout regions"/>
164
+ <field name="extract_section_2" value="Page Elements Table"/>
165
+ <field name="extract_items_2" value="Component names, types, responsibilities, interactions"/>
166
+ <field name="extract_section_3" value="Business Flow Description"/>
167
+ <field name="extract_items_3" value="User interaction sequences, navigation patterns"/>
168
+ <field name="output" var="ui_extracted_data"/>
169
+ </block>
170
+ </sequence>
171
+
172
+ <!-- ============================================================
173
+ Step 3: Read Module Overviews
174
+ ============================================================ -->
175
+ <sequence id="S3" name="Step 3: Read Module Overviews" status="pending" desc="Gather module-level context">
176
+ <block type="task" id="B6" action="analyze" desc="Read module overview files for context">
177
+ <field name="glob_pattern" value="${module_overviews_path}/*/module-overview.md"/>
178
+ <field name="extract_items" value="Common page structures, Shared components, Navigation patterns"/>
179
+ <field name="output" var="module_context"/>
180
+ </block>
181
+ </sequence>
177
182
 
178
183
  <!-- Checkpoint: Data Collection Complete -->
179
- <checkpoint name="data-collection-complete" verify="ui_extracted_data is not empty AND module_context is not empty" />
180
-
181
- <!-- Step 4: Cross-Module Clustering Analysis -->
182
- <task name="cross-module-clustering" action="run-skill">
183
- <description>Identify recurring UI patterns across modules through clustering analysis</description>
184
- <input ref="ui_extracted_data" />
185
- <input ref="module_context" />
186
- <clustering-strategy>
187
- <approach>Dynamic discovery - Agent automatically identifies and categorizes pattern types based on actual analysis results</approach>
188
- <note>Templates only standardize output format, do not limit pattern types</note>
189
- </clustering-strategy>
190
- <categories>
191
- <page-types>Pages with similar structure and purpose (e.g., list-page, form-page, detail-page, tree-list-page, dashboard-page, wizard-page)</page-types>
192
- <component-patterns>Reusable component combinations (e.g., search-filter-bar, data-table-pagination, modal-form, drawer-detail, tab-panel)</component-patterns>
193
- <layout-patterns>Repeating structural layouts (e.g., sidebar-content, topbar-sidebar-content, full-screen)</layout-patterns>
194
- </categories>
195
- <recognition-criteria>
196
- <frequency>Pattern appears in 2+ features (stronger signal if across different modules)</frequency>
197
- <similarity>Structural similarity in ASCII wireframes</similarity>
198
- <semantic-alignment>Similar business purpose and interaction flow</semantic-alignment>
199
- </recognition-criteria>
200
- <note>Cross-module occurrence is a strong signal but not required. Patterns appearing in multiple features within a single module are also valid for extraction.</note>
201
- <output name="identified_patterns" />
202
- </task>
203
-
204
- <!-- Gateway: Check Identified Patterns -->
205
- <gateway mode="exclusive">
206
- <branch condition="identified_patterns.length == 0">
207
- <event action="log">No patterns identified from feature documents</event>
208
- <output name="patterns" value="{}" />
184
+ <block type="checkpoint" id="CP1" name="data-collection-complete" desc="Data collection complete">
185
+ <field name="file" value="${output_path}/.progress.json"/>
186
+ <field name="verify" value="${ui_extracted_data} != null AND ${module_context} != null"/>
187
+ </block>
188
+
189
+ <!-- ============================================================
190
+ Step 4: Cross-Module Clustering Analysis
191
+ ============================================================ -->
192
+ <sequence id="S4" name="Step 4: Cross-Module Clustering Analysis" status="pending" desc="Identify recurring UI patterns">
193
+ <block type="task" id="B7" action="analyze" desc="Perform cross-module clustering analysis">
194
+ <field name="input" value="${ui_extracted_data}"/>
195
+ <field name="module_context" value="${module_context}"/>
196
+ <field name="clustering_approach" value="Dynamic discovery - Agent automatically identifies and categorizes pattern types based on actual analysis results"/>
197
+ <field name="note" value="Templates only standardize output format, do not limit pattern types"/>
198
+ <field name="categories_page_types" value="Pages with similar structure and purpose (e.g., list-page, form-page, detail-page, tree-list-page, dashboard-page, wizard-page)"/>
199
+ <field name="categories_component_patterns" value="Reusable component combinations (e.g., search-filter-bar, data-table-pagination, modal-form, drawer-detail, tab-panel)"/>
200
+ <field name="categories_layout_patterns" value="Repeating structural layouts (e.g., sidebar-content, topbar-sidebar-content, full-screen)"/>
201
+ <field name="recognition_frequency" value="Pattern appears in 2+ features (stronger signal if across different modules)"/>
202
+ <field name="recognition_similarity" value="Structural similarity in ASCII wireframes"/>
203
+ <field name="recognition_semantic" value="Similar business purpose and interaction flow"/>
204
+ <field name="output" var="identified_patterns"/>
205
+ </block>
206
+ </sequence>
207
+
208
+ <!-- ============================================================
209
+ Gateway: Check Identified Patterns
210
+ ============================================================ -->
211
+ <block type="gateway" id="G3" mode="exclusive" desc="Check if patterns were identified">
212
+ <branch test="${identified_patterns.length} == 0" name="No patterns">
213
+ <block type="event" id="E2" action="log" level="warn" desc="Log no patterns">No patterns identified from feature documents</block>
214
+ <block type="task" id="B8" action="analyze" desc="Return empty result">
215
+ <field name="status" value="completed"/>
216
+ <field name="platform_id" value="${platform_id}"/>
217
+ <field name="patterns_page_types" value='{"count": 0, "files": []}'/>
218
+ <field name="patterns_components" value='{"count": 0, "files": []}'/>
219
+ <field name="patterns_layouts" value='{"count": 0, "files": []}'/>
220
+ <field name="total_patterns" value="0"/>
221
+ <field name="output_path" value="${output_path}"/>
222
+ <field name="output" var="summary"/>
223
+ </block>
209
224
  </branch>
210
- <branch condition="identified_patterns.length > 0">
225
+ <branch test="${identified_patterns.length} > 0" name="Has patterns">
211
226
 
212
- <!-- Step 5: Generate Pattern Documents -->
213
- <loop over="identified_patterns" as="pattern">
227
+ <!-- ============================================================
228
+ Step 5: Generate Pattern Documents
229
+ ============================================================ -->
230
+ <block type="loop" id="L1" over="${identified_patterns}" as="pattern" desc="Generate pattern documents">
214
231
 
215
232
  <!-- 5.1 Template Selection -->
216
- <gateway mode="exclusive">
217
- <branch condition="pattern.category == 'page-types'">
218
- <task name="select-page-template" action="run-script">
219
- <template-path>../speccrew-knowledge-bizs-ui-style-extract/templates/PAGE-TYPE-TEMPLATE.md</template-path>
220
- <output-directory>{output_path}/page-types/</output-directory>
221
- <output name="selected_template" />
222
- </task>
233
+ <block type="gateway" id="G4" mode="exclusive" desc="Select template based on pattern category">
234
+ <branch test="${pattern.category} == 'page-types'" name="Page type">
235
+ <block type="task" id="B9" action="analyze" desc="Select page type template">
236
+ <field name="template_path" value="../speccrew-knowledge-bizs-ui-style-extract/templates/PAGE-TYPE-TEMPLATE.md"/>
237
+ <field name="output_directory" value="${output_path}/page-types/"/>
238
+ <field name="output" var="selected_template"/>
239
+ </block>
223
240
  </branch>
224
- <branch condition="pattern.category == 'components'">
225
- <task name="select-component-template" action="run-script">
226
- <template-path>../speccrew-knowledge-bizs-ui-style-extract/templates/COMPONENT-PATTERN-TEMPLATE.md</template-path>
227
- <output-directory>{output_path}/components/</output-directory>
228
- <output name="selected_template" />
229
- </task>
241
+ <branch test="${pattern.category} == 'components'" name="Component pattern">
242
+ <block type="task" id="B10" action="analyze" desc="Select component pattern template">
243
+ <field name="template_path" value="../speccrew-knowledge-bizs-ui-style-extract/templates/COMPONENT-PATTERN-TEMPLATE.md"/>
244
+ <field name="output_directory" value="${output_path}/components/"/>
245
+ <field name="output" var="selected_template"/>
246
+ </block>
230
247
  </branch>
231
- <branch condition="pattern.category == 'layouts'">
232
- <task name="select-layout-template" action="run-script">
233
- <template-path>../speccrew-knowledge-bizs-ui-style-extract/templates/LAYOUT-PATTERN-TEMPLATE.md</template-path>
234
- <output-directory>{output_path}/layouts/</output-directory>
235
- <output name="selected_template" />
236
- </task>
248
+ <branch test="${pattern.category} == 'layouts'" name="Layout pattern">
249
+ <block type="task" id="B11" action="analyze" desc="Select layout pattern template">
250
+ <field name="template_path" value="../speccrew-knowledge-bizs-ui-style-extract/templates/LAYOUT-PATTERN-TEMPLATE.md"/>
251
+ <field name="output_directory" value="${output_path}/layouts/"/>
252
+ <field name="output" var="selected_template"/>
253
+ </block>
237
254
  </branch>
238
- </gateway>
255
+ </block>
239
256
 
240
257
  <!-- 5.2 Copy Template to Document Path -->
241
- <task name="copy-template" action="run-script">
242
- <description>Copy template to output path with kebab-case filename</description>
243
- <input ref="selected_template" />
244
- <filename-format>kebab-case (e.g., list-page.md, search-filter-bar.md, sidebar-content.md)</filename-format>
245
- <output-path>{selected_template.output-directory}/{pattern.name}.md</output-path>
246
- <output name="document_path" />
247
- </task>
258
+ <block type="task" id="B12" action="run-script" desc="Copy template to output path">
259
+ <field name="template" value="${selected_template}"/>
260
+ <field name="filename_format" value="kebab-case (e.g., list-page.md, search-filter-bar.md, sidebar-content.md)"/>
261
+ <field name="output_path" value="${selected_template.output_directory}/${pattern.name}.md"/>
262
+ <field name="output" var="document_path"/>
263
+ </block>
248
264
 
249
265
  <!-- 5.3 Fill Sections Using search_replace -->
250
- <task name="fill-pattern-document" action="run-skill">
251
- <description>Fill pattern document sections using search_replace</description>
252
- <input ref="document_path" />
253
- <input ref="pattern" />
254
- <input ref="language" />
255
- <constraints>
256
- <rule level="forbidden">Using create_file to rewrite the entire document</rule>
257
- <rule level="mandatory">Use search_replace to fill each section individually</rule>
258
- <rule level="mandatory">All section titles MUST be preserved</rule>
259
- </constraints>
260
- <content-requirements>
261
- <ascii-wireframes>Must be generalized versions (not direct copies from specific features)</ascii-wireframes>
262
- <instance-references>Must use relative paths to reference actual feature documents</instance-references>
263
- <mermaid-diagrams>
264
- <rule>Follow speccrew-workspace/docs/rules/mermaid-rule.md rules</rule>
265
- <rule>Use graph TB/LR syntax only</rule>
266
- <rule>No br/ tags, no style definitions, no nested subgraph</rule>
267
- <rule>No direction keyword, no special symbols</rule>
268
- </mermaid-diagrams>
269
- </content-requirements>
270
- <output name="filled_document" />
271
- </task>
266
+ <block type="task" id="B13" action="analyze" desc="Fill pattern document sections">
267
+ <field name="document_path" value="${document_path}"/>
268
+ <field name="pattern" value="${pattern}"/>
269
+ <field name="language" value="${language}"/>
270
+ <field name="constraint_forbidden" value="Using create_file to rewrite the entire document"/>
271
+ <field name="constraint_mandatory" value="Use search_replace to fill each section individually"/>
272
+ <field name="constraint_sections" value="All section titles MUST be preserved"/>
273
+ <field name="content_ascii_wireframes" value="Must be generalized versions (not direct copies from specific features)"/>
274
+ <field name="content_instance_references" value="Must use relative paths to reference actual feature documents"/>
275
+ <field name="mermaid_rule" value="Follow speccrew-workspace/docs/rules/mermaid-rule.md rules"/>
276
+ <field name="mermaid_syntax" value="Use graph TB/LR syntax only"/>
277
+ <field name="mermaid_no_br" value="No br/ tags, no style definitions, no nested subgraph"/>
278
+ <field name="mermaid_no_direction" value="No direction keyword, no special symbols"/>
279
+ <field name="output" var="filled_document"/>
280
+ </block>
272
281
 
273
282
  <!-- Checkpoint: Pattern Document Generated -->
274
- <checkpoint name="pattern-document-generated" verify="file_exists({document_path}) AND document_has_all_sections({document_path})" />
283
+ <block type="checkpoint" id="CP2" name="pattern-document-generated" desc="Pattern document generated">
284
+ <field name="file" value="${output_path}/.progress.json"/>
285
+ <field name="verify" value="file_exists(${document_path}) AND document_has_all_sections(${document_path})"/>
286
+ </block>
287
+
288
+ </block>
275
289
 
276
- </loop>
290
+ <!-- Step 6: Return Summary -->
291
+ <block type="task" id="B14" action="analyze" desc="Generate summary of pattern documents">
292
+ <field name="collect_files" value="All generated file paths"/>
293
+ <field name="collect_counts" value="Pattern counts by category"/>
294
+ <field name="output" var="summary"/>
295
+ </block>
277
296
 
278
297
  </branch>
279
- </gateway>
280
-
281
- <!-- Step 6: Return Summary -->
282
- <task name="return-summary" action="run-skill">
283
- <description>Provide summary of generated pattern documents</description>
284
- <collect>
285
- <item>All generated file paths</item>
286
- <item>Pattern counts by category</item>
287
- </collect>
288
- <output name="summary" />
289
- </task>
290
-
291
- </then>
292
- <else>
293
- <event action="log">No completed features found - returning empty result</event>
294
- <output name="summary">
295
- <status>completed</status>
296
- <platform_id>{platform_id}</platform_id>
297
- <patterns>
298
- <page-types count="0" files="[]" />
299
- <components count="0" files="[]" />
300
- <layouts count="0" files="[]" />
301
- </patterns>
302
- <total_patterns>0</total_patterns>
303
- <output_path>{output_path}</output_path>
304
- </output>
305
- </else>
306
- </gateway>
298
+ </block>
299
+
300
+ </branch>
301
+ <branch test="${completed_features.length} == 0" name="No completed features">
302
+ <block type="event" id="E3" action="log" level="warn" desc="Log no features">No completed features found - returning empty result</block>
303
+ <block type="task" id="B15" action="analyze" desc="Return empty summary">
304
+ <field name="status" value="completed"/>
305
+ <field name="platform_id" value="${platform_id}"/>
306
+ <field name="patterns_page_types" value='{"count": 0, "files": []}'/>
307
+ <field name="patterns_components" value='{"count": 0, "files": []}'/>
308
+ <field name="patterns_layouts" value='{"count": 0, "files": []}'/>
309
+ <field name="total_patterns" value="0"/>
310
+ <field name="output_path" value="${output_path}"/>
311
+ <field name="output" var="summary"/>
312
+ </block>
313
+ </branch>
314
+ </block>
307
315
 
308
316
  </branch>
309
- </gateway>
317
+ </block>
310
318
 
311
- <!-- Output Block -->
312
- <output name="final_summary" from="summary" description="Summary of generated pattern documents with file list and counts" />
319
+ <!-- ============================================================
320
+ Output Results
321
+ ============================================================ -->
322
+ <block type="output" id="O1" desc="Workflow output results">
323
+ <field name="final_summary" from="${summary}" type="object" desc="Summary of generated pattern documents with file list and counts"/>
324
+ </block>
313
325
 
314
326
  </workflow>
315
327