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.
Files changed (241) hide show
  1. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/ci.yml +28 -0
  2. mlx_stack-0.3.4/.github/workflows/integration-nightly.yml +58 -0
  3. mlx_stack-0.3.4/.github/workflows/integration-prerelease.yml +53 -0
  4. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.gitignore +1 -0
  5. mlx_stack-0.3.4/.release-please-manifest.json +3 -0
  6. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CHANGELOG.md +7 -0
  7. mlx_stack-0.3.4/Makefile +36 -0
  8. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/PKG-INFO +1 -1
  9. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/pyproject.toml +4 -1
  10. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/_version.py +2 -2
  11. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/main.py +3 -0
  12. mlx_stack-0.3.4/src/mlx_stack/cli/setup.py +522 -0
  13. mlx_stack-0.3.4/src/mlx_stack/core/discovery.py +390 -0
  14. mlx_stack-0.3.4/src/mlx_stack/core/onboarding.py +458 -0
  15. mlx_stack-0.3.4/src/mlx_stack/data/benchmark_data.json +1594 -0
  16. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/deepseek-r1-32b.yaml +1 -0
  17. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/nemotron-49b.yaml +1 -0
  18. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/nemotron-8b.yaml +1 -0
  19. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-14b.yaml +1 -0
  20. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-32b.yaml +1 -0
  21. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-3b.yaml +1 -0
  22. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-72b.yaml +1 -0
  23. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-8b.yaml +1 -0
  24. mlx_stack-0.3.4/tests/integration/conftest.py +530 -0
  25. mlx_stack-0.3.4/tests/integration/report.py +99 -0
  26. mlx_stack-0.3.4/tests/integration/test_catalog_validation.py +229 -0
  27. mlx_stack-0.3.4/tests/integration/test_harness_compatibility.py +239 -0
  28. mlx_stack-0.3.4/tests/integration/test_model_smoke.py +393 -0
  29. mlx_stack-0.3.4/tests/integration/test_stack_integration.py +346 -0
  30. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_catalog.py +7 -3
  31. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_pull.py +5 -6
  32. mlx_stack-0.3.4/tests/unit/test_cli_setup.py +184 -0
  33. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_status.py +0 -31
  34. mlx_stack-0.3.4/tests/unit/test_discovery.py +324 -0
  35. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_launchd.py +2 -13
  36. mlx_stack-0.3.4/tests/unit/test_onboarding.py +374 -0
  37. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_watchdog.py +3 -6
  38. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/uv.lock +1 -1
  39. mlx_stack-0.3.3/.release-please-manifest.json +0 -3
  40. mlx_stack-0.3.3/Makefile +0 -20
  41. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/init.sh +0 -0
  42. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/architecture.md +0 -0
  43. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/environment.md +0 -0
  44. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/library/user-testing.md +0 -0
  45. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/services.yaml +0 -0
  46. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/settings.json +0 -0
  47. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/skills/cli-feature/SKILL.md +0 -0
  48. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/configuration-management.json +0 -0
  49. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/dependency-management.json +0 -0
  50. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-catalog-errors-and-families.json +0 -0
  51. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-deps-binary-and-ansi.json +0 -0
  52. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/fix-scaffolding-data-home.json +0 -0
  53. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/hardware-detection.json +0 -0
  54. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/model-catalog.json +0 -0
  55. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/reviews/project-scaffolding.json +0 -0
  56. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/synthesis.json +0 -0
  57. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/scrutiny/synthesis.round1.json +0 -0
  58. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-config-basic.json +0 -0
  59. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-config-deps.json +0 -0
  60. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-profile-catalog.json +0 -0
  61. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/flows/foundation-setup-profile-core.json +0 -0
  62. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/foundation/user-testing/synthesis.json +0 -0
  63. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/down-command.json +0 -0
  64. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-preflight-and-readonly.json +0 -0
  65. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-process-robustness.json +0 -0
  66. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/fix-lifecycle-typecheck.json +0 -0
  67. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/process-management.json +0 -0
  68. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/status-command.json +0 -0
  69. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/reviews/up-command.json +0 -0
  70. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/synthesis.json +0 -0
  71. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/scrutiny/synthesis.round1.json +0 -0
  72. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g1-deps-up-basics.json +0 -0
  73. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g2-up-startup.json +0 -0
  74. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g3-up-resilience.json +0 -0
  75. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g4-down.json +0 -0
  76. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g5-status.json +0 -0
  77. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r1-g6-cross.json +0 -0
  78. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r2-g1-fixes.json +0 -0
  79. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/flows/r2-g2-cross-blockers.json +0 -0
  80. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/synthesis.json +0 -0
  81. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/lifecycle/user-testing/synthesis.round1.json +0 -0
  82. {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
  83. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/reviews/misc-cross-area-validation.json +0 -0
  84. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/synthesis.json +0 -0
  85. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/scrutiny/synthesis.round1.json +0 -0
  86. {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
  87. {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
  88. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/synthesis.json +0 -0
  89. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/misc-cross-area/user-testing/synthesis.round1.json +0 -0
  90. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-lint-errors.json +0 -0
  91. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-scrutiny-issues.json +0 -0
  92. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/fix-ops-typecheck-errors.json +0 -0
  93. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/launchd-integration.json +0 -0
  94. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/log-rotation.json +0 -0
  95. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/logs-command.json +0 -0
  96. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/ops-cross-area-validation.json +0 -0
  97. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/reviews/watchdog-command.json +0 -0
  98. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/synthesis.json +0 -0
  99. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/scrutiny/synthesis.round1.json +0 -0
  100. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g1-log.json +0 -0
  101. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g2-logs-command.json +0 -0
  102. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g3-watch.json +0 -0
  103. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g4-launchd.json +0 -0
  104. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/flows/g5-cross-ops.json +0 -0
  105. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/ops/user-testing/synthesis.json +0 -0
  106. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/community-docs.json +0 -0
  107. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/developing-guide.json +0 -0
  108. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/fix-public-ready-scrutiny.json +0 -0
  109. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/github-actions-ci.json +0 -0
  110. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/reviews/readme-rewrite.json +0 -0
  111. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/synthesis.json +0 -0
  112. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/public-ready/scrutiny/synthesis.round1.json +0 -0
  113. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-init-and-models-issues.json +0 -0
  114. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-recommendation-scoring-issues.json +0 -0
  115. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/fix-scoring-lint.json +0 -0
  116. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/init-command.json +0 -0
  117. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/models-command.json +0 -0
  118. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/recommend-command.json +0 -0
  119. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/reviews/scoring-engine.json +0 -0
  120. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/synthesis.json +0 -0
  121. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/scrutiny/synthesis.round1.json +0 -0
  122. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g1-recommend-budget-ranking.json +0 -0
  123. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g2-recommend-output-integration.json +0 -0
  124. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g3-init-core-routing.json +0 -0
  125. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g4-init-cloud-overwrite.json +0 -0
  126. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g5-init-hardware-summary.json +0 -0
  127. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g6-models-local.json +0 -0
  128. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/g7-models-catalog.json +0 -0
  129. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g1-recommend.json +0 -0
  130. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g2-models-catalog-filters.json +0 -0
  131. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/flows/r2-g3-cross-012.json +0 -0
  132. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/synthesis.json +0 -0
  133. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/recommendation/user-testing/synthesis.round1.json +0 -0
  134. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/bench-command.json +0 -0
  135. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/fix-tooling-scrutiny-issues.json +0 -0
  136. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/reviews/pull-command.json +0 -0
  137. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/synthesis.json +0 -0
  138. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/scrutiny/synthesis.round1.json +0 -0
  139. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g1-pull-core.json +0 -0
  140. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g2-pull-errors.json +0 -0
  141. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g3-bench-core.json +0 -0
  142. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/g4-bench-advanced.json +0 -0
  143. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r2-g1-pull.json +0 -0
  144. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r2-g2-bench.json +0 -0
  145. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r3-g1-pull.json +0 -0
  146. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r3-g2-bench.json +0 -0
  147. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/flows/r4-g1-bench.json +0 -0
  148. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.json +0 -0
  149. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round1.json +0 -0
  150. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round2.json +0 -0
  151. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.factory/validation/tooling/user-testing/synthesis.round3.json +0 -0
  152. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/release.yml +0 -0
  153. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/publish.yml +0 -0
  154. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/.github/workflows/release-please.yml +0 -0
  155. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CODE_OF_CONDUCT.md +0 -0
  156. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/CONTRIBUTING.md +0 -0
  157. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/DEVELOPING.md +0 -0
  158. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/LICENSE +0 -0
  159. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/README.md +0 -0
  160. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/SECURITY.md +0 -0
  161. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/release-please-config.json +0 -0
  162. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/__init__.py +0 -0
  163. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/__init__.py +0 -0
  164. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/bench.py +0 -0
  165. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/config.py +0 -0
  166. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/down.py +0 -0
  167. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/init.py +0 -0
  168. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/install.py +0 -0
  169. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/logs.py +0 -0
  170. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/models.py +0 -0
  171. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/profile.py +0 -0
  172. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/pull.py +0 -0
  173. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/recommend.py +0 -0
  174. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/status.py +0 -0
  175. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/up.py +0 -0
  176. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/cli/watch.py +0 -0
  177. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/__init__.py +0 -0
  178. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/benchmark.py +0 -0
  179. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/catalog.py +0 -0
  180. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/config.py +0 -0
  181. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/deps.py +0 -0
  182. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/hardware.py +0 -0
  183. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/launchd.py +0 -0
  184. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/litellm_gen.py +0 -0
  185. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/log_rotation.py +0 -0
  186. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/log_viewer.py +0 -0
  187. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/models.py +0 -0
  188. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/paths.py +0 -0
  189. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/process.py +0 -0
  190. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/pull.py +0 -0
  191. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/scoring.py +0 -0
  192. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_down.py +0 -0
  193. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_init.py +0 -0
  194. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_status.py +0 -0
  195. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/stack_up.py +0 -0
  196. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/core/watchdog.py +0 -0
  197. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/__init__.py +0 -0
  198. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/__init__.py +0 -0
  199. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/deepseek-r1-8b.yaml +0 -0
  200. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-12b.yaml +0 -0
  201. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-27b.yaml +0 -0
  202. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/gemma3-4b.yaml +0 -0
  203. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/llama3.3-8b.yaml +0 -0
  204. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3-8b.yaml +0 -0
  205. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/data/catalog/qwen3.5-0.8b.yaml +0 -0
  206. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/py.typed +0 -0
  207. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/src/mlx_stack/utils/__init__.py +0 -0
  208. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/__init__.py +0 -0
  209. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/conftest.py +0 -0
  210. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/__init__.py +0 -0
  211. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/test_inference_e2e.py +0 -0
  212. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/integration/test_launchd_e2e.py +0 -0
  213. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/__init__.py +0 -0
  214. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_benchmark.py +0 -0
  215. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli.py +0 -0
  216. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_bench.py +0 -0
  217. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_config.py +0 -0
  218. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_down.py +0 -0
  219. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_init.py +0 -0
  220. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_install.py +0 -0
  221. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_logs.py +0 -0
  222. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_models.py +0 -0
  223. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_profile.py +0 -0
  224. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_recommend.py +0 -0
  225. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_up.py +0 -0
  226. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cli_watch.py +0 -0
  227. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_config.py +0 -0
  228. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_cross_area.py +0 -0
  229. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_data_dir.py +0 -0
  230. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_deps.py +0 -0
  231. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_hardware.py +0 -0
  232. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_lifecycle_fixes.py +0 -0
  233. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_litellm_gen.py +0 -0
  234. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_log_rotation.py +0 -0
  235. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_log_viewer.py +0 -0
  236. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_models.py +0 -0
  237. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_ops_cross_area.py +0 -0
  238. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_paths.py +0 -0
  239. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_process.py +0 -0
  240. {mlx_stack-0.3.3 → mlx_stack-0.3.4}/tests/unit/test_robustness_fixes.py +0 -0
  241. {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/
@@ -34,3 +34,4 @@ htmlcov/
34
34
 
35
35
  # Ruff
36
36
  .ruff_cache/
37
+ REQUIREMENTS.md
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.4"
3
+ }
@@ -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
 
@@ -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
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.3'
22
- __version_tuple__ = version_tuple = (0, 3, 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")