simplicio-cli 0.4.2__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (364) hide show
  1. {simplicio_cli-0.4.2/simplicio_cli.egg-info → simplicio_cli-0.5.0}/PKG-INFO +45 -4
  2. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/README.md +38 -1
  3. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/pyproject.toml +17 -4
  4. simplicio_cli-0.5.0/simplicio/__init__.py +1 -0
  5. simplicio_cli-0.5.0/simplicio/_cache.py +253 -0
  6. simplicio_cli-0.5.0/simplicio/cli.py +235 -0
  7. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/pipeline.py +21 -1
  8. simplicio_cli-0.5.0/simplicio/pipeline_fixers.py +287 -0
  9. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/precedent.py +76 -23
  10. simplicio_cli-0.5.0/simplicio/providers.py +560 -0
  11. simplicio_cli-0.5.0/simplicio/scratch/__init__.py +16 -0
  12. simplicio_cli-0.5.0/simplicio/scratch/_pipeline_adapter.py +76 -0
  13. simplicio_cli-0.5.0/simplicio/scratch/cli.py +496 -0
  14. simplicio_cli-0.5.0/simplicio/scratch/codegen/__init__.py +30 -0
  15. simplicio_cli-0.5.0/simplicio/scratch/codegen/go_gin.py +220 -0
  16. simplicio_cli-0.5.0/simplicio/scratch/codegen/php_laravel.py +146 -0
  17. simplicio_cli-0.5.0/simplicio/scratch/codegen/python_cst.py +149 -0
  18. simplicio_cli-0.5.0/simplicio/scratch/codegen/python_fastapi.py +397 -0
  19. simplicio_cli-0.5.0/simplicio/scratch/codegen/python_orm.py +336 -0
  20. simplicio_cli-0.5.0/simplicio/scratch/codegen/python_pydantic.py +527 -0
  21. simplicio_cli-0.5.0/simplicio/scratch/codegen/python_pytest.py +516 -0
  22. simplicio_cli-0.5.0/simplicio/scratch/codegen/registry.py +53 -0
  23. simplicio_cli-0.5.0/simplicio/scratch/codegen/rust_axum.py +257 -0
  24. simplicio_cli-0.5.0/simplicio/scratch/codegen/types.py +31 -0
  25. simplicio_cli-0.5.0/simplicio/scratch/codegen/typescript_next_page.py +207 -0
  26. simplicio_cli-0.5.0/simplicio/scratch/codegen/typescript_next_route.py +334 -0
  27. simplicio_cli-0.5.0/simplicio/scratch/executor.py +388 -0
  28. simplicio_cli-0.5.0/simplicio/scratch/plan_schema.py +232 -0
  29. simplicio_cli-0.5.0/simplicio/scratch/planner.py +189 -0
  30. simplicio_cli-0.5.0/simplicio/scratch/recipes.py +432 -0
  31. simplicio_cli-0.5.0/simplicio/scratch/skill_opt.py +215 -0
  32. simplicio_cli-0.5.0/simplicio/scratch/stack_registry.py +186 -0
  33. simplicio_cli-0.5.0/simplicio/templates/recipes/go-gin/crud-resource.yaml +34 -0
  34. simplicio_cli-0.5.0/simplicio/templates/recipes/php-laravel/crud-resource.yaml +34 -0
  35. simplicio_cli-0.5.0/simplicio/templates/recipes/py-fastapi/admin-crud.yaml +55 -0
  36. simplicio_cli-0.5.0/simplicio/templates/recipes/py-fastapi/auth-jwt.yaml +54 -0
  37. simplicio_cli-0.5.0/simplicio/templates/recipes/py-fastapi/crud-resource.yaml +66 -0
  38. simplicio_cli-0.5.0/simplicio/templates/recipes/rust-axum/crud-resource.yaml +34 -0
  39. simplicio_cli-0.5.0/simplicio/templates/recipes/ts-nextjs/admin-crud.yaml +42 -0
  40. simplicio_cli-0.5.0/simplicio/templates/recipes/ts-nextjs/auth-jwt.yaml +41 -0
  41. simplicio_cli-0.5.0/simplicio/templates/recipes/ts-nextjs/crud-resource.yaml +47 -0
  42. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/README.md +24 -0
  43. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/practices.md +20 -0
  44. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/stack.json +13 -0
  45. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/tree/README.md +13 -0
  46. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/tree/bin/app.sh +15 -0
  47. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/tree/test/app.bats +11 -0
  48. simplicio_cli-0.5.0/simplicio/templates/stacks/bash-cli/verify.json +6 -0
  49. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/README.md +25 -0
  50. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/practices.md +20 -0
  51. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/stack.json +13 -0
  52. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/tree/README.md +13 -0
  53. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/App.Api.csproj +7 -0
  54. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/Program.cs +8 -0
  55. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/App.Tests.csproj +13 -0
  56. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/HealthTests.cs +10 -0
  57. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-aspnet/verify.json +6 -0
  58. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/README.md +25 -0
  59. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/practices.md +20 -0
  60. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/stack.json +13 -0
  61. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/README.md +13 -0
  62. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/App.Web.csproj +7 -0
  63. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/App.razor +5 -0
  64. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/Pages/Home.razor +6 -0
  65. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Program.cs +12 -0
  66. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/App.Tests.csproj +13 -0
  67. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/HealthTests.cs +10 -0
  68. simplicio_cli-0.5.0/simplicio/templates/stacks/csharp-blazor/verify.json +6 -0
  69. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/README.md +25 -0
  70. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/practices.md +20 -0
  71. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/stack.json +13 -0
  72. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/tree/README.md +14 -0
  73. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/tree/lib/main.dart +18 -0
  74. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/tree/pubspec.yaml +18 -0
  75. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/tree/test/widget_test.dart +11 -0
  76. simplicio_cli-0.5.0/simplicio/templates/stacks/dart-flutter/verify.json +6 -0
  77. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/README.md +25 -0
  78. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/practices.md +20 -0
  79. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/stack.json +13 -0
  80. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/README.md +13 -0
  81. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/config/config.exs +7 -0
  82. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/lib/app/application.ex +12 -0
  83. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/controllers/health_controller.ex +7 -0
  84. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/endpoint.ex +5 -0
  85. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/router.ex +13 -0
  86. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/mix.exs +26 -0
  87. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/test/health_controller_test.exs +7 -0
  88. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/tree/test/test_helper.exs +1 -0
  89. simplicio_cli-0.5.0/simplicio/templates/stacks/elixir-phoenix/verify.json +6 -0
  90. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/README.md +25 -0
  91. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/practices.md +20 -0
  92. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/stack.json +13 -0
  93. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/tree/README.md +13 -0
  94. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/tree/cmd/root.go +30 -0
  95. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/tree/cmd/root_test.go +19 -0
  96. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/tree/go.mod +8 -0
  97. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/tree/main.go +7 -0
  98. simplicio_cli-0.5.0/simplicio/templates/stacks/go-cli/verify.json +6 -0
  99. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/README.md +26 -0
  100. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/practices.md +20 -0
  101. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/stack.json +13 -0
  102. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/tree/README.md +13 -0
  103. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/tree/cmd/server/main.go +13 -0
  104. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/tree/go.mod +5 -0
  105. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/tree/internal/http/router.go +15 -0
  106. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/tree/internal/http/router_test.go +19 -0
  107. simplicio_cli-0.5.0/simplicio/templates/stacks/go-echo/verify.json +6 -0
  108. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/README.md +33 -0
  109. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/practices.md +28 -0
  110. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/stack.json +13 -0
  111. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/tree/README.md +10 -0
  112. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/tree/cmd/server/main.go +14 -0
  113. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/tree/go.mod +5 -0
  114. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/tree/internal/http/router.go +18 -0
  115. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/tree/internal/http/router_test.go +22 -0
  116. simplicio_cli-0.5.0/simplicio/templates/stacks/go-gin/verify.json +6 -0
  117. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/README.md +26 -0
  118. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/practices.md +20 -0
  119. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/stack.json +13 -0
  120. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/README.md +12 -0
  121. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/build.gradle.kts +18 -0
  122. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/settings.gradle.kts +13 -0
  123. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/Application.java +11 -0
  124. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/HealthController.java +13 -0
  125. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/tree/src/test/java/com/example/HealthControllerTest.java +12 -0
  126. simplicio_cli-0.5.0/simplicio/templates/stacks/java-spring/verify.json +6 -0
  127. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/README.md +26 -0
  128. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/practices.md +20 -0
  129. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/stack.json +14 -0
  130. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/tree/README.md +14 -0
  131. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/tree/package.json +19 -0
  132. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/tree/src/app.js +12 -0
  133. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/tree/src/server.js +7 -0
  134. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/tree/tests/health.test.js +18 -0
  135. simplicio_cli-0.5.0/simplicio/templates/stacks/js-express/verify.json +6 -0
  136. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/README.md +26 -0
  137. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/practices.md +20 -0
  138. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/stack.json +13 -0
  139. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/README.md +12 -0
  140. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/app/build.gradle.kts +23 -0
  141. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/app/src/main/AndroidManifest.xml +10 -0
  142. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/app/src/main/java/com/example/app/MainActivity.kt +15 -0
  143. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/app/src/main/res/values/styles.xml +3 -0
  144. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/app/src/test/java/com/example/app/SmokeTest.kt +11 -0
  145. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/build.gradle.kts +4 -0
  146. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/tree/settings.gradle.kts +18 -0
  147. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-android/verify.json +6 -0
  148. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/README.md +25 -0
  149. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/practices.md +20 -0
  150. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/stack.json +13 -0
  151. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/tree/README.md +12 -0
  152. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/tree/build.gradle.kts +19 -0
  153. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/tree/settings.gradle.kts +13 -0
  154. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/tree/src/main/kotlin/com/example/Application.kt +22 -0
  155. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/tree/src/test/kotlin/com/example/ApplicationTest.kt +18 -0
  156. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-ktor/verify.json +6 -0
  157. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/README.md +26 -0
  158. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/practices.md +20 -0
  159. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/stack.json +13 -0
  160. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/README.md +12 -0
  161. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/build.gradle.kts +16 -0
  162. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/settings.gradle.kts +13 -0
  163. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/Application.kt +11 -0
  164. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/HealthController.kt +10 -0
  165. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/tree/src/test/kotlin/com/example/HealthControllerTest.kt +11 -0
  166. simplicio_cli-0.5.0/simplicio/templates/stacks/kotlin-spring/verify.json +6 -0
  167. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/README.md +35 -0
  168. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/practices.md +31 -0
  169. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/stack.json +13 -0
  170. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/README.md +11 -0
  171. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/artisan +14 -0
  172. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/bootstrap/app.php +19 -0
  173. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/composer.json +29 -0
  174. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/phpunit.xml +17 -0
  175. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/routes/api.php +7 -0
  176. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/routes/console.php +7 -0
  177. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/tests/Feature/HealthTest.php +15 -0
  178. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/tree/tests/TestCase.php +10 -0
  179. simplicio_cli-0.5.0/simplicio/templates/stacks/php-laravel/verify.json +6 -0
  180. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/README.md +26 -0
  181. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/practices.md +20 -0
  182. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/stack.json +13 -0
  183. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/tree/README.md +13 -0
  184. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/tree/composer.json +23 -0
  185. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/tree/src/Controller/HealthController.php +17 -0
  186. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/tree/tests/HealthControllerTest.php +19 -0
  187. simplicio_cli-0.5.0/simplicio/templates/stacks/php-symfony/verify.json +6 -0
  188. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/README.md +27 -0
  189. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/practices.md +20 -0
  190. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/stack.json +13 -0
  191. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/tree/README.md +13 -0
  192. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/tree/composer.json +22 -0
  193. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/tree/phpunit.xml +8 -0
  194. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/tree/src/Health.php +13 -0
  195. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/tree/tests/HealthTest.php +16 -0
  196. simplicio_cli-0.5.0/simplicio/templates/stacks/php-vanilla/verify.json +6 -0
  197. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/README.md +26 -0
  198. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/practices.md +20 -0
  199. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/stack.json +13 -0
  200. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/tree/README.md +14 -0
  201. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/tree/pyproject.toml +16 -0
  202. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/tree/src/app/cli.py +19 -0
  203. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/tree/tests/test_cli.py +10 -0
  204. simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/verify.json +6 -0
  205. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/README.md +28 -0
  206. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/practices.md +21 -0
  207. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/stack.json +13 -0
  208. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/README.md +14 -0
  209. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/app/__init__.py +1 -0
  210. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/app/apps.py +6 -0
  211. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/app/tests.py +9 -0
  212. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/app/views.py +7 -0
  213. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/config/__init__.py +1 -0
  214. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/config/asgi.py +3 -0
  215. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/config/settings.py +18 -0
  216. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/config/urls.py +8 -0
  217. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/config/wsgi.py +3 -0
  218. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/manage.py +14 -0
  219. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/tree/pyproject.toml +9 -0
  220. simplicio_cli-0.5.0/simplicio/templates/stacks/py-django/verify.json +6 -0
  221. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/README.md +51 -0
  222. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/practices.md +55 -0
  223. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/stack.json +13 -0
  224. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/.gitignore +11 -0
  225. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/README.template.md +35 -0
  226. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/pyproject.toml +29 -0
  227. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/ruff.toml +9 -0
  228. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/src/api/__init__.py +1 -0
  229. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/src/main.py +24 -0
  230. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/tree/tests/test_health.py +11 -0
  231. simplicio_cli-0.5.0/simplicio/templates/stacks/py-fastapi/verify.json +6 -0
  232. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/README.md +27 -0
  233. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/practices.md +21 -0
  234. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/stack.json +13 -0
  235. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/tree/README.md +14 -0
  236. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/tree/pyproject.toml +13 -0
  237. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/tree/ruff.toml +2 -0
  238. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/tree/src/app.py +11 -0
  239. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/tree/tests/test_health.py +10 -0
  240. simplicio_cli-0.5.0/simplicio/templates/stacks/py-flask/verify.json +6 -0
  241. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/README.md +28 -0
  242. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/practices.md +20 -0
  243. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/stack.json +14 -0
  244. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/README.md +14 -0
  245. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/index.html +12 -0
  246. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/package.json +28 -0
  247. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/src/App.test.tsx +12 -0
  248. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/src/App.tsx +8 -0
  249. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/src/main.tsx +10 -0
  250. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/tree/tsconfig.json +14 -0
  251. simplicio_cli-0.5.0/simplicio/templates/stacks/react-vite/verify.json +7 -0
  252. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/README.md +26 -0
  253. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/practices.md +20 -0
  254. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/stack.json +13 -0
  255. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/Gemfile +10 -0
  256. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/README.md +13 -0
  257. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/app/controllers/health_controller.rb +5 -0
  258. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/bin/rails +4 -0
  259. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/config/application.rb +8 -0
  260. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/config/boot.rb +2 -0
  261. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/config/routes.rb +3 -0
  262. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/test/controllers/health_controller_test.rb +10 -0
  263. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/tree/test/test_helper.rb +3 -0
  264. simplicio_cli-0.5.0/simplicio/templates/stacks/ruby-rails/verify.json +6 -0
  265. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/README.md +32 -0
  266. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/practices.md +30 -0
  267. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/stack.json +13 -0
  268. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/tree/Cargo.toml +12 -0
  269. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/tree/README.md +11 -0
  270. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/tree/src/main.rs +43 -0
  271. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-axum/verify.json +6 -0
  272. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/README.md +24 -0
  273. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/practices.md +20 -0
  274. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/stack.json +13 -0
  275. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/tree/Cargo.toml +8 -0
  276. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/tree/README.md +13 -0
  277. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/tree/src/main.rs +28 -0
  278. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-cli/verify.json +6 -0
  279. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/README.md +24 -0
  280. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/practices.md +20 -0
  281. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/stack.json +13 -0
  282. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/tree/Cargo.toml +7 -0
  283. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/tree/README.md +13 -0
  284. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/tree/src/main.rs +29 -0
  285. simplicio_cli-0.5.0/simplicio/templates/stacks/rust-leptos/verify.json +6 -0
  286. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/README.md +25 -0
  287. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/practices.md +20 -0
  288. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/stack.json +13 -0
  289. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/tree/README.md +12 -0
  290. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/tree/Sources/App/App.swift +10 -0
  291. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/tree/Sources/App/ContentView.swift +12 -0
  292. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/tree/Tests/AppTests/AppTests.swift +7 -0
  293. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-ios/verify.json +6 -0
  294. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/README.md +25 -0
  295. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/practices.md +20 -0
  296. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/stack.json +13 -0
  297. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/tree/Package.swift +17 -0
  298. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/tree/README.md +13 -0
  299. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/tree/Sources/App/main.swift +11 -0
  300. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/tree/Tests/AppTests/HealthTests.swift +7 -0
  301. simplicio_cli-0.5.0/simplicio/templates/stacks/swift-vapor/verify.json +6 -0
  302. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/README.md +28 -0
  303. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/practices.md +20 -0
  304. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/stack.json +14 -0
  305. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/README.md +14 -0
  306. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/package.json +30 -0
  307. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.spec.ts +7 -0
  308. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.ts +9 -0
  309. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/src/app.module.ts +8 -0
  310. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/src/main.ts +13 -0
  311. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/tree/tsconfig.json +14 -0
  312. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nestjs/verify.json +7 -0
  313. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/README.md +36 -0
  314. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/practices.md +37 -0
  315. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/stack.json +14 -0
  316. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/.eslintrc.json +3 -0
  317. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/.gitignore +9 -0
  318. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/next.config.mjs +6 -0
  319. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/package.json +30 -0
  320. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/pnpm-workspace.yaml +3 -0
  321. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/src/app/layout.tsx +14 -0
  322. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/src/app/page.tsx +8 -0
  323. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/tree/tsconfig.json +21 -0
  324. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-nextjs/verify.json +7 -0
  325. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/README.md +27 -0
  326. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/practices.md +20 -0
  327. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/stack.json +14 -0
  328. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/README.md +14 -0
  329. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/app/root.tsx +16 -0
  330. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/app/routes/_index.tsx +8 -0
  331. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/app/routes/health.test.ts +11 -0
  332. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/app/routes/health.ts +5 -0
  333. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/package.json +27 -0
  334. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/tree/tsconfig.json +14 -0
  335. simplicio_cli-0.5.0/simplicio/templates/stacks/ts-remix/verify.json +7 -0
  336. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0/simplicio_cli.egg-info}/PKG-INFO +45 -4
  337. simplicio_cli-0.5.0/simplicio_cli.egg-info/SOURCES.txt +358 -0
  338. simplicio_cli-0.5.0/simplicio_cli.egg-info/dependency_links.txt +1 -0
  339. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio_cli.egg-info/requires.txt +7 -2
  340. simplicio_cli-0.4.2/simplicio/__init__.py +0 -1
  341. simplicio_cli-0.4.2/simplicio/cli.py +0 -150
  342. simplicio_cli-0.4.2/simplicio/providers.py +0 -142
  343. simplicio_cli-0.4.2/simplicio_cli.egg-info/SOURCES.txt +0 -30
  344. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/LICENSE +0 -0
  345. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/setup.cfg +0 -0
  346. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/adaptive.py +0 -0
  347. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/bench.py +0 -0
  348. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/cache.py +0 -0
  349. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/detect.py +0 -0
  350. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/init.py +0 -0
  351. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/mapper.py +0 -0
  352. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/observability.py +0 -0
  353. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/prompt.py +0 -0
  354. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/skill_router.py +0 -0
  355. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/templates/SKILL.md +0 -0
  356. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/templates/simplicio_prompt.md +0 -0
  357. /simplicio_cli-0.4.2/simplicio_cli.egg-info/dependency_links.txt → /simplicio_cli-0.5.0/simplicio/templates/stacks/py-cli/tree/src/app/__init__.py +0 -0
  358. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/templates/userpromptsubmit-hook.sh +0 -0
  359. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/utils/__init__.py +0 -0
  360. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/utils/cache.py +0 -0
  361. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/utils/http_client.py +0 -0
  362. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio/utils/serialization.py +0 -0
  363. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/simplicio_cli.egg-info/entry_points.txt +0 -0
  364. {simplicio_cli-0.4.2 → simplicio_cli-0.5.0}/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.2
3
+ Version: 0.5.0
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
@@ -31,13 +31,17 @@ Requires-Dist: sentence-transformers>=2.2
31
31
  Requires-Dist: numpy>=1.23
32
32
  Requires-Dist: anthropic>=0.30
33
33
  Requires-Dist: openai>=1.30
34
- Requires-Dist: simplicio-mapper>=0.6.0
35
- Requires-Dist: simplicio-prompt>=1.9.0
34
+ Requires-Dist: simplicio-mapper>=0.6.1
35
+ 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.2"
3
+ version = "0.5.0"
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" }
@@ -45,15 +45,19 @@ dependencies = [
45
45
  "numpy>=1.23",
46
46
  "anthropic>=0.30",
47
47
  "openai>=1.30",
48
- "simplicio-mapper>=0.6.0",
49
- "simplicio-prompt>=1.9.0",
48
+ "simplicio-mapper>=0.6.1",
49
+ "simplicio-prompt>=1.12.0",
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.0"
@@ -0,0 +1,253 @@
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 [path for path in self.root.rglob("*.json") if path.is_file()]
200
+ except OSError:
201
+ return []
202
+
203
+ def _is_expired(self, path: Path) -> bool:
204
+ if self.ttl_days <= 0:
205
+ return False
206
+ max_age = self.ttl_days * 86400
207
+ return (time.time() - path.stat().st_mtime) > max_age
208
+
209
+ def _evict_if_needed(self) -> None:
210
+ max_bytes = int(max(0.0, self.max_mb) * 1024 * 1024)
211
+ if max_bytes <= 0:
212
+ return
213
+ files = self._files()
214
+ total = sum(path.stat().st_size for path in files if path.exists())
215
+ if total <= max_bytes:
216
+ return
217
+ for path in sorted(files, key=lambda p: p.stat().st_mtime):
218
+ size = path.stat().st_size
219
+ self._safe_unlink(path)
220
+ total -= size
221
+ if total <= max_bytes:
222
+ break
223
+
224
+ @staticmethod
225
+ def _safe_unlink(path: Path) -> None:
226
+ try:
227
+ path.unlink()
228
+ except OSError:
229
+ return
230
+
231
+
232
+ _cache: Optional[CompletionCache] = None
233
+
234
+
235
+ def cache() -> CompletionCache:
236
+ global _cache
237
+ if _cache is None:
238
+ _cache = CompletionCache()
239
+ return _cache
240
+
241
+
242
+ def reset_for_tests() -> None:
243
+ global _cache
244
+ _cache = None
245
+
246
+
247
+ __all__ = [
248
+ "CacheEntry",
249
+ "CompletionCache",
250
+ "cache",
251
+ "make_key",
252
+ "reset_for_tests",
253
+ ]
@@ -0,0 +1,235 @@
1
+ """CLI entrypoint for simplicio."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import json
7
+ import os
8
+ import sys
9
+ from pathlib import Path
10
+
11
+
12
+ def maybe_autoinstall(cmd: str | None) -> bool:
13
+ """Install skill + hook on first run when Claude Code is detected."""
14
+ if os.environ.get("SIMPLICIO_SKIP_AUTO_INIT"):
15
+ return False
16
+ if cmd in ("init", "detect"):
17
+ return False
18
+ home = Path(os.environ["HOME"]) if os.environ.get("HOME") else Path.home()
19
+ claude_home = home / ".claude"
20
+ if not claude_home.is_dir():
21
+ return False
22
+ hook_path = claude_home / "hooks" / "simplicio-userpromptsubmit.sh"
23
+ if hook_path.exists():
24
+ return False
25
+ try:
26
+ from .init import install
27
+
28
+ report = install(claude_home=claude_home, dry_run=False)
29
+ except Exception as e:
30
+ print(f"simplicio: auto-activation skipped ({e})", file=sys.stderr)
31
+ return False
32
+ if (
33
+ report.skill_installed
34
+ or report.hook_script_installed
35
+ or report.settings_updated
36
+ ):
37
+ print(
38
+ "simplicio: auto-activation installed in Claude Code "
39
+ "(skill + UserPromptSubmit hook). "
40
+ "Disable next time with SIMPLICIO_SKIP_AUTO_INIT=1.",
41
+ file=sys.stderr,
42
+ )
43
+ return True
44
+ return False
45
+
46
+
47
+ def _dispatch_nested(argv: list[str]) -> int | None:
48
+ if argv and argv[0] == "scratch":
49
+ maybe_autoinstall("scratch")
50
+ from .scratch.cli import main as scratch_main
51
+
52
+ return scratch_main(argv[1:])
53
+ if argv and argv[0] == "skill":
54
+ maybe_autoinstall("skill")
55
+ args = argv[1:]
56
+ if not args or args[0] != "new":
57
+ print(
58
+ 'usage: simplicio skill new "<description>" [--planner ...] [--dry-run]',
59
+ file=sys.stderr,
60
+ )
61
+ return 2
62
+ from .scratch.skill_opt import main as skill_main
63
+
64
+ return skill_main(args[1:])
65
+ return None
66
+
67
+
68
+ def main(argv=None):
69
+ argv = list(sys.argv[1:] if argv is None else argv)
70
+ nested = _dispatch_nested(argv)
71
+ if nested is not None:
72
+ return nested
73
+
74
+ ap = argparse.ArgumentParser(prog="simplicio")
75
+ sub = ap.add_subparsers(dest="cmd", required=True)
76
+
77
+ pi = sub.add_parser("index", help="index/cache the repo (once, or after changes)")
78
+ pi.add_argument("--root", default=".")
79
+ pi.add_argument("--stack", default="angular")
80
+
81
+ pt = sub.add_parser("task", help="run a task")
82
+ pt.add_argument("goal")
83
+ pt.add_argument("--root", default=".")
84
+ pt.add_argument("--stack", default="angular")
85
+ pt.add_argument("--target", required=True)
86
+ pt.add_argument("--criteria", default="- true state\n- false state")
87
+ pt.add_argument("--constraints", default="- build passes")
88
+ pt.add_argument(
89
+ "--dry-run-task",
90
+ action="store_true",
91
+ help="generate the would-be task output without applying/testing",
92
+ )
93
+ pt.add_argument(
94
+ "--json", action="store_true", help="emit stable structured task output"
95
+ )
96
+ pt.add_argument(
97
+ "--bound-paths",
98
+ action="append",
99
+ default=[],
100
+ help="glob limiting which paths the task may change; repeatable",
101
+ )
102
+ pt.add_argument(
103
+ "--local",
104
+ action="store_true",
105
+ help="force the in-process local model (Qwen2.5-Coder-1.5B GGUF, "
106
+ "no API key); overrides SIMPLICIO_MODEL/SIMPLICIO_BASE_URL",
107
+ )
108
+
109
+ pb = sub.add_parser("bench", help="compare with vs without (real numbers)")
110
+ pb.add_argument("--root", default=".")
111
+ pb.add_argument("--stack", default="angular")
112
+ pb.add_argument("--cases", default="bench/cases.json")
113
+
114
+ pc = sub.add_parser("cache", help="inspect or clear completion cache")
115
+ pc_sub = pc.add_subparsers(dest="cache_cmd", required=True)
116
+ pc_stats = pc_sub.add_parser("stats", help="print completion cache statistics")
117
+ pc_stats.add_argument("--json", action="store_true")
118
+ pc_clear = pc_sub.add_parser("clear", help="clear completion cache")
119
+ pc_clear.add_argument("--force", action="store_true", help="required to clear")
120
+
121
+ sub.add_parser(
122
+ "smoke", help="one proof call: connect+generate (needs SIMPLICIO_MODEL+KEY)"
123
+ )
124
+
125
+ p_init = sub.add_parser(
126
+ "init", help="install skill + UserPromptSubmit hook into ~/.claude/"
127
+ )
128
+ p_init.add_argument("--claude-home", help="override ~/.claude (for tests)")
129
+ p_init.add_argument("--dry-run", action="store_true")
130
+
131
+ p_det = sub.add_parser("detect", help="heuristic: is a prompt a code-edit task")
132
+ p_det.add_argument("--prompt", help="prompt text (default: read from stdin)")
133
+ p_det.add_argument("--quiet", action="store_true")
134
+ p_det.add_argument("--json", action="store_true")
135
+
136
+ a = ap.parse_args(argv)
137
+ maybe_autoinstall(a.cmd)
138
+ if a.cmd == "index":
139
+ from .precedent import index_repo
140
+
141
+ index_repo(a.root, a.stack)
142
+ elif a.cmd == "smoke":
143
+ from .providers import generate, info
144
+
145
+ print("provider:", info())
146
+ out = generate("Reply exactly: OK simplicio connected.")
147
+ print("model reply:", out.strip()[:200])
148
+ elif a.cmd == "bench":
149
+ from .bench import run_bench
150
+
151
+ run_bench(a.root, a.stack, a.cases)
152
+ elif a.cmd == "cache":
153
+ from ._cache import cache
154
+
155
+ c = cache()
156
+ if a.cache_cmd == "stats":
157
+ stats = c.stats()
158
+ if a.json:
159
+ print(json.dumps(stats, sort_keys=True))
160
+ else:
161
+ print(f"root: {stats['root']}")
162
+ print(f"enabled: {stats['enabled']} bust: {stats['bust']}")
163
+ print(f"entries: {stats['entries']} size: {stats['mb']} MB")
164
+ print(f"ttl_days: {stats['ttl_days']} max_mb: {stats['max_mb']}")
165
+ return 0
166
+ if a.cache_cmd == "clear":
167
+ if not a.force:
168
+ print("simplicio cache clear requires --force", file=sys.stderr)
169
+ return 2
170
+ removed = c.clear()
171
+ print(f"cleared {removed} cached completion(s)")
172
+ return 0
173
+ elif a.cmd == "init":
174
+ from .init import main as init_main
175
+
176
+ init_argv = []
177
+ if a.claude_home:
178
+ init_argv += ["--claude-home", a.claude_home]
179
+ if a.dry_run:
180
+ init_argv += ["--dry-run"]
181
+ return init_main(init_argv)
182
+ elif a.cmd == "detect":
183
+ from .detect import main as detect_main
184
+
185
+ detect_argv = []
186
+ if a.prompt is not None:
187
+ detect_argv += ["--prompt", a.prompt]
188
+ if a.quiet:
189
+ detect_argv += ["--quiet"]
190
+ if a.json:
191
+ detect_argv += ["--json"]
192
+ return detect_main(detect_argv)
193
+ else:
194
+ from .pipeline import run, run_task
195
+
196
+ if getattr(a, "local", False):
197
+ # Force Path 4: pin the local model and drop any HTTP endpoint so the
198
+ # in-process llama backend wins regardless of the ambient config.
199
+ os.environ["SIMPLICIO_MODEL"] = "local-llama/default"
200
+ os.environ.pop("SIMPLICIO_BASE_URL", None)
201
+
202
+ if a.json or a.dry_run_task:
203
+ result = run_task(
204
+ a.root,
205
+ a.stack,
206
+ a.goal,
207
+ a.target,
208
+ a.criteria,
209
+ a.constraints,
210
+ dry_run_task=a.dry_run_task,
211
+ bound_paths=a.bound_paths,
212
+ quiet=a.json,
213
+ )
214
+ if a.json:
215
+ print(json.dumps(result, sort_keys=True))
216
+ else:
217
+ status = "DRY-RUN" if a.dry_run_task else "DONE"
218
+ print(f"{status}: {result['diff_summary']}")
219
+ for warning in result["warnings"]:
220
+ print(f"warning: {warning}", file=sys.stderr)
221
+ return 0 if (a.dry_run_task or result["applied"]) else 1
222
+ run(
223
+ a.root,
224
+ a.stack,
225
+ a.goal,
226
+ a.target,
227
+ a.criteria,
228
+ a.constraints,
229
+ bound_paths=a.bound_paths,
230
+ )
231
+ return 0
232
+
233
+
234
+ if __name__ == "__main__":
235
+ raise SystemExit(main())