huitzo-cli 0.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.
- huitzo_cli-0.0.0/.github/workflows/publish-cli.yml +338 -0
- huitzo_cli-0.0.0/.github/workflows/test.yml +167 -0
- huitzo_cli-0.0.0/.gitignore +137 -0
- huitzo_cli-0.0.0/PKG-INFO +19 -0
- huitzo_cli-0.0.0/README.md +364 -0
- huitzo_cli-0.0.0/examples/hello-pack/.gitignore +13 -0
- huitzo_cli-0.0.0/examples/hello-pack/README.md +50 -0
- huitzo_cli-0.0.0/examples/hello-pack/huitzo.yaml +14 -0
- huitzo_cli-0.0.0/examples/hello-pack/pyproject.toml +31 -0
- huitzo_cli-0.0.0/examples/hello-pack/src/hello_pack/__init__.py +3 -0
- huitzo_cli-0.0.0/examples/hello-pack/src/hello_pack/commands/__init__.py +1 -0
- huitzo_cli-0.0.0/examples/hello-pack/src/hello_pack/commands/greetings.py +39 -0
- huitzo_cli-0.0.0/examples/hello-pack/tests/__init__.py +1 -0
- huitzo_cli-0.0.0/examples/hello-pack/tests/test_greetings.py +36 -0
- huitzo_cli-0.0.0/pyproject.toml +40 -0
- huitzo_cli-0.0.0/src/huitzo_cli/__init__.py +14 -0
- huitzo_cli-0.0.0/src/huitzo_cli/auth.py +146 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/__init__.py +1 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/auth.py +61 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/build.py +81 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/config_cmd.py +98 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/dashboard.py +145 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/dev.py +113 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/init.py +142 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/registry.py +105 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/secrets.py +197 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/test.py +56 -0
- huitzo_cli-0.0.0/src/huitzo_cli/commands/validate.py +64 -0
- huitzo_cli-0.0.0/src/huitzo_cli/config.py +219 -0
- huitzo_cli-0.0.0/src/huitzo_cli/docs_server/__init__.py +1 -0
- huitzo_cli-0.0.0/src/huitzo_cli/docs_server/server.py +128 -0
- huitzo_cli-0.0.0/src/huitzo_cli/main.py +72 -0
- huitzo_cli-0.0.0/src/huitzo_cli/sandbox/__init__.py +1 -0
- huitzo_cli-0.0.0/src/huitzo_cli/sandbox/proxy.py +75 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/App.css.j2 +19 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/App.tsx.j2 +21 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/index.css.j2 +58 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/index.html.j2 +13 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/main.tsx.j2 +10 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/package.json.j2 +19 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/tsconfig.json.j2 +25 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/tsconfig.node.json.j2 +10 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/dashboard/vite.config.ts.j2 +15 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/.gitignore.j2 +13 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/README.md.j2 +52 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/__init__.py.j2 +3 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/hello.py.j2 +20 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/huitzo.yaml.j2 +11 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/pyproject.toml.j2 +31 -0
- huitzo_cli-0.0.0/src/huitzo_cli/templates/pack/test_hello.py.j2 +22 -0
- huitzo_cli-0.0.0/src/huitzo_cli/validator.py +133 -0
- huitzo_cli-0.0.0/src/huitzo_cli/version.py +14 -0
- huitzo_cli-0.0.0/tests/__init__.py +1 -0
- huitzo_cli-0.0.0/tests/conftest.py +35 -0
- huitzo_cli-0.0.0/tests/test_auth.py +142 -0
- huitzo_cli-0.0.0/tests/test_commands.py +54 -0
- huitzo_cli-0.0.0/tests/test_config.py +130 -0
- huitzo_cli-0.0.0/tests/test_config_cmd.py +50 -0
- huitzo_cli-0.0.0/tests/test_dashboard.py +100 -0
- huitzo_cli-0.0.0/tests/test_dev.py +65 -0
- huitzo_cli-0.0.0/tests/test_init.py +140 -0
- huitzo_cli-0.0.0/tests/test_integration.py +172 -0
- huitzo_cli-0.0.0/tests/test_main.py +52 -0
- huitzo_cli-0.0.0/tests/test_registry.py +66 -0
- huitzo_cli-0.0.0/tests/test_secrets.py +100 -0
- huitzo_cli-0.0.0/tests/test_validate.py +149 -0
- huitzo_cli-0.0.0/uv.lock +914 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# CLI Publishing Workflow
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Implements:
|
|
5
|
+
# - docs/architecture/ci-cd.md#workflows
|
|
6
|
+
# - docs/architecture/ci-cd.md#self-hosted-runners
|
|
7
|
+
#
|
|
8
|
+
# Jobs:
|
|
9
|
+
# - detect-version: Determine version and targets from branch/tag
|
|
10
|
+
# - test: Cross-platform unit tests (3.11-3.14 all on self-hosted Linux)
|
|
11
|
+
# - build: Build distribution packages
|
|
12
|
+
# - publish-to-testpypi: Publish to TestPyPI for develop branches
|
|
13
|
+
# - publish-to-pypi: Publish to PyPI for main/tags
|
|
14
|
+
# - publish-release-notes: Create GitHub release for tags
|
|
15
|
+
#
|
|
16
|
+
# Self-Hosted Runners:
|
|
17
|
+
# - linux: All Python versions and builds
|
|
18
|
+
# =============================================================================
|
|
19
|
+
|
|
20
|
+
name: Publish Huitzo CLI 🚀 to PyPI and TestPyPI
|
|
21
|
+
|
|
22
|
+
on:
|
|
23
|
+
push:
|
|
24
|
+
branches:
|
|
25
|
+
- main
|
|
26
|
+
- 'develop/**'
|
|
27
|
+
tags:
|
|
28
|
+
- 'v*'
|
|
29
|
+
|
|
30
|
+
concurrency:
|
|
31
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
32
|
+
cancel-in-progress: true
|
|
33
|
+
|
|
34
|
+
jobs:
|
|
35
|
+
detect-version:
|
|
36
|
+
name: Detect Release Version
|
|
37
|
+
runs-on:
|
|
38
|
+
group: linux
|
|
39
|
+
labels: [self-hosted, Linux, X64]
|
|
40
|
+
outputs:
|
|
41
|
+
version: ${{ steps.version.outputs.version }}
|
|
42
|
+
is-release: ${{ steps.version.outputs.is-release }}
|
|
43
|
+
target: ${{ steps.version.outputs.target }}
|
|
44
|
+
|
|
45
|
+
steps:
|
|
46
|
+
- name: Pre-cleanup
|
|
47
|
+
run: |
|
|
48
|
+
docker image prune -f 2>/dev/null || true
|
|
49
|
+
|
|
50
|
+
- uses: actions/checkout@v6
|
|
51
|
+
with:
|
|
52
|
+
fetch-depth: 0
|
|
53
|
+
|
|
54
|
+
- name: Detect version strategy
|
|
55
|
+
id: version
|
|
56
|
+
run: |
|
|
57
|
+
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
|
|
58
|
+
# Tag push: use tag as version
|
|
59
|
+
VERSION="${{ github.ref_name }}"
|
|
60
|
+
IS_RELEASE="true"
|
|
61
|
+
TARGET="pypi"
|
|
62
|
+
elif [[ "${{ github.ref }}" == refs/heads/main ]]; then
|
|
63
|
+
# Main branch: publish to PyPI with clean version
|
|
64
|
+
if git describe --tags --abbrev=0 2>/dev/null; then
|
|
65
|
+
VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')
|
|
66
|
+
else
|
|
67
|
+
VERSION=$(grep '^version = ' pyproject.toml | cut -d'"' -f2)
|
|
68
|
+
fi
|
|
69
|
+
IS_RELEASE="false"
|
|
70
|
+
TARGET="pypi"
|
|
71
|
+
elif [[ "${{ github.ref }}" == refs/heads/develop/* ]]; then
|
|
72
|
+
# Develop branch: use dev version with timestamp only (PEP 440 compliant)
|
|
73
|
+
BASE_VERSION=$(grep '^version = ' pyproject.toml | cut -d'"' -f2)
|
|
74
|
+
VERSION="${BASE_VERSION}.dev$(date +%s)"
|
|
75
|
+
IS_RELEASE="false"
|
|
76
|
+
TARGET="testpypi"
|
|
77
|
+
else
|
|
78
|
+
VERSION="0.0.0.dev0"
|
|
79
|
+
IS_RELEASE="false"
|
|
80
|
+
TARGET="none"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
84
|
+
echo "is-release=${IS_RELEASE}" >> $GITHUB_OUTPUT
|
|
85
|
+
echo "target=${TARGET}" >> $GITHUB_OUTPUT
|
|
86
|
+
echo "::notice title=Release Info::Version: ${VERSION} | Release: ${IS_RELEASE} | Target: ${TARGET}"
|
|
87
|
+
|
|
88
|
+
test:
|
|
89
|
+
name: Test Python ${{ matrix.python-version }}
|
|
90
|
+
strategy:
|
|
91
|
+
fail-fast: false
|
|
92
|
+
matrix:
|
|
93
|
+
python-version: ['3.11', '3.12', '3.13', '3.14']
|
|
94
|
+
|
|
95
|
+
runs-on:
|
|
96
|
+
group: linux
|
|
97
|
+
labels: [self-hosted, Linux, X64]
|
|
98
|
+
|
|
99
|
+
# Cache directories scoped by Python version to prevent conflicts
|
|
100
|
+
env:
|
|
101
|
+
UV_CACHE_DIR: /opt/runner-cache/uv/${{ matrix.python-version }}
|
|
102
|
+
PIP_CACHE_DIR: /opt/runner-cache/pip/${{ matrix.python-version }}
|
|
103
|
+
|
|
104
|
+
steps:
|
|
105
|
+
- name: Pre-cleanup
|
|
106
|
+
run: |
|
|
107
|
+
docker image prune -f 2>/dev/null || true
|
|
108
|
+
shell: bash
|
|
109
|
+
|
|
110
|
+
- uses: actions/checkout@v6
|
|
111
|
+
with:
|
|
112
|
+
persist-credentials: false
|
|
113
|
+
|
|
114
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
115
|
+
uses: actions/setup-python@v6
|
|
116
|
+
with:
|
|
117
|
+
python-version: ${{ matrix.python-version }}
|
|
118
|
+
|
|
119
|
+
- name: Install uv
|
|
120
|
+
uses: astral-sh/setup-uv@v7
|
|
121
|
+
with:
|
|
122
|
+
version: "latest"
|
|
123
|
+
|
|
124
|
+
- name: Install dependencies
|
|
125
|
+
run: uv sync --all-extras
|
|
126
|
+
|
|
127
|
+
- name: Lint with ruff
|
|
128
|
+
run: uv run ruff check .
|
|
129
|
+
|
|
130
|
+
- name: Type check with mypy
|
|
131
|
+
run: uv run mypy --strict src/ --ignore-missing-imports
|
|
132
|
+
|
|
133
|
+
- name: Run pytest
|
|
134
|
+
run: uv run pytest -v --tb=short --cov=huitzo_cli --cov-report=xml
|
|
135
|
+
|
|
136
|
+
- name: Upload coverage
|
|
137
|
+
if: matrix.python-version == '3.14'
|
|
138
|
+
uses: codecov/codecov-action@v4
|
|
139
|
+
with:
|
|
140
|
+
files: ./coverage.xml
|
|
141
|
+
flags: unittests
|
|
142
|
+
name: CLI Python ${{ matrix.python-version }}
|
|
143
|
+
fail_ci_if_error: false
|
|
144
|
+
env:
|
|
145
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
146
|
+
|
|
147
|
+
- name: Post-cleanup
|
|
148
|
+
if: always()
|
|
149
|
+
run: |
|
|
150
|
+
docker image prune -f 2>/dev/null || true
|
|
151
|
+
|
|
152
|
+
build:
|
|
153
|
+
name: Build distribution 📦
|
|
154
|
+
needs:
|
|
155
|
+
- test
|
|
156
|
+
- detect-version
|
|
157
|
+
runs-on:
|
|
158
|
+
group: linux
|
|
159
|
+
labels: [self-hosted, Linux, X64]
|
|
160
|
+
|
|
161
|
+
env:
|
|
162
|
+
UV_CACHE_DIR: /opt/runner-cache/uv/3.14
|
|
163
|
+
PIP_CACHE_DIR: /opt/runner-cache/pip/3.14
|
|
164
|
+
|
|
165
|
+
steps:
|
|
166
|
+
- name: Pre-cleanup
|
|
167
|
+
run: |
|
|
168
|
+
docker image prune -f 2>/dev/null || true
|
|
169
|
+
|
|
170
|
+
- uses: actions/checkout@v6
|
|
171
|
+
with:
|
|
172
|
+
persist-credentials: false
|
|
173
|
+
|
|
174
|
+
- name: Set up Python
|
|
175
|
+
uses: actions/setup-python@v6
|
|
176
|
+
with:
|
|
177
|
+
python-version: '3.14'
|
|
178
|
+
|
|
179
|
+
- name: Install uv
|
|
180
|
+
uses: astral-sh/setup-uv@v7
|
|
181
|
+
with:
|
|
182
|
+
version: "latest"
|
|
183
|
+
|
|
184
|
+
- name: Update version in pyproject.toml
|
|
185
|
+
run: |
|
|
186
|
+
# Replace version in pyproject.toml (if not a release tag)
|
|
187
|
+
if [[ "${{ needs.detect-version.outputs.is-release }}" != "true" ]]; then
|
|
188
|
+
sed -i 's/^version = ".*/version = "${{ needs.detect-version.outputs.version }}"/' pyproject.toml
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
- name: Build distribution
|
|
192
|
+
run: uv build
|
|
193
|
+
|
|
194
|
+
- name: Store the distribution packages
|
|
195
|
+
uses: actions/upload-artifact@v5
|
|
196
|
+
with:
|
|
197
|
+
name: python-package-distributions
|
|
198
|
+
path: dist/
|
|
199
|
+
|
|
200
|
+
- name: Post-cleanup
|
|
201
|
+
if: always()
|
|
202
|
+
run: |
|
|
203
|
+
docker image prune -f 2>/dev/null || true
|
|
204
|
+
|
|
205
|
+
publish-to-testpypi:
|
|
206
|
+
name: Publish to TestPyPI 🧪
|
|
207
|
+
if: needs.detect-version.outputs.target == 'testpypi'
|
|
208
|
+
needs:
|
|
209
|
+
- build
|
|
210
|
+
- detect-version
|
|
211
|
+
runs-on:
|
|
212
|
+
group: linux
|
|
213
|
+
labels: [self-hosted, Linux, X64]
|
|
214
|
+
|
|
215
|
+
environment:
|
|
216
|
+
name: testpypi
|
|
217
|
+
url: https://test.pypi.org/p/huitzo-cli
|
|
218
|
+
|
|
219
|
+
permissions:
|
|
220
|
+
id-token: write # For trusted publishing
|
|
221
|
+
contents: write # For commit comments
|
|
222
|
+
actions: read # For workflow context
|
|
223
|
+
|
|
224
|
+
steps:
|
|
225
|
+
- name: Pre-cleanup
|
|
226
|
+
run: |
|
|
227
|
+
docker image prune -f 2>/dev/null || true
|
|
228
|
+
|
|
229
|
+
- name: Download all the dists
|
|
230
|
+
uses: actions/download-artifact@v6
|
|
231
|
+
with:
|
|
232
|
+
name: python-package-distributions
|
|
233
|
+
path: dist/
|
|
234
|
+
|
|
235
|
+
- name: Publish distribution to TestPyPI
|
|
236
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
237
|
+
with:
|
|
238
|
+
repository-url: https://test.pypi.org/legacy/
|
|
239
|
+
|
|
240
|
+
- name: Comment on commit
|
|
241
|
+
if: success()
|
|
242
|
+
uses: actions/github-script@v7
|
|
243
|
+
continue-on-error: true
|
|
244
|
+
with:
|
|
245
|
+
script: |
|
|
246
|
+
try {
|
|
247
|
+
await github.rest.repos.createCommitComment({
|
|
248
|
+
owner: context.repo.owner,
|
|
249
|
+
repo: context.repo.repo,
|
|
250
|
+
commit_sha: context.sha,
|
|
251
|
+
body: '✅ CLI Published to TestPyPI v${{ needs.detect-version.outputs.version }}\n\n[View Package](https://test.pypi.org/project/huitzo-cli/${{ needs.detect-version.outputs.version }})'
|
|
252
|
+
})
|
|
253
|
+
} catch (error) {
|
|
254
|
+
console.log('Unable to create commit comment:', error.message)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
publish-to-pypi:
|
|
258
|
+
name: Publish to PyPI 🚀
|
|
259
|
+
if: needs.detect-version.outputs.target == 'pypi'
|
|
260
|
+
needs:
|
|
261
|
+
- build
|
|
262
|
+
- detect-version
|
|
263
|
+
runs-on:
|
|
264
|
+
group: linux
|
|
265
|
+
labels: [self-hosted, Linux, X64]
|
|
266
|
+
|
|
267
|
+
environment:
|
|
268
|
+
name: pypi
|
|
269
|
+
url: https://pypi.org/p/huitzo-cli
|
|
270
|
+
|
|
271
|
+
permissions:
|
|
272
|
+
id-token: write # For trusted publishing
|
|
273
|
+
contents: write # For commit comments
|
|
274
|
+
actions: read # For workflow context
|
|
275
|
+
|
|
276
|
+
steps:
|
|
277
|
+
- name: Pre-cleanup
|
|
278
|
+
run: |
|
|
279
|
+
docker image prune -f 2>/dev/null || true
|
|
280
|
+
|
|
281
|
+
- name: Download all the dists
|
|
282
|
+
uses: actions/download-artifact@v6
|
|
283
|
+
with:
|
|
284
|
+
name: python-package-distributions
|
|
285
|
+
path: dist/
|
|
286
|
+
|
|
287
|
+
- name: Publish distribution to PyPI
|
|
288
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
289
|
+
|
|
290
|
+
publish-release-notes:
|
|
291
|
+
name: Create GitHub Release
|
|
292
|
+
if: needs.detect-version.outputs.target == 'pypi' && needs.detect-version.outputs.is-release == 'true'
|
|
293
|
+
needs:
|
|
294
|
+
- publish-to-pypi
|
|
295
|
+
- detect-version
|
|
296
|
+
runs-on:
|
|
297
|
+
group: linux
|
|
298
|
+
labels: [self-hosted, Linux, X64]
|
|
299
|
+
|
|
300
|
+
permissions:
|
|
301
|
+
contents: write
|
|
302
|
+
|
|
303
|
+
steps:
|
|
304
|
+
- name: Pre-cleanup
|
|
305
|
+
run: |
|
|
306
|
+
docker image prune -f 2>/dev/null || true
|
|
307
|
+
|
|
308
|
+
- uses: actions/checkout@v6
|
|
309
|
+
with:
|
|
310
|
+
fetch-depth: 0
|
|
311
|
+
|
|
312
|
+
- name: Generate changelog
|
|
313
|
+
id: changelog
|
|
314
|
+
run: |
|
|
315
|
+
TAG="${{ github.ref_name }}"
|
|
316
|
+
PREV_TAG=$(git describe --tags --abbrev=0 ${TAG}^ 2>/dev/null || echo "")
|
|
317
|
+
if [ -z "$PREV_TAG" ]; then
|
|
318
|
+
CHANGELOG=$(git log --pretty=format:"- %s" | head -20)
|
|
319
|
+
else
|
|
320
|
+
CHANGELOG=$(git log ${PREV_TAG}..${TAG} --pretty=format:"- %s")
|
|
321
|
+
fi
|
|
322
|
+
echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT
|
|
323
|
+
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
|
324
|
+
echo "EOF" >> $GITHUB_OUTPUT
|
|
325
|
+
|
|
326
|
+
- name: Create Release
|
|
327
|
+
uses: softprops/action-gh-release@v1
|
|
328
|
+
with:
|
|
329
|
+
body: |
|
|
330
|
+
## CLI Changes in ${{ needs.detect-version.outputs.version }}
|
|
331
|
+
|
|
332
|
+
${{ steps.changelog.outputs.CHANGELOG }}
|
|
333
|
+
|
|
334
|
+
Published to [PyPI](https://pypi.org/project/huitzo-cli/${{ needs.detect-version.outputs.version }})
|
|
335
|
+
draft: false
|
|
336
|
+
prerelease: false
|
|
337
|
+
env:
|
|
338
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# CLI CI Workflow
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Implements:
|
|
5
|
+
# - docs/architecture/ci-cd.md#workflows
|
|
6
|
+
# - docs/architecture/ci-cd.md#self-hosted-runners
|
|
7
|
+
#
|
|
8
|
+
# Jobs:
|
|
9
|
+
# - test: Cross-platform unit tests (3.11-3.14 all on self-hosted Linux)
|
|
10
|
+
# - lint: Lint and type checking
|
|
11
|
+
# - build: Build package
|
|
12
|
+
# - ci-success: Summary job
|
|
13
|
+
#
|
|
14
|
+
# Self-Hosted Runners:
|
|
15
|
+
# - linux: All Python versions and builds
|
|
16
|
+
# =============================================================================
|
|
17
|
+
|
|
18
|
+
name: CLI CI
|
|
19
|
+
|
|
20
|
+
on:
|
|
21
|
+
push:
|
|
22
|
+
branches: [main, develop]
|
|
23
|
+
pull_request:
|
|
24
|
+
branches: [main, develop]
|
|
25
|
+
|
|
26
|
+
permissions:
|
|
27
|
+
contents: read
|
|
28
|
+
|
|
29
|
+
concurrency:
|
|
30
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
31
|
+
cancel-in-progress: true
|
|
32
|
+
|
|
33
|
+
jobs:
|
|
34
|
+
test:
|
|
35
|
+
name: Test Python ${{ matrix.python-version }}
|
|
36
|
+
runs-on:
|
|
37
|
+
group: linux
|
|
38
|
+
labels: [self-hosted, Linux, X64]
|
|
39
|
+
strategy:
|
|
40
|
+
fail-fast: false
|
|
41
|
+
matrix:
|
|
42
|
+
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
43
|
+
|
|
44
|
+
# Cache directories scoped by Python version to prevent conflicts
|
|
45
|
+
env:
|
|
46
|
+
UV_CACHE_DIR: /opt/runner-cache/uv/${{ matrix.python-version }}
|
|
47
|
+
PIP_CACHE_DIR: /opt/runner-cache/pip/${{ matrix.python-version }}
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- name: Pre-cleanup
|
|
51
|
+
run: |
|
|
52
|
+
docker image prune -f 2>/dev/null || true
|
|
53
|
+
- uses: actions/checkout@v6
|
|
54
|
+
|
|
55
|
+
- uses: astral-sh/setup-uv@v7
|
|
56
|
+
with:
|
|
57
|
+
python-version: ${{ matrix.python-version }}
|
|
58
|
+
|
|
59
|
+
- name: Install dependencies
|
|
60
|
+
run: uv sync --all-extras
|
|
61
|
+
|
|
62
|
+
- name: Run tests
|
|
63
|
+
run: uv run pytest tests/ -v --cov=src/huitzo_cli --cov-report=xml
|
|
64
|
+
|
|
65
|
+
- name: Upload coverage
|
|
66
|
+
if: matrix.python-version == '3.14'
|
|
67
|
+
uses: actions/upload-artifact@v6
|
|
68
|
+
with:
|
|
69
|
+
name: coverage-report
|
|
70
|
+
path: coverage.xml
|
|
71
|
+
retention-days: 30
|
|
72
|
+
env:
|
|
73
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
74
|
+
|
|
75
|
+
- name: Post-cleanup
|
|
76
|
+
if: always()
|
|
77
|
+
run: |
|
|
78
|
+
docker image prune -f 2>/dev/null || true
|
|
79
|
+
|
|
80
|
+
lint:
|
|
81
|
+
name: Lint & Type Check
|
|
82
|
+
runs-on:
|
|
83
|
+
group: linux
|
|
84
|
+
labels: [self-hosted, Linux, X64]
|
|
85
|
+
|
|
86
|
+
env:
|
|
87
|
+
UV_CACHE_DIR: /opt/runner-cache/uv/3.14
|
|
88
|
+
PIP_CACHE_DIR: /opt/runner-cache/pip/3.14
|
|
89
|
+
|
|
90
|
+
steps:
|
|
91
|
+
- name: Pre-cleanup
|
|
92
|
+
run: |
|
|
93
|
+
docker image prune -f 2>/dev/null || true
|
|
94
|
+
- uses: actions/checkout@v6
|
|
95
|
+
|
|
96
|
+
- uses: astral-sh/setup-uv@v7
|
|
97
|
+
with:
|
|
98
|
+
python-version: "3.14"
|
|
99
|
+
|
|
100
|
+
- name: Install dependencies
|
|
101
|
+
run: uv sync --all-extras
|
|
102
|
+
|
|
103
|
+
- name: Ruff check
|
|
104
|
+
run: uv run ruff check .
|
|
105
|
+
|
|
106
|
+
- name: Ruff format check
|
|
107
|
+
run: uv run ruff format --check .
|
|
108
|
+
|
|
109
|
+
- name: Mypy strict
|
|
110
|
+
run: uv run mypy src/ --strict --ignore-missing-imports
|
|
111
|
+
|
|
112
|
+
- name: Post-cleanup
|
|
113
|
+
if: always()
|
|
114
|
+
run: |
|
|
115
|
+
docker image prune -f 2>/dev/null || true
|
|
116
|
+
|
|
117
|
+
build:
|
|
118
|
+
name: Build Package
|
|
119
|
+
runs-on:
|
|
120
|
+
group: linux
|
|
121
|
+
labels: [self-hosted, Linux, X64]
|
|
122
|
+
needs: [test, lint]
|
|
123
|
+
|
|
124
|
+
env:
|
|
125
|
+
UV_CACHE_DIR: /opt/runner-cache/uv/3.14
|
|
126
|
+
PIP_CACHE_DIR: /opt/runner-cache/pip/3.14
|
|
127
|
+
|
|
128
|
+
steps:
|
|
129
|
+
- name: Pre-cleanup
|
|
130
|
+
run: |
|
|
131
|
+
docker image prune -f 2>/dev/null || true
|
|
132
|
+
- uses: actions/checkout@v6
|
|
133
|
+
|
|
134
|
+
- uses: astral-sh/setup-uv@v7
|
|
135
|
+
with:
|
|
136
|
+
python-version: "3.14"
|
|
137
|
+
|
|
138
|
+
- name: Build
|
|
139
|
+
run: uv build
|
|
140
|
+
|
|
141
|
+
- name: Upload dist
|
|
142
|
+
uses: actions/upload-artifact@v6
|
|
143
|
+
with:
|
|
144
|
+
name: dist
|
|
145
|
+
path: dist/
|
|
146
|
+
retention-days: 30
|
|
147
|
+
|
|
148
|
+
- name: Post-cleanup
|
|
149
|
+
if: always()
|
|
150
|
+
run: |
|
|
151
|
+
docker image prune -f 2>/dev/null || true
|
|
152
|
+
|
|
153
|
+
ci-success:
|
|
154
|
+
name: CI Success
|
|
155
|
+
runs-on:
|
|
156
|
+
group: linux
|
|
157
|
+
labels: [self-hosted, Linux, X64]
|
|
158
|
+
needs: [test, lint, build]
|
|
159
|
+
if: always()
|
|
160
|
+
steps:
|
|
161
|
+
- name: Check results
|
|
162
|
+
run: |
|
|
163
|
+
if [[ "${{ needs.test.result }}" != "success" || "${{ needs.lint.result }}" != "success" || "${{ needs.build.result }}" != "success" ]]; then
|
|
164
|
+
echo "CI failed"
|
|
165
|
+
exit 1
|
|
166
|
+
fi
|
|
167
|
+
echo "All checks passed"
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
pip-wheel-metadata/
|
|
24
|
+
share/python-wheels/
|
|
25
|
+
*.egg-info/
|
|
26
|
+
.installed.cfg
|
|
27
|
+
*.egg
|
|
28
|
+
MANIFEST
|
|
29
|
+
|
|
30
|
+
# PyInstaller
|
|
31
|
+
*.manifest
|
|
32
|
+
*.spec
|
|
33
|
+
|
|
34
|
+
# Installer logs
|
|
35
|
+
pip-log.txt
|
|
36
|
+
pip-delete-this-directory.txt
|
|
37
|
+
|
|
38
|
+
# Unit test / coverage reports
|
|
39
|
+
htmlcov/
|
|
40
|
+
.tox/
|
|
41
|
+
.nox/
|
|
42
|
+
.coverage
|
|
43
|
+
.coverage.*
|
|
44
|
+
.cache
|
|
45
|
+
nosetests.xml
|
|
46
|
+
coverage.xml
|
|
47
|
+
*.cover
|
|
48
|
+
*.py,cover
|
|
49
|
+
.hypothesis/
|
|
50
|
+
.pytest_cache/
|
|
51
|
+
|
|
52
|
+
# Translations
|
|
53
|
+
*.mo
|
|
54
|
+
*.pot
|
|
55
|
+
|
|
56
|
+
# Django stuff:
|
|
57
|
+
*.log
|
|
58
|
+
local_settings.py
|
|
59
|
+
db.sqlite3
|
|
60
|
+
db.sqlite3-journal
|
|
61
|
+
|
|
62
|
+
# Flask stuff:
|
|
63
|
+
instance/
|
|
64
|
+
.webassets-cache
|
|
65
|
+
|
|
66
|
+
# Scrapy stuff:
|
|
67
|
+
.scrapy
|
|
68
|
+
|
|
69
|
+
# Sphinx documentation
|
|
70
|
+
docs/_build/
|
|
71
|
+
|
|
72
|
+
# PyBuilder
|
|
73
|
+
target/
|
|
74
|
+
|
|
75
|
+
# Jupyter Notebook
|
|
76
|
+
.ipynb_checkpoints
|
|
77
|
+
|
|
78
|
+
# IPython
|
|
79
|
+
profile_default/
|
|
80
|
+
ipython_config.py
|
|
81
|
+
|
|
82
|
+
# pyenv
|
|
83
|
+
.python-version
|
|
84
|
+
|
|
85
|
+
# pipenv
|
|
86
|
+
Pipfile.lock
|
|
87
|
+
|
|
88
|
+
# PEP 582
|
|
89
|
+
__pypackages__/
|
|
90
|
+
|
|
91
|
+
# Celery stuff
|
|
92
|
+
celerybeat-schedule
|
|
93
|
+
celerybeat.pid
|
|
94
|
+
|
|
95
|
+
# SageMath parsed files
|
|
96
|
+
*.sage.py
|
|
97
|
+
|
|
98
|
+
# Environments
|
|
99
|
+
.env
|
|
100
|
+
.venv
|
|
101
|
+
env/
|
|
102
|
+
venv/
|
|
103
|
+
ENV/
|
|
104
|
+
env.bak/
|
|
105
|
+
venv.bak/
|
|
106
|
+
|
|
107
|
+
# Spyder project settings
|
|
108
|
+
.spyderproject
|
|
109
|
+
.spyproject
|
|
110
|
+
|
|
111
|
+
# Rope project settings
|
|
112
|
+
.ropeproject
|
|
113
|
+
|
|
114
|
+
# mkdocs documentation
|
|
115
|
+
/site
|
|
116
|
+
|
|
117
|
+
# mypy
|
|
118
|
+
.mypy_cache/
|
|
119
|
+
.dmypy.json
|
|
120
|
+
dmypy.json
|
|
121
|
+
|
|
122
|
+
# Pyre type checker
|
|
123
|
+
.pyre/
|
|
124
|
+
|
|
125
|
+
# IDE
|
|
126
|
+
.vscode/
|
|
127
|
+
.idea/
|
|
128
|
+
*.swp
|
|
129
|
+
*.swo
|
|
130
|
+
*~
|
|
131
|
+
|
|
132
|
+
# OS
|
|
133
|
+
.DS_Store
|
|
134
|
+
Thumbs.db
|
|
135
|
+
|
|
136
|
+
# Local development
|
|
137
|
+
.huitzo/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: huitzo-cli
|
|
3
|
+
Version: 0.0.0
|
|
4
|
+
Summary: Huitzo CLI for developers building Intelligence Packs
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Requires-Dist: httpx>=0.28
|
|
7
|
+
Requires-Dist: jinja2>=3.1
|
|
8
|
+
Requires-Dist: pydantic>=2.12
|
|
9
|
+
Requires-Dist: pyyaml>=6.0
|
|
10
|
+
Requires-Dist: rich>=14.0
|
|
11
|
+
Requires-Dist: typer>=0.15
|
|
12
|
+
Requires-Dist: websockets>=14.0
|
|
13
|
+
Provides-Extra: dev
|
|
14
|
+
Requires-Dist: mypy>=1.19; extra == 'dev'
|
|
15
|
+
Requires-Dist: pytest-asyncio>=1.0; extra == 'dev'
|
|
16
|
+
Requires-Dist: pytest-cov>=7.0; extra == 'dev'
|
|
17
|
+
Requires-Dist: pytest>=9.0; extra == 'dev'
|
|
18
|
+
Requires-Dist: ruff>=0.14; extra == 'dev'
|
|
19
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|