attune-ai 2.1.3__tar.gz → 2.1.5__tar.gz
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_ai-2.1.3 → attune_ai-2.1.5}/CHANGELOG.md +17 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/PKG-INFO +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/PKG-INFO +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/pyproject.toml +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/__init__.py +7 -3
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/profiling.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/utilities.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/core.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli_legacy.py +52 -31
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli_minimal.py +29 -29
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/core.py +190 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/dashboard/app.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/provider_config.py +20 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/cli.py +2 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/autonomous_test_gen.py +2 -2
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/base.py +8 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/llm_base.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/output.py +1 -2
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progress.py +1 -2
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/seo_optimization.py +2 -2
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen_behavioral.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/.bandit +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/CODE_OF_CONDUCT.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/CONTRIBUTING.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/LICENSE +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/LICENSE_CHANGE_ANNOUNCEMENT.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/MANIFEST.in +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/SECURITY.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_B112.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_F541.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/SOURCES.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/dependency_links.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/entry_points.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/requires.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_ai.egg-info/top_level.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/clinical_protocol_monitor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/monitoring/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/monitoring/protocol_checker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/monitoring/protocol_loader.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/monitoring/sensor_parsers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_healthcare/monitors/monitoring/trajectory_analyzer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/autogen_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/crewai_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/haystack_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/langchain_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/langgraph_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/native.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/adapters/wizard_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/crews/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/crews/code_review.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/crews/health_check.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/crews/refactoring.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/crews/security_audit.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/decorators.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/factory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/framework.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/memory_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agent_factory/resilient.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agents_md/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agents_md/loader.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agents_md/parser.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/agents_md/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/claude_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/cli/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/cli/sync_claude.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/code_health.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/context.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/loader.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/models.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/parser.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/commands/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/config/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/config/unified.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/context/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/context/compaction.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/context/manager.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/contextual_patterns.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/git_pattern_extractor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/executor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/evaluate_session.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/first_time_init.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/pre_compact.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/session_end.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/session_start.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/hooks/scripts/suggest_compact.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/learning/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/learning/evaluator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/learning/extractor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/learning/storage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/levels.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/pattern_confidence.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/pattern_resolver.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/pattern_summary.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/providers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/routing/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/routing/model_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/IMPLEMENTATION_SUMMARY.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/PHASE2_COMPLETE.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/QUICK_REFERENCE.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/audit_logger.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/audit_logger_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/pii_scrubber.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/secrets_detector.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/secrets_detector_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/secure_memdocs.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/security/secure_memdocs_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/session_status.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/state.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/utils/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_llm/utils/tokens.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/SOFTWARE_PLUGIN_README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/cli/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/cli/inspect.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/attune_software/plugin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/config.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/core.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/empathy-os.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/index.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/llm-toolkit.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/memory.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/meta-orchestration.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/multi-agent.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/pattern-library.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/persistence.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/security-scanner.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/software-wizards.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/wizards.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/api-reference/workflows.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/adaptive-learning-system.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/generated-plan-release-prep.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/multi-agent-team-coordination.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/sbar-clinical-handoff.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/simple-chatbot.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/examples/webhook-event-integration.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/choose-your-path.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/first-steps.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/index.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/installation.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/mcp-integration.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/getting-started/redis-setup.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/DISTRIBUTION_POLICY.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/MCP_PUBLISH_INSTRUCTIONS.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/MKDOCS_TUTORIAL.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/PUBLISHING.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/RELEASE_PREPARATION.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/WORKFLOW_PATTERNS.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/claude-memory-integration.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/five-levels-of-empathy.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/foreword.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/healthcare-wizards.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/how-to-read-this-book.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/multi-model-workflows.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/pattern-catalog.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/preface.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/signoz-integration.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/teaching-ai-your-standards.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/trust-circuit-breaker.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/guides/xml-enhanced-prompts.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/docs/index.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/WIZARD_DASHBOARD_IMPLEMENTATION.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/WIZARD_DASHBOARD_STATE_MANAGEMENT.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/WIZARD_DASHBOARD_WIREFRAMES.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/adaptive_routing_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/adaptive_routing_workflow_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/agent_coordination_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/agent_tracking_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/anthropic_patterns_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/anthropic_patterns_simple_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/approval_gates_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/claude_memory/README-SECURITY.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/claude_memory/enterprise-CLAUDE-secure.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/claude_memory/example-with-imports.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/claude_memory/project-CLAUDE.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/claude_memory/user-CLAUDE.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/complete-workflow/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/complete-workflow/workflow_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/config/empathy.config.example.yml +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/coordinated_workflow_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/dashboard_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_end_to_end_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_memory_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_meta_workflows.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_progressive_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_security_complete.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/demos/demo_test_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/domain_wizards/all_domain_wizards_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/domain_wizards/healthcare_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/domain_wizards/tests/test_healthcare_wizard.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/event_streaming_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/feedback_loop_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/hybrid_cli_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/interactive_team_creation.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/level_5_transformative/BLOG_POST.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/level_5_transformative/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/level_5_transformative/data/deployment_pipeline.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/level_5_transformative/data/healthcare_handoff_code.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/llm_toolkit_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/meta_orchestrator_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/multi_llm_usage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/orchestration/advanced_composition.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/orchestration/basic_usage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/orchestration/custom_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/progressive_test_gen_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/quickstart/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/quickstart.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/redis_exploration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/scanner_usage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/security_integration_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/SOCRATIC_DEMO.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/complete_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/config.yaml +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/dashboard_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/live_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/seo_agent.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/utils.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/seo_optimization/with_memory_backend.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/simple_usage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/smart_team_quickstart.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/sonnet_opus_fallback_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/suggest_adaptive_routing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/test_approval_gates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/test_debugging_wizard.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflow_chaining_demo.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflows/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflows/code_review_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflows/doc_gen_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflows/multi_model_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/examples/workflows/research_example.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/requirements.txt +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/setup.cfg +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/adaptive/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/adaptive/task_complexity.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/agent_monitoring.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/dependency_manager.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/hash_only.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/hybrid.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache/storage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache_monitor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cache_stats.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/__main__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/batch.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/cache.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/help.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/info.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/inspect.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/inspection.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/metrics.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/orchestrate.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/patterns.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/provider.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/routing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/setup.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/status.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/sync.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/tier.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/commands/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/batch.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/cache.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/help.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/info.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/inspect.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/metrics.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/orchestrate.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/patterns.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/provider.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/routing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/setup.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/status.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/sync.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/tier.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/parsers/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/utils/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/utils/data.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli/utils/helpers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cli_unified.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/config/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/config/xml_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/coordination.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/core_modules/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/cost_tracker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/dashboard/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/dashboard/simple_server.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/dashboard/standalone_server.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/discovery.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/emergence.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/exceptions.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/feedback_loops.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/reloader.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/watcher.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/hot_reload/websocket.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/levels.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/leverage_points.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/logging_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/mcp/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/mcp/server.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/claude_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/control_panel.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/control_panel_support.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/cross_session.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/edges.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/encryption.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/file_session.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/graph.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/long_term.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/long_term_types.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/backend_init_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/capabilities_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/handoff_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/lifecycle_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/long_term_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/promotion_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/mixins/short_term_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/nodes.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/redis_bootstrap.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/security/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/security/audit_logger.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/security/pii_scrubber.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/security/secrets_detector.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/short_term.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/simple_storage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/storage/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/storage_backend.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/summary_index.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/types.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/memory/unified.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/agent_creator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/builtin_templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/agent_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/analytics_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/config_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/memory_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/template_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_commands/workflow_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/cli_meta_workflows.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/form_engine.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/intent_detector.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/models.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/pattern_learner.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/plan_generator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/session_context.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/template_registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/meta_workflows/workflow.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/metrics/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/metrics/collector.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/metrics/prompt_metrics.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/__main__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/adaptive_routing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/auth_cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/auth_strategy.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/empathy_executor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/executor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/fallback.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/tasks.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/telemetry/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/telemetry/analytics.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/telemetry/backend.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/telemetry/data_models.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/telemetry/storage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/token_estimator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/models/validation.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/monitoring/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/monitoring/alerts.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/monitoring/alerts_cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/monitoring/multi_backend.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/monitoring/otel_backend.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/optimization/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/optimization/context_optimizer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/agent_templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/config_store.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/execution_strategies.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/meta_orchestrator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/pattern_learner.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/orchestration/real_tools.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/pattern_cache.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/pattern_library.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/patterns/debugging/all_patterns.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/patterns/debugging/workflow_20260107_1770825e.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/patterns/refactoring_memory.json +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/persistence.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/platform_utils.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/plugins/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/plugins/base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/plugins/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/index.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/models.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/reports.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/scanner.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/project_index/scanner_parallel.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/context.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/parser.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/prompts/templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/redis_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/redis_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/circuit_breaker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/fallback.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/health.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/retry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/resilience/timeout.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/routing/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/routing/chain_executor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/routing/classifier.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/routing/smart_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/routing/workflow_registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/__main__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/templates/base_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/templates/coach_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/templates/domain_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/ab_testing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/blueprint.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/collaboration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/domain_templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/embeddings.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/engine.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/explainer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/feedback.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/forms.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/generator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/llm_analyzer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/mcp_server.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/session.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/storage.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/success.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/visual_editor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic/web_ui.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/socratic_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/agent_coordination.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/agent_tracking.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/approval_gates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/commands/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/commands/dashboard_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/event_streaming.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/feedback_loop.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/telemetry/usage_tracker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/__main__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/generator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/risk_analyzer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/test_generator/templates/unit_test.py.jinja2 +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/tier_recommender.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/tools.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/trust/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/trust/circuit_breaker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/trust_building.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/validation/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/validation/xml_validator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/vscode_bridge.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/behavior.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/output.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflow_patterns/structural.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/batch_processing.py +1 -1
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/bug_predict.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/builder.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/caching.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/code_review.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/code_review_adapters.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/code_review_pipeline.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/dependency_check.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_gen/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_gen/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_gen/report_formatter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_gen/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_manager.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/document_manager_README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/documentation_orchestrator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/history.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/generators.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/parsers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/prompts.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/schema.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/keyboard_shortcuts/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/manage_docs.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/manage_docs_README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/manage_documentation.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/new_sample_workflow1.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/new_sample_workflow1_README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/orchestrated_health_check.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/orchestrated_release_prep.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/perf_audit.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/pr_review.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progress_server.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/orchestrator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/reports.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/telemetry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/test_gen.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/progressive/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/refactor_plan.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/release_prep.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/release_prep_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/research_synthesis.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/routing.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/secure_release.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/security_adapters.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/security_audit.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/security_audit_phase3.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/step_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/telemetry_mixin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test5.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test5_README.md +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_coverage_boost_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/ast_analyzer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/data_models.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/report_formatter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/test_templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen/workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_gen_parallel.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_lifecycle.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_maintenance.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_maintenance_cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_maintenance_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/test_runner.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/tier_tracking.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/src/attune/workflows/xml_enhanced_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_agent_factory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_agent_factory_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_agent_factory_resilience.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_audit_logger.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_audit_logger_extended.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_baseline.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_book_production_agents.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_bug_predict_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_claude_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_claude_memory_extended.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_clinical_protocol_monitor.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_health.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_review.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_review_crew_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_review_pipeline.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_review_pipeline_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_code_review_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_control_panel.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_control_panel_security.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_coordination.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_core_reliability.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_cost_tracker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_dependency_check.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_dependency_check_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_discovery.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_document_gen.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_document_gen_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_emergence.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_empathy_llm_core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_empathy_llm_security.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_empathy_os.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_exceptions.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_executor_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_fallback.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_fallback_suite.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_feedback_loops.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_finding_extraction.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_graph.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_health_check.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_healthcare_plugin.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_intelligence_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_levels.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_leverage_points.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_agents.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_decorators.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_empathy_core.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_langgraph_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_levels.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_patterns.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_providers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_security.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_session_status.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_llm_toolkit_wizard_adapter.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_logging_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_long_term.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_memory_graph.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_model_registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_model_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_monitoring.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pattern_cache.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pattern_library.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_perf_audit_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_persistence.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pii_scrubber.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pii_scrubber_extended.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_platform_compat_ci.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_platform_utils.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_plugin_base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_plugin_registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pr_review.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_pr_review_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_production_smoke.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_progress.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_protocol_checker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_protocol_loader.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_provider_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_providers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_redis_bootstrap.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_redis_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_redis_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_redis_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_redis_memory_errors.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_refactor_golden.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_refactor_plan_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_refactoring.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_refactoring_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_registry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_release_prep.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_reporting.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_reports.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_resilience.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_sbar_wizard.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_scanner.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_scanner_exceptions.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_secrets_detector.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_secure_memdocs.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_secure_memdocs_extended.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_secure_release.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_secure_release_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_audit.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_audit_crew.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_audit_workflow.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_crew_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_negative_cases.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_security_scan.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_sensor_parsers.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_session_status.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_short_term.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_smart_router.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_smoke.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_sonnet_opus_fallback.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_state.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_step_config.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_summary_index.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_sync_claude.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_tech_debt_wizard.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_telemetry.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_templates.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_timeout.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_token_estimator.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_trajectory_analyzer.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_trust_building.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_trust_circuit_breaker.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_unified_memory.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_validation.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_wizard_outputs.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_wizard_site_comprehensive.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_workflow_base.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_workflow_commands.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_workflow_wizard_integration.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_xml_prompts.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/tests/test_xml_spec_generation.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/workflow_scaffolding/__init__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/workflow_scaffolding/__main__.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/workflow_scaffolding/cli.py +0 -0
- {attune_ai-2.1.3 → attune_ai-2.1.5}/workflow_scaffolding/generator.py +0 -0
|
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.1.5] - 2026-02-02
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **CLI branding**: Updated all remaining "empathy" references to "attune" in CLI docstrings, usage messages, and help text
|
|
15
|
+
- **Bug fix**: Fixed undefined variable `f` in `test_gen_behavioral.py` (was `for c in` but referenced `f`)
|
|
16
|
+
- **Bug fix**: Fixed duplicate `cmd_workflow` function definition in `cli_legacy.py` (renamed first one to `cmd_setup`)
|
|
17
|
+
- **Import fix**: Added backward-compatible import for `cmd_file_test_dashboard` in `telemetry/cli.py`
|
|
18
|
+
- **Type errors**: Fixed 15 Pyright/Pylance "reportOptionalCall" errors across codebase caused by lazy import system returning `object` type
|
|
19
|
+
|
|
20
|
+
## [2.1.4] - 2026-02-02
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- **CLI rebrand**: Updated CLI help text from "Empathy Framework CLI" to "Attune AI CLI"
|
|
25
|
+
- **CLI program name**: Changed `prog="empathy"` to `prog="attune"` in argparse
|
|
26
|
+
|
|
10
27
|
## [2.1.3] - 2026-02-02
|
|
11
28
|
|
|
12
29
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attune-ai
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
4
4
|
Summary: AI collaboration framework with real LLM agent execution, AskUserQuestion tool integration, Socratic agent generation, progressive tier escalation (70-85% cost savings), meta-orchestration, dynamic agent composition (10 patterns including Anthropic-inspired), intelligent caching (85% hit rate), semantic workflow discovery, visual workflow editor, MCP integration for Claude Code, and multi-agent orchestration.
|
|
5
5
|
Author-email: Patrick Roebuck <admin@smartaimemory.com>
|
|
6
6
|
Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attune-ai
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
4
4
|
Summary: AI collaboration framework with real LLM agent execution, AskUserQuestion tool integration, Socratic agent generation, progressive tier escalation (70-85% cost savings), meta-orchestration, dynamic agent composition (10 patterns including Anthropic-inspired), intelligent caching (85% hit rate), semantic workflow discovery, visual workflow editor, MCP integration for Claude Code, and multi-agent orchestration.
|
|
5
5
|
Author-email: Patrick Roebuck <admin@smartaimemory.com>
|
|
6
6
|
Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "attune-ai"
|
|
7
|
-
version = "2.1.
|
|
7
|
+
version = "2.1.5"
|
|
8
8
|
description = "AI collaboration framework with real LLM agent execution, AskUserQuestion tool integration, Socratic agent generation, progressive tier escalation (70-85% cost savings), meta-orchestration, dynamic agent composition (10 patterns including Anthropic-inspired), intelligent caching (85% hit rate), semantic workflow discovery, visual workflow editor, MCP integration for Claude Code, and multi-agent orchestration."
|
|
9
9
|
readme = {file = "README.md", content-type = "text/markdown"}
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Attune AI CLI - Refactored modular structure.
|
|
2
2
|
|
|
3
|
-
Entry point for the
|
|
3
|
+
Entry point for the attune command-line interface.
|
|
4
4
|
|
|
5
5
|
Copyright 2025 Smart-AI-Memory
|
|
6
6
|
Licensed under Fair Source License 0.9
|
|
@@ -125,7 +125,11 @@ def _register_legacy_commands(subparsers, old_cli):
|
|
|
125
125
|
# Import command functions that haven't been extracted yet
|
|
126
126
|
try:
|
|
127
127
|
# Patterns commands
|
|
128
|
-
from attune.cli import
|
|
128
|
+
from attune.cli.commands.patterns import (
|
|
129
|
+
cmd_patterns_export,
|
|
130
|
+
cmd_patterns_list,
|
|
131
|
+
cmd_patterns_resolve,
|
|
132
|
+
)
|
|
129
133
|
|
|
130
134
|
patterns_parser = subparsers.add_parser("patterns", help="Pattern management")
|
|
131
135
|
patterns_sub = patterns_parser.add_subparsers(dest="patterns_command")
|
|
@@ -83,6 +83,19 @@ try:
|
|
|
83
83
|
TELEMETRY_CLI_AVAILABLE = True
|
|
84
84
|
except ImportError:
|
|
85
85
|
TELEMETRY_CLI_AVAILABLE = False
|
|
86
|
+
# Define stubs to satisfy type checker - these will never be called
|
|
87
|
+
# because TELEMETRY_CLI_AVAILABLE guards all usages
|
|
88
|
+
cmd_agent_performance = None # type: ignore[assignment]
|
|
89
|
+
cmd_file_test_dashboard = None # type: ignore[assignment]
|
|
90
|
+
cmd_file_test_status = None # type: ignore[assignment]
|
|
91
|
+
cmd_task_routing_report = None # type: ignore[assignment]
|
|
92
|
+
cmd_telemetry_compare = None # type: ignore[assignment]
|
|
93
|
+
cmd_telemetry_export = None # type: ignore[assignment]
|
|
94
|
+
cmd_telemetry_reset = None # type: ignore[assignment]
|
|
95
|
+
cmd_telemetry_savings = None # type: ignore[assignment]
|
|
96
|
+
cmd_telemetry_show = None # type: ignore[assignment]
|
|
97
|
+
cmd_test_status = None # type: ignore[assignment]
|
|
98
|
+
cmd_tier1_status = None # type: ignore[assignment]
|
|
86
99
|
|
|
87
100
|
# Import progressive workflow CLI commands
|
|
88
101
|
try:
|
|
@@ -96,6 +109,12 @@ try:
|
|
|
96
109
|
PROGRESSIVE_CLI_AVAILABLE = True
|
|
97
110
|
except ImportError:
|
|
98
111
|
PROGRESSIVE_CLI_AVAILABLE = False
|
|
112
|
+
# Define stubs to satisfy type checker - these will never be called
|
|
113
|
+
# because PROGRESSIVE_CLI_AVAILABLE guards all usages
|
|
114
|
+
cmd_analytics = None # type: ignore[assignment]
|
|
115
|
+
cmd_cleanup = None # type: ignore[assignment]
|
|
116
|
+
cmd_list_results = None # type: ignore[assignment]
|
|
117
|
+
cmd_show_report = None # type: ignore[assignment]
|
|
99
118
|
|
|
100
119
|
logger = get_logger(__name__)
|
|
101
120
|
|
|
@@ -1019,12 +1038,12 @@ def cmd_init(args):
|
|
|
1019
1038
|
output_path = args.output or f"attune.config.{config_format}"
|
|
1020
1039
|
|
|
1021
1040
|
# Validate output path to prevent path traversal attacks
|
|
1022
|
-
validated_path = _validate_file_path(output_path)
|
|
1041
|
+
validated_path = _validate_file_path(output_path) # type: ignore[misc]
|
|
1023
1042
|
|
|
1024
1043
|
logger.info(f"Initializing new Empathy Framework project with format: {config_format}")
|
|
1025
1044
|
|
|
1026
1045
|
# Create default config
|
|
1027
|
-
config = EmpathyConfig()
|
|
1046
|
+
config = EmpathyConfig() # type: ignore[misc]
|
|
1028
1047
|
|
|
1029
1048
|
# Save to file
|
|
1030
1049
|
if config_format == "yaml":
|
|
@@ -1057,7 +1076,7 @@ def cmd_validate(args):
|
|
|
1057
1076
|
logger.info(f"Validating configuration file: {filepath}")
|
|
1058
1077
|
|
|
1059
1078
|
try:
|
|
1060
|
-
config = load_config(filepath=filepath, use_env=False)
|
|
1079
|
+
config = load_config(filepath=filepath, use_env=False) # type: ignore[misc]
|
|
1061
1080
|
config.validate()
|
|
1062
1081
|
logger.info(f"Configuration validation successful: {filepath}")
|
|
1063
1082
|
logger.info(f"✓ Configuration valid: {filepath}")
|
|
@@ -1100,10 +1119,10 @@ def cmd_info(args):
|
|
|
1100
1119
|
|
|
1101
1120
|
if config_file:
|
|
1102
1121
|
logger.debug(f"Loading config from file: {config_file}")
|
|
1103
|
-
config = load_config(filepath=config_file)
|
|
1122
|
+
config = load_config(filepath=config_file) # type: ignore[misc]
|
|
1104
1123
|
else:
|
|
1105
1124
|
logger.debug("Loading default configuration")
|
|
1106
|
-
config = load_config()
|
|
1125
|
+
config = load_config() # type: ignore[misc]
|
|
1107
1126
|
|
|
1108
1127
|
logger.info("=== Empathy Framework Info ===\n")
|
|
1109
1128
|
logger.info("Configuration:")
|
|
@@ -1221,7 +1240,7 @@ def cmd_patterns_export(args):
|
|
|
1221
1240
|
sys.exit(1)
|
|
1222
1241
|
|
|
1223
1242
|
# Validate output path
|
|
1224
|
-
validated_output = _validate_file_path(output_file)
|
|
1243
|
+
validated_output = _validate_file_path(output_file) # type: ignore[misc]
|
|
1225
1244
|
|
|
1226
1245
|
# Save to output format
|
|
1227
1246
|
try:
|
|
@@ -1649,10 +1668,10 @@ def cmd_run(args):
|
|
|
1649
1668
|
|
|
1650
1669
|
# Load configuration
|
|
1651
1670
|
if config_file:
|
|
1652
|
-
config = load_config(filepath=config_file)
|
|
1671
|
+
config = load_config(filepath=config_file) # type: ignore[misc]
|
|
1653
1672
|
print(f"✓ Loaded config from: {config_file}")
|
|
1654
1673
|
else:
|
|
1655
|
-
config = EmpathyConfig(user_id=user_id, target_level=level)
|
|
1674
|
+
config = EmpathyConfig(user_id=user_id, target_level=level) # type: ignore[misc]
|
|
1656
1675
|
print("✓ Using default configuration")
|
|
1657
1676
|
|
|
1658
1677
|
print(f"\nUser ID: {config.user_id}")
|
|
@@ -1931,7 +1950,7 @@ def cmd_export(args):
|
|
|
1931
1950
|
print(f" Found {len(patterns)} patterns")
|
|
1932
1951
|
|
|
1933
1952
|
# Validate output path
|
|
1934
|
-
validated_output = _validate_file_path(output_file)
|
|
1953
|
+
validated_output = _validate_file_path(output_file) # type: ignore[misc]
|
|
1935
1954
|
|
|
1936
1955
|
if format_type == "json":
|
|
1937
1956
|
# Create filtered library if user_id specified
|
|
@@ -2044,7 +2063,7 @@ def cmd_import(args):
|
|
|
2044
2063
|
print()
|
|
2045
2064
|
|
|
2046
2065
|
|
|
2047
|
-
def
|
|
2066
|
+
def cmd_setup(args):
|
|
2048
2067
|
"""Interactive setup workflow.
|
|
2049
2068
|
|
|
2050
2069
|
Guides user through initial framework configuration step by step.
|
|
@@ -2163,7 +2182,7 @@ metrics_enabled: {str(config["metrics_enabled"]).lower()}
|
|
|
2163
2182
|
llm_provider: "{llm_provider}"
|
|
2164
2183
|
"""
|
|
2165
2184
|
|
|
2166
|
-
validated_output = _validate_file_path(output_file)
|
|
2185
|
+
validated_output = _validate_file_path(output_file) # type: ignore[misc]
|
|
2167
2186
|
with open(validated_output, "w") as f:
|
|
2168
2187
|
f.write(yaml_content)
|
|
2169
2188
|
|
|
@@ -2272,7 +2291,7 @@ def cmd_provider_set(args):
|
|
|
2272
2291
|
|
|
2273
2292
|
config["default_provider"] = provider
|
|
2274
2293
|
|
|
2275
|
-
validated_workflows_path = _validate_file_path(str(workflows_path))
|
|
2294
|
+
validated_workflows_path = _validate_file_path(str(workflows_path)) # type: ignore[misc]
|
|
2276
2295
|
with open(validated_workflows_path, "w") as f:
|
|
2277
2296
|
yaml.dump(config, f, default_flow_style=False, sort_keys=False)
|
|
2278
2297
|
|
|
@@ -2303,7 +2322,7 @@ def cmd_sync_claude(args):
|
|
|
2303
2322
|
|
|
2304
2323
|
patterns_dir = Path(args.patterns_dir)
|
|
2305
2324
|
# Validate output directory path
|
|
2306
|
-
validated_output_dir = _validate_file_path(args.output_dir)
|
|
2325
|
+
validated_output_dir = _validate_file_path(args.output_dir) # type: ignore[misc]
|
|
2307
2326
|
output_dir = validated_output_dir
|
|
2308
2327
|
|
|
2309
2328
|
print("=" * 60)
|
|
@@ -2341,7 +2360,7 @@ def cmd_sync_claude(args):
|
|
|
2341
2360
|
# Write rule file
|
|
2342
2361
|
rule_file = output_dir / f"{category}.md"
|
|
2343
2362
|
# Validate rule file path before writing
|
|
2344
|
-
validated_rule_file = _validate_file_path(str(rule_file), allowed_dir=str(output_dir))
|
|
2363
|
+
validated_rule_file = _validate_file_path(str(rule_file), allowed_dir=str(output_dir)) # type: ignore[misc]
|
|
2345
2364
|
with open(validated_rule_file, "w") as f:
|
|
2346
2365
|
f.write(rule_content)
|
|
2347
2366
|
|
|
@@ -2806,6 +2825,8 @@ def cmd_workflow(args):
|
|
|
2806
2825
|
# Generate or show workflow configuration
|
|
2807
2826
|
from pathlib import Path
|
|
2808
2827
|
|
|
2828
|
+
from attune.workflows.config import WorkflowConfig
|
|
2829
|
+
|
|
2809
2830
|
config_path = Path(".attune/workflows.yaml")
|
|
2810
2831
|
|
|
2811
2832
|
if config_path.exists() and not getattr(args, "force", False):
|
|
@@ -2825,7 +2846,7 @@ def cmd_workflow(args):
|
|
|
2825
2846
|
|
|
2826
2847
|
# Create config directory and file
|
|
2827
2848
|
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
2828
|
-
validated_config_path = _validate_file_path(str(config_path))
|
|
2849
|
+
validated_config_path = _validate_file_path(str(config_path)) # type: ignore[misc]
|
|
2829
2850
|
validated_config_path.write_text(create_example_config())
|
|
2830
2851
|
print(f"✓ Created workflow config: {validated_config_path}")
|
|
2831
2852
|
print("\nEdit this file to customize:")
|
|
@@ -2889,7 +2910,7 @@ def cmd_frameworks(args):
|
|
|
2889
2910
|
)
|
|
2890
2911
|
else:
|
|
2891
2912
|
print(f"\nRecommended framework for '{recommend_use_case}': {info['name']}")
|
|
2892
|
-
print(f" Best for: {', '.join(info['best_for'])}")
|
|
2913
|
+
print(f" Best for: {', '.join(info['best_for'])}") # type: ignore[arg-type]
|
|
2893
2914
|
if info.get("install_command"):
|
|
2894
2915
|
print(f" Install: {info['install_command']}")
|
|
2895
2916
|
print()
|
|
@@ -2945,7 +2966,7 @@ def _cmd_telemetry_show(args):
|
|
|
2945
2966
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2946
2967
|
print("Telemetry commands not available. Install telemetry dependencies.")
|
|
2947
2968
|
return 1
|
|
2948
|
-
return cmd_telemetry_show(args)
|
|
2969
|
+
return cmd_telemetry_show(args) # type: ignore[misc]
|
|
2949
2970
|
|
|
2950
2971
|
|
|
2951
2972
|
def _cmd_telemetry_savings(args):
|
|
@@ -2953,7 +2974,7 @@ def _cmd_telemetry_savings(args):
|
|
|
2953
2974
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2954
2975
|
print("Telemetry commands not available. Install telemetry dependencies.")
|
|
2955
2976
|
return 1
|
|
2956
|
-
return cmd_telemetry_savings(args)
|
|
2977
|
+
return cmd_telemetry_savings(args) # type: ignore[misc]
|
|
2957
2978
|
|
|
2958
2979
|
|
|
2959
2980
|
def _cmd_telemetry_compare(args):
|
|
@@ -2961,7 +2982,7 @@ def _cmd_telemetry_compare(args):
|
|
|
2961
2982
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2962
2983
|
print("Telemetry commands not available. Install telemetry dependencies.")
|
|
2963
2984
|
return 1
|
|
2964
|
-
return cmd_telemetry_compare(args)
|
|
2985
|
+
return cmd_telemetry_compare(args) # type: ignore[misc]
|
|
2965
2986
|
|
|
2966
2987
|
|
|
2967
2988
|
def _cmd_telemetry_reset(args):
|
|
@@ -2969,7 +2990,7 @@ def _cmd_telemetry_reset(args):
|
|
|
2969
2990
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2970
2991
|
print("Telemetry commands not available. Install telemetry dependencies.")
|
|
2971
2992
|
return 1
|
|
2972
|
-
return cmd_telemetry_reset(args)
|
|
2993
|
+
return cmd_telemetry_reset(args) # type: ignore[misc]
|
|
2973
2994
|
|
|
2974
2995
|
|
|
2975
2996
|
def _cmd_telemetry_export(args):
|
|
@@ -2977,7 +2998,7 @@ def _cmd_telemetry_export(args):
|
|
|
2977
2998
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2978
2999
|
print("Telemetry commands not available. Install telemetry dependencies.")
|
|
2979
3000
|
return 1
|
|
2980
|
-
return cmd_telemetry_export(args)
|
|
3001
|
+
return cmd_telemetry_export(args) # type: ignore[misc]
|
|
2981
3002
|
|
|
2982
3003
|
|
|
2983
3004
|
def _cmd_tier1_status(args):
|
|
@@ -2985,7 +3006,7 @@ def _cmd_tier1_status(args):
|
|
|
2985
3006
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2986
3007
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
2987
3008
|
return 1
|
|
2988
|
-
return cmd_tier1_status(args)
|
|
3009
|
+
return cmd_tier1_status(args) # type: ignore[misc]
|
|
2989
3010
|
|
|
2990
3011
|
|
|
2991
3012
|
def _cmd_task_routing_report(args):
|
|
@@ -2993,7 +3014,7 @@ def _cmd_task_routing_report(args):
|
|
|
2993
3014
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
2994
3015
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
2995
3016
|
return 1
|
|
2996
|
-
return cmd_task_routing_report(args)
|
|
3017
|
+
return cmd_task_routing_report(args) # type: ignore[misc]
|
|
2997
3018
|
|
|
2998
3019
|
|
|
2999
3020
|
def _cmd_test_status(args):
|
|
@@ -3001,7 +3022,7 @@ def _cmd_test_status(args):
|
|
|
3001
3022
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
3002
3023
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
3003
3024
|
return 1
|
|
3004
|
-
return cmd_test_status(args)
|
|
3025
|
+
return cmd_test_status(args) # type: ignore[misc]
|
|
3005
3026
|
|
|
3006
3027
|
|
|
3007
3028
|
def _cmd_file_test_status(args):
|
|
@@ -3009,7 +3030,7 @@ def _cmd_file_test_status(args):
|
|
|
3009
3030
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
3010
3031
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
3011
3032
|
return 1
|
|
3012
|
-
return cmd_file_test_status(args)
|
|
3033
|
+
return cmd_file_test_status(args) # type: ignore[misc]
|
|
3013
3034
|
|
|
3014
3035
|
|
|
3015
3036
|
def _cmd_file_test_dashboard(args):
|
|
@@ -3017,7 +3038,7 @@ def _cmd_file_test_dashboard(args):
|
|
|
3017
3038
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
3018
3039
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
3019
3040
|
return 1
|
|
3020
|
-
return cmd_file_test_dashboard(args)
|
|
3041
|
+
return cmd_file_test_dashboard(args) # type: ignore[misc]
|
|
3021
3042
|
|
|
3022
3043
|
|
|
3023
3044
|
def _cmd_agent_performance(args):
|
|
@@ -3025,7 +3046,7 @@ def _cmd_agent_performance(args):
|
|
|
3025
3046
|
if not TELEMETRY_CLI_AVAILABLE:
|
|
3026
3047
|
print("Tier 1 monitoring commands not available. Install telemetry dependencies.")
|
|
3027
3048
|
return 1
|
|
3028
|
-
return cmd_agent_performance(args)
|
|
3049
|
+
return cmd_agent_performance(args) # type: ignore[misc]
|
|
3029
3050
|
|
|
3030
3051
|
|
|
3031
3052
|
def main():
|
|
@@ -3537,7 +3558,7 @@ def main():
|
|
|
3537
3558
|
"--storage-path",
|
|
3538
3559
|
help="Path to progressive workflow storage (default: .attune/progressive_runs)",
|
|
3539
3560
|
)
|
|
3540
|
-
parser_progressive_list.set_defaults(func=lambda args: cmd_list_results(args))
|
|
3561
|
+
parser_progressive_list.set_defaults(func=lambda args: cmd_list_results(args)) # type: ignore[misc]
|
|
3541
3562
|
|
|
3542
3563
|
# Progressive show command
|
|
3543
3564
|
parser_progressive_show = progressive_subparsers.add_parser(
|
|
@@ -3558,7 +3579,7 @@ def main():
|
|
|
3558
3579
|
action="store_true",
|
|
3559
3580
|
help="Output in JSON format",
|
|
3560
3581
|
)
|
|
3561
|
-
parser_progressive_show.set_defaults(func=lambda args: cmd_show_report(args))
|
|
3582
|
+
parser_progressive_show.set_defaults(func=lambda args: cmd_show_report(args)) # type: ignore[misc]
|
|
3562
3583
|
|
|
3563
3584
|
# Progressive analytics command
|
|
3564
3585
|
parser_progressive_analytics = progressive_subparsers.add_parser(
|
|
@@ -3574,7 +3595,7 @@ def main():
|
|
|
3574
3595
|
action="store_true",
|
|
3575
3596
|
help="Output in JSON format",
|
|
3576
3597
|
)
|
|
3577
|
-
parser_progressive_analytics.set_defaults(func=lambda args: cmd_analytics(args))
|
|
3598
|
+
parser_progressive_analytics.set_defaults(func=lambda args: cmd_analytics(args)) # type: ignore[misc]
|
|
3578
3599
|
|
|
3579
3600
|
# Progressive cleanup command
|
|
3580
3601
|
parser_progressive_cleanup = progressive_subparsers.add_parser(
|
|
@@ -3596,7 +3617,7 @@ def main():
|
|
|
3596
3617
|
action="store_true",
|
|
3597
3618
|
help="Show what would be deleted without actually deleting",
|
|
3598
3619
|
)
|
|
3599
|
-
parser_progressive_cleanup.set_defaults(func=lambda args: cmd_cleanup(args))
|
|
3620
|
+
parser_progressive_cleanup.set_defaults(func=lambda args: cmd_cleanup(args)) # type: ignore[misc]
|
|
3600
3621
|
|
|
3601
3622
|
# Tier 1 automation monitoring commands
|
|
3602
3623
|
|
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
2
|
+
"""Attune AI CLI.
|
|
3
3
|
|
|
4
4
|
IMPORTANT: This CLI is for automation only (git hooks, scripts, CI/CD).
|
|
5
5
|
For interactive use, use Claude Code skills in VSCode or Claude Desktop.
|
|
6
6
|
|
|
7
7
|
Automation commands:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
attune workflow list List available workflows
|
|
9
|
+
attune workflow run <name> Execute a workflow
|
|
10
|
+
attune workflow info <name> Show workflow details
|
|
11
11
|
|
|
12
12
|
Monitoring commands:
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
attune dashboard start Start agent coordination dashboard
|
|
14
|
+
(opens web UI at http://localhost:8000)
|
|
15
15
|
|
|
16
16
|
Utility commands:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
attune telemetry show Display usage summary
|
|
18
|
+
attune telemetry savings Show cost savings
|
|
19
|
+
attune telemetry export Export to CSV/JSON
|
|
20
|
+
attune telemetry routing-stats Show adaptive routing statistics
|
|
21
|
+
attune telemetry routing-check Check for tier upgrade recommendations
|
|
22
|
+
attune telemetry models Show model performance by provider
|
|
23
|
+
attune telemetry agents Show active agents and their status
|
|
24
|
+
attune telemetry signals Show coordination signals for an agent
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
attune provider show Show current provider config
|
|
27
|
+
attune provider set <name> Set provider (anthropic, openai, hybrid)
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
attune validate Validate configuration
|
|
30
|
+
attune version Show version
|
|
31
31
|
|
|
32
32
|
For interactive development, use Claude Code skills:
|
|
33
33
|
/dev Developer tools (commit, review, debug, refactor)
|
|
@@ -58,7 +58,7 @@ def get_version() -> str:
|
|
|
58
58
|
try:
|
|
59
59
|
from importlib.metadata import version
|
|
60
60
|
|
|
61
|
-
return version("
|
|
61
|
+
return version("attune-ai")
|
|
62
62
|
except Exception: # noqa: BLE001
|
|
63
63
|
# INTENTIONAL: Fallback for dev installs without metadata
|
|
64
64
|
return "dev"
|
|
@@ -90,7 +90,7 @@ def cmd_workflow_list(args: Namespace) -> int:
|
|
|
90
90
|
|
|
91
91
|
print("-" * 60)
|
|
92
92
|
print(f"\nTotal: {len(workflows)} workflows")
|
|
93
|
-
print("\nRun a workflow:
|
|
93
|
+
print("\nRun a workflow: attune workflow run <name>")
|
|
94
94
|
return 0
|
|
95
95
|
|
|
96
96
|
|
|
@@ -429,7 +429,7 @@ def cmd_telemetry_routing_stats(args: Namespace) -> int:
|
|
|
429
429
|
|
|
430
430
|
except ImportError as e:
|
|
431
431
|
print(f"❌ Adaptive routing not available: {e}")
|
|
432
|
-
print(" Ensure
|
|
432
|
+
print(" Ensure attune-ai is installed with telemetry support")
|
|
433
433
|
return 1
|
|
434
434
|
except Exception as e: # noqa: BLE001
|
|
435
435
|
# INTENTIONAL: CLI commands should catch all errors and report gracefully
|
|
@@ -920,7 +920,7 @@ def cmd_validate(args: Namespace) -> int:
|
|
|
920
920
|
def cmd_version(args: Namespace) -> int:
|
|
921
921
|
"""Show version information."""
|
|
922
922
|
version = get_version()
|
|
923
|
-
print(f"
|
|
923
|
+
print(f"attune-ai {version}")
|
|
924
924
|
|
|
925
925
|
if args.verbose:
|
|
926
926
|
print(f"\nPython: {sys.version}")
|
|
@@ -930,7 +930,7 @@ def cmd_version(args: Namespace) -> int:
|
|
|
930
930
|
try:
|
|
931
931
|
from importlib.metadata import requires
|
|
932
932
|
|
|
933
|
-
reqs = requires("
|
|
933
|
+
reqs = requires("attune-ai") or []
|
|
934
934
|
print(f"\nDependencies: {len(reqs)}")
|
|
935
935
|
except Exception: # noqa: BLE001
|
|
936
936
|
pass
|
|
@@ -948,8 +948,8 @@ def cmd_version(args: Namespace) -> int:
|
|
|
948
948
|
def create_parser() -> argparse.ArgumentParser:
|
|
949
949
|
"""Create the argument parser."""
|
|
950
950
|
parser = argparse.ArgumentParser(
|
|
951
|
-
prog="
|
|
952
|
-
description="
|
|
951
|
+
prog="attune",
|
|
952
|
+
description="Attune AI CLI (automation interface - for git hooks, scripts, CI/CD)",
|
|
953
953
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
954
954
|
epilog="""
|
|
955
955
|
NOTE: This CLI is for automation only. For interactive development,
|
|
@@ -1104,7 +1104,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
1104
1104
|
elif args.workflow_command == "run":
|
|
1105
1105
|
return cmd_workflow_run(args)
|
|
1106
1106
|
else:
|
|
1107
|
-
print("Usage:
|
|
1107
|
+
print("Usage: attune workflow {list|info|run}")
|
|
1108
1108
|
return 1
|
|
1109
1109
|
|
|
1110
1110
|
elif args.command == "telemetry":
|
|
@@ -1125,7 +1125,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
1125
1125
|
elif args.telemetry_command == "signals":
|
|
1126
1126
|
return cmd_telemetry_signals(args)
|
|
1127
1127
|
else:
|
|
1128
|
-
print("Usage:
|
|
1128
|
+
print("Usage: attune telemetry {show|savings|export|routing-stats|routing-check|models|agents|signals}")
|
|
1129
1129
|
return 1
|
|
1130
1130
|
|
|
1131
1131
|
elif args.command == "provider":
|
|
@@ -1134,14 +1134,14 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
1134
1134
|
elif args.provider_command == "set":
|
|
1135
1135
|
return cmd_provider_set(args)
|
|
1136
1136
|
else:
|
|
1137
|
-
print("Usage:
|
|
1137
|
+
print("Usage: attune provider {show|set}")
|
|
1138
1138
|
return 1
|
|
1139
1139
|
|
|
1140
1140
|
elif args.command == "dashboard":
|
|
1141
1141
|
if args.dashboard_command == "start":
|
|
1142
1142
|
return cmd_dashboard_start(args)
|
|
1143
1143
|
else:
|
|
1144
|
-
print("Usage:
|
|
1144
|
+
print("Usage: attune dashboard start [--host HOST] [--port PORT]")
|
|
1145
1145
|
return 1
|
|
1146
1146
|
|
|
1147
1147
|
elif args.command == "validate":
|