vexy-overnight 1.0.3__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.
@@ -0,0 +1,301 @@
1
+ __pycache__/
2
+ __version__.py
3
+ _Chutzpah*
4
+ _deps
5
+ _NCrunch_*
6
+ _pkginfo.txt
7
+ _private
8
+ _Pvt_Extensions
9
+ _ReSharper*/
10
+ _TeamCity*
11
+ _UpgradeReport_Files/
12
+ _version.py
13
+ !?*.[Cc]ache/
14
+ !.axoCover/settings.json
15
+ !.vscode/extensions.json
16
+ !.vscode/launch.json
17
+ !.vscode/settings.json
18
+ !.vscode/tasks.json
19
+ !**/[Pp]ackages/build/
20
+ !Directory.Build.rsp
21
+ !dist/.gitkeep
22
+ ._*
23
+ .*crunch*.local.xml
24
+ .axoCover/*
25
+ .builds
26
+ .cache
27
+ .coverage
28
+ .coverage.*
29
+ .cr/personal
30
+ .DS_Store
31
+ .DS_Store?
32
+ .eggs/
33
+ .env
34
+ .fake/
35
+ .history/
36
+ .hypothesis/
37
+ .idea/
38
+ .installed.cfg
39
+ .ionide/
40
+ .localhistory/
41
+ .mfractor/
42
+ .mypy_cache
43
+ .nox/
44
+ .ntvs_analysis.dat
45
+ .paket/paket.exe
46
+ .pytest_cache/
47
+ .Python
48
+ .ruff_cache/
49
+ .sass-cache/
50
+ .Spotlight-V100
51
+ .tox/
52
+ .Trashes
53
+ .venv
54
+ .vs/
55
+ .vscode
56
+ .vscode/
57
+ .vscode/*
58
+ .vshistory/
59
+ [Aa][Rr][Mm]/
60
+ [Aa][Rr][Mm]64/
61
+ [Bb]in/
62
+ [Bb]uild[Ll]og.*
63
+ [Dd]ebug/
64
+ [Dd]ebugPS/
65
+ [Dd]ebugPublic/
66
+ [Ee]xpress/
67
+ [Ll]og/
68
+ [Ll]ogs/
69
+ [Oo]bj/
70
+ [Rr]elease/
71
+ [Rr]eleasePS/
72
+ [Rr]eleases/
73
+ [Tt]est[Rr]esult*/
74
+ [Ww][Ii][Nn]32/
75
+ *_autogen/
76
+ *_h.h
77
+ *_i.c
78
+ *_p.c
79
+ *_wpftmp.csproj
80
+ *- [Bb]ackup ([0-9]).rdl
81
+ *- [Bb]ackup ([0-9][0-9]).rdl
82
+ *- [Bb]ackup.rdl
83
+ *.[Cc]ache
84
+ *.[Pp]ublish.xml
85
+ *.[Rr]e[Ss]harper
86
+ *.a
87
+ *.app
88
+ *.appx
89
+ *.appxbundle
90
+ *.appxupload
91
+ *.aps
92
+ *.azurePubxml
93
+ *.bim_*.settings
94
+ *.bim.layout
95
+ *.binlog
96
+ *.btm.cs
97
+ *.btp.cs
98
+ *.build.csdef
99
+ *.cab
100
+ *.cachefile
101
+ *.code-workspace
102
+ *.cover
103
+ *.coverage
104
+ *.coveragexml
105
+ *.d
106
+ *.dbmdl
107
+ *.dbproj.schemaview
108
+ *.dll
109
+ *.dotCover
110
+ *.DotSettings.user
111
+ *.dsp
112
+ *.dsw
113
+ *.dylib
114
+ *.e2e
115
+ *.egg
116
+ *.egg-info/
117
+ *.exe
118
+ *.gch
119
+ *.GhostDoc.xml
120
+ *.gpState
121
+ *.ilk
122
+ *.iobj
123
+ *.ipdb
124
+ *.jfm
125
+ *.jmconfig
126
+ *.la
127
+ *.lai
128
+ *.ldf
129
+ *.lib
130
+ *.lo
131
+ *.log
132
+ *.mdf
133
+ *.meta
134
+ *.mm.*
135
+ *.mod
136
+ *.msi
137
+ *.msix
138
+ *.msm
139
+ *.msp
140
+ *.ncb
141
+ *.ndf
142
+ *.nuget.props
143
+ *.nuget.targets
144
+ *.nupkg
145
+ *.nvuser
146
+ *.o
147
+ *.obj
148
+ *.odx.cs
149
+ *.opendb
150
+ *.opensdf
151
+ *.opt
152
+ *.out
153
+ *.pch
154
+ *.pdb
155
+ *.pfx
156
+ *.pgc
157
+ *.pgd
158
+ *.pidb
159
+ *.plg
160
+ *.psess
161
+ *.publishproj
162
+ *.publishsettings
163
+ *.pubxml
164
+ *.py,cover
165
+ *.py[cod]
166
+ *.pyc
167
+ *.rdl.data
168
+ *.rptproj.bak
169
+ *.rptproj.rsuser
170
+ *.rsp
171
+ *.rsuser
172
+ *.sap
173
+ *.sbr
174
+ *.scc
175
+ *.sdf
176
+ *.sln.docstates
177
+ *.sln.iml
178
+ *.slo
179
+ *.smod
180
+ *.snupkg
181
+ *.so
182
+ *.suo
183
+ *.svclog
184
+ *.swo
185
+ *.swp
186
+ *.tlb
187
+ *.tlh
188
+ *.tli
189
+ *.tlog
190
+ *.tmp
191
+ *.tmp_proj
192
+ *.tss
193
+ *.user
194
+ *.userosscache
195
+ *.userprefs
196
+ *.vbp
197
+ *.vbw
198
+ *.VC.db
199
+ *.VC.VC.opendb
200
+ *.VisualState.xml
201
+ *.vsp
202
+ *.vspscc
203
+ *.vspx
204
+ *.vssscc
205
+ *.xsd.cs
206
+ **/[Pp]ackages/*
207
+ **/*.DesktopClient/GeneratedArtifacts
208
+ **/*.DesktopClient/ModelManifest.xml
209
+ **/*.HTMLClient/GeneratedArtifacts
210
+ **/*.Server/GeneratedArtifacts
211
+ **/*.Server/ModelManifest.xml
212
+ *~
213
+ *$py.class
214
+ ~$*
215
+ $tf/
216
+ AppPackages/
217
+ artifacts/
218
+ ASALocalRun/
219
+ AutoTest.Net/
220
+ Backup*/
221
+ BenchmarkDotNet.Artifacts/
222
+ bld/
223
+ build/
224
+ BundleArtifacts/
225
+ ClientBin/
226
+ cmake_install.cmake
227
+ CMakeCache.txt
228
+ CMakeFiles
229
+ CMakeLists.txt.user
230
+ CMakeScripts
231
+ CMakeUserPresets.json
232
+ compile_commands.json
233
+ cover/
234
+ coverage.xml
235
+ coverage*.info
236
+ coverage*.json
237
+ coverage*.xml
238
+ csx/
239
+ CTestTestfile.cmake
240
+ develop-eggs/
241
+ dlldata.c
242
+ DocProject/buildhelp/
243
+ DocProject/Help/*.hhc
244
+ DocProject/Help/*.hhk
245
+ DocProject/Help/*.hhp
246
+ DocProject/Help/*.HxC
247
+ DocProject/Help/*.HxT
248
+ DocProject/Help/html
249
+ DocProject/Help/Html2
250
+ downloads/
251
+ ecf/
252
+ eggs/
253
+ ehthumbs.db
254
+ env.bak/
255
+ env/
256
+ ENV/
257
+ external
258
+ FakesAssemblies/
259
+ FodyWeavers.xsd
260
+ Generated_Code/
261
+ Generated\ Files/
262
+ healthchecksdb
263
+ htmlcov/
264
+ install_manifest.txt
265
+ ipch/
266
+ lib/
267
+ lib64/
268
+ Makefile
269
+ MANIFEST
270
+ MigrationBackup/
271
+ mono_crash.*
272
+ nCrunchTemp_*
273
+ node_modules/
274
+ nosetests.xml
275
+ nunit-*.xml
276
+ OpenCover/
277
+ orleans.codegen.cs
278
+ Package.StoreAssociation.xml
279
+ paket-files/
280
+ parts/
281
+ project.fragment.lock.json
282
+ project.lock.json
283
+ publish/
284
+ PublishScripts/
285
+ rcf/
286
+ ScaffoldingReadMe.txt
287
+ sdist/
288
+ ServiceFabricBackup/
289
+ StyleCopReport.xml
290
+ Testing
291
+ TestResult.xml
292
+ Thumbs.db
293
+ UpgradeLog*.htm
294
+ UpgradeLog*.XML
295
+ var/
296
+ venv.bak/
297
+ venv/
298
+ VERSION.txt
299
+ wheels/
300
+ x64/
301
+ x86/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Fontlab Ltd
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,266 @@
1
+ Metadata-Version: 2.4
2
+ Name: vexy-overnight
3
+ Version: 1.0.3
4
+ Project-URL: Documentation, https://github.com/vexyart/vexy-overnight#readme
5
+ Project-URL: Issues, https://github.com/vexyart/vexy-overnight/issues
6
+ Project-URL: Source, https://github.com/vexyart/vexy-overnight
7
+ Author-email: Fontlab Ltd <opensource@vexy.art>
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: fire>=0.6.0
22
+ Requires-Dist: loguru<1.0,>=0.7
23
+ Requires-Dist: rich>=13.0.0
24
+ Requires-Dist: tomli-w>=1.0.0
25
+ Requires-Dist: tomli>=2.0.0
26
+ Provides-Extra: dev
27
+ Requires-Dist: hatch>=1.12.0; extra == 'dev'
28
+ Requires-Dist: mypy>=1.15.0; extra == 'dev'
29
+ Requires-Dist: pre-commit>=4.1.0; extra == 'dev'
30
+ Requires-Dist: ruff>=0.9.7; extra == 'dev'
31
+ Requires-Dist: uv>=0.5.8; extra == 'dev'
32
+ Provides-Extra: docs
33
+ Requires-Dist: myst-parser>=3.0.0; extra == 'docs'
34
+ Requires-Dist: sphinx-autodoc-typehints>=2.0.0; extra == 'docs'
35
+ Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == 'docs'
36
+ Requires-Dist: sphinx>=7.2.6; extra == 'docs'
37
+ Provides-Extra: test
38
+ Requires-Dist: coverage[toml]>=7.6.12; extra == 'test'
39
+ Requires-Dist: pytest-asyncio>=0.25.3; extra == 'test'
40
+ Requires-Dist: pytest-benchmark[histogram]>=5.1.0; extra == 'test'
41
+ Requires-Dist: pytest-cov>=6.0.0; extra == 'test'
42
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'test'
43
+ Requires-Dist: pytest>=8.3.4; extra == 'test'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # Vexy Overnight Manager (vomgr)
47
+
48
+ A unified management tool for AI assistant CLIs (Claude, Codex, Gemini), providing streamlined launching, automated continuation workflows, and configuration synchronization.
49
+
50
+ ## Overview
51
+
52
+ Vexy Overnight Manager (`vomgr`) consolidates and simplifies the management of multiple AI assistant CLIs, replacing a collection of over-engineered legacy tools with a single, maintainable Python package. It handles:
53
+
54
+ - **Unified Launching**: Start Claude, Codex, or Gemini with consistent interfaces
55
+ - **Automated Continuation**: Smart session continuation when tasks complete
56
+ - **Configuration Management**: Safe editing of CLI configuration files
57
+ - **Rules Synchronization**: Keep instruction files (CLAUDE.md, AGENTS.md, etc.) in sync
58
+ - **Tool Updates**: Manage updates for all CLI tools from one place
59
+
60
+ ## Features
61
+
62
+ ### Core Commands
63
+
64
+ - `vomgr install` - Set up continuation hooks and configurations
65
+ - `vomgr enable/disable <tool>` - Toggle continuation automation
66
+ - `vomgr run <tool>` - Launch AI assistants with proper settings
67
+ - `vomgr rules` - Synchronize instruction files across projects
68
+ - `vomgr update` - Update CLI tools and the package itself
69
+ - `vomgr status` - View current configuration state
70
+
71
+ ### Simplified Launchers
72
+
73
+ - `vocl` - Launch Claude with optimized settings
74
+ - `voco` - Launch Codex with profile management
75
+ - `voge` - Launch Gemini with appropriate flags
76
+
77
+ ### Continuation Tools
78
+
79
+ - `vocl-go` - Auto-continue Claude sessions (replaces 1500+ line claude4ever.py)
80
+ - `voco-go` - Auto-continue Codex sessions (replaces complex codex4ever.py)
81
+ - `voge-go` - Gemini continuation (when API available)
82
+
83
+ ## Installation
84
+
85
+ ```bash
86
+ # Install from PyPI
87
+ pip install vexy-overnight
88
+
89
+ # Or with uv (recommended)
90
+ uv add vexy-overnight
91
+
92
+ # Install and configure
93
+ vomgr install
94
+ ```
95
+
96
+ ## Quick Start
97
+
98
+ ```bash
99
+ # Enable continuation for Claude
100
+ vomgr enable claude
101
+
102
+ # Launch Claude with continuation enabled
103
+ vocl
104
+ # Or
105
+ vomgr run claude
106
+
107
+ # Sync instruction files in current project
108
+ vomgr rules sync
109
+
110
+ # Update all CLI tools
111
+ vomgr update --cli
112
+
113
+ # Check status
114
+ vomgr status
115
+ ```
116
+
117
+ ## Usage Examples
118
+
119
+ ### Managing Continuation Hooks
120
+
121
+ ```bash
122
+ # Enable auto-continuation for Claude and Codex
123
+ vomgr enable claude
124
+ vomgr enable codex
125
+
126
+ # Disable continuation for specific tool
127
+ vomgr disable claude
128
+
129
+ # Check what's enabled
130
+ vomgr status
131
+ ```
132
+
133
+ ### Instruction File Management
134
+
135
+ ```bash
136
+ # Sync instruction files (CLAUDE.md, AGENTS.md, etc.) in current directory
137
+ vomgr rules sync
138
+
139
+ # Append text to all instruction files
140
+ vomgr rules append "Additional instructions here"
141
+
142
+ # Search in instruction files
143
+ vomgr rules search "pattern"
144
+
145
+ # Replace text across instruction files
146
+ vomgr rules replace "old text" "new text"
147
+
148
+ # Manage global instruction files in home directory
149
+ vomgr rules --global sync
150
+ ```
151
+
152
+ ### Launching AI Assistants
153
+
154
+ ```bash
155
+ # Direct launchers (installed as console scripts)
156
+ vocl # Launch Claude
157
+ voco -m gpt5 # Launch Codex with gpt5 profile
158
+ voge # Launch Gemini
159
+
160
+ # Via vomgr
161
+ vomgr run claude --cwd /path/to/project
162
+ vomgr run codex --profile o3
163
+ vomgr run gemini
164
+ ```
165
+
166
+ ### Updates and Maintenance
167
+
168
+ ```bash
169
+ # Check for updates
170
+ vomgr update --check
171
+
172
+ # Update CLI tools (claude, codex, gemini)
173
+ vomgr update --cli
174
+
175
+ # Update vexy-overnight itself
176
+ vomgr update --self
177
+
178
+ # Update everything
179
+ vomgr update --all
180
+
181
+ # Dry run (show what would be updated)
182
+ vomgr update --cli --dry-run
183
+ ```
184
+
185
+ ## Architecture
186
+
187
+ ### Simplified Design
188
+
189
+ Unlike the legacy tools with 1500+ lines of complex async code, vexy-overnight:
190
+
191
+ - **No iTerm2 dependency**: Uses standard subprocess calls
192
+ - **No TTS**: Simple logging instead of speech synthesis
193
+ - **No state machines**: Straightforward procedural flow
194
+ - **Minimal dependencies**: Just essential packages
195
+ - **Testable**: Every component is unit-testable
196
+ - **Maintainable**: Clear, simple code under 200 lines per file
197
+
198
+ ### Configuration Safety
199
+
200
+ - Creates backups before any config modification
201
+ - Validates changes after editing
202
+ - Provides rollback on errors
203
+ - Preserves all existing user settings
204
+ - Uses proper JSON/TOML libraries (no regex hacks)
205
+
206
+ ## Migration from Legacy Tools
207
+
208
+ If you're using the old tools (claude4ever.py, codex4ever.py, etc.):
209
+
210
+ ```bash
211
+ # Back up existing configurations
212
+ vomgr install --backup-legacy
213
+
214
+ # Migration automatically preserves your settings
215
+ vomgr install --migrate
216
+
217
+ # Old tools remain available until you're ready
218
+ # Both can coexist during transition
219
+ ```
220
+
221
+ ## Development
222
+
223
+ This project uses modern Python packaging with [uv](https://github.com/astral-sh/uv):
224
+
225
+ ```bash
226
+ # Clone repository
227
+ git clone https://github.com/vexyart/vexy-overnight
228
+ cd vexy-overnight
229
+
230
+ # Set up development environment
231
+ uv venv --python 3.12
232
+ uv sync
233
+
234
+ # Run tests
235
+ python -m pytest -xvs
236
+
237
+ # Run with coverage
238
+ python -m pytest --cov=src --cov-report=term-missing
239
+
240
+ # Type checking
241
+ uvx mypy src/
242
+
243
+ # Format code
244
+ uvx ruff format src/ tests/
245
+ ```
246
+
247
+ ## Requirements
248
+
249
+ - Python 3.12+
250
+ - One or more AI CLI tools installed:
251
+ - Claude Code (`npm install -g @anthropic-ai/claude-code`)
252
+ - Codex (`brew install codex` or from source)
253
+ - Gemini CLI (`npm install -g @google/gemini-cli`)
254
+
255
+ ## License
256
+
257
+ MIT License
258
+
259
+ ## Contributing
260
+
261
+ Contributions welcome! Please ensure:
262
+ - All tests pass
263
+ - 80%+ code coverage
264
+ - Type hints on all functions
265
+ - No functions over 20 lines
266
+ - No files over 200 lines
@@ -0,0 +1,221 @@
1
+ # Vexy Overnight Manager (vomgr)
2
+
3
+ A unified management tool for AI assistant CLIs (Claude, Codex, Gemini), providing streamlined launching, automated continuation workflows, and configuration synchronization.
4
+
5
+ ## Overview
6
+
7
+ Vexy Overnight Manager (`vomgr`) consolidates and simplifies the management of multiple AI assistant CLIs, replacing a collection of over-engineered legacy tools with a single, maintainable Python package. It handles:
8
+
9
+ - **Unified Launching**: Start Claude, Codex, or Gemini with consistent interfaces
10
+ - **Automated Continuation**: Smart session continuation when tasks complete
11
+ - **Configuration Management**: Safe editing of CLI configuration files
12
+ - **Rules Synchronization**: Keep instruction files (CLAUDE.md, AGENTS.md, etc.) in sync
13
+ - **Tool Updates**: Manage updates for all CLI tools from one place
14
+
15
+ ## Features
16
+
17
+ ### Core Commands
18
+
19
+ - `vomgr install` - Set up continuation hooks and configurations
20
+ - `vomgr enable/disable <tool>` - Toggle continuation automation
21
+ - `vomgr run <tool>` - Launch AI assistants with proper settings
22
+ - `vomgr rules` - Synchronize instruction files across projects
23
+ - `vomgr update` - Update CLI tools and the package itself
24
+ - `vomgr status` - View current configuration state
25
+
26
+ ### Simplified Launchers
27
+
28
+ - `vocl` - Launch Claude with optimized settings
29
+ - `voco` - Launch Codex with profile management
30
+ - `voge` - Launch Gemini with appropriate flags
31
+
32
+ ### Continuation Tools
33
+
34
+ - `vocl-go` - Auto-continue Claude sessions (replaces 1500+ line claude4ever.py)
35
+ - `voco-go` - Auto-continue Codex sessions (replaces complex codex4ever.py)
36
+ - `voge-go` - Gemini continuation (when API available)
37
+
38
+ ## Installation
39
+
40
+ ```bash
41
+ # Install from PyPI
42
+ pip install vexy-overnight
43
+
44
+ # Or with uv (recommended)
45
+ uv add vexy-overnight
46
+
47
+ # Install and configure
48
+ vomgr install
49
+ ```
50
+
51
+ ## Quick Start
52
+
53
+ ```bash
54
+ # Enable continuation for Claude
55
+ vomgr enable claude
56
+
57
+ # Launch Claude with continuation enabled
58
+ vocl
59
+ # Or
60
+ vomgr run claude
61
+
62
+ # Sync instruction files in current project
63
+ vomgr rules sync
64
+
65
+ # Update all CLI tools
66
+ vomgr update --cli
67
+
68
+ # Check status
69
+ vomgr status
70
+ ```
71
+
72
+ ## Usage Examples
73
+
74
+ ### Managing Continuation Hooks
75
+
76
+ ```bash
77
+ # Enable auto-continuation for Claude and Codex
78
+ vomgr enable claude
79
+ vomgr enable codex
80
+
81
+ # Disable continuation for specific tool
82
+ vomgr disable claude
83
+
84
+ # Check what's enabled
85
+ vomgr status
86
+ ```
87
+
88
+ ### Instruction File Management
89
+
90
+ ```bash
91
+ # Sync instruction files (CLAUDE.md, AGENTS.md, etc.) in current directory
92
+ vomgr rules sync
93
+
94
+ # Append text to all instruction files
95
+ vomgr rules append "Additional instructions here"
96
+
97
+ # Search in instruction files
98
+ vomgr rules search "pattern"
99
+
100
+ # Replace text across instruction files
101
+ vomgr rules replace "old text" "new text"
102
+
103
+ # Manage global instruction files in home directory
104
+ vomgr rules --global sync
105
+ ```
106
+
107
+ ### Launching AI Assistants
108
+
109
+ ```bash
110
+ # Direct launchers (installed as console scripts)
111
+ vocl # Launch Claude
112
+ voco -m gpt5 # Launch Codex with gpt5 profile
113
+ voge # Launch Gemini
114
+
115
+ # Via vomgr
116
+ vomgr run claude --cwd /path/to/project
117
+ vomgr run codex --profile o3
118
+ vomgr run gemini
119
+ ```
120
+
121
+ ### Updates and Maintenance
122
+
123
+ ```bash
124
+ # Check for updates
125
+ vomgr update --check
126
+
127
+ # Update CLI tools (claude, codex, gemini)
128
+ vomgr update --cli
129
+
130
+ # Update vexy-overnight itself
131
+ vomgr update --self
132
+
133
+ # Update everything
134
+ vomgr update --all
135
+
136
+ # Dry run (show what would be updated)
137
+ vomgr update --cli --dry-run
138
+ ```
139
+
140
+ ## Architecture
141
+
142
+ ### Simplified Design
143
+
144
+ Unlike the legacy tools with 1500+ lines of complex async code, vexy-overnight:
145
+
146
+ - **No iTerm2 dependency**: Uses standard subprocess calls
147
+ - **No TTS**: Simple logging instead of speech synthesis
148
+ - **No state machines**: Straightforward procedural flow
149
+ - **Minimal dependencies**: Just essential packages
150
+ - **Testable**: Every component is unit-testable
151
+ - **Maintainable**: Clear, simple code under 200 lines per file
152
+
153
+ ### Configuration Safety
154
+
155
+ - Creates backups before any config modification
156
+ - Validates changes after editing
157
+ - Provides rollback on errors
158
+ - Preserves all existing user settings
159
+ - Uses proper JSON/TOML libraries (no regex hacks)
160
+
161
+ ## Migration from Legacy Tools
162
+
163
+ If you're using the old tools (claude4ever.py, codex4ever.py, etc.):
164
+
165
+ ```bash
166
+ # Back up existing configurations
167
+ vomgr install --backup-legacy
168
+
169
+ # Migration automatically preserves your settings
170
+ vomgr install --migrate
171
+
172
+ # Old tools remain available until you're ready
173
+ # Both can coexist during transition
174
+ ```
175
+
176
+ ## Development
177
+
178
+ This project uses modern Python packaging with [uv](https://github.com/astral-sh/uv):
179
+
180
+ ```bash
181
+ # Clone repository
182
+ git clone https://github.com/vexyart/vexy-overnight
183
+ cd vexy-overnight
184
+
185
+ # Set up development environment
186
+ uv venv --python 3.12
187
+ uv sync
188
+
189
+ # Run tests
190
+ python -m pytest -xvs
191
+
192
+ # Run with coverage
193
+ python -m pytest --cov=src --cov-report=term-missing
194
+
195
+ # Type checking
196
+ uvx mypy src/
197
+
198
+ # Format code
199
+ uvx ruff format src/ tests/
200
+ ```
201
+
202
+ ## Requirements
203
+
204
+ - Python 3.12+
205
+ - One or more AI CLI tools installed:
206
+ - Claude Code (`npm install -g @anthropic-ai/claude-code`)
207
+ - Codex (`brew install codex` or from source)
208
+ - Gemini CLI (`npm install -g @google/gemini-cli`)
209
+
210
+ ## License
211
+
212
+ MIT License
213
+
214
+ ## Contributing
215
+
216
+ Contributions welcome! Please ensure:
217
+ - All tests pass
218
+ - 80%+ code coverage
219
+ - Type hints on all functions
220
+ - No functions over 20 lines
221
+ - No files over 200 lines
@@ -0,0 +1,389 @@
1
+ # this_file: pyproject.toml
2
+ #==============================================================================
3
+ # VEXY-OVERNIGHT PACKAGE CONFIGURATION
4
+ # This pyproject.toml defines the package metadata, dependencies, build system,
5
+ # and development environment for the vexy-overnight package.
6
+ #==============================================================================
7
+
8
+ #------------------------------------------------------------------------------
9
+ # PROJECT METADATA
10
+ # Core package information used by PyPI and package managers.
11
+ #------------------------------------------------------------------------------
12
+ [project]
13
+ name = 'vexy-overnight' # Package name on PyPI
14
+ description = '' # Short description
15
+ readme = 'README.md' # Path to README file
16
+ requires-python = '>=3.10' # Minimum Python version
17
+ keywords = [
18
+ ] # Keywords for PyPI search
19
+ dynamic = ["version"] # Fields set dynamically at build time
20
+
21
+ # PyPI classifiers for package categorization
22
+ classifiers = [
23
+ 'Development Status :: 4 - Beta', # Package maturity level
24
+ 'Programming Language :: Python',
25
+ 'Programming Language :: Python :: 3.10',
26
+ 'Programming Language :: Python :: 3.11',
27
+ 'Programming Language :: Python :: 3.12',
28
+ 'Programming Language :: Python :: Implementation :: CPython',
29
+ 'Programming Language :: Python :: Implementation :: PyPy',
30
+ 'Operating System :: OS Independent',
31
+ 'License :: OSI Approved :: MIT License',
32
+ 'Intended Audience :: Developers',
33
+ ]
34
+
35
+ dependencies = [
36
+ 'loguru>=0.7,<1.0',
37
+ "fire>=0.6.0",
38
+ 'rich>=13.0.0',
39
+ 'tomli>=2.0.0',
40
+ 'tomli-w>=1.0.0',
41
+ ]
42
+
43
+ # Author information
44
+ [[project.authors]]
45
+ name = 'Fontlab Ltd'
46
+ email = 'opensource@vexy.art'
47
+
48
+ # License information
49
+ [project.license]
50
+ text = 'MIT'
51
+
52
+ # Project URLs
53
+ [project.urls]
54
+ Documentation = 'https://github.com/vexyart/vexy-overnight#readme'
55
+ Issues = 'https://github.com/vexyart/vexy-overnight/issues'
56
+ Source = 'https://github.com/vexyart/vexy-overnight'
57
+
58
+ #------------------------------------------------------------------------------
59
+ # OPTIONAL DEPENDENCIES
60
+ # Additional dependencies for optional features, development, and testing.
61
+ #------------------------------------------------------------------------------
62
+ [project.optional-dependencies]
63
+
64
+ # Development tools
65
+ dev = [
66
+ 'hatch>=1.12.0', # Project management and build tooling
67
+ 'uv>=0.5.8', # Fast dependency resolver and installer
68
+ 'ruff>=0.9.7', # Linting and formatting
69
+ 'mypy>=1.15.0', # Type checking
70
+ 'pre-commit>=4.1.0', # Git hook management
71
+ ]
72
+
73
+ # Testing tools and frameworks
74
+ test = [
75
+ 'pytest>=8.3.4', # Testing framework - Keep pytest as is, update if newer pytest version is required
76
+ 'pytest-cov>=6.0.0', # Coverage plugin for pytest - Keep pytest-cov as is, update if newer pytest-cov version is required
77
+ 'pytest-xdist>=3.6.1', # Parallel test execution - Keep pytest-xdist as is, update if newer pytest-xdist version is required
78
+ 'pytest-benchmark[histogram]>=5.1.0', # Benchmarking plugin - Keep pytest-benchmark as is, update if newer pytest-benchmark version is required
79
+ 'pytest-asyncio>=0.25.3', # Async test support - Keep pytest-asyncio as is, update if newer pytest-asyncio version is required
80
+ 'coverage[toml]>=7.6.12',
81
+ ]
82
+
83
+ docs = [
84
+ "sphinx>=7.2.6",
85
+ "sphinx-rtd-theme>=2.0.0",
86
+ "sphinx-autodoc-typehints>=2.0.0",
87
+ "myst-parser>=3.0.0", # Markdown support in Sphinx
88
+ ]
89
+
90
+ #------------------------------------------------------------------------------
91
+ # COMMAND-LINE SCRIPTS
92
+ # Entry points for command-line executables installed with the package.
93
+ #------------------------------------------------------------------------------
94
+ [project.scripts]
95
+ vomgr = "vexy_overnight.cli:main"
96
+ vocl = "vexy_overnight.launchers:vocl"
97
+ voco = "vexy_overnight.launchers:voco"
98
+ voge = "vexy_overnight.launchers:voge"
99
+
100
+ #------------------------------------------------------------------------------
101
+ # BUILD SYSTEM CONFIGURATION
102
+ # Defines the tools required to build the package and the build backend.
103
+ #------------------------------------------------------------------------------
104
+ [build-system]
105
+ # Hatchling is a modern build backend for Python packaging
106
+ # hatch-vcs integrates with version control systems for versioning
107
+ requires = [
108
+ 'hatchling>=1.27.0', # Keep hatchling as is, update if newer hatchling version is required
109
+ 'hatch-vcs>=0.4.0', # Keep hatch-vcs as is, update if newer hatch-vcs version is required
110
+ ]
111
+ build-backend = 'hatchling.build' # Specifies Hatchling as the build backend
112
+
113
+
114
+ #------------------------------------------------------------------------------
115
+ # HATCH BUILD CONFIGURATION
116
+ # Configures the build process, specifying which packages to include and
117
+ # how to handle versioning.
118
+ #------------------------------------------------------------------------------
119
+ [tool.hatch.build]
120
+ # Include package data files
121
+ include = [
122
+ "src/vexy_overnight/py.typed", # For better type checking support
123
+ "src/vexy_overnight/data/**/*", # Include data files if any
124
+
125
+ ]
126
+ exclude = ["**/__pycache__", "**/.pytest_cache", "**/.mypy_cache"]
127
+
128
+ [tool.hatch.build.targets.wheel]
129
+ packages = ["src/vexy_overnight"]
130
+ reproducible = true
131
+
132
+
133
+ # Version control system hook configuration
134
+ # Automatically updates the version file from git tags
135
+ [tool.hatch.build.hooks.vcs]
136
+ version-file = "src/vexy_overnight/__version__.py"
137
+
138
+ # Version source configuration
139
+ [tool.hatch.version]
140
+ source = 'vcs' # Get version from git tags or other VCS info
141
+
142
+ [tool.hatch.version.vcs]
143
+ tag-pattern = '^(?:v)?(?P<version>\d+\.\d+\.\d+)$' # Enforce semantic version tags like v1.2.3
144
+
145
+ # Metadata handling configuration
146
+ [tool.hatch.metadata]
147
+ allow-direct-references = true # Allow direct references in metadata (useful for local dependencies)
148
+
149
+
150
+ #------------------------------------------------------------------------------
151
+ # UV CONFIGURATION
152
+ # Settings for uv so the project is always treated as a package.
153
+ #------------------------------------------------------------------------------
154
+ [tool.uv]
155
+ package = true
156
+
157
+
158
+ #------------------------------------------------------------------------------
159
+ # DEVELOPMENT ENVIRONMENTS
160
+
161
+ [tool.hatch.envs.default]
162
+ installer = 'uv'
163
+ features = ['dev', 'test']
164
+ dependencies = [
165
+ ]
166
+
167
+ # Commands available in the default environment
168
+ [tool.hatch.envs.default.scripts]
169
+ # Run tests with optional arguments
170
+ test = 'python -m pytest {args:tests}'
171
+ # Run tests with coverage reporting
172
+ test-cov = "python -m pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/vexy_overnight --cov=tests {args:tests}"
173
+ # Run type checking
174
+ type-check = "python -m mypy src/vexy_overnight tests"
175
+ # Run linting and formatting
176
+ lint = ["python -m ruff check src/vexy_overnight tests", "python -m ruff format --respect-gitignore src/vexy_overnight tests"]
177
+ # Format and fix style issues
178
+ fmt = ["python -m ruff format --respect-gitignore src/vexy_overnight tests", "python -m ruff check --fix src/vexy_overnight tests"]
179
+ fix = ["python -m ruff check --fix --unsafe-fixes src/vexy_overnight tests", "python -m ruff format --respect-gitignore src/vexy_overnight tests"]
180
+
181
+ #------------------------------------------------------------------------------
182
+ # SPECIALIZED ENVIRONMENTS
183
+ # Additional environments for specific development tasks.
184
+ #------------------------------------------------------------------------------
185
+
186
+ # Dedicated environment for linting and code quality checks
187
+ [tool.hatch.envs.lint]
188
+ detached = true # Create a separate, isolated environment
189
+ features = ['dev'] # Use dev extras dependencies
190
+ installer = 'uv'
191
+
192
+ # Linting environment commands
193
+ [tool.hatch.envs.lint.scripts]
194
+ # Type checking with automatic type installation
195
+ typing = "python -m mypy --install-types --non-interactive {args:src/vexy_overnight tests}"
196
+ # Check style and format code
197
+ style = ["python -m ruff check {args:.}", "python -m ruff format --respect-gitignore {args:.}"]
198
+ # Format and fix style issues
199
+ fmt = ["python -m ruff format --respect-gitignore {args:.}", "python -m ruff check --fix {args:.}"]
200
+ fix = ["python -m ruff check --fix --unsafe-fixes {args:.}", "python -m ruff format --respect-gitignore {args:.}"]
201
+ # Run all ops
202
+ all = ["style", "typing", "fix"]
203
+
204
+ # Dedicated environment for testing
205
+ [tool.hatch.envs.test]
206
+ features = ['test'] # Use test extras as dependencies
207
+ installer = 'uv'
208
+
209
+ # Testing environment commands
210
+ [tool.hatch.envs.test.scripts]
211
+ # Run tests in parallel
212
+ test = "python -m pytest -n auto {args:tests}"
213
+ # Run tests with coverage in parallel
214
+ test-cov = "python -m pytest -n auto --cov-report=term-missing --cov-config=pyproject.toml --cov=src/vexy_overnight --cov=tests {args:tests}"
215
+ # Run benchmarks
216
+ bench = "python -m pytest -v -p no:briefcase tests/test_benchmark.py --benchmark-only"
217
+ # Run benchmarks and save results
218
+ bench-save = "python -m pytest -v -p no:briefcase tests/test_benchmark.py --benchmark-only --benchmark-json=benchmark/results.json"
219
+
220
+ # Documentation environment
221
+ [tool.hatch.envs.docs]
222
+ features = ['docs']
223
+ installer = 'uv'
224
+
225
+ # Documentation environment commands
226
+ [tool.hatch.envs.docs.scripts]
227
+ build = "python -m sphinx -b html docs/source docs/build"
228
+
229
+ # GitHub Actions workflow configuration
230
+ [tool.hatch.envs.ci]
231
+ features = ['test']
232
+ installer = 'uv'
233
+
234
+
235
+ [tool.hatch.envs.ci.scripts]
236
+ test = "python -m pytest --cov=src/vexy_overnight --cov-report=xml"
237
+
238
+
239
+ #------------------------------------------------------------------------------
240
+ # CODE QUALITY TOOLS
241
+ # Configuration for linting, formatting, and code quality enforcement.
242
+ #------------------------------------------------------------------------------
243
+
244
+ #------------------------------------------------------------------------------
245
+ # COVERAGE CONFIGURATION
246
+ # Settings for test coverage measurement and reporting.
247
+ #------------------------------------------------------------------------------
248
+
249
+ # Path mapping for coverage in different environments
250
+ [tool.coverage.paths]
251
+ vexy_overnight = ["src/vexy_overnight", "*/vexy-overnight/src/vexy_overnight"]
252
+ tests = ["tests", "*/vexy-overnight/tests"]
253
+
254
+ # Coverage report configuration
255
+ [tool.coverage.report]
256
+ # Lines to exclude from coverage reporting
257
+ exclude_lines = [
258
+ 'no cov', # Custom marker to skip coverage
259
+ 'if __name__ == .__main__.:', # Script execution guard
260
+ 'if TYPE_CHECKING:', # Type checking imports and code
261
+ 'pass', # Empty pass statements
262
+ 'raise NotImplementedError', # Unimplemented method placeholders
263
+ 'raise ImportError', # Import error handling
264
+ 'except ImportError', # Import error handling
265
+ 'except KeyError', # Common error handling
266
+ 'except AttributeError', # Common error handling
267
+ 'except NotImplementedError', # Common error handling
268
+ ]
269
+
270
+ [tool.coverage.run]
271
+ source_pkgs = ["vexy_overnight", "tests"]
272
+ branch = true # Measure branch coverage (if/else statements)
273
+ parallel = true # Support parallel test execution
274
+ omit = [
275
+ "src/vexy_overnight/__about__.py",
276
+ ]
277
+
278
+ #------------------------------------------------------------------------------
279
+ # MYPY CONFIGURATION
280
+ # Configuration for type checking with mypy.
281
+ #------------------------------------------------------------------------------
282
+
283
+ [tool.mypy]
284
+ python_version = "3.10"
285
+ warn_return_any = true
286
+ warn_unused_configs = true
287
+ disallow_untyped_defs = true
288
+ disallow_incomplete_defs = true
289
+ check_untyped_defs = true
290
+ disallow_untyped_decorators = true
291
+ no_implicit_optional = true
292
+ warn_redundant_casts = true
293
+ warn_unused_ignores = true
294
+ warn_no_return = true
295
+ warn_unreachable = true
296
+ exclude = ["^external/"]
297
+
298
+ [[tool.mypy.overrides]]
299
+ module = ["loguru", "pytest"]
300
+ ignore_missing_imports = true
301
+
302
+ [[tool.mypy.overrides]]
303
+ module = ["tests.*"]
304
+ disallow_untyped_defs = false
305
+ disallow_incomplete_defs = false
306
+ allow_untyped_decorators = true
307
+
308
+ #------------------------------------------------------------------------------
309
+ # PYTEST CONFIGURATION
310
+ # Configuration for pytest, including markers, options, and benchmark settings.
311
+ #------------------------------------------------------------------------------
312
+
313
+ [tool.pytest.ini_options]
314
+ addopts = "-v --durations=10 -p no:briefcase"
315
+ asyncio_mode = "auto"
316
+ asyncio_default_fixture_loop_scope = "function"
317
+ console_output_style = "progress"
318
+ filterwarnings = ["ignore::DeprecationWarning", "ignore::UserWarning"]
319
+ log_cli = true
320
+ log_cli_level = "INFO"
321
+ markers = [
322
+ "benchmark: marks tests as benchmarks (select with '-m benchmark')",
323
+ "unit: mark a test as a unit test",
324
+ "integration: mark a test as an integration test",
325
+ "permutation: tests for permutation functionality",
326
+ "parameter: tests for parameter parsing",
327
+ "prompt: tests for prompt parsing",
328
+ ]
329
+ norecursedirs = [
330
+ ".*",
331
+ "build",
332
+ "dist",
333
+ "venv",
334
+ "__pycache__",
335
+ "*.egg-info",
336
+ "_private",
337
+ ]
338
+ python_classes = ["Test*"]
339
+ python_files = ["test_*.py"]
340
+ python_functions = ["test_*"]
341
+ pythonpath = ["src"]
342
+ testpaths = ["tests"]
343
+
344
+ [tool.pytest-benchmark]
345
+ min_rounds = 100
346
+ min_time = 0.1
347
+ histogram = true
348
+ storage = "file"
349
+ save-data = true
350
+ compare = [
351
+ "min", # Minimum time
352
+ "max", # Maximum time
353
+ "mean", # Mean time
354
+ "stddev", # Standard deviation
355
+ "median", # Median time
356
+ "iqr", # Inter-quartile range
357
+ "ops", # Operations per second
358
+ "rounds", # Number of rounds
359
+ ]
360
+
361
+ #------------------------------------------------------------------------------
362
+ # RUFF CONFIGURATION
363
+ # Streamlined Ruff setup with pragmatic defaults.
364
+ #------------------------------------------------------------------------------
365
+
366
+ [tool.ruff]
367
+ target-version = "py310"
368
+ line-length = 100
369
+
370
+ [tool.ruff.format]
371
+ indent-style = "space"
372
+ quote-style = "double"
373
+
374
+ [tool.ruff.lint]
375
+ select = [
376
+ 'E', # pycodestyle errors
377
+ 'F', # pyflakes errors
378
+ 'B', # flake8-bugbear
379
+ 'I', # import sorting
380
+ 'N', # pep8-naming
381
+ 'UP', # modern Python upgrades
382
+ ]
383
+ ignore = [
384
+ 'E501', # rely on the formatter for line length
385
+ ]
386
+ extend-exclude = [".git", ".venv", "venv", "dist", "build"]
387
+
388
+ [tool.ruff.lint.isort]
389
+ known-first-party = ['vexy_overnight']
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '1.0.3'
32
+ __version_tuple__ = version_tuple = (1, 0, 3)
33
+
34
+ __commit_id__ = commit_id = None
@@ -0,0 +1 @@
1
+ # this_file: src/vexy_overnight/py.typed