yellow-olive 0.1.0__tar.gz

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 (77) hide show
  1. yellow_olive-0.1.0/LICENSE +21 -0
  2. yellow_olive-0.1.0/PKG-INFO +269 -0
  3. yellow_olive-0.1.0/README.md +237 -0
  4. yellow_olive-0.1.0/app.py +87 -0
  5. yellow_olive-0.1.0/app.tcss +101 -0
  6. yellow_olive-0.1.0/challenge_files/challenge_1_text.py +9 -0
  7. yellow_olive-0.1.0/challenge_files/challenge_2_text.py +14 -0
  8. yellow_olive-0.1.0/challenge_files/challenge_3_text.py +19 -0
  9. yellow_olive-0.1.0/challenge_files/challenge_4_text.py +16 -0
  10. yellow_olive-0.1.0/challenge_files/challenge_5_text.py +15 -0
  11. yellow_olive-0.1.0/challenge_files/challenge_6_text.py +14 -0
  12. yellow_olive-0.1.0/challenge_files/challenge_7_text.py +15 -0
  13. yellow_olive-0.1.0/challenge_files/challenge_constants.py +2 -0
  14. yellow_olive-0.1.0/challenge_files/pod-q1.yaml +14 -0
  15. yellow_olive-0.1.0/challenge_files/pod-q2.yaml +10 -0
  16. yellow_olive-0.1.0/challenge_files/pod-q3.yaml +10 -0
  17. yellow_olive-0.1.0/challenge_files/pod-q4.yaml +11 -0
  18. yellow_olive-0.1.0/challenge_files/pod-q5.yaml +13 -0
  19. yellow_olive-0.1.0/challenge_files/pod-q6.yaml +14 -0
  20. yellow_olive-0.1.0/challenge_files/pod-q7.yaml +11 -0
  21. yellow_olive-0.1.0/core_logic/__init__.py +1 -0
  22. yellow_olive-0.1.0/core_logic/challenge_validation.py +139 -0
  23. yellow_olive-0.1.0/dialouges/author_info.py +10 -0
  24. yellow_olive-0.1.0/dialouges/game_reference_dialogue.py +10 -0
  25. yellow_olive-0.1.0/dialouges/help_screen_dialogue.py +42 -0
  26. yellow_olive-0.1.0/dialouges/professor_bald_dialogue.py +11 -0
  27. yellow_olive-0.1.0/dialouges/professor_bald_dialogue_name_input_screen.py +9 -0
  28. yellow_olive-0.1.0/dialouges/psyquack_failure_screen_dialogue.py +9 -0
  29. yellow_olive-0.1.0/dialouges/psyquack_success_dialogue.py +9 -0
  30. yellow_olive-0.1.0/global_constants.py +9 -0
  31. yellow_olive-0.1.0/media/background_music_utility.py +23 -0
  32. yellow_olive-0.1.0/media/resources/a +1 -0
  33. yellow_olive-0.1.0/media/resources/image_files/Professor Bald.png +0 -0
  34. yellow_olive-0.1.0/media/resources/image_files/electromon.png +0 -0
  35. yellow_olive-0.1.0/media/resources/image_files/psyquack.png +0 -0
  36. yellow_olive-0.1.0/media/resources/image_files/psyquack_happy.png +0 -0
  37. yellow_olive-0.1.0/media/resources/music_files/battle_music.ogg +0 -0
  38. yellow_olive-0.1.0/media/resources/music_files/battle_music_2.mp3 +0 -0
  39. yellow_olive-0.1.0/media/resources/music_files/loose_music.ogg +0 -0
  40. yellow_olive-0.1.0/media/resources/music_files/psyquack_happy_song.mp3 +0 -0
  41. yellow_olive-0.1.0/media/resources/music_files/psyquack_voice.mp3 +0 -0
  42. yellow_olive-0.1.0/media/resources/music_files/screen_1_opening_song.mp3 +0 -0
  43. yellow_olive-0.1.0/media/resources/music_files/screen_2_music.mp3 +0 -0
  44. yellow_olive-0.1.0/media/resources/music_files/win_music.ogg +0 -0
  45. yellow_olive-0.1.0/pyproject.toml +69 -0
  46. yellow_olive-0.1.0/screen_prompts/screen_challenge_1/screen_prompts.py +47 -0
  47. yellow_olive-0.1.0/screen_prompts/screen_game_initialisation_and_reference/screen_prompts.py +5 -0
  48. yellow_olive-0.1.0/screen_prompts/screen_help_screen/screen_prompts.py +4 -0
  49. yellow_olive-0.1.0/screen_prompts/screen_name_input_screen/screen_prompts.py +2 -0
  50. yellow_olive-0.1.0/screen_prompts/screen_professor_bald_intro/screen_prompts.py +1 -0
  51. yellow_olive-0.1.0/screen_prompts/screen_psyquack_failure_screen/screen_prompts.py +2 -0
  52. yellow_olive-0.1.0/screens/author_info.py +27 -0
  53. yellow_olive-0.1.0/screens/base_challenge_screen.py +137 -0
  54. yellow_olive-0.1.0/screens/challenge_1.py +17 -0
  55. yellow_olive-0.1.0/screens/challenge_2.py +7 -0
  56. yellow_olive-0.1.0/screens/challenge_3.py +7 -0
  57. yellow_olive-0.1.0/screens/challenge_4.py +7 -0
  58. yellow_olive-0.1.0/screens/challenge_5.py +7 -0
  59. yellow_olive-0.1.0/screens/challenge_6.py +7 -0
  60. yellow_olive-0.1.0/screens/challenge_7.py +7 -0
  61. yellow_olive-0.1.0/screens/game_initialisation_and_reference_screen.py +70 -0
  62. yellow_olive-0.1.0/screens/help_screen.py +36 -0
  63. yellow_olive-0.1.0/screens/name_input_screen.py +55 -0
  64. yellow_olive-0.1.0/screens/professor_bald_intro.py +40 -0
  65. yellow_olive-0.1.0/screens/psy_quack_failure_screen.py +51 -0
  66. yellow_olive-0.1.0/screens/psy_quack_success_screen.py +56 -0
  67. yellow_olive-0.1.0/scripts/generic-script-pods.sh +14 -0
  68. yellow_olive-0.1.0/scripts/script.sh +18 -0
  69. yellow_olive-0.1.0/setup.cfg +4 -0
  70. yellow_olive-0.1.0/utils/__init__.py +0 -0
  71. yellow_olive-0.1.0/utils/general_utils.py +117 -0
  72. yellow_olive-0.1.0/yellow_olive.egg-info/PKG-INFO +269 -0
  73. yellow_olive-0.1.0/yellow_olive.egg-info/SOURCES.txt +75 -0
  74. yellow_olive-0.1.0/yellow_olive.egg-info/dependency_links.txt +1 -0
  75. yellow_olive-0.1.0/yellow_olive.egg-info/entry_points.txt +2 -0
  76. yellow_olive-0.1.0/yellow_olive.egg-info/requires.txt +5 -0
  77. yellow_olive-0.1.0/yellow_olive.egg-info/top_level.txt +9 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Anubhav Sanyal
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,269 @@
1
+ Metadata-Version: 2.4
2
+ Name: yellow-olive
3
+ Version: 0.1.0
4
+ Summary: A terminal-native retro Kubernetes adventure inspired by Pokemon Yellow.
5
+ Author: Anubhav Sanyal
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Anubhav9/Yellow-Olive
8
+ Project-URL: Repository, https://github.com/Anubhav9/Yellow-Olive
9
+ Project-URL: Issues, https://github.com/Anubhav9/Yellow-Olive/issues
10
+ Keywords: kubernetes,textual,terminal-game,retro,learning,tui
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Education
21
+ Classifier: Topic :: Games/Entertainment
22
+ Classifier: Topic :: Software Development
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: ascii_magic==2.7.4
27
+ Requires-Dist: Pillow==12.1.1
28
+ Requires-Dist: pygame==2.6.1
29
+ Requires-Dist: rich==14.3.3
30
+ Requires-Dist: textual==8.0.2
31
+ Dynamic: license-file
32
+
33
+ # Project Yellow Olive
34
+
35
+ **Pokémon Yellow, but you tame Kubernetes clusters instead of Pokémon.**
36
+
37
+ A terminal-native retro adventure designed to make infrastructure learning feel fun, nostalgic, and a little less overwhelming.
38
+
39
+ [![GitHub stars](https://img.shields.io/github/stars/Anubhav9/Yellow-Olive?style=social)](https://github.com/Anubhav9/Yellow-Olive)
40
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
41
+ [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)
42
+ [![Made with ❤️ in Bengaluru 🇮🇳](https://img.shields.io/badge/Made%20with%20❤️%20in-Bengaluru%20🇮🇳-%23D4AF37?style=flat)](https://github.com/Anubhav9/Yellow-Olive)
43
+
44
+ <img src="https://github.com/user-attachments/assets/f752fbca-da89-4227-bf44-b4659bf63969" width="80%" alt="Opening screen with Professor Bald">
45
+
46
+ ---
47
+ ## Index
48
+
49
+ - [The Motivation](#the-motivation)
50
+ - [An Honest Take](#an-honest-take)
51
+ - [Setup and Run (Local)](#setup-and-run-local)
52
+ - [Meet the Characters](#meet-the-characters)
53
+ - [From Yellow Olive to Kubernetes](#from-yellow-olive-to-kubernetes)
54
+ - [Gameplay Commands](#gameplay-commands)
55
+ - [Project Yellow Olive in Action](#project-yellow-olive-in-action)
56
+ - [Contributing](#contributing)
57
+ - [What's next in the roadmap?](#whats-next-in-the-roadmap)
58
+
59
+ ---
60
+
61
+ ## The Motivation
62
+
63
+ ```Kubernetes is powerful...
64
+ Kubernetes is everywhere...
65
+ Kubernetes runs the modern world...
66
+ And yet, for many of us, learning it feels confusing, overwhelming, and sometimes just plain boring :(
67
+ ```
68
+
69
+ Project Yellow Olive is my personal, experimental attempt at changing that.
70
+
71
+ I grew up on a GameBoy, lost in the world of Pokémon. Even today, a single chiptune note takes me straight back to those golden childhood days. I know I’m not alone in that feeling.
72
+
73
+ Nostalgia has a strange power - it lowers resistance, sparks curiosity, and makes difficult things feel lighter.
74
+
75
+ Yellow Olive is built on that belief: combine nostalgia with motivation, and even something as complex as Kubernetes can become approachable.
76
+
77
+ ---
78
+
79
+ ## An Honest Take
80
+
81
+ I’ve attempted the CKAD and CKA certifications - and I didn’t clear them.
82
+
83
+ Not because I didn’t understand the concepts, but because I didn’t practice enough. Platforms like Killer.sh demand consistency and repetition - and like many of us, I underestimated that discipline.
84
+
85
+ This project isn’t a replacement for serious exam prep.
86
+
87
+ It’s a practice ground - a way to build confidence, stay engaged, and keep the adrenaline slightly elevated while solving real problems.
88
+
89
+ Not every day is productive. Not every day is high-energy.
90
+
91
+ This is just my attempt to make the hard days a little easier to push through.
92
+
93
+ ---
94
+
95
+ ## Setup and Run
96
+
97
+ ### Prerequisites
98
+
99
+ - Python 3.10+
100
+ - Docker Desktop or Docker Engine (required)
101
+ - `minikube` (required)
102
+ - `kubectl` (required)
103
+
104
+ Project Yellow Olive uses Minikube to create and manage the local Kubernetes cluster used during gameplay, so Docker and Minikube must be installed before starting the game.
105
+
106
+ ### Install Minikube and Kubernetes Tooling
107
+
108
+ 1. Install Docker and make sure it is running.
109
+ 2. Install Minikube by following the official guide: [Install Minikube](https://minikube.sigs.k8s.io/docs/start/)
110
+ 3. Install `kubectl` by following the official guide: [Install kubectl](https://kubernetes.io/docs/tasks/tools/)
111
+
112
+ You can verify the setup with:
113
+
114
+ ```bash
115
+ docker --version
116
+ minikube version
117
+ kubectl version --client
118
+ ```
119
+
120
+ ### Install from PyPI
121
+
122
+ ```bash
123
+ python -m venv .venv
124
+ source .venv/bin/activate
125
+ pip install yellow-olive
126
+ ```
127
+
128
+ ### Start the Game from PyPI
129
+
130
+ ```bash
131
+ yellow-olive start
132
+ ```
133
+
134
+ When the game starts, Project Yellow Olive creates a `yellow-olive-lab/` folder in your current working directory and places the editable challenge manifests there.
135
+
136
+ ### Install from Source
137
+
138
+ ```bash
139
+ git clone https://github.com/Anubhav9/Yellow-Olive.git
140
+ cd Yellow-Olive
141
+ python -m venv .venv
142
+ source .venv/bin/activate
143
+ pip install -r requirements.txt
144
+ ```
145
+
146
+ ### Start the Game from Source
147
+
148
+ ```bash
149
+ python app.py
150
+ ```
151
+
152
+ When you start the game and proceed through initialization, Yellow Olive will start a Minikube profile and switch kubectl context automatically.
153
+
154
+ ### Helpful Tip for Gameplay
155
+
156
+ Keep two terminal tabs open:
157
+
158
+ 1. **Game terminal** -> run `yellow-olive start` or `python app.py`
159
+ 2. **Command Chamber terminal** -> run your `kubectl` commands for challenge fixes
160
+
161
+ ---
162
+
163
+ ## Meet the Characters
164
+
165
+ ### Professor Bald Uncle
166
+ <p align="center">
167
+ <img width="120" src="https://github.com/user-attachments/assets/0b975f11-f319-45fe-96f1-6d73b557f17a" alt="Professor Bald Uncle" />
168
+ </p>
169
+
170
+ ```
171
+ The classic mentor archetype. Calm, experienced, slightly intimidating at first glance.
172
+
173
+ He steps in when you’re stuck, nudges you in the right direction, and reminds you that debugging is part of the journey.
174
+
175
+ Strict on the outside, generous at heart.
176
+ ```
177
+
178
+ ### Electromon
179
+ <p align="center">
180
+ <img width="120" src="https://github.com/user-attachments/assets/dad3be2b-216f-44ec-9a12-c79c763dfd32" alt="Electromon" />
181
+ </p>
182
+
183
+ ```
184
+ Your closest companion. Quiet by nature, but restless at heart — he doesn’t like being confined for long.
185
+
186
+ When something feels off in the cluster, he’s usually at the center of it. Shy, but loyal through every broken deployment.
187
+ ```
188
+
189
+ ### PsyQuack
190
+ <p align="center">
191
+ <img width="120" src="https://github.com/user-attachments/assets/bfc93cfc-f4c5-4b58-ac6a-4c430eb8b879" alt="PsyQuack" />
192
+ </p>
193
+
194
+ ```
195
+ He doesn’t talk much. He watches.
196
+ You think you fixed the Deployment? He checks.
197
+ You’re confident the Service works? He verifies.
198
+ If something’s still off, PsyQuack will let you know - in his own slightly unhinged way.
199
+ He doesn’t reward effort. He rewards correctness.
200
+ ```
201
+ ---
202
+ ## From Yellow Olive to Kubernetes
203
+
204
+ Every character, keyword, and challenge maps directly to a real Kubernetes concept.
205
+
206
+ | Yellow Olive Concept | Kubernetes Equivalent | What It Means in Practice |
207
+ |----------------------|-----------------------|----------------------------------------------------|
208
+ | Posemon | Container | A single runnable unit inside a workload |
209
+ | Pokepod | Pod | The smallest deployable unit - houses Posemons |
210
+
211
+ (And many more coming — every mechanic is built to teach something real.)
212
+
213
+ ---
214
+ ## Gameplay Commands
215
+
216
+ Quick in-game commands you’ll use often:
217
+
218
+ - `psyquack validate` → Invokes PsyQuack to evaluate your solution for the current challenge.
219
+ - `psyquack hint` → PsyQuack calls Professor Bald Uncle for a nudge (without spoiling the answer).
220
+ - `psyquack back` → Returns to the previous challenge screen.
221
+
222
+ ---
223
+
224
+ ## Project Yellow Olive in Action
225
+
226
+ ***Full gameplay walkthrough (2 min):
227
+ [Watch on YouTube](https://youtu.be/vAu4aaM1oOw)***
228
+
229
+ ---
230
+
231
+ ## Music Credits
232
+
233
+ All music files used in Project Yellow Olive are sourced from OpenGameArt, shared under the `CC0` license, and the relevant creators are credited below.
234
+
235
+ | Music File | Music Name | Author Name | License | Source |
236
+ |------------|------------|-------------|---------|--------|
237
+ | `screen_1_opening_song.mp3` | JRPG Piano | [Joth](https://opengameart.org/users/joth) | CC0 | OpenGameArt |
238
+ | `screen_2_music.mp3` | Town Theme RPG | [CynicMusic](https://opengameart.org/users/joth) | CC0 | OpenGameArt |
239
+ | `battle_music.ogg` | 8 bit RPG Battle Encounter Theme | [Ted Kerr](https://opengameart.org/users/wolfgang) | CC0 | OpenGameArt |
240
+ | `battle_music_2.mp3` | 8 bit Chiptune Encounter Theme | [Shiru8Bit](https://opengameart.org/users/shiru8bit) | CC0 | OpenGameArt |
241
+ | `win_music.ogg` | Win Jingle | [Fupi](https://opengameart.org/users/fupi) | CC0 | OpenGameArt |
242
+ | `loose_music.ogg` | Lost Game Short Music Clip | [Robin Lamb](https://opengameart.org/users/robin-lamb) | CC0 | OpenGameArt |
243
+
244
+ ---
245
+
246
+ ## Contributing
247
+
248
+ Contributions are welcome, especially for adding new challenges.
249
+
250
+ If you'd like to contribute:
251
+
252
+ 1. Open an issue with the challenge idea and learning objective.
253
+ 2. Add/update challenge text in `challenge_files/`.
254
+ 3. Add/update corresponding manifest files in `challenge_files/{type}-q*.yaml`.
255
+ 4. Add/update challenge validation rules in `core_logic/challenge_validation.py`.
256
+ 5. Submit a pull request with a short demo of the challenge flow.
257
+
258
+ ---
259
+
260
+ ## What's next in the roadmap?
261
+
262
+ This is currently a work in progress. Planned milestones:
263
+
264
+ | Roadmap Stage | Planned Feature | Why It Matters |
265
+ |---------------|------------------|----------------|
266
+ | Phase 1 | Save/load game progress and jump directly to a specific challenge | Lets players resume quickly and practice targeted scenarios |
267
+ | Phase 2 | Add more challenges focused on Kubernetes Services | Expands learning beyond Pods into core networking concepts |
268
+ | Phase 3 | Package and publish Project Yellow Olive on PyPI | Makes installation easier for the community |
269
+
@@ -0,0 +1,237 @@
1
+ # Project Yellow Olive
2
+
3
+ **Pokémon Yellow, but you tame Kubernetes clusters instead of Pokémon.**
4
+
5
+ A terminal-native retro adventure designed to make infrastructure learning feel fun, nostalgic, and a little less overwhelming.
6
+
7
+ [![GitHub stars](https://img.shields.io/github/stars/Anubhav9/Yellow-Olive?style=social)](https://github.com/Anubhav9/Yellow-Olive)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+ [![Python](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)
10
+ [![Made with ❤️ in Bengaluru 🇮🇳](https://img.shields.io/badge/Made%20with%20❤️%20in-Bengaluru%20🇮🇳-%23D4AF37?style=flat)](https://github.com/Anubhav9/Yellow-Olive)
11
+
12
+ <img src="https://github.com/user-attachments/assets/f752fbca-da89-4227-bf44-b4659bf63969" width="80%" alt="Opening screen with Professor Bald">
13
+
14
+ ---
15
+ ## Index
16
+
17
+ - [The Motivation](#the-motivation)
18
+ - [An Honest Take](#an-honest-take)
19
+ - [Setup and Run (Local)](#setup-and-run-local)
20
+ - [Meet the Characters](#meet-the-characters)
21
+ - [From Yellow Olive to Kubernetes](#from-yellow-olive-to-kubernetes)
22
+ - [Gameplay Commands](#gameplay-commands)
23
+ - [Project Yellow Olive in Action](#project-yellow-olive-in-action)
24
+ - [Contributing](#contributing)
25
+ - [What's next in the roadmap?](#whats-next-in-the-roadmap)
26
+
27
+ ---
28
+
29
+ ## The Motivation
30
+
31
+ ```Kubernetes is powerful...
32
+ Kubernetes is everywhere...
33
+ Kubernetes runs the modern world...
34
+ And yet, for many of us, learning it feels confusing, overwhelming, and sometimes just plain boring :(
35
+ ```
36
+
37
+ Project Yellow Olive is my personal, experimental attempt at changing that.
38
+
39
+ I grew up on a GameBoy, lost in the world of Pokémon. Even today, a single chiptune note takes me straight back to those golden childhood days. I know I’m not alone in that feeling.
40
+
41
+ Nostalgia has a strange power - it lowers resistance, sparks curiosity, and makes difficult things feel lighter.
42
+
43
+ Yellow Olive is built on that belief: combine nostalgia with motivation, and even something as complex as Kubernetes can become approachable.
44
+
45
+ ---
46
+
47
+ ## An Honest Take
48
+
49
+ I’ve attempted the CKAD and CKA certifications - and I didn’t clear them.
50
+
51
+ Not because I didn’t understand the concepts, but because I didn’t practice enough. Platforms like Killer.sh demand consistency and repetition - and like many of us, I underestimated that discipline.
52
+
53
+ This project isn’t a replacement for serious exam prep.
54
+
55
+ It’s a practice ground - a way to build confidence, stay engaged, and keep the adrenaline slightly elevated while solving real problems.
56
+
57
+ Not every day is productive. Not every day is high-energy.
58
+
59
+ This is just my attempt to make the hard days a little easier to push through.
60
+
61
+ ---
62
+
63
+ ## Setup and Run
64
+
65
+ ### Prerequisites
66
+
67
+ - Python 3.10+
68
+ - Docker Desktop or Docker Engine (required)
69
+ - `minikube` (required)
70
+ - `kubectl` (required)
71
+
72
+ Project Yellow Olive uses Minikube to create and manage the local Kubernetes cluster used during gameplay, so Docker and Minikube must be installed before starting the game.
73
+
74
+ ### Install Minikube and Kubernetes Tooling
75
+
76
+ 1. Install Docker and make sure it is running.
77
+ 2. Install Minikube by following the official guide: [Install Minikube](https://minikube.sigs.k8s.io/docs/start/)
78
+ 3. Install `kubectl` by following the official guide: [Install kubectl](https://kubernetes.io/docs/tasks/tools/)
79
+
80
+ You can verify the setup with:
81
+
82
+ ```bash
83
+ docker --version
84
+ minikube version
85
+ kubectl version --client
86
+ ```
87
+
88
+ ### Install from PyPI
89
+
90
+ ```bash
91
+ python -m venv .venv
92
+ source .venv/bin/activate
93
+ pip install yellow-olive
94
+ ```
95
+
96
+ ### Start the Game from PyPI
97
+
98
+ ```bash
99
+ yellow-olive start
100
+ ```
101
+
102
+ When the game starts, Project Yellow Olive creates a `yellow-olive-lab/` folder in your current working directory and places the editable challenge manifests there.
103
+
104
+ ### Install from Source
105
+
106
+ ```bash
107
+ git clone https://github.com/Anubhav9/Yellow-Olive.git
108
+ cd Yellow-Olive
109
+ python -m venv .venv
110
+ source .venv/bin/activate
111
+ pip install -r requirements.txt
112
+ ```
113
+
114
+ ### Start the Game from Source
115
+
116
+ ```bash
117
+ python app.py
118
+ ```
119
+
120
+ When you start the game and proceed through initialization, Yellow Olive will start a Minikube profile and switch kubectl context automatically.
121
+
122
+ ### Helpful Tip for Gameplay
123
+
124
+ Keep two terminal tabs open:
125
+
126
+ 1. **Game terminal** -> run `yellow-olive start` or `python app.py`
127
+ 2. **Command Chamber terminal** -> run your `kubectl` commands for challenge fixes
128
+
129
+ ---
130
+
131
+ ## Meet the Characters
132
+
133
+ ### Professor Bald Uncle
134
+ <p align="center">
135
+ <img width="120" src="https://github.com/user-attachments/assets/0b975f11-f319-45fe-96f1-6d73b557f17a" alt="Professor Bald Uncle" />
136
+ </p>
137
+
138
+ ```
139
+ The classic mentor archetype. Calm, experienced, slightly intimidating at first glance.
140
+
141
+ He steps in when you’re stuck, nudges you in the right direction, and reminds you that debugging is part of the journey.
142
+
143
+ Strict on the outside, generous at heart.
144
+ ```
145
+
146
+ ### Electromon
147
+ <p align="center">
148
+ <img width="120" src="https://github.com/user-attachments/assets/dad3be2b-216f-44ec-9a12-c79c763dfd32" alt="Electromon" />
149
+ </p>
150
+
151
+ ```
152
+ Your closest companion. Quiet by nature, but restless at heart — he doesn’t like being confined for long.
153
+
154
+ When something feels off in the cluster, he’s usually at the center of it. Shy, but loyal through every broken deployment.
155
+ ```
156
+
157
+ ### PsyQuack
158
+ <p align="center">
159
+ <img width="120" src="https://github.com/user-attachments/assets/bfc93cfc-f4c5-4b58-ac6a-4c430eb8b879" alt="PsyQuack" />
160
+ </p>
161
+
162
+ ```
163
+ He doesn’t talk much. He watches.
164
+ You think you fixed the Deployment? He checks.
165
+ You’re confident the Service works? He verifies.
166
+ If something’s still off, PsyQuack will let you know - in his own slightly unhinged way.
167
+ He doesn’t reward effort. He rewards correctness.
168
+ ```
169
+ ---
170
+ ## From Yellow Olive to Kubernetes
171
+
172
+ Every character, keyword, and challenge maps directly to a real Kubernetes concept.
173
+
174
+ | Yellow Olive Concept | Kubernetes Equivalent | What It Means in Practice |
175
+ |----------------------|-----------------------|----------------------------------------------------|
176
+ | Posemon | Container | A single runnable unit inside a workload |
177
+ | Pokepod | Pod | The smallest deployable unit - houses Posemons |
178
+
179
+ (And many more coming — every mechanic is built to teach something real.)
180
+
181
+ ---
182
+ ## Gameplay Commands
183
+
184
+ Quick in-game commands you’ll use often:
185
+
186
+ - `psyquack validate` → Invokes PsyQuack to evaluate your solution for the current challenge.
187
+ - `psyquack hint` → PsyQuack calls Professor Bald Uncle for a nudge (without spoiling the answer).
188
+ - `psyquack back` → Returns to the previous challenge screen.
189
+
190
+ ---
191
+
192
+ ## Project Yellow Olive in Action
193
+
194
+ ***Full gameplay walkthrough (2 min):
195
+ [Watch on YouTube](https://youtu.be/vAu4aaM1oOw)***
196
+
197
+ ---
198
+
199
+ ## Music Credits
200
+
201
+ All music files used in Project Yellow Olive are sourced from OpenGameArt, shared under the `CC0` license, and the relevant creators are credited below.
202
+
203
+ | Music File | Music Name | Author Name | License | Source |
204
+ |------------|------------|-------------|---------|--------|
205
+ | `screen_1_opening_song.mp3` | JRPG Piano | [Joth](https://opengameart.org/users/joth) | CC0 | OpenGameArt |
206
+ | `screen_2_music.mp3` | Town Theme RPG | [CynicMusic](https://opengameart.org/users/joth) | CC0 | OpenGameArt |
207
+ | `battle_music.ogg` | 8 bit RPG Battle Encounter Theme | [Ted Kerr](https://opengameart.org/users/wolfgang) | CC0 | OpenGameArt |
208
+ | `battle_music_2.mp3` | 8 bit Chiptune Encounter Theme | [Shiru8Bit](https://opengameart.org/users/shiru8bit) | CC0 | OpenGameArt |
209
+ | `win_music.ogg` | Win Jingle | [Fupi](https://opengameart.org/users/fupi) | CC0 | OpenGameArt |
210
+ | `loose_music.ogg` | Lost Game Short Music Clip | [Robin Lamb](https://opengameart.org/users/robin-lamb) | CC0 | OpenGameArt |
211
+
212
+ ---
213
+
214
+ ## Contributing
215
+
216
+ Contributions are welcome, especially for adding new challenges.
217
+
218
+ If you'd like to contribute:
219
+
220
+ 1. Open an issue with the challenge idea and learning objective.
221
+ 2. Add/update challenge text in `challenge_files/`.
222
+ 3. Add/update corresponding manifest files in `challenge_files/{type}-q*.yaml`.
223
+ 4. Add/update challenge validation rules in `core_logic/challenge_validation.py`.
224
+ 5. Submit a pull request with a short demo of the challenge flow.
225
+
226
+ ---
227
+
228
+ ## What's next in the roadmap?
229
+
230
+ This is currently a work in progress. Planned milestones:
231
+
232
+ | Roadmap Stage | Planned Feature | Why It Matters |
233
+ |---------------|------------------|----------------|
234
+ | Phase 1 | Save/load game progress and jump directly to a specific challenge | Lets players resume quickly and practice targeted scenarios |
235
+ | Phase 2 | Add more challenges focused on Kubernetes Services | Expands learning beyond Pods into core networking concepts |
236
+ | Phase 3 | Package and publish Project Yellow Olive on PyPI | Makes installation easier for the community |
237
+
@@ -0,0 +1,87 @@
1
+ from pathlib import Path
2
+ import argparse
3
+
4
+ from textual.app import App,ComposeResult
5
+ from textual.widgets import Static, Button, Header,RichLog
6
+ from textual.containers import Horizontal,Vertical
7
+ from textual import on
8
+ from screens import professor_bald_intro
9
+ from dialouges import professor_bald_dialogue
10
+ from screens.author_info import AuthorInfo
11
+ from screens.professor_bald_intro import ProfessorBaldIntro
12
+ from screens.help_screen import HelpScreen
13
+ from utils import general_utils
14
+
15
+
16
+ class ProjectOlive(App):
17
+ TITLE = ("Welcome to Professor Bald's Laboratory")
18
+ CSS_PATH = str(Path(__file__).resolve().with_name("app.tcss"))
19
+ def compose(self) -> ComposeResult:
20
+ yield Header()
21
+ with Horizontal():
22
+ with Vertical(id="menu-option"):
23
+ yield Static("Menu",id="menu-text")
24
+ yield Button("Start Game",id="start-game")
25
+ yield Button("Help",id="help")
26
+ yield Button("About the Author",id="about-the-author")
27
+ yield Button("Quit", id="quit")
28
+ with Vertical(id="game-area"):
29
+
30
+ yield Static("Project Yellow Olive - A Pokemon inspired Kubernetes game!",id="default-text")
31
+ yield Vertical(id="game-flow")
32
+
33
+ @on(Button.Pressed, "#start-game")
34
+ async def button_press_start_game(self,event=Button.Pressed):
35
+ game_area=self.query_one("#game-flow")
36
+ for child in list(game_area.children):
37
+ await child.remove()
38
+ professor_bald_intro=ProfessorBaldIntro()
39
+ await game_area.mount(professor_bald_intro)
40
+ self.run_worker(professor_bald_intro.render_professor_bald_intro(professor_bald_dialogue.PROFESSOR_BALD_DIALOGUES,"#D4AF37"))
41
+
42
+ @on(Button.Pressed, "#help")
43
+ async def button_press_help(self, event=Button.Pressed):
44
+ game_area = self.query_one("#game-flow")
45
+ for child in list(game_area.children):
46
+ await child.remove()
47
+ help_screen = HelpScreen()
48
+ await game_area.mount(help_screen)
49
+
50
+ @on(Button.Pressed, "#about-the-author")
51
+ async def button_press_about_the_author(self, event=Button.Pressed):
52
+ game_area = self.query_one("#game-flow")
53
+ for child in list(game_area.children):
54
+ await child.remove()
55
+ author_info = AuthorInfo()
56
+ await game_area.mount(author_info)
57
+ self.run_worker(author_info.details_about_author("#D4AF37"))
58
+
59
+ @on(Button.Pressed, "#quit")
60
+ async def button_press_quit(self, event=Button.Pressed):
61
+ self.exit()
62
+
63
+
64
+
65
+ def main():
66
+ general_utils.ensure_lab_workspace()
67
+ app = ProjectOlive()
68
+ app.run()
69
+
70
+
71
+ def cli():
72
+ parser = argparse.ArgumentParser(prog="yellow-olive")
73
+ subparsers = parser.add_subparsers(dest="command")
74
+
75
+ subparsers.add_parser("start", help="Start Project Yellow Olive")
76
+
77
+ args = parser.parse_args()
78
+
79
+ if args.command == "start":
80
+ main()
81
+ return
82
+
83
+ parser.print_help()
84
+
85
+
86
+ if __name__ == "__main__":
87
+ main()