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.
- {simplicio_cli-0.4.3/simplicio_cli.egg-info → simplicio_cli-0.5.1}/PKG-INFO +43 -2
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/README.md +38 -1
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/pyproject.toml +15 -2
- simplicio_cli-0.5.1/simplicio/__init__.py +1 -0
- simplicio_cli-0.5.1/simplicio/_cache.py +269 -0
- simplicio_cli-0.5.1/simplicio/cache_cli.py +68 -0
- simplicio_cli-0.5.1/simplicio/cli.py +670 -0
- simplicio_cli-0.5.1/simplicio/doctor.py +106 -0
- simplicio_cli-0.5.1/simplicio/dod.py +88 -0
- simplicio_cli-0.5.1/simplicio/ecosystem.py +246 -0
- simplicio_cli-0.5.1/simplicio/hardware.py +206 -0
- simplicio_cli-0.5.1/simplicio/intent.py +390 -0
- simplicio_cli-0.5.1/simplicio/local_models.py +218 -0
- simplicio_cli-0.5.1/simplicio/orchestrator/__init__.py +5 -0
- simplicio_cli-0.5.1/simplicio/orchestrator/cost_governor.py +129 -0
- simplicio_cli-0.5.1/simplicio/orchestrator/feature.py +175 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/pipeline.py +21 -1
- simplicio_cli-0.5.1/simplicio/pipeline_fixers.py +287 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/precedent.py +76 -23
- simplicio_cli-0.5.1/simplicio/providers.py +601 -0
- simplicio_cli-0.5.1/simplicio/scratch/__init__.py +16 -0
- simplicio_cli-0.5.1/simplicio/scratch/_pipeline_adapter.py +84 -0
- simplicio_cli-0.5.1/simplicio/scratch/cli.py +496 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/__init__.py +30 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/go_gin.py +220 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/php_laravel.py +146 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/python_cst.py +149 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/python_fastapi.py +397 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/python_orm.py +336 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/python_pydantic.py +527 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/python_pytest.py +516 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/registry.py +53 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/rust_axum.py +257 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/types.py +31 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/typescript_next_page.py +207 -0
- simplicio_cli-0.5.1/simplicio/scratch/codegen/typescript_next_route.py +334 -0
- simplicio_cli-0.5.1/simplicio/scratch/executor.py +537 -0
- simplicio_cli-0.5.1/simplicio/scratch/plan_schema.py +232 -0
- simplicio_cli-0.5.1/simplicio/scratch/planner.py +189 -0
- simplicio_cli-0.5.1/simplicio/scratch/recipes.py +432 -0
- simplicio_cli-0.5.1/simplicio/scratch/skill_opt.py +230 -0
- simplicio_cli-0.5.1/simplicio/scratch/stack_registry.py +186 -0
- simplicio_cli-0.5.1/simplicio/sprint_loader.py +75 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/go-gin/crud-resource.yaml +34 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/php-laravel/crud-resource.yaml +34 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/admin-crud.yaml +55 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/auth-jwt.yaml +54 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/py-fastapi/crud-resource.yaml +66 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/rust-axum/crud-resource.yaml +34 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/admin-crud.yaml +42 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/auth-jwt.yaml +41 -0
- simplicio_cli-0.5.1/simplicio/templates/recipes/ts-nextjs/crud-resource.yaml +47 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/README.md +24 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/bin/app.sh +15 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/tree/test/app.bats +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/bash-cli/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/App.Api.csproj +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/src/App.Api/Program.cs +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/App.Tests.csproj +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/tree/tests/App.Tests/HealthTests.cs +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-aspnet/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/App.Web.csproj +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/App.razor +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Components/Pages/Home.razor +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/src/App.Web/Program.cs +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/App.Tests.csproj +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/tree/tests/App.Tests/HealthTests.cs +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/csharp-blazor/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/lib/main.dart +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/pubspec.yaml +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/tree/test/widget_test.dart +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/dart-flutter/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/config/config.exs +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app/application.ex +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/controllers/health_controller.ex +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/endpoint.ex +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/lib/app_web/router.ex +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/mix.exs +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/test/health_controller_test.exs +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/tree/test/test_helper.exs +1 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/elixir-phoenix/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/cmd/root.go +30 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/cmd/root_test.go +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/go.mod +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/tree/main.go +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-cli/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/cmd/server/main.go +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/go.mod +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/internal/http/router.go +15 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/tree/internal/http/router_test.go +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-echo/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/README.md +33 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/practices.md +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/README.md +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/cmd/server/main.go +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/go.mod +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/internal/http/router.go +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/tree/internal/http/router_test.go +22 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/go-gin/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/README.md +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/build.gradle.kts +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/settings.gradle.kts +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/Application.java +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/main/java/com/example/HealthController.java +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/tree/src/test/java/com/example/HealthControllerTest.java +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/java-spring/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/stack.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/package.json +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/src/app.js +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/src/server.js +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/tree/tests/health.test.js +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/js-express/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/README.md +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/build.gradle.kts +23 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/AndroidManifest.xml +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/java/com/example/app/MainActivity.kt +15 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/main/res/values/styles.xml +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/app/src/test/java/com/example/app/SmokeTest.kt +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/build.gradle.kts +4 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/tree/settings.gradle.kts +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-android/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/README.md +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/build.gradle.kts +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/settings.gradle.kts +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/src/main/kotlin/com/example/Application.kt +22 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/tree/src/test/kotlin/com/example/ApplicationTest.kt +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-ktor/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/README.md +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/build.gradle.kts +16 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/settings.gradle.kts +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/Application.kt +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/main/kotlin/com/example/HealthController.kt +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/tree/src/test/kotlin/com/example/HealthControllerTest.kt +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/kotlin-spring/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/README.md +35 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/practices.md +31 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/README.md +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/artisan +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/bootstrap/app.php +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/composer.json +29 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/phpunit.xml +17 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/routes/api.php +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/routes/console.php +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/tests/Feature/HealthTest.php +15 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/tree/tests/TestCase.php +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-laravel/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/composer.json +23 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/src/Controller/HealthController.php +17 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/tree/tests/HealthControllerTest.php +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-symfony/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/README.md +27 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/composer.json +22 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/phpunit.xml +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/src/Health.php +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/tree/tests/HealthTest.php +16 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/php-vanilla/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/pyproject.toml +16 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/src/app/cli.py +19 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/tree/tests/test_cli.py +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-cli/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/README.md +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/practices.md +21 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/__init__.py +1 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/apps.py +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/tests.py +9 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/app/views.py +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/__init__.py +1 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/asgi.py +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/settings.py +18 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/urls.py +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/config/wsgi.py +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/manage.py +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/tree/pyproject.toml +9 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-django/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/README.md +51 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/practices.md +55 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/.gitignore +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/README.template.md +35 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/pyproject.toml +29 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/ruff.toml +9 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/src/api/__init__.py +1 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/src/main.py +24 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/tree/tests/test_health.py +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-fastapi/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/README.md +27 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/practices.md +21 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/pyproject.toml +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/ruff.toml +2 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/src/app.py +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/tree/tests/test_health.py +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/py-flask/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/README.md +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/stack.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/index.html +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/package.json +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/App.test.tsx +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/App.tsx +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/src/main.tsx +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/tree/tsconfig.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/react-vite/verify.json +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/README.md +26 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/Gemfile +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/app/controllers/health_controller.rb +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/bin/rails +4 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/application.rb +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/boot.rb +2 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/config/routes.rb +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/test/controllers/health_controller_test.rb +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/tree/test/test_helper.rb +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ruby-rails/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/README.md +32 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/practices.md +30 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/Cargo.toml +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/README.md +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/tree/src/main.rs +43 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-axum/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/README.md +24 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/Cargo.toml +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/tree/src/main.rs +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-cli/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/README.md +24 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/Cargo.toml +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/tree/src/main.rs +29 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/rust-leptos/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/README.md +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Sources/App/App.swift +10 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Sources/App/ContentView.swift +12 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/tree/Tests/AppTests/AppTests.swift +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-ios/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/README.md +25 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/stack.json +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Package.swift +17 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/README.md +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Sources/App/main.swift +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/tree/Tests/AppTests/HealthTests.swift +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/swift-vapor/verify.json +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/README.md +28 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/stack.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/package.json +30 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.spec.ts +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.controller.ts +9 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/app.module.ts +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/src/main.ts +13 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/tree/tsconfig.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nestjs/verify.json +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/README.md +36 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/practices.md +37 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/stack.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/.eslintrc.json +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/.gitignore +9 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/next.config.mjs +6 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/package.json +30 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/pnpm-workspace.yaml +3 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/src/app/layout.tsx +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/src/app/page.tsx +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/tree/tsconfig.json +21 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-nextjs/verify.json +7 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/README.md +27 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/practices.md +20 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/stack.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/README.md +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/root.tsx +16 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/_index.tsx +8 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/health.test.ts +11 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/app/routes/health.ts +5 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/package.json +27 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/tree/tsconfig.json +14 -0
- simplicio_cli-0.5.1/simplicio/templates/stacks/ts-remix/verify.json +7 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1/simplicio_cli.egg-info}/PKG-INFO +43 -2
- simplicio_cli-0.5.1/simplicio_cli.egg-info/SOURCES.txt +369 -0
- simplicio_cli-0.5.1/simplicio_cli.egg-info/dependency_links.txt +1 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio_cli.egg-info/requires.txt +5 -0
- simplicio_cli-0.4.3/simplicio/__init__.py +0 -1
- simplicio_cli-0.4.3/simplicio/cli.py +0 -150
- simplicio_cli-0.4.3/simplicio/providers.py +0 -142
- simplicio_cli-0.4.3/simplicio_cli.egg-info/SOURCES.txt +0 -30
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/LICENSE +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/setup.cfg +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/adaptive.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/bench.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/cache.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/detect.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/init.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/mapper.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/observability.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/prompt.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/skill_router.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/SKILL.md +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/simplicio_prompt.md +0 -0
- /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
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/templates/userpromptsubmit-hook.sh +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/__init__.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/cache.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/http_client.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio/utils/serialization.py +0 -0
- {simplicio_cli-0.4.3 → simplicio_cli-0.5.1}/simplicio_cli.egg-info/entry_points.txt +0 -0
- {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.
|
|
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.
|
|
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 = [
|
|
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
|