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,539 @@
|
|
|
1
|
+
"""Multi-Model Workflow Templates for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Cost-optimized workflow patterns that leverage 3-tier model routing:
|
|
4
|
+
- Haiku (cheap): Summarization, classification, triage
|
|
5
|
+
- Sonnet (capable): Analysis, code generation, security review
|
|
6
|
+
- Opus (premium): Synthesis, architectural decisions, coordination
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
from attune.workflows import ResearchSynthesisWorkflow
|
|
10
|
+
|
|
11
|
+
workflow = ResearchSynthesisWorkflow()
|
|
12
|
+
result = await workflow.execute(
|
|
13
|
+
sources=["doc1.md", "doc2.md"],
|
|
14
|
+
question="What are the key patterns?"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
print(f"Cost: ${result.cost_report.total_cost:.4f}")
|
|
18
|
+
print(f"Saved: {result.cost_report.savings_percent:.1f}% vs premium-only")
|
|
19
|
+
|
|
20
|
+
Workflow Discovery:
|
|
21
|
+
Workflows can be discovered via entry points (pyproject.toml):
|
|
22
|
+
|
|
23
|
+
[project.entry-points."empathy.workflows"]
|
|
24
|
+
my-workflow = "my_package.workflows:MyWorkflow"
|
|
25
|
+
|
|
26
|
+
Then call discover_workflows() to load all registered workflows.
|
|
27
|
+
|
|
28
|
+
Copyright 2025 Smart-AI-Memory
|
|
29
|
+
Licensed under Fair Source License 0.9
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
import importlib.metadata
|
|
33
|
+
import importlib.util
|
|
34
|
+
import os
|
|
35
|
+
from typing import TYPE_CHECKING
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# LAZY IMPORTS - Deferred loading for faster startup
|
|
39
|
+
# =============================================================================
|
|
40
|
+
# Workflow imports are deferred until actually accessed, reducing initial
|
|
41
|
+
# import time from ~0.5s to ~0.05s for simple use cases.
|
|
42
|
+
|
|
43
|
+
if TYPE_CHECKING:
|
|
44
|
+
from .base import BaseWorkflow
|
|
45
|
+
from .bug_predict import BugPredictionWorkflow
|
|
46
|
+
from .code_review import CodeReviewWorkflow
|
|
47
|
+
from .code_review_pipeline import CodeReviewPipeline, CodeReviewPipelineResult
|
|
48
|
+
from .config import DEFAULT_MODELS, ModelConfig, WorkflowConfig
|
|
49
|
+
from .dependency_check import DependencyCheckWorkflow
|
|
50
|
+
from .document_gen import DocumentGenerationWorkflow
|
|
51
|
+
from .document_manager import DocumentManagerWorkflow
|
|
52
|
+
from .documentation_orchestrator import DocumentationOrchestrator, OrchestratorResult
|
|
53
|
+
from .keyboard_shortcuts import KeyboardShortcutWorkflow
|
|
54
|
+
from .manage_documentation import ManageDocumentationCrew, ManageDocumentationCrewResult
|
|
55
|
+
from .orchestrated_health_check import HealthCheckReport, OrchestratedHealthCheckWorkflow
|
|
56
|
+
from .orchestrated_release_prep import OrchestratedReleasePrepWorkflow, ReleaseReadinessReport
|
|
57
|
+
from .perf_audit import PerformanceAuditWorkflow
|
|
58
|
+
from .pr_review import PRReviewResult, PRReviewWorkflow
|
|
59
|
+
from .refactor_plan import RefactorPlanWorkflow
|
|
60
|
+
from .release_prep import ReleasePreparationWorkflow
|
|
61
|
+
from .release_prep_crew import ReleasePreparationCrew, ReleasePreparationCrewResult
|
|
62
|
+
from .research_synthesis import ResearchSynthesisWorkflow
|
|
63
|
+
from .secure_release import SecureReleasePipeline, SecureReleaseResult
|
|
64
|
+
from .security_audit import SecurityAuditWorkflow
|
|
65
|
+
from .seo_optimization import SEOOptimizationWorkflow
|
|
66
|
+
from .step_config import WorkflowStepConfig
|
|
67
|
+
from .test5 import Test5Workflow
|
|
68
|
+
from .test_coverage_boost_crew import TestCoverageBoostCrew, TestCoverageBoostCrewResult
|
|
69
|
+
from .test_gen import TestGenerationWorkflow
|
|
70
|
+
from .test_gen_behavioral import BehavioralTestGenerationWorkflow
|
|
71
|
+
from .test_gen_parallel import ParallelTestGenerationWorkflow
|
|
72
|
+
from .xml_enhanced_crew import XMLAgent, XMLTask
|
|
73
|
+
|
|
74
|
+
# Only import base module eagerly (small, needed for type checks)
|
|
75
|
+
from .base import (
|
|
76
|
+
PROVIDER_MODELS,
|
|
77
|
+
BaseWorkflow,
|
|
78
|
+
CostReport,
|
|
79
|
+
ModelProvider,
|
|
80
|
+
ModelTier,
|
|
81
|
+
WorkflowResult,
|
|
82
|
+
WorkflowStage,
|
|
83
|
+
get_workflow_stats,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Builder pattern for workflow construction
|
|
87
|
+
from .builder import WorkflowBuilder, workflow_builder
|
|
88
|
+
|
|
89
|
+
# Config is small and frequently needed
|
|
90
|
+
from .config import DEFAULT_MODELS, ModelConfig, WorkflowConfig, create_example_config, get_model
|
|
91
|
+
|
|
92
|
+
# Routing strategies (small, frequently needed for builder pattern)
|
|
93
|
+
from .routing import (
|
|
94
|
+
BalancedRouting,
|
|
95
|
+
CostOptimizedRouting,
|
|
96
|
+
PerformanceOptimizedRouting,
|
|
97
|
+
RoutingContext,
|
|
98
|
+
TierRoutingStrategy,
|
|
99
|
+
)
|
|
100
|
+
from .step_config import WorkflowStepConfig, steps_from_tier_map, validate_step_config
|
|
101
|
+
|
|
102
|
+
# Lazy import mapping for workflow classes
|
|
103
|
+
_LAZY_WORKFLOW_IMPORTS: dict[str, tuple[str, str]] = {
|
|
104
|
+
# Core workflows
|
|
105
|
+
"BugPredictionWorkflow": (".bug_predict", "BugPredictionWorkflow"),
|
|
106
|
+
"CodeReviewWorkflow": (".code_review", "CodeReviewWorkflow"),
|
|
107
|
+
"CodeReviewPipeline": (".code_review_pipeline", "CodeReviewPipeline"),
|
|
108
|
+
"CodeReviewPipelineResult": (".code_review_pipeline", "CodeReviewPipelineResult"),
|
|
109
|
+
"DependencyCheckWorkflow": (".dependency_check", "DependencyCheckWorkflow"),
|
|
110
|
+
"DocumentGenerationWorkflow": (".document_gen", "DocumentGenerationWorkflow"),
|
|
111
|
+
"DocumentManagerWorkflow": (".document_manager", "DocumentManagerWorkflow"),
|
|
112
|
+
"DocumentationOrchestrator": (".documentation_orchestrator", "DocumentationOrchestrator"),
|
|
113
|
+
"OrchestratorResult": (".documentation_orchestrator", "OrchestratorResult"),
|
|
114
|
+
"KeyboardShortcutWorkflow": (".keyboard_shortcuts", "KeyboardShortcutWorkflow"),
|
|
115
|
+
"ManageDocumentationCrew": (".manage_documentation", "ManageDocumentationCrew"),
|
|
116
|
+
"ManageDocumentationCrewResult": (".manage_documentation", "ManageDocumentationCrewResult"),
|
|
117
|
+
"OrchestratedHealthCheckWorkflow": (
|
|
118
|
+
".orchestrated_health_check",
|
|
119
|
+
"OrchestratedHealthCheckWorkflow",
|
|
120
|
+
),
|
|
121
|
+
"HealthCheckReport": (".orchestrated_health_check", "HealthCheckReport"),
|
|
122
|
+
"OrchestratedReleasePrepWorkflow": (
|
|
123
|
+
".orchestrated_release_prep",
|
|
124
|
+
"OrchestratedReleasePrepWorkflow",
|
|
125
|
+
),
|
|
126
|
+
"ReleaseReadinessReport": (".orchestrated_release_prep", "ReleaseReadinessReport"),
|
|
127
|
+
"PerformanceAuditWorkflow": (".perf_audit", "PerformanceAuditWorkflow"),
|
|
128
|
+
"PRReviewWorkflow": (".pr_review", "PRReviewWorkflow"),
|
|
129
|
+
"PRReviewResult": (".pr_review", "PRReviewResult"),
|
|
130
|
+
"RefactorPlanWorkflow": (".refactor_plan", "RefactorPlanWorkflow"),
|
|
131
|
+
"ReleasePreparationWorkflow": (".release_prep", "ReleasePreparationWorkflow"),
|
|
132
|
+
"ReleasePreparationCrew": (".release_prep_crew", "ReleasePreparationCrew"),
|
|
133
|
+
"ReleasePreparationCrewResult": (".release_prep_crew", "ReleasePreparationCrewResult"),
|
|
134
|
+
"ResearchSynthesisWorkflow": (".research_synthesis", "ResearchSynthesisWorkflow"),
|
|
135
|
+
"SecureReleasePipeline": (".secure_release", "SecureReleasePipeline"),
|
|
136
|
+
"SecureReleaseResult": (".secure_release", "SecureReleaseResult"),
|
|
137
|
+
"SecurityAuditWorkflow": (".security_audit", "SecurityAuditWorkflow"),
|
|
138
|
+
"SEOOptimizationWorkflow": (".seo_optimization", "SEOOptimizationWorkflow"),
|
|
139
|
+
"Test5Workflow": (".test5", "Test5Workflow"),
|
|
140
|
+
"TestCoverageBoostCrew": (".test_coverage_boost_crew", "TestCoverageBoostCrew"),
|
|
141
|
+
"TestCoverageBoostCrewResult": (".test_coverage_boost_crew", "TestCoverageBoostCrewResult"),
|
|
142
|
+
"TestGenerationWorkflow": (".test_gen", "TestGenerationWorkflow"),
|
|
143
|
+
"BehavioralTestGenerationWorkflow": (".test_gen_behavioral", "BehavioralTestGenerationWorkflow"),
|
|
144
|
+
"ParallelTestGenerationWorkflow": (".test_gen_parallel", "ParallelTestGenerationWorkflow"),
|
|
145
|
+
"XMLAgent": (".xml_enhanced_crew", "XMLAgent"),
|
|
146
|
+
"XMLTask": (".xml_enhanced_crew", "XMLTask"),
|
|
147
|
+
"parse_xml_response": (".xml_enhanced_crew", "parse_xml_response"),
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
# Cache for loaded workflow classes
|
|
151
|
+
_loaded_workflow_modules: dict[str, object] = {}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _lazy_import_workflow(name: str) -> object:
|
|
155
|
+
"""Import a workflow class lazily."""
|
|
156
|
+
if name not in _LAZY_WORKFLOW_IMPORTS:
|
|
157
|
+
raise AttributeError(f"module 'attune.workflows' has no attribute '{name}'")
|
|
158
|
+
|
|
159
|
+
module_path, attr_name = _LAZY_WORKFLOW_IMPORTS[name]
|
|
160
|
+
|
|
161
|
+
# Check cache first
|
|
162
|
+
cache_key = f"{module_path}.{attr_name}"
|
|
163
|
+
if cache_key in _loaded_workflow_modules:
|
|
164
|
+
return _loaded_workflow_modules[cache_key]
|
|
165
|
+
|
|
166
|
+
# Import the module and get the attribute
|
|
167
|
+
import importlib
|
|
168
|
+
|
|
169
|
+
module = importlib.import_module(module_path, package="attune.workflows")
|
|
170
|
+
attr = getattr(module, attr_name)
|
|
171
|
+
|
|
172
|
+
# Cache and return
|
|
173
|
+
_loaded_workflow_modules[cache_key] = attr
|
|
174
|
+
return attr
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
# Re-export CLI commands from workflow_commands.py (lazy loaded)
|
|
178
|
+
_parent_dir = os.path.dirname(os.path.dirname(__file__))
|
|
179
|
+
_workflows_module_path = os.path.join(_parent_dir, "workflow_commands.py")
|
|
180
|
+
|
|
181
|
+
# Initialize to None for type checking - loaded lazily via __getattr__
|
|
182
|
+
cmd_morning = None
|
|
183
|
+
cmd_ship = None
|
|
184
|
+
cmd_fix_all = None
|
|
185
|
+
cmd_learn = None
|
|
186
|
+
_cli_loaded = False
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _load_cli_commands() -> None:
|
|
190
|
+
"""Load CLI commands lazily."""
|
|
191
|
+
global cmd_morning, cmd_ship, cmd_fix_all, cmd_learn, _cli_loaded
|
|
192
|
+
if _cli_loaded:
|
|
193
|
+
return
|
|
194
|
+
|
|
195
|
+
if os.path.exists(_workflows_module_path):
|
|
196
|
+
_spec = importlib.util.spec_from_file_location("_workflows_cli", _workflows_module_path)
|
|
197
|
+
if _spec is not None and _spec.loader is not None:
|
|
198
|
+
_workflows_cli = importlib.util.module_from_spec(_spec)
|
|
199
|
+
_spec.loader.exec_module(_workflows_cli)
|
|
200
|
+
|
|
201
|
+
# Re-export CLI commands
|
|
202
|
+
cmd_morning = _workflows_cli.cmd_morning
|
|
203
|
+
cmd_ship = _workflows_cli.cmd_ship
|
|
204
|
+
cmd_fix_all = _workflows_cli.cmd_fix_all
|
|
205
|
+
cmd_learn = _workflows_cli.cmd_learn
|
|
206
|
+
|
|
207
|
+
_cli_loaded = True
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# Default workflow registry - uses CLASS NAMES (strings) for lazy loading
|
|
211
|
+
# Actual classes are loaded on first access via _get_workflow_class()
|
|
212
|
+
_DEFAULT_WORKFLOW_NAMES: dict[str, str] = {
|
|
213
|
+
# Core workflows
|
|
214
|
+
"code-review": "CodeReviewWorkflow",
|
|
215
|
+
# Documentation workflows
|
|
216
|
+
"doc-gen": "DocumentGenerationWorkflow",
|
|
217
|
+
"seo-optimization": "SEOOptimizationWorkflow",
|
|
218
|
+
# Analysis workflows
|
|
219
|
+
"bug-predict": "BugPredictionWorkflow",
|
|
220
|
+
"security-audit": "SecurityAuditWorkflow",
|
|
221
|
+
"perf-audit": "PerformanceAuditWorkflow",
|
|
222
|
+
# Generation workflows
|
|
223
|
+
"test-gen": "TestGenerationWorkflow",
|
|
224
|
+
"test-gen-behavioral": "BehavioralTestGenerationWorkflow",
|
|
225
|
+
"test-gen-parallel": "ParallelTestGenerationWorkflow",
|
|
226
|
+
"refactor-plan": "RefactorPlanWorkflow",
|
|
227
|
+
# Operational workflows
|
|
228
|
+
"dependency-check": "DependencyCheckWorkflow",
|
|
229
|
+
"release-prep-legacy": "ReleasePreparationWorkflow",
|
|
230
|
+
# Composite security pipeline (v3.0)
|
|
231
|
+
"secure-release": "SecureReleasePipeline",
|
|
232
|
+
# Code review crew integration (v3.1)
|
|
233
|
+
"pro-review": "CodeReviewPipeline",
|
|
234
|
+
"pr-review": "PRReviewWorkflow",
|
|
235
|
+
# Documentation management (v3.5)
|
|
236
|
+
"doc-orchestrator": "DocumentationOrchestrator",
|
|
237
|
+
"manage-docs": "DocumentationOrchestrator", # Points to orchestrator (crew deprecated)
|
|
238
|
+
# Keyboard Conductor (v3.6)
|
|
239
|
+
"keyboard-shortcuts": "KeyboardShortcutWorkflow",
|
|
240
|
+
# User-generated workflows
|
|
241
|
+
"document-manager": "DocumentManagerWorkflow",
|
|
242
|
+
"test5": "Test5Workflow",
|
|
243
|
+
# Meta-orchestration workflows (v4.0.0 - CANONICAL)
|
|
244
|
+
"orchestrated-health-check": "OrchestratedHealthCheckWorkflow",
|
|
245
|
+
"orchestrated-release-prep": "OrchestratedReleasePrepWorkflow",
|
|
246
|
+
# Backward compatibility aliases (point to orchestrated versions)
|
|
247
|
+
"release-prep": "OrchestratedReleasePrepWorkflow",
|
|
248
|
+
"orchestrated-health-check-experimental": "OrchestratedHealthCheckWorkflow",
|
|
249
|
+
"orchestrated-release-prep-experimental": "OrchestratedReleasePrepWorkflow",
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
# Opt-in workflows - class names for lazy loading
|
|
253
|
+
_OPT_IN_WORKFLOW_NAMES: dict[str, str] = {}
|
|
254
|
+
|
|
255
|
+
# Workflow registry - populated lazily on first access
|
|
256
|
+
WORKFLOW_REGISTRY: dict[str, type[BaseWorkflow]] = {}
|
|
257
|
+
_registry_initialized = False
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def _get_workflow_class(class_name: str) -> type[BaseWorkflow]:
|
|
261
|
+
"""Get a workflow class by name (lazy loading)."""
|
|
262
|
+
return _lazy_import_workflow(class_name)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _ensure_registry_initialized() -> None:
|
|
266
|
+
"""Initialize workflow registry on first access."""
|
|
267
|
+
global _registry_initialized
|
|
268
|
+
if not _registry_initialized:
|
|
269
|
+
WORKFLOW_REGISTRY.update(discover_workflows())
|
|
270
|
+
_registry_initialized = True
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def discover_workflows(
|
|
274
|
+
include_defaults: bool = True,
|
|
275
|
+
config: "WorkflowConfig | None" = None,
|
|
276
|
+
) -> dict[str, type[BaseWorkflow]]:
|
|
277
|
+
"""Discover workflows via entry points and config.
|
|
278
|
+
|
|
279
|
+
This function loads workflows registered as entry points under the
|
|
280
|
+
'empathy.workflows' group. This allows third-party packages to register
|
|
281
|
+
custom workflows that integrate with the Empathy Framework.
|
|
282
|
+
|
|
283
|
+
Note: Workflows are loaded lazily - classes are only imported when
|
|
284
|
+
the workflow is actually used, reducing initial import time.
|
|
285
|
+
|
|
286
|
+
Args:
|
|
287
|
+
include_defaults: Whether to include default built-in workflows
|
|
288
|
+
config: Optional WorkflowConfig for enabled/disabled workflows
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
Dictionary mapping workflow names to workflow classes
|
|
292
|
+
|
|
293
|
+
Example:
|
|
294
|
+
from attune.workflows import discover_workflows
|
|
295
|
+
workflows = discover_workflows()
|
|
296
|
+
MyWorkflow = workflows.get("code-review")
|
|
297
|
+
|
|
298
|
+
"""
|
|
299
|
+
discovered: dict[str, type[BaseWorkflow]] = {}
|
|
300
|
+
|
|
301
|
+
# Include default workflows if requested (lazy load each)
|
|
302
|
+
if include_defaults:
|
|
303
|
+
for workflow_id, class_name in _DEFAULT_WORKFLOW_NAMES.items():
|
|
304
|
+
try:
|
|
305
|
+
discovered[workflow_id] = _get_workflow_class(class_name)
|
|
306
|
+
except (ImportError, AttributeError):
|
|
307
|
+
# Skip workflows that fail to load
|
|
308
|
+
pass
|
|
309
|
+
|
|
310
|
+
# Add opt-in workflows based on config
|
|
311
|
+
if config is not None:
|
|
312
|
+
# HIPAA mode auto-enables healthcare workflows
|
|
313
|
+
if config.is_hipaa_mode():
|
|
314
|
+
for workflow_id, class_name in _OPT_IN_WORKFLOW_NAMES.items():
|
|
315
|
+
try:
|
|
316
|
+
discovered[workflow_id] = _get_workflow_class(class_name)
|
|
317
|
+
except (ImportError, AttributeError):
|
|
318
|
+
pass
|
|
319
|
+
|
|
320
|
+
# Explicitly enabled workflows
|
|
321
|
+
for workflow_name in config.enabled_workflows:
|
|
322
|
+
if workflow_name in _OPT_IN_WORKFLOW_NAMES:
|
|
323
|
+
try:
|
|
324
|
+
discovered[workflow_name] = _get_workflow_class(
|
|
325
|
+
_OPT_IN_WORKFLOW_NAMES[workflow_name]
|
|
326
|
+
)
|
|
327
|
+
except (ImportError, AttributeError):
|
|
328
|
+
pass
|
|
329
|
+
|
|
330
|
+
# Explicitly disabled workflows
|
|
331
|
+
for workflow_name in config.disabled_workflows:
|
|
332
|
+
discovered.pop(workflow_name, None)
|
|
333
|
+
|
|
334
|
+
# Discover via entry points
|
|
335
|
+
try:
|
|
336
|
+
eps = importlib.metadata.entry_points(group="empathy.workflows")
|
|
337
|
+
for ep in eps:
|
|
338
|
+
try:
|
|
339
|
+
workflow_cls = ep.load()
|
|
340
|
+
if isinstance(workflow_cls, type) and hasattr(workflow_cls, "execute"):
|
|
341
|
+
if config is None or ep.name not in config.disabled_workflows:
|
|
342
|
+
discovered[ep.name] = workflow_cls
|
|
343
|
+
except Exception:
|
|
344
|
+
pass
|
|
345
|
+
except Exception:
|
|
346
|
+
pass
|
|
347
|
+
|
|
348
|
+
return discovered
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def refresh_workflow_registry(config: "WorkflowConfig | None" = None) -> None:
|
|
352
|
+
"""Refresh the global WORKFLOW_REGISTRY by re-discovering all workflows.
|
|
353
|
+
|
|
354
|
+
Call this after installing new packages that register workflows,
|
|
355
|
+
or after changing the WorkflowConfig (e.g., enabling HIPAA mode).
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
config: Optional WorkflowConfig for enabled/disabled workflows
|
|
359
|
+
|
|
360
|
+
"""
|
|
361
|
+
global WORKFLOW_REGISTRY
|
|
362
|
+
WORKFLOW_REGISTRY.clear()
|
|
363
|
+
WORKFLOW_REGISTRY.update(discover_workflows(config=config))
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def get_opt_in_workflows() -> dict[str, type]:
|
|
367
|
+
"""Get the list of opt-in workflows that require explicit enabling.
|
|
368
|
+
|
|
369
|
+
Returns:
|
|
370
|
+
Dictionary of workflow name to class for opt-in workflows
|
|
371
|
+
|
|
372
|
+
"""
|
|
373
|
+
result = {}
|
|
374
|
+
for name, class_name in _OPT_IN_WORKFLOW_NAMES.items():
|
|
375
|
+
try:
|
|
376
|
+
result[name] = _get_workflow_class(class_name)
|
|
377
|
+
except (ImportError, AttributeError):
|
|
378
|
+
pass
|
|
379
|
+
return result
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
# Note: Registry is initialized lazily on first access via _ensure_registry_initialized()
|
|
383
|
+
# Do NOT call discover_workflows() here - it defeats lazy loading
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def get_workflow(name: str) -> type[BaseWorkflow]:
|
|
387
|
+
"""Get a workflow class by name.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
name: Workflow name (e.g., "research", "code-review", "doc-gen")
|
|
391
|
+
|
|
392
|
+
Returns:
|
|
393
|
+
Workflow class
|
|
394
|
+
|
|
395
|
+
Raises:
|
|
396
|
+
KeyError: If workflow not found
|
|
397
|
+
|
|
398
|
+
"""
|
|
399
|
+
_ensure_registry_initialized()
|
|
400
|
+
if name not in WORKFLOW_REGISTRY:
|
|
401
|
+
available = ", ".join(WORKFLOW_REGISTRY.keys())
|
|
402
|
+
raise KeyError(f"Unknown workflow: {name}. Available: {available}")
|
|
403
|
+
return WORKFLOW_REGISTRY[name]
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def list_workflows() -> list[dict]:
|
|
407
|
+
"""List all available workflows with descriptions.
|
|
408
|
+
|
|
409
|
+
Returns:
|
|
410
|
+
List of workflow info dicts
|
|
411
|
+
|
|
412
|
+
"""
|
|
413
|
+
_ensure_registry_initialized()
|
|
414
|
+
workflows = []
|
|
415
|
+
for name, cls in WORKFLOW_REGISTRY.items():
|
|
416
|
+
# Handle both BaseWorkflow subclasses and composite pipelines
|
|
417
|
+
stages = getattr(cls, "stages", [])
|
|
418
|
+
tier_map = getattr(cls, "tier_map", {})
|
|
419
|
+
description = getattr(cls, "description", "No description")
|
|
420
|
+
|
|
421
|
+
workflows.append(
|
|
422
|
+
{
|
|
423
|
+
"name": name,
|
|
424
|
+
"class": cls.__name__,
|
|
425
|
+
"description": description,
|
|
426
|
+
"stages": stages,
|
|
427
|
+
"tier_map": {k: v.value for k, v in tier_map.items()} if tier_map else {},
|
|
428
|
+
},
|
|
429
|
+
)
|
|
430
|
+
return workflows
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def __getattr__(name: str) -> object:
|
|
434
|
+
"""Lazy import handler for workflow classes."""
|
|
435
|
+
if name in _LAZY_WORKFLOW_IMPORTS:
|
|
436
|
+
return _lazy_import_workflow(name)
|
|
437
|
+
|
|
438
|
+
# Handle CLI commands
|
|
439
|
+
if name in ("cmd_morning", "cmd_ship", "cmd_fix_all", "cmd_learn"):
|
|
440
|
+
_load_cli_commands()
|
|
441
|
+
return globals().get(name)
|
|
442
|
+
|
|
443
|
+
raise AttributeError(f"module 'attune.workflows' has no attribute '{name}'")
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
__all__ = [
|
|
447
|
+
"DEFAULT_MODELS",
|
|
448
|
+
"PROVIDER_MODELS",
|
|
449
|
+
# Registry and discovery
|
|
450
|
+
"WORKFLOW_REGISTRY",
|
|
451
|
+
# Base classes
|
|
452
|
+
"BaseWorkflow",
|
|
453
|
+
# Routing strategies
|
|
454
|
+
"TierRoutingStrategy",
|
|
455
|
+
"RoutingContext",
|
|
456
|
+
"CostOptimizedRouting",
|
|
457
|
+
"PerformanceOptimizedRouting",
|
|
458
|
+
"BalancedRouting",
|
|
459
|
+
# Builder pattern
|
|
460
|
+
"WorkflowBuilder",
|
|
461
|
+
"workflow_builder",
|
|
462
|
+
# New high-value workflows
|
|
463
|
+
"BugPredictionWorkflow",
|
|
464
|
+
# Code review crew integration (v3.1)
|
|
465
|
+
"CodeReviewPipeline",
|
|
466
|
+
"CodeReviewPipelineResult",
|
|
467
|
+
"CodeReviewWorkflow",
|
|
468
|
+
"CostReport",
|
|
469
|
+
"DependencyCheckWorkflow",
|
|
470
|
+
"DocumentGenerationWorkflow",
|
|
471
|
+
"DocumentManagerWorkflow",
|
|
472
|
+
# Documentation management (v3.5)
|
|
473
|
+
"DocumentationOrchestrator",
|
|
474
|
+
# Health check crew integration (v3.1)
|
|
475
|
+
# Removed deprecated: "HealthCheckWorkflow" (use OrchestratedHealthCheckWorkflow)
|
|
476
|
+
"HealthCheckReport",
|
|
477
|
+
# Keyboard Conductor (v3.6)
|
|
478
|
+
"KeyboardShortcutWorkflow",
|
|
479
|
+
"ManageDocumentationCrew",
|
|
480
|
+
"ManageDocumentationCrewResult",
|
|
481
|
+
"ModelConfig",
|
|
482
|
+
"ModelProvider",
|
|
483
|
+
"ModelTier",
|
|
484
|
+
"OrchestratorResult",
|
|
485
|
+
"PRReviewResult",
|
|
486
|
+
"PRReviewWorkflow",
|
|
487
|
+
"PerformanceAuditWorkflow",
|
|
488
|
+
"RefactorPlanWorkflow",
|
|
489
|
+
"ReleasePreparationWorkflow",
|
|
490
|
+
# Workflow implementations
|
|
491
|
+
"ResearchSynthesisWorkflow",
|
|
492
|
+
# Security crew integration (v3.0)
|
|
493
|
+
"SecureReleasePipeline",
|
|
494
|
+
"SecureReleaseResult",
|
|
495
|
+
"SecurityAuditWorkflow",
|
|
496
|
+
"SEOOptimizationWorkflow",
|
|
497
|
+
"TestGenerationWorkflow",
|
|
498
|
+
"BehavioralTestGenerationWorkflow",
|
|
499
|
+
"ParallelTestGenerationWorkflow",
|
|
500
|
+
# Configuration
|
|
501
|
+
"WorkflowConfig",
|
|
502
|
+
"WorkflowResult",
|
|
503
|
+
"WorkflowStage",
|
|
504
|
+
# Step configuration (new)
|
|
505
|
+
"WorkflowStepConfig",
|
|
506
|
+
"cmd_fix_all",
|
|
507
|
+
"cmd_learn",
|
|
508
|
+
# CLI commands (re-exported from workflow_commands.py)
|
|
509
|
+
"cmd_morning",
|
|
510
|
+
"cmd_ship",
|
|
511
|
+
"create_example_config",
|
|
512
|
+
"discover_workflows",
|
|
513
|
+
"get_model",
|
|
514
|
+
"get_workflow",
|
|
515
|
+
# Stats for dashboard
|
|
516
|
+
"get_workflow_stats",
|
|
517
|
+
"list_workflows",
|
|
518
|
+
"refresh_workflow_registry",
|
|
519
|
+
"steps_from_tier_map",
|
|
520
|
+
"validate_step_config",
|
|
521
|
+
# CrewAI-based multi-agent workflows (v4.0.0)
|
|
522
|
+
# Removed deprecated: "HealthCheckCrew" (use OrchestratedHealthCheckWorkflow)
|
|
523
|
+
# Removed deprecated: "HealthCheckCrewResult"
|
|
524
|
+
"ReleasePreparationCrew",
|
|
525
|
+
"ReleasePreparationCrewResult",
|
|
526
|
+
"TestCoverageBoostCrew",
|
|
527
|
+
"TestCoverageBoostCrewResult",
|
|
528
|
+
# Removed deprecated: "TestCoverageBoostWorkflow" (use TestCoverageBoostCrew)
|
|
529
|
+
# Removed deprecated: "CoverageBoostResult"
|
|
530
|
+
# Experimental: Meta-orchestration
|
|
531
|
+
"OrchestratedHealthCheckWorkflow",
|
|
532
|
+
"OrchestratedReleasePrepWorkflow",
|
|
533
|
+
"HealthCheckReport",
|
|
534
|
+
"ReleaseReadinessReport",
|
|
535
|
+
# XML-enhanced prompting
|
|
536
|
+
"XMLAgent",
|
|
537
|
+
"XMLTask",
|
|
538
|
+
"parse_xml_response",
|
|
539
|
+
]
|