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.
- wraith_cli-1.0.0/.cz.yaml +67 -0
- wraith_cli-1.0.0/.env.example +17 -0
- wraith_cli-1.0.0/.gitea/CODEOWNERS.md +6 -0
- wraith_cli-1.0.0/.gitea/PULL_REQUEST_TEMPLATE.md +42 -0
- wraith_cli-1.0.0/.gitea/workflows/pages.yml +59 -0
- wraith_cli-1.0.0/.gitea/workflows/release.yml +23 -0
- wraith_cli-1.0.0/.gitea/workflows/test.yml +36 -0
- wraith_cli-1.0.0/.gitignore +167 -0
- wraith_cli-1.0.0/.pre-commit-config.yaml +30 -0
- wraith_cli-1.0.0/CHANGELOG.md +52 -0
- wraith_cli-1.0.0/CONTRIBUTING.md +50 -0
- wraith_cli-1.0.0/LICENSE +15 -0
- wraith_cli-1.0.0/PKG-INFO +124 -0
- wraith_cli-1.0.0/README.md +74 -0
- wraith_cli-1.0.0/bin/build.sh +45 -0
- wraith_cli-1.0.0/bin/run_tests.sh +19 -0
- wraith_cli-1.0.0/bin/setup_venv.sh +10 -0
- wraith_cli-1.0.0/docs/index.md +8 -0
- wraith_cli-1.0.0/docs/reference.md +18 -0
- wraith_cli-1.0.0/docs/usage.md +26 -0
- wraith_cli-1.0.0/mkdocs.yml +36 -0
- wraith_cli-1.0.0/pyproject.toml +77 -0
- wraith_cli-1.0.0/src/wraith_cli/__init__.py +0 -0
- wraith_cli-1.0.0/src/wraith_cli/main.py +89 -0
- wraith_cli-1.0.0/tests/test_cli.py +97 -0
- wraith_cli-1.0.0/uv.lock +1144 -0
|
@@ -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,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.
|
wraith_cli-1.0.0/LICENSE
ADDED
|
@@ -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
|
+
[](https://www.thomaspeoples.com/gitea-repos/wraith-cli/)
|
|
52
|
+

|
|
53
|
+

|
|
54
|
+

|
|
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.
|