repotoire 0.1.4__tar.gz → 0.1.7__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.
- {repotoire-0.1.4 → repotoire-0.1.7}/PKG-INFO +28 -10
- {repotoire-0.1.4 → repotoire-0.1.7}/README.md +24 -6
- {repotoire-0.1.4 → repotoire-0.1.7}/pyproject.toml +7 -9
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/__init__.py +2 -1
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/auth/__init__.py +2 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/auth/clerk.py +27 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/__init__.py +1 -3
- repotoire-0.1.7/repotoire/api/shared/services/stripe_service.py +251 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/__init__.py +0 -12
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/__init__.py +0 -2
- repotoire-0.1.7/repotoire/api/v1/routes/admin/__init__.py +5 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/usage.py +3 -3
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/webhooks.py +0 -249
- repotoire-0.1.7/repotoire/api/v1/schemas/__init__.py +3 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/__init__.py +161 -23
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/ml.py +36 -2
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/tier_limits.py +2 -2
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/__init__.py +0 -28
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/audit.py +3 -6
- repotoire-0.1.7/repotoire/db/session.py +464 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/dead_code.py +4 -4
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/engine.py +29 -1
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/graph_algorithms.py +32 -3
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/cloud_client.py +40 -2
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/historical/git_rag.py +2 -2
- repotoire-0.1.7/repotoire/insights/__init__.py +12 -0
- repotoire-0.1.7/repotoire/insights/engine.py +631 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/models.py +4 -0
- repotoire-0.1.7/repotoire/web/node_modules/@monaco-editor/loader/playground/index.html +13 -0
- repotoire-0.1.7/repotoire/web/node_modules/decimal.js-light/doc/API.html +1312 -0
- repotoire-0.1.7/repotoire/web/node_modules/lz-string/tests/SpecRunner.html +51 -0
- repotoire-0.1.7/repotoire/web/node_modules/playwright-core/lib/vite/htmlReport/index.html +84 -0
- repotoire-0.1.7/repotoire/web/node_modules/playwright-core/lib/vite/recorder/index.html +29 -0
- repotoire-0.1.7/repotoire/web/node_modules/playwright-core/lib/vite/traceViewer/index.html +43 -0
- repotoire-0.1.7/repotoire/web/node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +21 -0
- repotoire-0.1.7/repotoire/web/node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +17 -0
- repotoire-0.1.7/repotoire/web/node_modules/recharts/umd/report.html +39 -0
- repotoire-0.1.7/repotoire/web/node_modules/tslib/tslib.es6.html +1 -0
- repotoire-0.1.7/repotoire/web/node_modules/tslib/tslib.html +1 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/celery_app.py +0 -25
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/Cargo.lock +53 -53
- repotoire-0.1.4/repotoire/api/services/asset_packager.py +0 -283
- repotoire-0.1.4/repotoire/api/services/asset_storage.py +0 -456
- repotoire-0.1.4/repotoire/api/services/asset_validator.py +0 -376
- repotoire-0.1.4/repotoire/api/services/marketplace.py +0 -1405
- repotoire-0.1.4/repotoire/api/shared/services/stripe_service.py +0 -616
- repotoire-0.1.4/repotoire/api/v1/routes/admin/__init__.py +0 -5
- repotoire-0.1.4/repotoire/api/v1/routes/admin/reports.py +0 -666
- repotoire-0.1.4/repotoire/api/v1/routes/admin/reviews.py +0 -677
- repotoire-0.1.4/repotoire/api/v1/routes/marketplace.py +0 -2762
- repotoire-0.1.4/repotoire/api/v1/schemas/__init__.py +0 -69
- repotoire-0.1.4/repotoire/api/v1/schemas/marketplace.py +0 -1001
- repotoire-0.1.4/repotoire/cli/marketplace.py +0 -1711
- repotoire-0.1.4/repotoire/cli/marketplace_client.py +0 -734
- repotoire-0.1.4/repotoire/cli/marketplace_sync.py +0 -491
- repotoire-0.1.4/repotoire/db/models/marketplace.py +0 -1606
- repotoire-0.1.4/repotoire/db/session.py +0 -357
- repotoire-0.1.4/repotoire/marketplace/__init__.py +0 -143
- repotoire-0.1.4/repotoire/marketplace/analytics.py +0 -846
- repotoire-0.1.4/repotoire/marketplace/claude_integration.py +0 -853
- repotoire-0.1.4/repotoire/marketplace/claudeai_export.py +0 -610
- repotoire-0.1.4/repotoire/marketplace/scanner.py +0 -414
- repotoire-0.1.4/repotoire/marketplace/versioning.py +0 -1006
- repotoire-0.1.4/repotoire/mcp_marketplace/__init__.py +0 -14
- repotoire-0.1.4/repotoire/mcp_marketplace/http_server.py +0 -378
- repotoire-0.1.4/repotoire/mcp_marketplace/server.py +0 -454
- repotoire-0.1.4/repotoire/workers/analytics_tasks.py +0 -169
- {repotoire-0.1.4 → repotoire-0.1.7}/LICENSE +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/compression.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/contextual.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/embeddings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/hybrid.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/llm.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/reranker.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/retrieval.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/spacy_clue_generator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ai/vector_store.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/app.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/auth/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/docs/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/docs/webhooks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/middleware/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/schemas/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/schemas/fix.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/schemas/quota_override.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/billing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/changelog.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/cloud_storage.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/encryption.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/gdpr.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/github.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/narrative.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/notifications.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/status_emails.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/services/stripe_service.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/auth/password_utils.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/auth/state_store.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/docs/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/docs/webhooks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/helpers/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/helpers/errors.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/helpers/user.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/csrf.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/deprecation.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/idempotency.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/rate_limit.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/security_headers.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/tenant.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/usage.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/middleware/version.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/schemas/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/schemas/fix.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/schemas/quota_override.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/billing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/circuit_breaker.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/encryption.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/gdpr.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/github.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/shared/services/s3_client.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/account.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/admin/changelog.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/admin/overrides.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/admin/status.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/analysis.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/analytics.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/audit.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/billing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/changelog.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/cli_auth.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/code.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/customer_webhooks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/detector_settings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/findings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/fixes.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/github.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/graph.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/historical.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/monorepo.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/narratives.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/notifications.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/organizations.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/preferences.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/provenance_settings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/rules.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/sandbox.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/security.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/status.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v1/routes/team.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v2/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/api/v2/routes/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/applicator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/best_of_n.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/ci.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/engine.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/entitlements.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/go.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/java.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/python.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/languages/typescript.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/learning/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/learning/adaptive.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/learning/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/learning/store.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/reviewer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/scorer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/style/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/style/analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/style/enforcer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/style/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/templates/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/templates/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/templates/registry.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/autofix/verifier.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cache/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cache/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cache/preview.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cache/scan.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cache/skill.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/api_keys.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/auth.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/auth_commands.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/credentials.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/graph.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/historical.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/monorepo.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/org_commands.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/repo_utils.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/sandbox.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/cli/security.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/config.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/analysis.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/api_deprecation.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/billing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/changelog.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/cli_token.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/detector_settings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/email.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/finding.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/fix.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/gdpr.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/github.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/notification.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/organization.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/provenance_settings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/quota_override.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/repository.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/status.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/uptime.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/user.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/user_preferences.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/models/webhook.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/repositories/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/repositories/fix.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/db/repositories/quota_override.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/architectural_bottleneck.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/async_antipattern.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/bandit_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/circular_dependency.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/core_utility.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/data_clumps.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/deduplicator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/degree_centrality.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/duplicate_rust.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/eslint_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/external_tool_runner.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/feature_envy.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/generator_misuse.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/god_class.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/graphsage_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/grouping.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/health_delta.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/inappropriate_intimacy.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/infinite_loop_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/influential_code.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/jscpd_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/lazy_class.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/long_parameter_list.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/message_chain.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/middle_man.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/ml_bug_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/module_cohesion.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/multimodal_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/mypy_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/npm_audit_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/pylint_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/radon_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/refused_bequest.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/risk_analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/root_cause_analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/ruff_import_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/ruff_lint_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/rust_graph_detectors.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/satd_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/semgrep_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/shotgun_surgery.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/taint_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/temporal_metrics.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/test_smell.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/truly_unused_imports.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/tsc_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/type_hint_coverage.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/voting_engine.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/detectors/vulture_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/github/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/github/pr_analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/github/pr_commenter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/enricher.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/external_labels.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/factory.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/falkordb_client.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/incremental_scc.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/migration.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/queries/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/queries/builders.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/queries/patterns.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/queries/traversal.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/schema.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/graph/tenant_factory.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/historical/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/historical/git_extractor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/historical/metrics_collector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/historical/timescale_client.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/hooks/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/hooks/pre_commit.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/http_client.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/integrations/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/integrations/git.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/logging_config.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/__main__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/api_server.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/execution_env.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/pattern_detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/resources.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/schema_generator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/mcp/server_generator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/001_initial_schema.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/002_add_clue_nodes.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/003_add_session_nodes.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/manager.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/migrations/migration.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/bug_predictor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/contrastive_learning.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/cross_project_trainer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/graph_embeddings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/graphsage_predictor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/multimodal_analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/multimodal_fusion.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/node2vec_embeddings.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/similarity.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/ml/training_data.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/affected.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/analyzer.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/cross_package.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/detector.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/monorepo/models.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/observability/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/observability/metrics.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/observability/tracing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/base.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/base_tree_sitter_parser.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/generic_fallback_parser.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/python_parser.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/rust_parser.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/tree_sitter_adapter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/tree_sitter_go.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/tree_sitter_java.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/tree_sitter_python.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/parsers/tree_sitter_typescript.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/pipeline/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/pipeline/ingestion.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/pipeline/temporal_ingestion.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/base_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/excel_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/html_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/markdown_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/pdf_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/reporters/sarif_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/rules/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/rules/daemon.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/rules/engine.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/rules/validator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/alerts.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/billing.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/client.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/code_validator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/config.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/enforcement.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/exceptions.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/metrics.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/override_service.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/quotas.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/session_tracker.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/skill_executor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/test_executor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/tiers.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/tool_executor.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/trial.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/sandbox/usage.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/security/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/security/compliance_reporter.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/security/dependency_scanner.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/security/sbom_generator.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/security/secrets_scanner.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/audit.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/email.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/github_status.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/quality_gates.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/services/webhook_payloads.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/analysis_complete.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/analysis_failed.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/base.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/deletion_cancelled.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/deletion_confirmation.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/health_regression.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/payment_failed.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/team_invite.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/templates/emails/welcome.html +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/tenant/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/tenant/context.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/tenant/logging.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/tenant/resolver.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/utils/encryption.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/validation.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/__init__.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/audit_tasks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/changelog.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/cleanup.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/debounce.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/health_checks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/hooks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/limits.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/progress.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/tasks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/webhook_delivery.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire/workers/webhooks.py +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/CONTRIBUTING.md +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/Cargo.toml +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/ROADMAP.md +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/benches/duplicate_bench.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/benches/graph_bench.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/benches/node2vec_bench.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/benches/word2vec_bench.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/docs/RUST_ARCHITECTURE.md +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/docs/RUST_DEVELOPMENT.md +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/call_resolver.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/cfg.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/complexity.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/data_clumps.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/dataflow.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/duplicate.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/errors.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/findings_serde.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/graph_algo.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/graph_detectors.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/hashing.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/incremental_scc.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/lcom.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/lib.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/path_cache.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/pylint_rules.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/satd.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/similarity.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/string_ops.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/taint.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/traversal.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/tree_sitter_parser.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/type_inference.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/voting.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire-fast/src/word2vec.rs +0 -0
- {repotoire-0.1.4 → repotoire-0.1.7}/repotoire_fast/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: repotoire
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
|
@@ -45,9 +45,6 @@ Requires-Dist: python-slugify>=8.0.0
|
|
|
45
45
|
Requires-Dist: bleach>=6.0.0
|
|
46
46
|
Requires-Dist: slowapi>=0.1.9
|
|
47
47
|
Requires-Dist: uv-secure>=0.15.0
|
|
48
|
-
Requires-Dist: datasets>=2.14.0
|
|
49
|
-
Requires-Dist: sentence-transformers>=2.2.0
|
|
50
|
-
Requires-Dist: accelerate>=0.26.0
|
|
51
48
|
Requires-Dist: ruff>=0.1.0
|
|
52
49
|
Requires-Dist: mypy>=1.7.0
|
|
53
50
|
Requires-Dist: pylint>=3.0.0
|
|
@@ -79,6 +76,9 @@ Requires-Dist: tomli>=2.0.0 ; extra == 'dev'
|
|
|
79
76
|
Requires-Dist: tenacity>=8.2.0 ; extra == 'dev'
|
|
80
77
|
Requires-Dist: lancedb>=0.4.0 ; extra == 'lancedb'
|
|
81
78
|
Requires-Dist: pyarrow>=14.0.0 ; extra == 'lancedb'
|
|
79
|
+
Requires-Dist: datasets>=2.14.0 ; extra == 'local-embeddings'
|
|
80
|
+
Requires-Dist: sentence-transformers>=2.2.0 ; extra == 'local-embeddings'
|
|
81
|
+
Requires-Dist: accelerate>=0.26.0 ; extra == 'local-embeddings'
|
|
82
82
|
Requires-Dist: questionary>=2.0.0 ; extra == 'ml'
|
|
83
83
|
Requires-Dist: scikit-learn>=1.3.0 ; extra == 'ml'
|
|
84
84
|
Requires-Dist: joblib>=1.3.0 ; extra == 'ml'
|
|
@@ -138,12 +138,30 @@ This enables detection of complex issues like circular dependencies, architectur
|
|
|
138
138
|
|
|
139
139
|
## Features
|
|
140
140
|
|
|
141
|
-
### 🔍
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
- **
|
|
145
|
-
- **
|
|
146
|
-
- **
|
|
141
|
+
### 🔍 30+ Graph-Powered Detectors
|
|
142
|
+
|
|
143
|
+
**Architectural Issues**
|
|
144
|
+
- **Circular Dependencies** - Import cycles via Tarjan's SCC algorithm
|
|
145
|
+
- **Hub Dependencies** - Fragile central nodes everything depends on
|
|
146
|
+
- **Layered Architecture Violations** - Cross-layer dependency detection
|
|
147
|
+
- **Change Coupling** - Files that always change together (temporal coupling)
|
|
148
|
+
- **Architectural Bottlenecks** - Single points of failure in call graphs
|
|
149
|
+
|
|
150
|
+
**Code Smells (Cross-File)**
|
|
151
|
+
- **Dead Code** - Functions/classes nothing in the codebase calls
|
|
152
|
+
- **God Classes** - Classes with too many responsibilities
|
|
153
|
+
- **Feature Envy** - Methods using other classes more than their own
|
|
154
|
+
- **Shotgun Surgery** - Changes requiring edits across many files
|
|
155
|
+
- **Inappropriate Intimacy** - Classes too tightly coupled
|
|
156
|
+
- **Middle Man** - Classes that just delegate everything
|
|
157
|
+
|
|
158
|
+
**Quality Metrics**
|
|
159
|
+
- **Module Cohesion** - How well modules stick together
|
|
160
|
+
- **Degree Centrality** - Most connected code (complexity hotspots)
|
|
161
|
+
- **Technical Debt Hotspots** - Areas with compounding issues
|
|
162
|
+
- **Package Stability** - Dependency direction analysis
|
|
163
|
+
|
|
164
|
+
**Plus:** Data clumps, long parameter lists, message chains, lazy classes, refused bequest, async antipatterns, generator misuse, test smells, type hint coverage, and more.
|
|
147
165
|
|
|
148
166
|
### 🤖 AI-Powered Insights
|
|
149
167
|
- Semantic concept extraction from code
|
|
@@ -19,12 +19,30 @@ This enables detection of complex issues like circular dependencies, architectur
|
|
|
19
19
|
|
|
20
20
|
## Features
|
|
21
21
|
|
|
22
|
-
### 🔍
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- **
|
|
26
|
-
- **
|
|
27
|
-
- **
|
|
22
|
+
### 🔍 30+ Graph-Powered Detectors
|
|
23
|
+
|
|
24
|
+
**Architectural Issues**
|
|
25
|
+
- **Circular Dependencies** - Import cycles via Tarjan's SCC algorithm
|
|
26
|
+
- **Hub Dependencies** - Fragile central nodes everything depends on
|
|
27
|
+
- **Layered Architecture Violations** - Cross-layer dependency detection
|
|
28
|
+
- **Change Coupling** - Files that always change together (temporal coupling)
|
|
29
|
+
- **Architectural Bottlenecks** - Single points of failure in call graphs
|
|
30
|
+
|
|
31
|
+
**Code Smells (Cross-File)**
|
|
32
|
+
- **Dead Code** - Functions/classes nothing in the codebase calls
|
|
33
|
+
- **God Classes** - Classes with too many responsibilities
|
|
34
|
+
- **Feature Envy** - Methods using other classes more than their own
|
|
35
|
+
- **Shotgun Surgery** - Changes requiring edits across many files
|
|
36
|
+
- **Inappropriate Intimacy** - Classes too tightly coupled
|
|
37
|
+
- **Middle Man** - Classes that just delegate everything
|
|
38
|
+
|
|
39
|
+
**Quality Metrics**
|
|
40
|
+
- **Module Cohesion** - How well modules stick together
|
|
41
|
+
- **Degree Centrality** - Most connected code (complexity hotspots)
|
|
42
|
+
- **Technical Debt Hotspots** - Areas with compounding issues
|
|
43
|
+
- **Package Stability** - Dependency direction analysis
|
|
44
|
+
|
|
45
|
+
**Plus:** Data clumps, long parameter lists, message chains, lazy classes, refused bequest, async antipatterns, generator misuse, test smells, type hint coverage, and more.
|
|
28
46
|
|
|
29
47
|
### 🤖 AI-Powered Insights
|
|
30
48
|
- Semantic concept extraction from code
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "repotoire"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.7"
|
|
8
8
|
description = "Graph-Powered Code Health Platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -63,10 +63,6 @@ dependencies = [
|
|
|
63
63
|
"slowapi>=0.1.9", # Rate limiting for FastAPI endpoints
|
|
64
64
|
# Security scanning (core feature)
|
|
65
65
|
"uv-secure>=0.15.0", # Fast uv.lock vulnerability scanning
|
|
66
|
-
# ML dependencies
|
|
67
|
-
"datasets>=2.14.0", # Required for sentence-transformers fine-tuning
|
|
68
|
-
"sentence-transformers>=2.2.0", # Local embedding models + contrastive learning
|
|
69
|
-
"accelerate>=0.26.0", # Required for PyTorch Trainer
|
|
70
66
|
# Hybrid detector dependencies (core feature)
|
|
71
67
|
"ruff>=0.1.0", # Fast linting detector (RuffLintDetector)
|
|
72
68
|
"mypy>=1.7.0", # Type checking detector
|
|
@@ -122,7 +118,11 @@ security = [
|
|
|
122
118
|
]
|
|
123
119
|
|
|
124
120
|
local-embeddings = [
|
|
125
|
-
#
|
|
121
|
+
# Heavy ML deps for local embedding models (2GB+ with CUDA)
|
|
122
|
+
# Only needed if NOT using deepinfra/API-based embeddings
|
|
123
|
+
"datasets>=2.14.0",
|
|
124
|
+
"sentence-transformers>=2.2.0",
|
|
125
|
+
"accelerate>=0.26.0",
|
|
126
126
|
]
|
|
127
127
|
|
|
128
128
|
observability = [
|
|
@@ -165,8 +165,6 @@ anthropic = [
|
|
|
165
165
|
repotoire = "repotoire.cli:main"
|
|
166
166
|
repotoire-pre-commit = "repotoire.hooks.pre_commit:main"
|
|
167
167
|
repotoire-mcp = "repotoire.mcp.api_server:main"
|
|
168
|
-
repotoire-marketplace-mcp = "repotoire.mcp_marketplace.server:run_server"
|
|
169
|
-
repotoire-marketplace-mcp-http = "repotoire.mcp_marketplace.http_server:run_http_server"
|
|
170
168
|
|
|
171
169
|
[project.urls]
|
|
172
170
|
Homepage = "https://github.com/yourusername/repotoire"
|
|
@@ -243,7 +241,7 @@ dev = [
|
|
|
243
241
|
|
|
244
242
|
# Bump My Version configuration for semantic versioning
|
|
245
243
|
[tool.bumpversion]
|
|
246
|
-
current_version = "0.1.
|
|
244
|
+
current_version = "0.1.5"
|
|
247
245
|
commit = true
|
|
248
246
|
commit_args = "--no-verify"
|
|
249
247
|
tag = true
|
|
@@ -5,7 +5,7 @@ Analyzes codebases using knowledge graphs to detect code smells,
|
|
|
5
5
|
architectural issues, and technical debt.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
__version__ = "0.1.
|
|
8
|
+
__version__ = "0.1.5"
|
|
9
9
|
|
|
10
10
|
from repotoire.pipeline import IngestionPipeline
|
|
11
11
|
from repotoire.graph import FalkorDBClient
|
|
@@ -19,3 +19,4 @@ __all__ = [
|
|
|
19
19
|
"CodebaseHealth",
|
|
20
20
|
"Finding",
|
|
21
21
|
]
|
|
22
|
+
# Cache bust Wed Feb 4 07:23:32 PM EST 2026
|
|
@@ -18,6 +18,7 @@ from repotoire.api.shared.auth.clerk import (
|
|
|
18
18
|
get_optional_user_or_api_key,
|
|
19
19
|
require_org,
|
|
20
20
|
require_org_admin,
|
|
21
|
+
require_org_api_key,
|
|
21
22
|
require_scope,
|
|
22
23
|
)
|
|
23
24
|
|
|
@@ -49,6 +50,7 @@ __all__ = [
|
|
|
49
50
|
"get_optional_user_or_api_key",
|
|
50
51
|
"require_org",
|
|
51
52
|
"require_org_admin",
|
|
53
|
+
"require_org_api_key",
|
|
52
54
|
"require_scope",
|
|
53
55
|
# State store
|
|
54
56
|
"StateTokenStore",
|
|
@@ -159,6 +159,8 @@ async def get_optional_user(
|
|
|
159
159
|
def require_org(user: ClerkUser = Depends(get_current_user)) -> ClerkUser:
|
|
160
160
|
"""
|
|
161
161
|
Dependency that requires the user to be part of an organization.
|
|
162
|
+
|
|
163
|
+
NOTE: Only supports JWT authentication. For API key support, use require_org_api_key.
|
|
162
164
|
|
|
163
165
|
Usage:
|
|
164
166
|
@router.get("/org-only")
|
|
@@ -292,6 +294,31 @@ async def get_current_user_or_api_key(
|
|
|
292
294
|
)
|
|
293
295
|
|
|
294
296
|
|
|
297
|
+
def require_org_api_key(user: ClerkUser = Depends(get_current_user_or_api_key)) -> ClerkUser:
|
|
298
|
+
"""
|
|
299
|
+
Dependency that requires the user to be part of an organization.
|
|
300
|
+
|
|
301
|
+
Supports both JWT tokens and API keys. Use this for endpoints that need to
|
|
302
|
+
support CLI/API key access.
|
|
303
|
+
|
|
304
|
+
Usage:
|
|
305
|
+
@router.get("/org-only")
|
|
306
|
+
async def org_route(user: ClerkUser = Depends(require_org_api_key)):
|
|
307
|
+
return {"org_id": user.org_id}
|
|
308
|
+
"""
|
|
309
|
+
if not user.org_id:
|
|
310
|
+
raise HTTPException(
|
|
311
|
+
status_code=status.HTTP_403_FORBIDDEN,
|
|
312
|
+
detail={
|
|
313
|
+
"error": "ORG_REQUIRED",
|
|
314
|
+
"message": "Organization membership required. Your current session is not associated with an organization.",
|
|
315
|
+
"user_id": user.user_id,
|
|
316
|
+
"hint": "Please select an organization in the web UI, or use 'repotoire login' to authenticate with an org-scoped API key."
|
|
317
|
+
},
|
|
318
|
+
)
|
|
319
|
+
return user
|
|
320
|
+
|
|
321
|
+
|
|
295
322
|
async def get_optional_user_or_api_key(
|
|
296
323
|
request: Request,
|
|
297
324
|
credentials: Optional[HTTPAuthorizationCredentials] = Depends(security),
|
|
@@ -41,7 +41,6 @@ from .github import GitHubAppClient, get_github_client
|
|
|
41
41
|
from .stripe_service import (
|
|
42
42
|
PRICE_IDS,
|
|
43
43
|
SEAT_PRICE_IDS,
|
|
44
|
-
StripeConnectService,
|
|
45
44
|
StripeService,
|
|
46
45
|
price_id_to_tier,
|
|
47
46
|
)
|
|
@@ -75,10 +74,9 @@ __all__ = [
|
|
|
75
74
|
"get_plan_limits",
|
|
76
75
|
"has_feature",
|
|
77
76
|
"increment_usage",
|
|
78
|
-
# Stripe (legacy webhook handling
|
|
77
|
+
# Stripe (legacy webhook handling)
|
|
79
78
|
"PRICE_IDS",
|
|
80
79
|
"SEAT_PRICE_IDS",
|
|
81
|
-
"StripeConnectService",
|
|
82
80
|
"StripeService",
|
|
83
81
|
"price_id_to_tier",
|
|
84
82
|
# GDPR
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"""Stripe service for legacy webhook handling.
|
|
2
|
+
|
|
3
|
+
This module provides:
|
|
4
|
+
1. Legacy webhook handling for existing subscriptions (migrated to Clerk Billing)
|
|
5
|
+
|
|
6
|
+
Migration Note (2026-01):
|
|
7
|
+
- NEW subscriptions are managed via Clerk Billing
|
|
8
|
+
- EXISTING subscriptions may still send Stripe webhooks until migrated
|
|
9
|
+
- Use Clerk's <PricingTable /> and <AccountPortal /> for new subscription management
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import os
|
|
14
|
+
from typing import Any, Dict
|
|
15
|
+
|
|
16
|
+
import stripe
|
|
17
|
+
from fastapi import HTTPException
|
|
18
|
+
|
|
19
|
+
from repotoire.db.models import PlanTier
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
# Configure Stripe API key (still needed for webhooks)
|
|
24
|
+
stripe.api_key = os.environ.get("STRIPE_SECRET_KEY", "")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class StripeConfigError(Exception):
|
|
28
|
+
"""Raised when Stripe configuration is invalid or missing."""
|
|
29
|
+
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def validate_stripe_config() -> dict[str, Any]:
|
|
34
|
+
"""Validate Stripe configuration at startup.
|
|
35
|
+
|
|
36
|
+
Checks that all required environment variables are set and valid.
|
|
37
|
+
Should be called during application startup to fail fast on misconfiguration.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Dict with configuration status and any warnings
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
StripeConfigError: If critical configuration is missing
|
|
44
|
+
"""
|
|
45
|
+
errors: list[str] = []
|
|
46
|
+
warnings: list[str] = []
|
|
47
|
+
|
|
48
|
+
# Check API key
|
|
49
|
+
api_key = os.environ.get("STRIPE_SECRET_KEY", "")
|
|
50
|
+
if not api_key:
|
|
51
|
+
errors.append("STRIPE_SECRET_KEY is not set")
|
|
52
|
+
elif api_key.startswith("sk_live_") and os.environ.get("ENVIRONMENT") == "development":
|
|
53
|
+
# SECURITY: Live keys in development can result in real charges
|
|
54
|
+
# This must be a hard error to prevent accidental financial transactions
|
|
55
|
+
errors.append(
|
|
56
|
+
"SECURITY ERROR: Using Stripe LIVE key in development environment. "
|
|
57
|
+
"This could result in real charges. Use a test key (sk_test_*) for development. "
|
|
58
|
+
"Set ENVIRONMENT=production if this is intentional."
|
|
59
|
+
)
|
|
60
|
+
elif api_key.startswith("sk_test_") and os.environ.get("ENVIRONMENT") == "production":
|
|
61
|
+
errors.append("Using test Stripe key in production environment")
|
|
62
|
+
|
|
63
|
+
# Check webhook secret
|
|
64
|
+
webhook_secret = os.environ.get("STRIPE_WEBHOOK_SECRET", "")
|
|
65
|
+
if not webhook_secret:
|
|
66
|
+
warnings.append("STRIPE_WEBHOOK_SECRET not set - webhooks will fail")
|
|
67
|
+
|
|
68
|
+
# Check price IDs (optional but recommended)
|
|
69
|
+
price_vars = [
|
|
70
|
+
"STRIPE_PRICE_PRO_BASE",
|
|
71
|
+
"STRIPE_PRICE_PRO_SEAT",
|
|
72
|
+
"STRIPE_PRICE_ENTERPRISE_BASE",
|
|
73
|
+
"STRIPE_PRICE_ENTERPRISE_SEAT",
|
|
74
|
+
]
|
|
75
|
+
missing_prices = [v for v in price_vars if not os.environ.get(v)]
|
|
76
|
+
if missing_prices:
|
|
77
|
+
warnings.append(f"Missing price IDs: {', '.join(missing_prices)} - tier mapping may fail")
|
|
78
|
+
|
|
79
|
+
if errors:
|
|
80
|
+
error_msg = "Stripe configuration errors:\n" + "\n".join(f" - {e}" for e in errors)
|
|
81
|
+
logger.critical(error_msg)
|
|
82
|
+
raise StripeConfigError(error_msg)
|
|
83
|
+
|
|
84
|
+
if warnings:
|
|
85
|
+
for warning in warnings:
|
|
86
|
+
logger.warning(f"Stripe config warning: {warning}")
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
"valid": True,
|
|
90
|
+
"warnings": warnings,
|
|
91
|
+
"mode": "live" if api_key.startswith("sk_live_") else "test",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def handle_stripe_error(error: stripe.error.StripeError, context: str) -> HTTPException:
|
|
96
|
+
"""Convert Stripe errors to appropriate HTTP exceptions.
|
|
97
|
+
|
|
98
|
+
Maps Stripe error types to HTTP status codes:
|
|
99
|
+
- CardError: 402 (Payment Required) - card was declined
|
|
100
|
+
- RateLimitError: 429 (Too Many Requests) - rate limited
|
|
101
|
+
- InvalidRequestError: 400 (Bad Request) - invalid parameters
|
|
102
|
+
- AuthenticationError: 401 (Unauthorized) - API key issue
|
|
103
|
+
- APIConnectionError: 503 (Service Unavailable) - network issue
|
|
104
|
+
- StripeError: 500 (Internal Server Error) - generic fallback
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
error: The Stripe error
|
|
108
|
+
context: Description of what operation failed
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
HTTPException with appropriate status code and user-friendly message
|
|
112
|
+
"""
|
|
113
|
+
logger.error(f"Stripe error in {context}: {type(error).__name__}: {error}")
|
|
114
|
+
|
|
115
|
+
if isinstance(error, stripe.error.CardError):
|
|
116
|
+
# Card was declined
|
|
117
|
+
return HTTPException(
|
|
118
|
+
status_code=402,
|
|
119
|
+
detail=error.user_message or "Your card was declined. Please try a different payment method.",
|
|
120
|
+
)
|
|
121
|
+
elif isinstance(error, stripe.error.RateLimitError):
|
|
122
|
+
# Too many requests to Stripe
|
|
123
|
+
return HTTPException(
|
|
124
|
+
status_code=429,
|
|
125
|
+
detail="Too many payment requests. Please wait a moment and try again.",
|
|
126
|
+
)
|
|
127
|
+
elif isinstance(error, stripe.error.InvalidRequestError):
|
|
128
|
+
# Invalid parameters sent to Stripe
|
|
129
|
+
return HTTPException(
|
|
130
|
+
status_code=400,
|
|
131
|
+
detail="Invalid payment request. Please check your details and try again.",
|
|
132
|
+
)
|
|
133
|
+
elif isinstance(error, stripe.error.AuthenticationError):
|
|
134
|
+
# API key issues - log as critical, return generic error
|
|
135
|
+
logger.critical(f"Stripe authentication failed: {error}")
|
|
136
|
+
return HTTPException(
|
|
137
|
+
status_code=500,
|
|
138
|
+
detail="Payment service configuration error. Please contact support.",
|
|
139
|
+
)
|
|
140
|
+
elif isinstance(error, stripe.error.APIConnectionError):
|
|
141
|
+
# Network issues connecting to Stripe
|
|
142
|
+
return HTTPException(
|
|
143
|
+
status_code=503,
|
|
144
|
+
detail="Payment service temporarily unavailable. Please try again.",
|
|
145
|
+
)
|
|
146
|
+
else:
|
|
147
|
+
# Generic Stripe error
|
|
148
|
+
return HTTPException(
|
|
149
|
+
status_code=500,
|
|
150
|
+
detail="Payment processing failed. Please try again or contact support.",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# ============================================================================
|
|
155
|
+
# Price ID Mapping (for legacy webhook handling)
|
|
156
|
+
# ============================================================================
|
|
157
|
+
|
|
158
|
+
# Maps Stripe price IDs to plan tiers
|
|
159
|
+
PRICE_IDS: Dict[str, str] = {
|
|
160
|
+
os.environ.get("STRIPE_PRICE_PRO_BASE", ""): "pro",
|
|
161
|
+
os.environ.get("STRIPE_PRICE_ENTERPRISE_BASE", ""): "enterprise",
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
SEAT_PRICE_IDS: Dict[str, str] = {
|
|
165
|
+
os.environ.get("STRIPE_PRICE_PRO_SEAT", ""): "pro",
|
|
166
|
+
os.environ.get("STRIPE_PRICE_ENTERPRISE_SEAT", ""): "enterprise",
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def price_id_to_tier(price_id: str) -> PlanTier:
|
|
171
|
+
"""Convert Stripe price ID to PlanTier enum.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
price_id: Stripe price ID
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
Corresponding PlanTier
|
|
178
|
+
|
|
179
|
+
Note:
|
|
180
|
+
Returns FREE for unknown price IDs (fail-safe)
|
|
181
|
+
"""
|
|
182
|
+
tier_str = PRICE_IDS.get(price_id) or SEAT_PRICE_IDS.get(price_id)
|
|
183
|
+
if tier_str == "pro":
|
|
184
|
+
return PlanTier.PRO
|
|
185
|
+
elif tier_str == "enterprise":
|
|
186
|
+
return PlanTier.ENTERPRISE
|
|
187
|
+
else:
|
|
188
|
+
logger.warning(f"Unknown price ID: {price_id}, defaulting to FREE")
|
|
189
|
+
return PlanTier.FREE
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# ============================================================================
|
|
193
|
+
# Legacy StripeService (for webhook handling)
|
|
194
|
+
# ============================================================================
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class StripeService:
|
|
198
|
+
"""Legacy Stripe service for webhook handling.
|
|
199
|
+
|
|
200
|
+
Note: New subscription management should use Clerk Billing.
|
|
201
|
+
This class exists only for handling webhooks from existing subscriptions.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
@staticmethod
|
|
205
|
+
def construct_webhook_event(
|
|
206
|
+
payload: bytes,
|
|
207
|
+
signature: str,
|
|
208
|
+
webhook_secret: str,
|
|
209
|
+
) -> Dict[str, Any]:
|
|
210
|
+
"""Construct and verify a Stripe webhook event.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
payload: Raw request body
|
|
214
|
+
signature: Stripe-Signature header
|
|
215
|
+
webhook_secret: Webhook secret for verification
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
Verified Stripe event dict
|
|
219
|
+
|
|
220
|
+
Raises:
|
|
221
|
+
HTTPException: If signature verification fails
|
|
222
|
+
"""
|
|
223
|
+
try:
|
|
224
|
+
event = stripe.Webhook.construct_event(
|
|
225
|
+
payload, signature, webhook_secret
|
|
226
|
+
)
|
|
227
|
+
return event
|
|
228
|
+
except stripe.error.SignatureVerificationError:
|
|
229
|
+
raise HTTPException(status_code=400, detail="Invalid signature")
|
|
230
|
+
except Exception as e:
|
|
231
|
+
logger.error(f"Webhook construction error: {e}")
|
|
232
|
+
raise HTTPException(status_code=400, detail="Invalid webhook")
|
|
233
|
+
|
|
234
|
+
@staticmethod
|
|
235
|
+
def get_subscription(subscription_id: str) -> Dict[str, Any]:
|
|
236
|
+
"""Get a Stripe subscription by ID.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
subscription_id: Stripe subscription ID
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
Stripe subscription object as dict
|
|
243
|
+
"""
|
|
244
|
+
try:
|
|
245
|
+
return stripe.Subscription.retrieve(subscription_id)
|
|
246
|
+
except stripe.error.StripeError as e:
|
|
247
|
+
logger.error(f"Error retrieving subscription {subscription_id}: {e}")
|
|
248
|
+
raise HTTPException(
|
|
249
|
+
status_code=500,
|
|
250
|
+
detail="Failed to retrieve subscription. Please try again or contact support."
|
|
251
|
+
)
|
|
@@ -22,7 +22,6 @@ from repotoire.api.v1.routes import (
|
|
|
22
22
|
github,
|
|
23
23
|
graph,
|
|
24
24
|
historical,
|
|
25
|
-
marketplace,
|
|
26
25
|
monorepo,
|
|
27
26
|
narratives,
|
|
28
27
|
notifications,
|
|
@@ -39,8 +38,6 @@ from repotoire.api.v1.routes import (
|
|
|
39
38
|
)
|
|
40
39
|
from repotoire.api.v1.routes.admin import changelog as admin_changelog
|
|
41
40
|
from repotoire.api.v1.routes.admin import overrides as admin_overrides
|
|
42
|
-
from repotoire.api.v1.routes.admin import reports as admin_reports
|
|
43
|
-
from repotoire.api.v1.routes.admin import reviews as admin_reviews
|
|
44
41
|
from repotoire.api.v1.routes.admin import status as admin_status
|
|
45
42
|
|
|
46
43
|
# v1-specific OpenAPI tags
|
|
@@ -155,11 +152,6 @@ V1_OPENAPI_TAGS = [
|
|
|
155
152
|
"description": "Public changelog and release notes. View new features, improvements, "
|
|
156
153
|
"bug fixes, and subscribe to updates. No authentication required for public endpoints.",
|
|
157
154
|
},
|
|
158
|
-
{
|
|
159
|
-
"name": "marketplace",
|
|
160
|
-
"description": "Repotoire Marketplace for AI skills, commands, styles, and prompts. "
|
|
161
|
-
"Browse, install, publish, and manage marketplace assets.",
|
|
162
|
-
},
|
|
163
155
|
{
|
|
164
156
|
"name": "narratives",
|
|
165
157
|
"description": "AI-powered narrative generation. Executive summaries, metric insights, "
|
|
@@ -260,7 +252,6 @@ v1_app.include_router(fixes.router)
|
|
|
260
252
|
v1_app.include_router(github.router)
|
|
261
253
|
v1_app.include_router(graph.router)
|
|
262
254
|
v1_app.include_router(historical.router)
|
|
263
|
-
v1_app.include_router(marketplace.router)
|
|
264
255
|
v1_app.include_router(monorepo.router)
|
|
265
256
|
v1_app.include_router(narratives.router)
|
|
266
257
|
v1_app.include_router(notifications.router)
|
|
@@ -276,9 +267,6 @@ v1_app.include_router(webhooks.router)
|
|
|
276
267
|
v1_app.include_router(status.router)
|
|
277
268
|
v1_app.include_router(changelog.router)
|
|
278
269
|
v1_app.include_router(admin_overrides.router)
|
|
279
|
-
v1_app.include_router(admin_reports.router)
|
|
280
|
-
v1_app.include_router(admin_reports.admin_router) # Admin report management endpoints
|
|
281
|
-
v1_app.include_router(admin_reviews.router)
|
|
282
270
|
v1_app.include_router(admin_status.router)
|
|
283
271
|
v1_app.include_router(admin_changelog.router)
|
|
284
272
|
|
|
@@ -17,7 +17,6 @@ from repotoire.api.v1.routes import (
|
|
|
17
17
|
github,
|
|
18
18
|
graph,
|
|
19
19
|
historical,
|
|
20
|
-
marketplace,
|
|
21
20
|
monorepo,
|
|
22
21
|
narratives,
|
|
23
22
|
notifications,
|
|
@@ -50,7 +49,6 @@ __all__ = [
|
|
|
50
49
|
"github",
|
|
51
50
|
"graph",
|
|
52
51
|
"historical",
|
|
53
|
-
"marketplace",
|
|
54
52
|
"monorepo",
|
|
55
53
|
"narratives",
|
|
56
54
|
"notifications",
|
|
@@ -9,7 +9,7 @@ from pydantic import BaseModel, Field
|
|
|
9
9
|
from sqlalchemy import select
|
|
10
10
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
11
11
|
|
|
12
|
-
from repotoire.api.shared.auth import ClerkUser,
|
|
12
|
+
from repotoire.api.shared.auth import ClerkUser, get_current_user_or_api_key
|
|
13
13
|
from repotoire.api.shared.services.billing import (
|
|
14
14
|
PLAN_LIMITS,
|
|
15
15
|
get_current_tier,
|
|
@@ -39,7 +39,7 @@ class UsageResponse(BaseModel):
|
|
|
39
39
|
|
|
40
40
|
@router.get("", response_model=UsageResponse)
|
|
41
41
|
async def get_usage(
|
|
42
|
-
user: ClerkUser = Depends(
|
|
42
|
+
user: ClerkUser = Depends(get_current_user_or_api_key),
|
|
43
43
|
db: AsyncSession = Depends(get_db),
|
|
44
44
|
) -> UsageResponse:
|
|
45
45
|
"""Get current usage for the authenticated user's organization.
|
|
@@ -152,7 +152,7 @@ class UsageIncrementResponse(BaseModel):
|
|
|
152
152
|
@router.post("/increment", response_model=UsageIncrementResponse)
|
|
153
153
|
async def increment_usage_counter(
|
|
154
154
|
request: UsageIncrementRequest,
|
|
155
|
-
user: ClerkUser = Depends(
|
|
155
|
+
user: ClerkUser = Depends(get_current_user_or_api_key),
|
|
156
156
|
db: AsyncSession = Depends(get_db),
|
|
157
157
|
) -> UsageIncrementResponse:
|
|
158
158
|
"""Increment a usage counter for the organization.
|