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,33 @@
|
|
|
1
|
+
"""Workflow Pattern Library.
|
|
2
|
+
|
|
3
|
+
Extracted patterns from 17 existing workflows for rapid workflow generation.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .behavior import CodeScannerPattern, ConditionalTierPattern, ConfigDrivenPattern
|
|
10
|
+
from .core import PatternCategory, WorkflowComplexity, WorkflowPattern
|
|
11
|
+
from .output import ResultDataclassPattern
|
|
12
|
+
from .registry import WorkflowPatternRegistry, get_workflow_pattern_registry
|
|
13
|
+
from .structural import CrewBasedPattern, MultiStagePattern, SingleStagePattern
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
# Core
|
|
17
|
+
"WorkflowPattern",
|
|
18
|
+
"PatternCategory",
|
|
19
|
+
"WorkflowComplexity",
|
|
20
|
+
# Structural
|
|
21
|
+
"SingleStagePattern",
|
|
22
|
+
"MultiStagePattern",
|
|
23
|
+
"CrewBasedPattern",
|
|
24
|
+
# Behavioral
|
|
25
|
+
"ConditionalTierPattern",
|
|
26
|
+
"ConfigDrivenPattern",
|
|
27
|
+
"CodeScannerPattern",
|
|
28
|
+
# Output
|
|
29
|
+
"ResultDataclassPattern",
|
|
30
|
+
# Registry
|
|
31
|
+
"WorkflowPatternRegistry",
|
|
32
|
+
"get_workflow_pattern_registry",
|
|
33
|
+
]
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"""Behavioral workflow patterns.
|
|
2
|
+
|
|
3
|
+
Patterns for conditional execution and dynamic behavior.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ConditionalTierPattern(WorkflowPattern):
|
|
15
|
+
"""Dynamic tier routing based on complexity or conditions.
|
|
16
|
+
|
|
17
|
+
Use for: Cost optimization by downgrading/skipping expensive stages.
|
|
18
|
+
Examples: bug-predict (skip premium if low risk), code-review (conditional architect review).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
id: str = "conditional-tier"
|
|
22
|
+
name: str = "Conditional Tier Routing"
|
|
23
|
+
category: PatternCategory = PatternCategory.BEHAVIOR
|
|
24
|
+
description: str = "Dynamically adjust model tiers based on conditions"
|
|
25
|
+
complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
|
|
26
|
+
use_cases: list[str] = [
|
|
27
|
+
"Cost optimization",
|
|
28
|
+
"Conditional premium tier usage",
|
|
29
|
+
"Complexity-based routing",
|
|
30
|
+
]
|
|
31
|
+
examples: list[str] = ["bug-predict", "code-review", "pr-review"]
|
|
32
|
+
requires: list[str] = ["multi-stage"]
|
|
33
|
+
risk_weight: float = 3.0
|
|
34
|
+
|
|
35
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
36
|
+
"""Generate code for conditional tier routing."""
|
|
37
|
+
threshold_param = context.get("threshold_param", "complexity_threshold")
|
|
38
|
+
threshold_default = context.get("threshold_default", "0.7")
|
|
39
|
+
metric_name = context.get("metric_name", "complexity_score")
|
|
40
|
+
|
|
41
|
+
return [
|
|
42
|
+
CodeSection(
|
|
43
|
+
location="init_method",
|
|
44
|
+
code=f""" self.{threshold_param} = {threshold_param} if {threshold_param} is not None else {threshold_default}
|
|
45
|
+
self._{metric_name}: float = 0.0""",
|
|
46
|
+
priority=1,
|
|
47
|
+
),
|
|
48
|
+
CodeSection(
|
|
49
|
+
location="methods",
|
|
50
|
+
code=f''' def should_skip_stage(self, stage_name: str, input_data: Any) -> tuple[bool, str | None]:
|
|
51
|
+
"""Conditionally downgrade or skip stages based on {metric_name}.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
stage_name: Name of the stage to check
|
|
55
|
+
input_data: Current workflow data
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
Tuple of (should_skip, reason)
|
|
59
|
+
|
|
60
|
+
"""
|
|
61
|
+
# Example: Downgrade premium stage if metric below threshold
|
|
62
|
+
if stage_name == "recommend" or stage_name == "architect_review":
|
|
63
|
+
if self._{metric_name} < self.{threshold_param}:
|
|
64
|
+
# Downgrade to CAPABLE instead of skipping
|
|
65
|
+
self.tier_map[stage_name] = ModelTier.CAPABLE
|
|
66
|
+
logger.info(f"Downgraded {{stage_name}} to CAPABLE ({metric_name}: {{self._{metric_name}:.2f}})")
|
|
67
|
+
return False, None
|
|
68
|
+
return False, None''',
|
|
69
|
+
priority=2,
|
|
70
|
+
),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ConfigDrivenPattern(WorkflowPattern):
|
|
75
|
+
"""Load configuration from attune.config.yml.
|
|
76
|
+
|
|
77
|
+
Use for: Configurable thresholds, options, and behavior.
|
|
78
|
+
Examples: bug-predict (risk threshold), health-check (check toggles).
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
id: str = "config-driven"
|
|
82
|
+
name: str = "Configuration-Driven Workflow"
|
|
83
|
+
category: PatternCategory = PatternCategory.BEHAVIOR
|
|
84
|
+
description: str = "Loads settings from attune.config.yml"
|
|
85
|
+
complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
|
|
86
|
+
use_cases: list[str] = [
|
|
87
|
+
"Configurable thresholds",
|
|
88
|
+
"User-customizable behavior",
|
|
89
|
+
"Environment-specific settings",
|
|
90
|
+
]
|
|
91
|
+
examples: list[str] = ["bug-predict", "health-check", "security-audit"]
|
|
92
|
+
risk_weight: float = 1.5
|
|
93
|
+
|
|
94
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
95
|
+
"""Generate code for configuration loading."""
|
|
96
|
+
workflow_name = context.get("workflow_name", "my-workflow")
|
|
97
|
+
config_key = workflow_name.replace("-", "_")
|
|
98
|
+
config_params = context.get(
|
|
99
|
+
"config_params",
|
|
100
|
+
{
|
|
101
|
+
"threshold": 0.7,
|
|
102
|
+
"enabled": True,
|
|
103
|
+
},
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Generate defaults dict
|
|
107
|
+
defaults_code = " defaults = {\n"
|
|
108
|
+
for key, value in config_params.items():
|
|
109
|
+
if isinstance(value, str):
|
|
110
|
+
defaults_code += f' "{key}": "{value}",\n'
|
|
111
|
+
else:
|
|
112
|
+
defaults_code += f' "{key}": {value},\n'
|
|
113
|
+
defaults_code += " }"
|
|
114
|
+
|
|
115
|
+
# Generate config loading
|
|
116
|
+
return [
|
|
117
|
+
CodeSection(
|
|
118
|
+
location="imports",
|
|
119
|
+
code="import yaml\nfrom pathlib import Path",
|
|
120
|
+
priority=1,
|
|
121
|
+
),
|
|
122
|
+
CodeSection(
|
|
123
|
+
location="helper_functions",
|
|
124
|
+
code=f'''def _load_{config_key}_config() -> dict:
|
|
125
|
+
"""Load {config_key} configuration from attune.config.yml.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
Dict with {config_key} settings, or defaults if not found.
|
|
129
|
+
|
|
130
|
+
"""
|
|
131
|
+
{defaults_code}
|
|
132
|
+
|
|
133
|
+
config_paths = [
|
|
134
|
+
Path("attune.config.yml"),
|
|
135
|
+
Path("attune.config.yaml"),
|
|
136
|
+
Path(".empathy.yml"),
|
|
137
|
+
Path(".empathy.yaml"),
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
for config_path in config_paths:
|
|
141
|
+
if config_path.exists():
|
|
142
|
+
try:
|
|
143
|
+
with open(config_path) as f:
|
|
144
|
+
config = yaml.safe_load(f)
|
|
145
|
+
if config and "{config_key}" in config:
|
|
146
|
+
return {{**defaults, **config["{config_key}"]}}
|
|
147
|
+
except (yaml.YAMLError, OSError):
|
|
148
|
+
pass
|
|
149
|
+
|
|
150
|
+
return defaults''',
|
|
151
|
+
priority=1,
|
|
152
|
+
),
|
|
153
|
+
CodeSection(
|
|
154
|
+
location="init_method",
|
|
155
|
+
code=f""" # Load configuration
|
|
156
|
+
self._config = _load_{config_key}_config()""",
|
|
157
|
+
priority=1,
|
|
158
|
+
),
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class CodeScannerPattern(WorkflowPattern):
|
|
163
|
+
"""File scanning and analysis capabilities.
|
|
164
|
+
|
|
165
|
+
Use for: Code analysis workflows that scan files.
|
|
166
|
+
Examples: bug-predict, security-audit, test-gen.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
id: str = "code-scanner"
|
|
170
|
+
name: str = "Code Scanner"
|
|
171
|
+
category: PatternCategory = PatternCategory.BEHAVIOR
|
|
172
|
+
description: str = "Scan and analyze code files with pattern matching"
|
|
173
|
+
complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
|
|
174
|
+
use_cases: list[str] = [
|
|
175
|
+
"Bug detection",
|
|
176
|
+
"Security scanning",
|
|
177
|
+
"Code analysis",
|
|
178
|
+
]
|
|
179
|
+
examples: list[str] = ["bug-predict", "security-audit"]
|
|
180
|
+
risk_weight: float = 2.0
|
|
181
|
+
|
|
182
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
183
|
+
"""Generate code for file scanning."""
|
|
184
|
+
scan_pattern = context.get("scan_pattern", "*.py")
|
|
185
|
+
|
|
186
|
+
return [
|
|
187
|
+
CodeSection(
|
|
188
|
+
location="imports",
|
|
189
|
+
code="import fnmatch\nfrom pathlib import Path",
|
|
190
|
+
priority=1,
|
|
191
|
+
),
|
|
192
|
+
CodeSection(
|
|
193
|
+
location="helper_functions",
|
|
194
|
+
code=f'''def _should_exclude_file(file_path: str, exclude_patterns: list[str]) -> bool:
|
|
195
|
+
"""Check if a file should be excluded based on glob patterns.
|
|
196
|
+
|
|
197
|
+
Args:
|
|
198
|
+
file_path: Path to the file
|
|
199
|
+
exclude_patterns: List of glob patterns (e.g., "**/test_*.py")
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
True if the file matches any exclusion pattern.
|
|
203
|
+
|
|
204
|
+
"""
|
|
205
|
+
for pattern in exclude_patterns:
|
|
206
|
+
if "**" in pattern:
|
|
207
|
+
parts = pattern.split("**")
|
|
208
|
+
if len(parts) == 2:
|
|
209
|
+
prefix, suffix = parts
|
|
210
|
+
if prefix and not file_path.startswith(prefix.rstrip("/")):
|
|
211
|
+
continue
|
|
212
|
+
if suffix and fnmatch.fnmatch(file_path, f"*{{suffix}}"):
|
|
213
|
+
return True
|
|
214
|
+
elif fnmatch.fnmatch(file_path, pattern) or fnmatch.fnmatch(
|
|
215
|
+
Path(file_path).name,
|
|
216
|
+
pattern,
|
|
217
|
+
):
|
|
218
|
+
return True
|
|
219
|
+
return False
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _scan_files(
|
|
223
|
+
root_dir: str = ".",
|
|
224
|
+
pattern: str = "{scan_pattern}",
|
|
225
|
+
exclude: list[str] | None = None,
|
|
226
|
+
) -> list[Path]:
|
|
227
|
+
"""Scan directory for files matching pattern.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
root_dir: Root directory to scan
|
|
231
|
+
pattern: Glob pattern for files
|
|
232
|
+
exclude: Exclusion patterns
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
List of matching file paths
|
|
236
|
+
|
|
237
|
+
"""
|
|
238
|
+
exclude = exclude or []
|
|
239
|
+
root = Path(root_dir)
|
|
240
|
+
files = []
|
|
241
|
+
|
|
242
|
+
for file_path in root.rglob(pattern):
|
|
243
|
+
if file_path.is_file() and not _should_exclude_file(str(file_path), exclude):
|
|
244
|
+
files.append(file_path)
|
|
245
|
+
|
|
246
|
+
return files''',
|
|
247
|
+
priority=1,
|
|
248
|
+
),
|
|
249
|
+
]
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Core workflow pattern definitions.
|
|
2
|
+
|
|
3
|
+
Defines Pydantic models for workflow patterns extracted from existing workflows.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from enum import Enum
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class PatternCategory(Enum):
|
|
17
|
+
"""Categories for workflow patterns."""
|
|
18
|
+
|
|
19
|
+
STRUCTURAL = "structural" # How workflow is organized
|
|
20
|
+
TIER = "tier" # Tier routing strategies
|
|
21
|
+
INTEGRATION = "integration" # External integrations
|
|
22
|
+
OUTPUT = "output" # Output formatting
|
|
23
|
+
BEHAVIOR = "behavior" # Behavioral patterns
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class WorkflowComplexity(Enum):
|
|
27
|
+
"""Workflow complexity levels."""
|
|
28
|
+
|
|
29
|
+
SIMPLE = "simple" # Single stage, no conditions
|
|
30
|
+
MODERATE = "moderate" # Multiple stages, some conditions
|
|
31
|
+
COMPLEX = "complex" # Multiple stages, conditional routing, crews
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class CodeSection:
|
|
36
|
+
"""A section of code to be generated."""
|
|
37
|
+
|
|
38
|
+
location: str # Where in the file (e.g., "imports", "class_body", "methods")
|
|
39
|
+
code: str # The code content
|
|
40
|
+
priority: int = 0 # Higher priority sections are placed first
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class WorkflowPattern(BaseModel):
|
|
44
|
+
"""Base model for workflow patterns."""
|
|
45
|
+
|
|
46
|
+
id: str = Field(..., description="Unique pattern identifier")
|
|
47
|
+
name: str = Field(..., description="Human-readable pattern name")
|
|
48
|
+
category: PatternCategory = Field(..., description="Pattern category")
|
|
49
|
+
description: str = Field(..., description="Pattern description")
|
|
50
|
+
complexity: WorkflowComplexity = Field(..., description="Pattern complexity")
|
|
51
|
+
use_cases: list[str] = Field(default_factory=list, description="When to use this pattern")
|
|
52
|
+
examples: list[str] = Field(
|
|
53
|
+
default_factory=list, description="Example workflows using this pattern"
|
|
54
|
+
)
|
|
55
|
+
conflicts_with: list[str] = Field(default_factory=list, description="Incompatible pattern IDs")
|
|
56
|
+
requires: list[str] = Field(default_factory=list, description="Required pattern IDs")
|
|
57
|
+
risk_weight: float = Field(
|
|
58
|
+
default=1.0, ge=0.0, le=5.0, description="Risk factor for testing (1=low, 5=high)"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
62
|
+
"""Generate code sections for this pattern.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
context: Context dictionary with workflow metadata
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
List of CodeSection objects to be merged
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
raise NotImplementedError("Subclasses must implement generate_code_sections")
|
|
72
|
+
|
|
73
|
+
class Config:
|
|
74
|
+
"""Pydantic config."""
|
|
75
|
+
|
|
76
|
+
use_enum_values = True
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Output formatting patterns.
|
|
2
|
+
|
|
3
|
+
Patterns for structured workflow results.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ResultDataclassPattern(WorkflowPattern):
|
|
15
|
+
"""Structured output with dataclass.
|
|
16
|
+
|
|
17
|
+
Use for: Type-safe, structured workflow results.
|
|
18
|
+
Examples: health-check, release-prep.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
id: str = "result-dataclass"
|
|
22
|
+
name: str = "Result Dataclass"
|
|
23
|
+
category: PatternCategory = PatternCategory.OUTPUT
|
|
24
|
+
description: str = "Structured output format with dataclass"
|
|
25
|
+
complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
|
|
26
|
+
use_cases: list[str] = [
|
|
27
|
+
"Type-safe results",
|
|
28
|
+
"Structured output",
|
|
29
|
+
"API integration",
|
|
30
|
+
]
|
|
31
|
+
examples: list[str] = ["health-check", "release-prep"]
|
|
32
|
+
risk_weight: float = 1.0
|
|
33
|
+
|
|
34
|
+
def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
|
|
35
|
+
"""Generate code for result dataclass."""
|
|
36
|
+
context.get("workflow_name", "my-workflow")
|
|
37
|
+
class_name = context.get("class_name", "MyWorkflow")
|
|
38
|
+
result_class_name = f"{class_name}Result"
|
|
39
|
+
|
|
40
|
+
# Get custom fields from context
|
|
41
|
+
custom_fields = context.get("result_fields", [])
|
|
42
|
+
|
|
43
|
+
# Generate custom fields code
|
|
44
|
+
custom_fields_code = ""
|
|
45
|
+
if custom_fields:
|
|
46
|
+
for field in custom_fields:
|
|
47
|
+
field_name = field.get("name", "custom_field")
|
|
48
|
+
field_type = field.get("type", "Any")
|
|
49
|
+
field_desc = field.get("description", "Custom field")
|
|
50
|
+
custom_fields_code += f" {field_name}: {field_type} # {field_desc}\n"
|
|
51
|
+
|
|
52
|
+
return [
|
|
53
|
+
CodeSection(
|
|
54
|
+
location="imports",
|
|
55
|
+
code="from dataclasses import dataclass, field",
|
|
56
|
+
priority=1,
|
|
57
|
+
),
|
|
58
|
+
CodeSection(
|
|
59
|
+
location="dataclasses",
|
|
60
|
+
code=f'''@dataclass
|
|
61
|
+
class {result_class_name}:
|
|
62
|
+
"""Result from {class_name} execution."""
|
|
63
|
+
|
|
64
|
+
success: bool
|
|
65
|
+
{custom_fields_code if custom_fields_code else " # Add custom fields here"}duration_seconds: float
|
|
66
|
+
cost: float
|
|
67
|
+
metadata: dict = field(default_factory=dict)''',
|
|
68
|
+
priority=1,
|
|
69
|
+
),
|
|
70
|
+
CodeSection(
|
|
71
|
+
location="methods",
|
|
72
|
+
code=f''' def _create_result(
|
|
73
|
+
self,
|
|
74
|
+
success: bool,
|
|
75
|
+
duration: float,
|
|
76
|
+
cost: float,
|
|
77
|
+
**kwargs: Any,
|
|
78
|
+
) -> {result_class_name}:
|
|
79
|
+
"""Create structured result.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
success: Whether workflow succeeded
|
|
83
|
+
duration: Execution duration in seconds
|
|
84
|
+
cost: Total cost in USD
|
|
85
|
+
**kwargs: Additional result fields
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
{result_class_name} instance
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
return {result_class_name}(
|
|
92
|
+
success=success,
|
|
93
|
+
duration_seconds=duration,
|
|
94
|
+
cost=cost,
|
|
95
|
+
**kwargs,
|
|
96
|
+
)''',
|
|
97
|
+
priority=2,
|
|
98
|
+
),
|
|
99
|
+
]
|