agent-scaffold-cli 0.1.1__tar.gz → 0.2.255__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.
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/.github/workflows/ci.yml +3 -0
- agent_scaffold_cli-0.2.255/CHANGELOG.md +90 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/CLAUDE.md +7 -4
- agent_scaffold_cli-0.2.255/CODE_OF_CONDUCT.md +32 -0
- agent_scaffold_cli-0.2.255/CONTRIBUTING.md +108 -0
- agent_scaffold_cli-0.2.255/PKG-INFO +393 -0
- agent_scaffold_cli-0.2.255/README.md +358 -0
- agent_scaffold_cli-0.2.255/SECURITY.md +34 -0
- agent_scaffold_cli-0.2.255/docs/design/orchestrator.md +119 -0
- agent_scaffold_cli-0.2.255/docs/design/security.md +138 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/pyproject.toml +10 -3
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/README.md +23 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/audit-logging.md +258 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/auth-jwt.md +7 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/authorization-rbac.md +272 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/backpressure.md +189 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/caching-strategies.md +282 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/cost-tracking.md +181 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/distributed-locking.md +201 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/dlq-operations.md +142 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/health-graceful-shutdown.md +275 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/idempotency.md +182 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/model-routing.md +171 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/multi-tenancy.md +274 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/observability.md +7 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/pii-gdpr.md +235 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/resilience.md +342 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/schema-evolution.md +219 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/security-hardening.md +197 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/validation-strategy.md +287 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/langgraph.md +72 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/README.md +2 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/patterns/event-driven.md +82 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/README.md +1 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/customer-support-triage.md +25 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/recipes/restaurant-rebooking.md +1056 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/background-jobs.md +255 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/cache-redis.md +190 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/connection-pooling-pgbouncer.md +155 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/feature-flags.md +207 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/kafka.md +238 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/kubernetes-helm.md +346 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/log-aggregation.md +198 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/opentelemetry.md +248 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/prometheus-grafana.md +232 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/relational-postgres.md +2 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/secrets-management.md +230 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_bundled_deployments/docs/stack/terraform.md +292 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/tracing-langfuse.md +2 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_filesec.py +106 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_redact.py +94 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/_scaffold_dir.py +19 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/auth.py +384 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/auth_browser.py +182 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/branding.py +92 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/cli.py +1884 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/cli_auth.py +235 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/cli_doctor.py +374 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/cli_secrets.py +180 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/cli_shared.py +18 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/config.py +221 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/context.py +538 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/contract.py +19 -15
- agent_scaffold_cli-0.2.255/src/agent_scaffold/costs.py +153 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/discovery.py +313 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/doctor.py +377 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/effort.py +64 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/generator.py +677 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/imports.py +148 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/language_hints.py +63 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/manifest.py +209 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/merge.py +370 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/orchestrator.py +788 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/pipeline.py +773 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/plan.py +108 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/probes.py +452 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/progress.py +747 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/prompts/single_file.md +40 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/prompts/system_strict.md +62 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/prompts/user_template.md +8 -5
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/__init__.py +19 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/commands.py +551 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/refine.py +280 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/render.py +147 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/session.py +217 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/repl/shell.py +706 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/sources.py +410 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/__init__.py +109 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/_subprocess.py +176 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/commit_push.py +261 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/docker_up.py +313 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/install_deps.py +175 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/migrations.py +296 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/open_editor.py +124 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/seed.py +189 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/smoke_test.py +230 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/steps/wire_credentials.py +368 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/template_snapshot.py +245 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/topology.py +115 -0
- agent_scaffold_cli-0.2.255/src/agent_scaffold/validator.py +230 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/writer.py +102 -16
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/patterns/event-driven.md +3 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/bad-recipe-deps.md +12 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/bad-required-files.md +13 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/conflict-recipe-deps.md +12 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/customer-support-triage.md +1 -1
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/event-driven-recipe.md +5 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/with-external-services.md +32 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/with-recipe-deps.md +14 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/recipes/with-required-files.md +11 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/mock_responses/dirty_python.json +33 -0
- agent_scaffold_cli-0.2.255/tests/fixtures/steps.py +137 -0
- agent_scaffold_cli-0.2.255/tests/security/__init__.py +0 -0
- agent_scaffold_cli-0.2.255/tests/security/test_argv_no_secrets.py +83 -0
- agent_scaffold_cli-0.2.255/tests/security/test_filesec.py +97 -0
- agent_scaffold_cli-0.2.255/tests/security/test_gitignore_enforcement.py +68 -0
- agent_scaffold_cli-0.2.255/tests/security/test_no_input_for_secrets.py +47 -0
- agent_scaffold_cli-0.2.255/tests/security/test_no_shell_true.py +94 -0
- agent_scaffold_cli-0.2.255/tests/security/test_redact.py +97 -0
- agent_scaffold_cli-0.2.255/tests/security/test_secret_typing.py +56 -0
- agent_scaffold_cli-0.2.255/tests/security/test_secrets_purge.py +168 -0
- agent_scaffold_cli-0.2.255/tests/steps/__init__.py +0 -0
- agent_scaffold_cli-0.2.255/tests/steps/conftest.py +106 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_commit_push.py +245 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_docker_up.py +205 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_install_deps.py +195 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_migrations.py +148 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_open_editor.py +113 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_seed.py +125 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_smoke_test.py +114 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_subprocess.py +70 -0
- agent_scaffold_cli-0.2.255/tests/steps/test_wire_credentials.py +191 -0
- agent_scaffold_cli-0.2.255/tests/test_auth.py +594 -0
- agent_scaffold_cli-0.2.255/tests/test_auth_browser.py +175 -0
- agent_scaffold_cli-0.2.255/tests/test_cli_e2e.py +936 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/test_config.py +43 -11
- agent_scaffold_cli-0.2.255/tests/test_context.py +310 -0
- agent_scaffold_cli-0.2.255/tests/test_context_blueprint_links.py +144 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/test_contract.py +27 -0
- agent_scaffold_cli-0.2.255/tests/test_costs_preflight.py +71 -0
- agent_scaffold_cli-0.2.255/tests/test_discovery.py +134 -0
- agent_scaffold_cli-0.2.255/tests/test_doctor.py +501 -0
- agent_scaffold_cli-0.2.255/tests/test_effort.py +61 -0
- agent_scaffold_cli-0.2.255/tests/test_generator.py +508 -0
- agent_scaffold_cli-0.2.255/tests/test_imports.py +70 -0
- agent_scaffold_cli-0.2.255/tests/test_language_hints.py +36 -0
- agent_scaffold_cli-0.2.255/tests/test_manifest.py +223 -0
- agent_scaffold_cli-0.2.255/tests/test_merge.py +123 -0
- agent_scaffold_cli-0.2.255/tests/test_orchestrator.py +566 -0
- agent_scaffold_cli-0.2.255/tests/test_pipeline.py +231 -0
- agent_scaffold_cli-0.2.255/tests/test_plan.py +159 -0
- agent_scaffold_cli-0.2.255/tests/test_probes.py +488 -0
- agent_scaffold_cli-0.2.255/tests/test_progress.py +286 -0
- agent_scaffold_cli-0.2.255/tests/test_repl_commands.py +543 -0
- agent_scaffold_cli-0.2.255/tests/test_repl_refine.py +308 -0
- agent_scaffold_cli-0.2.255/tests/test_repl_render.py +182 -0
- agent_scaffold_cli-0.2.255/tests/test_repl_session.py +182 -0
- agent_scaffold_cli-0.2.255/tests/test_repl_shell.py +443 -0
- agent_scaffold_cli-0.2.255/tests/test_sources.py +449 -0
- agent_scaffold_cli-0.2.255/tests/test_template_snapshot.py +147 -0
- agent_scaffold_cli-0.2.255/tests/test_topology.py +112 -0
- agent_scaffold_cli-0.2.255/tests/test_up_cli.py +192 -0
- agent_scaffold_cli-0.2.255/tests/test_up_cli_full.py +170 -0
- agent_scaffold_cli-0.2.255/tests/test_update_cli.py +272 -0
- agent_scaffold_cli-0.2.255/tests/test_validator.py +91 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/test_writer.py +37 -6
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/uv.lock +256 -5
- agent_scaffold_cli-0.1.1/PKG-INFO +0 -147
- agent_scaffold_cli-0.1.1/README.md +0 -115
- agent_scaffold_cli-0.1.1/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/README.md +0 -15
- agent_scaffold_cli-0.1.1/src/agent_scaffold/_bundled_deployments/docs/stack/cache-redis.md +0 -85
- agent_scaffold_cli-0.1.1/src/agent_scaffold/cli.py +0 -512
- agent_scaffold_cli-0.1.1/src/agent_scaffold/config.py +0 -117
- agent_scaffold_cli-0.1.1/src/agent_scaffold/context.py +0 -253
- agent_scaffold_cli-0.1.1/src/agent_scaffold/discovery.py +0 -112
- agent_scaffold_cli-0.1.1/src/agent_scaffold/generator.py +0 -213
- agent_scaffold_cli-0.1.1/src/agent_scaffold/validator.py +0 -133
- agent_scaffold_cli-0.1.1/tests/test_cli_e2e.py +0 -165
- agent_scaffold_cli-0.1.1/tests/test_context.py +0 -97
- agent_scaffold_cli-0.1.1/tests/test_discovery.py +0 -55
- agent_scaffold_cli-0.1.1/tests/test_generator.py +0 -147
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/.env.example +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/.github/workflows/publish.yml +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/.gitignore +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/LICENSE +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/Makefile +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/scripts/sync_deployments.sh +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/__init__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/__main__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/__init__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/logging-structured.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/rate-limiting.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/cross-cutting/testing-strategy.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/README.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/crewai.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/mastra.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/pydantic-ai.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/frameworks/vercel-ai-sdk.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/memory.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/multi-agent-flat.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/multi-agent-hierarchical.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/parallel-calls.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/plan-execute-reflect.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/prompt-chaining.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/rag.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/react.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/patterns/routing-tool-use.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/code-review-agent.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/content-pipeline.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/docs-rag-qa.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/hierarchical-agent.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/memory-assistant.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/ops-crew.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/parallel-enricher.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/recipes/research-assistant.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/README.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/api-fastapi.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/api-hono.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/eval-deepeval-ragas-promptfoo.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/llm-claude.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/tool-protocol-mcp.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/_bundled_deployments/docs/stack/vector-qdrant.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/cache.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/languages/__init__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/languages/python.yaml +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/languages/typescript.yaml +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/prompts/__init__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/prompts/repair.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/src/agent_scaffold/prompts/system.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/__init__.py +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/conftest.py +0 -0
- /agent_scaffold_cli-0.1.1/tests/fixtures/mock_deployments/docs/cross-cutting/auth.md → /agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/cross-cutting/authorization-rbac.md +0 -0
- /agent_scaffold_cli-0.1.1/tests/fixtures/mock_deployments/docs/cross-cutting/logging.md → /agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/cross-cutting/logging-structured.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/cross-cutting/rate-limiting.md +0 -0
- /agent_scaffold_cli-0.1.1/tests/fixtures/mock_deployments/docs/cross-cutting/testing.md → /agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/cross-cutting/testing-strategy.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/frameworks/langgraph.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/frameworks/pydantic-ai.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/frameworks/vercel-ai-sdk.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/patterns/loop-a.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/patterns/loop-b.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/patterns/rag.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/patterns/react.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/cycle-recipe.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/docs-rag-qa.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/lonely-recipe.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/missing-ref-recipe.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_deployments/docs/recipes/no-h1-recipe.md +0 -0
- /agent_scaffold_cli-0.1.1/tests/fixtures/mock_deployments/docs/stack/qdrant.md → /agent_scaffold_cli-0.2.255/tests/fixtures/mock_deployments/docs/stack/vector-qdrant.md +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_responses/malformed.txt +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_responses/valid_python.json +0 -0
- {agent_scaffold_cli-0.1.1 → agent_scaffold_cli-0.2.255}/tests/fixtures/mock_responses/valid_python_fenced.txt +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
## 0.2.255 — 2026-05-28
|
|
10
|
+
|
|
11
|
+
The first minor since `0.1.1`. Headline change: the new **`agent-scaffold scaffold` REPL** — a persistent shell with a guided wizard, slash commands, LLM-interpreted refinements, pre-flight cost estimates, and a tab-completing prompt — replaces the one-shot prompt-for-each-input flow that `agent-scaffold new` used to drive. `new` still works for scripted / non-interactive runs. Also: deployments + blueprints now auto-fetch from GitHub (cached by SHA, ETag-conditional), and the CLI itself has been pulled apart into smaller focused modules (`cli_auth`, `cli_doctor`, `cli_secrets`, plus shared leafs `effort` + `language_hints` + `_scaffold_dir`).
|
|
12
|
+
|
|
13
|
+
### Highlights
|
|
14
|
+
|
|
15
|
+
- **Interactive REPL: `agent-scaffold scaffold`.** Persistent shell with the orange→red figlet banner, a `/new` wizard, free-text refinements ("swap to sonnet, add postgres, skip the smoke test"), pre-flight cost estimates, and tab-completion. Stays open until `/exit` so multiple projects can be scaffolded in one session.
|
|
16
|
+
- **Auto-fetched deployments + blueprints.** `agent-scaffold new` no longer prompts for a path. The CLI pulls the latest `main` commit from `jagguvarma15/agent-deployments` and `jagguvarma15/agent-blueprints`, caches each by SHA under `~/.cache/agent-scaffold/`, and uses ETag-conditional GETs so unchanged refs don't consume GitHub rate-limit quota. Falls back to the bundled deployments copy when offline.
|
|
17
|
+
- **Live bug fix:** REPL free-text refinements actually reach the generator now. Earlier preview builds collected them into `SessionState` and rendered them in the delta panel but never threaded them into `PipelineInputs` — so prose like `"add postgres, swap to sonnet"` was a silent no-op.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- **`agent-scaffold scaffold` — interactive REPL.** Persistent shell with the orange→red figlet banner, slash commands (`/help`, `/recipe`, `/language`, `/framework`, `/name`, `/dest`, `/model`, `/effort`, `/plan`, `/cost`, `/reset`, `/go`, `/exit`), tab-completion for commands + recipe slugs, history at `~/.cache/agent-scaffold/repl_history`, Ctrl-D / Ctrl-L key bindings.
|
|
22
|
+
- **`/new` guided wizard with arrow-key selection.** Steps through recipe → language → framework → name → dest via questionary picks; each step has a `pause wizard` option that preserves selections so a follow-up `/new` resumes from the first unset field with a keep/change gate.
|
|
23
|
+
- **`/generate` (alias `/gen`)** — user-facing verb for the final confirm step; both route through the existing `cmd_go` validator.
|
|
24
|
+
- **`agent_scaffold.branding`** — shared figlet+gradient logo used by both the top-level `agent-scaffold` banner and the REPL welcome screen so they stay visually consistent.
|
|
25
|
+
- **`prompt-toolkit>=3.0,<4`** pinned as an explicit dependency (previously transitive via questionary; the shell drives `PromptSession`, `FileHistory`, and `patch_stdout` directly).
|
|
26
|
+
- **REPL slash-command dispatcher.** `agent_scaffold.repl.commands.CommandHandler` introspects its own `cmd_*` methods to register slash commands with bare-recipe-slug shortcuts and fuzzy "did you mean" matching on typos.
|
|
27
|
+
- **LLM-interpreted free-text refinements in the REPL.** Anything that isn't a slash command or a bare recipe slug goes through a Haiku-only `interpret_refinement` call that turns prose like `"swap to sonnet and skip the smoke test"` into a typed `StatePatch`. ~$0.002/call. Network failures, malformed JSON, and schema-mismatched values surface a yellow warning and leave state intact rather than crashing the loop.
|
|
28
|
+
- **Pre-flight cost estimate in the plan panel.** The plan-confirm panel now shows `Est. cost: $X (input $Y, output ~$Z ±$W)` before any LLM call, so you see what a run will cost before paying. Input cost is exact (from the assembled context size); output is a range bracketed by the configured `--max-tokens`.
|
|
29
|
+
- **Auto-fetch deployments + blueprints from GitHub.** `agent-scaffold new` no longer prompts for the deployments path. By default the CLI pulls the latest `main` commit from both `jagguvarma15/agent-deployments` and `jagguvarma15/agent-blueprints`, caches each by SHA under `~/.cache/agent-scaffold/`, and uses ETag-conditional GETs so unchanged refs don't consume GitHub rate-limit quota. Falls back to the bundled deployments copy when offline.
|
|
30
|
+
- **Blueprint URL rewriting in context assembly.** `https://github.com/jagguvarma15/agent-blueprints/(tree|blob|raw)/main/<path>` links in deployments docs now resolve to local files in the fetched blueprints tree, so the LLM actually reads the canonical pattern content the deployments docs point to (subject to the existing context budget).
|
|
31
|
+
- New flags on `agent-scaffold new`: `--blueprints-path`, `--deployments-source [auto|bundled]`, `--blueprints-source [auto|skip]`.
|
|
32
|
+
- New env vars: `AGENT_SCAFFOLD_BLUEPRINTS_PATH`, `AGENT_SCAFFOLD_DEPLOYMENTS_SOURCE`, `AGENT_SCAFFOLD_BLUEPRINTS_SOURCE`.
|
|
33
|
+
- New module `agent_scaffold.sources` with safe-extract tarball handling (rejects `..`, absolute paths, symlink escapes — Python 3.11 floor, no `tarfile.data_filter` dependency).
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- `Config.deployments_path` is now `Path | None` — empty means "use the resolver default" (auto-fetch). `load_config` no longer raises when no path is set; resolution is deferred to `sources.resolve_*`.
|
|
38
|
+
- Removed the "Path to agent-deployments repo:" interactive prompt from `agent-scaffold new`.
|
|
39
|
+
- **New leaf modules `agent_scaffold.effort` and `agent_scaffold.language_hints`** carry the shared effort-preset table and language-YAML loader respectively. `cli.py` and `repl/*.py` now import from them instead of each carrying a near-copy.
|
|
40
|
+
- **New `topology.resolve(recipe, ctx_body)` helper** returns the `(Topology, list[Role])` pair so `cmd_new`, `cmd_plan`, and `_build_pipeline_inputs` no longer duplicate the explicit-frontmatter / inference / `SINGLE` fallback dance verbatim.
|
|
41
|
+
- **Split `cli.py` (2615 LOC → 1883 LOC) into focused sibling modules.** `cli_auth.py` owns the `auth` sub-app + credentials commands; `cli_secrets.py` owns the `secrets list` / `secrets purge` survey + flow; `cli_doctor.py` owns the `doctor` sub-app, the `--explain` lookup, and the auth/service `Check` adapters. A new `cli_shared.py` holds the single `console = Console()` singleton imported by every sibling. `cli.py` keeps the project-generation pipeline (`cmd_new`, `cmd_update`, `cmd_regenerate`, `cmd_scaffold`, `cmd_up`, `cmd_validate`, `cmd_config`) and registers the sub-apps via `app.add_typer(...)`.
|
|
42
|
+
|
|
43
|
+
### Fixed
|
|
44
|
+
|
|
45
|
+
- **REPL free-text refinements now reach the generator.** `SessionState.extra_dependencies`, `extra_steps`, `removed_steps`, `removed_roles`, and `refinement_notes` were collected and rendered in the delta panel but never threaded into `PipelineInputs` or the LLM prompt — so prose like `"add postgres, swap to sonnet, skip docker_up"` was a silent no-op. Added the five fields to `PipelineInputs`, `GenerationRequest`, and the `cache_inputs` fingerprint; rendered them as a `# User refinements` block in the user-message tail (per-run, never cached); `_build_pipeline_inputs` now passes them through from `SessionState`.
|
|
46
|
+
- **`/effort high` in the REPL now matches `--effort high` on the CLI.** The two surfaces each carried their own `EFFORT_PRESETS` dict; the REPL's was missing `max_context_tokens`/`max_link_depth`/`max_tokens_per_doc`, so the same keyword silently produced different context budgets. Unified into a single `agent_scaffold.effort.EFFORT_PRESETS` mapping typed as `EffortPreset` frozen dataclasses.
|
|
47
|
+
- **REPL `/language` validation now picks up new language YAMLs automatically.** Replaced the `_VALID_LANGUAGES = ("python", "typescript")` constant with a call to `agent_scaffold.language_hints.available_languages()`, so dropping in `rust.yaml` is picked up by both `/language` validation and the wizard list without code changes.
|
|
48
|
+
|
|
49
|
+
### Performance
|
|
50
|
+
|
|
51
|
+
- **Cached the bundled prompt reads.** `generator._load_prompt` and `prompts_signature` are now wrapped in `functools.lru_cache` — the wheel-bundled prompt files don't change at runtime, so the prior behaviour of re-reading and re-hashing them on every `run_generation` was pure waste.
|
|
52
|
+
- **Per-state assemble cache in the REPL.** `repl/commands._assemble_for_state` wraps `context.assemble` with a small LRU keyed on every input that could change the output (recipe + paths + budgets). The `/plan` → `/cost` flow used to walk the blueprint tree twice; it now walks it once per state change.
|
|
53
|
+
|
|
54
|
+
### Typing
|
|
55
|
+
|
|
56
|
+
- **`pipeline._run_post_gen_formatter` renamed to `pipeline.run_post_gen_formatter`.** Drops the leading underscore on a function that was both re-exported via `__all__` and imported by `cli.cmd_regenerate` — the underscore was misleading public-vs-private signalling.
|
|
57
|
+
- **`pipeline.RunReport.report` is now typed `WriteReport | None`** instead of `Any | None`. The comment claiming the cycle ("typed Any to avoid an import cycle in writer") was incorrect — `writer.py` is a leaf module. `mypy --strict` still passes.
|
|
58
|
+
|
|
59
|
+
### Internal
|
|
60
|
+
|
|
61
|
+
- **New `agent_scaffold._scaffold_dir.SCAFFOLD_DIR = ".scaffold"`** centralises the per-project metadata directory name. Updated `manifest.py`, `orchestrator.py`, `template_snapshot.py`, `writer.py`, `cli.py`, and `steps/commit_push.py` to import it instead of spelling the literal six times.
|
|
62
|
+
- **REPL wizard step table.** `repl/shell._run_new_wizard` now drives its five steps (recipe / language / framework / name / dest) from a `_WIZARD_STEPS` tuple of `_WizardStep` dataclasses instead of five copy-pasted 7-line blocks. Adding a sixth step is now a single table row.
|
|
63
|
+
- **Dropped the `agent_scaffold.repl` package re-exports.** Every existing caller (in-tree and tests) already imports from the symbol's owning submodule; the `__init__.py` re-exports were pure noise.
|
|
64
|
+
|
|
65
|
+
### Versioning note
|
|
66
|
+
|
|
67
|
+
Patch number is the count of commits to `main` since `21dcbfa` (the `0.1.1` PyPI-rename commit). Future releases on the `0.2.x` line will keep this scheme until a breaking change moves to `0.3`.
|
|
68
|
+
|
|
69
|
+
## 0.1.1 — 2026-05-06
|
|
70
|
+
|
|
71
|
+
### Fixed
|
|
72
|
+
- Source `__version__` from installed package metadata so `agent-scaffold --version` matches the published wheel.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
- Renamed PyPI distribution to `agent-scaffold-cli` (CLI command remains `agent-scaffold`).
|
|
76
|
+
- Aligned `.gitignore` and wheel build with the `agent-scaffold` rename.
|
|
77
|
+
|
|
78
|
+
## 0.1.0 — 2026-05-03
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
- Initial public release on PyPI.
|
|
82
|
+
- `agent-scaffold new` interactive flow: pick a recipe, language, framework, project name, and destination.
|
|
83
|
+
- `agent-scaffold validate --tier {static,build,smoke}` reruns post-generation tiers without re-invoking the LLM.
|
|
84
|
+
- `agent-scaffold config` prints the resolved configuration with the API key masked.
|
|
85
|
+
- Pipeline: `config → discovery → context → generator → contract → writer → validator`.
|
|
86
|
+
- Bundled `agent-deployments` docs shipped inside the wheel; override with `AGENT_SCAFFOLD_DEPLOYMENTS_PATH` or `--deployments-path`.
|
|
87
|
+
- Pluggable language targets via YAML (`src/agent_scaffold/languages/`), with `python.yaml` and `typescript.yaml` shipped.
|
|
88
|
+
- Atomic writes via temp dir + `os.replace`; `--write-mode` choices: `abort` (default), `skip`, `diff`, `overwrite`.
|
|
89
|
+
- Path-safety validation in the contract layer (rejects absolute paths, parent traversal, symlink escapes).
|
|
90
|
+
- Failure capture: malformed contracts written to `~/.cache/agent-scaffold/failures/<timestamp>.json` with automatic repair-attempt round-trip.
|
|
@@ -15,18 +15,21 @@ uv run agent-scaffold --help # CLI usage
|
|
|
15
15
|
|
|
16
16
|
## Architecture
|
|
17
17
|
|
|
18
|
-
Pipeline: `config →
|
|
18
|
+
Pipeline: `config → sources → discovery → context → pipeline.run_generation → cli`
|
|
19
19
|
|
|
20
20
|
| Module | Responsibility |
|
|
21
21
|
|--------|---------------|
|
|
22
|
-
| `config.py` | Load env vars + TOML config, resolve `Config
|
|
22
|
+
| `config.py` | Load env vars + TOML config, resolve `Config`. Deployments / blueprints paths are optional hints. |
|
|
23
|
+
| `sources.py` | Resolve where deployments + blueprints come from: GitHub auto-fetch (cached by SHA, ETag-conditional) with bundled / skip fallback. |
|
|
23
24
|
| `discovery.py` | Scan `agent-deployments/docs/recipes/` for markdown recipe specs |
|
|
24
|
-
| `context.py` | Assemble recipe + linked docs into a single prompt context |
|
|
25
|
+
| `context.py` | Assemble recipe + linked docs into a single prompt context. Rewrites `github.com/.../agent-blueprints/...` URLs in deployments docs to local files in the fetched blueprints tree. |
|
|
25
26
|
| `generator.py` | Call Anthropic API with system/user prompts, retry on transient errors |
|
|
26
27
|
| `contract.py` | Parse + validate JSON response (path safety, required files) |
|
|
27
28
|
| `writer.py` | Atomic file writing with skip/diff/overwrite modes |
|
|
28
29
|
| `validator.py` | Post-generation validation: static lint, build, smoke check |
|
|
29
|
-
| `
|
|
30
|
+
| `pipeline.py` | Post-plan orchestration (`run_generation`): generate → write → gitignore → verify → format → validate → manifest. Reusable by `cmd_new` and the `scaffold` REPL. Recoverable failures raise `PipelineError`. |
|
|
31
|
+
| `repl/` | Interactive shell (`agent-scaffold scaffold`). `session.py` (state + StatePatch), `commands.py` (slash dispatcher), `refine.py` (Haiku-interpreted free text), `render.py` (Rich panels), `shell.py` (PromptSession loop). |
|
|
32
|
+
| `cli.py` | Typer CLI: prompt collection + plan-confirm + delegate to `pipeline.run_generation`. `cmd_scaffold` opens the REPL. |
|
|
30
33
|
|
|
31
34
|
## Conventions
|
|
32
35
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We are committed to making participation in this project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
|
6
|
+
|
|
7
|
+
## Our Standards
|
|
8
|
+
|
|
9
|
+
**Positive behaviour includes:**
|
|
10
|
+
- Using welcoming and inclusive language
|
|
11
|
+
- Being respectful of differing viewpoints and experience levels
|
|
12
|
+
- Giving and gracefully accepting constructive feedback
|
|
13
|
+
- Focusing on what is best for the community
|
|
14
|
+
- Showing empathy toward other contributors
|
|
15
|
+
|
|
16
|
+
**Unacceptable behaviour includes:**
|
|
17
|
+
- Harassment, insults, or derogatory comments in any form
|
|
18
|
+
- Personal or political attacks
|
|
19
|
+
- Publishing others' private information without consent
|
|
20
|
+
- Trolling or deliberately disruptive behaviour
|
|
21
|
+
|
|
22
|
+
## Scope
|
|
23
|
+
|
|
24
|
+
This code of conduct applies in all project spaces — GitHub issues, pull requests, discussions, and any other forums used by the community.
|
|
25
|
+
|
|
26
|
+
## Enforcement
|
|
27
|
+
|
|
28
|
+
Instances of unacceptable behaviour may be reported by opening a GitHub issue or contacting the maintainers directly. All reports will be reviewed and investigated. Maintainers are obligated to maintain confidentiality with regard to the reporter.
|
|
29
|
+
|
|
30
|
+
## Attribution
|
|
31
|
+
|
|
32
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Contributing to agent-scaffold
|
|
2
|
+
|
|
3
|
+
Thanks for your interest! This guide covers bug reports, feature requests, language-target additions, and code contributions.
|
|
4
|
+
|
|
5
|
+
## Getting started
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
git clone https://github.com/jagguvarma15/agent-scaffold
|
|
9
|
+
cd agent-scaffold
|
|
10
|
+
uv sync
|
|
11
|
+
uv run pytest
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The full toolchain (matches CI):
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
uv run ruff check src/ tests/
|
|
18
|
+
uv run ruff format src/ tests/
|
|
19
|
+
uv run mypy src/
|
|
20
|
+
uv run pytest
|
|
21
|
+
uv run pytest -m integration # requires ANTHROPIC_API_KEY
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Project layout
|
|
25
|
+
|
|
26
|
+
`agent-scaffold` is structured as a pipeline:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
config → discovery → context → generator → contract → writer → validator
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Each module owns one stage; please keep contributions scoped to the stage they belong to. See [`CLAUDE.md`](CLAUDE.md) for the responsibility table.
|
|
33
|
+
|
|
34
|
+
## Types of contributions
|
|
35
|
+
|
|
36
|
+
### Bug reports
|
|
37
|
+
|
|
38
|
+
Open an issue with:
|
|
39
|
+
- The `agent-scaffold --version` output
|
|
40
|
+
- The exact command you ran and what you expected
|
|
41
|
+
- The generated output or error (redact API keys)
|
|
42
|
+
- If the LLM produced a malformed contract, attach the file from `~/.cache/agent-scaffold/failures/`
|
|
43
|
+
|
|
44
|
+
### Adding a target language
|
|
45
|
+
|
|
46
|
+
Drop a YAML file into `src/agent_scaffold/languages/` modeled after [`python.yaml`](src/agent_scaffold/languages/python.yaml) or [`typescript.yaml`](src/agent_scaffold/languages/typescript.yaml). Required keys are listed in the README. Add a fixture under `tests/fixtures/` and a discovery test.
|
|
47
|
+
|
|
48
|
+
### Pipeline changes
|
|
49
|
+
|
|
50
|
+
Changes to `contract.py` or `writer.py` are security-sensitive (path validation, atomic writes). Please include:
|
|
51
|
+
- Tests covering the new behaviour
|
|
52
|
+
- Tests covering adversarial inputs (escaping paths, symlinks, absolute paths)
|
|
53
|
+
- A short note in the PR explaining why the new behaviour is safe
|
|
54
|
+
|
|
55
|
+
### Documentation
|
|
56
|
+
|
|
57
|
+
Improvements to `README.md`, `CLAUDE.md`, or inline docstrings are always welcome.
|
|
58
|
+
|
|
59
|
+
## Code style
|
|
60
|
+
|
|
61
|
+
- Python 3.11+, strict mypy, ruff for lint + format (see `pyproject.toml` for config)
|
|
62
|
+
- Pydantic models for all data structures
|
|
63
|
+
- Custom exceptions carry context (e.g. `ContractParseError.raw`, `.reason`)
|
|
64
|
+
- Tests use monkeypatching for the Anthropic client; fixtures live in `tests/fixtures/`
|
|
65
|
+
- src layout under `src/agent_scaffold/`
|
|
66
|
+
|
|
67
|
+
## Commit messages
|
|
68
|
+
|
|
69
|
+
Use concise, descriptive messages following the existing style:
|
|
70
|
+
- `feat: add support for <language>`
|
|
71
|
+
- `fix: reject parent-relative paths in writer`
|
|
72
|
+
- `chore: bump version to 0.1.2`
|
|
73
|
+
- `docs: clarify --write-mode semantics`
|
|
74
|
+
|
|
75
|
+
## PR checklist
|
|
76
|
+
|
|
77
|
+
- [ ] `uv run ruff check src/ tests/` passes
|
|
78
|
+
- [ ] `uv run mypy src/` passes
|
|
79
|
+
- [ ] `uv run pytest` passes
|
|
80
|
+
- [ ] Added or updated tests for the changed behaviour
|
|
81
|
+
- [ ] Updated `CHANGELOG.md` under `## Unreleased` if user-visible
|
|
82
|
+
- [ ] No secrets, API keys, or `.env` files committed
|
|
83
|
+
|
|
84
|
+
## Security rules (the nine-point checklist)
|
|
85
|
+
|
|
86
|
+
If your change touches credential handling — auth, wire_credentials, file
|
|
87
|
+
writes near secrets, subprocess output that might echo a key — read
|
|
88
|
+
[`docs/design/security.md`](docs/design/security.md) first. The summary:
|
|
89
|
+
|
|
90
|
+
1. Never accept secrets as positional/flag args (use env vars or stdin/getpass).
|
|
91
|
+
2. Use `getpass.getpass()` for interactive paste; never `input()` for secrets.
|
|
92
|
+
3. Wrap credentials in `pydantic.SecretStr` immediately after capture.
|
|
93
|
+
4. `subprocess.run([...], shell=False)` always; list-form arguments only.
|
|
94
|
+
5. Use `agent_scaffold._filesec.secure_write` for any file holding a secret.
|
|
95
|
+
6. Never trust a plaintext keyring backend — refuse and surface the error.
|
|
96
|
+
7. Run any user-visible string that might contain a credential through
|
|
97
|
+
`agent_scaffold._redact.redact` before logging or persisting.
|
|
98
|
+
8. Use `agent_scaffold.writer.ensure_gitignore_defaults` to guarantee the
|
|
99
|
+
secret-safety block lands in every project's `.gitignore`.
|
|
100
|
+
9. Anything storable must be revocable via `agent-scaffold secrets purge`.
|
|
101
|
+
|
|
102
|
+
Each rule has an audit test under `tests/security/`. If your change needs
|
|
103
|
+
to bend one of them, add the exception to the corresponding allow-list with
|
|
104
|
+
a one-line justification — don't disable the test.
|
|
105
|
+
|
|
106
|
+
## Questions?
|
|
107
|
+
|
|
108
|
+
Open a discussion or issue. Happy to help scope a contribution before you invest time building.
|