rw-sysstable 0.2.0__py3-none-any.whl

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,321 @@
1
+ Metadata-Version: 2.4
2
+ Name: rw-sysstable
3
+ Version: 0.2.0
4
+ Summary: System stability monitor with Hermes integration β€” daemon, CLI, plugin, and critical memory pressure resolution
5
+ Project-URL: Homepage, https://github.com/stephanos8926-lgtm/rapidwebs-sysstable
6
+ Author-email: RapidWebs Enterprise <dev@rapidwebs.com>
7
+ Maintainer-email: "Lucien (RapidWebs)" <lucien@rapidwebs.com>
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: daemon,devops,hermes,monitoring,plugin,psutil,stability,system,thresholds
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Intended Audience :: System Administrators
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Natural Language :: English
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Classifier: Topic :: System :: Monitoring
24
+ Classifier: Topic :: System :: Systems Administration
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: click>=8.0
27
+ Requires-Dist: psutil>=5.9.0
28
+ Requires-Dist: pyyaml>=6.0
29
+ Provides-Extra: dev
30
+ Requires-Dist: build>=1.0; extra == 'dev'
31
+ Requires-Dist: hatch>=1.17.0; extra == 'dev'
32
+ Requires-Dist: pre-commit>=3.0; extra == 'dev'
33
+ Requires-Dist: pytest>=8.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.4.0; extra == 'dev'
35
+ Requires-Dist: twine>=5.0; extra == 'dev'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # RapidWebs-SysStable πŸ›‘οΈ
39
+
40
+ **System stability monitor with Hermes integration β€” daemon, CLI, and plugin.**
41
+
42
+ A background daemon that collects real-time system metrics (RAM, CPU, disk, swap,
43
+ temperature, network, battery), thresholds them against configurable watermarks,
44
+ and feeds results into [Hermes Agent](https://hermes-agent.nousresearch.com) via
45
+ plugin hooks. When resources get tight, Hermes adapts β€” blocking delegation on
46
+ critical states, injecting context warnings on pressure.
47
+
48
+ ---
49
+
50
+ ## ✨ Features
51
+
52
+ | Capability | What It Does |
53
+ |------------|-------------|
54
+ | πŸ” **Metric Collection** | RAM, ZRAM, SWAP, CPU (per-core + load avg), disk, net I/O, battery, temperature, uptime β€” every 15s |
55
+ | 🎚️ **Threshold Engine** | Green/Yellow/Orange/CRITICAL watermarks per metric. Supports CRITICAL severity level and threshold watermark for immediate action. Reverse-aware (lower=worse for RAM/disk, higher=worse for CPU/temp) |
56
+ | πŸ€– **Hermes Plugin** | `pre_tool_call` blocks delegation on RED/CRITICAL, warns on YELLOW/ORANGE. With v0.2.0, it now supports CRITICAL severity blocking. `pre_llm_call` injects `[SYSTEM STATUS]` context. |
57
+ | πŸ–₯️ **CLI** | `sysstable status`, `history`, `trend`, `start`, `stop`, `init`, `uninstall`, `kill-list`, `processes`, `never-kill`, `resolution-history`. Supports starting with `--never-kill` flag. |
58
+ | πŸ”Œ **Memory Pressure Resolution System** | System for automatically resolving memory pressure situations by intelligently killing non-critical processes when system RAM falls below a defined `critical` threshold. Includes `MemoryPressureResolver`, `PressureStateMachine`, `ProcessSnapshot`, `NoKillManager`, and `KillListGenerator`. |
59
+ | πŸ—„οΈ **SQLite Storage** | WAL mode, configurable retention (24h–14d), auto-pruning, unix socket IPC. New tables in DB schema for enhanced data management. |
60
+ | βš™οΈ **Configurable** | YAML config β€” thresholds, intervals, retention, webhook URLs, hook directories. New config blocks: `memory_pressure`, `resolution`, `process_scoring`, `never_kill`. |
61
+ | 🐦 **Security Enhancements** | Triple (pid,name,cmdline) matching for process identification and security. |
62
+ | 🐚 **systemd Support** | `--user` service template with `Restart=on-failure` |
63
+
64
+ ---
65
+
66
+ ## πŸ—οΈ Architecture
67
+
68
+ ```
69
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
70
+ β”‚ Daemon (sysstabled) β”‚
71
+ β”‚ - Python, systemd --user service β”‚
72
+ β”‚ - Collects every 15s (configurable) β”‚
73
+ β”‚ - Reads /proc + psutil β”‚
74
+ β”‚ - Writes metrics β†’ SQLite (WAL, retention) β”‚
75
+ β”‚ - Writes current state β†’ state.json β”‚
76
+ β”‚ - Evaluates thresholds β†’ dispatches events β”‚
77
+ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
78
+ β”‚ β”‚ β”‚
79
+ β”‚ state.json β”‚ unix socket β”‚ Memory Pressure Resolution Layer
80
+ β–Ό β–Ό β–Ό (monitors state.json, acts on critical thresholds)
81
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
82
+ β”‚ Hermes β”‚ β”‚ CLI (sysstable) β”‚ β”‚ Resolver (memory_pressure) β”‚
83
+ β”‚ Plugin β”‚ β”‚ - status β”‚ β”‚ - Manages resolution lifecycle β”‚
84
+ β”‚ (pre_tool, β”‚ β”‚ - history, trend β”‚ β”‚ - Integrates with Process Watch modules β”‚
85
+ β”‚ pre_llm) β”‚ β”‚ - daemon lifecycle β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
86
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ - init, uninstall β”‚
87
+ β”‚ - kill-list, processes, etc. β”‚
88
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
89
+ ```
90
+
91
+ ---
92
+
93
+ ## πŸ“¦ Installation
94
+
95
+ ### Requirements
96
+
97
+ - Python β‰₯ 3.10
98
+ - Linux (reads `/proc`; psutil sensors)
99
+ - [Hermes Agent](https://hermes-agent.nousresearch.com) (for plugin integration)
100
+
101
+ ### From PyPI
102
+
103
+ ```bash
104
+ pip install rw-sysstable
105
+ ```
106
+
107
+ ### From Source
108
+
109
+ ```bash
110
+ git clone https://github.com/stephanos8926-lgtm/rapidwebs-sysstable.git
111
+ cd rapidwebs-sysstable
112
+ uv venv
113
+ source .venv/bin/activate
114
+ uv pip install -e ."[dev]"
115
+ ```
116
+
117
+ ### Hermes Plugin
118
+
119
+ ```bash
120
+ # Install the plugin from github repo via hermes plugins install
121
+ hermes plugins install https://github.com/stephanos8926-lgtm/rapidwebs-sysstable/hermes-plugin/rapidwebs-sysstable
122
+
123
+ # Enable it
124
+ hermes config set plugins.rapidwebs-sysstable.enabled true
125
+ ```
126
+
127
+ ---
128
+
129
+ ## πŸš€ Quick Start
130
+
131
+ ```bash
132
+ # 1. Initialize directories + default config
133
+ sysstable init
134
+
135
+ # 2. Start the daemon (background)
136
+ sysstable start
137
+
138
+ # 3. Check system status
139
+ sysstable status
140
+
141
+ # 4. View metric history
142
+ sysstable history -n 10
143
+
144
+ # 5. See trends
145
+ sysstable trend -n 10
146
+
147
+ # 6. Stop the daemon
148
+ sysstable stop
149
+
150
+ # 7. View process list (for debugging memory pressure)
151
+ sysstable processes
152
+
153
+ # 8. Generate a kill list for non-critical processes
154
+ sysstable kill-list
155
+
156
+ # 9. Check resolution history
157
+ sysstable resolution-history
158
+
159
+ # Start the daemon, preventing it from killing processes initially
160
+ sysstable start --never-kill
161
+ ```
162
+
163
+ ### Systemd (persistent)
164
+
165
+ ```bash
166
+ cp docs/sysstable.service ~/.config/systemd/user/
167
+ systemctl --user daemon-reload
168
+ systemctl --user enable --now sysstable
169
+ ```
170
+
171
+ ---
172
+
173
+ ## βš™οΈ Configuration
174
+
175
+ `~/.config/sysstable/config.yaml` β€” auto-created on `sysstable init`.
176
+
177
+ ```yaml
178
+ interval_seconds: 15 # Collection interval
179
+ retention_hours: 72 # Data retention (24 | 72 | 120 | 168 | 336)
180
+ db_path: ~/.cache/sysstable/metrics.db
181
+ socket_path: ~/.cache/sysstable/sysstable.sock
182
+ state_path: ~/.hermes/plugins/rapidwebs-sysstable/state.json
183
+
184
+ # Memory Pressure Resolution Configuration
185
+ memory_pressure:
186
+ enabled: true # Enable automatic memory pressure resolution
187
+ check_interval_seconds: 30 # How often to check for memory pressure
188
+ severity_threshold: 128 # Memory available in MB to trigger resolution (e.g., CRITICAL threshold < 128 MB)
189
+ grace_period_seconds: 120 # Time to wait before killing processes after pressure detected
190
+
191
+ resolution:
192
+ # Settings for the MemoryPressureResolver
193
+ max_kill_attempts: 5 # Max processes to attempt killing in one cycle
194
+ min_process_ram_mb: 100 # Minimum RAM usage to consider a process for termination
195
+ max_cpu_usage_percent: 50 # Don't kill processes consuming high CPU (e.g., active services)
196
+
197
+ process_scoring:
198
+ # Scoring parameters for prioritizing processes to kill
199
+ ram_usage_weight: 0.6
200
+ cpu_usage_weight: 0.1
201
+ runtime_weight: 0.1
202
+ importance_score_weight: 0.2 # Higher score = less important
203
+
204
+ never_kill:
205
+ # List of processes (by pid, name, or cmdline) to never kill
206
+ user_list: ["hermes-agent", "sysstabled"] # Process names to protect (from config file)
207
+
208
+ events:
209
+ shell_hooks_dir: ~/.config/sysstable/hooks.d
210
+ webhooks: []
211
+ python_extensions_dir: ~/.config/sysstable/extensions.d
212
+ thresholds:
213
+ ram_available_mb: { yellow: 1024, orange: 512, red: 256, critical: 128 } # CRITICAL added
214
+ cpu_load_15m: { yellow: 2.0, red: 4.0 }
215
+ disk_root_free_mb: { yellow: 5120, red: 1024 }
216
+ swap_percent: { yellow: 50, red: 80 }
217
+ temperature_celsius: { yellow: 80, red: 95 }
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 🧠 Memory Pressure Resolution System
223
+
224
+ This system proactively identifies and resolves memory pressure situations by intelligently terminating non-critical processes when system RAM falls below a defined `critical` threshold. It integrates seamlessly with the existing daemon and Hermes Agent, and is controlled via new CLI commands and configuration blocks.
225
+
226
+ ### Lifecycle Overview:
227
+
228
+ 1. **Detection:** The `sysstabled` daemon continuously monitors system metrics. When `ram_available_mb` drops below the `critical` watermark (defined in `thresholds.critical`), the Memory Pressure Resolution system is triggered.
229
+ 2. **Initiation:** The `MemoryPressureResolver` (from `resolver.py`) is engaged. It checks the new `memory_pressure.enabled` configuration. If enabled, and after a `grace_period_seconds`, it begins the resolution process.
230
+ 3. **Process Assessment:** The `ProcessSnapshot` class (from `process_watch.py`) gathers detailed information about all running processes, including their PID, name, command line, RAM usage, CPU usage, and runtime.
231
+ 4. **Scoring & Prioritization:** The `resolution` configuration block defines parameters for scoring processes. Each process is assigned an importance score based on RAM usage, CPU usage, runtime, and an `importance_score_weight`. The `never_kill` configuration (pids, names, cmdlines) is consulted to exclude critical processes (e.g., `hermes-agent`, `sysstabled` itself).
232
+ 5. **Termination:** The `KillListGenerator` (from `process_watch.py`) uses scorers and the `never_kill` list to create a prioritized list of non-critical processes to terminate. The `MemoryPressureResolver` then signals the termination of processes from this list, respecting `max_kill_attempts` and `min_process_ram_mb`.
233
+ 6. **Monitoring & Feedback:** The `PressureStateMachine` (from `state_machine.py`) tracks the state of the memory pressure resolution. The CLI command `resolution-history` provides a log of these events. The Hermes plugin receives `CRITICAL` severity alerts, enabling immediate, system-wide actions.
234
+
235
+ ### New Modules:
236
+ * `src/sysstable/process_watch.py`: Contains `ProcessSnapshot`, `NoKillManager`, `KillListGenerator`.
237
+ * `src/sysstable/state_machine.py`: Contains `PressureStateMachine`.
238
+ * `src/sysstable/resolver.py`: Contains `MemoryPressureResolver`.
239
+
240
+ ### New CLI Commands:
241
+ * `sysstable processes`: List all running processes with key metrics.
242
+ * `sysstable kill-list`: Generate and display a prioritized list of processes that *could* be killed.
243
+ * `sysstable resolution-history`: View logs of memory pressure resolution events.
244
+ * `sysstable start --never-kill`: Temporarily disable the auto-kill feature on startup.
245
+
246
+ ---
247
+
248
+ ## πŸ§ͺ Development
249
+
250
+ ```bash
251
+ # Install with dev deps
252
+ uv pip install -e ."[dev]"
253
+
254
+ # Run tests (80 tests total)
255
+ pytest tests/ -v
256
+
257
+ # Lint
258
+ ruff check src/ tests/
259
+
260
+ # Format
261
+ ruff format src/ tests/
262
+
263
+ # Full check
264
+ make check
265
+ ```
266
+
267
+ ---
268
+
269
+ ## πŸ“Š Threshold Behavior
270
+
271
+ | Severity | Plugin Action |
272
+ |----------|---------------|
273
+ | 🟒 Green | Silence |
274
+ | 🟑 Yellow | Injects `[SYSTEM STATUS]` context warning via `pre_llm_call` |
275
+ | 🟠 Orange | Injects warning, blocks first delegation attempt, allows retry |
276
+ | πŸ”΄ Red | Blocks `delegate_task` via `pre_tool_call`. Release manually. |
277
+ | 🚨 CRITICAL | Blocks `delegate_task` via `pre_tool_call`. Triggers Memory Pressure Resolution system. |
278
+
279
+ ---
280
+
281
+ ## πŸ—ΊοΈ Project Structure
282
+
283
+ ```
284
+ rapidwebs-sysstable/
285
+ β”œβ”€β”€ src/sysstable/ # Main package
286
+ β”‚ β”œβ”€β”€ __init__.py # Version info
287
+ β”‚ β”œβ”€β”€ __main__.py # python -m entry
288
+ β”‚ β”œβ”€β”€ daemon.py # Collection loop + state
289
+ β”‚ β”œβ”€β”€ collector.py # psutil wrappers
290
+ β”‚ β”œβ”€β”€ thresholds.py # Watermark engine
291
+ β”‚ β”œβ”€β”€ events.py # Hook/extension dispatch
292
+ β”‚ β”œβ”€β”€ database.py # SQLite store
293
+ β”‚ β”œβ”€β”€ socketd.py # Unix IPC
294
+ β”‚ β”œβ”€β”€ cli.py # Click CLI
295
+ β”‚ β”œβ”€β”€ config.py # YAML loader
296
+ β”‚ β”œβ”€β”€ process_watch.py # Process (snapshot, no-kill, kill-list) modules
297
+ β”‚ β”œβ”€β”€ state_machine.py # State machine for pressure resolution
298
+ β”‚ └── resolver.py # Memory pressure resolver logic
299
+ β”œβ”€β”€ hermes-plugin/ # Hermes integration
300
+ β”‚ └── rapidwebs-sysstable/
301
+ β”œβ”€β”€ tests/ # Pytest suite (80 tests)
302
+ β”œβ”€β”€ docs/ # systemd service
303
+ β”œβ”€β”€ pyproject.toml # Build config
304
+ β”œβ”€β”€ Makefile # Dev commands
305
+ └── Dockerfile # Container build
306
+ ```
307
+
308
+ ---
309
+
310
+ ## πŸ”— Related
311
+
312
+ - [Hermes Agent](https://hermes-agent.nousresearch.com) β€” AI agent platform
313
+ - [rapidwebs-sysstable Hermes Plugin](https://github.com/stephanos8926-lgtm/rapidwebs-sysstable/tree/main/hermes-plugin) β€” v0.2.0 with CRITICAL severity blocking
314
+ - [psutil](https://github.com/giampaolo/psutil) β€” System metrics library
315
+ - [RapidWebs Enterprise](https://rapidwebs.com) β€” Digital architecture studio
316
+
317
+ ---
318
+
319
+ ## πŸ“„ License
320
+
321
+ MIT Β© 2026 RapidWebs Enterprise. See [LICENSE](LICENSE) for details.
@@ -0,0 +1,20 @@
1
+ sysstable/__init__.py,sha256=e60Hejr4o860hUj9a3-unNn8Vu2oCfvqyfvGK_sV8Zc,102
2
+ sysstable/__main__.py,sha256=LhzY4USZj9oaB9_sJwIvrzSpYr_CFtnH7Du9Kc2Fhhc,117
3
+ sysstable/cli.py,sha256=29nm8C90NeZpWRr4Z4dBhy7fQNQXEZW1QQ-eJn7Ak0U,16497
4
+ sysstable/collector.py,sha256=mFqW1Avxpxd4YClm_ddHuE7m5eRIXtnI-Y-XiAha8KE,9255
5
+ sysstable/config.py,sha256=d_0COMaBXKsZzwRuWomswb1g13GAGaERyHmAo5J2BRc,3203
6
+ sysstable/daemon.py,sha256=h_oao-w4rdmViB1CEWj9kG7JctNCw5vZiZaMfcOXlx0,8824
7
+ sysstable/database.py,sha256=90sxY7G6Trev5PW8vSoEtwrMIL8yUhaShhbv_y-teAE,9235
8
+ sysstable/events.py,sha256=C_dymasU8k5hhFF2jTkakJelNLLnxXW6YhwW4l6-eIE,3560
9
+ sysstable/process_watch.py,sha256=k9GxOLh8A6KdZETVyMUWl8lyRp8zkWQ_0hL76sZkenQ,17546
10
+ sysstable/resolver.py,sha256=0Pn3sqOsnpm0LdjnPZVWn_Wrqkaaay9aQ9MwdBLX1qM,15142
11
+ sysstable/socketd.py,sha256=7y5vb0ZCj0Y2l0vfXAHxR5sOJZaOETy072LNeDxRYSk,3994
12
+ sysstable/state_machine.py,sha256=aPyExoF_SqiT4aA3_OHkuOW0KyU5XZkX4pA9BFu59E8,5889
13
+ sysstable/systemd_notify.py,sha256=c62dVKVT3G8-uy0bwNPKti5bmVyhW6rvxy1FOLeWmtI,1811
14
+ sysstable/thresholds.py,sha256=rhcnjji5XqCWj1TWUGsVNYDTGdpfPp6Bd4JIjIgdA2Y,3950
15
+ sysstable/utils.py,sha256=Fu3i1kRDIp_jvEWyzbdxqpEr7ROHkdTTgczjtiugd7E,1030
16
+ rw_sysstable-0.2.0.dist-info/METADATA,sha256=ZkyHNwyYjG4bUYKYt6jFtnO6J-cQAcu7nHuwhyQTwDQ,14355
17
+ rw_sysstable-0.2.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
18
+ rw_sysstable-0.2.0.dist-info/entry_points.txt,sha256=pwz5UFjnVmO92ilU13NSuRLrm15BhR3KX9W_DnL0H0c,48
19
+ rw_sysstable-0.2.0.dist-info/licenses/LICENSE,sha256=PhJgaQpcP_aIHv03iPoCrZ6MxYuQBCFTvR-tiYSXYBs,1077
20
+ rw_sysstable-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ sysstable = sysstable.cli:cli
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 RapidWebs Enterprise
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.
sysstable/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ """sysstable β€” System Stability Monitor for RapidWebs Hermes integration."""
2
+
3
+ __version__ = "0.2.0"
sysstable/__main__.py ADDED
@@ -0,0 +1,6 @@
1
+ """__main__.py β€” `python -m sysstable` entry point."""
2
+
3
+ from .cli import cli
4
+
5
+ if __name__ == "__main__":
6
+ cli()