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,166 @@
|
|
|
1
|
+
"""Sync commands for pattern synchronization.
|
|
2
|
+
|
|
3
|
+
Copyright 2025 Smart-AI-Memory
|
|
4
|
+
Licensed under Fair Source License 0.9
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json as json_mod
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from attune.config import _validate_file_path
|
|
11
|
+
from attune.logging_config import get_logger
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def cmd_sync_claude(args):
|
|
17
|
+
"""Sync patterns to Claude Code rules directory.
|
|
18
|
+
|
|
19
|
+
Converts learned patterns into Claude Code markdown rules.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
args: Namespace object from argparse with attributes:
|
|
23
|
+
- patterns_dir (str): Source patterns directory.
|
|
24
|
+
- output_dir (str): Target Claude Code rules directory.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
int: 0 on success, 1 on failure.
|
|
28
|
+
|
|
29
|
+
Raises:
|
|
30
|
+
ValueError: If output path is invalid or unsafe.
|
|
31
|
+
"""
|
|
32
|
+
patterns_dir = Path(args.patterns_dir)
|
|
33
|
+
# Validate output directory path
|
|
34
|
+
validated_output_dir = _validate_file_path(args.output_dir)
|
|
35
|
+
output_dir = validated_output_dir
|
|
36
|
+
|
|
37
|
+
print("=" * 60)
|
|
38
|
+
print(" SYNC PATTERNS TO CLAUDE CODE")
|
|
39
|
+
print("=" * 60 + "\n")
|
|
40
|
+
|
|
41
|
+
if not patterns_dir.exists():
|
|
42
|
+
print(f"✗ Patterns directory not found: {patterns_dir}")
|
|
43
|
+
print(" Run 'empathy learn --analyze 20' first to learn patterns")
|
|
44
|
+
return 1
|
|
45
|
+
|
|
46
|
+
# Create output directory
|
|
47
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
48
|
+
|
|
49
|
+
synced_count = 0
|
|
50
|
+
pattern_files = ["debugging.json", "security.json", "tech_debt.json", "inspection.json"]
|
|
51
|
+
|
|
52
|
+
for pattern_file in pattern_files:
|
|
53
|
+
source_path = patterns_dir / pattern_file
|
|
54
|
+
if not source_path.exists():
|
|
55
|
+
continue
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
with open(source_path) as f:
|
|
59
|
+
data = json_mod.load(f)
|
|
60
|
+
|
|
61
|
+
patterns = data.get("patterns", data.get("items", []))
|
|
62
|
+
if not patterns:
|
|
63
|
+
continue
|
|
64
|
+
|
|
65
|
+
# Generate markdown rule file
|
|
66
|
+
category = pattern_file.replace(".json", "")
|
|
67
|
+
rule_content = _generate_claude_rule(category, patterns)
|
|
68
|
+
|
|
69
|
+
# Write rule file
|
|
70
|
+
rule_file = output_dir / f"{category}.md"
|
|
71
|
+
# Validate rule file path before writing
|
|
72
|
+
validated_rule_file = _validate_file_path(str(rule_file), allowed_dir=str(output_dir))
|
|
73
|
+
with open(validated_rule_file, "w") as f:
|
|
74
|
+
f.write(rule_content)
|
|
75
|
+
|
|
76
|
+
print(f" ✓ {category}: {len(patterns)} patterns → {rule_file}")
|
|
77
|
+
synced_count += len(patterns)
|
|
78
|
+
|
|
79
|
+
except (json_mod.JSONDecodeError, OSError) as e:
|
|
80
|
+
print(f" ✗ Failed to process {pattern_file}: {e}")
|
|
81
|
+
|
|
82
|
+
print(f"\n{'─' * 60}")
|
|
83
|
+
print(f" Total: {synced_count} patterns synced to {output_dir}")
|
|
84
|
+
print("=" * 60 + "\n")
|
|
85
|
+
|
|
86
|
+
if synced_count == 0:
|
|
87
|
+
print("No patterns to sync. Run 'empathy learn' first.")
|
|
88
|
+
return 1
|
|
89
|
+
|
|
90
|
+
return 0
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _generate_claude_rule(category: str, patterns: list) -> str:
|
|
94
|
+
"""Generate a Claude Code rule file from patterns."""
|
|
95
|
+
lines = [
|
|
96
|
+
f"# {category.replace('_', ' ').title()} Patterns",
|
|
97
|
+
"",
|
|
98
|
+
"Auto-generated from Empathy Framework learned patterns.",
|
|
99
|
+
f"Total patterns: {len(patterns)}",
|
|
100
|
+
"",
|
|
101
|
+
"---",
|
|
102
|
+
"",
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
if category == "debugging":
|
|
106
|
+
lines.extend(
|
|
107
|
+
[
|
|
108
|
+
"## Bug Fix Patterns",
|
|
109
|
+
"",
|
|
110
|
+
"When debugging similar issues, consider these historical fixes:",
|
|
111
|
+
"",
|
|
112
|
+
],
|
|
113
|
+
)
|
|
114
|
+
for p in patterns[:20]: # Limit to 20 most recent
|
|
115
|
+
bug_type = p.get("bug_type", "unknown")
|
|
116
|
+
root_cause = p.get("root_cause", "Unknown")
|
|
117
|
+
fix = p.get("fix", "See commit history")
|
|
118
|
+
files = p.get("files_affected", [])
|
|
119
|
+
|
|
120
|
+
lines.append(f"### {bug_type}")
|
|
121
|
+
lines.append(f"- **Root cause**: {root_cause}")
|
|
122
|
+
lines.append(f"- **Fix**: {fix}")
|
|
123
|
+
if files:
|
|
124
|
+
lines.append(f"- **Files**: {', '.join(files[:3])}")
|
|
125
|
+
lines.append("")
|
|
126
|
+
|
|
127
|
+
elif category == "security":
|
|
128
|
+
lines.extend(
|
|
129
|
+
[
|
|
130
|
+
"## Security Decisions",
|
|
131
|
+
"",
|
|
132
|
+
"Previously reviewed security items:",
|
|
133
|
+
"",
|
|
134
|
+
],
|
|
135
|
+
)
|
|
136
|
+
for p in patterns[:20]:
|
|
137
|
+
decision = p.get("decision", "unknown")
|
|
138
|
+
reason = p.get("reason", "")
|
|
139
|
+
lines.append(f"- **{p.get('type', 'unknown')}**: {decision}")
|
|
140
|
+
if reason:
|
|
141
|
+
lines.append(f" - Reason: {reason}")
|
|
142
|
+
lines.append("")
|
|
143
|
+
|
|
144
|
+
elif category == "tech_debt":
|
|
145
|
+
lines.extend(
|
|
146
|
+
[
|
|
147
|
+
"## Tech Debt Tracking",
|
|
148
|
+
"",
|
|
149
|
+
"Known technical debt items:",
|
|
150
|
+
"",
|
|
151
|
+
],
|
|
152
|
+
)
|
|
153
|
+
for p in patterns[:20]:
|
|
154
|
+
lines.append(f"- {p.get('description', str(p))}")
|
|
155
|
+
|
|
156
|
+
else:
|
|
157
|
+
lines.extend(
|
|
158
|
+
[
|
|
159
|
+
f"## {category.title()} Items",
|
|
160
|
+
"",
|
|
161
|
+
],
|
|
162
|
+
)
|
|
163
|
+
for p in patterns[:20]:
|
|
164
|
+
lines.append(f"- {p.get('description', str(p)[:100])}")
|
|
165
|
+
|
|
166
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Tier management commands for intelligent model selection.
|
|
2
|
+
|
|
3
|
+
Copyright 2025 Smart-AI-Memory
|
|
4
|
+
Licensed under Fair Source License 0.9
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def cmd_tier_recommend(args):
|
|
9
|
+
"""Get intelligent tier recommendation for a bug/task.
|
|
10
|
+
|
|
11
|
+
Analyzes bug description and historical patterns to recommend
|
|
12
|
+
the most cost-effective tier (HAIKU/SONNET/OPUS).
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
args: Namespace object from argparse with attributes:
|
|
16
|
+
- description (str): Bug or task description to analyze.
|
|
17
|
+
- files (str | None): Comma-separated list of affected files.
|
|
18
|
+
- complexity (str | None): Complexity hint (low/medium/high).
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
None: Prints tier recommendation with confidence and expected cost.
|
|
22
|
+
"""
|
|
23
|
+
from attune.tier_recommender import TierRecommender
|
|
24
|
+
|
|
25
|
+
recommender = TierRecommender()
|
|
26
|
+
|
|
27
|
+
# Get recommendation
|
|
28
|
+
result = recommender.recommend(
|
|
29
|
+
bug_description=args.description,
|
|
30
|
+
files_affected=args.files.split(",") if args.files else None,
|
|
31
|
+
complexity_hint=args.complexity,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Display results
|
|
35
|
+
print()
|
|
36
|
+
print("=" * 60)
|
|
37
|
+
print(" TIER RECOMMENDATION")
|
|
38
|
+
print("=" * 60)
|
|
39
|
+
print()
|
|
40
|
+
print(f" Bug/Task: {args.description}")
|
|
41
|
+
print()
|
|
42
|
+
print(f" 📍 Recommended Tier: {result.tier}")
|
|
43
|
+
print(f" 🎯 Confidence: {result.confidence * 100:.1f}%")
|
|
44
|
+
print(f" 💰 Expected Cost: ${result.expected_cost:.3f}")
|
|
45
|
+
print(f" 🔄 Expected Attempts: {result.expected_attempts:.1f}")
|
|
46
|
+
print()
|
|
47
|
+
print(" 📊 Reasoning:")
|
|
48
|
+
print(f" {result.reasoning}")
|
|
49
|
+
print()
|
|
50
|
+
|
|
51
|
+
if result.similar_patterns_count > 0:
|
|
52
|
+
print(f" ✅ Based on {result.similar_patterns_count} similar patterns")
|
|
53
|
+
else:
|
|
54
|
+
print(" ⚠️ No historical data - using conservative default")
|
|
55
|
+
|
|
56
|
+
if result.fallback_used:
|
|
57
|
+
print()
|
|
58
|
+
print(" 💡 Tip: As more patterns are collected, recommendations")
|
|
59
|
+
print(" will become more accurate and personalized.")
|
|
60
|
+
|
|
61
|
+
print()
|
|
62
|
+
print("=" * 60)
|
|
63
|
+
print()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def cmd_tier_stats(args):
|
|
67
|
+
"""Show tier pattern learning statistics.
|
|
68
|
+
|
|
69
|
+
Displays statistics about collected patterns and tier distribution.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
args: Namespace object from argparse (no additional attributes used).
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
None: Prints tier statistics, savings percentages, and bug type distribution.
|
|
76
|
+
"""
|
|
77
|
+
from attune.tier_recommender import TierRecommender
|
|
78
|
+
|
|
79
|
+
recommender = TierRecommender()
|
|
80
|
+
stats = recommender.get_stats()
|
|
81
|
+
|
|
82
|
+
print()
|
|
83
|
+
print("=" * 60)
|
|
84
|
+
print(" TIER PATTERN LEARNING STATS")
|
|
85
|
+
print("=" * 60)
|
|
86
|
+
print()
|
|
87
|
+
|
|
88
|
+
if stats.get("total_patterns", 0) == 0:
|
|
89
|
+
print(" No patterns collected yet.")
|
|
90
|
+
print()
|
|
91
|
+
print(" 💡 Patterns are automatically collected as you use")
|
|
92
|
+
print(" cascading workflows with enhanced tracking enabled.")
|
|
93
|
+
print()
|
|
94
|
+
print("=" * 60)
|
|
95
|
+
print()
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
print(f" Total Patterns: {stats['total_patterns']}")
|
|
99
|
+
print(f" Avg Savings: {stats['avg_savings_percent']}%")
|
|
100
|
+
print()
|
|
101
|
+
|
|
102
|
+
print(" TIER DISTRIBUTION")
|
|
103
|
+
print(" " + "-" * 40)
|
|
104
|
+
for tier, count in stats["patterns_by_tier"].items():
|
|
105
|
+
percent = (count / stats["total_patterns"]) * 100
|
|
106
|
+
bar = "█" * int(percent / 5)
|
|
107
|
+
print(f" {tier:10} {count:3} ({percent:5.1f}%) {bar}")
|
|
108
|
+
print()
|
|
109
|
+
|
|
110
|
+
print(" BUG TYPE DISTRIBUTION")
|
|
111
|
+
print(" " + "-" * 40)
|
|
112
|
+
sorted_types = sorted(
|
|
113
|
+
stats["bug_type_distribution"].items(), key=lambda x: x[1], reverse=True
|
|
114
|
+
)
|
|
115
|
+
for bug_type, count in sorted_types[:10]:
|
|
116
|
+
percent = (count / stats["total_patterns"]) * 100
|
|
117
|
+
print(f" {bug_type:20} {count:3} ({percent:5.1f}%)")
|
|
118
|
+
|
|
119
|
+
print()
|
|
120
|
+
print("=" * 60)
|
|
121
|
+
print()
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Utility commands for Empathy Framework CLI.
|
|
2
|
+
|
|
3
|
+
General-purpose utility commands (sync, cheatsheet, dashboard, etc.).
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
import typer
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
|
|
15
|
+
from attune.cli.core import console
|
|
16
|
+
|
|
17
|
+
# Create the utilities Typer app
|
|
18
|
+
utilities_app = typer.Typer(
|
|
19
|
+
help="Utility tools - project init, cheatsheet, dashboard, costs",
|
|
20
|
+
no_args_is_help=True,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@utilities_app.command("sync-claude")
|
|
25
|
+
def sync_claude(
|
|
26
|
+
source: str = typer.Option("patterns", "--source", "-s", help="Source to sync"),
|
|
27
|
+
) -> None:
|
|
28
|
+
"""Sync patterns to Claude Code memory."""
|
|
29
|
+
subprocess.run(["empathy-sync-claude", "--source", source], check=False)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@utilities_app.command("cheatsheet")
|
|
33
|
+
def cheatsheet() -> None:
|
|
34
|
+
"""Show quick reference for all commands."""
|
|
35
|
+
console.print(
|
|
36
|
+
Panel.fit(
|
|
37
|
+
"""[bold]Getting Started[/bold]
|
|
38
|
+
empathy morning Start-of-day briefing
|
|
39
|
+
empathy health Quick health check
|
|
40
|
+
empathy ship Pre-commit validation
|
|
41
|
+
empathy run Interactive REPL
|
|
42
|
+
|
|
43
|
+
[bold]Memory System[/bold]
|
|
44
|
+
empathy memory status Check Redis & patterns
|
|
45
|
+
empathy memory start Start Redis server
|
|
46
|
+
empathy memory patterns List stored patterns
|
|
47
|
+
|
|
48
|
+
[bold]Cross-Session Service[/bold]
|
|
49
|
+
empathy service start Start coordination service
|
|
50
|
+
empathy service status Show service & sessions
|
|
51
|
+
empathy service sessions List active agents
|
|
52
|
+
|
|
53
|
+
[bold]Provider Config[/bold]
|
|
54
|
+
empathy provider Show current config
|
|
55
|
+
empathy provider --set hybrid Use best-of-breed
|
|
56
|
+
empathy provider registry List all models
|
|
57
|
+
|
|
58
|
+
[bold]Code Inspection[/bold]
|
|
59
|
+
empathy scan . Scan for issues
|
|
60
|
+
empathy inspect . Deep analysis (SARIF)
|
|
61
|
+
empathy fix-all Auto-fix everything
|
|
62
|
+
|
|
63
|
+
[bold]Profiling[/bold]
|
|
64
|
+
empathy profile memory-scan Scan for memory leaks
|
|
65
|
+
empathy profile hot-files Show riskiest files
|
|
66
|
+
empathy profile memory-test Profile memory module
|
|
67
|
+
|
|
68
|
+
[bold]Pattern Learning[/bold]
|
|
69
|
+
empathy learn --analyze 20 Learn from commits
|
|
70
|
+
empathy utilities sync-claude Sync to Claude Code
|
|
71
|
+
|
|
72
|
+
[bold]Workflows[/bold]
|
|
73
|
+
empathy workflow list Show available workflows
|
|
74
|
+
empathy workflow run <name> Execute a workflow
|
|
75
|
+
empathy workflow create <name> -p <patterns> Create workflow (12x faster)
|
|
76
|
+
empathy workflow list-patterns List available patterns
|
|
77
|
+
|
|
78
|
+
[bold]Workflows[/bold]
|
|
79
|
+
empathy workflow list Show available workflows
|
|
80
|
+
empathy workflow run <name> Execute a workflow
|
|
81
|
+
empathy workflow create <name> -d <domain> Create workflow (12x faster)
|
|
82
|
+
empathy workflow list-patterns List available patterns
|
|
83
|
+
|
|
84
|
+
[bold]Usage Telemetry[/bold]
|
|
85
|
+
empathy telemetry show View recent LLM calls & costs
|
|
86
|
+
empathy telemetry savings Calculate cost savings (tier routing)
|
|
87
|
+
empathy telemetry export Export usage data (JSON/CSV)""",
|
|
88
|
+
title="[bold blue]Empathy Framework Cheatsheet[/bold blue]",
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@utilities_app.command("dashboard")
|
|
94
|
+
def dashboard() -> None:
|
|
95
|
+
"""Launch visual dashboard."""
|
|
96
|
+
subprocess.run([sys.executable, "-m", "attune.cli", "dashboard"], check=False)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@utilities_app.command("costs")
|
|
100
|
+
def costs() -> None:
|
|
101
|
+
"""View API cost tracking."""
|
|
102
|
+
subprocess.run([sys.executable, "-m", "attune.cli", "costs"], check=False)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@utilities_app.command("init")
|
|
106
|
+
def init() -> None:
|
|
107
|
+
"""Create a new configuration file."""
|
|
108
|
+
subprocess.run([sys.executable, "-m", "attune.cli", "init"], check=False)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@utilities_app.command("status")
|
|
112
|
+
def status() -> None:
|
|
113
|
+
"""What needs attention now."""
|
|
114
|
+
subprocess.run([sys.executable, "-m", "attune.cli", "status"], check=False)
|