simplicio-cli 0.4.3__tar.gz → 0.5.1__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 (375) hide show
  1. {simplicio_cli-0.4.3/simplicio_cli.egg-info → simplicio_cli-0.5.1}/PKG-INFO +43 -2
  2. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/README.md +38 -1
  3. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/pyproject.toml +15 -2
  4. simplicio_cli-0.5.1/simplicio/__init__.py +1 -0
  5. simplicio_cli-0.5.1/simplicio/_cache.py +269 -0
  6. simplicio_cli-0.5.1/simplicio/cache_cli.py +68 -0
  7. simplicio_cli-0.5.1/simplicio/cli.py +670 -0
  8. simplicio_cli-0.5.1/simplicio/doctor.py +106 -0
  9. simplicio_cli-0.5.1/simplicio/dod.py +88 -0
  10. simplicio_cli-0.5.1/simplicio/ecosystem.py +246 -0
  11. simplicio_cli-0.5.1/simplicio/hardware.py +206 -0
  12. simplicio_cli-0.5.1/simplicio/intent.py +390 -0
  13. simplicio_cli-0.5.1/simplicio/local_models.py +218 -0
  14. simplicio_cli-0.5.1/simplicio/orchestrator/__init__.py +5 -0
  15. simplicio_cli-0.5.1/simplicio/orchestrator/cost_governor.py +129 -0
  16. simplicio_cli-0.5.1/simplicio/orchestrator/feature.py +175 -0
  17. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/pipeline.py +21 -1
  18. simplicio_cli-0.5.1/simplicio/pipeline_fixers.py +287 -0
  19. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/precedent.py +76 -23
  20. simplicio_cli-0.5.1/simplicio/providers.py +601 -0
  21. simplicio_cli-0.5.1/simplicio/scratch/__init__.py +16 -0
  22. simplicio_cli-0.5.1/simplicio/scratch/_pipeline_adapter.py +84 -0
  23. simplicio_cli-0.5.1/simplicio/scratch/cli.py +496 -0
  24. simplicio_cli-0.5.1/simplicio/scratch/codegen/__init__.py +30 -0
  25. simplicio_cli-0.5.1/simplicio/scratch/codegen/go_gin.py +220 -0
  26. simplicio_cli-0.5.1/simplicio/scratch/codegen/php_laravel.py +146 -0
  27. simplicio_cli-0.5.1/simplicio/scratch/codegen/python_cst.py +149 -0
  28. simplicio_cli-0.5.1/simplicio/scratch/codegen/python_fastapi.py +397 -0
  29. simplicio_cli-0.5.1/simplicio/scratch/codegen/python_orm.py +336 -0
  30. simplicio_cli-0.5.1/simplicio/scratch/codegen/python_pydantic.py +527 -0
  31. simplicio_cli-0.5.1/simplicio/scratch/codegen/python_pytest.py +516 -0
  32. simplicio_cli-0.5.1/simplicio/scratch/codegen/registry.py +53 -0
  33. simplicio_cli-0.5.1/simplicio/scratch/codegen/rust_axum.py +257 -0
  34. simplicio_cli-0.5.1/simplicio/scratch/codegen/types.py +31 -0
  35. simplicio_cli-0.5.1/simplicio/scratch/codegen/typescript_next_page.py +207 -0
  36. simplicio_cli-0.5.1/simplicio/scratch/codegen/typescript_next_route.py +334 -0
  37. simplicio_cli-0.5.1/simplicio/scratch/executor.py +537 -0
  38. simplicio_cli-0.5.1/simplicio/scratch/plan_schema.py +232 -0
  39. simplicio_cli-0.5.1/simplicio/scratch/planner.py +189 -0
  40. simplicio_cli-0.5.1/simplicio/scratch/recipes.py +432 -0
  41. simplicio_cli-0.5.1/simplicio/scratch/skill_opt.py +230 -0
  42. simplicio_cli-0.5.1/simplicio/scratch/stack_registry.py +186 -0
  43. simplicio_cli-0.5.1/simplicio/sprint_loader.py +75 -0
  44. simplicio_cli-0.5.1/simplicio/templates/recipes/go-gin/crud-resource.yaml +34 -0
  45. simplicio_cli-0.5.1/simplicio/templates/recipes/php-laravel/crud-resource.yaml +34 -0
  46. simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/admin-crud.yaml +55 -0
  47. simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/auth-jwt.yaml +54 -0
  48. simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/crud-resource.yaml +66 -0
  49. simplicio_cli-0.5.1/simplicio/templates/recipes/rust-axum/crud-resource.yaml +34 -0
  50. simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/admin-crud.yaml +42 -0
  51. simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/auth-jwt.yaml +41 -0
  52. simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/crud-resource.yaml +47 -0
  53. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/README.md +24 -0
  54. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/practices.md +20 -0
  55. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/stack.json +13 -0
  56. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/README.md +13 -0
  57. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/bin/app.sh +15 -0
  58. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/test/app.bats +11 -0
  59. simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/verify.json +6 -0
  60. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/README.md +25 -0
  61. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/practices.md +20 -0
  62. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/stack.json +13 -0
  63. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/README.md +13 -0
  64. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/App.Api.csproj +7 -0
  65. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/Program.cs +8 -0
  66. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/App.Tests.csproj +13 -0
  67. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/HealthTests.cs +10 -0
  68. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/verify.json +6 -0
  69. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/README.md +25 -0
  70. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/practices.md +20 -0
  71. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/stack.json +13 -0
  72. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/README.md +13 -0
  73. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/App.Web.csproj +7 -0
  74. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/App.razor +5 -0
  75. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/Pages/Home.razor +6 -0
  76. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Program.cs +12 -0
  77. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/App.Tests.csproj +13 -0
  78. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/HealthTests.cs +10 -0
  79. simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/verify.json +6 -0
  80. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/README.md +25 -0
  81. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/practices.md +20 -0
  82. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/stack.json +13 -0
  83. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/README.md +14 -0
  84. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/lib/main.dart +18 -0
  85. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/pubspec.yaml +18 -0
  86. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/test/widget_test.dart +11 -0
  87. simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/verify.json +6 -0
  88. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/README.md +25 -0
  89. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/practices.md +20 -0
  90. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/stack.json +13 -0
  91. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/README.md +13 -0
  92. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/config/config.exs +7 -0
  93. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app/application.ex +12 -0
  94. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/controllers/health_controller.ex +7 -0
  95. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/endpoint.ex +5 -0
  96. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/router.ex +13 -0
  97. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/mix.exs +26 -0
  98. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/test/health_controller_test.exs +7 -0
  99. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/test/test_helper.exs +1 -0
  100. simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/verify.json +6 -0
  101. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/README.md +25 -0
  102. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/practices.md +20 -0
  103. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/stack.json +13 -0
  104. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/README.md +13 -0
  105. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/cmd/root.go +30 -0
  106. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/cmd/root_test.go +19 -0
  107. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/go.mod +8 -0
  108. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/main.go +7 -0
  109. simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/verify.json +6 -0
  110. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/README.md +26 -0
  111. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/practices.md +20 -0
  112. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/stack.json +13 -0
  113. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/README.md +13 -0
  114. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/cmd/server/main.go +13 -0
  115. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/go.mod +5 -0
  116. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/internal/http/router.go +15 -0
  117. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/internal/http/router_test.go +19 -0
  118. simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/verify.json +6 -0
  119. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/README.md +33 -0
  120. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/practices.md +28 -0
  121. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/stack.json +13 -0
  122. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/README.md +10 -0
  123. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/cmd/server/main.go +14 -0
  124. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/go.mod +5 -0
  125. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/internal/http/router.go +18 -0
  126. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/internal/http/router_test.go +22 -0
  127. simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/verify.json +6 -0
  128. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/README.md +26 -0
  129. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/practices.md +20 -0
  130. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/stack.json +13 -0
  131. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/README.md +12 -0
  132. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/build.gradle.kts +18 -0
  133. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/settings.gradle.kts +13 -0
  134. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/Application.java +11 -0
  135. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/HealthController.java +13 -0
  136. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/test/java/com/example/HealthControllerTest.java +12 -0
  137. simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/verify.json +6 -0
  138. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/README.md +26 -0
  139. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/practices.md +20 -0
  140. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/stack.json +14 -0
  141. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/README.md +14 -0
  142. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/package.json +19 -0
  143. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/src/app.js +12 -0
  144. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/src/server.js +7 -0
  145. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/tests/health.test.js +18 -0
  146. simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/verify.json +6 -0
  147. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/README.md +26 -0
  148. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/practices.md +20 -0
  149. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/stack.json +13 -0
  150. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/README.md +12 -0
  151. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/build.gradle.kts +23 -0
  152. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/AndroidManifest.xml +10 -0
  153. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/java/com/example/app/MainActivity.kt +15 -0
  154. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/res/values/styles.xml +3 -0
  155. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/test/java/com/example/app/SmokeTest.kt +11 -0
  156. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/build.gradle.kts +4 -0
  157. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/settings.gradle.kts +18 -0
  158. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/verify.json +6 -0
  159. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/README.md +25 -0
  160. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/practices.md +20 -0
  161. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/stack.json +13 -0
  162. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/README.md +12 -0
  163. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/build.gradle.kts +19 -0
  164. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/settings.gradle.kts +13 -0
  165. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/src/main/kotlin/com/example/Application.kt +22 -0
  166. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/src/test/kotlin/com/example/ApplicationTest.kt +18 -0
  167. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/verify.json +6 -0
  168. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/README.md +26 -0
  169. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/practices.md +20 -0
  170. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/stack.json +13 -0
  171. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/README.md +12 -0
  172. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/build.gradle.kts +16 -0
  173. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/settings.gradle.kts +13 -0
  174. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/Application.kt +11 -0
  175. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/HealthController.kt +10 -0
  176. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/test/kotlin/com/example/HealthControllerTest.kt +11 -0
  177. simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/verify.json +6 -0
  178. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/README.md +35 -0
  179. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/practices.md +31 -0
  180. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/stack.json +13 -0
  181. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/README.md +11 -0
  182. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/artisan +14 -0
  183. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/bootstrap/app.php +19 -0
  184. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/composer.json +29 -0
  185. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/phpunit.xml +17 -0
  186. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/routes/api.php +7 -0
  187. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/routes/console.php +7 -0
  188. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/tests/Feature/HealthTest.php +15 -0
  189. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/tests/TestCase.php +10 -0
  190. simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/verify.json +6 -0
  191. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/README.md +26 -0
  192. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/practices.md +20 -0
  193. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/stack.json +13 -0
  194. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/README.md +13 -0
  195. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/composer.json +23 -0
  196. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/src/Controller/HealthController.php +17 -0
  197. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/tests/HealthControllerTest.php +19 -0
  198. simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/verify.json +6 -0
  199. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/README.md +27 -0
  200. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/practices.md +20 -0
  201. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/stack.json +13 -0
  202. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/README.md +13 -0
  203. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/composer.json +22 -0
  204. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/phpunit.xml +8 -0
  205. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/src/Health.php +13 -0
  206. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/tests/HealthTest.php +16 -0
  207. simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/verify.json +6 -0
  208. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/README.md +26 -0
  209. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/practices.md +20 -0
  210. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/stack.json +13 -0
  211. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/README.md +14 -0
  212. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/pyproject.toml +16 -0
  213. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/src/app/cli.py +19 -0
  214. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/tests/test_cli.py +10 -0
  215. simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/verify.json +6 -0
  216. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/README.md +28 -0
  217. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/practices.md +21 -0
  218. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/stack.json +13 -0
  219. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/README.md +14 -0
  220. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/__init__.py +1 -0
  221. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/apps.py +6 -0
  222. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/tests.py +9 -0
  223. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/views.py +7 -0
  224. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/__init__.py +1 -0
  225. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/asgi.py +3 -0
  226. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/settings.py +18 -0
  227. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/urls.py +8 -0
  228. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/wsgi.py +3 -0
  229. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/manage.py +14 -0
  230. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/pyproject.toml +9 -0
  231. simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/verify.json +6 -0
  232. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/README.md +51 -0
  233. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/practices.md +55 -0
  234. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/stack.json +13 -0
  235. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/.gitignore +11 -0
  236. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/README.template.md +35 -0
  237. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/pyproject.toml +29 -0
  238. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/ruff.toml +9 -0
  239. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/src/api/__init__.py +1 -0
  240. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/src/main.py +24 -0
  241. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/tests/test_health.py +11 -0
  242. simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/verify.json +6 -0
  243. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/README.md +27 -0
  244. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/practices.md +21 -0
  245. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/stack.json +13 -0
  246. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/README.md +14 -0
  247. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/pyproject.toml +13 -0
  248. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/ruff.toml +2 -0
  249. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/src/app.py +11 -0
  250. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/tests/test_health.py +10 -0
  251. simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/verify.json +6 -0
  252. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/README.md +28 -0
  253. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/practices.md +20 -0
  254. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/stack.json +14 -0
  255. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/README.md +14 -0
  256. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/index.html +12 -0
  257. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/package.json +28 -0
  258. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/App.test.tsx +12 -0
  259. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/App.tsx +8 -0
  260. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/main.tsx +10 -0
  261. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/tsconfig.json +14 -0
  262. simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/verify.json +7 -0
  263. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/README.md +26 -0
  264. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/practices.md +20 -0
  265. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/stack.json +13 -0
  266. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/Gemfile +10 -0
  267. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/README.md +13 -0
  268. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/app/controllers/health_controller.rb +5 -0
  269. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/bin/rails +4 -0
  270. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/application.rb +8 -0
  271. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/boot.rb +2 -0
  272. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/routes.rb +3 -0
  273. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/test/controllers/health_controller_test.rb +10 -0
  274. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/test/test_helper.rb +3 -0
  275. simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/verify.json +6 -0
  276. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/README.md +32 -0
  277. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/practices.md +30 -0
  278. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/stack.json +13 -0
  279. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/Cargo.toml +12 -0
  280. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/README.md +11 -0
  281. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/src/main.rs +43 -0
  282. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/verify.json +6 -0
  283. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/README.md +24 -0
  284. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/practices.md +20 -0
  285. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/stack.json +13 -0
  286. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/Cargo.toml +8 -0
  287. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/README.md +13 -0
  288. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/src/main.rs +28 -0
  289. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/verify.json +6 -0
  290. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/README.md +24 -0
  291. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/practices.md +20 -0
  292. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/stack.json +13 -0
  293. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/Cargo.toml +7 -0
  294. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/README.md +13 -0
  295. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/src/main.rs +29 -0
  296. simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/verify.json +6 -0
  297. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/README.md +25 -0
  298. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/practices.md +20 -0
  299. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/stack.json +13 -0
  300. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/README.md +12 -0
  301. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Sources/App/App.swift +10 -0
  302. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Sources/App/ContentView.swift +12 -0
  303. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Tests/AppTests/AppTests.swift +7 -0
  304. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/verify.json +6 -0
  305. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/README.md +25 -0
  306. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/practices.md +20 -0
  307. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/stack.json +13 -0
  308. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Package.swift +17 -0
  309. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/README.md +13 -0
  310. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Sources/App/main.swift +11 -0
  311. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Tests/AppTests/HealthTests.swift +7 -0
  312. simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/verify.json +6 -0
  313. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/README.md +28 -0
  314. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/practices.md +20 -0
  315. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/stack.json +14 -0
  316. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/README.md +14 -0
  317. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/package.json +30 -0
  318. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.spec.ts +7 -0
  319. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.ts +9 -0
  320. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.module.ts +8 -0
  321. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/main.ts +13 -0
  322. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/tsconfig.json +14 -0
  323. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/verify.json +7 -0
  324. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/README.md +36 -0
  325. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/practices.md +37 -0
  326. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/stack.json +14 -0
  327. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/.eslintrc.json +3 -0
  328. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/.gitignore +9 -0
  329. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/next.config.mjs +6 -0
  330. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/package.json +30 -0
  331. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/pnpm-workspace.yaml +3 -0
  332. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/src/app/layout.tsx +14 -0
  333. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/src/app/page.tsx +8 -0
  334. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/tsconfig.json +21 -0
  335. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/verify.json +7 -0
  336. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/README.md +27 -0
  337. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/practices.md +20 -0
  338. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/stack.json +14 -0
  339. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/README.md +14 -0
  340. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/root.tsx +16 -0
  341. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/_index.tsx +8 -0
  342. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/health.test.ts +11 -0
  343. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/health.ts +5 -0
  344. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/package.json +27 -0
  345. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/tsconfig.json +14 -0
  346. simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/verify.json +7 -0
  347. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1/simplicio_cli.egg-info}/PKG-INFO +43 -2
  348. simplicio_cli-0.5.1/simplicio_cli.egg-info/SOURCES.txt +369 -0
  349. simplicio_cli-0.5.1/simplicio_cli.egg-info/dependency_links.txt +1 -0
  350. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio_cli.egg-info/requires.txt +5 -0
  351. simplicio_cli-0.4.3/simplicio/__init__.py +0 -1
  352. simplicio_cli-0.4.3/simplicio/cli.py +0 -150
  353. simplicio_cli-0.4.3/simplicio/providers.py +0 -142
  354. simplicio_cli-0.4.3/simplicio_cli.egg-info/SOURCES.txt +0 -30
  355. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/LICENSE +0 -0
  356. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/setup.cfg +0 -0
  357. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/adaptive.py +0 -0
  358. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/bench.py +0 -0
  359. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/cache.py +0 -0
  360. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/detect.py +0 -0
  361. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/init.py +0 -0
  362. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/mapper.py +0 -0
  363. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/observability.py +0 -0
  364. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/prompt.py +0 -0
  365. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/skill_router.py +0 -0
  366. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/SKILL.md +0 -0
  367. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/simplicio_prompt.md +0 -0
  368. /simplicio_cli-0.4.3/simplicio_cli.egg-info/dependency_links.txt → /simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/src/app/__init__.py +0 -0
  369. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/userpromptsubmit-hook.sh +0 -0
  370. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/__init__.py +0 -0
  371. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/cache.py +0 -0
  372. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/http_client.py +0 -0
  373. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/serialization.py +0 -0
  374. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio_cli.egg-info/entry_points.txt +0 -0
  375. {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplicio-cli
3
- Version: 0.4.3
3
+ Version: 0.5.1
4
4
  Summary: Portable task-to-code pipeline that works with any LLM. Turn a one-line task into a verified code change — diff + test + verify loop. +55 pts on a 156-check benchmark, 21% faster, ~same tokens.
5
5
  Author-email: Wesley Simplicio <wesleybob4@gmail.com>
6
6
  License: MIT
@@ -36,8 +36,12 @@ Requires-Dist: simplicio-prompt>=1.12.0
36
36
  Requires-Dist: httpx>=0.27
37
37
  Requires-Dist: orjson>=3.10
38
38
  Requires-Dist: diskcache>=5.6
39
+ Requires-Dist: libcst>=1.8
39
40
  Provides-Extra: bench
40
41
  Requires-Dist: fpdf2>=2.7; extra == "bench"
42
+ Provides-Extra: local
43
+ Requires-Dist: llama-cpp-python>=0.3.2; extra == "local"
44
+ Requires-Dist: huggingface-hub>=0.23; extra == "local"
41
45
  Dynamic: license-file
42
46
 
43
47
  # simplicio-cli
@@ -351,7 +355,9 @@ The install ships **three Simplicio packages** that play distinct roles:
351
355
  (`bench/run_fanout.py`) measures both real PHPUnit pass-rate and a
352
356
  structural regex check on every subagent and surfaces the gap; full
353
357
  ongoing numbers in [`bench/results_fanout.md`](bench/results_fanout.md) ·
354
- [`bench/results_fanout.pdf`](bench/results_fanout.pdf).
358
+ [`bench/results_fanout.pdf`](bench/results_fanout.pdf). Set
359
+ `BENCH_SINDICO_SRC` / `BENCH_SINDICO_WORK` when the local
360
+ `sistema-sindico` checkout and work copy are not under `/tmp`.
355
361
 
356
362
  Each is independently published on PyPI; ship them as a set so the CLI's
357
363
  mapper-rich precedent ranking, contract-shaped prompts, and (when called
@@ -540,6 +546,7 @@ user prompt. UserPromptSubmit is the right pre-hook for routing decisions.
540
546
  | DeepSeek | `deepseek-chat` | `https://api.deepseek.com` |
541
547
  | OpenAI | `gpt-4.1` | `https://api.openai.com/v1` |
542
548
  | Local (Ollama) | `llama3` | `http://localhost:11434/v1` |
549
+ | Local (in-process) | `local-llama/default` | *(leave unset)* |
543
550
  | Anthropic native | `claude-opus-4-7` | *(leave unset)* |
544
551
 
545
552
  If `SIMPLICIO_BASE_URL` is unset and the key is `ANTHROPIC_API_KEY`, it uses the
@@ -550,6 +557,40 @@ your `base_url` — so **any** OpenAI-like provider works without code changes.
550
557
  simplicio smoke # prints provider config + one test call
551
558
  ```
552
559
 
560
+ ### Path 4 — offline-first local model (zero key, zero HTTP)
561
+
562
+ simplicio ships an **in-process** backend powered by
563
+ [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python). When **no
564
+ provider is configured** (`SIMPLICIO_MODEL` *and* `SIMPLICIO_BASE_URL` both
565
+ unset), it runs **Qwen2.5-Coder-1.5B-Instruct (Q5_K_M GGUF)** directly — small,
566
+ code-specialized, fast on CPU, no API key, no Ollama, no HTTP overhead. The
567
+ 6-layer contract is what makes a 1.5B usable: it lifts the same model from ~34%
568
+ to ~88% pass-rate on the local benchmark.
569
+
570
+ ```bash
571
+ pip install 'simplicio-cli[local]' # pulls llama-cpp-python + huggingface-hub
572
+
573
+ simplicio task "add input validation to createUser" \
574
+ --target src/users.ts --local # forces the local model
575
+
576
+ # the GGUF is fetched once from the Hugging Face Hub, then cached + reused
577
+ ```
578
+
579
+ Explicit routes (override the default model/weights):
580
+
581
+ ```bash
582
+ SIMPLICIO_MODEL=local-llama/default # bundled default
583
+ SIMPLICIO_MODEL=local-llama/bartowski/Qwen2.5-Coder-7B-Instruct-GGUF::Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf
584
+ SIMPLICIO_MODEL=local-llama//models/my-model.gguf # direct local path
585
+ SIMPLICIO_LOCAL_MODEL_PATH=/models/my-model.gguf # always wins
586
+ ```
587
+
588
+ Tuning knobs (all optional): `SIMPLICIO_LOCAL_CTX` (context window, default
589
+ `8192`), `SIMPLICIO_LOCAL_THREADS`, `SIMPLICIO_LOCAL_GPU_LAYERS` (offload to GPU,
590
+ default `0`), `SIMPLICIO_LOCAL_MAX_TOKENS` (generation cap),
591
+ `SIMPLICIO_LOCAL_TEMP` (default `0.1`), `SIMPLICIO_LOCAL_MODEL_REPO` /
592
+ `SIMPLICIO_LOCAL_MODEL_FILE`.
593
+
553
594
  ### The pipeline (both paths)
554
595
 
555
596
  Whichever entry point you use, each task runs through the same engine:
@@ -309,7 +309,9 @@ The install ships **three Simplicio packages** that play distinct roles:
309
309
  (`bench/run_fanout.py`) measures both real PHPUnit pass-rate and a
310
310
  structural regex check on every subagent and surfaces the gap; full
311
311
  ongoing numbers in [`bench/results_fanout.md`](bench/results_fanout.md) ·
312
- [`bench/results_fanout.pdf`](bench/results_fanout.pdf).
312
+ [`bench/results_fanout.pdf`](bench/results_fanout.pdf). Set
313
+ `BENCH_SINDICO_SRC` / `BENCH_SINDICO_WORK` when the local
314
+ `sistema-sindico` checkout and work copy are not under `/tmp`.
313
315
 
314
316
  Each is independently published on PyPI; ship them as a set so the CLI's
315
317
  mapper-rich precedent ranking, contract-shaped prompts, and (when called
@@ -498,6 +500,7 @@ user prompt. UserPromptSubmit is the right pre-hook for routing decisions.
498
500
  | DeepSeek | `deepseek-chat` | `https://api.deepseek.com` |
499
501
  | OpenAI | `gpt-4.1` | `https://api.openai.com/v1` |
500
502
  | Local (Ollama) | `llama3` | `http://localhost:11434/v1` |
503
+ | Local (in-process) | `local-llama/default` | *(leave unset)* |
501
504
  | Anthropic native | `claude-opus-4-7` | *(leave unset)* |
502
505
 
503
506
  If `SIMPLICIO_BASE_URL` is unset and the key is `ANTHROPIC_API_KEY`, it uses the
@@ -508,6 +511,40 @@ your `base_url` — so **any** OpenAI-like provider works without code changes.
508
511
  simplicio smoke # prints provider config + one test call
509
512
  ```
510
513
 
514
+ ### Path 4 — offline-first local model (zero key, zero HTTP)
515
+
516
+ simplicio ships an **in-process** backend powered by
517
+ [`llama-cpp-python`](https://github.com/abetlen/llama-cpp-python). When **no
518
+ provider is configured** (`SIMPLICIO_MODEL` *and* `SIMPLICIO_BASE_URL` both
519
+ unset), it runs **Qwen2.5-Coder-1.5B-Instruct (Q5_K_M GGUF)** directly — small,
520
+ code-specialized, fast on CPU, no API key, no Ollama, no HTTP overhead. The
521
+ 6-layer contract is what makes a 1.5B usable: it lifts the same model from ~34%
522
+ to ~88% pass-rate on the local benchmark.
523
+
524
+ ```bash
525
+ pip install 'simplicio-cli[local]' # pulls llama-cpp-python + huggingface-hub
526
+
527
+ simplicio task "add input validation to createUser" \
528
+ --target src/users.ts --local # forces the local model
529
+
530
+ # the GGUF is fetched once from the Hugging Face Hub, then cached + reused
531
+ ```
532
+
533
+ Explicit routes (override the default model/weights):
534
+
535
+ ```bash
536
+ SIMPLICIO_MODEL=local-llama/default # bundled default
537
+ SIMPLICIO_MODEL=local-llama/bartowski/Qwen2.5-Coder-7B-Instruct-GGUF::Qwen2.5-Coder-7B-Instruct-Q4_K_M.gguf
538
+ SIMPLICIO_MODEL=local-llama//models/my-model.gguf # direct local path
539
+ SIMPLICIO_LOCAL_MODEL_PATH=/models/my-model.gguf # always wins
540
+ ```
541
+
542
+ Tuning knobs (all optional): `SIMPLICIO_LOCAL_CTX` (context window, default
543
+ `8192`), `SIMPLICIO_LOCAL_THREADS`, `SIMPLICIO_LOCAL_GPU_LAYERS` (offload to GPU,
544
+ default `0`), `SIMPLICIO_LOCAL_MAX_TOKENS` (generation cap),
545
+ `SIMPLICIO_LOCAL_TEMP` (default `0.1`), `SIMPLICIO_LOCAL_MODEL_REPO` /
546
+ `SIMPLICIO_LOCAL_MODEL_FILE`.
547
+
511
548
  ### The pipeline (both paths)
512
549
 
513
550
  Whichever entry point you use, each task runs through the same engine:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "simplicio-cli"
3
- version = "0.4.3"
3
+ version = "0.5.1"
4
4
  description = "Portable task-to-code pipeline that works with any LLM. Turn a one-line task into a verified code change — diff + test + verify loop. +55 pts on a 156-check benchmark, 21% faster, ~same tokens."
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -50,10 +50,14 @@ dependencies = [
50
50
  "httpx>=0.27",
51
51
  "orjson>=3.10",
52
52
  "diskcache>=5.6",
53
+ "libcst>=1.8",
53
54
  ]
54
55
 
55
56
  [project.optional-dependencies]
56
57
  bench = ["fpdf2>=2.7"]
58
+ # Offline-first in-process inference (Path 4). Pulls the llama.cpp Python
59
+ # bindings plus huggingface-hub to fetch the default Qwen2.5-Coder-1.5B GGUF.
60
+ local = ["llama-cpp-python>=0.3.2", "huggingface-hub>=0.23"]
57
61
 
58
62
  [project.urls]
59
63
  Homepage = "https://github.com/wesleysimplicio/simplicio-cli"
@@ -73,7 +77,16 @@ where = ["."]
73
77
  include = ["simplicio*"]
74
78
 
75
79
  [tool.setuptools.package-data]
76
- simplicio = ["templates/*.md", "templates/*.sh"]
80
+ simplicio = [
81
+ "templates/*.md",
82
+ "templates/*.sh",
83
+ "templates/recipes/**/*.json",
84
+ "templates/recipes/**/*.yaml",
85
+ "templates/recipes/**/*.yml",
86
+ "templates/stacks/**/*",
87
+ "templates/stacks/*/tree/.gitignore",
88
+ "templates/stacks/*/tree/.eslintrc.json",
89
+ ]
77
90
 
78
91
  [tool.pytest.ini_options]
79
92
  pythonpath = ["."]
@@ -0,0 +1 @@
1
+ __version__ = "0.5.1"
@@ -0,0 +1,269 @@
1
+ """Content-addressed completion cache for provider outputs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import os
8
+ import shutil
9
+ import tempfile
10
+ import time
11
+ from dataclasses import dataclass, field
12
+ from pathlib import Path
13
+ from typing import Any, Dict, Optional
14
+
15
+
16
+ def _env_flag(name: str, default: bool) -> bool:
17
+ raw = os.environ.get(name)
18
+ if raw is None:
19
+ return default
20
+ return raw.strip().lower() not in {"0", "false", "no", "off"}
21
+
22
+
23
+ def _env_float(name: str, default: float) -> float:
24
+ raw = os.environ.get(name)
25
+ if raw is None or not raw.strip():
26
+ return default
27
+ try:
28
+ return float(raw)
29
+ except ValueError:
30
+ return default
31
+
32
+
33
+ def _cache_root() -> Path:
34
+ override = os.environ.get("SIMPLICIO_CACHE_DIR")
35
+ if override:
36
+ return Path(override)
37
+ return Path.home() / ".simplicio" / "cache"
38
+
39
+
40
+ def make_key(provider_id: str, model: str, prompt: str, **kwargs: Any) -> str:
41
+ payload = {
42
+ "v": 1,
43
+ "provider_id": provider_id,
44
+ "model": model,
45
+ "prompt": prompt,
46
+ "kwargs": kwargs,
47
+ }
48
+ raw = json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
49
+ return hashlib.sha256(raw.encode("utf-8")).hexdigest()
50
+
51
+
52
+ @dataclass
53
+ class CacheEntry:
54
+ completion: str
55
+ provider_id: str = ""
56
+ model: str = ""
57
+ created_at: float = field(default_factory=time.time)
58
+ metadata: Dict[str, Any] = field(default_factory=dict)
59
+
60
+ def to_dict(self) -> Dict[str, Any]:
61
+ return {
62
+ "completion": self.completion,
63
+ "provider_id": self.provider_id,
64
+ "model": self.model,
65
+ "created_at": self.created_at,
66
+ "metadata": dict(self.metadata),
67
+ }
68
+
69
+ @classmethod
70
+ def from_dict(cls, payload: Dict[str, Any]) -> "CacheEntry":
71
+ return cls(
72
+ completion=str(payload.get("completion", "")),
73
+ provider_id=str(payload.get("provider_id", "")),
74
+ model=str(payload.get("model", "")),
75
+ created_at=float(payload.get("created_at") or time.time()),
76
+ metadata=dict(payload.get("metadata") or {}),
77
+ )
78
+
79
+
80
+ class CompletionCache:
81
+ def __init__(
82
+ self,
83
+ root: Optional[Path] = None,
84
+ *,
85
+ ttl_days: Optional[float] = None,
86
+ max_mb: Optional[float] = None,
87
+ ) -> None:
88
+ self.root = Path(root) if root is not None else _cache_root()
89
+ self.ttl_days = (
90
+ ttl_days
91
+ if ttl_days is not None
92
+ else _env_float("SIMPLICIO_CACHE_TTL_DAYS", 30)
93
+ )
94
+ self.max_mb = (
95
+ max_mb if max_mb is not None else _env_float("SIMPLICIO_CACHE_MAX_MB", 500)
96
+ )
97
+ self.hits = 0
98
+ self.misses = 0
99
+ self.puts = 0
100
+
101
+ @property
102
+ def enabled(self) -> bool:
103
+ return _env_flag("SIMPLICIO_CACHE", True)
104
+
105
+ @property
106
+ def bust(self) -> bool:
107
+ return _env_flag("SIMPLICIO_BUST_CACHE", False)
108
+
109
+ def path_for(self, key: str) -> Path:
110
+ return self.root / key[:2] / f"{key}.json"
111
+
112
+ def get(self, key: str) -> Optional[CacheEntry]:
113
+ if not self.enabled or self.bust:
114
+ self.misses += 1
115
+ return None
116
+ path = self.path_for(key)
117
+ try:
118
+ if not path.exists():
119
+ self.misses += 1
120
+ return None
121
+ if self._is_expired(path):
122
+ self._safe_unlink(path)
123
+ self.misses += 1
124
+ return None
125
+ except OSError:
126
+ self.misses += 1
127
+ return None
128
+ try:
129
+ with path.open("r", encoding="utf-8") as handle:
130
+ entry = CacheEntry.from_dict(json.load(handle))
131
+ self.hits += 1
132
+ return entry
133
+ except (OSError, ValueError, TypeError):
134
+ self._safe_unlink(path)
135
+ self.misses += 1
136
+ return None
137
+
138
+ def put(self, key: str, entry: CacheEntry) -> None:
139
+ if not self.enabled:
140
+ return
141
+ path = self.path_for(key)
142
+ try:
143
+ path.parent.mkdir(parents=True, exist_ok=True)
144
+ fd, tmp_name = tempfile.mkstemp(
145
+ prefix=f".{path.stem}.",
146
+ suffix=".tmp",
147
+ dir=str(path.parent),
148
+ )
149
+ except OSError:
150
+ return
151
+ try:
152
+ with os.fdopen(fd, "w", encoding="utf-8") as handle:
153
+ json.dump(entry.to_dict(), handle, sort_keys=True)
154
+ try:
155
+ os.replace(tmp_name, path)
156
+ except OSError:
157
+ return
158
+ finally:
159
+ if os.path.exists(tmp_name):
160
+ self._safe_unlink(Path(tmp_name))
161
+ self.puts += 1
162
+ self._evict_if_needed()
163
+
164
+ def clear(self) -> int:
165
+ n = self.stats()["entries"]
166
+ if self.root.exists():
167
+ shutil.rmtree(self.root)
168
+ return int(n)
169
+
170
+ def stats(self) -> Dict[str, Any]:
171
+ files = list(self._files())
172
+ total_bytes = sum(path.stat().st_size for path in files if path.exists())
173
+ now = time.time()
174
+ oldest = None
175
+ if files:
176
+ oldest = max(0.0, now - min(path.stat().st_mtime for path in files))
177
+ return {
178
+ "enabled": self.enabled,
179
+ "bust": self.bust,
180
+ "root": str(self.root),
181
+ "entries": len(files),
182
+ "hits": self.hits,
183
+ "misses": self.misses,
184
+ "puts": self.puts,
185
+ "hit_rate": round(self.hits / (self.hits + self.misses), 4)
186
+ if self.hits + self.misses
187
+ else 0.0,
188
+ "bytes": total_bytes,
189
+ "mb": round(total_bytes / (1024 * 1024), 3),
190
+ "oldest_age_s": round(oldest, 3) if oldest is not None else None,
191
+ "ttl_days": self.ttl_days,
192
+ "max_mb": self.max_mb,
193
+ }
194
+
195
+ def _files(self) -> list[Path]:
196
+ try:
197
+ if not self.root.exists():
198
+ return []
199
+ return [
200
+ path
201
+ for path in self.root.rglob("*.json")
202
+ if path.is_file() and _is_completion_cache_file(self.root, path)
203
+ ]
204
+ except OSError:
205
+ return []
206
+
207
+ def _is_expired(self, path: Path) -> bool:
208
+ if self.ttl_days <= 0:
209
+ return False
210
+ max_age = self.ttl_days * 86400
211
+ return (time.time() - path.stat().st_mtime) > max_age
212
+
213
+ def _evict_if_needed(self) -> None:
214
+ max_bytes = int(max(0.0, self.max_mb) * 1024 * 1024)
215
+ if max_bytes <= 0:
216
+ return
217
+ files = self._files()
218
+ total = sum(path.stat().st_size for path in files if path.exists())
219
+ if total <= max_bytes:
220
+ return
221
+ for path in sorted(files, key=lambda p: p.stat().st_mtime):
222
+ size = path.stat().st_size
223
+ self._safe_unlink(path)
224
+ total -= size
225
+ if total <= max_bytes:
226
+ break
227
+
228
+ @staticmethod
229
+ def _safe_unlink(path: Path) -> None:
230
+ try:
231
+ path.unlink()
232
+ except OSError:
233
+ return
234
+
235
+
236
+ _cache: Optional[CompletionCache] = None
237
+
238
+
239
+ def cache() -> CompletionCache:
240
+ global _cache
241
+ if _cache is None:
242
+ _cache = CompletionCache()
243
+ return _cache
244
+
245
+
246
+ def _is_completion_cache_file(root: Path, path: Path) -> bool:
247
+ try:
248
+ rel = path.relative_to(root)
249
+ except ValueError:
250
+ return False
251
+ return (
252
+ len(rel.parts) == 2
253
+ and len(path.stem) == 64
254
+ and rel.parts[0] == path.stem[:2]
255
+ )
256
+
257
+
258
+ def reset_for_tests() -> None:
259
+ global _cache
260
+ _cache = None
261
+
262
+
263
+ __all__ = [
264
+ "CacheEntry",
265
+ "CompletionCache",
266
+ "cache",
267
+ "make_key",
268
+ "reset_for_tests",
269
+ ]
@@ -0,0 +1,68 @@
1
+ """cache_cli.py — `simplicio cache` subcommand (stats / clear).
2
+
3
+ Lightweight management surface for the content-addressed completion cache
4
+ landed by issue #34.
5
+
6
+ simplicio cache stats print hit/miss/size/oldest
7
+ simplicio cache clear wipe cache directory
8
+ simplicio cache stats --json machine-readable
9
+ """
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import json
14
+ import sys
15
+
16
+ from ._cache import cache
17
+
18
+
19
+ def _cmd_stats(args: argparse.Namespace) -> int:
20
+ s = cache().stats()
21
+ if args.json:
22
+ print(json.dumps({
23
+ "entries": s.entries,
24
+ "size_bytes": s.size_bytes,
25
+ "size_mb": round(s.size_bytes / (1024 * 1024), 2),
26
+ "oldest_age_days": s.oldest_age_days,
27
+ "enabled": s.enabled,
28
+ "bust_active": s.bust_active,
29
+ "root": s.root,
30
+ }, indent=2))
31
+ return 0
32
+ print(f"simplicio cache stats")
33
+ print(f" root {s.root}")
34
+ print(f" enabled {'yes' if s.enabled else 'no (SIMPLICIO_CACHE=0)'}")
35
+ print(f" bust active {'YES (SIMPLICIO_BUST_CACHE=1)' if s.bust_active else 'no'}")
36
+ print(f" entries {s.entries}")
37
+ print(f" size {s.size_bytes / (1024 * 1024):.2f} MB")
38
+ print(f" oldest entry {s.oldest_age_days} days")
39
+ return 0
40
+
41
+
42
+ def _cmd_clear(args: argparse.Namespace) -> int:
43
+ if not args.force:
44
+ print("[cache] refusing to clear without --force; "
45
+ "this removes every cached completion.", file=sys.stderr)
46
+ return 2
47
+ removed = cache().clear()
48
+ print(f"[cache] cleared {removed} entries", file=sys.stderr)
49
+ return 0
50
+
51
+
52
+ def main(argv: list[str] | None = None) -> int:
53
+ p = argparse.ArgumentParser(prog="simplicio cache")
54
+ sub = p.add_subparsers(dest="verb", required=True)
55
+
56
+ ps = sub.add_parser("stats", help="show cache size/age/state")
57
+ ps.add_argument("--json", action="store_true")
58
+
59
+ pc = sub.add_parser("clear", help="remove every cached completion")
60
+ pc.add_argument("--force", action="store_true",
61
+ help="required: confirm destructive op")
62
+
63
+ args = p.parse_args(argv)
64
+ if args.verb == "stats":
65
+ return _cmd_stats(args)
66
+ if args.verb == "clear":
67
+ return _cmd_clear(args)
68
+ return 2