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
attune/templates.py
ADDED
|
@@ -0,0 +1,754 @@
|
|
|
1
|
+
"""Template Starters for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Scaffold new projects with Empathy pre-configured for different use cases.
|
|
4
|
+
|
|
5
|
+
Supported templates:
|
|
6
|
+
- python-fastapi: FastAPI web service with Empathy integration
|
|
7
|
+
- python-cli: Command-line tool with Empathy
|
|
8
|
+
- python-agent: AI agent toolkit project
|
|
9
|
+
- minimal: Minimal Empathy setup (just config files)
|
|
10
|
+
|
|
11
|
+
Copyright 2025 Smart-AI-Memory
|
|
12
|
+
Licensed under Fair Source License 0.9
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from attune.config import _validate_file_path
|
|
19
|
+
|
|
20
|
+
# Template definitions
|
|
21
|
+
TEMPLATES: dict[str, dict[str, Any]] = {
|
|
22
|
+
"minimal": {
|
|
23
|
+
"name": "Minimal",
|
|
24
|
+
"description": "Just the Empathy config files - add to existing project",
|
|
25
|
+
"files": {
|
|
26
|
+
"attune.config.yml": """# Empathy Framework Configuration
|
|
27
|
+
# Generated by: empathy new minimal
|
|
28
|
+
|
|
29
|
+
user_id: "{{project_name}}"
|
|
30
|
+
target_level: 4
|
|
31
|
+
confidence_threshold: 0.75
|
|
32
|
+
|
|
33
|
+
# Model routing for cost optimization
|
|
34
|
+
model_routing:
|
|
35
|
+
enabled: true
|
|
36
|
+
provider: "anthropic"
|
|
37
|
+
models:
|
|
38
|
+
cheap: "claude-3-haiku-20240307"
|
|
39
|
+
capable: "claude-sonnet-4-20250514"
|
|
40
|
+
premium: "claude-opus-4-20250514"
|
|
41
|
+
|
|
42
|
+
# Claude Code integration
|
|
43
|
+
claude_sync:
|
|
44
|
+
enabled: true
|
|
45
|
+
output_dir: ".claude/rules/empathy"
|
|
46
|
+
|
|
47
|
+
# Persistence
|
|
48
|
+
persistence_enabled: true
|
|
49
|
+
persistence_backend: "sqlite"
|
|
50
|
+
persistence_path: ".empathy"
|
|
51
|
+
metrics_enabled: true
|
|
52
|
+
""",
|
|
53
|
+
".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
|
|
54
|
+
|
|
55
|
+
## Project Context
|
|
56
|
+
|
|
57
|
+
This project uses Empathy Framework for AI-assisted development.
|
|
58
|
+
|
|
59
|
+
## Empathy Integration
|
|
60
|
+
|
|
61
|
+
Run these commands for best results:
|
|
62
|
+
- `empathy morning` - Start-of-day briefing
|
|
63
|
+
- `empathy ship` - Pre-commit checks
|
|
64
|
+
- `empathy sync-claude` - Sync patterns to Claude Code
|
|
65
|
+
|
|
66
|
+
## Coding Patterns
|
|
67
|
+
|
|
68
|
+
@patterns/debugging.json
|
|
69
|
+
@patterns/security.json
|
|
70
|
+
""",
|
|
71
|
+
".gitignore_additions": """# Empathy Framework
|
|
72
|
+
.attune/
|
|
73
|
+
patterns/sensitive/
|
|
74
|
+
*.db
|
|
75
|
+
""",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
"python-cli": {
|
|
79
|
+
"name": "Python CLI Tool",
|
|
80
|
+
"description": "Command-line tool with Empathy for smart assistance",
|
|
81
|
+
"files": {
|
|
82
|
+
"attune.config.yml": """# Empathy Framework Configuration
|
|
83
|
+
# Template: python-cli
|
|
84
|
+
|
|
85
|
+
user_id: "{{project_name}}"
|
|
86
|
+
target_level: 4
|
|
87
|
+
confidence_threshold: 0.75
|
|
88
|
+
|
|
89
|
+
model_routing:
|
|
90
|
+
enabled: true
|
|
91
|
+
provider: "anthropic"
|
|
92
|
+
models:
|
|
93
|
+
cheap: "claude-3-haiku-20240307"
|
|
94
|
+
capable: "claude-sonnet-4-20250514"
|
|
95
|
+
premium: "claude-opus-4-20250514"
|
|
96
|
+
|
|
97
|
+
claude_sync:
|
|
98
|
+
enabled: true
|
|
99
|
+
output_dir: ".claude/rules/empathy"
|
|
100
|
+
|
|
101
|
+
persistence_enabled: true
|
|
102
|
+
persistence_backend: "sqlite"
|
|
103
|
+
persistence_path: ".empathy"
|
|
104
|
+
metrics_enabled: true
|
|
105
|
+
|
|
106
|
+
inspection:
|
|
107
|
+
parallel: true
|
|
108
|
+
learning: true
|
|
109
|
+
format: "terminal"
|
|
110
|
+
""",
|
|
111
|
+
"{{project_name}}/__init__.py": '''"""
|
|
112
|
+
{{project_name}} - A CLI tool powered by Empathy Framework
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
__version__ = "0.1.0"
|
|
116
|
+
''',
|
|
117
|
+
"{{project_name}}/cli.py": '''"""
|
|
118
|
+
Command-line interface for {{project_name}}
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
import argparse
|
|
122
|
+
from attune import EmpathyOS, load_config
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def main():
|
|
126
|
+
parser = argparse.ArgumentParser(
|
|
127
|
+
prog="{{project_name}}",
|
|
128
|
+
description="{{project_name}} - powered by Empathy Framework"
|
|
129
|
+
)
|
|
130
|
+
parser.add_argument("--version", action="version", version="%(prog)s 0.1.0")
|
|
131
|
+
|
|
132
|
+
args = parser.parse_args()
|
|
133
|
+
|
|
134
|
+
# Initialize Empathy
|
|
135
|
+
config = load_config()
|
|
136
|
+
empathy = EmpathyOS(config)
|
|
137
|
+
|
|
138
|
+
print("{{project_name}} is ready!")
|
|
139
|
+
print(f"Empathy level: {config.target_level}")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
if __name__ == "__main__":
|
|
143
|
+
main()
|
|
144
|
+
''',
|
|
145
|
+
"pyproject.toml": """[build-system]
|
|
146
|
+
requires = ["hatchling"]
|
|
147
|
+
build-backend = "hatchling.build"
|
|
148
|
+
|
|
149
|
+
[project]
|
|
150
|
+
name = "{{project_name}}"
|
|
151
|
+
version = "0.1.0"
|
|
152
|
+
description = "A CLI tool powered by Empathy Framework"
|
|
153
|
+
readme = "README.md"
|
|
154
|
+
requires-python = ">=3.9"
|
|
155
|
+
dependencies = [
|
|
156
|
+
"empathy-framework>=2.3",
|
|
157
|
+
]
|
|
158
|
+
|
|
159
|
+
[project.scripts]
|
|
160
|
+
{{project_name}} = "{{project_name}}.cli:main"
|
|
161
|
+
""",
|
|
162
|
+
"README.md": """# {{project_name}}
|
|
163
|
+
|
|
164
|
+
A CLI tool powered by Empathy Framework.
|
|
165
|
+
|
|
166
|
+
## Installation
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
pip install -e .
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Usage
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
{{project_name}} --help
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Development
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Start-of-day briefing
|
|
182
|
+
empathy morning
|
|
183
|
+
|
|
184
|
+
# Pre-commit checks
|
|
185
|
+
empathy ship
|
|
186
|
+
|
|
187
|
+
# Sync patterns to Claude Code
|
|
188
|
+
empathy sync-claude
|
|
189
|
+
```
|
|
190
|
+
""",
|
|
191
|
+
".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
|
|
192
|
+
|
|
193
|
+
## Project Context
|
|
194
|
+
|
|
195
|
+
CLI tool built with Empathy Framework.
|
|
196
|
+
|
|
197
|
+
## Key Commands
|
|
198
|
+
|
|
199
|
+
- `empathy morning` - Start-of-day briefing
|
|
200
|
+
- `empathy ship` - Pre-commit checks
|
|
201
|
+
- `empathy learn` - Extract patterns from git history
|
|
202
|
+
|
|
203
|
+
## Patterns
|
|
204
|
+
|
|
205
|
+
@patterns/debugging.json
|
|
206
|
+
""",
|
|
207
|
+
".gitignore": """# Python
|
|
208
|
+
__pycache__/
|
|
209
|
+
*.py[cod]
|
|
210
|
+
*.egg-info/
|
|
211
|
+
dist/
|
|
212
|
+
build/
|
|
213
|
+
.eggs/
|
|
214
|
+
|
|
215
|
+
# Empathy Framework
|
|
216
|
+
.attune/
|
|
217
|
+
patterns/sensitive/
|
|
218
|
+
|
|
219
|
+
# IDE
|
|
220
|
+
.vscode/
|
|
221
|
+
.idea/
|
|
222
|
+
|
|
223
|
+
# Environment
|
|
224
|
+
.env
|
|
225
|
+
.venv/
|
|
226
|
+
""",
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
"python-fastapi": {
|
|
230
|
+
"name": "Python FastAPI",
|
|
231
|
+
"description": "FastAPI web service with Empathy integration",
|
|
232
|
+
"files": {
|
|
233
|
+
"attune.config.yml": """# Empathy Framework Configuration
|
|
234
|
+
# Template: python-fastapi
|
|
235
|
+
|
|
236
|
+
user_id: "{{project_name}}"
|
|
237
|
+
target_level: 4
|
|
238
|
+
confidence_threshold: 0.75
|
|
239
|
+
|
|
240
|
+
model_routing:
|
|
241
|
+
enabled: true
|
|
242
|
+
provider: "anthropic"
|
|
243
|
+
models:
|
|
244
|
+
cheap: "claude-3-haiku-20240307"
|
|
245
|
+
capable: "claude-sonnet-4-20250514"
|
|
246
|
+
premium: "claude-opus-4-20250514"
|
|
247
|
+
|
|
248
|
+
claude_sync:
|
|
249
|
+
enabled: true
|
|
250
|
+
output_dir: ".claude/rules/empathy"
|
|
251
|
+
|
|
252
|
+
persistence_enabled: true
|
|
253
|
+
persistence_backend: "sqlite"
|
|
254
|
+
persistence_path: ".empathy"
|
|
255
|
+
metrics_enabled: true
|
|
256
|
+
|
|
257
|
+
health:
|
|
258
|
+
checks:
|
|
259
|
+
lint: true
|
|
260
|
+
format: true
|
|
261
|
+
types: true
|
|
262
|
+
security: true
|
|
263
|
+
""",
|
|
264
|
+
"{{project_name}}/__init__.py": '''"""
|
|
265
|
+
{{project_name}} - FastAPI service with Empathy Framework
|
|
266
|
+
"""
|
|
267
|
+
|
|
268
|
+
__version__ = "0.1.0"
|
|
269
|
+
''',
|
|
270
|
+
"{{project_name}}/main.py": '''"""
|
|
271
|
+
FastAPI application for {{project_name}}
|
|
272
|
+
"""
|
|
273
|
+
|
|
274
|
+
from fastapi import FastAPI
|
|
275
|
+
from attune import EmpathyOS, load_config
|
|
276
|
+
|
|
277
|
+
app = FastAPI(
|
|
278
|
+
title="{{project_name}}",
|
|
279
|
+
description="FastAPI service powered by Empathy Framework",
|
|
280
|
+
version="0.1.0"
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Initialize Empathy (optional - for AI features)
|
|
284
|
+
try:
|
|
285
|
+
config = load_config()
|
|
286
|
+
empathy = EmpathyOS(config)
|
|
287
|
+
except Exception:
|
|
288
|
+
empathy = None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
@app.get("/")
|
|
292
|
+
async def root():
|
|
293
|
+
return {
|
|
294
|
+
"message": "Welcome to {{project_name}}",
|
|
295
|
+
"empathy_enabled": empathy is not None
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
@app.get("/health")
|
|
300
|
+
async def health():
|
|
301
|
+
return {"status": "healthy"}
|
|
302
|
+
''',
|
|
303
|
+
"pyproject.toml": """[build-system]
|
|
304
|
+
requires = ["hatchling"]
|
|
305
|
+
build-backend = "hatchling.build"
|
|
306
|
+
|
|
307
|
+
[project]
|
|
308
|
+
name = "{{project_name}}"
|
|
309
|
+
version = "0.1.0"
|
|
310
|
+
description = "FastAPI service powered by Empathy Framework"
|
|
311
|
+
readme = "README.md"
|
|
312
|
+
requires-python = ">=3.9"
|
|
313
|
+
dependencies = [
|
|
314
|
+
"fastapi>=0.100",
|
|
315
|
+
"uvicorn[standard]>=0.20",
|
|
316
|
+
"empathy-framework>=2.3",
|
|
317
|
+
]
|
|
318
|
+
|
|
319
|
+
[project.scripts]
|
|
320
|
+
{{project_name}} = "{{project_name}}.main:app"
|
|
321
|
+
""",
|
|
322
|
+
"README.md": """# {{project_name}}
|
|
323
|
+
|
|
324
|
+
FastAPI service powered by Empathy Framework.
|
|
325
|
+
|
|
326
|
+
## Installation
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
pip install -e .
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Running
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
uvicorn {{project_name}}.main:app --reload
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Development
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
# Start-of-day briefing
|
|
342
|
+
empathy morning
|
|
343
|
+
|
|
344
|
+
# Pre-commit checks
|
|
345
|
+
empathy ship
|
|
346
|
+
|
|
347
|
+
# Run health checks
|
|
348
|
+
empathy health
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## API
|
|
352
|
+
|
|
353
|
+
- `GET /` - Root endpoint
|
|
354
|
+
- `GET /health` - Health check
|
|
355
|
+
""",
|
|
356
|
+
".claude/CLAUDE.md": """# {{project_name}} - Claude Code Rules
|
|
357
|
+
|
|
358
|
+
## Project Context
|
|
359
|
+
|
|
360
|
+
FastAPI web service with Empathy Framework integration.
|
|
361
|
+
|
|
362
|
+
## API Structure
|
|
363
|
+
|
|
364
|
+
- `main.py` - FastAPI app definition
|
|
365
|
+
- Standard RESTful patterns
|
|
366
|
+
|
|
367
|
+
## Commands
|
|
368
|
+
|
|
369
|
+
- `empathy morning` - Daily briefing
|
|
370
|
+
- `empathy ship` - Pre-commit checks
|
|
371
|
+
- `empathy health` - Code health
|
|
372
|
+
|
|
373
|
+
## Patterns
|
|
374
|
+
|
|
375
|
+
@patterns/debugging.json
|
|
376
|
+
@patterns/security.json
|
|
377
|
+
""",
|
|
378
|
+
".gitignore": """# Python
|
|
379
|
+
__pycache__/
|
|
380
|
+
*.py[cod]
|
|
381
|
+
*.egg-info/
|
|
382
|
+
dist/
|
|
383
|
+
build/
|
|
384
|
+
|
|
385
|
+
# Empathy Framework
|
|
386
|
+
.attune/
|
|
387
|
+
patterns/sensitive/
|
|
388
|
+
|
|
389
|
+
# Environment
|
|
390
|
+
.env
|
|
391
|
+
.venv/
|
|
392
|
+
|
|
393
|
+
# IDE
|
|
394
|
+
.vscode/
|
|
395
|
+
.idea/
|
|
396
|
+
""",
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
"python-agent": {
|
|
400
|
+
"name": "Python AI Agent",
|
|
401
|
+
"description": "AI agent project with Empathy for pattern learning",
|
|
402
|
+
"files": {
|
|
403
|
+
"attune.config.yml": """# Empathy Framework Configuration
|
|
404
|
+
# Template: python-agent
|
|
405
|
+
|
|
406
|
+
user_id: "{{project_name}}_agent"
|
|
407
|
+
target_level: 5 # Systems thinking for agents
|
|
408
|
+
confidence_threshold: 0.8
|
|
409
|
+
|
|
410
|
+
model_routing:
|
|
411
|
+
enabled: true
|
|
412
|
+
provider: "anthropic"
|
|
413
|
+
models:
|
|
414
|
+
cheap: "claude-3-haiku-20240307"
|
|
415
|
+
capable: "claude-sonnet-4-20250514"
|
|
416
|
+
premium: "claude-opus-4-20250514"
|
|
417
|
+
task_overrides:
|
|
418
|
+
summarize: "cheap"
|
|
419
|
+
classify: "cheap"
|
|
420
|
+
generate_code: "capable"
|
|
421
|
+
architectural_decision: "premium"
|
|
422
|
+
coordinate: "premium"
|
|
423
|
+
|
|
424
|
+
claude_sync:
|
|
425
|
+
enabled: true
|
|
426
|
+
output_dir: ".claude/rules/empathy"
|
|
427
|
+
sync_patterns:
|
|
428
|
+
debugging: true
|
|
429
|
+
security: true
|
|
430
|
+
inspection: true
|
|
431
|
+
|
|
432
|
+
persistence_enabled: true
|
|
433
|
+
persistence_backend: "sqlite"
|
|
434
|
+
persistence_path: ".empathy"
|
|
435
|
+
metrics_enabled: true
|
|
436
|
+
|
|
437
|
+
# Agent-specific settings
|
|
438
|
+
pattern_library_enabled: true
|
|
439
|
+
pattern_sharing: true
|
|
440
|
+
""",
|
|
441
|
+
"{{project_name}}/__init__.py": '''"""
|
|
442
|
+
{{project_name}} - AI Agent powered by Empathy Framework
|
|
443
|
+
"""
|
|
444
|
+
|
|
445
|
+
__version__ = "0.1.0"
|
|
446
|
+
''',
|
|
447
|
+
"{{project_name}}/agent.py": '''"""
|
|
448
|
+
AI Agent implementation for {{project_name}}
|
|
449
|
+
"""
|
|
450
|
+
|
|
451
|
+
from attune import EmpathyOS, load_config
|
|
452
|
+
from attune_llm import EmpathyLLM
|
|
453
|
+
import os
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
class {{project_name_class}}Agent:
|
|
457
|
+
"""
|
|
458
|
+
AI Agent with Empathy-powered learning and memory.
|
|
459
|
+
"""
|
|
460
|
+
|
|
461
|
+
def __init__(self):
|
|
462
|
+
self.config = load_config()
|
|
463
|
+
self.empathy = EmpathyOS(self.config)
|
|
464
|
+
|
|
465
|
+
# Initialize LLM with model routing
|
|
466
|
+
self.llm = EmpathyLLM(
|
|
467
|
+
provider="anthropic",
|
|
468
|
+
api_key=os.getenv("ANTHROPIC_API_KEY"),
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
async def process(self, user_input: str, context: dict = None) -> str:
|
|
472
|
+
"""Process user input and return response."""
|
|
473
|
+
response = await self.llm.interact(
|
|
474
|
+
user_id=self.config.user_id,
|
|
475
|
+
user_input=user_input,
|
|
476
|
+
context=context or {}
|
|
477
|
+
)
|
|
478
|
+
return response.get("response", "")
|
|
479
|
+
|
|
480
|
+
def get_patterns(self) -> list:
|
|
481
|
+
"""Get learned patterns."""
|
|
482
|
+
return self.empathy.pattern_library.list_patterns()
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
async def main():
|
|
486
|
+
"""Example usage."""
|
|
487
|
+
agent = {{project_name_class}}Agent()
|
|
488
|
+
response = await agent.process("Hello, what can you help me with?")
|
|
489
|
+
print(response)
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
if __name__ == "__main__":
|
|
493
|
+
import asyncio
|
|
494
|
+
asyncio.run(main())
|
|
495
|
+
''',
|
|
496
|
+
"pyproject.toml": """[build-system]
|
|
497
|
+
requires = ["hatchling"]
|
|
498
|
+
build-backend = "hatchling.build"
|
|
499
|
+
|
|
500
|
+
[project]
|
|
501
|
+
name = "{{project_name}}"
|
|
502
|
+
version = "0.1.0"
|
|
503
|
+
description = "AI Agent powered by Empathy Framework"
|
|
504
|
+
readme = "README.md"
|
|
505
|
+
requires-python = ">=3.9"
|
|
506
|
+
dependencies = [
|
|
507
|
+
"empathy-framework>=2.3",
|
|
508
|
+
"anthropic>=0.18",
|
|
509
|
+
]
|
|
510
|
+
|
|
511
|
+
[project.optional-dependencies]
|
|
512
|
+
dev = [
|
|
513
|
+
"pytest>=7.0",
|
|
514
|
+
"pytest-asyncio>=0.21",
|
|
515
|
+
]
|
|
516
|
+
""",
|
|
517
|
+
"README.md": """# {{project_name}}
|
|
518
|
+
|
|
519
|
+
AI Agent powered by Empathy Framework with pattern learning.
|
|
520
|
+
|
|
521
|
+
## Setup
|
|
522
|
+
|
|
523
|
+
1. Install dependencies:
|
|
524
|
+
```bash
|
|
525
|
+
pip install -e ".[dev]"
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
2. Set API key:
|
|
529
|
+
```bash
|
|
530
|
+
export ANTHROPIC_API_KEY="your-key"
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
3. Run agent:
|
|
534
|
+
```bash
|
|
535
|
+
python -m {{project_name}}.agent
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
## Features
|
|
539
|
+
|
|
540
|
+
- Model routing for cost optimization
|
|
541
|
+
- Pattern learning from interactions
|
|
542
|
+
- Claude Code integration
|
|
543
|
+
|
|
544
|
+
## Development
|
|
545
|
+
|
|
546
|
+
```bash
|
|
547
|
+
# Learn patterns from git history
|
|
548
|
+
empathy learn --analyze 50
|
|
549
|
+
|
|
550
|
+
# Sync patterns to Claude Code
|
|
551
|
+
empathy sync-claude
|
|
552
|
+
|
|
553
|
+
# Morning briefing
|
|
554
|
+
empathy morning
|
|
555
|
+
```
|
|
556
|
+
""",
|
|
557
|
+
".claude/CLAUDE.md": """# {{project_name}} - AI Agent Rules
|
|
558
|
+
|
|
559
|
+
## Project Context
|
|
560
|
+
|
|
561
|
+
AI agent with Empathy Framework for pattern learning and memory.
|
|
562
|
+
|
|
563
|
+
## Agent Architecture
|
|
564
|
+
|
|
565
|
+
- `agent.py` - Main agent class with Empathy integration
|
|
566
|
+
- Model routing: Haiku for simple, Sonnet for code, Opus for decisions
|
|
567
|
+
|
|
568
|
+
## Pattern Storage
|
|
569
|
+
|
|
570
|
+
Patterns are stored in `patterns/` and synced to Claude Code.
|
|
571
|
+
|
|
572
|
+
@patterns/debugging.json
|
|
573
|
+
@patterns/security.json
|
|
574
|
+
@patterns/inspection.json
|
|
575
|
+
""",
|
|
576
|
+
".gitignore": """# Python
|
|
577
|
+
__pycache__/
|
|
578
|
+
*.py[cod]
|
|
579
|
+
*.egg-info/
|
|
580
|
+
dist/
|
|
581
|
+
build/
|
|
582
|
+
|
|
583
|
+
# Empathy Framework
|
|
584
|
+
.attune/
|
|
585
|
+
patterns/sensitive/
|
|
586
|
+
|
|
587
|
+
# Environment
|
|
588
|
+
.env
|
|
589
|
+
.venv/
|
|
590
|
+
|
|
591
|
+
# IDE
|
|
592
|
+
.vscode/
|
|
593
|
+
.idea/
|
|
594
|
+
""",
|
|
595
|
+
"tests/__init__.py": "",
|
|
596
|
+
"tests/test_agent.py": '''"""Tests for {{project_name}} agent."""
|
|
597
|
+
|
|
598
|
+
import pytest
|
|
599
|
+
from {{project_name}}.agent import {{project_name_class}}Agent
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
def test_agent_init():
|
|
603
|
+
"""Test agent initialization."""
|
|
604
|
+
# Note: This will require config file
|
|
605
|
+
# agent = {{project_name_class}}Agent()
|
|
606
|
+
# assert agent is not None
|
|
607
|
+
pass
|
|
608
|
+
''',
|
|
609
|
+
},
|
|
610
|
+
},
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
def list_templates() -> list:
|
|
615
|
+
"""List available templates."""
|
|
616
|
+
return [
|
|
617
|
+
{"id": tid, "name": t["name"], "description": t["description"]}
|
|
618
|
+
for tid, t in TEMPLATES.items()
|
|
619
|
+
]
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def scaffold_project(
|
|
623
|
+
template_name: str,
|
|
624
|
+
project_name: str,
|
|
625
|
+
target_dir: str | None = None,
|
|
626
|
+
force: bool = False,
|
|
627
|
+
) -> dict:
|
|
628
|
+
"""Create a new project from a template.
|
|
629
|
+
|
|
630
|
+
Args:
|
|
631
|
+
template_name: Template ID (minimal, python-cli, python-fastapi, python-agent)
|
|
632
|
+
project_name: Name for the new project
|
|
633
|
+
target_dir: Directory to create project in (default: ./{project_name})
|
|
634
|
+
force: Overwrite existing files
|
|
635
|
+
|
|
636
|
+
Returns:
|
|
637
|
+
Dict with created files and status
|
|
638
|
+
|
|
639
|
+
"""
|
|
640
|
+
if template_name not in TEMPLATES:
|
|
641
|
+
return {
|
|
642
|
+
"success": False,
|
|
643
|
+
"error": f"Unknown template: {template_name}",
|
|
644
|
+
"available": list(TEMPLATES.keys()),
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
template = TEMPLATES[template_name]
|
|
648
|
+
target = Path(target_dir) if target_dir else Path(project_name)
|
|
649
|
+
|
|
650
|
+
# Check if directory exists
|
|
651
|
+
if target.exists() and not force:
|
|
652
|
+
if any(target.iterdir()):
|
|
653
|
+
return {
|
|
654
|
+
"success": False,
|
|
655
|
+
"error": f"Directory '{target}' exists and is not empty. Use --force to overwrite.",
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
# Create directory
|
|
659
|
+
target.mkdir(parents=True, exist_ok=True)
|
|
660
|
+
|
|
661
|
+
# Create project name class version (for Python class names)
|
|
662
|
+
project_name_class = "".join(
|
|
663
|
+
word.capitalize() for word in project_name.replace("-", "_").replace(" ", "_").split("_")
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
# Create files
|
|
667
|
+
created_files = []
|
|
668
|
+
files = template["files"]
|
|
669
|
+
if not isinstance(files, dict):
|
|
670
|
+
return {"success": False, "error": "Invalid template structure"}
|
|
671
|
+
for file_path, content in files.items():
|
|
672
|
+
# Replace placeholders in path
|
|
673
|
+
actual_path = file_path.replace("{{project_name}}", project_name)
|
|
674
|
+
|
|
675
|
+
# Replace placeholders in content
|
|
676
|
+
actual_content = content.replace("{{project_name}}", project_name)
|
|
677
|
+
actual_content = actual_content.replace("{{project_name_class}}", project_name_class)
|
|
678
|
+
|
|
679
|
+
# Create file
|
|
680
|
+
full_path = target / actual_path
|
|
681
|
+
full_path.parent.mkdir(parents=True, exist_ok=True)
|
|
682
|
+
|
|
683
|
+
# Handle special files
|
|
684
|
+
if file_path == ".gitignore_additions":
|
|
685
|
+
# Append to existing .gitignore or create new
|
|
686
|
+
gitignore_path = target / ".gitignore"
|
|
687
|
+
validated_gitignore = _validate_file_path(str(gitignore_path))
|
|
688
|
+
if validated_gitignore.exists():
|
|
689
|
+
with open(validated_gitignore, "a") as f:
|
|
690
|
+
f.write("\n" + actual_content)
|
|
691
|
+
else:
|
|
692
|
+
with open(validated_gitignore, "w") as f:
|
|
693
|
+
f.write(actual_content)
|
|
694
|
+
created_files.append(".gitignore")
|
|
695
|
+
else:
|
|
696
|
+
validated_path = _validate_file_path(str(full_path))
|
|
697
|
+
with open(validated_path, "w") as f:
|
|
698
|
+
f.write(actual_content)
|
|
699
|
+
created_files.append(actual_path)
|
|
700
|
+
|
|
701
|
+
# Create patterns directory
|
|
702
|
+
(target / "patterns").mkdir(exist_ok=True)
|
|
703
|
+
|
|
704
|
+
return {
|
|
705
|
+
"success": True,
|
|
706
|
+
"template": template_name,
|
|
707
|
+
"project_name": project_name,
|
|
708
|
+
"target_dir": str(target),
|
|
709
|
+
"files_created": created_files,
|
|
710
|
+
"next_steps": [f"cd {target}", "pip install -e .", "empathy morning"],
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
def cmd_new(args):
|
|
715
|
+
"""CLI command handler for creating new projects."""
|
|
716
|
+
template = getattr(args, "template", None)
|
|
717
|
+
project_name = getattr(args, "name", None)
|
|
718
|
+
target_dir = getattr(args, "output", None)
|
|
719
|
+
force = getattr(args, "force", False)
|
|
720
|
+
list_only = getattr(args, "list", False)
|
|
721
|
+
|
|
722
|
+
if list_only:
|
|
723
|
+
print("\nAvailable Templates:")
|
|
724
|
+
print("-" * 50)
|
|
725
|
+
for t in list_templates():
|
|
726
|
+
print(f" {t['id']:15} {t['description']}")
|
|
727
|
+
print("\nUsage: empathy new <template> <project-name>")
|
|
728
|
+
print()
|
|
729
|
+
return 0
|
|
730
|
+
|
|
731
|
+
if not template or not project_name:
|
|
732
|
+
print("Usage: empathy new <template> <project-name>")
|
|
733
|
+
print(" empathy new --list")
|
|
734
|
+
return 1
|
|
735
|
+
|
|
736
|
+
print(f"\nCreating new project from '{template}' template...")
|
|
737
|
+
|
|
738
|
+
result = scaffold_project(template, project_name, target_dir, force)
|
|
739
|
+
|
|
740
|
+
if result["success"]:
|
|
741
|
+
print(f"\n Project created: {result['target_dir']}")
|
|
742
|
+
print("\n Files created:")
|
|
743
|
+
for f in result["files_created"]:
|
|
744
|
+
print(f" - {f}")
|
|
745
|
+
print("\n Next steps:")
|
|
746
|
+
for step in result["next_steps"]:
|
|
747
|
+
print(f" $ {step}")
|
|
748
|
+
print()
|
|
749
|
+
return 0
|
|
750
|
+
print(f"\n Error: {result['error']}")
|
|
751
|
+
if "available" in result:
|
|
752
|
+
print(f" Available templates: {', '.join(result['available'])}")
|
|
753
|
+
print()
|
|
754
|
+
return 1
|