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