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.
Files changed (62) hide show
  1. stackhelx-1.0.0/.github/workflows/ci.yml +55 -0
  2. stackhelx-1.0.0/.github/workflows/release.yml +52 -0
  3. stackhelx-1.0.0/.gitignore +13 -0
  4. stackhelx-1.0.0/AGENTS.md +5 -0
  5. stackhelx-1.0.0/CHANGELOG.md +555 -0
  6. stackhelx-1.0.0/CLAUDE.md +228 -0
  7. stackhelx-1.0.0/LICENSE +21 -0
  8. stackhelx-1.0.0/PKG-INFO +323 -0
  9. stackhelx-1.0.0/README.md +264 -0
  10. stackhelx-1.0.0/docs/comandos.md +273 -0
  11. stackhelx-1.0.0/docs/deteccion.md +119 -0
  12. stackhelx-1.0.0/docs/interfaz.md +87 -0
  13. stackhelx-1.0.0/docs/pendientes.md +117 -0
  14. stackhelx-1.0.0/docs/plan-expansion.md +97 -0
  15. stackhelx-1.0.0/docs/plan-lenguajes.md +388 -0
  16. stackhelx-1.0.0/docs/plan-siguiente.md +323 -0
  17. stackhelx-1.0.0/docs/stack-yaml.md +218 -0
  18. stackhelx-1.0.0/docs/superpowers/plans/2026-08-08-partir-readme.md +377 -0
  19. stackhelx-1.0.0/docs/superpowers/plans/2026-08-08-release-1-0-1.md +378 -0
  20. stackhelx-1.0.0/docs/superpowers/plans/2026-08-18-campo-url.md +222 -0
  21. stackhelx-1.0.0/docs/superpowers/specs/2026-07-29-autodeteccion-design.md +70 -0
  22. stackhelx-1.0.0/pyproject.toml +86 -0
  23. stackhelx-1.0.0/scripts/check_docs.py +62 -0
  24. stackhelx-1.0.0/scripts/check_metadata.py +61 -0
  25. stackhelx-1.0.0/stack.example.yaml +76 -0
  26. stackhelx-1.0.0/stackhelx/__init__.py +2 -0
  27. stackhelx-1.0.0/stackhelx/__main__.py +4 -0
  28. stackhelx-1.0.0/stackhelx/browse.py +160 -0
  29. stackhelx-1.0.0/stackhelx/cli.py +1165 -0
  30. stackhelx-1.0.0/stackhelx/config.py +448 -0
  31. stackhelx-1.0.0/stackhelx/detect.py +1053 -0
  32. stackhelx-1.0.0/stackhelx/docker.py +202 -0
  33. stackhelx-1.0.0/stackhelx/doctor.py +356 -0
  34. stackhelx-1.0.0/stackhelx/guardrails.py +42 -0
  35. stackhelx-1.0.0/stackhelx/history.py +86 -0
  36. stackhelx-1.0.0/stackhelx/mcp.py +467 -0
  37. stackhelx-1.0.0/stackhelx/ports.py +392 -0
  38. stackhelx-1.0.0/stackhelx/registry.py +356 -0
  39. stackhelx-1.0.0/stackhelx/runner.py +877 -0
  40. stackhelx-1.0.0/stackhelx/scripts.py +123 -0
  41. stackhelx-1.0.0/stackhelx/server.py +1786 -0
  42. stackhelx-1.0.0/stackhelx/tunnel.py +207 -0
  43. stackhelx-1.0.0/stackhelx/web/app.css +1729 -0
  44. stackhelx-1.0.0/stackhelx/web/app.js +2425 -0
  45. stackhelx-1.0.0/stackhelx/web/index.html +378 -0
  46. stackhelx-1.0.0/stackhelx/web/tokens.css +104 -0
  47. stackhelx-1.0.0/tests/conftest.py +99 -0
  48. stackhelx-1.0.0/tests/test_browse.py +126 -0
  49. stackhelx-1.0.0/tests/test_cli.py +994 -0
  50. stackhelx-1.0.0/tests/test_config.py +400 -0
  51. stackhelx-1.0.0/tests/test_conftest.py +83 -0
  52. stackhelx-1.0.0/tests/test_detect.py +1339 -0
  53. stackhelx-1.0.0/tests/test_guardrails.py +23 -0
  54. stackhelx-1.0.0/tests/test_history.py +79 -0
  55. stackhelx-1.0.0/tests/test_mcp.py +468 -0
  56. stackhelx-1.0.0/tests/test_ports.py +251 -0
  57. stackhelx-1.0.0/tests/test_registry.py +100 -0
  58. stackhelx-1.0.0/tests/test_runner.py +1273 -0
  59. stackhelx-1.0.0/tests/test_scripts.py +196 -0
  60. stackhelx-1.0.0/tests/test_server.py +2280 -0
  61. stackhelx-1.0.0/tests/test_tunnel.py +325 -0
  62. 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
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ venv/
8
+ .pytest_cache/
9
+ .env
10
+ .gstack/
11
+ # Grafo de codigo, 4 MB generados. Se rehace con `graphify update .`
12
+ graphify-out/
13
+ scratch/
@@ -0,0 +1,5 @@
1
+ Las instrucciones del proyecto viven en [CLAUDE.md](CLAUDE.md).
2
+
3
+ Este archivo existe para los agentes que buscan `AGENTS.md` por convención. Era
4
+ una copia byte a byte de `CLAUDE.md`, y dos copias del mismo contrato divergen
5
+ en el primer cambio.