mlx-stack 0.3.3__tar.gz → 0.3.4__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.
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/ci.yml +28 -0
- mlx_stack-0.3.4/.github/workflows/integration-nightly.yml +58 -0
- mlx_stack-0.3.4/.github/workflows/integration-prerelease.yml +53 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.gitignore +1 -0
- mlx_stack-0.3.4/.release-please-manifest.json +3 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CHANGELOG.md +7 -0
- mlx_stack-0.3.4/Makefile +36 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/PKG-INFO +1 -1
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/pyproject.toml +4 -1
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/_version.py +2 -2
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/main.py +3 -0
- mlx_stack-0.3.4/src/mlx_stack/cli/setup.py +522 -0
- mlx_stack-0.3.4/src/mlx_stack/core/discovery.py +390 -0
- mlx_stack-0.3.4/src/mlx_stack/core/onboarding.py +458 -0
- mlx_stack-0.3.4/src/mlx_stack/data/benchmark_data.json +1594 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/deepseek-r1-32b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/nemotron-49b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/nemotron-8b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-14b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-32b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-3b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-72b.yaml +1 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-8b.yaml +1 -0
- mlx_stack-0.3.4/tests/integration/conftest.py +530 -0
- mlx_stack-0.3.4/tests/integration/report.py +99 -0
- mlx_stack-0.3.4/tests/integration/test_catalog_validation.py +229 -0
- mlx_stack-0.3.4/tests/integration/test_harness_compatibility.py +239 -0
- mlx_stack-0.3.4/tests/integration/test_model_smoke.py +393 -0
- mlx_stack-0.3.4/tests/integration/test_stack_integration.py +346 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_catalog.py +7 -3
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_pull.py +5 -6
- mlx_stack-0.3.4/tests/unit/test_cli_setup.py +184 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_status.py +0 -31
- mlx_stack-0.3.4/tests/unit/test_discovery.py +324 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_launchd.py +2 -13
- mlx_stack-0.3.4/tests/unit/test_onboarding.py +374 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_watchdog.py +3 -6
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/uv.lock +1 -1
- mlx_stack-0.3.3/.release-please-manifest.json +0 -3
- mlx_stack-0.3.3/Makefile +0 -20
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/init.sh +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/architecture.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/environment.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/user-testing.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/services.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/settings.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/skills/cli-feature/SKILL.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/configuration-management.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/dependency-management.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-catalog-errors-and-families.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-deps-binary-and-ansi.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-scaffolding-data-home.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/hardware-detection.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/model-catalog.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/project-scaffolding.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-config-basic.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-config-deps.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-profile-catalog.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-setup-profile-core.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/down-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-preflight-and-readonly.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-process-robustness.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-typecheck.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/process-management.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/status-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/up-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g1-deps-up-basics.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g2-up-startup.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g3-up-resilience.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g4-down.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g5-status.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g6-cross.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r2-g1-fixes.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r2-g2-cross-blockers.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/reviews/fix-cross-area-test-rigor.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/reviews/misc-cross-area-validation.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/flows/r1-g1-cross-flows.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/flows/r2-g4-cross-port5050.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-lint-errors.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-scrutiny-issues.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-typecheck-errors.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/launchd-integration.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/log-rotation.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/logs-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/ops-cross-area-validation.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/watchdog-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g1-log.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g2-logs-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g3-watch.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g4-launchd.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g5-cross-ops.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/community-docs.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/developing-guide.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/fix-public-ready-scrutiny.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/github-actions-ci.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/readme-rewrite.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-init-and-models-issues.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-recommendation-scoring-issues.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-scoring-lint.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/init-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/models-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/recommend-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/scoring-engine.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g1-recommend-budget-ranking.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g2-recommend-output-integration.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g3-init-core-routing.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g4-init-cloud-overwrite.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g5-init-hardware-summary.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g6-models-local.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g7-models-catalog.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g1-recommend.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g2-models-catalog-filters.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g3-cross-012.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/bench-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/fix-tooling-scrutiny-issues.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/pull-command.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g1-pull-core.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g2-pull-errors.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g3-bench-core.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g4-bench-advanced.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r2-g1-pull.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r2-g2-bench.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r3-g1-pull.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r3-g2-bench.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r4-g1-bench.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round1.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round2.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round3.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/release.yml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/publish.yml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/release-please.yml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CODE_OF_CONDUCT.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CONTRIBUTING.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/DEVELOPING.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/LICENSE +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/README.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/SECURITY.md +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/release-please-config.json +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/bench.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/config.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/down.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/init.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/install.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/logs.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/models.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/profile.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/pull.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/recommend.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/status.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/up.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/watch.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/benchmark.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/catalog.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/config.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/deps.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/hardware.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/launchd.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/litellm_gen.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/log_rotation.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/log_viewer.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/models.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/paths.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/process.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/pull.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/scoring.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_down.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_init.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_status.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_up.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/watchdog.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/deepseek-r1-8b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-12b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-27b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-4b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/llama3.3-8b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3-8b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-0.8b.yaml +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/py.typed +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/utils/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/conftest.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/test_inference_e2e.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/test_launchd_e2e.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/__init__.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_benchmark.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_bench.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_config.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_down.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_init.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_install.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_logs.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_models.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_profile.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_recommend.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_up.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_watch.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_config.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cross_area.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_data_dir.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_deps.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_hardware.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_lifecycle_fixes.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_litellm_gen.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_log_rotation.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_log_viewer.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_models.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_ops_cross_area.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_paths.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_process.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_robustness_fixes.py +0 -0
- {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_scoring.py +0 -0
|
@@ -49,3 +49,31 @@ jobs:
|
|
|
49
49
|
with:
|
|
50
50
|
name: coverage-report
|
|
51
51
|
path: coverage.xml
|
|
52
|
+
|
|
53
|
+
catalog-validation:
|
|
54
|
+
name: Catalog Validation
|
|
55
|
+
runs-on: macos-latest
|
|
56
|
+
needs: ci
|
|
57
|
+
strategy:
|
|
58
|
+
matrix:
|
|
59
|
+
python-version: ["3.13"]
|
|
60
|
+
|
|
61
|
+
steps:
|
|
62
|
+
- name: Checkout code
|
|
63
|
+
uses: actions/checkout@v6
|
|
64
|
+
with:
|
|
65
|
+
fetch-depth: 0
|
|
66
|
+
|
|
67
|
+
- name: Install uv
|
|
68
|
+
uses: astral-sh/setup-uv@v7
|
|
69
|
+
with:
|
|
70
|
+
enable-cache: true
|
|
71
|
+
|
|
72
|
+
- name: Install Python ${{ matrix.python-version }}
|
|
73
|
+
run: uv python install ${{ matrix.python-version }}
|
|
74
|
+
|
|
75
|
+
- name: Install dependencies
|
|
76
|
+
run: make install
|
|
77
|
+
|
|
78
|
+
- name: Validate catalog entries
|
|
79
|
+
run: make test-catalog
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Nightly Integration
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 6 * * *" # 6 AM UTC daily
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
model:
|
|
9
|
+
description: "Specific model ID to test (blank = all non-gated models that fit in memory)"
|
|
10
|
+
required: false
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: nightly-integration
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
smoke:
|
|
18
|
+
name: Model Smoke Tests
|
|
19
|
+
runs-on: macos-latest
|
|
20
|
+
timeout-minutes: 120
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout code
|
|
24
|
+
uses: actions/checkout@v6
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
|
|
28
|
+
- name: Install uv
|
|
29
|
+
uses: astral-sh/setup-uv@v7
|
|
30
|
+
with:
|
|
31
|
+
enable-cache: true
|
|
32
|
+
|
|
33
|
+
- name: Install Python 3.13
|
|
34
|
+
run: uv python install 3.13
|
|
35
|
+
|
|
36
|
+
- name: Install project dependencies
|
|
37
|
+
run: make install
|
|
38
|
+
|
|
39
|
+
- name: Install vllm-mlx
|
|
40
|
+
run: uv tool install vllm-mlx==0.2.6
|
|
41
|
+
|
|
42
|
+
- name: Run smoke tests
|
|
43
|
+
run: |
|
|
44
|
+
MODEL_FILTER="${{ github.event.inputs.model }}"
|
|
45
|
+
if [ -n "$MODEL_FILTER" ]; then
|
|
46
|
+
uv run pytest -m smoke -k "$MODEL_FILTER" -v --tb=long
|
|
47
|
+
else
|
|
48
|
+
uv run pytest -m smoke -v --tb=long
|
|
49
|
+
fi
|
|
50
|
+
env:
|
|
51
|
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
|
52
|
+
|
|
53
|
+
- name: Upload compatibility matrix
|
|
54
|
+
uses: actions/upload-artifact@v4
|
|
55
|
+
if: always()
|
|
56
|
+
with:
|
|
57
|
+
name: compatibility-matrix
|
|
58
|
+
path: ~/.mlx-stack-test-cache/reports/
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Pre-Release Integration
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [created]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: prerelease-integration
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
stack-integration:
|
|
14
|
+
name: Full Stack Integration
|
|
15
|
+
runs-on: macos-latest
|
|
16
|
+
timeout-minutes: 60
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout code
|
|
20
|
+
uses: actions/checkout@v6
|
|
21
|
+
with:
|
|
22
|
+
fetch-depth: 0
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v7
|
|
26
|
+
with:
|
|
27
|
+
enable-cache: true
|
|
28
|
+
|
|
29
|
+
- name: Install Python 3.13
|
|
30
|
+
run: uv python install 3.13
|
|
31
|
+
|
|
32
|
+
- name: Install project dependencies
|
|
33
|
+
run: uv sync --dev
|
|
34
|
+
|
|
35
|
+
- name: Install openai for harness tests
|
|
36
|
+
run: uv pip install openai>=1.0
|
|
37
|
+
|
|
38
|
+
- name: Install vllm-mlx and litellm
|
|
39
|
+
run: |
|
|
40
|
+
uv tool install vllm-mlx==0.2.6
|
|
41
|
+
uv tool install "litellm[proxy]==1.83.0"
|
|
42
|
+
|
|
43
|
+
- name: Run stack integration tests
|
|
44
|
+
run: uv run pytest -m "integration or harness" -v --tb=long
|
|
45
|
+
env:
|
|
46
|
+
HF_TOKEN: ${{ secrets.HF_TOKEN }}
|
|
47
|
+
|
|
48
|
+
- name: Upload test results
|
|
49
|
+
uses: actions/upload-artifact@v4
|
|
50
|
+
if: always()
|
|
51
|
+
with:
|
|
52
|
+
name: integration-results
|
|
53
|
+
path: ~/.mlx-stack-test-cache/reports/
|
|
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.3.4](https://github.com/weklund/mlx-stack/compare/v0.3.3...v0.3.4) (2026-04-03)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* 4-tier integration testing framework ([#16](https://github.com/weklund/mlx-stack/issues/16)) ([e3dcf9a](https://github.com/weklund/mlx-stack/commit/e3dcf9ae4eaa55ee8ca522819d3dc16846d3e1ea))
|
|
13
|
+
|
|
7
14
|
## [0.3.3](https://github.com/weklund/mlx-stack/compare/v0.3.2...v0.3.3) (2026-04-02)
|
|
8
15
|
|
|
9
16
|
|
mlx_stack-0.3.4/Makefile
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.PHONY: install lint typecheck test check test-catalog test-smoke test-integration test-harness
|
|
2
|
+
|
|
3
|
+
## Install dev dependencies
|
|
4
|
+
install:
|
|
5
|
+
uv sync --dev
|
|
6
|
+
|
|
7
|
+
## Lint source and tests
|
|
8
|
+
lint:
|
|
9
|
+
uv run ruff check src/ tests/
|
|
10
|
+
|
|
11
|
+
## Run type checker across the full project
|
|
12
|
+
typecheck:
|
|
13
|
+
uv run python -m pyright
|
|
14
|
+
|
|
15
|
+
## Run tests with coverage
|
|
16
|
+
test:
|
|
17
|
+
uv run pytest --cov=src/mlx_stack -x -q --tb=short
|
|
18
|
+
|
|
19
|
+
## Run all checks (same as CI)
|
|
20
|
+
check: lint typecheck test
|
|
21
|
+
|
|
22
|
+
## Run catalog validation (requires network, no models)
|
|
23
|
+
test-catalog:
|
|
24
|
+
uv run pytest -m catalog_validation -v --tb=short
|
|
25
|
+
|
|
26
|
+
## Run per-model smoke tests (requires macOS + vllm-mlx)
|
|
27
|
+
test-smoke:
|
|
28
|
+
uv run pytest -m smoke -v --tb=long
|
|
29
|
+
|
|
30
|
+
## Run full stack integration tests (requires macOS + vllm-mlx + litellm)
|
|
31
|
+
test-integration:
|
|
32
|
+
uv run pytest -m integration -v --tb=long
|
|
33
|
+
|
|
34
|
+
## Run harness compatibility tests (requires above + openai)
|
|
35
|
+
test-harness:
|
|
36
|
+
uv run pytest -m harness -v --tb=long
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mlx-stack
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: CLI control plane for local LLM infrastructure on Apple Silicon
|
|
5
5
|
Project-URL: Homepage, https://github.com/weklund/mlx-stack
|
|
6
6
|
Project-URL: Repository, https://github.com/weklund/mlx-stack
|
|
@@ -53,9 +53,12 @@ packages = ["src/mlx_stack"]
|
|
|
53
53
|
[tool.pytest.ini_options]
|
|
54
54
|
testpaths = ["tests"]
|
|
55
55
|
pythonpath = ["src"]
|
|
56
|
-
addopts = "-x -q --tb=short -m 'not integration'"
|
|
56
|
+
addopts = "-x -q --tb=short -m 'not integration and not smoke and not catalog_validation and not harness'"
|
|
57
57
|
markers = [
|
|
58
58
|
"integration: real system integration tests (launchctl, etc.)",
|
|
59
|
+
"smoke: per-model smoke tests requiring model download and inference",
|
|
60
|
+
"catalog_validation: catalog data integrity checks (requires network, no models)",
|
|
61
|
+
"harness: external tool compatibility tests (OpenAI client, streaming)",
|
|
59
62
|
]
|
|
60
63
|
|
|
61
64
|
[tool.ruff]
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.3.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 3,
|
|
21
|
+
__version__ = version = '0.3.4'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 3, 4)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -25,6 +25,7 @@ from mlx_stack.cli.models import models as models_command
|
|
|
25
25
|
from mlx_stack.cli.profile import profile as profile_command
|
|
26
26
|
from mlx_stack.cli.pull import pull as pull_command
|
|
27
27
|
from mlx_stack.cli.recommend import recommend as recommend_command
|
|
28
|
+
from mlx_stack.cli.setup import setup as setup_command
|
|
28
29
|
from mlx_stack.cli.status import status as status_command
|
|
29
30
|
from mlx_stack.cli.up import up as up_command
|
|
30
31
|
from mlx_stack.cli.watch import watch as watch_command
|
|
@@ -73,6 +74,7 @@ class RichGroup(click.Group):
|
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
command_categories = {
|
|
77
|
+
"setup": "Setup & Configuration",
|
|
76
78
|
"profile": "Setup & Configuration",
|
|
77
79
|
"config": "Setup & Configuration",
|
|
78
80
|
"init": "Setup & Configuration",
|
|
@@ -165,6 +167,7 @@ def cli(ctx: click.Context) -> None:
|
|
|
165
167
|
# These will be replaced by real implementations in subsequent features.
|
|
166
168
|
|
|
167
169
|
|
|
170
|
+
cli.add_command(setup_command, "setup")
|
|
168
171
|
cli.add_command(profile_command, "profile")
|
|
169
172
|
cli.add_command(recommend_command, "recommend")
|
|
170
173
|
cli.add_command(init_command, "init")
|