attune-ai 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""CLI Memory Commands.
|
|
2
|
+
|
|
3
|
+
Memory Commands for meta-workflow system.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
import typer
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from rich.panel import Panel
|
|
13
|
+
from rich.table import Table
|
|
14
|
+
|
|
15
|
+
from . import meta_workflow_app
|
|
16
|
+
|
|
17
|
+
console = Console()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@meta_workflow_app.command("search-memory")
|
|
21
|
+
def search_memory(
|
|
22
|
+
query: str = typer.Argument(..., help="Search query for patterns"),
|
|
23
|
+
pattern_type: str | None = typer.Option(
|
|
24
|
+
None,
|
|
25
|
+
"--type",
|
|
26
|
+
"-t",
|
|
27
|
+
help="Filter by pattern type (e.g., 'meta_workflow_execution')",
|
|
28
|
+
),
|
|
29
|
+
limit: int = typer.Option(
|
|
30
|
+
10,
|
|
31
|
+
"--limit",
|
|
32
|
+
"-l",
|
|
33
|
+
help="Maximum number of results to return",
|
|
34
|
+
),
|
|
35
|
+
user_id: str = typer.Option(
|
|
36
|
+
"cli_user",
|
|
37
|
+
"--user-id",
|
|
38
|
+
"-u",
|
|
39
|
+
help="User ID for memory access",
|
|
40
|
+
),
|
|
41
|
+
):
|
|
42
|
+
"""Search memory for patterns using keyword matching.
|
|
43
|
+
|
|
44
|
+
Searches long-term memory for patterns matching the query.
|
|
45
|
+
Uses relevance scoring: exact phrase (10 pts), keyword in content (2 pts),
|
|
46
|
+
keyword in metadata (1 pt).
|
|
47
|
+
|
|
48
|
+
Examples:
|
|
49
|
+
empathy meta-workflow search-memory "successful workflow"
|
|
50
|
+
empathy meta-workflow search-memory "test coverage" --type meta_workflow_execution
|
|
51
|
+
empathy meta-workflow search-memory "error" --limit 20
|
|
52
|
+
"""
|
|
53
|
+
try:
|
|
54
|
+
from attune.memory.unified import UnifiedMemory
|
|
55
|
+
|
|
56
|
+
console.print(f"\n[bold]Searching memory for:[/bold] '{query}'")
|
|
57
|
+
if pattern_type:
|
|
58
|
+
console.print(f"[dim]Pattern type: {pattern_type}[/dim]")
|
|
59
|
+
console.print()
|
|
60
|
+
|
|
61
|
+
# Initialize memory
|
|
62
|
+
memory = UnifiedMemory(user_id=user_id)
|
|
63
|
+
|
|
64
|
+
# Search
|
|
65
|
+
results = memory.search_patterns(
|
|
66
|
+
query=query,
|
|
67
|
+
pattern_type=pattern_type,
|
|
68
|
+
limit=limit,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if not results:
|
|
72
|
+
console.print("[yellow]No matching patterns found.[/yellow]\n")
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
# Display results
|
|
76
|
+
console.print(f"[green]Found {len(results)} matching pattern(s):[/green]\n")
|
|
77
|
+
|
|
78
|
+
for i, pattern in enumerate(results, 1):
|
|
79
|
+
panel = Panel(
|
|
80
|
+
f"[bold]Pattern ID:[/bold] {pattern.get('pattern_id', 'N/A')}\n"
|
|
81
|
+
f"[bold]Type:[/bold] {pattern.get('pattern_type', 'N/A')}\n"
|
|
82
|
+
f"[bold]Classification:[/bold] {pattern.get('classification', 'N/A')}\n\n"
|
|
83
|
+
f"[bold]Content:[/bold]\n{str(pattern.get('content', 'N/A'))[:200]}...\n\n"
|
|
84
|
+
f"[bold]Metadata:[/bold] {pattern.get('metadata', {})}",
|
|
85
|
+
title=f"Result {i}/{len(results)}",
|
|
86
|
+
border_style="blue",
|
|
87
|
+
)
|
|
88
|
+
console.print(panel)
|
|
89
|
+
console.print()
|
|
90
|
+
|
|
91
|
+
except ImportError:
|
|
92
|
+
console.print(
|
|
93
|
+
"[red]Error:[/red] UnifiedMemory not available. Ensure memory module is installed."
|
|
94
|
+
)
|
|
95
|
+
raise typer.Exit(code=1)
|
|
96
|
+
except Exception as e:
|
|
97
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
98
|
+
raise typer.Exit(code=1)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# =============================================================================
|
|
102
|
+
# Session Context Commands
|
|
103
|
+
# =============================================================================
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@meta_workflow_app.command("session-stats")
|
|
108
|
+
def show_session_stats(
|
|
109
|
+
session_id: str | None = typer.Option(
|
|
110
|
+
None,
|
|
111
|
+
"--session-id",
|
|
112
|
+
"-s",
|
|
113
|
+
help="Session ID (optional, creates new if not specified)",
|
|
114
|
+
),
|
|
115
|
+
user_id: str = typer.Option(
|
|
116
|
+
"cli_user",
|
|
117
|
+
"--user-id",
|
|
118
|
+
"-u",
|
|
119
|
+
help="User ID for session",
|
|
120
|
+
),
|
|
121
|
+
):
|
|
122
|
+
"""Show session context statistics.
|
|
123
|
+
|
|
124
|
+
Displays information about user's session including:
|
|
125
|
+
- Recent form choices
|
|
126
|
+
- Templates used
|
|
127
|
+
- Choice counts
|
|
128
|
+
|
|
129
|
+
Examples:
|
|
130
|
+
empathy meta-workflow session-stats
|
|
131
|
+
empathy meta-workflow session-stats --session-id sess_123
|
|
132
|
+
"""
|
|
133
|
+
try:
|
|
134
|
+
from attune.memory.unified import UnifiedMemory
|
|
135
|
+
from attune.meta_workflows.session_context import SessionContext
|
|
136
|
+
|
|
137
|
+
# Initialize memory and session
|
|
138
|
+
memory = UnifiedMemory(user_id=user_id)
|
|
139
|
+
session = SessionContext(
|
|
140
|
+
memory=memory,
|
|
141
|
+
session_id=session_id,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
console.print("\n[bold]Session Statistics[/bold]")
|
|
145
|
+
console.print(f"[dim]Session ID: {session.session_id}[/dim]")
|
|
146
|
+
console.print(f"[dim]User ID: {session.user_id}[/dim]\n")
|
|
147
|
+
|
|
148
|
+
# Get stats
|
|
149
|
+
stats = session.get_session_stats()
|
|
150
|
+
|
|
151
|
+
# Display
|
|
152
|
+
table = Table(show_header=True)
|
|
153
|
+
table.add_column("Metric", style="cyan")
|
|
154
|
+
table.add_column("Value")
|
|
155
|
+
|
|
156
|
+
table.add_row("Total Choices", str(stats.get("choice_count", 0)))
|
|
157
|
+
table.add_row("Templates Used", str(len(stats.get("templates_used", []))))
|
|
158
|
+
table.add_row("Most Recent Choice", stats.get("most_recent_choice_timestamp", "N/A"))
|
|
159
|
+
|
|
160
|
+
console.print(table)
|
|
161
|
+
console.print()
|
|
162
|
+
|
|
163
|
+
# Show templates used
|
|
164
|
+
templates = stats.get("templates_used", [])
|
|
165
|
+
if templates:
|
|
166
|
+
console.print("[bold]Templates Used:[/bold]")
|
|
167
|
+
for template_id in templates:
|
|
168
|
+
console.print(f" • {template_id}")
|
|
169
|
+
console.print()
|
|
170
|
+
|
|
171
|
+
except ImportError:
|
|
172
|
+
console.print(
|
|
173
|
+
"[red]Error:[/red] Session context not available. "
|
|
174
|
+
"Ensure memory and session modules are installed."
|
|
175
|
+
)
|
|
176
|
+
raise typer.Exit(code=1)
|
|
177
|
+
except Exception as e:
|
|
178
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
179
|
+
raise typer.Exit(code=1)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"""CLI Template Commands.
|
|
2
|
+
|
|
3
|
+
Template Commands for meta-workflow system.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import typer
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
from rich.tree import Tree
|
|
15
|
+
|
|
16
|
+
from attune.config import _validate_file_path
|
|
17
|
+
from attune.meta_workflows import (
|
|
18
|
+
TemplateRegistry,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from . import meta_workflow_app
|
|
22
|
+
|
|
23
|
+
console = Console()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@meta_workflow_app.command("list-templates")
|
|
27
|
+
def list_templates(
|
|
28
|
+
storage_dir: str = typer.Option(
|
|
29
|
+
".attune/meta_workflows/templates",
|
|
30
|
+
"--storage-dir",
|
|
31
|
+
"-d",
|
|
32
|
+
help="Templates storage directory",
|
|
33
|
+
),
|
|
34
|
+
):
|
|
35
|
+
"""List all available workflow templates.
|
|
36
|
+
|
|
37
|
+
Shows template metadata including:
|
|
38
|
+
- Template ID and name
|
|
39
|
+
- Description
|
|
40
|
+
- Estimated cost range
|
|
41
|
+
- Number of questions and agent rules
|
|
42
|
+
"""
|
|
43
|
+
try:
|
|
44
|
+
registry = TemplateRegistry(storage_dir=storage_dir)
|
|
45
|
+
template_ids = registry.list_templates()
|
|
46
|
+
|
|
47
|
+
if not template_ids:
|
|
48
|
+
console.print("[yellow]No templates found.[/yellow]")
|
|
49
|
+
console.print(f"\nLooking in: {storage_dir}")
|
|
50
|
+
console.print("\nCreate templates by running workflow workflow or")
|
|
51
|
+
console.print("placing template JSON files in the templates directory.")
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
# Count built-in vs user templates
|
|
55
|
+
builtin_count = sum(1 for t in template_ids if registry.is_builtin(t))
|
|
56
|
+
user_count = len(template_ids) - builtin_count
|
|
57
|
+
|
|
58
|
+
console.print(f"\n[bold]Available Templates[/bold] ({len(template_ids)} total)")
|
|
59
|
+
console.print(
|
|
60
|
+
f" [cyan]📦 Built-in:[/cyan] {builtin_count} [green]👤 User:[/green] {user_count}\n"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Show migration hint for users coming from Crew workflows
|
|
64
|
+
if builtin_count > 0:
|
|
65
|
+
console.print(
|
|
66
|
+
"[dim]💡 Tip: Built-in templates replace deprecated Crew workflows.[/dim]"
|
|
67
|
+
)
|
|
68
|
+
console.print("[dim] See: empathy meta-workflow migrate --help[/dim]\n")
|
|
69
|
+
|
|
70
|
+
for template_id in template_ids:
|
|
71
|
+
template = registry.load_template(template_id)
|
|
72
|
+
|
|
73
|
+
if template:
|
|
74
|
+
# Add badge for built-in templates
|
|
75
|
+
is_builtin = registry.is_builtin(template_id)
|
|
76
|
+
badge = "[cyan]📦 BUILT-IN[/cyan]" if is_builtin else "[green]👤 USER[/green]"
|
|
77
|
+
|
|
78
|
+
# Create info panel
|
|
79
|
+
info_lines = [
|
|
80
|
+
f"[bold]{template.name}[/bold] {badge}",
|
|
81
|
+
f"[dim]{template.description}[/dim]",
|
|
82
|
+
"",
|
|
83
|
+
f"ID: {template.template_id}",
|
|
84
|
+
f"Version: {template.version}",
|
|
85
|
+
f"Author: {template.author}",
|
|
86
|
+
f"Tags: {', '.join(template.tags)}",
|
|
87
|
+
"",
|
|
88
|
+
f"Questions: {len(template.form_schema.questions)}",
|
|
89
|
+
f"Agent Rules: {len(template.agent_composition_rules)}",
|
|
90
|
+
"",
|
|
91
|
+
f"Est. Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}",
|
|
92
|
+
f"Est. Duration: ~{template.estimated_duration_minutes} min",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
# Add quick start command
|
|
96
|
+
info_lines.append("")
|
|
97
|
+
info_lines.append(
|
|
98
|
+
f"[bold]Quick Start:[/bold] empathy meta-workflow run {template_id}"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
console.print(
|
|
102
|
+
Panel("\n".join(info_lines), border_style="blue" if is_builtin else "green")
|
|
103
|
+
)
|
|
104
|
+
console.print()
|
|
105
|
+
|
|
106
|
+
except Exception as e:
|
|
107
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
108
|
+
raise typer.Exit(code=1)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@meta_workflow_app.command("inspect")
|
|
113
|
+
def inspect_template(
|
|
114
|
+
template_id: str = typer.Argument(..., help="Template ID to inspect"),
|
|
115
|
+
storage_dir: str = typer.Option(
|
|
116
|
+
".attune/meta_workflows/templates",
|
|
117
|
+
"--storage-dir",
|
|
118
|
+
"-d",
|
|
119
|
+
help="Templates storage directory",
|
|
120
|
+
),
|
|
121
|
+
show_rules: bool = typer.Option(
|
|
122
|
+
False,
|
|
123
|
+
"--show-rules",
|
|
124
|
+
"-r",
|
|
125
|
+
help="Show agent composition rules",
|
|
126
|
+
),
|
|
127
|
+
):
|
|
128
|
+
"""Inspect a specific template in detail.
|
|
129
|
+
|
|
130
|
+
Shows comprehensive template information including:
|
|
131
|
+
- Form questions and types
|
|
132
|
+
- Agent composition rules (optional)
|
|
133
|
+
- Configuration mappings
|
|
134
|
+
"""
|
|
135
|
+
try:
|
|
136
|
+
registry = TemplateRegistry(storage_dir=storage_dir)
|
|
137
|
+
template = registry.load_template(template_id)
|
|
138
|
+
|
|
139
|
+
if not template:
|
|
140
|
+
console.print(f"[red]Template not found:[/red] {template_id}")
|
|
141
|
+
raise typer.Exit(code=1)
|
|
142
|
+
|
|
143
|
+
# Header
|
|
144
|
+
console.print(f"\n[bold cyan]Template: {template.name}[/bold cyan]")
|
|
145
|
+
console.print(f"[dim]{template.description}[/dim]\n")
|
|
146
|
+
|
|
147
|
+
# Form Schema
|
|
148
|
+
console.print("[bold]Form Questions:[/bold]")
|
|
149
|
+
form_tree = Tree("📋 Questions")
|
|
150
|
+
|
|
151
|
+
for i, question in enumerate(template.form_schema.questions, 1):
|
|
152
|
+
question_text = f"[cyan]{question.text}[/cyan]"
|
|
153
|
+
q_node = form_tree.add(f"{i}. {question_text}")
|
|
154
|
+
q_node.add(f"ID: {question.id}")
|
|
155
|
+
q_node.add(f"Type: {question.type.value}")
|
|
156
|
+
if question.options:
|
|
157
|
+
options_str = ", ".join(question.options[:3])
|
|
158
|
+
if len(question.options) > 3:
|
|
159
|
+
options_str += f", ... ({len(question.options) - 3} more)"
|
|
160
|
+
q_node.add(f"Options: {options_str}")
|
|
161
|
+
if question.required:
|
|
162
|
+
q_node.add("[yellow]Required[/yellow]")
|
|
163
|
+
if question.default:
|
|
164
|
+
q_node.add(f"Default: {question.default}")
|
|
165
|
+
|
|
166
|
+
console.print(form_tree)
|
|
167
|
+
|
|
168
|
+
# Agent Composition Rules (optional)
|
|
169
|
+
if show_rules:
|
|
170
|
+
console.print(
|
|
171
|
+
f"\n[bold]Agent Composition Rules:[/bold] ({len(template.agent_composition_rules)})\n"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
for i, rule in enumerate(template.agent_composition_rules, 1):
|
|
175
|
+
rule_lines = [
|
|
176
|
+
f"[bold cyan]{i}. {rule.role}[/bold cyan]",
|
|
177
|
+
f" Base Template: {rule.base_template}",
|
|
178
|
+
f" Tier Strategy: {rule.tier_strategy.value}",
|
|
179
|
+
f" Tools: {', '.join(rule.tools) if rule.tools else 'None'}",
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
if rule.required_responses:
|
|
183
|
+
rule_lines.append(f" Required When: {rule.required_responses}")
|
|
184
|
+
|
|
185
|
+
if rule.config_mapping:
|
|
186
|
+
rule_lines.append(f" Config Mapping: {len(rule.config_mapping)} fields")
|
|
187
|
+
|
|
188
|
+
console.print("\n".join(rule_lines))
|
|
189
|
+
console.print()
|
|
190
|
+
|
|
191
|
+
# Summary
|
|
192
|
+
console.print("\n[bold]Summary:[/bold]")
|
|
193
|
+
console.print(f" Questions: {len(template.form_schema.questions)}")
|
|
194
|
+
console.print(f" Agent Rules: {len(template.agent_composition_rules)}")
|
|
195
|
+
console.print(
|
|
196
|
+
f" Estimated Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}"
|
|
197
|
+
)
|
|
198
|
+
console.print()
|
|
199
|
+
|
|
200
|
+
except Exception as e:
|
|
201
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
202
|
+
raise typer.Exit(code=1)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
# =============================================================================
|
|
206
|
+
# Plan Generation Commands (Claude Code Integration)
|
|
207
|
+
# =============================================================================
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
@meta_workflow_app.command("plan")
|
|
212
|
+
def generate_plan_cmd(
|
|
213
|
+
template_id: str = typer.Argument(..., help="Template ID to generate plan for"),
|
|
214
|
+
output_format: str = typer.Option(
|
|
215
|
+
"markdown",
|
|
216
|
+
"--format",
|
|
217
|
+
"-f",
|
|
218
|
+
help="Output format: markdown, skill, or json",
|
|
219
|
+
),
|
|
220
|
+
output_file: str = typer.Option(
|
|
221
|
+
None,
|
|
222
|
+
"--output",
|
|
223
|
+
"-o",
|
|
224
|
+
help="Output file path (default: stdout)",
|
|
225
|
+
),
|
|
226
|
+
use_defaults: bool = typer.Option(
|
|
227
|
+
True,
|
|
228
|
+
"--use-defaults/--interactive",
|
|
229
|
+
help="Use default values or ask interactively",
|
|
230
|
+
),
|
|
231
|
+
install_skill: bool = typer.Option(
|
|
232
|
+
False,
|
|
233
|
+
"--install",
|
|
234
|
+
"-i",
|
|
235
|
+
help="Install as Claude Code skill in .claude/commands/",
|
|
236
|
+
),
|
|
237
|
+
):
|
|
238
|
+
"""Generate execution plan for Claude Code (no API costs).
|
|
239
|
+
|
|
240
|
+
This generates a plan that can be executed by Claude Code using your
|
|
241
|
+
Max subscription instead of making API calls.
|
|
242
|
+
|
|
243
|
+
Output formats:
|
|
244
|
+
- markdown: Human-readable plan to paste into Claude Code
|
|
245
|
+
- skill: Claude Code skill format for .claude/commands/
|
|
246
|
+
- json: Structured format for programmatic use
|
|
247
|
+
|
|
248
|
+
Examples:
|
|
249
|
+
empathy meta-workflow plan release-prep
|
|
250
|
+
empathy meta-workflow plan release-prep --format skill --install
|
|
251
|
+
empathy meta-workflow plan test-coverage-boost -o plan.md
|
|
252
|
+
empathy meta-workflow plan manage-docs --format json
|
|
253
|
+
"""
|
|
254
|
+
try:
|
|
255
|
+
from attune.meta_workflows.plan_generator import generate_plan
|
|
256
|
+
|
|
257
|
+
# Load template
|
|
258
|
+
console.print(f"\n[bold]Generating plan for:[/bold] {template_id}")
|
|
259
|
+
registry = TemplateRegistry()
|
|
260
|
+
template = registry.load_template(template_id)
|
|
261
|
+
|
|
262
|
+
if not template:
|
|
263
|
+
console.print(f"[red]Template not found:[/red] {template_id}")
|
|
264
|
+
raise typer.Exit(code=1)
|
|
265
|
+
|
|
266
|
+
# Collect responses if interactive
|
|
267
|
+
form_responses = None
|
|
268
|
+
if not use_defaults and template.form_schema.questions:
|
|
269
|
+
console.print("\n[bold]Configuration:[/bold]")
|
|
270
|
+
form_responses = {}
|
|
271
|
+
for question in template.form_schema.questions:
|
|
272
|
+
if question.options:
|
|
273
|
+
# Multiple choice
|
|
274
|
+
console.print(f"\n{question.text}")
|
|
275
|
+
for i, opt in enumerate(question.options, 1):
|
|
276
|
+
default_mark = " (default)" if opt == question.default else ""
|
|
277
|
+
console.print(f" {i}. {opt}{default_mark}")
|
|
278
|
+
choice = typer.prompt("Choice", default="1")
|
|
279
|
+
try:
|
|
280
|
+
idx = int(choice) - 1
|
|
281
|
+
form_responses[question.id] = question.options[idx]
|
|
282
|
+
except (ValueError, IndexError):
|
|
283
|
+
form_responses[question.id] = question.default or question.options[0]
|
|
284
|
+
else:
|
|
285
|
+
# Yes/No or text
|
|
286
|
+
default = question.default or "Yes"
|
|
287
|
+
response = typer.prompt(question.text, default=default)
|
|
288
|
+
form_responses[question.id] = response
|
|
289
|
+
|
|
290
|
+
# Generate plan
|
|
291
|
+
plan_content = generate_plan(
|
|
292
|
+
template_id=template_id,
|
|
293
|
+
form_responses=form_responses,
|
|
294
|
+
use_defaults=use_defaults,
|
|
295
|
+
output_format=output_format,
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
# Handle output
|
|
299
|
+
if install_skill:
|
|
300
|
+
# Install as Claude Code skill
|
|
301
|
+
skill_dir = Path(".claude/commands")
|
|
302
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
303
|
+
skill_path = skill_dir / f"{template_id}.md"
|
|
304
|
+
|
|
305
|
+
# Convert to skill format if not already
|
|
306
|
+
if output_format != "skill":
|
|
307
|
+
plan_content = generate_plan(
|
|
308
|
+
template_id=template_id,
|
|
309
|
+
form_responses=form_responses,
|
|
310
|
+
use_defaults=use_defaults,
|
|
311
|
+
output_format="skill",
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
validated_skill_path = _validate_file_path(str(skill_path))
|
|
315
|
+
validated_skill_path.write_text(plan_content)
|
|
316
|
+
console.print(
|
|
317
|
+
f"\n[green]✓ Installed as Claude Code skill:[/green] {validated_skill_path}"
|
|
318
|
+
)
|
|
319
|
+
console.print(f"\nRun with: [bold]/project:{template_id}[/bold]")
|
|
320
|
+
|
|
321
|
+
elif output_file:
|
|
322
|
+
# Write to file
|
|
323
|
+
validated_output = _validate_file_path(output_file)
|
|
324
|
+
validated_output.write_text(plan_content)
|
|
325
|
+
console.print(f"\n[green]✓ Plan saved to:[/green] {validated_output}")
|
|
326
|
+
|
|
327
|
+
else:
|
|
328
|
+
# Print to stdout
|
|
329
|
+
console.print("\n" + "=" * 60)
|
|
330
|
+
console.print(plan_content)
|
|
331
|
+
console.print("=" * 60)
|
|
332
|
+
|
|
333
|
+
# Show usage hints
|
|
334
|
+
console.print("\n[bold]Usage Options:[/bold]")
|
|
335
|
+
console.print("1. Copy prompts into Claude Code conversation")
|
|
336
|
+
console.print("2. Install as skill with: --install")
|
|
337
|
+
console.print("3. Use with Claude Code Task tool")
|
|
338
|
+
console.print("\n[dim]Cost: $0 (uses your Max subscription)[/dim]")
|
|
339
|
+
|
|
340
|
+
except ImportError:
|
|
341
|
+
console.print("[red]Plan generator not available.[/red]")
|
|
342
|
+
console.print("This feature requires the plan_generator module.")
|
|
343
|
+
raise typer.Exit(code=1)
|
|
344
|
+
except Exception as e:
|
|
345
|
+
console.print(f"[red]Error generating plan:[/red] {e}")
|
|
346
|
+
raise typer.Exit(code=1)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
# =============================================================================
|
|
350
|
+
# Execution Commands
|
|
351
|
+
# =============================================================================
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|