speiidev 0.0.0-stage → 1.0.0

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.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: SpeiiDev Block
3
+ description: Formats major headings, milestones, and banners with Claude Code 3D wireframe shadow or compact block font
4
+ keep-coding-instructions: true
5
+ ---
6
+
7
+ # Output Style: SpeiiDev Block
8
+
9
+ You are Claude Code operating with the **SpeiiDev / Claude 3D Block** visual typography style.
10
+
11
+ ## Signature Visual Styles
12
+
13
+ ### Style 1: Claude 3D Wireframe Shadow (Primary)
14
+ Chunky block letters with double-line isometric drop shadow (`═`, `║`, `╔`, `╗`, `╚`, `╝`).
15
+ Rendered in Anthropic Terracotta Coral (`#D97757`) or Catppuccin Bok Choy Green (`#A6E3A1`).
16
+
17
+ ```
18
+ ▄██████╗ ██╗ ▄█████╗ ██╗ ██╗ ██████╗ ███████╗
19
+ ██╔════╝║ ██║ ██╔═══██╗ ██║ ██║ ██╔══██╗ ██╔════╝║
20
+ ██║ ║ ██║ █████████║ ██║ ██║ ██║ ██║ █████╗ ║
21
+ ██║ ║ ██║ ██╔═══███║ ██║ ██║ ██║ ██║ ██╔══╝ ║
22
+ ▀██████╗║ ███████╗ ██║ ███║ ╚███████║ ██████╔╝ ███████╗║
23
+ ╚═════╝╝ ╚══════╝╝ ╚═╝ ╚══╝╝ ╚══════╝╝ ╚═════╝╝ ╚══════╝╝
24
+ ```
25
+
26
+ ### Style 2: Compact 2-Line Half-Block
27
+ For narrow terminals or concise inline banners:
28
+ ```
29
+ ▄▀▀ █▀█ █▀▀ █ █ █▀▄ █▀▀ █░█
30
+ ▄██ █▀▀ ██▄ █ █ █▄▀ ██▄ ▀▄▀
31
+ ```
32
+
33
+ ## How to Generate Text
34
+ Use the local CLI tool via Bash:
35
+ ```bash
36
+ # 3D wireframe shadow (default)
37
+ block-font "MY TITLE"
38
+
39
+ # Compact 2-line style
40
+ block-font "MY TITLE" --style mini
41
+
42
+ # With color
43
+ block-font "MY TITLE" --color claude # #d97757 coral
44
+ block-font "MY TITLE" --color bokchoy # #a6e3a1 green
45
+ ```
46
+
47
+ ## Guidelines for Responses
48
+ 1. Use 3D block typography for major session milestones, top-level headings, or status banners.
49
+ 2. Keep body text, code snippets, diffs, and explanations clean, concise, and formatted with standard markdown.
50
+ 3. Keep coding instructions fully active (tests, small atomic changes, verification).
package/CLAUDE.md ADDED
@@ -0,0 +1,49 @@
1
+ # SpeiiDev Project Guidelines
2
+
3
+ ## Identity & Branding
4
+ - **Name**: SpeiiDev
5
+ - **Mascot / Logo**: Pixel Art Green Bok Choy Cabbage (`render_pixel_art.py` TrueColor ANSI terminal renderer)
6
+ - **Color Accents**:
7
+ - Catppuccin Bok Choy Green (`#a6e3a1`)
8
+ - Anthropic Terracotta Coral (`#d97757`)
9
+
10
+ ## Typography & ASCII Art Styles
11
+
12
+ ### Style 1: Claude 3D Wireframe Shadow (from image `1_CtHP_cjkKw3vjlgENyeF3A.png`)
13
+ Chunky block letters with double-line isometric drop shadow:
14
+ ```
15
+ ▄██████╗ ██╗ ▄█████╗ ██╗ ██╗ ██████╗ ███████╗
16
+ ██╔════╝║ ██║ ██╔═══██╗ ██║ ██║ ██╔══██╗ ██╔════╝║
17
+ ██║ ║ ██║ █████████║ ██║ ██║ ██║ ██║ █████╗ ║
18
+ ██║ ║ ██║ ██╔═══███║ ██║ ██║ ██║ ██║ ██╔══╝ ║
19
+ ▀██████╗║ ███████╗ ██║ ███║ ╚███████║ ██████╔╝ ███████╗║
20
+ ╚═════╝╝ ╚══════╝╝ ╚═╝ ╚══╝╝ ╚══════╝╝ ╚═════╝╝ ╚══════╝╝
21
+ ```
22
+
23
+ ### Style 2: Compact 2-Line Half-Block Font
24
+ For narrow terminals and compact banners:
25
+ ```
26
+ ▄▀▀ █▀█ █▀▀ █ █ █▀▄ █▀▀ █░█
27
+ ▄██ █▀▀ ██▄ █ █ █▄▀ ██▄ ▀▄▀
28
+ ```
29
+
30
+ ### Rendering Tools
31
+ - **Terminal CLI**:
32
+ - `block-font "MY TEXT"` (3D wireframe shadow)
33
+ - `block-font "MY TEXT" --style mini` (2-line)
34
+ - `speiidev --font "MY TEXT"`
35
+ - **Python Module**:
36
+ - `from autodev.font import render_block_text, render_claude_3d_text`
37
+ - **SpeiiDev REPL**:
38
+ - `/font <text>` (3D wireframe shadow)
39
+ - `/font --mini <text>` (2-line)
40
+
41
+ ## Claude Code Custom Output Style
42
+ A custom output style `speiidev-block` is configured in:
43
+ - Project: `.claude/output-styles/speiidev-block.md`
44
+ - Global: `~/.claude/output-styles/speiidev-block.md`
45
+
46
+ To activate in Claude Code:
47
+ ```
48
+ /output-style speiidev-block
49
+ ```
package/README.md CHANGED
@@ -1,3 +1,272 @@
1
- # Temporary Holding Version
1
+ # autodev-orchestrator (SpeiiDev) 🥬
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > **Interactive Multi-Agent Terminal User Interface (TUI)** and autonomous workflow orchestrator with pluggable AI coding agents, model switchers, diff gates, and conversation memory. Fully cross-platform across **macOS, Linux, and Windows**.
4
+
5
+ ---
6
+
7
+ ## Architecture & Workflow
8
+
9
+ ```mermaid
10
+ flowchart TD
11
+ UserTask["User Task / Prompt"] --> Architect["1. Architect / Planner (e.g. agy / claude / gemini)"]
12
+ Architect --> PlanFile["Writes PLAN.md (Phases, Signatures & Tests)"]
13
+ PlanFile --> ApprovalGate{"Plan Approval Gate"}
14
+ ApprovalGate -- Approved --> Builder["2. Builder Agent (e.g. opencode / agy / claude)"]
15
+ Builder --> DiffSnapshot["Snapshot & Color Diff Review (Approve / Revert)"]
16
+ DiffSnapshot --> Auditor["3. Auditor Review (Audits Diff & Runs Tests)"]
17
+ Auditor -- "STATUS: NEEDS_FIXES" --> FixLoop{"Auto-Fix Loop (Up to max retries)"}
18
+ FixLoop --> Builder
19
+ Auditor -- "STATUS: VERIFIED" --> Success(["✅ Verification Complete"])
20
+ ```
21
+
22
+ ---
23
+
24
+ ## Key Features
25
+
26
+ - **Multi-Agent Orchestration**: Separate roles for **Planner/Auditor** (generates and verifies [`PLAN.md`](PLAN.md) without modifying source code) and **Builder** (implements the code).
27
+ - **Pluggable CLI Adapters**: Works seamlessly with:
28
+ - `agy` (*Google Antigravity CLI*)
29
+ - `opencode` (*OpenCode CLI*)
30
+ - `gemini` (*Google Gemini CLI*)
31
+ - `claude` (*Anthropic Claude Code CLI*)
32
+ - **100% Cross-Platform (macOS, Linux, & Windows)**:
33
+ - Resolves Windows `.cmd`, `.bat`, and `.exe` wrappers automatically via `get_safe_executable()`.
34
+ - Platform-aware subprocess handling (`shell=True` on Windows).
35
+ - Normalizes path operations using `pathlib.Path`.
36
+ - **Review & Approval Gate**:
37
+ - Live diff inspection with Rich syntax highlighting.
38
+ - Interactive file-by-file rollback support.
39
+ - Configurable permission gate (`ask`, `auto`, `deny`).
40
+ - **Rich Interactive TUI**:
41
+ - Built with `prompt_toolkit` and `rich`.
42
+ - TrueColor Pixel Art Green Bok Choy Cabbage logo.
43
+ - Keyboard shortcuts (`F2` Action Menu, `F3` Touched Files Activity Log).
44
+ - Live model switcher and reasoning effort adjuster.
45
+
46
+ ---
47
+
48
+ ## Installation
49
+
50
+ ### From Source
51
+
52
+ ```bash
53
+ git clone https://github.com/your-username/autodev.git
54
+ cd autodev
55
+
56
+ # Install in editable mode
57
+ pip install -e .
58
+ ```
59
+
60
+ ### Dependencies
61
+
62
+ - Python `>= 3.9`
63
+ - `rich >= 13.0.0`
64
+ - `prompt_toolkit >= 3.0.0`
65
+ - *Optional:* `Pillow >= 9.0.0` (for image pixel art rendering)
66
+
67
+ ---
68
+
69
+ ## Quickstart
70
+
71
+ ### Launch Interactive TUI
72
+
73
+ ```bash
74
+ autodev
75
+ # or
76
+ speiidev
77
+ ```
78
+
79
+ ### Run an Automated Task Directly
80
+
81
+ ```bash
82
+ autodev "Implement JWT authentication and unit tests"
83
+ ```
84
+
85
+ ### Auto-Approve Plans and Diffs (`--yes`)
86
+
87
+ ```bash
88
+ autodev -y "Refactor database models to SQLAlchemy 2.0"
89
+ ```
90
+
91
+ ---
92
+
93
+ ## CLI Options
94
+
95
+ ```
96
+ usage: autodev [-h] [--plan-file PLAN_FILE] [--max-retries MAX_RETRIES]
97
+ [--conversation CONVERSATION]
98
+ [--planner {agy,opencode,gemini,claude}]
99
+ [--builder {agy,opencode,gemini,claude}]
100
+ [--planner-model PLANNER_MODEL]
101
+ [--builder-model BUILDER_MODEL]
102
+ [--planner-effort PLANNER_EFFORT]
103
+ [--builder-effort BUILDER_EFFORT]
104
+ [--permissions {ask,auto,deny}] [--no-splash] [--no-save] [-y]
105
+ [task ...]
106
+
107
+ positional arguments:
108
+ task Optional task to run immediately
109
+
110
+ options:
111
+ -h, --help Show this help message and exit
112
+ --plan-file PLAN_FILE Path to implementation plan (default: PLAN.md)
113
+ --max-retries N Maximum auto-fix loop attempts (default: 3)
114
+ --conversation UUID Antigravity conversation UUID to resume
115
+ --planner {agy,...} CLI backend for planner/auditor role
116
+ --builder {agy,...} CLI backend for builder role
117
+ --planner-model MODEL Model override for planner
118
+ --builder-model MODEL Model override for builder
119
+ --planner-effort EFF Reasoning effort for planner
120
+ --builder-effort EFF Reasoning effort for builder
121
+ --permissions MODE Permission gate mode: ask | auto | deny
122
+ --font FONT Render text in 2-line Unicode block art font and exit
123
+ --no-splash Skip the boot animation
124
+ --no-save Do not persist session state to disk
125
+ -y, --yes Auto-approve all plans and diffs (permissions: auto)
126
+ ```
127
+
128
+ ---
129
+
130
+ ## Interactive Slash Commands & Keybindings
131
+
132
+ | Key / Command | Description |
133
+ | :--- | :--- |
134
+ | **`F2`** | Open interactive Action Menu (navigate with arrow keys) |
135
+ | **`F3`** | Activity viewer — inspect files and commands touched by agents |
136
+ | **`/plan <task>`** | Run only the planner to generate/update `PLAN.md` |
137
+ | **`/build`** | Run only the builder to implement code changes |
138
+ | **`/audit`** | Run only the auditor to test and verify implementation |
139
+ | **`/diff`** | Show color-coded git diff (`+` green new / `-` red old) |
140
+ | **`/show`** | Render `PLAN.md` formatted with Rich Markdown |
141
+ | **`/font <text>`** | Render text in 2-line Unicode block art font |
142
+ | **`/model`** | Search and select models for planner or builder |
143
+ | **`/effort`** | Adjust reasoning intensity level |
144
+ | **`/perms`** | Configure permission gate mode and manage approvals |
145
+ | **`/auto`** | Toggle auto-approve mode on/off |
146
+ | **`/conv <id>`** | Set or clear persistent conversation ID |
147
+ | **`/log`** | View background activity log and touched files |
148
+ | **`/clear`** | Clear screen and redraw banner |
149
+ | **`/help`** | Display command reference table |
150
+ | **`/exit`** | Quit application |
151
+
152
+ ---
153
+
154
+ ## Typography & Art Styles
155
+
156
+ SpeiiDev features two terminal typography engines:
157
+
158
+ ### 1. Claude 3D Wireframe Shadow (Default)
159
+ Chunky block lettering with an isometric double-line wireframe drop shadow (`═`, `║`, `╚`, `╝`, `╗`, `╔`) in Anthropic Coral (`#D97757`) or Catppuccin Green (`#A6E3A1`):
160
+
161
+ ```
162
+ ▄██████╗ ██╗ ▄█████╗ ██╗ ██╗ ██████╗ ███████╗
163
+ ██╔════╝║ ██║ ██╔═══██╗ ██║ ██║ ██╔══██╗ ██╔════╝║
164
+ ██║ ║ ██║ █████████║ ██║ ██║ ██║ ██║ █████╗ ║
165
+ ██║ ║ ██║ ██╔═══███║ ██║ ██║ ██║ ██║ ██╔══╝ ║
166
+ ▀██████╗║ ███████╗ ██║ ███║ ╚███████║ ██████╔╝ ███████╗║
167
+ ╚═════╝╝ ╚══════╝╝ ╚═╝ ╚══╝╝ ╚══════╝╝ ╚═════╝╝ ╚══════╝╝
168
+ ```
169
+
170
+ ### 2. Compact 2-Line Half-Block Font
171
+ Ultra-compact 2-line terminal font for narrow displays:
172
+
173
+ ```
174
+ ▄▀▀ █▀█ █▀▀ █ █ █▀▄ █▀▀ █░█
175
+ ▄██ █▀▀ ██▄ █ █ █▄▀ ██▄ ▀▄▀
176
+ ```
177
+
178
+ ### Generate Block Text Anywhere
179
+ - **Standalone CLI**:
180
+ ```bash
181
+ block-font "MY TEXT" # 3D wireframe shadow
182
+ block-font "MY TEXT" --style mini # Compact 2-line
183
+ block-font "MY TEXT" --color bokchoy # Catppuccin Bok Choy Green
184
+ ```
185
+ - **SpeiiDev CLI**: `speiidev --font "MY TEXT"`
186
+ - **In REPL**: `/font <text>` (or `/font --mini <text>`)
187
+ - **Python API**:
188
+ ```python
189
+ from autodev.font import render_block_text, render_claude_3d_text
190
+ print(render_block_text("SPEIIDEV", style="claude"))
191
+ ```
192
+
193
+ ### Claude Code Custom Output Style
194
+ Claude Code provides five built-in output styles (`default`, `concise`, `proactive`, `explanatory`, `learning`) and supports custom styles.
195
+
196
+ A custom style **`speiidev-block`** is included at `.claude/output-styles/speiidev-block.md` and `~/.claude/output-styles/speiidev-block.md`.
197
+
198
+ To activate it in Claude Code:
199
+ ```
200
+ /output-style speiidev-block
201
+ ```
202
+
203
+ ---
204
+
205
+ ## Running Tests
206
+
207
+ ### 1. Isolated Ephemeral Sandbox Test (Real Install Simulation)
208
+ Tests the complete packaging workflow from scratch—creating an isolated sandbox in `/tmp`, installing `autodev-orchestrator`, verifying real console binaries (`speiidev`, `block-font`), and running all tests with **zero changes to your system**:
209
+
210
+ ```bash
211
+ python3 scripts/test_real_install.py
212
+ ```
213
+
214
+ ### 2. Fast Unit Test Runner
215
+ Run the full 16-test automated suite directly:
216
+
217
+ ```bash
218
+ python3 scripts/run_tests.py
219
+ # or
220
+ python3 -m unittest discover -s tests -v
221
+
222
+ # Run individual test suites
223
+ python3 -m unittest tests/test_font.py -v
224
+ python3 -m unittest tests/test_cli.py -v
225
+ python3 -m unittest tests/test_pixel_art.py -v
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Project Structure
231
+
232
+ ```
233
+ autodev/
234
+ ├── .claude/
235
+ │ └── output-styles/ # Claude Code custom output styles
236
+ │ └── speiidev-block.md # 3D wireframe shadow font style
237
+ ├── .gitignore # Git ignore rules for Python & Node
238
+ ├── bin/ # Executable CLI launchers & wrappers
239
+ │ ├── block-font # 3D block font launcher
240
+ │ ├── cli.js # Node.js npm/npx wrapper
241
+ │ └── speiidev # SpeiiDev main executable launcher
242
+ ├── scripts/ # Development & testing utilities
243
+ │ ├── run_tests.py # Automated unit test suite runner
244
+ │ └── test_real_install.py # Disposable sandbox install & test runner
245
+ ├── src/ # Main Python package source
246
+ │ └── autodev/
247
+ │ ├── __init__.py # Package entrypoint & public exports
248
+ │ ├── __main__.py # Allows `python -m autodev`
249
+ │ ├── cli.py # Cross-platform SpeiiDev TUI orchestrator
250
+ │ ├── font.py # 3D wireframe shadow & 2-line font engine
251
+ │ └── pixel_art.py # TrueColor ANSI terminal pixel art utility
252
+ ├── tests/ # Automated test suite
253
+ │ ├── __init__.py
254
+ │ ├── test_cli.py # CLI options, profiles, and state tests
255
+ │ ├── test_font.py # Claude 3D and 2-line font typography tests
256
+ │ └── test_pixel_art.py # TrueColor ANSI half-block renderer tests
257
+ ├── CLAUDE.md # Instructions and branding for Claude Code
258
+ ├── package.json # NPM wrapper configuration
259
+ ├── pyproject.toml # Build configuration & entry points
260
+ ├── README.md # Documentation
261
+ └── speiidev -> bin/speiidev # Root convenience symlink
262
+ ```
263
+ ├── __main__.py # Allows `python -m autodev`
264
+ ├── font.py # 3D wireframe shadow & 2-line font engine
265
+ └── cli.py # Cross-platform SpeiiDev orchestrator & TUI with Bok Choy logo
266
+ ```
267
+
268
+ ---
269
+
270
+ ## License
271
+
272
+ MIT License. See [LICENSE](LICENSE) for details.
package/bin/block-font ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ block-font: CLI utility to render text in Claude 3D isometric or compact block font.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add src to sys.path
12
+ SRC_DIR = Path(__file__).resolve().parent.parent / "src"
13
+ if str(SRC_DIR) not in sys.path:
14
+ sys.path.insert(0, str(SRC_DIR))
15
+
16
+ from autodev.font import main
17
+
18
+ if __name__ == "__main__":
19
+ sys.exit(main())
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { spawnSync } = require('child_process');
4
+ const os = require('os');
5
+
6
+ const isWin = os.platform() === 'win32';
7
+ const pythonCmd = isWin ? 'python' : 'python3';
8
+
9
+ // 1. Check if Python 3 is installed
10
+ const checkPython = spawnSync(pythonCmd, ['--version'], { stdio: 'ignore' });
11
+ if (checkPython.error || checkPython.status !== 0) {
12
+ console.error('❌ Error: Python 3 is required to run speiidev, but it was not found.');
13
+ console.error('💡 Windows Tip: Install Python from the Microsoft Store or via: winget install Python.Python.3.11');
14
+ process.exit(1);
15
+ }
16
+
17
+ // 2. Automatically install or update your core Python package from PyPI
18
+ console.log('🔄 Checking/updating speiidev core engine...');
19
+ spawnSync(pythonCmd, ['-m', 'pip', 'install', '--user', '--upgrade', 'autodev-orchestrator'], { stdio: 'inherit' });
20
+
21
+ // 3. Grab any terminal arguments passed by the user
22
+ const args = process.argv.slice(2);
23
+
24
+ // 4. Launch your Python program
25
+ const result = spawnSync(pythonCmd, ['-m', 'autodev.cli', ...args], { stdio: 'inherit' });
26
+ process.exit(result.status);
package/bin/speiidevv ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SpeiiDev: Interactive Multi-Agent TUI with Pixel Art Green Bok Choy Cabbage logo.
4
+ Direct executable launcher for autodev.cli:main.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import sys
10
+ from pathlib import Path
11
+
12
+ # Add src to sys.path
13
+ SRC_DIR = Path(__file__).resolve().parent.parent / "src"
14
+ if str(SRC_DIR) not in sys.path:
15
+ sys.path.insert(0, str(SRC_DIR))
16
+
17
+ from autodev.cli import main
18
+
19
+ if __name__ == "__main__":
20
+ sys.exit(main())
package/package.json CHANGED
@@ -1,6 +1,13 @@
1
1
  {
2
2
  "name": "speiidev",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.0.0",
4
+ "description": "Multi-agent terminal orchestrator wrapper",
5
+ "author": "Toek Sopanha",
6
+ "bin": {
7
+ "speiidev": "./bin/speiidev.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=16.0.0"
11
+ },
12
+ "license": "MIT"
6
13
  }
package/pyproject.toml ADDED
@@ -0,0 +1,62 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "autodev-orchestrator"
7
+ version = "1.0.0"
8
+ description = "Interactive Multi-Agent TUI with pluggable agents, model switcher, diff gate, and conversation memory."
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = { text = "MIT" }
12
+ authors = [
13
+ { name = "SpeiiDev Team" }
14
+ ]
15
+ keywords = [
16
+ "multi-agent",
17
+ "orchestrator",
18
+ "ai",
19
+ "tui",
20
+ "claude",
21
+ "gemini",
22
+ "opencode",
23
+ "antigravity",
24
+ "developer-tools",
25
+ ]
26
+ classifiers = [
27
+ "Development Status :: 4 - Beta",
28
+ "Environment :: Console",
29
+ "Intended Audience :: Developers",
30
+ "License :: OSI Approved :: MIT License",
31
+ "Operating System :: OS Independent",
32
+ "Operating System :: MacOS",
33
+ "Operating System :: Microsoft :: Windows",
34
+ "Operating System :: POSIX :: Linux",
35
+ "Programming Language :: Python :: 3",
36
+ "Programming Language :: Python :: 3.9",
37
+ "Programming Language :: Python :: 3.10",
38
+ "Programming Language :: Python :: 3.11",
39
+ "Programming Language :: Python :: 3.12",
40
+ "Programming Language :: Python :: 3.13",
41
+ "Programming Language :: Python :: 3.14",
42
+ "Topic :: Software Development :: Code Generators",
43
+ "Topic :: Software Development :: Quality Assurance",
44
+ ]
45
+ dependencies = [
46
+ "rich>=13.0.0",
47
+ "prompt_toolkit>=3.0.0",
48
+ ]
49
+
50
+ [project.optional-dependencies]
51
+ image = [
52
+ "Pillow>=9.0.0",
53
+ ]
54
+
55
+ [project.scripts]
56
+ speiidev = "autodev.cli:main"
57
+ autodev = "autodev.cli:main"
58
+ block-font = "autodev.font:main"
59
+ render-pixel-art = "autodev.pixel_art:main"
60
+
61
+ [tool.setuptools.packages.find]
62
+ where = ["src"]
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env python3
2
+ """Run the full automated unit test suite for SpeiiDev."""
3
+ import sys
4
+ import unittest
5
+ from pathlib import Path
6
+
7
+ ROOT_DIR = Path(__file__).resolve().parent.parent
8
+
9
+ if __name__ == "__main__":
10
+ print("🧪 Running SpeiiDev Automated Test Suite...")
11
+ loader = unittest.TestLoader()
12
+ suite = loader.discover(str(ROOT_DIR / "tests"))
13
+ runner = unittest.TextTestRunner(verbosity=2)
14
+ result = runner.run(suite)
15
+ sys.exit(0 if result.wasSuccessful() else 1)
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ test_real_install.py: Real Isolated Installation & Execution Smoke Test.
4
+
5
+ Simulates an end-user installing the package from scratch in an isolated
6
+ disposable temporary virtual environment. Tests build, console script
7
+ entrypoints (autodev, speiidev, block-font), and the full unit test suite,
8
+ then automatically cleans up the sandbox on exit.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ import shutil
15
+ import subprocess
16
+ import sys
17
+ import tempfile
18
+ from pathlib import Path
19
+
20
+ ROOT_DIR = Path(__file__).resolve().parent.parent
21
+
22
+
23
+ def main() -> int:
24
+ print("=" * 64)
25
+ print("📦 STEP 1: Creating isolated disposable sandbox environment...")
26
+ print("=" * 64)
27
+
28
+ with tempfile.TemporaryDirectory(prefix="autodev_sandbox_") as tmp_dir:
29
+ venv_path = Path(tmp_dir) / "venv"
30
+
31
+ # Check if uv is available, otherwise use python3 -m venv
32
+ uv_bin = shutil.which("uv")
33
+ if uv_bin:
34
+ subprocess.run([uv_bin, "venv", str(venv_path), "-q"], check=True)
35
+ else:
36
+ import venv
37
+
38
+ venv.create(str(venv_path), with_pip=True)
39
+
40
+ # Locate binaries inside the isolated venv
41
+ if sys.platform == "win32":
42
+ bin_dir = venv_path / "Scripts"
43
+ python_bin = bin_dir / "python.exe"
44
+ speiidev_bin = bin_dir / "speiidev.exe"
45
+ block_font_bin = bin_dir / "block-font.exe"
46
+ else:
47
+ bin_dir = venv_path / "bin"
48
+ python_bin = bin_dir / "python"
49
+ speiidev_bin = bin_dir / "speiidev"
50
+ block_font_bin = bin_dir / "block-font"
51
+
52
+ print("=" * 64)
53
+ print("🔨 STEP 2: Installing package in editable mode from pyproject.toml...")
54
+ print("=" * 64)
55
+ if uv_bin:
56
+ subprocess.run(
57
+ [
58
+ uv_bin,
59
+ "pip",
60
+ "install",
61
+ "-e",
62
+ f"{ROOT_DIR}[image]",
63
+ "-q",
64
+ "--python",
65
+ str(python_bin),
66
+ ],
67
+ check=True,
68
+ )
69
+ else:
70
+ subprocess.run(
71
+ [
72
+ str(python_bin),
73
+ "-m",
74
+ "pip",
75
+ "install",
76
+ "-e",
77
+ f"{ROOT_DIR}[image]",
78
+ "-q",
79
+ ],
80
+ check=True,
81
+ )
82
+
83
+ print("=" * 64)
84
+ print("🔍 STEP 3: Verifying installed console script binaries...")
85
+ print("=" * 64)
86
+ print(f"✓ speiidev binary: {speiidev_bin}")
87
+ print(f"✓ block-font binary: {block_font_bin}")
88
+
89
+ print("")
90
+ print("=" * 64)
91
+ print("🚀 STEP 4: Executing real installed entrypoints...")
92
+ print("=" * 64)
93
+ print("Testing 'speiidev --font \"SPEIIDEV\"'...")
94
+ subprocess.run([str(speiidev_bin), "--font", "SPEIIDEV"], check=True)
95
+
96
+ print("")
97
+ print("Testing 'block-font \"REAL INSTALL OK\"'...")
98
+ subprocess.run([str(block_font_bin), "REAL INSTALL OK"], check=True)
99
+
100
+ print("")
101
+ print("=" * 64)
102
+ print("🧪 STEP 5: Running full automated unit test suite inside sandbox...")
103
+ print("=" * 64)
104
+ test_proc = subprocess.run(
105
+ [
106
+ str(python_bin),
107
+ "-m",
108
+ "unittest",
109
+ "discover",
110
+ "-s",
111
+ str(ROOT_DIR / "tests"),
112
+ "-v",
113
+ ]
114
+ )
115
+ if test_proc.returncode != 0:
116
+ return test_proc.returncode
117
+
118
+ print("")
119
+ print("=" * 64)
120
+ print("✅ ALL REAL-INSTALL CHECKS PASSED SUCCESSFULLY!")
121
+ print("=" * 64)
122
+ print(f"🧹 Automatically cleaning up sandbox: {tmp_dir}...")
123
+
124
+ print("✨ Done! Zero changes made to your system environment.")
125
+ return 0
126
+
127
+
128
+ if __name__ == "__main__":
129
+ sys.exit(main())