ai-dev-cli-tools 1.2.2__tar.gz → 1.3.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.
- ai_dev_cli_tools-1.3.0/.dockerignore +26 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/workflows/ci.yml +59 -12
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/workflows/codeql.yml +3 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/workflows/docs.yml +2 -2
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/workflows/publish-pypi.yml +4 -4
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/workflows/release.yml +5 -5
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.gitignore +3 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/CHANGELOG.md +24 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/PKG-INFO +63 -2
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/README.md +49 -1
- ai_dev_cli_tools-1.3.0/collector/.dockerignore +27 -0
- ai_dev_cli_tools-1.3.0/collector/.env.example +19 -0
- ai_dev_cli_tools-1.3.0/collector/Dockerfile +59 -0
- ai_dev_cli_tools-1.3.0/collector/README.md +115 -0
- ai_dev_cli_tools-1.3.0/collector/__init__.py +1 -0
- ai_dev_cli_tools-1.3.0/collector/alembic/env.py +60 -0
- ai_dev_cli_tools-1.3.0/collector/alembic/script.py.mako +26 -0
- ai_dev_cli_tools-1.3.0/collector/alembic/versions/0001_initial_telemetry_events.py +107 -0
- ai_dev_cli_tools-1.3.0/collector/alembic.ini +39 -0
- ai_dev_cli_tools-1.3.0/collector/app/__init__.py +1 -0
- ai_dev_cli_tools-1.3.0/collector/app/config.py +74 -0
- ai_dev_cli_tools-1.3.0/collector/app/main.py +217 -0
- ai_dev_cli_tools-1.3.0/collector/app/models.py +126 -0
- ai_dev_cli_tools-1.3.0/collector/app/rate_limit.py +81 -0
- ai_dev_cli_tools-1.3.0/collector/app/retention.py +74 -0
- ai_dev_cli_tools-1.3.0/collector/app/storage.py +97 -0
- ai_dev_cli_tools-1.3.0/collector/app/validation.py +448 -0
- ai_dev_cli_tools-1.3.0/collector/docker-compose.yml +65 -0
- ai_dev_cli_tools-1.3.0/collector/requirements.txt +6 -0
- ai_dev_cli_tools-1.3.0/collector/tests/__init__.py +1 -0
- ai_dev_cli_tools-1.3.0/collector/tests/conftest.py +40 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_concurrency.py +48 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_config.py +120 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_dedup.py +31 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_ingestion.py +150 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_migrations.py +73 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_privacy.py +53 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_privacy_logging.py +167 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_proxy.py +118 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_rate_limit.py +123 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_retention.py +91 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_storage_retention_cli.py +108 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_streaming.py +79 -0
- ai_dev_cli_tools-1.3.0/collector/tests/test_validation_branches.py +161 -0
- ai_dev_cli_tools-1.3.0/docs/AI_DEV_CLI_TOOLS_PERFORMANCE_OPTIMIZATION_AGENT_TASK.md +1023 -0
- ai_dev_cli_tools-1.3.0/docs/AUDIT_2026-09-09.md +80 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/CHANGED_TEST_SELECTION.md +6 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/CONTEXT_BUILDER.md +16 -5
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/DISTRIBUTION.md +6 -7
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/REPORT_SCHEMA.md +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/TOOL_OUTPUT_PARSERS.md +5 -1
- ai_dev_cli_tools-1.3.0/docs/community-telemetry-collector.md +277 -0
- ai_dev_cli_tools-1.3.0/docs/community-telemetry-deployment.md +285 -0
- ai_dev_cli_tools-1.3.0/docs/community-telemetry.md +274 -0
- ai_dev_cli_tools-1.3.0/docs/performance/PERFORMANCE_BASELINE_2026-09-10.md +51 -0
- ai_dev_cli_tools-1.3.0/docs/performance/PERFORMANCE_OPTIMIZATION_REPORT_2026-09-10.md +111 -0
- ai_dev_cli_tools-1.3.0/docs/performance/RUST_NATIVE_ACCELERATION_ASSESSMENT.md +37 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/pyproject.toml +19 -4
- ai_dev_cli_tools-1.3.0/scripts/benchmark_semantic_scalability.py +125 -0
- ai_dev_cli_tools-1.3.0/scripts/test_collector_postgres_e2e.py +338 -0
- ai_dev_cli_tools-1.3.0/scripts/unified_benchmark.py +364 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/validate_ci.py +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/__init__.py +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/cache/graph.py +29 -13
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/cache/repository.py +409 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/cache/validation.py +13 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/cli.py +81 -1
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/__init__.py +59 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/builder.py +551 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/config.py +158 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/queue.py +174 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/schema.py +717 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/service.py +322 -0
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/community/transport.py +140 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/builder.py +62 -82
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/incremental.py +15 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/selection.py +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/tokens.py +14 -4
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/detectors/repository_map.py +290 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/git/inspect.py +143 -37
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/mcp_server.py +28 -12
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/parsers/logs.py +38 -2
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/check.py +17 -4
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/check_scheduler.py +21 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/check_selection.py +10 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/diagnostics.py +3 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/environment_state.py +12 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/finish.py +4 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/flaky.py +11 -3
- ai_dev_cli_tools-1.3.0/src/ai_dev_tools/semantic.py +534 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/semantic_backends.py +55 -9
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/telemetry.py +59 -3
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/token_efficiency.py +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/utils/subprocess.py +34 -21
- ai_dev_cli_tools-1.3.0/tests/integration/test_community_collector_e2e.py +249 -0
- ai_dev_cli_tools-1.3.0/tests/integration/test_git.py +220 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_cache.py +87 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_check_scheduler.py +32 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_contract_drift.py +48 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_cli.py +119 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_coverage.py +467 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_final_polish.py +481 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_functional.py +348 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_performance.py +145 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_privacy.py +160 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_release.py +194 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_community_telemetry_review_pass.py +289 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_concurrency_safety.py +315 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_coordination.py +22 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_finish.py +26 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_flaky.py +127 -101
- ai_dev_cli_tools-1.3.0/tests/unit/test_gitignore_conformance.py +212 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_issue_regressions.py +224 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_more_coverage.py +18 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_progressive_reports.py +17 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_report.py +1 -1
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_runtime_runner.py +1 -1
- ai_dev_cli_tools-1.3.0/tests/unit/test_semantic.py +198 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_semantic_backends.py +26 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_semantic_fingerprint.py +193 -0
- ai_dev_cli_tools-1.3.0/tests/unit/test_semantic_large_repo.py +322 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_symbol_diff.py +22 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_task.py +32 -0
- ai_dev_cli_tools-1.2.2/src/ai_dev_tools/cache/repository.py +0 -199
- ai_dev_cli_tools-1.2.2/src/ai_dev_tools/detectors/repository_map.py +0 -139
- ai_dev_cli_tools-1.2.2/src/ai_dev_tools/semantic.py +0 -195
- ai_dev_cli_tools-1.2.2/tests/integration/test_git.py +0 -76
- ai_dev_cli_tools-1.2.2/tests/unit/test_semantic.py +0 -88
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/.github/dependabot.yml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/CONTRIBUTING.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/LICENSE +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/Makefile +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/SECURITY.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/TODO.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/ai.ps1 +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/ai.sh +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/ADAPTIVECHESSAI_FULL_CHECK_FAILURE_2026-08-30.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/ADAPTIVECHESSAI_PYCHARM_HEADLESS_INSPECTION_FAILURE_2026-08-30.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/ADDING_A_DETECTOR.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/ADDING_A_RUNNER.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/AGENT_COORDINATION.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/AGENT_EFFICIENCY_ROADMAP.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/AGENT_INTEGRATION_CONTRACT.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/AGENT_WORKFLOW.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/ARCHITECTURE.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/BENCHMARKS.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/BOOTSTRAP.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/CACHE_AND_INDEX.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/FLAKY_RETRIES.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/INTEGRATIONS_AND_DASHBOARD.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/MCP_SERVER.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/MONOREPO_SUPPORT.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/OBSERVATION_LIFECYCLE.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/PERFORMANCE.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/PROJECT_COMPLETE.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/RELEASE_CHECKLIST.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/RUNTIME.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/SEMANTIC_COMPRESSION.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/TOKEN_EFFICIENCY_RESEARCH.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/WARM_ENVIRONMENT.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/WATCH_MODE.md +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/benchmarks/agent-workflows-windows-py314-2026-08-11.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/docs/report-schema.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-adaptive-context.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-affected-workflow.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-context-acknowledgement.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-corpus.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-feedback-delta.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-monorepo-workflow.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-multiturn-workflow.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/agent-repair-workflow.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/src/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/src/orders.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/src/pricing.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_orders.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_pricing.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_1.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_10.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_11.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_12.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_2.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_3.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_4.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_5.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_6.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_7.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_8.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/tests/test_unrelated_9.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/src/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/src/billing.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/tests/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/billing/tests/test_billing.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/src/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/src/catalog.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/tests/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/fixtures/agent-workflow/workspaces/catalog/tests/test_catalog.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/mcp-recurring-status.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/output-budget-smoke.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/benchmarks/symbol-diff-context.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/examples/consume_json_report.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/requirements-dev.lock +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/benchmark_agent_workflow.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/benchmark_mcp_context_ack.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/benchmark_mcp_status.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/benchmark_symbol_diff.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/dev.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/test_installed_package.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/validate_release.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/scripts/verify_published_package.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/__main__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/cache/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/cache/prompt_layout.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/completion.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/config.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/adaptive.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/compression.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/mcp_delta.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/models.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/profiles.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/refinement.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/retrieval.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/context/symbols.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/dashboard.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/detectors/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/detectors/environment.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/detectors/project.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/detectors/runtime.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/detectors/workspaces.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/git/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/git/symbol_diff.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/index_daemon_service.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/integrations.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/models/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/models/report.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/models/workspace.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/parsers/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/parsers/failures.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/parsers/registry.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/reporters/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/reporters/progressive.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/reporters/sarif.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/reporters/writer.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/baseline.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/benchmark.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/bootstrap.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/bootstrap_models.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/bootstrap_strategies.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/cache.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/check_checkpoint.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/check_models.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/coordination.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/feedback.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/feedback_delta.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/focused.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/index.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/index_daemon.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/observations.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/performance.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/plan.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/policy.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/task.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runners/watch.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runtime/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runtime/runner.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/runtime/supervisor.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/security/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/security/execution.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/security/secrets.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/source_symbols.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/telemetry_optimizer.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/telemetry_policy.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/src/ai_dev_tools/utils/__init__.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/cargo-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/coverage-ok.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/eslint-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/gradle-ok.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/jest-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/maven-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/maven-localized-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/mypy-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/phpunit-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/pytest-9-ok.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/pytest-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/pytest-multiple-failures.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/ruff-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/ruff-warning.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/tsc-fail.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/logs/vitest-ok.log +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/package.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/packages/api/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/packages/api/tests/test_smoke.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/packages/web/package.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/packages/web/test.js +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/services/worker/Cargo.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/monorepo-mixed/services/worker/src/lib.rs +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/gradle/build.gradle +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/gradle/gradlew.bat +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/maven/mvnw.cmd +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/maven/pom.xml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-npm/package-lock.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-npm/package.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-pnpm/package.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-pnpm/pnpm-lock.yaml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-yarn/package.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/node-yarn/yarn.lock +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/php-composer/composer.json +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/python-pip/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/python-pip/requirements.txt +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/python-poetry/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/python-uv/pyproject.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/python-uv/uv.lock +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/fixtures/projects/rust/Cargo.toml +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/integration/test_adaptive_chess_regression.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/integration/test_cli.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/integration/test_cross_platform_paths.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/integration/test_toolchain_e2e.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_adaptive_context.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_agent_plan.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_baseline.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_benchmark.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_benchmark_gate.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_bootstrap.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_check.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_check_plan.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_cli_more.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_completion.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_config.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_builder.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_compression.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_mcp_delta.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_profiles.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_refinement.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_retrieval.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_context_symbols.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_dev_launcher.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_diagnostics.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_doctor.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_environment_state.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_execution_policy.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_failure_classification.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_feedback.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_feedback_delta.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_index_daemon.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_index_daemon_service.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_integrations_dashboard.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_logs.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_mcp_server.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_more_symbol_adapters.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_new_cli_commands.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_observations.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_package_smoke.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_performance.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_prompt_layout.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_release_scripts.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_repository_map.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_runner_failures.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_runtime.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_runtime_supervisor.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_sarif.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_scan.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_secret_boundaries.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_secrets.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_telemetry.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_telemetry_optimizer.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_telemetry_policy.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_token_accounting.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_tool_parsers.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_watch.py +0 -0
- {ai_dev_cli_tools-1.2.2 → ai_dev_cli_tools-1.3.0}/tests/unit/test_workspaces.py +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
.git
|
|
2
|
+
.gitignore
|
|
3
|
+
.venv
|
|
4
|
+
venv
|
|
5
|
+
env
|
|
6
|
+
__pycache__
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
*.pyd
|
|
10
|
+
.mypy_cache
|
|
11
|
+
.pytest_cache
|
|
12
|
+
.ruff_cache
|
|
13
|
+
.coverage
|
|
14
|
+
.coverage.*
|
|
15
|
+
build
|
|
16
|
+
dist
|
|
17
|
+
*.egg-info
|
|
18
|
+
.tmp-*
|
|
19
|
+
.ai
|
|
20
|
+
*.db
|
|
21
|
+
*.sqlite
|
|
22
|
+
*.sqlite3
|
|
23
|
+
collector/tests
|
|
24
|
+
tests
|
|
25
|
+
docs
|
|
26
|
+
examples
|
|
@@ -8,8 +8,8 @@ jobs:
|
|
|
8
8
|
launcher-smoke:
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
10
|
steps:
|
|
11
|
-
- uses: actions/checkout@
|
|
12
|
-
- uses: actions/setup-python@
|
|
11
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
12
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
13
13
|
with:
|
|
14
14
|
python-version: "3.13"
|
|
15
15
|
- run: python scripts/dev.py --diagnose
|
|
@@ -24,8 +24,8 @@ jobs:
|
|
|
24
24
|
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
25
25
|
runs-on: ${{ matrix.os }}
|
|
26
26
|
steps:
|
|
27
|
-
- uses: actions/checkout@
|
|
28
|
-
- uses: actions/setup-python@
|
|
27
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
28
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
29
29
|
with:
|
|
30
30
|
python-version: ${{ matrix.python-version }}
|
|
31
31
|
- run: python -m pip install --upgrade pip
|
|
@@ -55,14 +55,14 @@ jobs:
|
|
|
55
55
|
toolchain-e2e:
|
|
56
56
|
runs-on: ubuntu-latest
|
|
57
57
|
steps:
|
|
58
|
-
- uses: actions/checkout@
|
|
59
|
-
- uses: actions/setup-python@
|
|
58
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
59
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
60
60
|
with:
|
|
61
61
|
python-version: "3.13"
|
|
62
62
|
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
63
63
|
with:
|
|
64
64
|
node-version: "22"
|
|
65
|
-
- uses: actions/setup-java@
|
|
65
|
+
- uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1
|
|
66
66
|
with:
|
|
67
67
|
distribution: temurin
|
|
68
68
|
java-version: "17"
|
|
@@ -84,10 +84,10 @@ jobs:
|
|
|
84
84
|
agent-corpus:
|
|
85
85
|
runs-on: ubuntu-latest
|
|
86
86
|
steps:
|
|
87
|
-
- uses: actions/checkout@
|
|
87
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
88
88
|
with:
|
|
89
89
|
persist-credentials: false
|
|
90
|
-
- uses: actions/setup-python@
|
|
90
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
91
91
|
with:
|
|
92
92
|
python-version: "3.13"
|
|
93
93
|
- run: python -m pip install -c requirements-dev.lock -e ".[dev]"
|
|
@@ -110,11 +110,11 @@ jobs:
|
|
|
110
110
|
contents: read
|
|
111
111
|
security-events: write
|
|
112
112
|
steps:
|
|
113
|
-
- uses: actions/checkout@
|
|
113
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
114
114
|
with:
|
|
115
115
|
fetch-depth: 0
|
|
116
116
|
persist-credentials: false
|
|
117
|
-
- uses: actions/setup-python@
|
|
117
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
118
118
|
with:
|
|
119
119
|
python-version: "3.13"
|
|
120
120
|
- run: python -m pip install -c requirements-dev.lock -e ".[dev]"
|
|
@@ -126,6 +126,53 @@ jobs:
|
|
|
126
126
|
run: cat .ai/reports/agent-plan.md >> "$GITHUB_STEP_SUMMARY"
|
|
127
127
|
- name: Upload SARIF to GitHub code scanning
|
|
128
128
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
|
|
129
|
-
uses: github/codeql-action/upload-sarif@
|
|
129
|
+
uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4
|
|
130
130
|
with:
|
|
131
131
|
sarif_file: .ai/reports/ai-dev.sarif
|
|
132
|
+
|
|
133
|
+
collector-postgres-e2e:
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
services:
|
|
136
|
+
postgres:
|
|
137
|
+
image: postgres:16-alpine
|
|
138
|
+
env:
|
|
139
|
+
POSTGRES_DB: telemetry
|
|
140
|
+
POSTGRES_USER: telemetry_user
|
|
141
|
+
POSTGRES_PASSWORD: test_ci_password_123
|
|
142
|
+
ports:
|
|
143
|
+
- 5432:5432
|
|
144
|
+
options: >-
|
|
145
|
+
--health-cmd pg_isready
|
|
146
|
+
--health-interval 5s
|
|
147
|
+
--health-timeout 5s
|
|
148
|
+
--health-retries 5
|
|
149
|
+
steps:
|
|
150
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
151
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
152
|
+
with:
|
|
153
|
+
python-version: "3.13"
|
|
154
|
+
- run: python -m pip install --upgrade pip
|
|
155
|
+
- run: python -m pip install -r collector/requirements.txt -e .
|
|
156
|
+
- name: Test Alembic migration against PostgreSQL
|
|
157
|
+
env:
|
|
158
|
+
DATABASE_URL: postgresql+psycopg://telemetry_user:test_ci_password_123@localhost:5432/telemetry
|
|
159
|
+
run: |
|
|
160
|
+
python -m alembic -c collector/alembic.ini upgrade head
|
|
161
|
+
python -m alembic -c collector/alembic.ini current
|
|
162
|
+
- name: Build Docker collector image
|
|
163
|
+
run: docker build -f collector/Dockerfile -t ai-dev-collector:test .
|
|
164
|
+
- name: Run Docker collector container E2E ingestion test
|
|
165
|
+
env:
|
|
166
|
+
DATABASE_URL: postgresql+psycopg://telemetry_user:test_ci_password_123@localhost:5432/telemetry
|
|
167
|
+
COLLECTOR_URL: http://127.0.0.1:8000
|
|
168
|
+
PYTHONPATH: .
|
|
169
|
+
run: |
|
|
170
|
+
docker run -d --name test-collector --network host \
|
|
171
|
+
-e DATABASE_URL=postgresql+psycopg://telemetry_user:test_ci_password_123@localhost:5432/telemetry \
|
|
172
|
+
-e ENVIRONMENT=production \
|
|
173
|
+
ai-dev-collector:test
|
|
174
|
+
sleep 3
|
|
175
|
+
docker logs test-collector
|
|
176
|
+
python scripts/test_collector_postgres_e2e.py
|
|
177
|
+
docker stop test-collector
|
|
178
|
+
docker rm test-collector
|
|
@@ -17,12 +17,12 @@ jobs:
|
|
|
17
17
|
name: Analyze Python
|
|
18
18
|
runs-on: ubuntu-latest
|
|
19
19
|
steps:
|
|
20
|
-
- uses: actions/checkout@
|
|
20
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
21
21
|
with:
|
|
22
22
|
persist-credentials: false
|
|
23
|
-
- uses: github/codeql-action/init@
|
|
23
|
+
- uses: github/codeql-action/init@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4
|
|
24
24
|
with:
|
|
25
25
|
languages: python
|
|
26
26
|
build-mode: none
|
|
27
27
|
queries: security-extended
|
|
28
|
-
- uses: github/codeql-action/analyze@
|
|
28
|
+
- uses: github/codeql-action/analyze@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4
|
|
@@ -8,8 +8,8 @@ jobs:
|
|
|
8
8
|
docs:
|
|
9
9
|
runs-on: ubuntu-latest
|
|
10
10
|
steps:
|
|
11
|
-
- uses: actions/checkout@
|
|
12
|
-
- uses: actions/setup-python@
|
|
11
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
12
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
13
13
|
with:
|
|
14
14
|
python-version: "3.12"
|
|
15
15
|
- run: python -m pip install -c requirements-dev.lock -e ".[dev]"
|
|
@@ -14,11 +14,11 @@ jobs:
|
|
|
14
14
|
name: Validate manually promoted release artifacts
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
18
18
|
with:
|
|
19
19
|
persist-credentials: false
|
|
20
20
|
ref: ${{ github.event.release.tag_name }}
|
|
21
|
-
- uses: actions/setup-python@
|
|
21
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
22
22
|
with:
|
|
23
23
|
python-version: "3.13"
|
|
24
24
|
- name: Download artifacts attached by the TestPyPI workflow
|
|
@@ -71,11 +71,11 @@ jobs:
|
|
|
71
71
|
needs: publish-pypi
|
|
72
72
|
runs-on: ubuntu-latest
|
|
73
73
|
steps:
|
|
74
|
-
- uses: actions/checkout@
|
|
74
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
75
75
|
with:
|
|
76
76
|
persist-credentials: false
|
|
77
77
|
ref: ${{ github.event.release.tag_name }}
|
|
78
|
-
- uses: actions/setup-python@
|
|
78
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
79
79
|
with:
|
|
80
80
|
python-version: "3.13"
|
|
81
81
|
- name: Install and smoke test from PyPI through pipx
|
|
@@ -13,10 +13,10 @@ jobs:
|
|
|
13
13
|
name: Build and validate distribution
|
|
14
14
|
runs-on: ubuntu-latest
|
|
15
15
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
16
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
17
|
with:
|
|
18
18
|
persist-credentials: false
|
|
19
|
-
- uses: actions/setup-python@
|
|
19
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
20
20
|
with:
|
|
21
21
|
python-version: "3.13"
|
|
22
22
|
- name: Validate tag and source version
|
|
@@ -65,10 +65,10 @@ jobs:
|
|
|
65
65
|
needs: publish-testpypi
|
|
66
66
|
runs-on: ubuntu-latest
|
|
67
67
|
steps:
|
|
68
|
-
- uses: actions/checkout@
|
|
68
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
69
69
|
with:
|
|
70
70
|
persist-credentials: false
|
|
71
|
-
- uses: actions/setup-python@
|
|
71
|
+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
|
72
72
|
with:
|
|
73
73
|
python-version: "3.13"
|
|
74
74
|
- name: Install and smoke test from TestPyPI
|
|
@@ -84,7 +84,7 @@ jobs:
|
|
|
84
84
|
permissions:
|
|
85
85
|
contents: write
|
|
86
86
|
steps:
|
|
87
|
-
- uses: actions/checkout@
|
|
87
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
88
88
|
with:
|
|
89
89
|
persist-credentials: false
|
|
90
90
|
- name: Download TestPyPI-verified distribution artifact
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 1.3.0 - 2026-09-15
|
|
4
|
+
|
|
5
|
+
- **Community Telemetry**: Add privacy-preserving, voluntary, opt-in telemetry (`OFF`, `BASIC`, `RESEARCH`).
|
|
6
|
+
- Strict client allowlist schema; source code, prompts, model responses, repository names, file paths, user identifiers, and credentials are never collected.
|
|
7
|
+
- Transparent user control via `ai-dev telemetry sharing` commands (`status`, `enable basic`, `enable research`, `disable`, `preview`, `flush`).
|
|
8
|
+
- Bounded local disk queue with automatic retention pruning (max 1,000 events, max 7 days, max 32 KB per event).
|
|
9
|
+
- Single-flight non-blocking background transport worker.
|
|
10
|
+
- Support for research-level provider usage metrics collected via MCP tool (`record_usage`) and CLI usage imports.
|
|
11
|
+
- **Production Telemetry Collector**: Introduce the self-contained production backend collector (`collector/`):
|
|
12
|
+
- Fast, auditable FastAPI ingestion endpoint (`POST /v1/events`) with liveness (`/health`) and readiness (`/ready`) probes.
|
|
13
|
+
- Fail-closed payload validation and streaming body size enforcement (32 KB limit).
|
|
14
|
+
- In-memory bounded sliding-window rate limiter with single-IP trusted reverse proxy sanitization.
|
|
15
|
+
- Idempotent deduplication on primary key `event_id`.
|
|
16
|
+
- PostgreSQL 16 storage backed by versioned Alembic migrations.
|
|
17
|
+
- Automated 90-day retention cleanup.
|
|
18
|
+
- Privacy-safe logging with zero client input, path, or credential leakage.
|
|
19
|
+
- Configured default HTTPS production endpoint (`https://35.209.177.185.sslip.io/v1/events`).
|
|
20
|
+
- **Validation & Runner Hardening**:
|
|
21
|
+
- Fix #78: Recognize Node spec/TAP summaries without matching `recoverable` as coverage.
|
|
22
|
+
- Fix #79: Execute selected `.mjs`/`.cjs` tests, retain broad fallback commands, and fail explicitly when selected tests have no runnable validation plan.
|
|
23
|
+
- Fix #80: Preserve source prefixes under small content budgets, document content-only `max_chars`, measure actual artifact sizes, and distinguish receipt/content truncation.
|
|
24
|
+
- Preserve numeric parser error counts and restrict pytest arguments to Python selections.
|
|
25
|
+
- Prevent `finish` from approving incomplete, blocked, or invalid validation.
|
|
26
|
+
- Drain cancellable subprocess pipes while waiting and preserve output captured before timeout.
|
|
4
27
|
|
|
5
28
|
## 1.2.2 - 2026-09-08
|
|
6
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ai-dev-cli-tools
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0
|
|
4
4
|
Summary: Cross-platform CLI helpers that give AI coding agents concise, deterministic development reports.
|
|
5
5
|
Project-URL: Homepage, https://github.com/MatthiasLew/ai-dev-cli-tools
|
|
6
6
|
Project-URL: Repository, https://github.com/MatthiasLew/ai-dev-cli-tools
|
|
@@ -21,12 +21,25 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
21
21
|
Classifier: Topic :: Software Development :: Quality Assurance
|
|
22
22
|
Requires-Python: >=3.11
|
|
23
23
|
Requires-Dist: watchdog<7,>=4
|
|
24
|
+
Provides-Extra: collector
|
|
25
|
+
Requires-Dist: alembic>=1.13; extra == 'collector'
|
|
26
|
+
Requires-Dist: fastapi>=0.115; extra == 'collector'
|
|
27
|
+
Requires-Dist: httpx>=0.27; extra == 'collector'
|
|
28
|
+
Requires-Dist: pydantic>=2.8; extra == 'collector'
|
|
29
|
+
Requires-Dist: sqlalchemy>=2.0; extra == 'collector'
|
|
30
|
+
Requires-Dist: uvicorn>=0.30; extra == 'collector'
|
|
24
31
|
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: alembic>=1.13; extra == 'dev'
|
|
25
33
|
Requires-Dist: build>=1.2; extra == 'dev'
|
|
26
34
|
Requires-Dist: coverage[toml]>=7.6; extra == 'dev'
|
|
35
|
+
Requires-Dist: fastapi>=0.115; extra == 'dev'
|
|
36
|
+
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
27
37
|
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
38
|
+
Requires-Dist: pydantic>=2.8; extra == 'dev'
|
|
28
39
|
Requires-Dist: pytest>=8.3; extra == 'dev'
|
|
29
40
|
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
41
|
+
Requires-Dist: sqlalchemy>=2.0; extra == 'dev'
|
|
42
|
+
Requires-Dist: uvicorn>=0.30; extra == 'dev'
|
|
30
43
|
Provides-Extra: semantic
|
|
31
44
|
Requires-Dist: tree-sitter-language-pack>=0.9; extra == 'semantic'
|
|
32
45
|
Provides-Extra: tokenizers
|
|
@@ -54,11 +67,59 @@ artifacts may be removed when no longer needed; cache, runtime, and temporary st
|
|
|
54
67
|
be safe for `ai-dev` to recreate.
|
|
55
68
|
```
|
|
56
69
|
|
|
70
|
+
## Help improve ai-dev
|
|
71
|
+
|
|
72
|
+
`ai-dev` is being evaluated on real-world coding-agent workflows.
|
|
73
|
+
|
|
74
|
+
If you want to support development, you can optionally enable privacy-preserving opt-in telemetry without persistent user identifiers.
|
|
75
|
+
|
|
76
|
+
Community Telemetry is **OFF by default**. Installation never automatically activates it.
|
|
77
|
+
|
|
78
|
+
### Commands
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
ai-dev telemetry sharing status
|
|
82
|
+
ai-dev telemetry sharing enable basic
|
|
83
|
+
ai-dev telemetry sharing enable research
|
|
84
|
+
ai-dev telemetry sharing disable
|
|
85
|
+
ai-dev telemetry sharing preview
|
|
86
|
+
ai-dev telemetry sharing flush
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- **OFF**: Nothing is collected or sent.
|
|
90
|
+
- **BASIC**: Minimal operational metrics (command name, category, outcome, duration bucket, OS family, Python version).
|
|
91
|
+
- **RESEARCH**: BASIC metrics plus model provider usage (model name, token counts, task outcome, repo size bucket).
|
|
92
|
+
|
|
93
|
+
Default production endpoint: `https://35.209.177.185.sslip.io/v1/events` (can be overridden with `AI_DEV_COMMUNITY_TELEMETRY_ENDPOINT`).
|
|
94
|
+
|
|
95
|
+
Never shared:
|
|
96
|
+
- source code
|
|
97
|
+
- prompts
|
|
98
|
+
- model responses
|
|
99
|
+
- repository names
|
|
100
|
+
- file names or paths
|
|
101
|
+
- usernames/emails
|
|
102
|
+
- secrets/API keys
|
|
103
|
+
|
|
104
|
+
Preview what data fields would be shared from your repository:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
ai-dev telemetry sharing preview --level research
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Or view a synthetic example payload:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
ai-dev telemetry sharing preview --level research --sample
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
For complete details on data handling, allowed scalar metrics, and local queueing, see [docs/community-telemetry.md](docs/community-telemetry.md).
|
|
117
|
+
|
|
57
118
|
## Install
|
|
58
119
|
|
|
59
120
|
```bash
|
|
60
121
|
python -m pip install --upgrade pipx
|
|
61
|
-
pipx install ai-dev-cli-tools==1.
|
|
122
|
+
pipx install ai-dev-cli-tools==1.3.0
|
|
62
123
|
ai-dev --help
|
|
63
124
|
```
|
|
64
125
|
|
|
@@ -19,11 +19,59 @@ artifacts may be removed when no longer needed; cache, runtime, and temporary st
|
|
|
19
19
|
be safe for `ai-dev` to recreate.
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
## Help improve ai-dev
|
|
23
|
+
|
|
24
|
+
`ai-dev` is being evaluated on real-world coding-agent workflows.
|
|
25
|
+
|
|
26
|
+
If you want to support development, you can optionally enable privacy-preserving opt-in telemetry without persistent user identifiers.
|
|
27
|
+
|
|
28
|
+
Community Telemetry is **OFF by default**. Installation never automatically activates it.
|
|
29
|
+
|
|
30
|
+
### Commands
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
ai-dev telemetry sharing status
|
|
34
|
+
ai-dev telemetry sharing enable basic
|
|
35
|
+
ai-dev telemetry sharing enable research
|
|
36
|
+
ai-dev telemetry sharing disable
|
|
37
|
+
ai-dev telemetry sharing preview
|
|
38
|
+
ai-dev telemetry sharing flush
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- **OFF**: Nothing is collected or sent.
|
|
42
|
+
- **BASIC**: Minimal operational metrics (command name, category, outcome, duration bucket, OS family, Python version).
|
|
43
|
+
- **RESEARCH**: BASIC metrics plus model provider usage (model name, token counts, task outcome, repo size bucket).
|
|
44
|
+
|
|
45
|
+
Default production endpoint: `https://35.209.177.185.sslip.io/v1/events` (can be overridden with `AI_DEV_COMMUNITY_TELEMETRY_ENDPOINT`).
|
|
46
|
+
|
|
47
|
+
Never shared:
|
|
48
|
+
- source code
|
|
49
|
+
- prompts
|
|
50
|
+
- model responses
|
|
51
|
+
- repository names
|
|
52
|
+
- file names or paths
|
|
53
|
+
- usernames/emails
|
|
54
|
+
- secrets/API keys
|
|
55
|
+
|
|
56
|
+
Preview what data fields would be shared from your repository:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
ai-dev telemetry sharing preview --level research
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Or view a synthetic example payload:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
ai-dev telemetry sharing preview --level research --sample
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
For complete details on data handling, allowed scalar metrics, and local queueing, see [docs/community-telemetry.md](docs/community-telemetry.md).
|
|
69
|
+
|
|
22
70
|
## Install
|
|
23
71
|
|
|
24
72
|
```bash
|
|
25
73
|
python -m pip install --upgrade pipx
|
|
26
|
-
pipx install ai-dev-cli-tools==1.
|
|
74
|
+
pipx install ai-dev-cli-tools==1.3.0
|
|
27
75
|
ai-dev --help
|
|
28
76
|
```
|
|
29
77
|
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
__pycache__
|
|
2
|
+
*.pyc
|
|
3
|
+
*.pyo
|
|
4
|
+
*.pyd
|
|
5
|
+
.Python
|
|
6
|
+
env/
|
|
7
|
+
venv/
|
|
8
|
+
.venv/
|
|
9
|
+
pip-log.txt
|
|
10
|
+
pip-delete-this-directory.txt
|
|
11
|
+
.tox/
|
|
12
|
+
.coverage
|
|
13
|
+
.coverage.*
|
|
14
|
+
.cache
|
|
15
|
+
nosetests.xml
|
|
16
|
+
coverage.xml
|
|
17
|
+
*.cover
|
|
18
|
+
*.log
|
|
19
|
+
.git
|
|
20
|
+
.gitignore
|
|
21
|
+
.mypy_cache
|
|
22
|
+
.pytest_cache
|
|
23
|
+
.ruff_cache
|
|
24
|
+
tests/
|
|
25
|
+
*.db
|
|
26
|
+
*.sqlite
|
|
27
|
+
.env
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Community Telemetry Collector Environment Configuration
|
|
2
|
+
# Copy this file to .env and configure your values. Never commit credentials to version control.
|
|
3
|
+
|
|
4
|
+
# Database connection URL
|
|
5
|
+
# For SQLite (local dev/testing): sqlite:///./telemetry.db
|
|
6
|
+
# For PostgreSQL (production): postgresql+psycopg://username:password@hostname:5432/dbname
|
|
7
|
+
DATABASE_URL=sqlite:///./telemetry.db
|
|
8
|
+
|
|
9
|
+
# In-memory rate limit per client IP (requests per minute)
|
|
10
|
+
RATE_LIMIT_PER_MINUTE=60
|
|
11
|
+
|
|
12
|
+
# Raw event retention period (days)
|
|
13
|
+
RETENTION_DAYS=90
|
|
14
|
+
|
|
15
|
+
# Environment mode (development / production)
|
|
16
|
+
ENVIRONMENT=development
|
|
17
|
+
|
|
18
|
+
# Server port (default 8000)
|
|
19
|
+
PORT=8000
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Multi-stage minimal production Dockerfile for Community Telemetry Collector
|
|
2
|
+
# Build context MUST be the repository root:
|
|
3
|
+
# docker build -f collector/Dockerfile -t ai-dev-collector:latest .
|
|
4
|
+
|
|
5
|
+
FROM python:3.13-slim AS builder
|
|
6
|
+
|
|
7
|
+
WORKDIR /build
|
|
8
|
+
|
|
9
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
10
|
+
build-essential \
|
|
11
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
12
|
+
|
|
13
|
+
RUN python -m venv /opt/venv
|
|
14
|
+
ENV PATH="/opt/venv/bin:$PATH"
|
|
15
|
+
|
|
16
|
+
# 1. Install collector dependencies
|
|
17
|
+
COPY collector/requirements.txt .
|
|
18
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
19
|
+
|
|
20
|
+
# 2. Build and install ai-dev-cli-tools package for schema validation without external dev tools
|
|
21
|
+
COPY pyproject.toml README.md ./
|
|
22
|
+
COPY src/ ./src/
|
|
23
|
+
RUN pip install --no-cache-dir build hatchling && \
|
|
24
|
+
python -m build --wheel --no-isolation --outdir /wheels . && \
|
|
25
|
+
pip install --no-cache-dir --no-deps /wheels/*.whl
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
FROM python:3.13-slim AS runner
|
|
29
|
+
|
|
30
|
+
# Security: Create non-root user
|
|
31
|
+
RUN groupadd -r appuser && useradd -r -g appuser -d /app -s /sbin/nologin -c "Docker image user" appuser
|
|
32
|
+
|
|
33
|
+
WORKDIR /app
|
|
34
|
+
|
|
35
|
+
# Copy virtualenv from builder
|
|
36
|
+
COPY --from=builder /opt/venv /opt/venv
|
|
37
|
+
ENV PATH="/opt/venv/bin:$PATH"
|
|
38
|
+
ENV PYTHONPATH="/app"
|
|
39
|
+
ENV PYTHONUNBUFFERED=1
|
|
40
|
+
ENV PYTHONDONTWRITEBYTECODE=1
|
|
41
|
+
|
|
42
|
+
# Copy application source & Alembic migrations
|
|
43
|
+
COPY collector/app/ /app/collector/app/
|
|
44
|
+
COPY collector/alembic/ /app/collector/alembic/
|
|
45
|
+
COPY collector/alembic.ini /app/collector/alembic.ini
|
|
46
|
+
|
|
47
|
+
# Set ownership to non-root user
|
|
48
|
+
RUN chown -R appuser:appuser /app
|
|
49
|
+
|
|
50
|
+
USER appuser
|
|
51
|
+
|
|
52
|
+
EXPOSE 8000
|
|
53
|
+
|
|
54
|
+
# Health check without curl dependency (probes liveness endpoint)
|
|
55
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 \
|
|
56
|
+
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1
|
|
57
|
+
|
|
58
|
+
# Start uvicorn with access logging disabled (privacy preservation for client IPs)
|
|
59
|
+
CMD ["uvicorn", "collector.app.main:app", "--host", "0.0.0.0", "--port", "8000", "--no-access-log"]
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# ai-dev Community Telemetry Collector
|
|
2
|
+
|
|
3
|
+
Lightweight, privacy-preserving, fail-closed production collector for `ai-dev` Community Telemetry (`schema_version = 1`).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Key Privacy & Security Guarantees
|
|
8
|
+
|
|
9
|
+
1. **No User Tracking**: Does not assign, store, or generate user IDs, device fingerprints, or machine identifiers.
|
|
10
|
+
2. **No Persistent IP Logging**: IP addresses are used solely in transient in-memory token buckets for rate limiting and are never written to disk or database. Access logs must be disabled or sanitized at the edge reverse proxy.
|
|
11
|
+
3. **Strict Trusted Proxy Model & Single-IP Defense-in-Depth**: By default, `TRUST_PROXY_HEADERS=false` and client IP is extracted from the direct peer (`request.client.host`). `X-Forwarded-For` is only parsed if explicitly enabled and the connecting peer IP matches `TRUSTED_PROXY_IPS` networks. Furthermore, the reverse proxy must sanitize `X-Forwarded-For: $remote_addr;` and the collector strictly accepts only a single forwarded IP (any multi-value comma-separated header is rejected and falls back to peer IP).
|
|
12
|
+
4. **Hard-Bounded Rate Limiter**: Rate limiter state is backed by an `OrderedDict` with LRU and stale eviction, guaranteeing `len(_buckets) <= MAX_ENTRIES` (bounds: 100 to 1,000,000) under adversarial key generation.
|
|
13
|
+
5. **Streaming Body Limit**: Request body is read incrementally via streaming chunks. Payloads exceeding 32 KB (`32,768 bytes`) are aborted immediately with `413 Content Too Large` without full buffer allocation.
|
|
14
|
+
6. **Explicit Schema Migrations**: Managed by Alembic (`collector/alembic/`). Production startup never performs silent `create_all()` mutations.
|
|
15
|
+
7. **No Code, Prompts, or Paths**: Strict fail-closed schema validation automatically rejects any payload containing unknown keys, file paths, code snippets, or prompt text.
|
|
16
|
+
8. **Privacy-Safe Application Logging**: Application logs never record raw payload contents, field values, model names, paths, emails, client IPs, or database credentials. Validation errors log controlled category codes only, and storage failures log exception type names only.
|
|
17
|
+
9. **90-Day Raw Retention**: Automated retention script purges raw records older than 90 days based strictly on server `received_at` timestamp.
|
|
18
|
+
10. **Idempotent Ingestion**: `event_id` is an RFC 4122 UUIDv4 used exclusively as a deduplication primary key (`ON CONFLICT DO NOTHING`). Duplicate submissions return `200 OK` (`{"status": "accepted", "duplicate": true}`) without duplicate writes.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## API Endpoints
|
|
23
|
+
|
|
24
|
+
### 1. Liveness Probe: `GET /health`
|
|
25
|
+
Confirms the collector process is running and responsive.
|
|
26
|
+
- **Response** (`200 OK`):
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"status": "ok",
|
|
30
|
+
"schema_version": 1
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Readiness Probe: `GET /ready`
|
|
35
|
+
Confirms connectivity to the backing database.
|
|
36
|
+
- **Response** (`200 OK`):
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"status": "ready",
|
|
40
|
+
"database": "connected"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
- **Error Response** (`503 Service Unavailable`):
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"status": "degraded",
|
|
47
|
+
"error": "database_unavailable"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3. Ingest Event: `POST /v1/events`
|
|
52
|
+
- **Headers**:
|
|
53
|
+
- `Content-Type: application/json`
|
|
54
|
+
- `X-Content-Type-Options: nosniff` (applied to response)
|
|
55
|
+
- **Limits**: Body size $\le 32\text{ KB}$, 60 req/min per transient client IP.
|
|
56
|
+
- **Success Response** (`202 Accepted`):
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"status": "accepted",
|
|
60
|
+
"duplicate": false
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
- **Duplicate Response** (`200 OK`):
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"status": "accepted",
|
|
67
|
+
"duplicate": true
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
- **Error Responses**:
|
|
71
|
+
- `400 Bad Request`: `{"status": "rejected", "error": "validation_failed"}`
|
|
72
|
+
- `413 Content Too Large`: `{"status": "rejected", "error": "payload_too_large"}`
|
|
73
|
+
- `415 Unsupported Media Type`: `{"status": "rejected", "error": "unsupported_media_type"}`
|
|
74
|
+
- `429 Too Many Requests`: `{"status": "rejected", "error": "rate_limited"}` (with `Retry-After` header)
|
|
75
|
+
- `500 Server Error`: `{"status": "error", "error": "storage_failed"}`
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Local Development vs. Production
|
|
80
|
+
|
|
81
|
+
### Local Development (SQLite or Docker Compose)
|
|
82
|
+
In development, SQLite is permitted and the database can be initialized automatically or via Alembic:
|
|
83
|
+
```bash
|
|
84
|
+
# 1. Run migrations locally
|
|
85
|
+
python -m alembic -c collector/alembic.ini upgrade head
|
|
86
|
+
|
|
87
|
+
# 2. Run collector locally
|
|
88
|
+
uvicorn collector.app.main:app --host 127.0.0.1 --port 8000
|
|
89
|
+
```
|
|
90
|
+
Or with Docker Compose:
|
|
91
|
+
```bash
|
|
92
|
+
docker compose -f collector/docker-compose.yml up -d --build
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Production Deployment (PostgreSQL Required)
|
|
96
|
+
In production (`ENVIRONMENT=production`):
|
|
97
|
+
- `DATABASE_URL` **must** be a PostgreSQL connection string (`postgresql+psycopg://...`). SQLite will fail fast on startup.
|
|
98
|
+
- Migrations **must** be executed before launching the collector:
|
|
99
|
+
```bash
|
|
100
|
+
alembic -c collector/alembic.ini upgrade head
|
|
101
|
+
```
|
|
102
|
+
- Set `TRUST_PROXY_HEADERS=true` only if deployed behind a verified reverse proxy (e.g. Caddy / Nginx) and configure `TRUSTED_PROXY_IPS`.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Running Retention Cleanup
|
|
107
|
+
|
|
108
|
+
To purge events older than 90 days:
|
|
109
|
+
```bash
|
|
110
|
+
python -m collector.app.retention --days 90
|
|
111
|
+
```
|
|
112
|
+
Dry run mode (preview without deletion):
|
|
113
|
+
```bash
|
|
114
|
+
python -m collector.app.retention --days 90 --dry-run
|
|
115
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Community Telemetry Collector package."""
|