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,51 @@
|
|
|
1
|
+
"""Commands Module for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Provides command loading, parsing, and execution with integration
|
|
4
|
+
to hooks, context management, and learning modules.
|
|
5
|
+
|
|
6
|
+
Architectural patterns inspired by everything-claude-code by Affaan Mustafa.
|
|
7
|
+
See: https://github.com/affaan-m/everything-claude-code (MIT License)
|
|
8
|
+
See: ACKNOWLEDGMENTS.md for full attribution.
|
|
9
|
+
|
|
10
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
11
|
+
Licensed under Fair Source 0.9
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from attune_llm.commands.context import (
|
|
15
|
+
CommandContext,
|
|
16
|
+
CommandExecutor,
|
|
17
|
+
create_command_context,
|
|
18
|
+
)
|
|
19
|
+
from attune_llm.commands.loader import (
|
|
20
|
+
CommandLoader,
|
|
21
|
+
get_default_commands_directory,
|
|
22
|
+
load_commands_from_paths,
|
|
23
|
+
)
|
|
24
|
+
from attune_llm.commands.models import (
|
|
25
|
+
CommandCategory,
|
|
26
|
+
CommandConfig,
|
|
27
|
+
CommandMetadata,
|
|
28
|
+
CommandResult,
|
|
29
|
+
)
|
|
30
|
+
from attune_llm.commands.parser import CommandParser
|
|
31
|
+
from attune_llm.commands.registry import CommandRegistry
|
|
32
|
+
|
|
33
|
+
__all__ = [
|
|
34
|
+
# Models
|
|
35
|
+
"CommandCategory",
|
|
36
|
+
"CommandConfig",
|
|
37
|
+
"CommandContext",
|
|
38
|
+
"CommandMetadata",
|
|
39
|
+
"CommandResult",
|
|
40
|
+
# Parser
|
|
41
|
+
"CommandParser",
|
|
42
|
+
# Loader
|
|
43
|
+
"CommandLoader",
|
|
44
|
+
"get_default_commands_directory",
|
|
45
|
+
"load_commands_from_paths",
|
|
46
|
+
# Registry
|
|
47
|
+
"CommandRegistry",
|
|
48
|
+
# Context & Executor
|
|
49
|
+
"CommandExecutor",
|
|
50
|
+
"create_command_context",
|
|
51
|
+
]
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
"""Command Context
|
|
2
|
+
|
|
3
|
+
Provides execution context for commands with access to hooks, context management,
|
|
4
|
+
and learning modules.
|
|
5
|
+
|
|
6
|
+
Architectural patterns inspired by everything-claude-code by Affaan Mustafa.
|
|
7
|
+
See: https://github.com/affaan-m/everything-claude-code (MIT License)
|
|
8
|
+
See: ACKNOWLEDGMENTS.md for full attribution.
|
|
9
|
+
|
|
10
|
+
Copyright 2025 Smart AI Memory, LLC
|
|
11
|
+
Licensed under Fair Source 0.9
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import time
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import TYPE_CHECKING, Any
|
|
21
|
+
|
|
22
|
+
from attune_llm.commands.models import CommandConfig, CommandResult
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from attune_llm.context.manager import ContextManager
|
|
26
|
+
from attune_llm.hooks.config import HookEvent
|
|
27
|
+
from attune_llm.hooks.registry import HookRegistry
|
|
28
|
+
from attune_llm.learning.storage import LearnedSkillsStorage
|
|
29
|
+
from attune_llm.state import CollaborationState
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class CommandContext:
|
|
36
|
+
"""Execution context for commands.
|
|
37
|
+
|
|
38
|
+
Provides access to framework components that commands may need:
|
|
39
|
+
- Hook registry for firing events
|
|
40
|
+
- Context manager for state preservation
|
|
41
|
+
- Learning storage for pattern access
|
|
42
|
+
- Collaboration state for user context
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
# Create context with all components
|
|
46
|
+
ctx = CommandContext(
|
|
47
|
+
user_id="user123",
|
|
48
|
+
hook_registry=hooks,
|
|
49
|
+
context_manager=context_mgr,
|
|
50
|
+
learning_storage=storage,
|
|
51
|
+
collaboration_state=state,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Commands can access components
|
|
55
|
+
patterns = ctx.get_patterns_for_context()
|
|
56
|
+
ctx.fire_hook("PreCommand", {"command": "compact"})
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
user_id: str
|
|
60
|
+
hook_registry: HookRegistry | None = None
|
|
61
|
+
context_manager: ContextManager | None = None
|
|
62
|
+
learning_storage: LearnedSkillsStorage | None = None
|
|
63
|
+
collaboration_state: CollaborationState | None = None
|
|
64
|
+
project_root: Path | None = None
|
|
65
|
+
extra: dict[str, Any] = field(default_factory=dict)
|
|
66
|
+
|
|
67
|
+
def fire_hook(
|
|
68
|
+
self,
|
|
69
|
+
event: str | HookEvent,
|
|
70
|
+
context: dict[str, Any] | None = None,
|
|
71
|
+
) -> list[dict[str, Any]]:
|
|
72
|
+
"""Fire a hook event.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
event: Event type (string or HookEvent enum)
|
|
76
|
+
context: Additional context for the hook
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
List of hook execution results
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
if self.hook_registry is None:
|
|
83
|
+
logger.debug("No hook registry available, skipping hook")
|
|
84
|
+
return []
|
|
85
|
+
|
|
86
|
+
from attune_llm.hooks.config import HookEvent
|
|
87
|
+
|
|
88
|
+
# Convert string to enum if needed
|
|
89
|
+
if isinstance(event, str):
|
|
90
|
+
try:
|
|
91
|
+
event = HookEvent(event)
|
|
92
|
+
except ValueError:
|
|
93
|
+
logger.warning("Unknown hook event: %s", event)
|
|
94
|
+
return []
|
|
95
|
+
|
|
96
|
+
hook_context = context or {}
|
|
97
|
+
hook_context["user_id"] = self.user_id
|
|
98
|
+
|
|
99
|
+
return self.hook_registry.fire_sync(event, hook_context)
|
|
100
|
+
|
|
101
|
+
def save_context_state(self) -> Path | None:
|
|
102
|
+
"""Save current collaboration state for compaction.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Path to saved state file or None
|
|
106
|
+
|
|
107
|
+
"""
|
|
108
|
+
if self.context_manager is None:
|
|
109
|
+
logger.debug("No context manager available")
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
if self.collaboration_state is None:
|
|
113
|
+
logger.debug("No collaboration state available")
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
return self.context_manager.save_for_compaction(self.collaboration_state)
|
|
117
|
+
|
|
118
|
+
def restore_context_state(self) -> bool:
|
|
119
|
+
"""Restore context state for user.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
True if state was restored
|
|
123
|
+
|
|
124
|
+
"""
|
|
125
|
+
if self.context_manager is None:
|
|
126
|
+
logger.debug("No context manager available")
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
state = self.context_manager.restore_state(self.user_id)
|
|
130
|
+
return state is not None
|
|
131
|
+
|
|
132
|
+
def get_patterns_for_context(
|
|
133
|
+
self,
|
|
134
|
+
max_patterns: int = 5,
|
|
135
|
+
) -> str:
|
|
136
|
+
"""Get learned patterns formatted for context injection.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
max_patterns: Maximum patterns to include
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
Formatted markdown string
|
|
143
|
+
|
|
144
|
+
"""
|
|
145
|
+
if self.learning_storage is None:
|
|
146
|
+
return ""
|
|
147
|
+
|
|
148
|
+
return self.learning_storage.format_patterns_for_context(
|
|
149
|
+
self.user_id,
|
|
150
|
+
max_patterns=max_patterns,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def search_patterns(self, query: str) -> list[Any]:
|
|
154
|
+
"""Search learned patterns.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
query: Search query
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
List of matching patterns
|
|
161
|
+
|
|
162
|
+
"""
|
|
163
|
+
if self.learning_storage is None:
|
|
164
|
+
return []
|
|
165
|
+
|
|
166
|
+
return self.learning_storage.search_patterns(self.user_id, query)
|
|
167
|
+
|
|
168
|
+
def get_learning_summary(self) -> dict[str, Any]:
|
|
169
|
+
"""Get learning summary for user.
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Summary dictionary
|
|
173
|
+
|
|
174
|
+
"""
|
|
175
|
+
if self.learning_storage is None:
|
|
176
|
+
return {}
|
|
177
|
+
|
|
178
|
+
return self.learning_storage.get_summary(self.user_id)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class CommandExecutor:
|
|
182
|
+
"""Executes commands with proper hook integration.
|
|
183
|
+
|
|
184
|
+
Handles the lifecycle of command execution:
|
|
185
|
+
1. Fire PreCommand hook
|
|
186
|
+
2. Execute command logic
|
|
187
|
+
3. Fire PostCommand hook
|
|
188
|
+
4. Return result
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
executor = CommandExecutor(context)
|
|
192
|
+
|
|
193
|
+
# Execute a command
|
|
194
|
+
result = await executor.execute(compact_command)
|
|
195
|
+
|
|
196
|
+
# Check result
|
|
197
|
+
if result.success:
|
|
198
|
+
print(f"Output: {result.output}")
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
def __init__(self, context: CommandContext):
|
|
202
|
+
"""Initialize the executor.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
context: Command execution context
|
|
206
|
+
|
|
207
|
+
"""
|
|
208
|
+
self.context = context
|
|
209
|
+
|
|
210
|
+
def execute(
|
|
211
|
+
self,
|
|
212
|
+
command: CommandConfig,
|
|
213
|
+
args: dict[str, Any] | None = None,
|
|
214
|
+
) -> CommandResult:
|
|
215
|
+
"""Execute a command.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
command: Command configuration to execute
|
|
219
|
+
args: Additional arguments
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
CommandResult with execution details
|
|
223
|
+
|
|
224
|
+
"""
|
|
225
|
+
args = args or {}
|
|
226
|
+
start_time = time.time()
|
|
227
|
+
hooks_fired: list[str] = []
|
|
228
|
+
patterns_applied: list[str] = []
|
|
229
|
+
|
|
230
|
+
# Fire pre-command hook if configured
|
|
231
|
+
pre_hook = command.hooks.get("pre")
|
|
232
|
+
if pre_hook:
|
|
233
|
+
try:
|
|
234
|
+
self.context.fire_hook(
|
|
235
|
+
pre_hook,
|
|
236
|
+
{
|
|
237
|
+
"command": command.name,
|
|
238
|
+
"args": args,
|
|
239
|
+
},
|
|
240
|
+
)
|
|
241
|
+
hooks_fired.append(f"pre:{pre_hook}")
|
|
242
|
+
logger.debug("Pre-command hook fired: %s", pre_hook)
|
|
243
|
+
except Exception as e:
|
|
244
|
+
logger.error("Pre-command hook failed: %s", e)
|
|
245
|
+
|
|
246
|
+
# Get relevant patterns
|
|
247
|
+
if self.context.learning_storage:
|
|
248
|
+
patterns = self.context.search_patterns(command.name)
|
|
249
|
+
patterns_applied = [p.pattern_id for p in patterns[:3]]
|
|
250
|
+
|
|
251
|
+
# The actual command execution happens in Claude
|
|
252
|
+
# This executor prepares the context and returns the command body
|
|
253
|
+
output = command.body
|
|
254
|
+
|
|
255
|
+
# Fire post-command hook if configured
|
|
256
|
+
post_hook = command.hooks.get("post")
|
|
257
|
+
if post_hook:
|
|
258
|
+
try:
|
|
259
|
+
self.context.fire_hook(
|
|
260
|
+
post_hook,
|
|
261
|
+
{
|
|
262
|
+
"command": command.name,
|
|
263
|
+
"args": args,
|
|
264
|
+
"success": True,
|
|
265
|
+
},
|
|
266
|
+
)
|
|
267
|
+
hooks_fired.append(f"post:{post_hook}")
|
|
268
|
+
logger.debug("Post-command hook fired: %s", post_hook)
|
|
269
|
+
except Exception as e:
|
|
270
|
+
logger.error("Post-command hook failed: %s", e)
|
|
271
|
+
|
|
272
|
+
duration_ms = (time.time() - start_time) * 1000
|
|
273
|
+
|
|
274
|
+
return CommandResult(
|
|
275
|
+
command_name=command.name,
|
|
276
|
+
success=True,
|
|
277
|
+
output=output,
|
|
278
|
+
duration_ms=duration_ms,
|
|
279
|
+
hooks_fired=hooks_fired,
|
|
280
|
+
patterns_applied=patterns_applied,
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
def prepare_command(
|
|
284
|
+
self,
|
|
285
|
+
command: CommandConfig,
|
|
286
|
+
args: dict[str, Any] | None = None,
|
|
287
|
+
) -> dict[str, Any]:
|
|
288
|
+
"""Prepare command for execution without running hooks.
|
|
289
|
+
|
|
290
|
+
Useful for getting command context before actual execution.
|
|
291
|
+
|
|
292
|
+
Args:
|
|
293
|
+
command: Command configuration
|
|
294
|
+
args: Additional arguments
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
Dictionary with prepared command context
|
|
298
|
+
|
|
299
|
+
"""
|
|
300
|
+
args = args or {}
|
|
301
|
+
|
|
302
|
+
# Get relevant patterns
|
|
303
|
+
patterns_context = ""
|
|
304
|
+
if self.context.learning_storage:
|
|
305
|
+
patterns_context = self.context.get_patterns_for_context(max_patterns=3)
|
|
306
|
+
|
|
307
|
+
return {
|
|
308
|
+
"command": command.name,
|
|
309
|
+
"description": command.description,
|
|
310
|
+
"body": command.body,
|
|
311
|
+
"args": args,
|
|
312
|
+
"patterns_context": patterns_context,
|
|
313
|
+
"user_id": self.context.user_id,
|
|
314
|
+
"has_hooks": bool(command.hooks),
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def create_command_context(
|
|
319
|
+
user_id: str,
|
|
320
|
+
project_root: str | Path | None = None,
|
|
321
|
+
enable_hooks: bool = True,
|
|
322
|
+
enable_learning: bool = True,
|
|
323
|
+
enable_context: bool = True,
|
|
324
|
+
) -> CommandContext:
|
|
325
|
+
"""Create a CommandContext with available components.
|
|
326
|
+
|
|
327
|
+
Factory function that creates a context with the requested
|
|
328
|
+
components, handling import errors gracefully.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
user_id: User identifier
|
|
332
|
+
project_root: Project root directory
|
|
333
|
+
enable_hooks: Enable hook integration
|
|
334
|
+
enable_learning: Enable learning integration
|
|
335
|
+
enable_context: Enable context management
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
Configured CommandContext
|
|
339
|
+
|
|
340
|
+
"""
|
|
341
|
+
hook_registry = None
|
|
342
|
+
context_manager = None
|
|
343
|
+
learning_storage = None
|
|
344
|
+
|
|
345
|
+
if enable_hooks:
|
|
346
|
+
try:
|
|
347
|
+
from attune_llm.hooks.registry import HookRegistry
|
|
348
|
+
|
|
349
|
+
hook_registry = HookRegistry()
|
|
350
|
+
except ImportError:
|
|
351
|
+
logger.debug("Hooks module not available")
|
|
352
|
+
|
|
353
|
+
if enable_context:
|
|
354
|
+
try:
|
|
355
|
+
from attune_llm.context.manager import ContextManager
|
|
356
|
+
|
|
357
|
+
context_manager = ContextManager()
|
|
358
|
+
except ImportError:
|
|
359
|
+
logger.debug("Context module not available")
|
|
360
|
+
|
|
361
|
+
if enable_learning:
|
|
362
|
+
try:
|
|
363
|
+
from attune_llm.learning.storage import LearnedSkillsStorage
|
|
364
|
+
|
|
365
|
+
learning_storage = LearnedSkillsStorage()
|
|
366
|
+
except ImportError:
|
|
367
|
+
logger.debug("Learning module not available")
|
|
368
|
+
|
|
369
|
+
return CommandContext(
|
|
370
|
+
user_id=user_id,
|
|
371
|
+
hook_registry=hook_registry,
|
|
372
|
+
context_manager=context_manager,
|
|
373
|
+
learning_storage=learning_storage,
|
|
374
|
+
project_root=Path(project_root) if project_root else None,
|
|
375
|
+
)
|