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,442 @@
|
|
|
1
|
+
"""CLI Analytics Commands.
|
|
2
|
+
|
|
3
|
+
Analytics Commands for meta-workflow system.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from datetime import datetime, timedelta
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
import typer
|
|
13
|
+
from rich.console import Console
|
|
14
|
+
from rich.panel import Panel
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
|
|
17
|
+
from attune.meta_workflows import (
|
|
18
|
+
PatternLearner,
|
|
19
|
+
list_execution_results,
|
|
20
|
+
load_execution_result,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
from . import meta_workflow_app
|
|
24
|
+
|
|
25
|
+
console = Console()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@meta_workflow_app.command("analytics")
|
|
29
|
+
def show_analytics(
|
|
30
|
+
template_id: str | None = typer.Argument(
|
|
31
|
+
None,
|
|
32
|
+
help="Template ID to analyze (optional, all if not specified)",
|
|
33
|
+
),
|
|
34
|
+
min_confidence: float = typer.Option(
|
|
35
|
+
0.5,
|
|
36
|
+
"--min-confidence",
|
|
37
|
+
"-c",
|
|
38
|
+
help="Minimum confidence threshold (0.0-1.0)",
|
|
39
|
+
),
|
|
40
|
+
use_memory: bool = typer.Option(
|
|
41
|
+
False,
|
|
42
|
+
"--use-memory",
|
|
43
|
+
"-m",
|
|
44
|
+
help="Use memory-enhanced analytics",
|
|
45
|
+
),
|
|
46
|
+
):
|
|
47
|
+
"""Show pattern learning analytics and recommendations.
|
|
48
|
+
|
|
49
|
+
Displays:
|
|
50
|
+
- Execution statistics
|
|
51
|
+
- Tier performance insights
|
|
52
|
+
- Cost analysis
|
|
53
|
+
- Recommendations
|
|
54
|
+
"""
|
|
55
|
+
try:
|
|
56
|
+
# Initialize pattern learner
|
|
57
|
+
pattern_learner = PatternLearner()
|
|
58
|
+
|
|
59
|
+
if use_memory:
|
|
60
|
+
console.print("[bold]Initializing memory-enhanced analytics...[/bold]\n")
|
|
61
|
+
from attune.memory.unified import UnifiedMemory
|
|
62
|
+
|
|
63
|
+
memory = UnifiedMemory(user_id="cli_analytics")
|
|
64
|
+
pattern_learner = PatternLearner(memory=memory)
|
|
65
|
+
|
|
66
|
+
# Generate report
|
|
67
|
+
report = pattern_learner.generate_analytics_report(template_id=template_id)
|
|
68
|
+
|
|
69
|
+
# Display summary
|
|
70
|
+
summary = report["summary"]
|
|
71
|
+
|
|
72
|
+
console.print("\n[bold cyan]Meta-Workflow Analytics Report[/bold cyan]")
|
|
73
|
+
if template_id:
|
|
74
|
+
console.print(f"[dim]Template: {template_id}[/dim]")
|
|
75
|
+
console.print()
|
|
76
|
+
|
|
77
|
+
summary_table = Table(show_header=False, box=None)
|
|
78
|
+
summary_table.add_column("Metric", style="bold")
|
|
79
|
+
summary_table.add_column("Value")
|
|
80
|
+
|
|
81
|
+
summary_table.add_row("Total Runs", str(summary["total_runs"]))
|
|
82
|
+
summary_table.add_row(
|
|
83
|
+
"Successful", f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
|
|
84
|
+
)
|
|
85
|
+
summary_table.add_row("Total Cost", f"${summary['total_cost']:.2f}")
|
|
86
|
+
summary_table.add_row("Avg Cost/Run", f"${summary['avg_cost_per_run']:.2f}")
|
|
87
|
+
summary_table.add_row("Total Agents", str(summary["total_agents_created"]))
|
|
88
|
+
summary_table.add_row("Avg Agents/Run", f"{summary['avg_agents_per_run']:.1f}")
|
|
89
|
+
|
|
90
|
+
console.print(Panel(summary_table, title="Summary", border_style="cyan"))
|
|
91
|
+
|
|
92
|
+
# Recommendations
|
|
93
|
+
recommendations = report.get("recommendations", [])
|
|
94
|
+
if recommendations:
|
|
95
|
+
console.print("\n[bold]Recommendations:[/bold]\n")
|
|
96
|
+
for rec in recommendations:
|
|
97
|
+
console.print(f" {rec}")
|
|
98
|
+
|
|
99
|
+
# Insights
|
|
100
|
+
insights = report.get("insights", {})
|
|
101
|
+
|
|
102
|
+
if insights.get("tier_performance"):
|
|
103
|
+
console.print("\n[bold]Tier Performance:[/bold]\n")
|
|
104
|
+
for insight in insights["tier_performance"][:5]: # Top 5
|
|
105
|
+
console.print(f" • {insight['description']}")
|
|
106
|
+
console.print(
|
|
107
|
+
f" [dim]Confidence: {insight['confidence']:.0%} (n={insight['sample_size']})[/dim]"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if insights.get("cost_analysis"):
|
|
111
|
+
console.print("\n[bold]Cost Analysis:[/bold]\n")
|
|
112
|
+
for insight in insights["cost_analysis"]:
|
|
113
|
+
console.print(f" • {insight['description']}")
|
|
114
|
+
|
|
115
|
+
# Tier breakdown
|
|
116
|
+
breakdown = insight["data"].get("tier_breakdown", {})
|
|
117
|
+
if breakdown:
|
|
118
|
+
console.print("\n [dim]By Tier:[/dim]")
|
|
119
|
+
for tier, stats in breakdown.items():
|
|
120
|
+
console.print(
|
|
121
|
+
f" {tier}: ${stats['avg']:.2f} avg "
|
|
122
|
+
f"(${stats['total']:.2f} total, {stats['count']} runs)"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if insights.get("failure_analysis"):
|
|
126
|
+
console.print("\n[bold yellow]Failure Analysis:[/bold yellow]\n")
|
|
127
|
+
for insight in insights["failure_analysis"]:
|
|
128
|
+
console.print(f" ⚠️ {insight['description']}")
|
|
129
|
+
|
|
130
|
+
console.print()
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
134
|
+
raise typer.Exit(code=1)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# =============================================================================
|
|
138
|
+
# Execution History Commands
|
|
139
|
+
# =============================================================================
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@meta_workflow_app.command("list-runs")
|
|
144
|
+
def list_runs(
|
|
145
|
+
template_id: str | None = typer.Option(
|
|
146
|
+
None,
|
|
147
|
+
"--template",
|
|
148
|
+
"-t",
|
|
149
|
+
help="Filter by template ID",
|
|
150
|
+
),
|
|
151
|
+
limit: int = typer.Option(
|
|
152
|
+
10,
|
|
153
|
+
"--limit",
|
|
154
|
+
"-n",
|
|
155
|
+
help="Maximum number of results",
|
|
156
|
+
),
|
|
157
|
+
):
|
|
158
|
+
"""List execution history.
|
|
159
|
+
|
|
160
|
+
Shows recent workflow executions with:
|
|
161
|
+
- Run ID and timestamp
|
|
162
|
+
- Template name
|
|
163
|
+
- Success status
|
|
164
|
+
- Cost and duration
|
|
165
|
+
"""
|
|
166
|
+
try:
|
|
167
|
+
run_ids = list_execution_results()
|
|
168
|
+
|
|
169
|
+
if not run_ids:
|
|
170
|
+
console.print("[yellow]No execution results found.[/yellow]")
|
|
171
|
+
return
|
|
172
|
+
|
|
173
|
+
console.print(
|
|
174
|
+
f"\n[bold]Recent Executions[/bold] (showing {min(limit, len(run_ids))} of {len(run_ids)}):\n"
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
# Create table
|
|
178
|
+
table = Table(show_header=True)
|
|
179
|
+
table.add_column("Run ID", style="cyan")
|
|
180
|
+
table.add_column("Template")
|
|
181
|
+
table.add_column("Status")
|
|
182
|
+
table.add_column("Cost", justify="right")
|
|
183
|
+
table.add_column("Duration", justify="right")
|
|
184
|
+
table.add_column("Timestamp")
|
|
185
|
+
|
|
186
|
+
count = 0
|
|
187
|
+
for run_id in run_ids[:limit]:
|
|
188
|
+
try:
|
|
189
|
+
result = load_execution_result(run_id)
|
|
190
|
+
|
|
191
|
+
# Filter by template if specified
|
|
192
|
+
if template_id and result.template_id != template_id:
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
status = "✅" if result.success else "❌"
|
|
196
|
+
cost = f"${result.total_cost:.2f}"
|
|
197
|
+
duration = f"{result.total_duration:.1f}s"
|
|
198
|
+
|
|
199
|
+
# Parse timestamp
|
|
200
|
+
try:
|
|
201
|
+
ts = datetime.fromisoformat(result.timestamp)
|
|
202
|
+
timestamp = ts.strftime("%Y-%m-%d %H:%M")
|
|
203
|
+
except Exception:
|
|
204
|
+
timestamp = result.timestamp[:16]
|
|
205
|
+
|
|
206
|
+
table.add_row(
|
|
207
|
+
run_id,
|
|
208
|
+
result.template_id,
|
|
209
|
+
status,
|
|
210
|
+
cost,
|
|
211
|
+
duration,
|
|
212
|
+
timestamp,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
count += 1
|
|
216
|
+
|
|
217
|
+
except Exception as e:
|
|
218
|
+
console.print(f"[yellow]Warning:[/yellow] Failed to load {run_id}: {e}")
|
|
219
|
+
continue
|
|
220
|
+
|
|
221
|
+
if count == 0:
|
|
222
|
+
if template_id:
|
|
223
|
+
console.print(f"[yellow]No executions found for template: {template_id}[/yellow]")
|
|
224
|
+
else:
|
|
225
|
+
console.print("[yellow]No valid execution results found.[/yellow]")
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
console.print(table)
|
|
229
|
+
console.print("\n[dim]View details: empathy meta-workflow show <run_id>[/dim]\n")
|
|
230
|
+
|
|
231
|
+
except Exception as e:
|
|
232
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
233
|
+
raise typer.Exit(code=1)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@meta_workflow_app.command("show")
|
|
238
|
+
def show_execution(
|
|
239
|
+
run_id: str = typer.Argument(..., help="Run ID to display"),
|
|
240
|
+
format: str = typer.Option(
|
|
241
|
+
"text",
|
|
242
|
+
"--format",
|
|
243
|
+
"-f",
|
|
244
|
+
help="Output format (text or json)",
|
|
245
|
+
),
|
|
246
|
+
):
|
|
247
|
+
"""Show detailed execution report.
|
|
248
|
+
|
|
249
|
+
Displays comprehensive information about a specific workflow execution:
|
|
250
|
+
- Form responses
|
|
251
|
+
- Agents created and executed
|
|
252
|
+
- Cost breakdown
|
|
253
|
+
- Success/failure details
|
|
254
|
+
"""
|
|
255
|
+
try:
|
|
256
|
+
result = load_execution_result(run_id)
|
|
257
|
+
|
|
258
|
+
if format == "json":
|
|
259
|
+
# JSON output
|
|
260
|
+
print(result.to_json())
|
|
261
|
+
return
|
|
262
|
+
|
|
263
|
+
# Text format (default)
|
|
264
|
+
console.print(f"\n[bold cyan]Execution Report: {run_id}[/bold cyan]\n")
|
|
265
|
+
|
|
266
|
+
# Status
|
|
267
|
+
status = "✅ Success" if result.success else "❌ Failed"
|
|
268
|
+
console.print(f"[bold]Status:[/bold] {status}")
|
|
269
|
+
console.print(f"[bold]Template:[/bold] {result.template_id}")
|
|
270
|
+
console.print(f"[bold]Timestamp:[/bold] {result.timestamp}")
|
|
271
|
+
|
|
272
|
+
if result.error:
|
|
273
|
+
console.print(f"\n[bold red]Error:[/bold red] {result.error}\n")
|
|
274
|
+
|
|
275
|
+
# Summary
|
|
276
|
+
console.print("\n[bold]Summary:[/bold]")
|
|
277
|
+
console.print(f" Agents Created: {len(result.agents_created)}")
|
|
278
|
+
console.print(f" Agents Executed: {len(result.agent_results)}")
|
|
279
|
+
console.print(f" Total Cost: ${result.total_cost:.2f}")
|
|
280
|
+
console.print(f" Duration: {result.total_duration:.1f}s")
|
|
281
|
+
|
|
282
|
+
# Form Responses
|
|
283
|
+
console.print("\n[bold]Form Responses:[/bold]\n")
|
|
284
|
+
for key, value in result.form_responses.responses.items():
|
|
285
|
+
console.print(f" [cyan]{key}:[/cyan] {value}")
|
|
286
|
+
|
|
287
|
+
# Agents
|
|
288
|
+
console.print("\n[bold]Agents Executed:[/bold]\n")
|
|
289
|
+
for i, agent_result in enumerate(result.agent_results, 1):
|
|
290
|
+
status_emoji = "✅" if agent_result.success else "❌"
|
|
291
|
+
console.print(f" {i}. {status_emoji} [cyan]{agent_result.role}[/cyan]")
|
|
292
|
+
console.print(f" Tier: {agent_result.tier_used}")
|
|
293
|
+
console.print(f" Cost: ${agent_result.cost:.2f}")
|
|
294
|
+
console.print(f" Duration: {agent_result.duration:.1f}s")
|
|
295
|
+
if agent_result.error:
|
|
296
|
+
console.print(f" [red]Error: {agent_result.error}[/red]")
|
|
297
|
+
console.print()
|
|
298
|
+
|
|
299
|
+
# Cost breakdown
|
|
300
|
+
console.print("[bold]Cost Breakdown by Tier:[/bold]\n")
|
|
301
|
+
tier_costs = {}
|
|
302
|
+
for agent_result in result.agent_results:
|
|
303
|
+
tier = agent_result.tier_used
|
|
304
|
+
tier_costs[tier] = tier_costs.get(tier, 0.0) + agent_result.cost
|
|
305
|
+
|
|
306
|
+
for tier, cost in sorted(tier_costs.items()):
|
|
307
|
+
console.print(f" {tier}: ${cost:.2f}")
|
|
308
|
+
|
|
309
|
+
console.print()
|
|
310
|
+
|
|
311
|
+
except FileNotFoundError:
|
|
312
|
+
console.print(f"[red]Execution not found:[/red] {run_id}")
|
|
313
|
+
console.print("\n[dim]List available runs: empathy meta-workflow list-runs[/dim]")
|
|
314
|
+
raise typer.Exit(code=1)
|
|
315
|
+
except Exception as e:
|
|
316
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
317
|
+
raise typer.Exit(code=1)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
# =============================================================================
|
|
321
|
+
# Maintenance Commands
|
|
322
|
+
# =============================================================================
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
@meta_workflow_app.command("cleanup")
|
|
327
|
+
def cleanup_executions(
|
|
328
|
+
older_than_days: int = typer.Option(
|
|
329
|
+
30,
|
|
330
|
+
"--older-than",
|
|
331
|
+
"-d",
|
|
332
|
+
help="Delete executions older than N days",
|
|
333
|
+
),
|
|
334
|
+
dry_run: bool = typer.Option(
|
|
335
|
+
False,
|
|
336
|
+
"--dry-run",
|
|
337
|
+
help="Show what would be deleted without deleting",
|
|
338
|
+
),
|
|
339
|
+
template_id: str | None = typer.Option(
|
|
340
|
+
None,
|
|
341
|
+
"--template",
|
|
342
|
+
"-t",
|
|
343
|
+
help="Filter by template ID",
|
|
344
|
+
),
|
|
345
|
+
):
|
|
346
|
+
"""Clean up old execution results.
|
|
347
|
+
|
|
348
|
+
Deletes execution directories older than the specified number of days.
|
|
349
|
+
Use --dry-run to preview what would be deleted.
|
|
350
|
+
"""
|
|
351
|
+
try:
|
|
352
|
+
cutoff_date = datetime.now() - timedelta(days=older_than_days)
|
|
353
|
+
|
|
354
|
+
run_ids = list_execution_results()
|
|
355
|
+
|
|
356
|
+
if not run_ids:
|
|
357
|
+
console.print("[yellow]No execution results found.[/yellow]")
|
|
358
|
+
return
|
|
359
|
+
|
|
360
|
+
to_delete = []
|
|
361
|
+
|
|
362
|
+
for run_id in run_ids:
|
|
363
|
+
try:
|
|
364
|
+
result = load_execution_result(run_id)
|
|
365
|
+
|
|
366
|
+
# Filter by template if specified
|
|
367
|
+
if template_id and result.template_id != template_id:
|
|
368
|
+
continue
|
|
369
|
+
|
|
370
|
+
# Parse timestamp
|
|
371
|
+
ts = datetime.fromisoformat(result.timestamp)
|
|
372
|
+
|
|
373
|
+
if ts < cutoff_date:
|
|
374
|
+
to_delete.append((run_id, result, ts))
|
|
375
|
+
|
|
376
|
+
except Exception as e:
|
|
377
|
+
console.print(f"[yellow]Warning:[/yellow] Failed to load {run_id}: {e}")
|
|
378
|
+
continue
|
|
379
|
+
|
|
380
|
+
if not to_delete:
|
|
381
|
+
console.print(f"[green]No executions older than {older_than_days} days found.[/green]")
|
|
382
|
+
return
|
|
383
|
+
|
|
384
|
+
# Show what will be deleted
|
|
385
|
+
console.print(f"\n[bold]Executions to delete:[/bold] ({len(to_delete)})\n")
|
|
386
|
+
|
|
387
|
+
table = Table(show_header=True)
|
|
388
|
+
table.add_column("Run ID", style="cyan")
|
|
389
|
+
table.add_column("Template")
|
|
390
|
+
table.add_column("Age (days)", justify="right")
|
|
391
|
+
table.add_column("Cost", justify="right")
|
|
392
|
+
|
|
393
|
+
total_cost_saved = 0.0
|
|
394
|
+
for run_id, result, ts in to_delete:
|
|
395
|
+
age_days = (datetime.now() - ts).days
|
|
396
|
+
table.add_row(
|
|
397
|
+
run_id,
|
|
398
|
+
result.template_id,
|
|
399
|
+
str(age_days),
|
|
400
|
+
f"${result.total_cost:.2f}",
|
|
401
|
+
)
|
|
402
|
+
total_cost_saved += result.total_cost
|
|
403
|
+
|
|
404
|
+
console.print(table)
|
|
405
|
+
console.print(f"\nTotal cost represented: ${total_cost_saved:.2f}")
|
|
406
|
+
|
|
407
|
+
if dry_run:
|
|
408
|
+
console.print("\n[yellow]DRY RUN - No files deleted[/yellow]")
|
|
409
|
+
console.print(f"Run without --dry-run to delete {len(to_delete)} executions")
|
|
410
|
+
return
|
|
411
|
+
|
|
412
|
+
# Confirm deletion
|
|
413
|
+
if not typer.confirm(f"\nDelete {len(to_delete)} execution(s)?"):
|
|
414
|
+
console.print("[yellow]Cancelled[/yellow]")
|
|
415
|
+
return
|
|
416
|
+
|
|
417
|
+
# Delete
|
|
418
|
+
import shutil
|
|
419
|
+
|
|
420
|
+
deleted = 0
|
|
421
|
+
for run_id, _, _ in to_delete:
|
|
422
|
+
try:
|
|
423
|
+
run_dir = Path.home() / ".empathy" / "meta_workflows" / "executions" / run_id
|
|
424
|
+
if run_dir.exists():
|
|
425
|
+
shutil.rmtree(run_dir)
|
|
426
|
+
deleted += 1
|
|
427
|
+
except Exception as e:
|
|
428
|
+
console.print(f"[red]Failed to delete {run_id}:[/red] {e}")
|
|
429
|
+
|
|
430
|
+
console.print(f"\n[green]✓ Deleted {deleted} execution(s)[/green]\n")
|
|
431
|
+
|
|
432
|
+
except Exception as e:
|
|
433
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
434
|
+
raise typer.Exit(code=1)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
# =============================================================================
|
|
438
|
+
# Memory Search Commands
|
|
439
|
+
# =============================================================================
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""CLI Config Commands.
|
|
2
|
+
|
|
3
|
+
Config Commands for meta-workflow system.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
import typer
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from rich.table import Table
|
|
13
|
+
|
|
14
|
+
from attune.meta_workflows import (
|
|
15
|
+
TemplateRegistry,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from . import meta_workflow_app
|
|
19
|
+
|
|
20
|
+
console = Console()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@meta_workflow_app.command("suggest-defaults")
|
|
24
|
+
def suggest_defaults_cmd(
|
|
25
|
+
template_id: str = typer.Argument(..., help="Template ID to get defaults for"),
|
|
26
|
+
session_id: str | None = typer.Option(
|
|
27
|
+
None,
|
|
28
|
+
"--session-id",
|
|
29
|
+
"-s",
|
|
30
|
+
help="Session ID (optional)",
|
|
31
|
+
),
|
|
32
|
+
user_id: str = typer.Option(
|
|
33
|
+
"cli_user",
|
|
34
|
+
"--user-id",
|
|
35
|
+
"-u",
|
|
36
|
+
help="User ID for session",
|
|
37
|
+
),
|
|
38
|
+
):
|
|
39
|
+
"""Get suggested default values based on session history.
|
|
40
|
+
|
|
41
|
+
Analyzes recent choices for the specified template and suggests
|
|
42
|
+
intelligent defaults for the next run.
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
empathy meta-workflow suggest-defaults test_creation_management_workflow
|
|
46
|
+
empathy meta-workflow suggest-defaults python_package_publish --session-id sess_123
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
from attune.memory.unified import UnifiedMemory
|
|
50
|
+
from attune.meta_workflows.session_context import SessionContext
|
|
51
|
+
|
|
52
|
+
# Initialize
|
|
53
|
+
memory = UnifiedMemory(user_id=user_id)
|
|
54
|
+
session = SessionContext(memory=memory, session_id=session_id)
|
|
55
|
+
|
|
56
|
+
# Load template
|
|
57
|
+
registry = TemplateRegistry()
|
|
58
|
+
template = registry.load_template(template_id)
|
|
59
|
+
if not template:
|
|
60
|
+
console.print(f"[red]Error:[/red] Template not found: {template_id}")
|
|
61
|
+
raise typer.Exit(code=1)
|
|
62
|
+
|
|
63
|
+
console.print(f"\n[bold]Suggested Defaults for:[/bold] {template.name}")
|
|
64
|
+
console.print(f"[dim]Template ID: {template_id}[/dim]\n")
|
|
65
|
+
|
|
66
|
+
# Get suggestions
|
|
67
|
+
defaults = session.suggest_defaults(
|
|
68
|
+
template_id=template_id,
|
|
69
|
+
form_schema=template.form_schema,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
if not defaults:
|
|
73
|
+
console.print("[yellow]No suggestions available (no recent history).[/yellow]\n")
|
|
74
|
+
return
|
|
75
|
+
|
|
76
|
+
# Display
|
|
77
|
+
console.print(f"[green]Found {len(defaults)} suggested default(s):[/green]\n")
|
|
78
|
+
|
|
79
|
+
table = Table(show_header=True)
|
|
80
|
+
table.add_column("Question ID", style="cyan")
|
|
81
|
+
table.add_column("Suggested Value")
|
|
82
|
+
|
|
83
|
+
for question_id, value in defaults.items():
|
|
84
|
+
# Find the question to get the display text
|
|
85
|
+
question = next(
|
|
86
|
+
(q for q in template.form_schema.questions if q.id == question_id), None
|
|
87
|
+
)
|
|
88
|
+
question_text = question.text if question else question_id
|
|
89
|
+
|
|
90
|
+
value_str = str(value)
|
|
91
|
+
if isinstance(value, list):
|
|
92
|
+
value_str = ", ".join(str(v) for v in value)
|
|
93
|
+
|
|
94
|
+
table.add_row(question_text, value_str)
|
|
95
|
+
|
|
96
|
+
console.print(table)
|
|
97
|
+
console.print(
|
|
98
|
+
f"\n[dim]Use these defaults by running:[/dim]\n"
|
|
99
|
+
f" empathy meta-workflow run {template_id} --use-defaults\n"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
except ImportError:
|
|
103
|
+
console.print(
|
|
104
|
+
"[red]Error:[/red] Session context not available. "
|
|
105
|
+
"Ensure memory and session modules are installed."
|
|
106
|
+
)
|
|
107
|
+
raise typer.Exit(code=1)
|
|
108
|
+
except Exception as e:
|
|
109
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
110
|
+
raise typer.Exit(code=1)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# =============================================================================
|
|
114
|
+
# Migration Commands
|
|
115
|
+
# =============================================================================
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@meta_workflow_app.command("migrate")
|
|
120
|
+
def show_migration_guide(
|
|
121
|
+
crew_name: str | None = typer.Argument(
|
|
122
|
+
None,
|
|
123
|
+
help="Specific Crew workflow name (optional)",
|
|
124
|
+
),
|
|
125
|
+
):
|
|
126
|
+
"""Show migration guide from deprecated Crew workflows.
|
|
127
|
+
|
|
128
|
+
Displays information about migrating from the deprecated Crew-based
|
|
129
|
+
workflows to the new meta-workflow system.
|
|
130
|
+
|
|
131
|
+
Examples:
|
|
132
|
+
empathy meta-workflow migrate
|
|
133
|
+
empathy meta-workflow migrate ReleasePreparationCrew
|
|
134
|
+
"""
|
|
135
|
+
# Migration mapping
|
|
136
|
+
CREW_MIGRATION_MAP = {
|
|
137
|
+
"ReleasePreparationCrew": {
|
|
138
|
+
"template_id": "release-prep",
|
|
139
|
+
"old_import": "from attune.workflows.release_prep_crew import ReleasePreparationCrew",
|
|
140
|
+
"old_usage": "crew = ReleasePreparationCrew(project_root='.')\nresult = await crew.execute()",
|
|
141
|
+
"new_usage": "empathy meta-workflow run release-prep",
|
|
142
|
+
},
|
|
143
|
+
"TestCoverageBoostCrew": {
|
|
144
|
+
"template_id": "test-coverage-boost",
|
|
145
|
+
"old_import": "from attune.workflows.test_coverage_boost_crew import TestCoverageBoostCrew",
|
|
146
|
+
"old_usage": "crew = TestCoverageBoostCrew(target_coverage=85.0)\nresult = await crew.execute()",
|
|
147
|
+
"new_usage": "empathy meta-workflow run test-coverage-boost",
|
|
148
|
+
},
|
|
149
|
+
"TestMaintenanceCrew": {
|
|
150
|
+
"template_id": "test-maintenance",
|
|
151
|
+
"old_import": "from attune.workflows.test_maintenance_crew import TestMaintenanceCrew",
|
|
152
|
+
"old_usage": "crew = TestMaintenanceCrew('.')\nresult = await crew.run(mode='full')",
|
|
153
|
+
"new_usage": "empathy meta-workflow run test-maintenance",
|
|
154
|
+
},
|
|
155
|
+
"ManageDocumentationCrew": {
|
|
156
|
+
"template_id": "manage-docs",
|
|
157
|
+
"old_import": "from attune.workflows.manage_documentation import ManageDocumentationCrew",
|
|
158
|
+
"old_usage": "crew = ManageDocumentationCrew()\nresult = await crew.execute(path='./src')",
|
|
159
|
+
"new_usage": "empathy meta-workflow run manage-docs",
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
console.print("\n[bold cyan]🔄 Crew → Meta-Workflow Migration Guide[/bold cyan]\n")
|
|
164
|
+
|
|
165
|
+
if crew_name:
|
|
166
|
+
# Show specific migration
|
|
167
|
+
if crew_name not in CREW_MIGRATION_MAP:
|
|
168
|
+
console.print(f"[red]Unknown Crew workflow:[/red] {crew_name}")
|
|
169
|
+
console.print("\n[bold]Available Crew workflows:[/bold]")
|
|
170
|
+
for name in CREW_MIGRATION_MAP:
|
|
171
|
+
console.print(f" • {name}")
|
|
172
|
+
raise typer.Exit(code=1)
|
|
173
|
+
|
|
174
|
+
info = CREW_MIGRATION_MAP[crew_name]
|
|
175
|
+
console.print(f"[bold]Migrating:[/bold] {crew_name}\n")
|
|
176
|
+
|
|
177
|
+
console.print("[bold red]DEPRECATED (Before):[/bold red]")
|
|
178
|
+
console.print(f"[dim]{info['old_import']}[/dim]")
|
|
179
|
+
console.print(f"\n[yellow]{info['old_usage']}[/yellow]\n")
|
|
180
|
+
|
|
181
|
+
console.print("[bold green]RECOMMENDED (After):[/bold green]")
|
|
182
|
+
console.print(f"[green]{info['new_usage']}[/green]\n")
|
|
183
|
+
|
|
184
|
+
console.print("[bold]Benefits:[/bold]")
|
|
185
|
+
console.print(" ✓ No CrewAI/LangChain dependency required")
|
|
186
|
+
console.print(" ✓ Interactive configuration via Socratic questions")
|
|
187
|
+
console.print(" ✓ Automatic cost optimization with tier escalation")
|
|
188
|
+
console.print(" ✓ Session context for learning preferences")
|
|
189
|
+
console.print(" ✓ Built-in analytics and pattern learning\n")
|
|
190
|
+
|
|
191
|
+
console.print(f"[dim]Try it now: empathy meta-workflow run {info['template_id']}[/dim]\n")
|
|
192
|
+
|
|
193
|
+
else:
|
|
194
|
+
# Show overview
|
|
195
|
+
console.print("[bold]Why Migrate?[/bold]")
|
|
196
|
+
console.print(" The Crew-based workflows are deprecated since v4.3.0.")
|
|
197
|
+
console.print(" The meta-workflow system provides the same functionality")
|
|
198
|
+
console.print(" with better cost optimization and no extra dependencies.\n")
|
|
199
|
+
|
|
200
|
+
# Show migration table
|
|
201
|
+
table = Table(title="Migration Map", show_header=True)
|
|
202
|
+
table.add_column("Deprecated Crew", style="yellow")
|
|
203
|
+
table.add_column("Meta-Workflow Command", style="green")
|
|
204
|
+
table.add_column("Template ID", style="cyan")
|
|
205
|
+
|
|
206
|
+
for crew_name, info in CREW_MIGRATION_MAP.items():
|
|
207
|
+
table.add_row(
|
|
208
|
+
crew_name,
|
|
209
|
+
info["new_usage"],
|
|
210
|
+
info["template_id"],
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
console.print(table)
|
|
214
|
+
|
|
215
|
+
console.print("\n[bold]Quick Start:[/bold]")
|
|
216
|
+
console.print(
|
|
217
|
+
" 1. List available templates: [cyan]empathy meta-workflow list-templates[/cyan]"
|
|
218
|
+
)
|
|
219
|
+
console.print(" 2. Run a workflow: [cyan]empathy meta-workflow run release-prep[/cyan]")
|
|
220
|
+
console.print(" 3. View results: [cyan]empathy meta-workflow list-runs[/cyan]\n")
|
|
221
|
+
|
|
222
|
+
console.print("[bold]More Details:[/bold]")
|
|
223
|
+
console.print(" • Migration guide: [dim]empathy meta-workflow migrate <CrewName>[/dim]")
|
|
224
|
+
console.print(" • Full documentation: [dim]docs/CREWAI_MIGRATION.md[/dim]\n")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# =============================================================================
|
|
228
|
+
# Dynamic Agent/Team Creation Commands (v4.4)
|
|
229
|
+
# =============================================================================
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|