wraith-cli 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,67 @@
1
+ commitizen:
2
+ name: cz_customize
3
+ version_provider: uv
4
+ version_scheme: semver
5
+ major_version_zero: true
6
+ update_changelog_on_bump: true
7
+ tag_format: v$version
8
+ bump_message: ":ghost: chore: release v$current_version -> v$new_version [skip ci]"
9
+
10
+ customize:
11
+ bump_map:
12
+ Break: MAJOR
13
+ break: MAJOR
14
+ Feature: MINOR
15
+ feature: MINOR
16
+ Fix: PATCH
17
+ fix: PATCH
18
+ Bug: PATCH
19
+ bug: PATCH
20
+
21
+ # Removed '^' to allow emojis/prefixes to exist without breaking the match
22
+ bump_pattern: '(feature|fix|bug|break|Feature|Fix|Bug|Break)/[A-Z]{3}-\d{5}'
23
+
24
+ # Parser: Extracts the type for the changelog even if there's an emoji before it
25
+ commit_parser: '(?P<change_type>feature|fix|bug|break|Feature|Fix|Bug|Break)/[A-Z]{3}-\d{5}: (?P<message>.*)'
26
+
27
+ change_type_map:
28
+ Break: "Breaking Changes"
29
+ break: "Breaking Changes"
30
+ Feature: "Features"
31
+ feature: "Features"
32
+ Fix: "Bug Fixes"
33
+ fix: "Bug Fixes"
34
+ Bug: "Bug Fixes"
35
+ bug: "Bug Fixes"
36
+
37
+ change_type_order:
38
+ - break
39
+ - Break
40
+ - feature
41
+ - Feature
42
+ - fix
43
+ - Fix
44
+ - bug
45
+ - Bug
46
+
47
+ changelog_pattern: '(feature|fix|bug|break|Feature|Fix|Bug|Break)/[A-Z]{3}-\d{5}'
48
+
49
+ example: '👻 feature/TJP-00001: implement sovereign automation'
50
+ message_template: '{{change_type}}: {{message}}'
51
+
52
+ questions:
53
+ - name: change_type
54
+ type: list
55
+ message: Select the type of change you are committing
56
+ choices:
57
+ - {name: "break: A breaking change", value: break}
58
+ - {name: "feature: A new feature", value: feature}
59
+ - {name: "fix: A standard fix", value: fix}
60
+ - {name: "bug: A specific bug fix", value: bug}
61
+ - name: message
62
+ type: input
63
+ message: "Enter a brief description:"
64
+
65
+ schema: '<type>/<ticket>: <body>'
66
+ # Schema stays strict for your local pre-commit hooks
67
+ schema_pattern: '^.*(feature|fix|bug|break|Feature|Fix|Bug|Break)/[A-Z]{3}-\d{5}: (.*)'
@@ -0,0 +1,17 @@
1
+ # Node Configuration
2
+ NODE_NAME=local-node
3
+
4
+ # Forum API Settings
5
+ SOVEREIGN_FORUM_URL=https://forum.example.com
6
+ SOVEREIGN_API_KEY=your_api_key_here
7
+ SOVEREIGN_USERNAME=Arthur
8
+
9
+ # AI Engine Settings
10
+ # Use your Tailscale URL or localhost:11434
11
+ OLLAMA_HOST=http://localhost:11434
12
+ ARTHUR_MODEL=arthur
13
+
14
+ VIKING_TOKEN=your_token_here
15
+ VIKING_ACCOUNT=default
16
+ VIKING_USER=admin
17
+ GITEA_COMPOSE_PATH=/home/user/pjt-nas/nas/compose-data/gitea
@@ -0,0 +1,6 @@
1
+ # Global owners
2
+ * @thomaspeoples
3
+
4
+ # Specialised owners
5
+ # /bin/ @thomaspeoples @ghost-bot
6
+ # /src/ @thomaspeoples
@@ -0,0 +1,42 @@
1
+ # 👻 Ghost Stack Pull Request
2
+
3
+ ## 🎯 Purpose
4
+ _What are we haunting today? Briefly describe the change._
5
+
6
+ **Fixes:** # (Link the Gitea Issue here)
7
+
8
+ ---
9
+
10
+ ## 🛠️ Proposed Changes
11
+ - [ ] Logic updated in `src/`
12
+ - [ ] Dependencies synced via `uv lock`
13
+ - [ ] Version bumped in `pyproject.toml` (if manual)
14
+
15
+ ---
16
+
17
+ ## 🚦 Quality Gate (The Ghost Protocol)
18
+ The following **must** be green before the `ghost-bot` is summoned:
19
+
20
+ - [ ] **uv Sync:** Environment is healthy and `uv.lock` is up to date.
21
+ - [ ] **Tests:** `./bin/run_tests.sh` passes with >80% coverage.
22
+ - [ ] **Linting:** `pre-commit run --all-files` passes (No badly formatted code).
23
+ - [ ] **Commits:** Messages follow the `cz_customize` regex (Fix/Feature/Break).
24
+
25
+ ---
26
+
27
+ ## 🧪 Deployment & Verification
28
+ - [ ] Branch is synced with the latest `main`.
29
+ - [ ] Solution has been executed in the local `uv` environment.
30
+ - [ ] (Optional) Verified in the `ci-images` container.
31
+
32
+ ---
33
+
34
+ ## 👤 Author's Final Word
35
+ _Any specific notes for the reviewer or warnings about breaking changes?_
36
+
37
+ ---
38
+
39
+ ## 🕵️ Reviewer Checklist
40
+ - [ ] Code follows the Sovereign style (Clean, no artifacts).
41
+ - [ ] Test coverage is actually meaningful (not just hitting lines).
42
+ - [ ] Versioning strategy aligns with the change type.
@@ -0,0 +1,59 @@
1
+ name: Deploy Gitea Pages
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+
7
+ jobs:
8
+ deploy:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ with:
13
+ fetch-depth: 0
14
+
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v3
17
+ with:
18
+ version: "latest"
19
+
20
+ - name: Set up Python
21
+ run: uv python install 3.12
22
+
23
+ - name: Install dependencies
24
+ run: uv sync --all-extras
25
+
26
+ - name: Run Tests & Coverage
27
+ run: uv run pytest --cov=src --cov-report=xml
28
+
29
+ - name: Generate Coverage Badge
30
+ run: uv run genbadge coverage -i coverage.xml -o docs/coverage.svg
31
+
32
+ - name: Build Documentation
33
+ run: uv run mkdocs build
34
+
35
+ - name: Sync to Main Website Repo
36
+ env:
37
+ MY_TOKEN: ${{ secrets.GITEATOKEN }}
38
+ MY_URL: ${{ secrets.GITEAURL }}
39
+
40
+ run: |
41
+ # 1. Clone your main website repo
42
+ CLEAN_URL=$(echo $MY_URL | sed -e 's|^[^/]*//||')
43
+ git clone https://${MY_TOKEN}@${CLEAN_URL}/thomaspeoples/ghost-site.git main_site
44
+
45
+ # 2. Create the target directory if it doesn't exist
46
+ TARGET_DIR="main_site/www/gitea-repos/wraith-cli"
47
+ mkdir -p $TARGET_DIR
48
+
49
+ # 3. Clean and Copy
50
+ rm -rf $TARGET_DIR/*
51
+ cp -r site/* $TARGET_DIR/
52
+
53
+ # 4. Commit and Push to the OTHER repo
54
+ cd main_site
55
+ git config user.name "Ghost Runner"
56
+ git config user.email "runner@ghost-stack.local"
57
+ git add .
58
+ git commit -m "Update docs for wraith-cli: ${{ gitea.sha }}"
59
+ git push origin main
@@ -0,0 +1,23 @@
1
+ name: 'Sovereign Release'
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ release:
10
+ if: "!contains(github.event.head_commit.message, '[skip ci]')"
11
+ runs-on: ghost-runner
12
+ steps:
13
+ - name: Check out code
14
+ uses: actions/checkout@v4
15
+ with:
16
+ fetch-depth: 0
17
+ token: ${{ secrets.giteatoken }}
18
+
19
+ - name: Run Ghost Bump
20
+ uses: https://git.thomaspeoples.com/thomaspeoples/ci-actions/version-bump@main
21
+ with:
22
+ gitea_token: ${{ secrets.giteatoken }}
23
+ api_url: "${{ secrets.giteaurl }}/api/v1"
@@ -0,0 +1,36 @@
1
+ name: Discourse-Bot CI
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - 'main'
7
+
8
+ jobs:
9
+ test-and-verify:
10
+ runs-on: ghost-runner
11
+ steps:
12
+ - name: Check out code
13
+ uses: actions/checkout@v4
14
+ with:
15
+ fetch-depth: 0
16
+ - name: Run Production Tests
17
+ run: |
18
+ chmod +x bin/run_tests.sh
19
+ ./bin/run_tests.sh --no-venv
20
+ env:
21
+ SOVEREIGN_FORUM_URL: "https://mock.forum"
22
+ SOVEREIGN_API_KEY: "mock_key"
23
+ SOVEREIGN_USERNAME: "mock_user"
24
+ PYTHONPATH: .
25
+
26
+ auto-merge:
27
+ needs: test-and-verify
28
+ if: github.ref != 'refs/heads/main'
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - name: Call Central Merge Action
33
+ uses: https://git.thomaspeoples.com/thomaspeoples/ci-actions/auto-merge@main
34
+ with:
35
+ gitea_token: ${{ secrets.giteatoken }}
36
+ api_url: "${{ secrets.giteaurl }}/api/v1"
@@ -0,0 +1,167 @@
1
+ # uv and local environment
2
+ .uv/
3
+ ollama_data/
4
+
5
+ # Byte-compiled / optimized / DLL files
6
+ __pycache__/
7
+ *.py[cod]
8
+ *$py.class
9
+ *.pyc
10
+
11
+ # C extensions
12
+ *.so
13
+
14
+ # Distribution / packaging
15
+ .Python
16
+ build/
17
+ develop-eggs/
18
+ dist/
19
+ downloads/
20
+ eggs/
21
+ .eggs/
22
+ lib/
23
+ lib64/
24
+ parts/
25
+ sdist/
26
+ var/
27
+ wheels/
28
+ share/python-wheels/
29
+ *.egg-info/
30
+ .installed.cfg
31
+ *.egg
32
+ MANIFEST
33
+
34
+ # PyInstaller
35
+ # Usually these files are written by a python script from a template
36
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
37
+ *.manifest
38
+ *.spec
39
+
40
+ # Installer logs
41
+ pip-log.txt
42
+ pip-delete-this-directory.txt
43
+
44
+ # Unit test / coverage reports
45
+ htmlcov/
46
+ .tox/
47
+ .nox/
48
+ .coverage
49
+ .coverage.*
50
+ .cache
51
+ nosetests.xml
52
+ coverage.xml
53
+ *.cover
54
+ *.py,cover
55
+ .hypothesis/
56
+ .pytest_cache/
57
+ cover/
58
+
59
+ # Translations
60
+ *.mo
61
+ *.pot
62
+
63
+ # Django stuff:
64
+ *.log
65
+ local_settings.py
66
+ db.sqlite3
67
+ db.sqlite3-journal
68
+
69
+ # Flask stuff:
70
+ instance/
71
+ .webassets-cache
72
+
73
+ # Scrapy stuff:
74
+ .scrapy
75
+
76
+ # Sphinx documentation
77
+ docs/_build/
78
+
79
+ # PyBuilder
80
+ .pybuilder/
81
+ target/
82
+
83
+ # Jupyter Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # IPython
87
+ profile_default/
88
+ ipython_config.py
89
+
90
+ # pyenv
91
+ # For a library or package, you might want to ignore these files since the code is
92
+ # intended to run in multiple environments; otherwise, check them in:
93
+ # .python-version
94
+
95
+ # pipenv
96
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
97
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
98
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
99
+ # install all needed dependencies.
100
+ #Pipfile.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ #poetry.lock
108
+
109
+ # pdm
110
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
111
+ #pdm.lock
112
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
113
+ # in version control.
114
+ # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
115
+ .pdm.toml
116
+ .pdm-python
117
+ .pdm-build/
118
+
119
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
120
+ __pypackages__/
121
+
122
+ # Celery stuff
123
+ celerybeat-schedule
124
+ celerybeat.pid
125
+
126
+ # SageMath parsed files
127
+ *.sage.py
128
+
129
+ # Environments
130
+ .env
131
+ .venv
132
+ env/
133
+ venv/
134
+ ENV/
135
+ env.bak/
136
+ venv.bak/
137
+
138
+ # Spyder project settings
139
+ .spyderproject
140
+ .spyproject
141
+
142
+ # Rope project settings
143
+ .ropeproject
144
+
145
+ # mkdocs documentation
146
+ /site
147
+
148
+ # mypy
149
+ .mypy_cache/
150
+ .dmypy.json
151
+ dmypy.json
152
+
153
+ # Pyre type checker
154
+ .pyre/
155
+
156
+ # pytype static type analyzer
157
+ .pytype/
158
+
159
+ # Cython debug symbols
160
+ cython_debug/
161
+
162
+ # PyCharm
163
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
164
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
165
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
166
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
167
+ #.idea/
@@ -0,0 +1,30 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.4.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ - id: check-added-large-files
9
+
10
+ - repo: https://github.com/astral-sh/ruff-pre-commit
11
+ rev: v0.9.6
12
+ hooks:
13
+ - id: ruff
14
+ args: ["--fix"]
15
+ - id: ruff-format
16
+
17
+ - repo: local
18
+ hooks:
19
+ - id: pytest-coverage
20
+ name: pytest-coverage
21
+ entry: ./bin/run_tests.sh
22
+ language: system
23
+ pass_filenames: false
24
+ always_run: true
25
+
26
+ - id: commitizen
27
+ name: commitizen check
28
+ entry: uv run cz check --commit-msg-file
29
+ language: system
30
+ stages: [commit-msg]
@@ -0,0 +1,52 @@
1
+ ## v0.15.0 (2026-03-31)
2
+
3
+ ## v0.14.0 (2026-03-31)
4
+
5
+ ## v0.13.0 (2026-03-31)
6
+
7
+ ## v0.12.0 (2026-03-31)
8
+ * 👻 **feature/TJP-20002:** Changed name from ghost-cli to wraith-cli (fd2cb84)
9
+
10
+ ## v0.11.0 (2026-03-31)
11
+ * 👻 **chore:** release v0.10.0 -> v0.11.0 [skip ci] (b79bcbd)
12
+ * 🎉 **feature/TJP-20002:** Changes to www serve location (80fe628)
13
+
14
+ ## v0.10.0 (2026-03-31)
15
+ * 👻 **chore:** release v0.9.0 -> v0.10.0 [skip ci] (d628b95)
16
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (c639fa8)
17
+
18
+ ## v0.9.0 (2026-03-31)
19
+ * 👻 **chore:** release v0.8.0 -> v0.9.0 [skip ci] (8529ed5)
20
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (da6b1d8)
21
+
22
+ ## v0.8.0 (2026-03-31)
23
+ * 👻 **chore:** release v0.7.0 -> v0.8.0 [skip ci] (526eb86)
24
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (ada6802)
25
+
26
+ ## v0.7.0 (2026-03-31)
27
+ * 👻 **chore:** release v0.6.0 -> v0.7.0 [skip ci] (5441a53)
28
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (783254d)
29
+
30
+ ## v0.6.0 (2026-03-31)
31
+ * 👻 **chore:** release v0.5.0 -> v0.6.0 [skip ci] (c31ca55)
32
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (a1ad4f2)
33
+
34
+ ## v0.5.0 (2026-03-31)
35
+ * 👻 **chore:** release v0.4.0 -> v0.5.0 [skip ci] (a174f9c)
36
+ * 📚 **feature/TJP-10001:** Added mkdocs and pages for docs (a2ea788)
37
+
38
+ ## v0.4.0 (2026-03-31)
39
+ * 👻 **chore:** release v0.3.0 -> v0.4.0 [skip ci] (480d3c4)
40
+ * 🎉 **feature/TJP-10001:** Improvements and a poor commit message (d415400)
41
+
42
+ ## v0.3.0 (2026-03-30)
43
+ * 👻 **chore:** release v0.2.0 -> v0.3.0 [skip ci] (ea0ef47)
44
+ * 🎉 **feature/TJP-10001:** Skipping PRs (d076eeb)
45
+
46
+ ## v0.2.0 (2026-03-30)
47
+ * 👻 **chore:** release v0.1.2 -> v0.2.0 [skip ci] (c135463)
48
+ * 🎉 **feature/TJP-10001:** Updated docs (03089ca)
49
+ * 🎉 **feature/TJP-10001:** Updated docs (56c076c)
50
+ * 🎉 **feature/TJP-10001:** Added a custom CLI (c43513b)
51
+ * ⚡ **chore:** Everytbing is a chore (ff91d9e)
52
+ * Initial commit (10dccaa)
@@ -0,0 +1,50 @@
1
+ # 👻 Contributing to the Wraith CLI
2
+
3
+ This project is a UV-first, bleached repository. We prioritise local sovereignty, minimal VRAM footprints, and automated Gitea CI/CD.
4
+
5
+ ## 🏗️ The Engineering Stack
6
+ * Runtime/Registry: uv
7
+ * VCS / Identity: Gitea + OIDC Provider
8
+ * Automation: Gitea Actions + Commitizen (.cz.yaml)
9
+ * AI Logic: Local Core (Qwen 3.5 0.8b) compatible
10
+
11
+ ## 🚀 Local Development Setup
12
+ We do not use pip. All environments must be managed via uv to ensure architectural parity with the Ghost Stack.
13
+
14
+ ```bash
15
+ # Clone from the Gitea Mesh:
16
+ git clone https://git.thomaspeoples.com/thomaspeoples/wraith-cli.git
17
+ cd wraith-cli
18
+
19
+ # Initialise the Hermetic Environment:
20
+ ./bin/build.sh
21
+ ```
22
+
23
+ ## 🛠️ Workflow & Commit Logic
24
+ This repository uses Commitizen to automate :ghost: emoji releases. All commits must be conventional.
25
+
26
+ * Feature: feat: [description]
27
+ * Fix: fix: [description]
28
+ * Refactor: refactor: [description]
29
+
30
+ To ensure the release logic triggers correctly, use the built-in CLI:
31
+ `uv run cz commit`
32
+
33
+ ## 🧪 Testing & Quality Gates
34
+ Before pushing to the Gitea remote, ensure the code passes the "Bleach" test. The Gitea Action will reject any PR that fails these:
35
+
36
+ * Linting (Ruff):
37
+ `uv run ruff check .`
38
+
39
+ * Formatting (Black/Sovereign Dark):
40
+ `uv run black .`
41
+
42
+ * Unit Tests:
43
+ `uv run pytest`
44
+
45
+ ## 🛰️ Sovereign Protocols
46
+ * No Internal IPs: Ensure no 192.x.x.x or 10[0].x.x.x addresses are committed.
47
+ * Context Awareness: Keep code lean for the local LLM inference core. If it can be done with a standard library, do it.
48
+ * OIDC Integrity: Do not bypass the Gitea master auth authority for external calls.
49
+
50
+ System Status: Architectural Peak. Maintain the Lead Engineer's vision.
@@ -0,0 +1,15 @@
1
+ Copyright © `2026` `Thomas Peoples`
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the “Software”), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,124 @@
1
+ Metadata-Version: 2.4
2
+ Name: wraith-cli
3
+ Version: 1.0.0
4
+ Summary: Sovereign Command Centre for a Ghost Stack
5
+ Project-URL: Homepage, https://git.thomaspeoples.com/thomaspeoples/wraith-cli
6
+ Project-URL: Documentation, https://www.thomaspeoples.com/gitea-repos/wraith-cli/
7
+ Project-URL: Repository, https://git.thomaspeoples.com/thomaspeoples/wraith-cli.git
8
+ Project-URL: Issues, https://git.thomaspeoples.com/thomaspeoples/wraith-cli/issues
9
+ Author-email: Thomas Peoples <junk@thomaspeoples.com>
10
+ License: Copyright © `2026` `Thomas Peoples`
11
+
12
+ Permission is hereby granted, free of charge, to any person
13
+ obtaining a copy of this software and associated documentation
14
+ files (the “Software”), to deal in the Software without
15
+ restriction, including without limitation the rights to use,
16
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
17
+ copies of the Software, and to permit persons to whom the
18
+ Software is furnished to do so, subject to the following
19
+ conditions:
20
+
21
+ The above copyright notice and this permission notice shall be
22
+ included in all copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
+ License-File: LICENSE
26
+ Keywords: automation,cli,ghost-stack,gitea,sovereign
27
+ Classifier: Environment :: Console
28
+ Classifier: Intended Audience :: System Administrators
29
+ Classifier: License :: OSI Approved :: MIT License
30
+ Classifier: Operating System :: OS Independent
31
+ Classifier: Programming Language :: Python :: 3
32
+ Classifier: Programming Language :: Python :: 3.12
33
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
34
+ Requires-Python: >=3.12
35
+ Requires-Dist: python-dotenv
36
+ Requires-Dist: requests
37
+ Requires-Dist: rich>=13.0.0
38
+ Requires-Dist: typer>=0.9.0
39
+ Provides-Extra: dev
40
+ Requires-Dist: commitizen; extra == 'dev'
41
+ Requires-Dist: genbadge[coverage]>=1.1.1; extra == 'dev'
42
+ Requires-Dist: mkdocs-material>=9.5.0; extra == 'dev'
43
+ Requires-Dist: mkdocs>=1.6.0; extra == 'dev'
44
+ Requires-Dist: pre-commit; extra == 'dev'
45
+ Requires-Dist: pymdown-extensions>=10.7.0; extra == 'dev'
46
+ Requires-Dist: pytest; extra == 'dev'
47
+ Requires-Dist: pytest-cov; extra == 'dev'
48
+ Requires-Dist: ruff; extra == 'dev'
49
+ Description-Content-Type: text/markdown
50
+
51
+ [![Documentation](https://img.shields.io/badge/docs-live-brightgreen)](https://www.thomaspeoples.com/gitea-repos/wraith-cli/)
52
+ ![PyPI - Version](https://img.shields.io/pypi/v/wraith-cli)
53
+ ![PyPI - License](https://img.shields.io/pypi/l/wraith-cli)
54
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/wraith-cli)
55
+
56
+
57
+ # 👻 Wraith-CLI
58
+ ### *Sovereign Orchestration for the Ghost Stack*
59
+
60
+ **Wraith-CLI** is the nervous system of the Ghost Stack. It bridges the gap between high-level containers and bare-metal reality.
61
+
62
+ ---
63
+
64
+ ## 🚀 Installation
65
+
66
+ **Wraith-CLI** can be installed via `uv` (recommended) or `pip`:
67
+
68
+ ```bash
69
+ # Recommended for CLI tools
70
+ uv tool install wraith-cli
71
+
72
+ # Standard pip
73
+ pip install wraith-cli
74
+ ```
75
+
76
+ > **Note:** Ensure ~/.local/bin is in your $PATH.
77
+
78
+ ---
79
+
80
+ ## 🛠️ Operational Manual
81
+
82
+ | Command | Description |
83
+ | :--- | :--- |
84
+ | wraith ps | Shows all Docker processes in a neat table |
85
+ | wraith status | Heartbeat check for OpenViking (Port 1933). |
86
+ | wraith runner-reset | Wipes and re-registers the Gitea Action Runner. |
87
+ | wraith --help | View the full manifest of available commands. |
88
+
89
+ ---
90
+
91
+ ## 🏗️ Developer Workspace
92
+
93
+ We use uv for hermetic environment management.
94
+
95
+ ```bash
96
+ ### 1. Initialise the Environment
97
+ uv sync --all-extras
98
+ uv run pre-commit install
99
+
100
+ ### 2. The Quality Gate
101
+ uv run pytest
102
+
103
+ ### 3. Sovereign Deployment
104
+ chmod +x bin/build.sh
105
+ ./bin/build.sh
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 🔐 Environment Configuration
111
+
112
+ Defined in `~/.bashrc` or `.env.private`:
113
+
114
+ | Variable | Purpose | Default |
115
+ | :--- | :--- | :--- |
116
+ | VIKING_BASE_URL | The API endpoint for the heartbeat check. | http://127.0.0.1:1933/api/v1 |
117
+ | GITEA_COMPOSE_PATH | Path to your Gitea Docker Compose directory. | Required for runner-reset |
118
+
119
+ ---
120
+
121
+ ## 📜 Sovereign Principles
122
+ 1. **Distributed Sovereignty:** Available on PyPI for the world, but optimised for local-first, private-registry mirrors
123
+ 2. **Atomic Execution:** Use uv run to ensure consistency.
124
+ 3. **Hardware First:** Prioritise bare-metal health and container stability.