selfware/ui/demo/scenarios/
factory.rs1use super::DemoScenario;
10use crate::demo::runner::DemoRunner;
11use crate::tui::animation::agent_avatar::{ActivityLevel, AgentRole};
12use crate::tui::animation::message_flow::MessageType;
13
14pub struct FeatureFactoryScenario {
16 phase: FactoryPhase,
18 lines_written: usize,
20 tests_passed: usize,
22 tests_total: usize,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq)]
27enum FactoryPhase {
28 Planning,
29 Design,
30 Implementation,
31 Testing,
32 Review,
33 Deployment,
34 Complete,
35}
36
37impl FeatureFactoryScenario {
38 pub fn new() -> Self {
39 Self {
40 phase: FactoryPhase::Planning,
41 lines_written: 0,
42 tests_passed: 0,
43 tests_total: 0,
44 }
45 }
46}
47
48impl Default for FeatureFactoryScenario {
49 fn default() -> Self {
50 Self::new()
51 }
52}
53
54impl DemoScenario for FeatureFactoryScenario {
55 fn name(&self) -> &str {
56 "Feature Factory"
57 }
58
59 fn description(&self) -> &str {
60 "Watch a multi-agent team design, implement, test, and deploy a new feature in real-time."
61 }
62
63 fn total_stages(&self) -> usize {
64 7
65 }
66
67 fn initialize(&mut self, runner: &mut DemoRunner) {
68 runner.add_agent("architect", AgentRole::Architect);
70 runner.add_agent("coder", AgentRole::Coder);
71 runner.add_agent("tester", AgentRole::Tester);
72 runner.add_agent("devops", AgentRole::DevOps);
73
74 runner.set_token_rate(500.0);
75 runner.set_total_tokens(0);
76
77 self.phase = FactoryPhase::Planning;
78 }
79
80 fn execute_stage(&mut self, stage: usize, runner: &mut DemoRunner) -> bool {
81 match stage {
82 0 => {
83 self.phase = FactoryPhase::Planning;
85 runner.set_agent_activity("architect", ActivityLevel::High);
86 runner.add_agent_tokens("architect", 3000);
87
88 runner.sparkle(15.0, 8.0, 8);
89 true
90 }
91 1 => {
92 self.phase = FactoryPhase::Design;
94 runner.set_agent_activity("architect", ActivityLevel::Max);
95 runner.set_token_rate(3000.0);
96 runner.add_agent_tokens("architect", 10000);
97
98 runner.send_message(
100 "architect",
101 "coder",
102 MessageType::Request,
103 (10.0, 5.0),
104 (25.0, 5.0),
105 );
106
107 runner.sparkle(20.0, 5.0, 12);
108 true
109 }
110 2 => {
111 self.phase = FactoryPhase::Implementation;
113 self.lines_written = 450;
114
115 runner.set_agent_activity("architect", ActivityLevel::Low);
116 runner.set_agent_activity("coder", ActivityLevel::Max);
117 runner.set_token_rate(8000.0);
118 runner.add_agent_tokens("coder", 35000);
119
120 runner.send_message(
122 "coder",
123 "architect",
124 MessageType::Response,
125 (25.0, 5.0),
126 (10.0, 5.0),
127 );
128
129 runner.explode(25.0, 8.0, 8);
130 true
131 }
132 3 => {
133 self.phase = FactoryPhase::Testing;
135 self.tests_total = 42;
136 self.tests_passed = 0;
137
138 runner.set_agent_activity("coder", ActivityLevel::Medium);
139 runner.set_agent_activity("tester", ActivityLevel::Max);
140 runner.set_token_rate(5000.0);
141 runner.add_agent_tokens("tester", 15000);
142
143 runner.send_message(
145 "coder",
146 "tester",
147 MessageType::Request,
148 (25.0, 5.0),
149 (40.0, 5.0),
150 );
151 true
152 }
153 4 => {
154 self.phase = FactoryPhase::Review;
156 self.tests_passed = 42;
157
158 runner.set_agent_activity("tester", ActivityLevel::Complete);
159 runner.set_token_rate(2000.0);
160 runner.add_agent_tokens("tester", 5000);
161
162 runner.send_message(
164 "tester",
165 "coder",
166 MessageType::Response,
167 (40.0, 5.0),
168 (25.0, 5.0),
169 );
170 runner.send_message(
171 "tester",
172 "architect",
173 MessageType::Consensus,
174 (40.0, 5.0),
175 (10.0, 5.0),
176 );
177
178 runner.sparkle(40.0, 5.0, 15);
179 true
180 }
181 5 => {
182 self.phase = FactoryPhase::Deployment;
184
185 runner.set_agent_activity("coder", ActivityLevel::Low);
186 runner.set_agent_activity("devops", ActivityLevel::Max);
187 runner.set_token_rate(4000.0);
188 runner.add_agent_tokens("devops", 12000);
189
190 runner.send_message(
192 "architect",
193 "devops",
194 MessageType::Broadcast,
195 (10.0, 5.0),
196 (55.0, 5.0),
197 );
198
199 runner.explode(55.0, 8.0, 10);
200 true
201 }
202 6 => {
203 self.phase = FactoryPhase::Complete;
205
206 runner.set_agent_activity("architect", ActivityLevel::Complete);
207 runner.set_agent_activity("coder", ActivityLevel::Complete);
208 runner.set_agent_activity("tester", ActivityLevel::Complete);
209 runner.set_agent_activity("devops", ActivityLevel::Complete);
210 runner.set_token_rate(0.0);
211
212 runner.celebrate(30.0, 10.0);
214 runner.sparkle(10.0, 8.0, 20);
215 runner.sparkle(25.0, 8.0, 20);
216 runner.sparkle(40.0, 8.0, 20);
217 runner.sparkle(55.0, 8.0, 20);
218 true
219 }
220 _ => false,
221 }
222 }
223
224 fn cleanup(&mut self, runner: &mut DemoRunner) {
225 runner.set_total_tokens(80000);
226 runner.set_token_rate(0.0);
227 }
228}
229
230#[cfg(test)]
231mod tests {
232 use super::*;
233 use crate::demo::DemoConfig;
234
235 #[test]
236 fn test_factory_scenario_new() {
237 let scenario = FeatureFactoryScenario::new();
238 assert_eq!(scenario.name(), "Feature Factory");
239 assert_eq!(scenario.total_stages(), 7);
240 }
241
242 #[test]
243 fn test_factory_scenario_full_execution() {
244 let mut scenario = FeatureFactoryScenario::new();
245 let mut runner = DemoRunner::new(DemoConfig::default());
246
247 scenario.initialize(&mut runner);
248 assert_eq!(runner.agents().len(), 4);
249
250 for stage in 0..scenario.total_stages() {
251 assert!(scenario.execute_stage(stage, &mut runner));
252 }
253
254 assert_eq!(scenario.phase, FactoryPhase::Complete);
255 assert_eq!(scenario.tests_passed, 42);
256 }
257}