mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-11 03:40:05 +00:00
parent
ab1b88861f
commit
00527f557a
6 changed files with 737 additions and 82 deletions
572
run.json
572
run.json
File diff suppressed because one or more lines are too long
187
stages/003-implement_app@1/diff.patch
Normal file
187
stages/003-implement_app@1/diff.patch
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
diff --git a/card-game-app/README.md b/card-game-app/README.md
|
||||
index 1dcc61063..4c8170564 100644
|
||||
--- a/card-game-app/README.md
|
||||
+++ b/card-game-app/README.md
|
||||
@@ -3,23 +3,40 @@
|
||||
A terminal-based Spider Solitaire game built in Python using the standard library `curses` module, with zero external dependencies.
|
||||
|
||||
## Key Features
|
||||
-- **Responsive Terminal Design**: Supports 1-suit (Spades), 2-suit (Spades & Hearts), or 4-suit (standard) gameplay, rendering beautifully on any standard terminal.
|
||||
+- **Responsive Terminal Design**: Supports 1-suit (Spades), 2-suit (Spades & Hearts), or 4-suit (standard) configurations, rendering beautifully on any standard terminal.
|
||||
- **Visual Card Highlighting**: Distinctive Red/White colors for card suits and full multi-card selection highlights.
|
||||
- **Intuitive Keyboard Controls**: Smooth cursor-based navigation across tableau columns and vertical selection.
|
||||
-- **Full Undo/Redo Support**: Save states stored in a history stack so you can undo any mistake.
|
||||
+- **Full Undo Support**: Save states stored in an undo stack so you can roll back any move.
|
||||
- **Non-interactive Smoke Test & Verification Suite**: Run automatic unit tests and logic validation completely headlessly.
|
||||
|
||||
+## Project Structure
|
||||
+
|
||||
+```text
|
||||
+card-game-app/
|
||||
+├── pyproject.toml
|
||||
+├── README.md
|
||||
+├── main.py
|
||||
+├── src/
|
||||
+│ └── card_game_tui/
|
||||
+│ ├── __init__.py
|
||||
+│ ├── game.py
|
||||
+│ └── ui.py
|
||||
+└── tests/
|
||||
+ ├── __init__.py
|
||||
+ └── test_game.py
|
||||
+```
|
||||
+
|
||||
## How to Play
|
||||
|
||||
Run the game using Python:
|
||||
|
||||
```bash
|
||||
-python3 card-game-app/main.py
|
||||
+python3 main.py
|
||||
```
|
||||
|
||||
Choose suits count (1, 2, or 4):
|
||||
```bash
|
||||
-python3 card-game-app/main.py --suits 2
|
||||
+python3 main.py --suits 2
|
||||
```
|
||||
|
||||
### Controls:
|
||||
@@ -37,10 +54,15 @@ python3 card-game-app/main.py --suits 2
|
||||
|
||||
To run the unit tests:
|
||||
```bash
|
||||
-PYTHONPATH=card-game-app python3 -m unittest card-game-app/test_game.py
|
||||
+python3 -m pytest tests/ -v
|
||||
```
|
||||
|
||||
To run the non-interactive smoke test suite:
|
||||
```bash
|
||||
-python3 card-game-app/main.py --smoke
|
||||
+python3 main.py --smoke
|
||||
+```
|
||||
+
|
||||
+To run the full suite (testing, syntax compilation, and smoke-testing):
|
||||
+```bash
|
||||
+python3 -m pytest tests/ -v && python3 -m py_compile main.py src/card_game_tui/*.py && python3 main.py --smoke
|
||||
```
|
||||
diff --git a/card-game-app/main.py b/card-game-app/main.py
|
||||
index 175b54437..bffd0886d 100755
|
||||
--- a/card-game-app/main.py
|
||||
+++ b/card-game-app/main.py
|
||||
@@ -1,7 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import argparse
|
||||
-from game import SpiderGame, Card
|
||||
+from pathlib import Path
|
||||
+
|
||||
+# Add src/ directory to the library path
|
||||
+src_path = Path(__file__).parent / "src"
|
||||
+sys.path.insert(0, str(src_path))
|
||||
+
|
||||
+from card_game_tui.game import SpiderGame, Card
|
||||
|
||||
def run_smoke_test():
|
||||
"""Runs a non-interactive verification suite to confirm game rules and states."""
|
||||
@@ -84,6 +90,18 @@ def run_smoke_test():
|
||||
assert game.tableau[0][0].face_up == True, "Remaining facedown card should be flipped face-up"
|
||||
print("[PASSED] Run-clearing logic successfully validated.")
|
||||
|
||||
+ # 7. Print a simple terminal layout simulation for smoke-test
|
||||
+ print("\nSimulated Terminal Layout Render:")
|
||||
+ print("---------------------------------")
|
||||
+ cols_render = []
|
||||
+ for c_idx in range(10):
|
||||
+ col_cards = game.tableau[c_idx]
|
||||
+ cards_str = ", ".join(repr(card) for card in col_cards)
|
||||
+ print(f"Col {c_idx}: {cards_str}")
|
||||
+ print(f"Stock size: {len(game.stock)}")
|
||||
+ print(f"Completed runs: {game.completed_runs}/8")
|
||||
+ print("---------------------------------")
|
||||
+
|
||||
print("\n====================================================")
|
||||
print("ALL SMOKE TESTS PASSED!")
|
||||
print("====================================================")
|
||||
@@ -100,7 +118,7 @@ def main():
|
||||
else:
|
||||
# Import UI here to avoid curses import issues if running in non-terminal environments
|
||||
try:
|
||||
- from ui import SpiderSolitaireUI
|
||||
+ from card_game_tui.ui import SpiderSolitaireUI
|
||||
except ImportError as e:
|
||||
print(f"Error: Could not import curses UI. Make sure you are in a terminal environment. Details: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
diff --git a/card-game-app/pyproject.toml b/card-game-app/pyproject.toml
|
||||
new file mode 100644
|
||||
index 000000000..12d950bcd
|
||||
--- /dev/null
|
||||
+++ b/card-game-app/pyproject.toml
|
||||
@@ -0,0 +1,20 @@
|
||||
+[build-system]
|
||||
+requires = ["setuptools>=61.0.0"]
|
||||
+build-backend = "setuptools.build_meta"
|
||||
+
|
||||
+[project]
|
||||
+name = "card_game_tui"
|
||||
+version = "0.1.0"
|
||||
+description = "A terminal-based Spider Solitaire game in Python using curses"
|
||||
+readme = "README.md"
|
||||
+requires-python = ">=3.8"
|
||||
+license = {text = "MIT"}
|
||||
+classifiers = [
|
||||
+ "Programming Language :: Python :: 3",
|
||||
+ "License :: OSI Approved :: MIT License",
|
||||
+ "Operating System :: OS Independent",
|
||||
+]
|
||||
+
|
||||
+[tool.pytest.ini_options]
|
||||
+pythonpath = ["src"]
|
||||
+testpaths = ["tests"]
|
||||
diff --git a/card-game-app/src/card_game_tui/__init__.py b/card-game-app/src/card_game_tui/__init__.py
|
||||
new file mode 100644
|
||||
index 000000000..6b01371db
|
||||
--- /dev/null
|
||||
+++ b/card-game-app/src/card_game_tui/__init__.py
|
||||
@@ -0,0 +1 @@
|
||||
+# Card Game TUI Package
|
||||
diff --git a/card-game-app/game.py b/card-game-app/src/card_game_tui/game.py
|
||||
similarity index 100%
|
||||
rename from card-game-app/game.py
|
||||
rename to card-game-app/src/card_game_tui/game.py
|
||||
diff --git a/card-game-app/ui.py b/card-game-app/src/card_game_tui/ui.py
|
||||
similarity index 99%
|
||||
rename from card-game-app/ui.py
|
||||
rename to card-game-app/src/card_game_tui/ui.py
|
||||
index a3cdbf3a4..cca85fc73 100644
|
||||
--- a/card-game-app/ui.py
|
||||
+++ b/card-game-app/src/card_game_tui/ui.py
|
||||
@@ -1,6 +1,6 @@
|
||||
import curses
|
||||
import sys
|
||||
-from game import SpiderGame, Card
|
||||
+from card_game_tui.game import SpiderGame, Card
|
||||
|
||||
class SpiderSolitaireUI:
|
||||
def __init__(self, suits_count=1):
|
||||
diff --git a/card-game-app/tests/__init__.py b/card-game-app/tests/__init__.py
|
||||
new file mode 100644
|
||||
index 000000000..d4839a6b1
|
||||
--- /dev/null
|
||||
+++ b/card-game-app/tests/__init__.py
|
||||
@@ -0,0 +1 @@
|
||||
+# Tests package
|
||||
diff --git a/card-game-app/test_game.py b/card-game-app/tests/test_game.py
|
||||
similarity index 98%
|
||||
rename from card-game-app/test_game.py
|
||||
rename to card-game-app/tests/test_game.py
|
||||
index f4286223f..665fabc15 100644
|
||||
--- a/card-game-app/test_game.py
|
||||
+++ b/card-game-app/tests/test_game.py
|
||||
@@ -1,5 +1,5 @@
|
||||
import unittest
|
||||
-from game import Card, SpiderGame
|
||||
+from card_game_tui.game import Card, SpiderGame
|
||||
|
||||
class TestSpiderGame(unittest.TestCase):
|
||||
def test_card_init(self):
|
||||
6
stages/003-implement_app@1/status.json
Normal file
6
stages/003-implement_app@1/status.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"outcome": "succeeded",
|
||||
"notes": "Stage completed: implement_app",
|
||||
"failure_reason": null,
|
||||
"timestamp": "2026-06-05T00:02:19.701309Z"
|
||||
}
|
||||
25
stages/004-verify_app@1/prompt.md
Normal file
25
stages/004-verify_app@1/prompt.md
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
Goal: Build a terminal-based Spider solitaire game in Python
|
||||
|
||||
## Completed stages
|
||||
- **plan_app**: succeeded
|
||||
- Model: gemini-3.5-flash, 126.8k tokens in / 22.7k out
|
||||
- Files: /home/daytona/workspace/fabro/.ai/card-game-fast-plan.md, /home/daytona/workspace/fabro/card-game-app/README.md, /home/daytona/workspace/fabro/card-game-app/game.py, /home/daytona/workspace/fabro/card-game-app/main.py, /home/daytona/workspace/fabro/card-game-app/test_game.py, /home/daytona/workspace/fabro/card-game-app/ui.py, /home/daytona/workspace/fabro/status.json
|
||||
- **implement_app**: succeeded
|
||||
- Model: gemini-3.5-flash, 192.3k tokens in / 10.1k out
|
||||
- Files: /home/daytona/workspace/fabro/card-game-app/README.md, /home/daytona/workspace/fabro/card-game-app/main.py, /home/daytona/workspace/fabro/card-game-app/pyproject.toml, /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/__init__.py, /home/daytona/workspace/fabro/card-game-app/src/card_game_tui/ui.py, /home/daytona/workspace/fabro/card-game-app/tests/__init__.py, /home/daytona/workspace/fabro/card-game-app/tests/test_game.py, /home/daytona/workspace/fabro/status.json
|
||||
|
||||
|
||||
Verify the completed card game app.
|
||||
|
||||
Run:
|
||||
cd card-game-app && python3 -m pytest tests/ -v && python3 -m py_compile main.py src/card_game_tui/*.py && python3 main.py --smoke
|
||||
|
||||
Check:
|
||||
- The app is under card-game-app/
|
||||
- It uses curses for the interactive TUI
|
||||
- It implements the requested game rules
|
||||
- README.md explains setup, run, tests, and controls
|
||||
- No generated files are outside card-game-app/ except .ai/ reports and root status.json
|
||||
|
||||
Write findings to .ai/card-game-fast-verify.md.
|
||||
Write status.json at workspace root: outcome=succeeded if the app is demo-ready, outcome=failed with specific missing or broken items.
|
||||
5
stages/004-verify_app@1/provider_used.json
Normal file
5
stages/004-verify_app@1/provider_used.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"mode": "agent",
|
||||
"provider": "gemini",
|
||||
"model": "gemini-3.5-flash"
|
||||
}
|
||||
24
stages/004-verify_app@1/response.md
Normal file
24
stages/004-verify_app@1/response.md
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
I have successfully verified the completed terminal-based Spider Solitaire game application.
|
||||
|
||||
### 1. Test Execution & Smoke Verification
|
||||
Running the verification command:
|
||||
```bash
|
||||
cd card-game-app && python3 -m pytest tests/ -v && python3 -m py_compile main.py src/card_game_tui/*.py && python3 main.py --smoke
|
||||
```
|
||||
- **Unit Tests**: All 7 test cases in `tests/test_game.py` passed in `0.01s`.
|
||||
- **Syntax Check**: All source files compiled perfectly (`main.py`, `game.py`, `ui.py`).
|
||||
- **Smoke Tests**: Non-interactive suite in `main.py` simulated card movement, undo, stock dealing empty-column constraint validation, run-clearing, and mock rendering. All smoke tests **passed**.
|
||||
|
||||
---
|
||||
|
||||
### 2. File and Directory Structure Checklist
|
||||
- **App Location**: All production and test code is located entirely within `card-game-app/`.
|
||||
- **External files**: No temporary files or unexpected edits exist outside of `card-game-app/` besides `.ai/` files and the root `status.json`.
|
||||
- **TUI Library**: Uses Python's standard library `curses` module with zero external dependencies, making it ultra-portable and clean.
|
||||
- **Controls & Setup**: `README.md` clearly explains setup, execution, tests, and controls (arrow keys for navigation, numbers `0-9` for column jumping, `u` for undo, `d` for dealing, etc.).
|
||||
|
||||
---
|
||||
|
||||
### 3. Verification Findings Written
|
||||
- Detailed verification findings have been written to **`.ai/card-game-fast-verify.md`**.
|
||||
- The workspace status has been set to **`succeeded`** in **`status.json`**.
|
||||
Loading…
Add table
Reference in a new issue