stackhelx 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.
- stackhelx-1.0.0/.github/workflows/ci.yml +55 -0
- stackhelx-1.0.0/.github/workflows/release.yml +52 -0
- stackhelx-1.0.0/.gitignore +13 -0
- stackhelx-1.0.0/AGENTS.md +5 -0
- stackhelx-1.0.0/CHANGELOG.md +555 -0
- stackhelx-1.0.0/CLAUDE.md +228 -0
- stackhelx-1.0.0/LICENSE +21 -0
- stackhelx-1.0.0/PKG-INFO +323 -0
- stackhelx-1.0.0/README.md +264 -0
- stackhelx-1.0.0/docs/comandos.md +273 -0
- stackhelx-1.0.0/docs/deteccion.md +119 -0
- stackhelx-1.0.0/docs/interfaz.md +87 -0
- stackhelx-1.0.0/docs/pendientes.md +117 -0
- stackhelx-1.0.0/docs/plan-expansion.md +97 -0
- stackhelx-1.0.0/docs/plan-lenguajes.md +388 -0
- stackhelx-1.0.0/docs/plan-siguiente.md +323 -0
- stackhelx-1.0.0/docs/stack-yaml.md +218 -0
- stackhelx-1.0.0/docs/superpowers/plans/2026-08-08-partir-readme.md +377 -0
- stackhelx-1.0.0/docs/superpowers/plans/2026-08-08-release-1-0-1.md +378 -0
- stackhelx-1.0.0/docs/superpowers/plans/2026-08-18-campo-url.md +222 -0
- stackhelx-1.0.0/docs/superpowers/specs/2026-07-29-autodeteccion-design.md +70 -0
- stackhelx-1.0.0/pyproject.toml +86 -0
- stackhelx-1.0.0/scripts/check_docs.py +62 -0
- stackhelx-1.0.0/scripts/check_metadata.py +61 -0
- stackhelx-1.0.0/stack.example.yaml +76 -0
- stackhelx-1.0.0/stackhelx/__init__.py +2 -0
- stackhelx-1.0.0/stackhelx/__main__.py +4 -0
- stackhelx-1.0.0/stackhelx/browse.py +160 -0
- stackhelx-1.0.0/stackhelx/cli.py +1165 -0
- stackhelx-1.0.0/stackhelx/config.py +448 -0
- stackhelx-1.0.0/stackhelx/detect.py +1053 -0
- stackhelx-1.0.0/stackhelx/docker.py +202 -0
- stackhelx-1.0.0/stackhelx/doctor.py +356 -0
- stackhelx-1.0.0/stackhelx/guardrails.py +42 -0
- stackhelx-1.0.0/stackhelx/history.py +86 -0
- stackhelx-1.0.0/stackhelx/mcp.py +467 -0
- stackhelx-1.0.0/stackhelx/ports.py +392 -0
- stackhelx-1.0.0/stackhelx/registry.py +356 -0
- stackhelx-1.0.0/stackhelx/runner.py +877 -0
- stackhelx-1.0.0/stackhelx/scripts.py +123 -0
- stackhelx-1.0.0/stackhelx/server.py +1786 -0
- stackhelx-1.0.0/stackhelx/tunnel.py +207 -0
- stackhelx-1.0.0/stackhelx/web/app.css +1729 -0
- stackhelx-1.0.0/stackhelx/web/app.js +2425 -0
- stackhelx-1.0.0/stackhelx/web/index.html +378 -0
- stackhelx-1.0.0/stackhelx/web/tokens.css +104 -0
- stackhelx-1.0.0/tests/conftest.py +99 -0
- stackhelx-1.0.0/tests/test_browse.py +126 -0
- stackhelx-1.0.0/tests/test_cli.py +994 -0
- stackhelx-1.0.0/tests/test_config.py +400 -0
- stackhelx-1.0.0/tests/test_conftest.py +83 -0
- stackhelx-1.0.0/tests/test_detect.py +1339 -0
- stackhelx-1.0.0/tests/test_guardrails.py +23 -0
- stackhelx-1.0.0/tests/test_history.py +79 -0
- stackhelx-1.0.0/tests/test_mcp.py +468 -0
- stackhelx-1.0.0/tests/test_ports.py +251 -0
- stackhelx-1.0.0/tests/test_registry.py +100 -0
- stackhelx-1.0.0/tests/test_runner.py +1273 -0
- stackhelx-1.0.0/tests/test_scripts.py +196 -0
- stackhelx-1.0.0/tests/test_server.py +2280 -0
- stackhelx-1.0.0/tests/test_tunnel.py +325 -0
- stackhelx-1.0.0/uv.lock +634 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
|
|
3
|
+
# Por push y no por pull_request. El evento de PR dejo de producir runs en este
|
|
4
|
+
# repo el 6 de agosto: ni el push de un agente a una rama con PR abierto ni un
|
|
5
|
+
# PR nuevo dispararon nada, con Actions habilitado y el workflow activo. Por
|
|
6
|
+
# push cada rama corre sus tests igual, el PR muestra el check de su rama, y no
|
|
7
|
+
# hay dos runs por commit como pasaria dejando los dos eventos.
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
# Empujar tres veces seguidas cancela las corridas viejas en vez de encolar tres
|
|
13
|
+
# matrices de cuatro cuadros.
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
lint:
|
|
20
|
+
# Uno solo: ruff lee el codigo, no el sistema operativo. Repetirlo en los
|
|
21
|
+
# cuatro cuadros de la matriz no dice nada nuevo.
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.13"
|
|
28
|
+
- run: pip install ruff
|
|
29
|
+
- run: ruff check stackhelx tests
|
|
30
|
+
|
|
31
|
+
test:
|
|
32
|
+
# El modulo de puertos habla directo con el SO y los tres sistemas divergen:
|
|
33
|
+
# SO_REUSEADDR en Windows, tabla de conexiones sin root en macOS. Correr en
|
|
34
|
+
# uno solo no prueba nada.
|
|
35
|
+
runs-on: ${{ matrix.os }}
|
|
36
|
+
strategy:
|
|
37
|
+
fail-fast: false
|
|
38
|
+
matrix:
|
|
39
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
40
|
+
python: ["3.13"]
|
|
41
|
+
include:
|
|
42
|
+
- os: ubuntu-latest
|
|
43
|
+
python: "3.10"
|
|
44
|
+
- os: ubuntu-latest
|
|
45
|
+
python: "3.11"
|
|
46
|
+
- os: ubuntu-latest
|
|
47
|
+
python: "3.12"
|
|
48
|
+
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v4
|
|
51
|
+
- uses: actions/setup-python@v5
|
|
52
|
+
with:
|
|
53
|
+
python-version: ${{ matrix.python }}
|
|
54
|
+
- run: pip install -e ".[dev]"
|
|
55
|
+
- run: pytest -q -n auto
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
|
|
3
|
+
# Se dispara con el tag, no con el push a main: publicar es irreversible en PyPI
|
|
4
|
+
# (un numero de version no se puede reusar ni despues de borrarlo) y merecer un
|
|
5
|
+
# gesto explicito.
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: "3.13"
|
|
18
|
+
|
|
19
|
+
# El numero sale de portmaster/__init__.py, que es la unica fuente. Si el
|
|
20
|
+
# tag no coincide, se corta antes de publicar: un v1.0.1 que sube un
|
|
21
|
+
# paquete que se llama 1.0.0 no se puede deshacer.
|
|
22
|
+
- name: El tag tiene que coincidir con la version del paquete
|
|
23
|
+
run: |
|
|
24
|
+
tag="${GITHUB_REF_NAME#v}"
|
|
25
|
+
pkg=$(python -c "import re,pathlib; print(re.search(r'\"(.+)\"', pathlib.Path('stackhelx/__init__.py').read_text()).group(1))")
|
|
26
|
+
echo "tag=$tag paquete=$pkg"
|
|
27
|
+
[ "$tag" = "$pkg" ]
|
|
28
|
+
|
|
29
|
+
- run: pip install build
|
|
30
|
+
- run: python -m build
|
|
31
|
+
- uses: actions/upload-artifact@v4
|
|
32
|
+
with:
|
|
33
|
+
name: dist
|
|
34
|
+
path: dist/
|
|
35
|
+
|
|
36
|
+
publish:
|
|
37
|
+
needs: build
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
# El entorno permite exigir aprobacion manual desde la configuracion del
|
|
40
|
+
# repo antes de que corra este job.
|
|
41
|
+
environment: pypi
|
|
42
|
+
permissions:
|
|
43
|
+
# Trusted publishing: PyPI verifica este token de OIDC contra el publisher
|
|
44
|
+
# configurado para el repo. Sin API token en secrets, que es un secreto de
|
|
45
|
+
# larga vida que no caduca si se filtra.
|
|
46
|
+
id-token: write
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/download-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: dist
|
|
51
|
+
path: dist/
|
|
52
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|