attune-ai 2.0.0__py3-none-any.whl
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.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
"""CLI commands for authentication strategy management.
|
|
2
|
+
|
|
3
|
+
Provides commands to configure and manage intelligent authentication routing
|
|
4
|
+
between Claude subscriptions and Anthropic API based on module size.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python -m attune.models.auth_cli setup
|
|
8
|
+
python -m attune.models.auth_cli status
|
|
9
|
+
python -m attune.models.auth_cli reset
|
|
10
|
+
python -m attune.models.auth_cli recommend <file_path>
|
|
11
|
+
|
|
12
|
+
Copyright 2025 Smart-AI-Memory
|
|
13
|
+
Licensed under Apache 2.0
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import argparse
|
|
17
|
+
import json
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
from rich.console import Console
|
|
24
|
+
from rich.panel import Panel
|
|
25
|
+
from rich.table import Table
|
|
26
|
+
from rich.text import Text
|
|
27
|
+
|
|
28
|
+
RICH_AVAILABLE = True
|
|
29
|
+
except ImportError:
|
|
30
|
+
RICH_AVAILABLE = False
|
|
31
|
+
Console = None # type: ignore
|
|
32
|
+
|
|
33
|
+
from .auth_strategy import (
|
|
34
|
+
AUTH_STRATEGY_FILE,
|
|
35
|
+
AuthStrategy,
|
|
36
|
+
SubscriptionTier,
|
|
37
|
+
configure_auth_interactive,
|
|
38
|
+
count_lines_of_code,
|
|
39
|
+
get_module_size_category,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def cmd_auth_setup(args: Any) -> int:
|
|
44
|
+
"""Run interactive authentication strategy setup.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
args: Parsed command-line arguments
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
Exit code (0 for success)
|
|
51
|
+
"""
|
|
52
|
+
try:
|
|
53
|
+
print("\n🔐 Authentication Strategy Setup\n")
|
|
54
|
+
print("=" * 60)
|
|
55
|
+
print()
|
|
56
|
+
print("Configure intelligent routing between Claude subscriptions")
|
|
57
|
+
print("and Anthropic API based on module size.\n")
|
|
58
|
+
|
|
59
|
+
# Run interactive setup
|
|
60
|
+
strategy = configure_auth_interactive()
|
|
61
|
+
|
|
62
|
+
print("\n✅ Configuration saved successfully!")
|
|
63
|
+
print(f"Location: {AUTH_STRATEGY_FILE}")
|
|
64
|
+
print()
|
|
65
|
+
print("Your authentication strategy:")
|
|
66
|
+
print(f" Tier: {strategy.subscription_tier.value}")
|
|
67
|
+
print(f" Mode: {strategy.default_mode.value}")
|
|
68
|
+
print()
|
|
69
|
+
print("Run 'empathy auth status' to view your configuration.")
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
except KeyboardInterrupt:
|
|
73
|
+
print("\n\nSetup cancelled.")
|
|
74
|
+
return 1
|
|
75
|
+
except Exception as e:
|
|
76
|
+
print(f"\n❌ Error during setup: {e}")
|
|
77
|
+
return 1
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def cmd_auth_status(args: Any) -> int:
|
|
81
|
+
"""Show current authentication strategy configuration.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
args: Parsed command-line arguments
|
|
85
|
+
- json: Output as JSON instead of formatted table
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Exit code (0 for success)
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
# Load strategy
|
|
92
|
+
strategy = AuthStrategy.load()
|
|
93
|
+
output_json = getattr(args, "json", False)
|
|
94
|
+
|
|
95
|
+
if output_json:
|
|
96
|
+
# JSON output
|
|
97
|
+
config = {
|
|
98
|
+
"subscription_tier": strategy.subscription_tier.value,
|
|
99
|
+
"default_mode": strategy.default_mode.value,
|
|
100
|
+
"small_module_threshold": strategy.small_module_threshold,
|
|
101
|
+
"medium_module_threshold": strategy.medium_module_threshold,
|
|
102
|
+
"loc_to_tokens_multiplier": strategy.loc_to_tokens_multiplier,
|
|
103
|
+
"prefer_subscription": strategy.prefer_subscription,
|
|
104
|
+
"cost_optimization": strategy.cost_optimization,
|
|
105
|
+
"setup_completed": strategy.setup_completed,
|
|
106
|
+
"config_file": str(AUTH_STRATEGY_FILE),
|
|
107
|
+
}
|
|
108
|
+
print(json.dumps(config, indent=2))
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
# Formatted output
|
|
112
|
+
if RICH_AVAILABLE and Console is not None:
|
|
113
|
+
console = Console()
|
|
114
|
+
|
|
115
|
+
# Configuration panel
|
|
116
|
+
config_text = Text()
|
|
117
|
+
config_text.append("Subscription Tier: ", style="cyan")
|
|
118
|
+
config_text.append(f"{strategy.subscription_tier.value.upper()}\n", style="bold")
|
|
119
|
+
config_text.append("Default Mode: ", style="cyan")
|
|
120
|
+
config_text.append(f"{strategy.default_mode.value.upper()}\n", style="bold")
|
|
121
|
+
config_text.append("Setup Completed: ", style="cyan")
|
|
122
|
+
config_text.append(
|
|
123
|
+
"✅ Yes\n" if strategy.setup_completed else "❌ No (run 'empathy auth setup')\n"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
console.print(
|
|
127
|
+
Panel(config_text, title="Authentication Strategy", border_style="blue")
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
# Module size thresholds
|
|
131
|
+
threshold_table = Table(title="Module Size Thresholds", show_header=True)
|
|
132
|
+
threshold_table.add_column("Category", style="cyan")
|
|
133
|
+
threshold_table.add_column("Size (LOC)", justify="right")
|
|
134
|
+
threshold_table.add_column("Recommended Auth", style="green")
|
|
135
|
+
|
|
136
|
+
if strategy.subscription_tier == SubscriptionTier.PRO:
|
|
137
|
+
threshold_table.add_row("Small", f"< {strategy.small_module_threshold}", "API")
|
|
138
|
+
threshold_table.add_row(
|
|
139
|
+
"Medium",
|
|
140
|
+
f"{strategy.small_module_threshold} - {strategy.medium_module_threshold}",
|
|
141
|
+
"API",
|
|
142
|
+
)
|
|
143
|
+
threshold_table.add_row("Large", f"> {strategy.medium_module_threshold}", "API")
|
|
144
|
+
else:
|
|
145
|
+
threshold_table.add_row(
|
|
146
|
+
"Small", f"< {strategy.small_module_threshold}", "Subscription"
|
|
147
|
+
)
|
|
148
|
+
threshold_table.add_row(
|
|
149
|
+
"Medium",
|
|
150
|
+
f"{strategy.small_module_threshold} - {strategy.medium_module_threshold}",
|
|
151
|
+
"Subscription",
|
|
152
|
+
)
|
|
153
|
+
threshold_table.add_row(
|
|
154
|
+
"Large", f"> {strategy.medium_module_threshold}", "API (1M context)"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
console.print(threshold_table)
|
|
158
|
+
|
|
159
|
+
# File location
|
|
160
|
+
console.print(f"\n[dim]Configuration file: {AUTH_STRATEGY_FILE}[/dim]")
|
|
161
|
+
|
|
162
|
+
else:
|
|
163
|
+
# Plain text fallback
|
|
164
|
+
print("\n" + "=" * 60)
|
|
165
|
+
print("AUTHENTICATION STRATEGY")
|
|
166
|
+
print("=" * 60)
|
|
167
|
+
print(f"\nSubscription Tier: {strategy.subscription_tier.value.upper()}")
|
|
168
|
+
print(f"Default Mode: {strategy.default_mode.value.upper()}")
|
|
169
|
+
print(f"Setup Completed: {'Yes' if strategy.setup_completed else 'No'}")
|
|
170
|
+
|
|
171
|
+
print("\nModule Size Thresholds:")
|
|
172
|
+
print(f" Small: < {strategy.small_module_threshold} LOC")
|
|
173
|
+
print(
|
|
174
|
+
f" Medium: {strategy.small_module_threshold}-{strategy.medium_module_threshold} LOC"
|
|
175
|
+
)
|
|
176
|
+
print(f" Large: > {strategy.medium_module_threshold} LOC")
|
|
177
|
+
|
|
178
|
+
print("\nRecommended Auth:")
|
|
179
|
+
if strategy.subscription_tier == SubscriptionTier.PRO:
|
|
180
|
+
print(" All modules → API (pay-per-token)")
|
|
181
|
+
else:
|
|
182
|
+
print(" Small/Medium → Subscription")
|
|
183
|
+
print(" Large → API (1M context window)")
|
|
184
|
+
|
|
185
|
+
print(f"\nConfiguration file: {AUTH_STRATEGY_FILE}")
|
|
186
|
+
print("=" * 60)
|
|
187
|
+
|
|
188
|
+
return 0
|
|
189
|
+
|
|
190
|
+
except FileNotFoundError:
|
|
191
|
+
print("❌ No authentication strategy configured.")
|
|
192
|
+
print("Run 'empathy auth setup' to configure your strategy.")
|
|
193
|
+
return 1
|
|
194
|
+
except Exception as e:
|
|
195
|
+
print(f"❌ Error reading configuration: {e}")
|
|
196
|
+
return 1
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def cmd_auth_reset(args: Any) -> int:
|
|
200
|
+
"""Reset/clear authentication strategy configuration.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
args: Parsed command-line arguments
|
|
204
|
+
- confirm: Require confirmation flag
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Exit code (0 for success)
|
|
208
|
+
"""
|
|
209
|
+
confirm = getattr(args, "confirm", False)
|
|
210
|
+
|
|
211
|
+
if not confirm:
|
|
212
|
+
print("⚠️ WARNING: This will delete your authentication strategy configuration.")
|
|
213
|
+
print(f"Location: {AUTH_STRATEGY_FILE}")
|
|
214
|
+
print("\nUse --confirm to proceed:")
|
|
215
|
+
print(" empathy auth reset --confirm")
|
|
216
|
+
return 1
|
|
217
|
+
|
|
218
|
+
try:
|
|
219
|
+
if AUTH_STRATEGY_FILE.exists():
|
|
220
|
+
AUTH_STRATEGY_FILE.unlink()
|
|
221
|
+
print("✅ Authentication strategy reset successfully.")
|
|
222
|
+
print("Run 'empathy auth setup' to configure a new strategy.")
|
|
223
|
+
return 0
|
|
224
|
+
else:
|
|
225
|
+
print("ℹ️ No configuration file found - nothing to reset.")
|
|
226
|
+
return 0
|
|
227
|
+
|
|
228
|
+
except Exception as e:
|
|
229
|
+
print(f"❌ Error resetting configuration: {e}")
|
|
230
|
+
return 1
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def cmd_auth_recommend(args: Any) -> int:
|
|
234
|
+
"""Get authentication recommendation for a specific file.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
args: Parsed command-line arguments
|
|
238
|
+
- file_path: Path to the file to analyze
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
Exit code (0 for success)
|
|
242
|
+
"""
|
|
243
|
+
file_path_str = getattr(args, "file_path", None)
|
|
244
|
+
|
|
245
|
+
if not file_path_str:
|
|
246
|
+
print("❌ Error: file_path is required")
|
|
247
|
+
print("Usage: empathy auth recommend <file_path>")
|
|
248
|
+
return 1
|
|
249
|
+
|
|
250
|
+
file_path = Path(file_path_str)
|
|
251
|
+
|
|
252
|
+
if not file_path.exists():
|
|
253
|
+
print(f"❌ Error: File not found: {file_path}")
|
|
254
|
+
return 1
|
|
255
|
+
|
|
256
|
+
if not file_path.is_file():
|
|
257
|
+
print(f"❌ Error: Path is not a file: {file_path}")
|
|
258
|
+
return 1
|
|
259
|
+
|
|
260
|
+
try:
|
|
261
|
+
# Load strategy
|
|
262
|
+
strategy = AuthStrategy.load()
|
|
263
|
+
|
|
264
|
+
# Calculate module size
|
|
265
|
+
module_lines = count_lines_of_code(file_path)
|
|
266
|
+
size_category = get_module_size_category(module_lines)
|
|
267
|
+
|
|
268
|
+
# Get recommendation
|
|
269
|
+
recommended_mode = strategy.get_recommended_mode(module_lines)
|
|
270
|
+
|
|
271
|
+
# Get cost estimate
|
|
272
|
+
cost_estimate = strategy.estimate_cost(module_lines, recommended_mode)
|
|
273
|
+
|
|
274
|
+
# Display results
|
|
275
|
+
if RICH_AVAILABLE and Console is not None:
|
|
276
|
+
console = Console()
|
|
277
|
+
|
|
278
|
+
# Module info
|
|
279
|
+
info_text = Text()
|
|
280
|
+
info_text.append("File: ", style="cyan")
|
|
281
|
+
info_text.append(f"{file_path}\n", style="bold")
|
|
282
|
+
info_text.append("Lines of Code: ", style="cyan")
|
|
283
|
+
info_text.append(f"{module_lines:,}\n", style="bold")
|
|
284
|
+
info_text.append("Size Category: ", style="cyan")
|
|
285
|
+
info_text.append(f"{size_category.upper()}\n", style="bold")
|
|
286
|
+
|
|
287
|
+
console.print(Panel(info_text, title="Module Analysis", border_style="blue"))
|
|
288
|
+
|
|
289
|
+
# Recommendation
|
|
290
|
+
rec_text = Text()
|
|
291
|
+
rec_text.append("Recommended: ", style="cyan")
|
|
292
|
+
rec_text.append(f"{recommended_mode.value.upper()} mode\n", style="green bold")
|
|
293
|
+
|
|
294
|
+
if recommended_mode.value == "subscription":
|
|
295
|
+
rec_text.append("\nReason: ", style="cyan")
|
|
296
|
+
rec_text.append("Module fits in 200K context window\n")
|
|
297
|
+
rec_text.append("Benefit: ", style="cyan")
|
|
298
|
+
rec_text.append("No additional cost, uses subscription quota\n")
|
|
299
|
+
else:
|
|
300
|
+
rec_text.append("\nReason: ", style="cyan")
|
|
301
|
+
rec_text.append("Module needs 1M context window\n")
|
|
302
|
+
rec_text.append("Benefit: ", style="cyan")
|
|
303
|
+
rec_text.append("No quota consumption, higher context limit\n")
|
|
304
|
+
|
|
305
|
+
console.print(Panel(rec_text, title="Recommendation", border_style="green"))
|
|
306
|
+
|
|
307
|
+
# Cost estimate
|
|
308
|
+
cost_table = Table(title="Cost Estimate", show_header=True)
|
|
309
|
+
cost_table.add_column("Metric", style="cyan")
|
|
310
|
+
cost_table.add_column("Value", justify="right", style="green")
|
|
311
|
+
|
|
312
|
+
cost_table.add_row("Mode", cost_estimate["mode"].upper())
|
|
313
|
+
if cost_estimate["mode"] == "subscription":
|
|
314
|
+
cost_table.add_row("Monetary Cost", "$0.00")
|
|
315
|
+
cost_table.add_row("Quota Cost", cost_estimate["quota_cost"])
|
|
316
|
+
cost_table.add_row(
|
|
317
|
+
"Fits in 200K", "✅ Yes" if cost_estimate["fits_in_context"] else "❌ No"
|
|
318
|
+
)
|
|
319
|
+
else:
|
|
320
|
+
cost_table.add_row("Monetary Cost", f"${cost_estimate['monetary_cost']:.4f}")
|
|
321
|
+
cost_table.add_row("Quota Cost", "None")
|
|
322
|
+
cost_table.add_row(
|
|
323
|
+
"Fits in 1M", "✅ Yes" if cost_estimate["fits_in_context"] else "❌ No"
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
cost_table.add_row("Estimated Tokens", f"{cost_estimate['tokens_used']:,}")
|
|
327
|
+
|
|
328
|
+
console.print(cost_table)
|
|
329
|
+
|
|
330
|
+
else:
|
|
331
|
+
# Plain text fallback
|
|
332
|
+
print("\n" + "=" * 60)
|
|
333
|
+
print("MODULE ANALYSIS")
|
|
334
|
+
print("=" * 60)
|
|
335
|
+
print(f"\nFile: {file_path}")
|
|
336
|
+
print(f"Lines of Code: {module_lines:,}")
|
|
337
|
+
print(f"Size Category: {size_category.upper()}")
|
|
338
|
+
|
|
339
|
+
print("\nRECOMMENDATION")
|
|
340
|
+
print("=" * 60)
|
|
341
|
+
print(f"Recommended: {recommended_mode.value.upper()} mode")
|
|
342
|
+
|
|
343
|
+
if recommended_mode.value == "subscription":
|
|
344
|
+
print("Reason: Module fits in 200K context window")
|
|
345
|
+
print("Benefit: No additional cost, uses subscription quota")
|
|
346
|
+
else:
|
|
347
|
+
print("Reason: Module needs 1M context window")
|
|
348
|
+
print("Benefit: No quota consumption, higher context limit")
|
|
349
|
+
|
|
350
|
+
print("\nCOST ESTIMATE")
|
|
351
|
+
print("=" * 60)
|
|
352
|
+
print(f"Mode: {cost_estimate['mode'].upper()}")
|
|
353
|
+
if cost_estimate["mode"] == "subscription":
|
|
354
|
+
print("Monetary Cost: $0.00")
|
|
355
|
+
print(f"Quota Cost: {cost_estimate['quota_cost']}")
|
|
356
|
+
print(
|
|
357
|
+
f"Fits in 200K: {'Yes' if cost_estimate['fits_in_context'] else 'No'}"
|
|
358
|
+
)
|
|
359
|
+
else:
|
|
360
|
+
print(f"Monetary Cost: ${cost_estimate['monetary_cost']:.4f}")
|
|
361
|
+
print("Quota Cost: None")
|
|
362
|
+
print(f"Fits in 1M: {'Yes' if cost_estimate['fits_in_context'] else 'No'}")
|
|
363
|
+
|
|
364
|
+
print(f"Estimated Tokens: {cost_estimate['tokens_used']:,}")
|
|
365
|
+
print("=" * 60)
|
|
366
|
+
|
|
367
|
+
return 0
|
|
368
|
+
|
|
369
|
+
except FileNotFoundError:
|
|
370
|
+
print("\n❌ No authentication strategy configured.")
|
|
371
|
+
print("Run 'empathy auth setup' to configure your strategy first.")
|
|
372
|
+
return 1
|
|
373
|
+
except Exception as e:
|
|
374
|
+
print(f"\n❌ Error analyzing file: {e}")
|
|
375
|
+
return 1
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def main() -> int:
|
|
379
|
+
"""Main CLI entry point."""
|
|
380
|
+
parser = argparse.ArgumentParser(
|
|
381
|
+
description="Authentication Strategy Management CLI",
|
|
382
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
383
|
+
epilog="""
|
|
384
|
+
Examples:
|
|
385
|
+
%(prog)s setup Run interactive setup
|
|
386
|
+
%(prog)s status Show current configuration
|
|
387
|
+
%(prog)s status --json Show configuration as JSON
|
|
388
|
+
%(prog)s reset --confirm Clear configuration
|
|
389
|
+
%(prog)s recommend path/to/file.py Get recommendation for file
|
|
390
|
+
""",
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
subparsers = parser.add_subparsers(dest="command", help="Command to run")
|
|
394
|
+
|
|
395
|
+
# Setup command
|
|
396
|
+
subparsers.add_parser("setup", help="Run interactive authentication strategy setup")
|
|
397
|
+
|
|
398
|
+
# Status command
|
|
399
|
+
status_parser = subparsers.add_parser(
|
|
400
|
+
"status", help="Show current authentication strategy"
|
|
401
|
+
)
|
|
402
|
+
status_parser.add_argument(
|
|
403
|
+
"--json", action="store_true", help="Output as JSON instead of formatted table"
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
# Reset command
|
|
407
|
+
reset_parser = subparsers.add_parser(
|
|
408
|
+
"reset", help="Reset authentication strategy configuration"
|
|
409
|
+
)
|
|
410
|
+
reset_parser.add_argument(
|
|
411
|
+
"--confirm", action="store_true", help="Confirm deletion of configuration"
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
# Recommend command
|
|
415
|
+
rec_parser = subparsers.add_parser(
|
|
416
|
+
"recommend", help="Get authentication recommendation for a file"
|
|
417
|
+
)
|
|
418
|
+
rec_parser.add_argument("file_path", help="Path to the file to analyze")
|
|
419
|
+
|
|
420
|
+
args = parser.parse_args()
|
|
421
|
+
|
|
422
|
+
if not args.command:
|
|
423
|
+
parser.print_help()
|
|
424
|
+
return 1
|
|
425
|
+
|
|
426
|
+
if args.command == "setup":
|
|
427
|
+
return cmd_auth_setup(args)
|
|
428
|
+
|
|
429
|
+
if args.command == "status":
|
|
430
|
+
return cmd_auth_status(args)
|
|
431
|
+
|
|
432
|
+
if args.command == "reset":
|
|
433
|
+
return cmd_auth_reset(args)
|
|
434
|
+
|
|
435
|
+
if args.command == "recommend":
|
|
436
|
+
return cmd_auth_recommend(args)
|
|
437
|
+
|
|
438
|
+
# Should not reach here
|
|
439
|
+
parser.print_help()
|
|
440
|
+
return 1
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
if __name__ == "__main__":
|
|
444
|
+
sys.exit(main())
|