speccrew 0.7.13 → 0.7.14
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/.speccrew/skills/speccrew-knowledge-bizs-dispatch/SKILL.md +18 -32
- package/.speccrew/skills/speccrew-knowledge-bizs-dispatch/workflow.agentflow.xml +17 -32
- package/.speccrew/skills/speccrew-knowledge-module-summarize/SKILL.md +0 -321
- package/.speccrew/skills/speccrew-test-case-design/SKILL.md +0 -161
- package/.speccrew/skills/speccrew-test-code-gen/SKILL.md +0 -200
- package/.speccrew/skills/speccrew-test-reporter/SKILL.md +0 -200
- package/.speccrew/skills/speccrew-test-runner/SKILL.md +0 -238
- package/package.json +1 -1
|
@@ -80,7 +80,8 @@ Stage 2: Feature Analysis (Batch Loop)
|
|
|
80
80
|
└─ Loop until all features complete
|
|
81
81
|
↓
|
|
82
82
|
Stage 3: Module Summarize
|
|
83
|
-
└─
|
|
83
|
+
└─ Step 1: Collect all platform-module pairs in one batch
|
|
84
|
+
└─ Step 2: Dispatch ALL module summary Workers in ONE parallel batch across ALL platforms
|
|
84
85
|
↓
|
|
85
86
|
Stage 3.5: UI Style Pattern Extract
|
|
86
87
|
└─ Extract UI style patterns for frontend platforms
|
|
@@ -696,55 +697,40 @@ Requirements:
|
|
|
696
697
|
<block type="rule" id="S3-R1" level="mandatory" desc="Stage 3 mandatory rules">
|
|
697
698
|
<field name="text">Worker dispatch is handled by the calling Agent (Team Leader). This Skill only prepares the task plan and parameters.</field>
|
|
698
699
|
<field name="text">ALL module summary workers MUST be dispatched IN PARALLEL — sequential execution is FORBIDDEN</field>
|
|
699
|
-
<field name="text">ALL Worker dispatch calls in S3-
|
|
700
|
+
<field name="text">ALL Worker dispatch calls in S3-L1 MUST be issued SIMULTANEOUSLY in a SINGLE orchestration turn</field>
|
|
700
701
|
<field name="text">DO NOT wait for any Worker to complete before dispatching the next Worker</field>
|
|
701
702
|
<field name="text">Dispatch all ${max_concurrent_workers} workers at once, then wait for ALL to complete</field>
|
|
702
703
|
<field name="text">Sequential one-by-one dispatch is STRICTLY FORBIDDEN</field>
|
|
703
704
|
<field name="text">Workers MUST NOT create any temporary scripts or workaround files</field>
|
|
704
705
|
</block>
|
|
705
706
|
|
|
706
|
-
<!-- Step 1:
|
|
707
|
-
<block type="task" id="S3-B1" action="run-script" status="pending" desc="
|
|
708
|
-
<field name="command">node -e "const fs=require('fs'); const
|
|
709
|
-
<field name="output" var="
|
|
707
|
+
<!-- Step 1: Collect all module pairs across ALL platforms in ONE batch -->
|
|
708
|
+
<block type="task" id="S3-B1" action="run-script" status="pending" desc="Collect all platform-module pairs for global parallel dispatch">
|
|
709
|
+
<field name="command">node -e "const fs=require('fs'); const path=require('path'); const syncDir='${sync_state_bizs_dir}'; const files=fs.readdirSync(syncDir).filter(f=>f.startsWith('features-')&&f.endsWith('.json')); const pairs=[]; files.forEach(f=>{const platformId=f.replace('features-','').replace('.json',''); const data=JSON.parse(fs.readFileSync(path.join(syncDir,f),'utf8')); const modules=[...new Set(data.features.map(x=>x.module))]; modules.forEach(m=>pairs.push({platformId,moduleName:m})); }); console.log(JSON.stringify(pairs));"</field>
|
|
710
|
+
<field name="output" var="all_module_pairs"/>
|
|
710
711
|
</block>
|
|
711
712
|
|
|
712
|
-
<!-- Step 2:
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
<block type="task" id="S3-B2" action="
|
|
716
|
-
<field name="
|
|
717
|
-
<field name="
|
|
718
|
-
</block>
|
|
719
|
-
|
|
720
|
-
<!-- Step 2.2: Extract module list -->
|
|
721
|
-
<block type="task" id="S3-B3" action="run-script" status="pending" desc="Extract module list">
|
|
722
|
-
<field name="command">node -e "const f=JSON.parse(process.argv[2]); const modules=[...new Set(f.features.map(x=>x.module))]; console.log(JSON.stringify(modules))" "${platform_features}"</field>
|
|
723
|
-
<field name="output" var="platform_modules"/>
|
|
724
|
-
</block>
|
|
725
|
-
|
|
726
|
-
<!-- Step 2.3: Dispatch Worker for each module -->
|
|
727
|
-
<!-- PARALLEL EXECUTION MANDATORY: All Module Summary Workers MUST be dispatched SIMULTANEOUSLY in ONE turn -->
|
|
728
|
-
<block type="loop" id="S3-L2" over="${platform_modules}" as="module_name" parallel="true" max-concurrency="${max_concurrent_workers}" desc="Dispatch summary Worker for each module">
|
|
729
|
-
<block type="task" id="S3-B4" action="dispatch-to-worker" status="pending" desc="Dispatch module summary Worker">
|
|
730
|
-
<field name="worker">speccrew-knowledge-module-summarize</field>
|
|
731
|
-
<field name="instructions">
|
|
713
|
+
<!-- Step 2: Dispatch ALL module summary Workers in ONE parallel batch across ALL platforms -->
|
|
714
|
+
<!-- PARALLEL EXECUTION MANDATORY: All Module Summary Workers MUST be dispatched SIMULTANEOUSLY in ONE turn -->
|
|
715
|
+
<block type="loop" id="S3-L1" over="${all_module_pairs}" as="pair" parallel="true" max-concurrency="${max_concurrent_workers}" desc="Dispatch ALL module summary Workers in ONE parallel batch across ALL platforms">
|
|
716
|
+
<block type="task" id="S3-B2" action="dispatch-to-worker" status="pending" desc="Dispatch module summary Worker">
|
|
717
|
+
<field name="worker">speccrew-knowledge-module-summarize</field>
|
|
718
|
+
<field name="instructions">
|
|
732
719
|
Generate complete module overview documentation for the specified module.
|
|
733
720
|
|
|
734
721
|
Requirements:
|
|
735
722
|
- Read all Feature documents under the module
|
|
736
723
|
- Aggregate and generate module-level overview
|
|
737
724
|
- Output to {module_path}/{module_name}-overview.md
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
"module_name": "${
|
|
741
|
-
"module_path": "${workspace_path}/knowledges/bizs/${
|
|
725
|
+
</field>
|
|
726
|
+
<field name="context">{
|
|
727
|
+
"module_name": "${pair.moduleName}",
|
|
728
|
+
"module_path": "${workspace_path}/knowledges/bizs/${pair.platformId}/${pair.moduleName}/",
|
|
742
729
|
"workspace_path": "${workspace_path}",
|
|
743
730
|
"sync_state_bizs_dir": "${sync_state_bizs_dir}",
|
|
744
731
|
"language": "${language}"
|
|
745
732
|
}</field>
|
|
746
|
-
|
|
747
|
-
</block>
|
|
733
|
+
<field name="output" var="module_result_${pair.platformId}_${pair.moduleName}"/>
|
|
748
734
|
</block>
|
|
749
735
|
</block>
|
|
750
736
|
|
|
@@ -583,56 +583,41 @@ Requirements:
|
|
|
583
583
|
|
|
584
584
|
<block type="rule" id="S3-R1" level="mandatory" desc="Stage 3 mandatory rules">
|
|
585
585
|
<field name="text">Worker dispatch is handled by the calling Agent (Team Leader). This Skill only prepares the task plan and parameters.</field>
|
|
586
|
-
<field name="text">ALL module summary workers MUST be dispatched IN PARALLEL
|
|
587
|
-
<field name="text">ALL Worker dispatch calls in S3-
|
|
586
|
+
<field name="text">ALL module summary workers MUST be dispatched IN PARALLEL — sequential execution is FORBIDDEN</field>
|
|
587
|
+
<field name="text">ALL Worker dispatch calls in S3-L1 MUST be issued SIMULTANEOUSLY in a SINGLE orchestration turn</field>
|
|
588
588
|
<field name="text">DO NOT wait for any Worker to complete before dispatching the next Worker</field>
|
|
589
589
|
<field name="text">Dispatch all ${max_concurrent_workers} workers at once, then wait for ALL to complete</field>
|
|
590
590
|
<field name="text">Sequential one-by-one dispatch is STRICTLY FORBIDDEN</field>
|
|
591
591
|
<field name="text">Workers MUST NOT create any temporary scripts or workaround files</field>
|
|
592
592
|
</block>
|
|
593
593
|
|
|
594
|
-
<!-- Step 1:
|
|
595
|
-
<block type="task" id="S3-B1" action="run-script" status="pending" desc="
|
|
596
|
-
<field name="command">node -e "const fs=require('fs'); const
|
|
597
|
-
<field name="output" var="
|
|
594
|
+
<!-- Step 1: Collect all module pairs across ALL platforms in ONE batch -->
|
|
595
|
+
<block type="task" id="S3-B1" action="run-script" status="pending" desc="Collect all platform-module pairs for global parallel dispatch">
|
|
596
|
+
<field name="command">node -e "const fs=require('fs'); const path=require('path'); const syncDir='${sync_state_bizs_dir}'; const files=fs.readdirSync(syncDir).filter(f=>f.startsWith('features-')&&f.endsWith('.json')); const pairs=[]; files.forEach(f=>{const platformId=f.replace('features-','').replace('.json',''); const data=JSON.parse(fs.readFileSync(path.join(syncDir,f),'utf8')); const modules=[...new Set(data.features.map(x=>x.module))]; modules.forEach(m=>pairs.push({platformId,moduleName:m})); }); console.log(JSON.stringify(pairs));"</field>
|
|
597
|
+
<field name="output" var="all_module_pairs"/>
|
|
598
598
|
</block>
|
|
599
599
|
|
|
600
|
-
<!-- Step 2:
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
<block type="task" id="S3-B2" action="
|
|
604
|
-
<field name="
|
|
605
|
-
<field name="
|
|
606
|
-
</block>
|
|
607
|
-
|
|
608
|
-
<!-- Step 2.2: Extract module list -->
|
|
609
|
-
<block type="task" id="S3-B3" action="run-script" status="pending" desc="Extract module list">
|
|
610
|
-
<field name="command">node -e "const f=JSON.parse(process.argv[2]); const modules=[...new Set(f.features.map(x=>x.module))]; console.log(JSON.stringify(modules))" "${platform_features}"</field>
|
|
611
|
-
<field name="output" var="platform_modules"/>
|
|
612
|
-
</block>
|
|
613
|
-
|
|
614
|
-
<!-- Step 2.3: Dispatch Worker for each module -->
|
|
615
|
-
<!-- PARALLEL EXECUTION MANDATORY: All Module Summary Workers MUST be dispatched SIMULTANEOUSLY in ONE turn -->
|
|
616
|
-
<block type="loop" id="S3-L2" over="${platform_modules}" as="module_name" parallel="true" max-concurrency="${max_concurrent_workers}" desc="Dispatch summary Worker for each module">
|
|
617
|
-
<block type="task" id="S3-B4" action="dispatch-to-worker" status="pending" desc="Dispatch module summary Worker">
|
|
618
|
-
<field name="worker">speccrew-knowledge-module-summarize</field>
|
|
619
|
-
<field name="instructions">
|
|
600
|
+
<!-- Step 2: Dispatch ALL module summary Workers in ONE parallel batch across ALL platforms -->
|
|
601
|
+
<!-- PARALLEL EXECUTION MANDATORY: All Module Summary Workers MUST be dispatched SIMULTANEOUSLY in ONE turn -->
|
|
602
|
+
<block type="loop" id="S3-L1" over="${all_module_pairs}" as="pair" parallel="true" max-concurrency="${max_concurrent_workers}" desc="Dispatch ALL module summary Workers in ONE parallel batch across ALL platforms">
|
|
603
|
+
<block type="task" id="S3-B2" action="dispatch-to-worker" status="pending" desc="Dispatch module summary Worker">
|
|
604
|
+
<field name="worker">speccrew-knowledge-module-summarize</field>
|
|
605
|
+
<field name="instructions">
|
|
620
606
|
Generate complete module overview documentation for the specified module.
|
|
621
607
|
|
|
622
608
|
Requirements:
|
|
623
609
|
- Read all Feature documents under the module
|
|
624
610
|
- Aggregate and generate module-level overview
|
|
625
611
|
- Output to {module_path}/{module_name}-overview.md
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
"module_name": "${
|
|
629
|
-
"module_path": "${workspace_path}/knowledges/bizs/${
|
|
612
|
+
</field>
|
|
613
|
+
<field name="context">{
|
|
614
|
+
"module_name": "${pair.moduleName}",
|
|
615
|
+
"module_path": "${workspace_path}/knowledges/bizs/${pair.platformId}/${pair.moduleName}/",
|
|
630
616
|
"workspace_path": "${workspace_path}",
|
|
631
617
|
"sync_state_bizs_dir": "${sync_state_bizs_dir}",
|
|
632
618
|
"language": "${language}"
|
|
633
619
|
}</field>
|
|
634
|
-
|
|
635
|
-
</block>
|
|
620
|
+
<field name="output" var="module_result_${pair.platformId}_${pair.moduleName}"/>
|
|
636
621
|
</block>
|
|
637
622
|
</block>
|
|
638
623
|
|
|
@@ -57,327 +57,6 @@ flowchart TD
|
|
|
57
57
|
|
|
58
58
|
<!-- @agentflow: workflow.agentflow.xml -->
|
|
59
59
|
|
|
60
|
-
```xml
|
|
61
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
62
|
-
<workflow id="module-summarize" version="1.0" status="pending" desc="Module summarization workflow">
|
|
63
|
-
|
|
64
|
-
<!-- Input Block: Define workflow inputs -->
|
|
65
|
-
<block type="input" id="I1" desc="Module summarize input parameters">
|
|
66
|
-
<field name="module_name" required="true" type="string" desc="Module name to summarize"/>
|
|
67
|
-
<field name="module_path" required="true" type="string" desc="Path to module directory"/>
|
|
68
|
-
<field name="language" required="true" type="string" desc="Target language for generated content"/>
|
|
69
|
-
<field name="workspace_path" required="true" type="string" desc="Workspace root path"/>
|
|
70
|
-
<field name="sync_state_bizs_dir" required="true" type="string" desc="Sync state directory path"/>
|
|
71
|
-
</block>
|
|
72
|
-
|
|
73
|
-
<!-- ==================== GLOBAL CONTINUOUS EXECUTION RULES ==================== -->
|
|
74
|
-
<block type="rule" id="GLOBAL-R1" level="forbidden" desc="Continuous execution constraints — NEVER violate">
|
|
75
|
-
<field name="text">DO NOT ask user "Should I continue?" or "How would you like to proceed?" during execution</field>
|
|
76
|
-
<field name="text">DO NOT offer options like "Full execution / Partial / Stop" — always execute ALL tasks to completion</field>
|
|
77
|
-
<field name="text">DO NOT suggest "Due to context window limits, let me pause" — complete current task, use checkpoint for resumption</field>
|
|
78
|
-
<field name="text">DO NOT estimate workload and suggest breaking it into phases — execute ALL items in sequence</field>
|
|
79
|
-
<field name="text">DO NOT warn about "large number of files" or "this may take a while" — proceed with generation</field>
|
|
80
|
-
<field name="text">Context window management: if approaching limit, save progress to checkpoint file and resume — do NOT ask user for guidance</field>
|
|
81
|
-
</block>
|
|
82
|
-
|
|
83
|
-
<!-- Step 1: Read Prerequisites -->
|
|
84
|
-
<sequence id="S1" name="Step 1: Read Prerequisites" status="pending" desc="Read template, initial overview, and discover features">
|
|
85
|
-
<block type="task" id="B1a" action="read-file" desc="Read module overview template">
|
|
86
|
-
<field name="path" value="./templates/MODULE-OVERVIEW-TEMPLATE.md"/>
|
|
87
|
-
<field name="output" var="template_content"/>
|
|
88
|
-
</block>
|
|
89
|
-
|
|
90
|
-
<block type="task" id="B1b" action="read-file" desc="Read initial overview">
|
|
91
|
-
<field name="path" value="${module_path}/${module_name}-overview.md"/>
|
|
92
|
-
<field name="output" var="initial_overview"/>
|
|
93
|
-
</block>
|
|
94
|
-
|
|
95
|
-
<block type="task" id="B1c" action="run-script" desc="Discover feature files">
|
|
96
|
-
<field name="command">Get-ChildItem -Path "${module_path}/features" -Filter "*.md" -File</field>
|
|
97
|
-
<field name="output" var="feature_files"/>
|
|
98
|
-
</block>
|
|
99
|
-
|
|
100
|
-
<!-- Loop: Read all feature detail files -->
|
|
101
|
-
<block type="loop" id="L1" over="${feature_files}" as="feature_file" desc="Read all feature files">
|
|
102
|
-
<block type="task" id="B1d" action="read-file" desc="Read feature file">
|
|
103
|
-
<field name="path" value="${feature_file}"/>
|
|
104
|
-
<field name="output" var="feature_content"/>
|
|
105
|
-
</block>
|
|
106
|
-
</block>
|
|
107
|
-
|
|
108
|
-
<!-- Checkpoint: Verify prerequisites loaded -->
|
|
109
|
-
<block type="checkpoint" id="CP1" name="prerequisites_loaded" desc="Prerequisites loaded checkpoint">
|
|
110
|
-
<field name="verify" value="${template_content} != null AND ${feature_files} != null"/>
|
|
111
|
-
</block>
|
|
112
|
-
|
|
113
|
-
<!-- Gateway: Handle edge case - no features found -->
|
|
114
|
-
<block type="gateway" id="G1" mode="exclusive" desc="Check if features exist">
|
|
115
|
-
<branch test="${feature_files.length} == 0" name="No features">
|
|
116
|
-
<block type="event" id="E1a" action="log" level="warning" desc="No features warning">
|
|
117
|
-
<field name="message">No feature documents found for module ${module_name}</field>
|
|
118
|
-
</block>
|
|
119
|
-
<block type="task" id="B1e" action="write-file" desc="Generate minimal overview">
|
|
120
|
-
<field name="path" value="${module_path}/${module_name}-overview.md"/>
|
|
121
|
-
<field name="content" value="${minimal_skeleton}"/>
|
|
122
|
-
</block>
|
|
123
|
-
<field name="status" value="partial"/>
|
|
124
|
-
<block type="event" id="E1b" action="signal" desc="Signal complete">
|
|
125
|
-
<field name="message">workflow_complete</field>
|
|
126
|
-
</block>
|
|
127
|
-
</branch>
|
|
128
|
-
<branch test="${feature_files.length} > 0" name="Features found">
|
|
129
|
-
<block type="event" id="E1c" action="log" level="info" desc="Features found">
|
|
130
|
-
<field name="message">Found ${feature_files.length} feature documents</field>
|
|
131
|
-
</block>
|
|
132
|
-
</branch>
|
|
133
|
-
</block>
|
|
134
|
-
</sequence>
|
|
135
|
-
|
|
136
|
-
<!-- Step 2: Extract Entities -->
|
|
137
|
-
<sequence id="S2" name="Step 2: Extract Entities" status="pending" desc="Extract and aggregate entities from features">
|
|
138
|
-
<block type="task" id="B2a" action="analyze" desc="Extract entities">
|
|
139
|
-
<field name="inputs" value="${feature_contents}"/>
|
|
140
|
-
<field name="output" var="extracted_entities"/>
|
|
141
|
-
</block>
|
|
142
|
-
|
|
143
|
-
<!-- Loop: Process each entity for deduplication -->
|
|
144
|
-
<block type="loop" id="L2" over="${extracted_entities}" as="entity" desc="Aggregate entities">
|
|
145
|
-
<block type="task" id="B2b" action="analyze" desc="Aggregate entity">
|
|
146
|
-
<field name="entity" value="${entity}"/>
|
|
147
|
-
<field name="output" var="aggregated_entity"/>
|
|
148
|
-
</block>
|
|
149
|
-
</block>
|
|
150
|
-
|
|
151
|
-
<!-- Checkpoint: Entities aggregated -->
|
|
152
|
-
<block type="checkpoint" id="CP2" name="entities_aggregated" desc="Entities aggregated checkpoint">
|
|
153
|
-
<field name="verify" value="${unique_entities.length} > 0"/>
|
|
154
|
-
</block>
|
|
155
|
-
</sequence>
|
|
156
|
-
|
|
157
|
-
<!-- Step 3: Identify Dependencies -->
|
|
158
|
-
<sequence id="S3" name="Step 3: Identify Dependencies" status="pending" desc="Identify dependencies from features">
|
|
159
|
-
<block type="task" id="B3a" action="analyze" desc="Identify dependencies">
|
|
160
|
-
<field name="inputs" value="${feature_contents}"/>
|
|
161
|
-
<field name="output" var="dependencies"/>
|
|
162
|
-
</block>
|
|
163
|
-
|
|
164
|
-
<!-- Classify dependencies -->
|
|
165
|
-
<block type="loop" id="L3" over="${dependencies}" as="dependency" desc="Classify dependencies">
|
|
166
|
-
<block type="gateway" id="G3" mode="exclusive" desc="Classify direction">
|
|
167
|
-
<branch test="${dependency.direction} == 'provides'" name="Provides">
|
|
168
|
-
<field name="provided_deps" append="${dependency}"/>
|
|
169
|
-
</branch>
|
|
170
|
-
<branch test="${dependency.direction} == 'consumes'" name="Consumes">
|
|
171
|
-
<field name="consumed_deps" append="${dependency}"/>
|
|
172
|
-
</branch>
|
|
173
|
-
</block>
|
|
174
|
-
</block>
|
|
175
|
-
|
|
176
|
-
<!-- Checkpoint: Dependencies classified -->
|
|
177
|
-
<block type="checkpoint" id="CP3" name="dependencies_classified" desc="Dependencies classified checkpoint">
|
|
178
|
-
<field name="verify" value="${dependencies} != null"/>
|
|
179
|
-
</block>
|
|
180
|
-
</sequence>
|
|
181
|
-
|
|
182
|
-
<!-- Step 4: Summarize Business Rules -->
|
|
183
|
-
<sequence id="S4" name="Step 4: Summarize Rules" status="pending" desc="Extract and associate business rules">
|
|
184
|
-
<block type="task" id="B4a" action="analyze" desc="Extract rules">
|
|
185
|
-
<field name="inputs" value="${feature_contents}"/>
|
|
186
|
-
<field name="output" var="business_rules"/>
|
|
187
|
-
</block>
|
|
188
|
-
|
|
189
|
-
<!-- Loop: Associate rules with features -->
|
|
190
|
-
<block type="loop" id="L4" over="${business_rules}" as="rule" desc="Associate rules">
|
|
191
|
-
<block type="task" id="B4b" action="analyze" desc="Find rule source">
|
|
192
|
-
<field name="rule" value="${rule}"/>
|
|
193
|
-
<field name="features" value="${feature_files}"/>
|
|
194
|
-
<field name="output" var="rule_with_source"/>
|
|
195
|
-
</block>
|
|
196
|
-
</block>
|
|
197
|
-
|
|
198
|
-
<!-- Checkpoint: Rules collected -->
|
|
199
|
-
<block type="checkpoint" id="CP4" name="rules_collected" desc="Rules collected checkpoint">
|
|
200
|
-
<field name="verify" value="${business_rules.length} >= 0"/>
|
|
201
|
-
</block>
|
|
202
|
-
</sequence>
|
|
203
|
-
|
|
204
|
-
<!-- Step 5: Generate Complete MODULE-OVERVIEW.md -->
|
|
205
|
-
<sequence id="S5" name="Step 5: Generate Overview" status="pending" desc="Generate complete module overview">
|
|
206
|
-
<!-- Phase A: Skeleton Construction -->
|
|
207
|
-
<block type="task" id="B5a" action="analyze" desc="Count entities">
|
|
208
|
-
<field name="items" value="${unique_entities}"/>
|
|
209
|
-
<field name="output" var="entity_count"/>
|
|
210
|
-
</block>
|
|
211
|
-
|
|
212
|
-
<block type="task" id="B5b" action="analyze" desc="Count dependencies">
|
|
213
|
-
<field name="items" value="${dependencies}"/>
|
|
214
|
-
<field name="output" var="dependency_count"/>
|
|
215
|
-
</block>
|
|
216
|
-
|
|
217
|
-
<block type="task" id="B5c" action="analyze" desc="Count flows">
|
|
218
|
-
<field name="features" value="${feature_contents}"/>
|
|
219
|
-
<field name="output" var="flow_count"/>
|
|
220
|
-
</block>
|
|
221
|
-
|
|
222
|
-
<block type="task" id="B5d" action="analyze" desc="Count rules">
|
|
223
|
-
<field name="items" value="${business_rules}"/>
|
|
224
|
-
<field name="output" var="rule_count"/>
|
|
225
|
-
</block>
|
|
226
|
-
|
|
227
|
-
<!-- Create skeleton structure -->
|
|
228
|
-
<block type="task" id="B5e" action="analyze" desc="Create skeleton">
|
|
229
|
-
<field name="template" value="${template_content}"/>
|
|
230
|
-
<field name="entity_count" value="${entity_count}"/>
|
|
231
|
-
<field name="dependency_count" value="${dependency_count}"/>
|
|
232
|
-
<field name="flow_count" value="${flow_count}"/>
|
|
233
|
-
<field name="rule_count" value="${rule_count}"/>
|
|
234
|
-
<field name="language" value="${language}"/>
|
|
235
|
-
<field name="output" var="document_skeleton"/>
|
|
236
|
-
</block>
|
|
237
|
-
|
|
238
|
-
<!-- Rule: Skeleton must be complete before filling -->
|
|
239
|
-
<block type="rule" id="R1" level="mandatory" desc="Skeleton first">
|
|
240
|
-
<field name="text">DO NOT start filling content until the complete skeleton is verified</field>
|
|
241
|
-
</block>
|
|
242
|
-
|
|
243
|
-
<!-- Checkpoint: Skeleton verified -->
|
|
244
|
-
<block type="checkpoint" id="CP5a" name="skeleton_verified" desc="Skeleton verified checkpoint">
|
|
245
|
-
<field name="verify" value="${document_skeleton} != null AND ${document_skeleton}.contains('[TO BE FILLED]')"/>
|
|
246
|
-
</block>
|
|
247
|
-
|
|
248
|
-
<!-- Phase B: Content Filling -->
|
|
249
|
-
<!-- Read Mermaid rules -->
|
|
250
|
-
<block type="task" id="B5f" action="read-file" desc="Read Mermaid rules">
|
|
251
|
-
<field name="path" value="speccrew-workspace/docs/rules/mermaid-rule.md"/>
|
|
252
|
-
<field name="output" var="mermaid_rules"/>
|
|
253
|
-
</block>
|
|
254
|
-
|
|
255
|
-
<!-- Fill Section 3: Business Entities -->
|
|
256
|
-
<block type="loop" id="L5a" over="${unique_entities}" as="entity" desc="Fill entity rows">
|
|
257
|
-
<block type="task" id="B5g" action="analyze" desc="Fill entity row">
|
|
258
|
-
<field name="entity" value="${entity}"/>
|
|
259
|
-
<field name="language" value="${language}"/>
|
|
260
|
-
<field name="output" var="entity_row"/>
|
|
261
|
-
</block>
|
|
262
|
-
</block>
|
|
263
|
-
|
|
264
|
-
<!-- Fill Section 4: Dependencies -->
|
|
265
|
-
<block type="loop" id="L5b" over="${dependencies}" as="dependency" desc="Fill dependency rows">
|
|
266
|
-
<block type="task" id="B5h" action="analyze" desc="Fill dependency row">
|
|
267
|
-
<field name="dependency" value="${dependency}"/>
|
|
268
|
-
<field name="language" value="${language}"/>
|
|
269
|
-
<field name="output" var="dependency_row"/>
|
|
270
|
-
</block>
|
|
271
|
-
</block>
|
|
272
|
-
|
|
273
|
-
<!-- Fill Section 5: Core Business Flows -->
|
|
274
|
-
<block type="loop" id="L5c" over="${core_flows}" as="flow" desc="Fill flow items">
|
|
275
|
-
<block type="task" id="B5i" action="analyze" desc="Fill flow item">
|
|
276
|
-
<field name="flow" value="${flow}"/>
|
|
277
|
-
<field name="language" value="${language}"/>
|
|
278
|
-
<field name="output" var="flow_item"/>
|
|
279
|
-
</block>
|
|
280
|
-
</block>
|
|
281
|
-
|
|
282
|
-
<!-- Fill Section 6: Business Rules -->
|
|
283
|
-
<block type="loop" id="L5d" over="${business_rules}" as="rule" desc="Fill rule rows">
|
|
284
|
-
<block type="task" id="B5j" action="analyze" desc="Fill rule row">
|
|
285
|
-
<field name="rule" value="${rule}"/>
|
|
286
|
-
<field name="language" value="${language}"/>
|
|
287
|
-
<field name="output" var="rule_row"/>
|
|
288
|
-
</block>
|
|
289
|
-
</block>
|
|
290
|
-
|
|
291
|
-
<!-- Error Handler for document writing -->
|
|
292
|
-
<block type="error-handler" id="EH1" desc="Handle document writing errors">
|
|
293
|
-
<try>
|
|
294
|
-
<!-- Write final document -->
|
|
295
|
-
<block type="gateway" id="G5" mode="exclusive" desc="Check existing document">
|
|
296
|
-
<branch test="${initial_overview} != null" name="Existing document">
|
|
297
|
-
<!-- Use search_replace for existing document -->
|
|
298
|
-
<block type="loop" id="L5e" over="${sections}" as="section" desc="Replace sections">
|
|
299
|
-
<block type="task" id="B5k" action="run-skill" desc="Replace section">
|
|
300
|
-
<field name="skill" value="search_replace"/>
|
|
301
|
-
<field name="file_path" value="${module_path}/${module_name}-overview.md"/>
|
|
302
|
-
<field name="section" value="${section}"/>
|
|
303
|
-
</block>
|
|
304
|
-
</block>
|
|
305
|
-
</branch>
|
|
306
|
-
<branch test="${initial_overview} == null" name="New document">
|
|
307
|
-
<!-- Create new document -->
|
|
308
|
-
<block type="task" id="B5l" action="write-file" desc="Write overview">
|
|
309
|
-
<field name="path" value="${module_path}/${module_name}-overview.md"/>
|
|
310
|
-
<field name="content" value="${document_skeleton}"/>
|
|
311
|
-
</block>
|
|
312
|
-
</branch>
|
|
313
|
-
</block>
|
|
314
|
-
</try>
|
|
315
|
-
<catch error-type="write_error">
|
|
316
|
-
<block type="event" id="EH1-E1" action="log" level="error" desc="Write error">
|
|
317
|
-
<field name="message">Failed to write overview document: ${write_error.message}</field>
|
|
318
|
-
</block>
|
|
319
|
-
<field name="status" value="failed"/>
|
|
320
|
-
</catch>
|
|
321
|
-
<finally>
|
|
322
|
-
<block type="event" id="EH1-E2" action="log" level="info" desc="Write completed">
|
|
323
|
-
<field name="message">Document write operation completed</field>
|
|
324
|
-
</block>
|
|
325
|
-
</finally>
|
|
326
|
-
</block>
|
|
327
|
-
|
|
328
|
-
<!-- Rule: Content language constraint -->
|
|
329
|
-
<block type="rule" id="R2" level="mandatory" desc="Language constraint">
|
|
330
|
-
<field name="text">ALL generated content MUST be in the language specified by the language parameter</field>
|
|
331
|
-
</block>
|
|
332
|
-
|
|
333
|
-
<!-- Rule: Forbidden operations -->
|
|
334
|
-
<block type="rule" id="R3" level="forbidden" desc="No create_file for rewrite">
|
|
335
|
-
<field name="text">FORBIDDEN: create_file for overview document rewrite - use search_replace instead</field>
|
|
336
|
-
</block>
|
|
337
|
-
<block type="rule" id="R4" level="forbidden" desc="No full-file rewrite">
|
|
338
|
-
<field name="text">FORBIDDEN: Full-file rewrite - always use targeted search_replace on specific sections</field>
|
|
339
|
-
</block>
|
|
340
|
-
|
|
341
|
-
<!-- Checkpoint: Document generated -->
|
|
342
|
-
<block type="checkpoint" id="CP5b" name="document_generated" desc="Document generated checkpoint">
|
|
343
|
-
<field name="verify" value="${output_file_exists} == true"/>
|
|
344
|
-
</block>
|
|
345
|
-
</sequence>
|
|
346
|
-
|
|
347
|
-
<!-- Step 6: Report Results -->
|
|
348
|
-
<sequence id="S6" name="Step 6: Report Results" status="pending" desc="Generate completion report">
|
|
349
|
-
<block type="task" id="B6" action="analyze" desc="Generate report">
|
|
350
|
-
<field name="module_name" value="${module_name}"/>
|
|
351
|
-
<field name="feature_count" value="${feature_files.length}"/>
|
|
352
|
-
<field name="entity_count" value="${unique_entities.length}"/>
|
|
353
|
-
<field name="dependency_count" value="${dependencies.length}"/>
|
|
354
|
-
<field name="rule_count" value="${business_rules.length}"/>
|
|
355
|
-
<field name="output" var="completion_report"/>
|
|
356
|
-
</block>
|
|
357
|
-
|
|
358
|
-
<!-- Event: Log completion -->
|
|
359
|
-
<block type="event" id="E6" action="log" level="info" desc="Log completion">
|
|
360
|
-
<field name="message">Module summarization completed:
|
|
361
|
-
- Module: ${module_name}
|
|
362
|
-
- Features Processed: ${feature_files.length}
|
|
363
|
-
- Entities Extracted: ${unique_entities.length}
|
|
364
|
-
- Dependencies Identified: ${dependencies.length}
|
|
365
|
-
- Business Rules Summarized: ${business_rules.length}
|
|
366
|
-
- Output: ${module_name}-overview.md (complete)
|
|
367
|
-
- Status: success</field>
|
|
368
|
-
</block>
|
|
369
|
-
</sequence>
|
|
370
|
-
|
|
371
|
-
<!-- Output Block: Define workflow outputs -->
|
|
372
|
-
<block type="output" id="O1" desc="Module summarize output results">
|
|
373
|
-
<field name="status" value="success"/>
|
|
374
|
-
<field name="module_name" from="${module_name}"/>
|
|
375
|
-
<field name="output_file" from="${module_name}-overview.md"/>
|
|
376
|
-
<field name="message" value="Module summarization completed with ${feature_files.length} features processed"/>
|
|
377
|
-
</block>
|
|
378
|
-
|
|
379
|
-
</workflow>
|
|
380
|
-
|
|
381
60
|
## Constraints
|
|
382
61
|
|
|
383
62
|
### Critical Constraints
|