Skip to main content

selfware/ui/demo/scenarios/
factory.rs

1//! Feature Factory Scenario
2//!
3//! Demonstrates agents building a new feature together:
4//! - Architect designs the feature
5//! - Coder implements it
6//! - Tester writes and runs tests
7//! - DevOps prepares deployment
8
9use super::DemoScenario;
10use crate::demo::runner::DemoRunner;
11use crate::tui::animation::agent_avatar::{ActivityLevel, AgentRole};
12use crate::tui::animation::message_flow::MessageType;
13
14/// Feature factory demo - agents build a feature collaboratively
15pub struct FeatureFactoryScenario {
16    /// Current phase
17    phase: FactoryPhase,
18    /// Lines of code "written"
19    lines_written: usize,
20    /// Tests passed
21    tests_passed: usize,
22    /// Tests total
23    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        // Add the feature team
69        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                // Planning phase
84                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                // Design phase
93                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                // Architect sends design to coder
99                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                // Implementation phase
112                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                // Coder acknowledges
121                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                // Testing phase
134                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                // Coder sends code to tester
144                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                // Review phase - tests passing
155                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                // Tester reports success
163                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                // Deployment phase
183                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                // DevOps gets the green light
191                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                // Complete!
204                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                // Celebration effects
213                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}